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; 36*1691e005SRob Clark 37*1691e005SRob Clark /* 38*1691e005SRob Clark * Tracking for the start index of the last N messages in the 39*1691e005SRob Clark * queue, for the benefit of devcore dump / crashdec (since 40*1691e005SRob Clark * parsing in the reverse direction to decode the last N 41*1691e005SRob Clark * messages is difficult to do and would rely on heuristics 42*1691e005SRob Clark * which are not guaranteed to be correct) 43*1691e005SRob Clark */ 44*1691e005SRob Clark #define HFI_HISTORY_SZ 8 45*1691e005SRob Clark s32 history[HFI_HISTORY_SZ]; 46*1691e005SRob Clark u8 history_idx; 474b565ca5SJordan Crouse }; 484b565ca5SJordan Crouse 494b565ca5SJordan Crouse /* This is the outgoing queue to the GMU */ 504b565ca5SJordan Crouse #define HFI_COMMAND_QUEUE 0 514b565ca5SJordan Crouse 524b565ca5SJordan Crouse /* THis is the incoming response queue from the GMU */ 534b565ca5SJordan Crouse #define HFI_RESPONSE_QUEUE 1 544b565ca5SJordan Crouse 554b565ca5SJordan Crouse #define HFI_HEADER_ID(msg) ((msg) & 0xff) 564b565ca5SJordan Crouse #define HFI_HEADER_SIZE(msg) (((msg) >> 8) & 0xff) 574b565ca5SJordan Crouse #define HFI_HEADER_SEQNUM(msg) (((msg) >> 20) & 0xfff) 584b565ca5SJordan Crouse 594b565ca5SJordan Crouse /* FIXME: Do we need this or can we use ARRAY_SIZE? */ 604b565ca5SJordan Crouse #define HFI_RESPONSE_PAYLOAD_SIZE 16 614b565ca5SJordan Crouse 624b565ca5SJordan Crouse /* HFI message types */ 634b565ca5SJordan Crouse 644b565ca5SJordan Crouse #define HFI_MSG_CMD 0 658167e6faSJonathan Marek #define HFI_MSG_ACK 1 668167e6faSJonathan Marek #define HFI_MSG_ACK_V1 2 674b565ca5SJordan Crouse 684b565ca5SJordan Crouse #define HFI_F2H_MSG_ACK 126 694b565ca5SJordan Crouse 704b565ca5SJordan Crouse struct a6xx_hfi_msg_response { 714b565ca5SJordan Crouse u32 header; 724b565ca5SJordan Crouse u32 ret_header; 734b565ca5SJordan Crouse u32 error; 744b565ca5SJordan Crouse u32 payload[HFI_RESPONSE_PAYLOAD_SIZE]; 754b565ca5SJordan Crouse }; 764b565ca5SJordan Crouse 774b565ca5SJordan Crouse #define HFI_F2H_MSG_ERROR 100 784b565ca5SJordan Crouse 794b565ca5SJordan Crouse struct a6xx_hfi_msg_error { 804b565ca5SJordan Crouse u32 header; 814b565ca5SJordan Crouse u32 code; 824b565ca5SJordan Crouse u32 payload[2]; 834b565ca5SJordan Crouse }; 844b565ca5SJordan Crouse 854b565ca5SJordan Crouse #define HFI_H2F_MSG_INIT 0 864b565ca5SJordan Crouse 874b565ca5SJordan Crouse struct a6xx_hfi_msg_gmu_init_cmd { 884b565ca5SJordan Crouse u32 header; 894b565ca5SJordan Crouse u32 seg_id; 904b565ca5SJordan Crouse u32 dbg_buffer_addr; 914b565ca5SJordan Crouse u32 dbg_buffer_size; 924b565ca5SJordan Crouse u32 boot_state; 934b565ca5SJordan Crouse }; 944b565ca5SJordan Crouse 954b565ca5SJordan Crouse #define HFI_H2F_MSG_FW_VERSION 1 964b565ca5SJordan Crouse 974b565ca5SJordan Crouse struct a6xx_hfi_msg_fw_version { 984b565ca5SJordan Crouse u32 header; 994b565ca5SJordan Crouse u32 supported_version; 1004b565ca5SJordan Crouse }; 1014b565ca5SJordan Crouse 1024b565ca5SJordan Crouse #define HFI_H2F_MSG_PERF_TABLE 4 1034b565ca5SJordan Crouse 1044b565ca5SJordan Crouse struct perf_level { 1054b565ca5SJordan Crouse u32 vote; 1064b565ca5SJordan Crouse u32 freq; 1074b565ca5SJordan Crouse }; 1084b565ca5SJordan Crouse 1098167e6faSJonathan Marek struct perf_gx_level { 1108167e6faSJonathan Marek u32 vote; 1118167e6faSJonathan Marek u32 acd; 1128167e6faSJonathan Marek u32 freq; 1138167e6faSJonathan Marek }; 1148167e6faSJonathan Marek 1158167e6faSJonathan Marek struct a6xx_hfi_msg_perf_table_v1 { 1164b565ca5SJordan Crouse u32 header; 1174b565ca5SJordan Crouse u32 num_gpu_levels; 1184b565ca5SJordan Crouse u32 num_gmu_levels; 1194b565ca5SJordan Crouse 1204b565ca5SJordan Crouse struct perf_level gx_votes[16]; 1214b565ca5SJordan Crouse struct perf_level cx_votes[4]; 1224b565ca5SJordan Crouse }; 1234b565ca5SJordan Crouse 1248167e6faSJonathan Marek struct a6xx_hfi_msg_perf_table { 1258167e6faSJonathan Marek u32 header; 1268167e6faSJonathan Marek u32 num_gpu_levels; 1278167e6faSJonathan Marek u32 num_gmu_levels; 1288167e6faSJonathan Marek 1298167e6faSJonathan Marek struct perf_gx_level gx_votes[16]; 1308167e6faSJonathan Marek struct perf_level cx_votes[4]; 1318167e6faSJonathan Marek }; 1328167e6faSJonathan Marek 1334b565ca5SJordan Crouse #define HFI_H2F_MSG_BW_TABLE 3 1344b565ca5SJordan Crouse 1354b565ca5SJordan Crouse struct a6xx_hfi_msg_bw_table { 1364b565ca5SJordan Crouse u32 header; 1374b565ca5SJordan Crouse u32 bw_level_num; 1384b565ca5SJordan Crouse u32 cnoc_cmds_num; 1394b565ca5SJordan Crouse u32 ddr_cmds_num; 1404b565ca5SJordan Crouse u32 cnoc_wait_bitmask; 1414b565ca5SJordan Crouse u32 ddr_wait_bitmask; 1424b565ca5SJordan Crouse u32 cnoc_cmds_addrs[6]; 1434b565ca5SJordan Crouse u32 cnoc_cmds_data[2][6]; 1444b565ca5SJordan Crouse u32 ddr_cmds_addrs[8]; 1454b565ca5SJordan Crouse u32 ddr_cmds_data[16][8]; 1464b565ca5SJordan Crouse }; 1474b565ca5SJordan Crouse 1484b565ca5SJordan Crouse #define HFI_H2F_MSG_TEST 5 1494b565ca5SJordan Crouse 1504b565ca5SJordan Crouse struct a6xx_hfi_msg_test { 1514b565ca5SJordan Crouse u32 header; 1524b565ca5SJordan Crouse }; 1534b565ca5SJordan Crouse 1548167e6faSJonathan Marek #define HFI_H2F_MSG_START 10 1558167e6faSJonathan Marek 1568167e6faSJonathan Marek struct a6xx_hfi_msg_start { 1578167e6faSJonathan Marek u32 header; 1588167e6faSJonathan Marek }; 1598167e6faSJonathan Marek 1608167e6faSJonathan Marek #define HFI_H2F_MSG_CORE_FW_START 14 1618167e6faSJonathan Marek 1628167e6faSJonathan Marek struct a6xx_hfi_msg_core_fw_start { 1638167e6faSJonathan Marek u32 header; 1648167e6faSJonathan Marek u32 handle; 1658167e6faSJonathan Marek }; 1668167e6faSJonathan Marek 1678167e6faSJonathan Marek #define HFI_H2F_MSG_GX_BW_PERF_VOTE 30 1688167e6faSJonathan Marek 1698167e6faSJonathan Marek struct a6xx_hfi_gx_bw_perf_vote_cmd { 1708167e6faSJonathan Marek u32 header; 1718167e6faSJonathan Marek u32 ack_type; 1728167e6faSJonathan Marek u32 freq; 1738167e6faSJonathan Marek u32 bw; 1748167e6faSJonathan Marek }; 1758167e6faSJonathan Marek 1768167e6faSJonathan Marek #define HFI_H2F_MSG_PREPARE_SLUMBER 33 1778167e6faSJonathan Marek 1788167e6faSJonathan Marek struct a6xx_hfi_prep_slumber_cmd { 1798167e6faSJonathan Marek u32 header; 1808167e6faSJonathan Marek u32 bw; 1818167e6faSJonathan Marek u32 freq; 1828167e6faSJonathan Marek }; 1838167e6faSJonathan Marek 1844b565ca5SJordan Crouse #endif 185