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