18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
28c2ecf20Sopenharmony_ci/* Copyright (c) 2017 The Linux Foundation. All rights reserved. */
38c2ecf20Sopenharmony_ci
48c2ecf20Sopenharmony_ci#ifndef _A6XX_HFI_H_
58c2ecf20Sopenharmony_ci#define _A6XX_HFI_H_
68c2ecf20Sopenharmony_ci
78c2ecf20Sopenharmony_cistruct a6xx_hfi_queue_table_header {
88c2ecf20Sopenharmony_ci	u32 version;
98c2ecf20Sopenharmony_ci	u32 size;		/* Size of the queue table in dwords */
108c2ecf20Sopenharmony_ci	u32 qhdr0_offset;	/* Offset of the first queue header */
118c2ecf20Sopenharmony_ci	u32 qhdr_size;		/* Size of the queue headers */
128c2ecf20Sopenharmony_ci	u32 num_queues;		/* Number of total queues */
138c2ecf20Sopenharmony_ci	u32 active_queues;	/* Number of active queues */
148c2ecf20Sopenharmony_ci};
158c2ecf20Sopenharmony_ci
168c2ecf20Sopenharmony_cistruct a6xx_hfi_queue_header {
178c2ecf20Sopenharmony_ci	u32 status;
188c2ecf20Sopenharmony_ci	u32 iova;
198c2ecf20Sopenharmony_ci	u32 type;
208c2ecf20Sopenharmony_ci	u32 size;
218c2ecf20Sopenharmony_ci	u32 msg_size;
228c2ecf20Sopenharmony_ci	u32 dropped;
238c2ecf20Sopenharmony_ci	u32 rx_watermark;
248c2ecf20Sopenharmony_ci	u32 tx_watermark;
258c2ecf20Sopenharmony_ci	u32 rx_request;
268c2ecf20Sopenharmony_ci	u32 tx_request;
278c2ecf20Sopenharmony_ci	u32 read_index;
288c2ecf20Sopenharmony_ci	u32 write_index;
298c2ecf20Sopenharmony_ci};
308c2ecf20Sopenharmony_ci
318c2ecf20Sopenharmony_cistruct a6xx_hfi_queue {
328c2ecf20Sopenharmony_ci	struct a6xx_hfi_queue_header *header;
338c2ecf20Sopenharmony_ci	spinlock_t lock;
348c2ecf20Sopenharmony_ci	u32 *data;
358c2ecf20Sopenharmony_ci	atomic_t seqnum;
368c2ecf20Sopenharmony_ci};
378c2ecf20Sopenharmony_ci
388c2ecf20Sopenharmony_ci/* This is the outgoing queue to the GMU */
398c2ecf20Sopenharmony_ci#define HFI_COMMAND_QUEUE 0
408c2ecf20Sopenharmony_ci
418c2ecf20Sopenharmony_ci/* THis is the incoming response queue from the GMU */
428c2ecf20Sopenharmony_ci#define HFI_RESPONSE_QUEUE 1
438c2ecf20Sopenharmony_ci
448c2ecf20Sopenharmony_ci#define HFI_HEADER_ID(msg) ((msg) & 0xff)
458c2ecf20Sopenharmony_ci#define HFI_HEADER_SIZE(msg) (((msg) >> 8) & 0xff)
468c2ecf20Sopenharmony_ci#define HFI_HEADER_SEQNUM(msg) (((msg) >> 20) & 0xfff)
478c2ecf20Sopenharmony_ci
488c2ecf20Sopenharmony_ci/* FIXME: Do we need this or can we use ARRAY_SIZE? */
498c2ecf20Sopenharmony_ci#define HFI_RESPONSE_PAYLOAD_SIZE 16
508c2ecf20Sopenharmony_ci
518c2ecf20Sopenharmony_ci/* HFI message types */
528c2ecf20Sopenharmony_ci
538c2ecf20Sopenharmony_ci#define HFI_MSG_CMD 0
548c2ecf20Sopenharmony_ci#define HFI_MSG_ACK 1
558c2ecf20Sopenharmony_ci#define HFI_MSG_ACK_V1 2
568c2ecf20Sopenharmony_ci
578c2ecf20Sopenharmony_ci#define HFI_F2H_MSG_ACK 126
588c2ecf20Sopenharmony_ci
598c2ecf20Sopenharmony_cistruct a6xx_hfi_msg_response {
608c2ecf20Sopenharmony_ci	u32 header;
618c2ecf20Sopenharmony_ci	u32 ret_header;
628c2ecf20Sopenharmony_ci	u32 error;
638c2ecf20Sopenharmony_ci	u32 payload[HFI_RESPONSE_PAYLOAD_SIZE];
648c2ecf20Sopenharmony_ci};
658c2ecf20Sopenharmony_ci
668c2ecf20Sopenharmony_ci#define HFI_F2H_MSG_ERROR 100
678c2ecf20Sopenharmony_ci
688c2ecf20Sopenharmony_cistruct a6xx_hfi_msg_error {
698c2ecf20Sopenharmony_ci	u32 header;
708c2ecf20Sopenharmony_ci	u32 code;
718c2ecf20Sopenharmony_ci	u32 payload[2];
728c2ecf20Sopenharmony_ci};
738c2ecf20Sopenharmony_ci
748c2ecf20Sopenharmony_ci#define HFI_H2F_MSG_INIT 0
758c2ecf20Sopenharmony_ci
768c2ecf20Sopenharmony_cistruct a6xx_hfi_msg_gmu_init_cmd {
778c2ecf20Sopenharmony_ci	u32 header;
788c2ecf20Sopenharmony_ci	u32 seg_id;
798c2ecf20Sopenharmony_ci	u32 dbg_buffer_addr;
808c2ecf20Sopenharmony_ci	u32 dbg_buffer_size;
818c2ecf20Sopenharmony_ci	u32 boot_state;
828c2ecf20Sopenharmony_ci};
838c2ecf20Sopenharmony_ci
848c2ecf20Sopenharmony_ci#define HFI_H2F_MSG_FW_VERSION 1
858c2ecf20Sopenharmony_ci
868c2ecf20Sopenharmony_cistruct a6xx_hfi_msg_fw_version {
878c2ecf20Sopenharmony_ci	u32 header;
888c2ecf20Sopenharmony_ci	u32 supported_version;
898c2ecf20Sopenharmony_ci};
908c2ecf20Sopenharmony_ci
918c2ecf20Sopenharmony_ci#define HFI_H2F_MSG_PERF_TABLE 4
928c2ecf20Sopenharmony_ci
938c2ecf20Sopenharmony_cistruct perf_level {
948c2ecf20Sopenharmony_ci	u32 vote;
958c2ecf20Sopenharmony_ci	u32 freq;
968c2ecf20Sopenharmony_ci};
978c2ecf20Sopenharmony_ci
988c2ecf20Sopenharmony_cistruct perf_gx_level {
998c2ecf20Sopenharmony_ci	u32 vote;
1008c2ecf20Sopenharmony_ci	u32 acd;
1018c2ecf20Sopenharmony_ci	u32 freq;
1028c2ecf20Sopenharmony_ci};
1038c2ecf20Sopenharmony_ci
1048c2ecf20Sopenharmony_cistruct a6xx_hfi_msg_perf_table_v1 {
1058c2ecf20Sopenharmony_ci	u32 header;
1068c2ecf20Sopenharmony_ci	u32 num_gpu_levels;
1078c2ecf20Sopenharmony_ci	u32 num_gmu_levels;
1088c2ecf20Sopenharmony_ci
1098c2ecf20Sopenharmony_ci	struct perf_level gx_votes[16];
1108c2ecf20Sopenharmony_ci	struct perf_level cx_votes[4];
1118c2ecf20Sopenharmony_ci};
1128c2ecf20Sopenharmony_ci
1138c2ecf20Sopenharmony_cistruct a6xx_hfi_msg_perf_table {
1148c2ecf20Sopenharmony_ci	u32 header;
1158c2ecf20Sopenharmony_ci	u32 num_gpu_levels;
1168c2ecf20Sopenharmony_ci	u32 num_gmu_levels;
1178c2ecf20Sopenharmony_ci
1188c2ecf20Sopenharmony_ci	struct perf_gx_level gx_votes[16];
1198c2ecf20Sopenharmony_ci	struct perf_level cx_votes[4];
1208c2ecf20Sopenharmony_ci};
1218c2ecf20Sopenharmony_ci
1228c2ecf20Sopenharmony_ci#define HFI_H2F_MSG_BW_TABLE 3
1238c2ecf20Sopenharmony_ci
1248c2ecf20Sopenharmony_cistruct a6xx_hfi_msg_bw_table {
1258c2ecf20Sopenharmony_ci	u32 header;
1268c2ecf20Sopenharmony_ci	u32 bw_level_num;
1278c2ecf20Sopenharmony_ci	u32 cnoc_cmds_num;
1288c2ecf20Sopenharmony_ci	u32 ddr_cmds_num;
1298c2ecf20Sopenharmony_ci	u32 cnoc_wait_bitmask;
1308c2ecf20Sopenharmony_ci	u32 ddr_wait_bitmask;
1318c2ecf20Sopenharmony_ci	u32 cnoc_cmds_addrs[6];
1328c2ecf20Sopenharmony_ci	u32 cnoc_cmds_data[2][6];
1338c2ecf20Sopenharmony_ci	u32 ddr_cmds_addrs[8];
1348c2ecf20Sopenharmony_ci	u32 ddr_cmds_data[16][8];
1358c2ecf20Sopenharmony_ci};
1368c2ecf20Sopenharmony_ci
1378c2ecf20Sopenharmony_ci#define HFI_H2F_MSG_TEST 5
1388c2ecf20Sopenharmony_ci
1398c2ecf20Sopenharmony_cistruct a6xx_hfi_msg_test {
1408c2ecf20Sopenharmony_ci	u32 header;
1418c2ecf20Sopenharmony_ci};
1428c2ecf20Sopenharmony_ci
1438c2ecf20Sopenharmony_ci#define HFI_H2F_MSG_START 10
1448c2ecf20Sopenharmony_ci
1458c2ecf20Sopenharmony_cistruct a6xx_hfi_msg_start {
1468c2ecf20Sopenharmony_ci	u32 header;
1478c2ecf20Sopenharmony_ci};
1488c2ecf20Sopenharmony_ci
1498c2ecf20Sopenharmony_ci#define HFI_H2F_MSG_CORE_FW_START 14
1508c2ecf20Sopenharmony_ci
1518c2ecf20Sopenharmony_cistruct a6xx_hfi_msg_core_fw_start {
1528c2ecf20Sopenharmony_ci	u32 header;
1538c2ecf20Sopenharmony_ci	u32 handle;
1548c2ecf20Sopenharmony_ci};
1558c2ecf20Sopenharmony_ci
1568c2ecf20Sopenharmony_ci#define HFI_H2F_MSG_GX_BW_PERF_VOTE 30
1578c2ecf20Sopenharmony_ci
1588c2ecf20Sopenharmony_cistruct a6xx_hfi_gx_bw_perf_vote_cmd {
1598c2ecf20Sopenharmony_ci	u32 header;
1608c2ecf20Sopenharmony_ci	u32 ack_type;
1618c2ecf20Sopenharmony_ci	u32 freq;
1628c2ecf20Sopenharmony_ci	u32 bw;
1638c2ecf20Sopenharmony_ci};
1648c2ecf20Sopenharmony_ci
1658c2ecf20Sopenharmony_ci#define HFI_H2F_MSG_PREPARE_SLUMBER 33
1668c2ecf20Sopenharmony_ci
1678c2ecf20Sopenharmony_cistruct a6xx_hfi_prep_slumber_cmd {
1688c2ecf20Sopenharmony_ci	u32 header;
1698c2ecf20Sopenharmony_ci	u32 bw;
1708c2ecf20Sopenharmony_ci	u32 freq;
1718c2ecf20Sopenharmony_ci};
1728c2ecf20Sopenharmony_ci
1738c2ecf20Sopenharmony_ci#endif
174