14b565ca5SJordan Crouse /* SPDX-License-Identifier: GPL-2.0 */ 24b565ca5SJordan Crouse /* Copyright (c) 2017 The Linux Foundation. All rights reserved. */ 34b565ca5SJordan Crouse 44b565ca5SJordan Crouse #ifndef _A6XX_HFI_H_ 54b565ca5SJordan Crouse #define _A6XX_HFI_H_ 64b565ca5SJordan Crouse 74b565ca5SJordan Crouse struct a6xx_hfi_queue_table_header { 84b565ca5SJordan Crouse u32 version; 94b565ca5SJordan Crouse u32 size; /* Size of the queue table in dwords */ 104b565ca5SJordan Crouse u32 qhdr0_offset; /* Offset of the first queue header */ 114b565ca5SJordan Crouse u32 qhdr_size; /* Size of the queue headers */ 124b565ca5SJordan Crouse u32 num_queues; /* Number of total queues */ 134b565ca5SJordan Crouse u32 active_queues; /* Number of active queues */ 144b565ca5SJordan Crouse }; 154b565ca5SJordan Crouse 164b565ca5SJordan Crouse struct a6xx_hfi_queue_header { 174b565ca5SJordan Crouse u32 status; 184b565ca5SJordan Crouse u32 iova; 194b565ca5SJordan Crouse u32 type; 204b565ca5SJordan Crouse u32 size; 214b565ca5SJordan Crouse u32 msg_size; 224b565ca5SJordan Crouse u32 dropped; 234b565ca5SJordan Crouse u32 rx_watermark; 244b565ca5SJordan Crouse u32 tx_watermark; 254b565ca5SJordan Crouse u32 rx_request; 264b565ca5SJordan Crouse u32 tx_request; 274b565ca5SJordan Crouse u32 read_index; 284b565ca5SJordan Crouse u32 write_index; 294b565ca5SJordan Crouse }; 304b565ca5SJordan Crouse 314b565ca5SJordan Crouse struct a6xx_hfi_queue { 324b565ca5SJordan Crouse struct a6xx_hfi_queue_header *header; 334b565ca5SJordan Crouse spinlock_t lock; 344b565ca5SJordan Crouse u32 *data; 354b565ca5SJordan Crouse atomic_t seqnum; 364b565ca5SJordan Crouse }; 374b565ca5SJordan Crouse 384b565ca5SJordan Crouse /* This is the outgoing queue to the GMU */ 394b565ca5SJordan Crouse #define HFI_COMMAND_QUEUE 0 404b565ca5SJordan Crouse 414b565ca5SJordan Crouse /* THis is the incoming response queue from the GMU */ 424b565ca5SJordan Crouse #define HFI_RESPONSE_QUEUE 1 434b565ca5SJordan Crouse 444b565ca5SJordan Crouse #define HFI_HEADER_ID(msg) ((msg) & 0xff) 454b565ca5SJordan Crouse #define HFI_HEADER_SIZE(msg) (((msg) >> 8) & 0xff) 464b565ca5SJordan Crouse #define HFI_HEADER_SEQNUM(msg) (((msg) >> 20) & 0xfff) 474b565ca5SJordan Crouse 484b565ca5SJordan Crouse /* FIXME: Do we need this or can we use ARRAY_SIZE? */ 494b565ca5SJordan Crouse #define HFI_RESPONSE_PAYLOAD_SIZE 16 504b565ca5SJordan Crouse 514b565ca5SJordan Crouse /* HFI message types */ 524b565ca5SJordan Crouse 534b565ca5SJordan Crouse #define HFI_MSG_CMD 0 548167e6faSJonathan Marek #define HFI_MSG_ACK 1 558167e6faSJonathan Marek #define HFI_MSG_ACK_V1 2 564b565ca5SJordan Crouse 574b565ca5SJordan Crouse #define HFI_F2H_MSG_ACK 126 584b565ca5SJordan Crouse 594b565ca5SJordan Crouse struct a6xx_hfi_msg_response { 604b565ca5SJordan Crouse u32 header; 614b565ca5SJordan Crouse u32 ret_header; 624b565ca5SJordan Crouse u32 error; 634b565ca5SJordan Crouse u32 payload[HFI_RESPONSE_PAYLOAD_SIZE]; 644b565ca5SJordan Crouse }; 654b565ca5SJordan Crouse 664b565ca5SJordan Crouse #define HFI_F2H_MSG_ERROR 100 674b565ca5SJordan Crouse 684b565ca5SJordan Crouse struct a6xx_hfi_msg_error { 694b565ca5SJordan Crouse u32 header; 704b565ca5SJordan Crouse u32 code; 714b565ca5SJordan Crouse u32 payload[2]; 724b565ca5SJordan Crouse }; 734b565ca5SJordan Crouse 744b565ca5SJordan Crouse #define HFI_H2F_MSG_INIT 0 754b565ca5SJordan Crouse 764b565ca5SJordan Crouse struct a6xx_hfi_msg_gmu_init_cmd { 774b565ca5SJordan Crouse u32 header; 784b565ca5SJordan Crouse u32 seg_id; 794b565ca5SJordan Crouse u32 dbg_buffer_addr; 804b565ca5SJordan Crouse u32 dbg_buffer_size; 814b565ca5SJordan Crouse u32 boot_state; 824b565ca5SJordan Crouse }; 834b565ca5SJordan Crouse 844b565ca5SJordan Crouse #define HFI_H2F_MSG_FW_VERSION 1 854b565ca5SJordan Crouse 864b565ca5SJordan Crouse struct a6xx_hfi_msg_fw_version { 874b565ca5SJordan Crouse u32 header; 884b565ca5SJordan Crouse u32 supported_version; 894b565ca5SJordan Crouse }; 904b565ca5SJordan Crouse 914b565ca5SJordan Crouse #define HFI_H2F_MSG_PERF_TABLE 4 924b565ca5SJordan Crouse 934b565ca5SJordan Crouse struct perf_level { 944b565ca5SJordan Crouse u32 vote; 954b565ca5SJordan Crouse u32 freq; 964b565ca5SJordan Crouse }; 974b565ca5SJordan Crouse 988167e6faSJonathan Marek struct perf_gx_level { 998167e6faSJonathan Marek u32 vote; 1008167e6faSJonathan Marek u32 acd; 1018167e6faSJonathan Marek u32 freq; 1028167e6faSJonathan Marek }; 1038167e6faSJonathan Marek 1048167e6faSJonathan Marek struct a6xx_hfi_msg_perf_table_v1 { 1054b565ca5SJordan Crouse u32 header; 1064b565ca5SJordan Crouse u32 num_gpu_levels; 1074b565ca5SJordan Crouse u32 num_gmu_levels; 1084b565ca5SJordan Crouse 1094b565ca5SJordan Crouse struct perf_level gx_votes[16]; 1104b565ca5SJordan Crouse struct perf_level cx_votes[4]; 1114b565ca5SJordan Crouse }; 1124b565ca5SJordan Crouse 1138167e6faSJonathan Marek struct a6xx_hfi_msg_perf_table { 1148167e6faSJonathan Marek u32 header; 1158167e6faSJonathan Marek u32 num_gpu_levels; 1168167e6faSJonathan Marek u32 num_gmu_levels; 1178167e6faSJonathan Marek 1188167e6faSJonathan Marek struct perf_gx_level gx_votes[16]; 1198167e6faSJonathan Marek struct perf_level cx_votes[4]; 1208167e6faSJonathan Marek }; 1218167e6faSJonathan Marek 1224b565ca5SJordan Crouse #define HFI_H2F_MSG_BW_TABLE 3 1234b565ca5SJordan Crouse 1244b565ca5SJordan Crouse struct a6xx_hfi_msg_bw_table { 1254b565ca5SJordan Crouse u32 header; 1264b565ca5SJordan Crouse u32 bw_level_num; 1274b565ca5SJordan Crouse u32 cnoc_cmds_num; 1284b565ca5SJordan Crouse u32 ddr_cmds_num; 1294b565ca5SJordan Crouse u32 cnoc_wait_bitmask; 1304b565ca5SJordan Crouse u32 ddr_wait_bitmask; 1314b565ca5SJordan Crouse u32 cnoc_cmds_addrs[6]; 1324b565ca5SJordan Crouse u32 cnoc_cmds_data[2][6]; 1334b565ca5SJordan Crouse u32 ddr_cmds_addrs[8]; 1344b565ca5SJordan Crouse u32 ddr_cmds_data[16][8]; 1354b565ca5SJordan Crouse }; 1364b565ca5SJordan Crouse 1374b565ca5SJordan Crouse #define HFI_H2F_MSG_TEST 5 1384b565ca5SJordan Crouse 1394b565ca5SJordan Crouse struct a6xx_hfi_msg_test { 1404b565ca5SJordan Crouse u32 header; 1414b565ca5SJordan Crouse }; 1424b565ca5SJordan Crouse 1438167e6faSJonathan Marek #define HFI_H2F_MSG_START 10 1448167e6faSJonathan Marek 1458167e6faSJonathan Marek struct a6xx_hfi_msg_start { 1468167e6faSJonathan Marek u32 header; 1478167e6faSJonathan Marek }; 1488167e6faSJonathan Marek 1498167e6faSJonathan Marek #define HFI_H2F_MSG_CORE_FW_START 14 1508167e6faSJonathan Marek 1518167e6faSJonathan Marek struct a6xx_hfi_msg_core_fw_start { 1528167e6faSJonathan Marek u32 header; 1538167e6faSJonathan Marek u32 handle; 1548167e6faSJonathan Marek }; 1558167e6faSJonathan Marek 1568167e6faSJonathan Marek #define HFI_H2F_MSG_GX_BW_PERF_VOTE 30 1578167e6faSJonathan Marek 1588167e6faSJonathan Marek struct a6xx_hfi_gx_bw_perf_vote_cmd { 1598167e6faSJonathan Marek u32 header; 1608167e6faSJonathan Marek u32 ack_type; 1618167e6faSJonathan Marek u32 freq; 1628167e6faSJonathan Marek u32 bw; 1638167e6faSJonathan Marek }; 1648167e6faSJonathan Marek 1658167e6faSJonathan Marek #define HFI_H2F_MSG_PREPARE_SLUMBER 33 1668167e6faSJonathan Marek 1678167e6faSJonathan Marek struct a6xx_hfi_prep_slumber_cmd { 1688167e6faSJonathan Marek u32 header; 1698167e6faSJonathan Marek u32 bw; 1708167e6faSJonathan Marek u32 freq; 1718167e6faSJonathan Marek }; 1728167e6faSJonathan Marek 1734b565ca5SJordan Crouse #endif 174