xref: /openbmc/linux/drivers/gpu/drm/msm/adreno/a6xx_hfi.h (revision 8167e6fa)
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