1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun /* Copyright (c) 2017 The Linux Foundation. All rights reserved. */ 3*4882a593Smuzhiyun 4*4882a593Smuzhiyun #ifndef _A6XX_HFI_H_ 5*4882a593Smuzhiyun #define _A6XX_HFI_H_ 6*4882a593Smuzhiyun 7*4882a593Smuzhiyun struct a6xx_hfi_queue_table_header { 8*4882a593Smuzhiyun u32 version; 9*4882a593Smuzhiyun u32 size; /* Size of the queue table in dwords */ 10*4882a593Smuzhiyun u32 qhdr0_offset; /* Offset of the first queue header */ 11*4882a593Smuzhiyun u32 qhdr_size; /* Size of the queue headers */ 12*4882a593Smuzhiyun u32 num_queues; /* Number of total queues */ 13*4882a593Smuzhiyun u32 active_queues; /* Number of active queues */ 14*4882a593Smuzhiyun }; 15*4882a593Smuzhiyun 16*4882a593Smuzhiyun struct a6xx_hfi_queue_header { 17*4882a593Smuzhiyun u32 status; 18*4882a593Smuzhiyun u32 iova; 19*4882a593Smuzhiyun u32 type; 20*4882a593Smuzhiyun u32 size; 21*4882a593Smuzhiyun u32 msg_size; 22*4882a593Smuzhiyun u32 dropped; 23*4882a593Smuzhiyun u32 rx_watermark; 24*4882a593Smuzhiyun u32 tx_watermark; 25*4882a593Smuzhiyun u32 rx_request; 26*4882a593Smuzhiyun u32 tx_request; 27*4882a593Smuzhiyun u32 read_index; 28*4882a593Smuzhiyun u32 write_index; 29*4882a593Smuzhiyun }; 30*4882a593Smuzhiyun 31*4882a593Smuzhiyun struct a6xx_hfi_queue { 32*4882a593Smuzhiyun struct a6xx_hfi_queue_header *header; 33*4882a593Smuzhiyun spinlock_t lock; 34*4882a593Smuzhiyun u32 *data; 35*4882a593Smuzhiyun atomic_t seqnum; 36*4882a593Smuzhiyun }; 37*4882a593Smuzhiyun 38*4882a593Smuzhiyun /* This is the outgoing queue to the GMU */ 39*4882a593Smuzhiyun #define HFI_COMMAND_QUEUE 0 40*4882a593Smuzhiyun 41*4882a593Smuzhiyun /* THis is the incoming response queue from the GMU */ 42*4882a593Smuzhiyun #define HFI_RESPONSE_QUEUE 1 43*4882a593Smuzhiyun 44*4882a593Smuzhiyun #define HFI_HEADER_ID(msg) ((msg) & 0xff) 45*4882a593Smuzhiyun #define HFI_HEADER_SIZE(msg) (((msg) >> 8) & 0xff) 46*4882a593Smuzhiyun #define HFI_HEADER_SEQNUM(msg) (((msg) >> 20) & 0xfff) 47*4882a593Smuzhiyun 48*4882a593Smuzhiyun /* FIXME: Do we need this or can we use ARRAY_SIZE? */ 49*4882a593Smuzhiyun #define HFI_RESPONSE_PAYLOAD_SIZE 16 50*4882a593Smuzhiyun 51*4882a593Smuzhiyun /* HFI message types */ 52*4882a593Smuzhiyun 53*4882a593Smuzhiyun #define HFI_MSG_CMD 0 54*4882a593Smuzhiyun #define HFI_MSG_ACK 1 55*4882a593Smuzhiyun #define HFI_MSG_ACK_V1 2 56*4882a593Smuzhiyun 57*4882a593Smuzhiyun #define HFI_F2H_MSG_ACK 126 58*4882a593Smuzhiyun 59*4882a593Smuzhiyun struct a6xx_hfi_msg_response { 60*4882a593Smuzhiyun u32 header; 61*4882a593Smuzhiyun u32 ret_header; 62*4882a593Smuzhiyun u32 error; 63*4882a593Smuzhiyun u32 payload[HFI_RESPONSE_PAYLOAD_SIZE]; 64*4882a593Smuzhiyun }; 65*4882a593Smuzhiyun 66*4882a593Smuzhiyun #define HFI_F2H_MSG_ERROR 100 67*4882a593Smuzhiyun 68*4882a593Smuzhiyun struct a6xx_hfi_msg_error { 69*4882a593Smuzhiyun u32 header; 70*4882a593Smuzhiyun u32 code; 71*4882a593Smuzhiyun u32 payload[2]; 72*4882a593Smuzhiyun }; 73*4882a593Smuzhiyun 74*4882a593Smuzhiyun #define HFI_H2F_MSG_INIT 0 75*4882a593Smuzhiyun 76*4882a593Smuzhiyun struct a6xx_hfi_msg_gmu_init_cmd { 77*4882a593Smuzhiyun u32 header; 78*4882a593Smuzhiyun u32 seg_id; 79*4882a593Smuzhiyun u32 dbg_buffer_addr; 80*4882a593Smuzhiyun u32 dbg_buffer_size; 81*4882a593Smuzhiyun u32 boot_state; 82*4882a593Smuzhiyun }; 83*4882a593Smuzhiyun 84*4882a593Smuzhiyun #define HFI_H2F_MSG_FW_VERSION 1 85*4882a593Smuzhiyun 86*4882a593Smuzhiyun struct a6xx_hfi_msg_fw_version { 87*4882a593Smuzhiyun u32 header; 88*4882a593Smuzhiyun u32 supported_version; 89*4882a593Smuzhiyun }; 90*4882a593Smuzhiyun 91*4882a593Smuzhiyun #define HFI_H2F_MSG_PERF_TABLE 4 92*4882a593Smuzhiyun 93*4882a593Smuzhiyun struct perf_level { 94*4882a593Smuzhiyun u32 vote; 95*4882a593Smuzhiyun u32 freq; 96*4882a593Smuzhiyun }; 97*4882a593Smuzhiyun 98*4882a593Smuzhiyun struct perf_gx_level { 99*4882a593Smuzhiyun u32 vote; 100*4882a593Smuzhiyun u32 acd; 101*4882a593Smuzhiyun u32 freq; 102*4882a593Smuzhiyun }; 103*4882a593Smuzhiyun 104*4882a593Smuzhiyun struct a6xx_hfi_msg_perf_table_v1 { 105*4882a593Smuzhiyun u32 header; 106*4882a593Smuzhiyun u32 num_gpu_levels; 107*4882a593Smuzhiyun u32 num_gmu_levels; 108*4882a593Smuzhiyun 109*4882a593Smuzhiyun struct perf_level gx_votes[16]; 110*4882a593Smuzhiyun struct perf_level cx_votes[4]; 111*4882a593Smuzhiyun }; 112*4882a593Smuzhiyun 113*4882a593Smuzhiyun struct a6xx_hfi_msg_perf_table { 114*4882a593Smuzhiyun u32 header; 115*4882a593Smuzhiyun u32 num_gpu_levels; 116*4882a593Smuzhiyun u32 num_gmu_levels; 117*4882a593Smuzhiyun 118*4882a593Smuzhiyun struct perf_gx_level gx_votes[16]; 119*4882a593Smuzhiyun struct perf_level cx_votes[4]; 120*4882a593Smuzhiyun }; 121*4882a593Smuzhiyun 122*4882a593Smuzhiyun #define HFI_H2F_MSG_BW_TABLE 3 123*4882a593Smuzhiyun 124*4882a593Smuzhiyun struct a6xx_hfi_msg_bw_table { 125*4882a593Smuzhiyun u32 header; 126*4882a593Smuzhiyun u32 bw_level_num; 127*4882a593Smuzhiyun u32 cnoc_cmds_num; 128*4882a593Smuzhiyun u32 ddr_cmds_num; 129*4882a593Smuzhiyun u32 cnoc_wait_bitmask; 130*4882a593Smuzhiyun u32 ddr_wait_bitmask; 131*4882a593Smuzhiyun u32 cnoc_cmds_addrs[6]; 132*4882a593Smuzhiyun u32 cnoc_cmds_data[2][6]; 133*4882a593Smuzhiyun u32 ddr_cmds_addrs[8]; 134*4882a593Smuzhiyun u32 ddr_cmds_data[16][8]; 135*4882a593Smuzhiyun }; 136*4882a593Smuzhiyun 137*4882a593Smuzhiyun #define HFI_H2F_MSG_TEST 5 138*4882a593Smuzhiyun 139*4882a593Smuzhiyun struct a6xx_hfi_msg_test { 140*4882a593Smuzhiyun u32 header; 141*4882a593Smuzhiyun }; 142*4882a593Smuzhiyun 143*4882a593Smuzhiyun #define HFI_H2F_MSG_START 10 144*4882a593Smuzhiyun 145*4882a593Smuzhiyun struct a6xx_hfi_msg_start { 146*4882a593Smuzhiyun u32 header; 147*4882a593Smuzhiyun }; 148*4882a593Smuzhiyun 149*4882a593Smuzhiyun #define HFI_H2F_MSG_CORE_FW_START 14 150*4882a593Smuzhiyun 151*4882a593Smuzhiyun struct a6xx_hfi_msg_core_fw_start { 152*4882a593Smuzhiyun u32 header; 153*4882a593Smuzhiyun u32 handle; 154*4882a593Smuzhiyun }; 155*4882a593Smuzhiyun 156*4882a593Smuzhiyun #define HFI_H2F_MSG_GX_BW_PERF_VOTE 30 157*4882a593Smuzhiyun 158*4882a593Smuzhiyun struct a6xx_hfi_gx_bw_perf_vote_cmd { 159*4882a593Smuzhiyun u32 header; 160*4882a593Smuzhiyun u32 ack_type; 161*4882a593Smuzhiyun u32 freq; 162*4882a593Smuzhiyun u32 bw; 163*4882a593Smuzhiyun }; 164*4882a593Smuzhiyun 165*4882a593Smuzhiyun #define HFI_H2F_MSG_PREPARE_SLUMBER 33 166*4882a593Smuzhiyun 167*4882a593Smuzhiyun struct a6xx_hfi_prep_slumber_cmd { 168*4882a593Smuzhiyun u32 header; 169*4882a593Smuzhiyun u32 bw; 170*4882a593Smuzhiyun u32 freq; 171*4882a593Smuzhiyun }; 172*4882a593Smuzhiyun 173*4882a593Smuzhiyun #endif 174