xref: /rk3399_ARM-atf/plat/intel/soc/common/include/socfpga_mailbox.h (revision 18091f72238fe5a24da28032f205b5ae2c0ea906)
1d09adcbaSHadi Asyrafi /*
28e59b9f4SJit Loon Lim  * Copyright (c) 2019-2023, Intel Corporation. All rights reserved.
3204d5e67SSieu Mun Tang  * Copyright (c) 2024-2025, Altera Corporation. All rights reserved.
4d09adcbaSHadi Asyrafi  *
5d09adcbaSHadi Asyrafi  * SPDX-License-Identifier: BSD-3-Clause
6d09adcbaSHadi Asyrafi  */
7d09adcbaSHadi Asyrafi 
8d09adcbaSHadi Asyrafi #ifndef SOCFPGA_MBOX_H
9d09adcbaSHadi Asyrafi #define SOCFPGA_MBOX_H
10d09adcbaSHadi Asyrafi 
11d09adcbaSHadi Asyrafi #include <lib/utils_def.h>
12d09adcbaSHadi Asyrafi 
138e59b9f4SJit Loon Lim #if PLATFORM_MODEL == PLAT_SOCFPGA_AGILEX5
148e59b9f4SJit Loon Lim #define MBOX_OFFSET					0x10a30000
158e59b9f4SJit Loon Lim #else
16d09adcbaSHadi Asyrafi #define MBOX_OFFSET					0xffa30000
178e59b9f4SJit Loon Lim #endif
18d09adcbaSHadi Asyrafi 
19aad868b4SAbdul Halim, Muhammad Hadi Asyrafi #define MBOX_ATF_CLIENT_ID				0x1U
20aad868b4SAbdul Halim, Muhammad Hadi Asyrafi #define MBOX_MAX_JOB_ID					0xFU
21aad868b4SAbdul Halim, Muhammad Hadi Asyrafi #define MBOX_MAX_IND_JOB_ID				(MBOX_MAX_JOB_ID - 1U)
22aad868b4SAbdul Halim, Muhammad Hadi Asyrafi #define MBOX_JOB_ID					MBOX_MAX_JOB_ID
237facacecSSieu Mun Tang #define MBOX_TEST_BIT					BIT(31)
24d09adcbaSHadi Asyrafi 
25516f3221SAbdul Halim, Muhammad Hadi Asyrafi /* Mailbox Shared Memory Register Map */
26204d5e67SSieu Mun Tang #define MBOX_CIN					0x00 /* Command valid offset, to SDM */
27204d5e67SSieu Mun Tang #define MBOX_ROUT					0x04 /* Response output offset, to SDM */
28204d5e67SSieu Mun Tang #define MBOX_URG					0x08 /* Urgent command, to SDM */
29204d5e67SSieu Mun Tang #define MBOX_INT					0x0C /* Interrupt enables, to SDM */
30204d5e67SSieu Mun Tang /* 0x10 - 0x1F, Reserved */
31d09adcbaSHadi Asyrafi 
32204d5e67SSieu Mun Tang #define MBOX_COUT					0x20 /* Command free offset, from SDM */
33204d5e67SSieu Mun Tang #define MBOX_RIN					0x24 /* Response valid offset, from SDM */
34204d5e67SSieu Mun Tang #define MBOX_STATUS					0x2C /* Mailbox status from SDM to client */
35204d5e67SSieu Mun Tang /* 0x30 - 0x3F, Reserved */
36d09adcbaSHadi Asyrafi 
37204d5e67SSieu Mun Tang #define MBOX_CMD_BUFFER					0x40 /* Circular buffer, cmds to SDM */
38204d5e67SSieu Mun Tang #define MBOX_RESP_BUFFER				0xC0 /* Circular buffer, resp from SDM */
39204d5e67SSieu Mun Tang 
40204d5e67SSieu Mun Tang #define MBOX_DOORBELL_TO_SDM				0x400 /* Doorbell from HPS to SDM */
41204d5e67SSieu Mun Tang #define MBOX_DOORBELL_FROM_SDM				0x480 /* Doorbell from SDM to HPS */
42d09adcbaSHadi Asyrafi 
43516f3221SAbdul Halim, Muhammad Hadi Asyrafi /* Mailbox commands */
4468dd5e15STien Hock, Loh 
45516f3221SAbdul Halim, Muhammad Hadi Asyrafi #define MBOX_CMD_NOOP					0x00
46516f3221SAbdul Halim, Muhammad Hadi Asyrafi #define MBOX_CMD_SYNC					0x01
47516f3221SAbdul Halim, Muhammad Hadi Asyrafi #define MBOX_CMD_RESTART				0x02
48516f3221SAbdul Halim, Muhammad Hadi Asyrafi #define MBOX_CMD_CANCEL					0x03
49286b96f4SSieu Mun Tang #define MBOX_CMD_VAB_SRC_CERT				0x0B
50516f3221SAbdul Halim, Muhammad Hadi Asyrafi #define MBOX_CMD_GET_IDCODE				0x10
5193a5b97eSSieu Mun Tang #define MBOX_CMD_GET_USERCODE				0x13
52d1740831SSieu Mun Tang #define MBOX_CMD_GET_CHIPID				0x12
536ce576c6SSieu Mun Tang #define MBOX_CMD_FPGA_CONFIG_COMP			0x45
54516f3221SAbdul Halim, Muhammad Hadi Asyrafi #define MBOX_CMD_REBOOT_HPS				0x47
55d09adcbaSHadi Asyrafi 
56516f3221SAbdul Halim, Muhammad Hadi Asyrafi /* Reconfiguration Commands */
57516f3221SAbdul Halim, Muhammad Hadi Asyrafi #define MBOX_CONFIG_STATUS				0x04
58516f3221SAbdul Halim, Muhammad Hadi Asyrafi #define MBOX_RECONFIG					0x06
59516f3221SAbdul Halim, Muhammad Hadi Asyrafi #define MBOX_RECONFIG_DATA				0x08
60516f3221SAbdul Halim, Muhammad Hadi Asyrafi #define MBOX_RECONFIG_STATUS				0x09
61e1f97d9cSHadi Asyrafi 
6252cf9c2cSKris Chaplin /* HWMON Commands */
6352cf9c2cSKris Chaplin #define MBOX_HWMON_READVOLT				0x18
6452cf9c2cSKris Chaplin #define MBOX_HWMON_READTEMP				0x19
6552cf9c2cSKris Chaplin 
66516f3221SAbdul Halim, Muhammad Hadi Asyrafi /* QSPI Commands */
67516f3221SAbdul Halim, Muhammad Hadi Asyrafi #define MBOX_CMD_QSPI_OPEN				0x32
68516f3221SAbdul Halim, Muhammad Hadi Asyrafi #define MBOX_CMD_QSPI_CLOSE				0x33
69516f3221SAbdul Halim, Muhammad Hadi Asyrafi #define MBOX_CMD_QSPI_SET_CS				0x34
70204d5e67SSieu Mun Tang #define MBOX_CMD_QSPI_ERASE				0x38
71204d5e67SSieu Mun Tang #define MBOX_CMD_QSPI_WRITE				0x39
72204d5e67SSieu Mun Tang #define MBOX_CMD_QSPI_READ				0x3A
73516f3221SAbdul Halim, Muhammad Hadi Asyrafi #define MBOX_CMD_QSPI_DIRECT				0x3B
74204d5e67SSieu Mun Tang #define MBOX_CMD_QSPI_GET_DEV_INFO			0x74
75e1f97d9cSHadi Asyrafi 
7691239f2cSJit Loon Lim /* SEU Commands */
7791239f2cSJit Loon Lim #define MBOX_CMD_SEU_ERR_READ				0x3C
78fffcb25cSJit Loon Lim #define MBOX_CMD_SAFE_INJECT_SEU_ERR			0x41
7991239f2cSJit Loon Lim 
80516f3221SAbdul Halim, Muhammad Hadi Asyrafi /* RSU Commands */
81516f3221SAbdul Halim, Muhammad Hadi Asyrafi #define MBOX_GET_SUBPARTITION_TABLE			0x5A
82516f3221SAbdul Halim, Muhammad Hadi Asyrafi #define MBOX_RSU_STATUS					0x5B
83516f3221SAbdul Halim, Muhammad Hadi Asyrafi #define MBOX_RSU_UPDATE					0x5C
84516f3221SAbdul Halim, Muhammad Hadi Asyrafi #define MBOX_HPS_STAGE_NOTIFY				0x5D
858fb1b484SKah Jing Lee #define MBOX_RSU_GET_DEVICE_INFO			0x74
86516f3221SAbdul Halim, Muhammad Hadi Asyrafi 
87286b96f4SSieu Mun Tang /* FCS Command */
88286b96f4SSieu Mun Tang #define MBOX_FCS_GET_PROVISION				0x7B
897facacecSSieu Mun Tang #define MBOX_FCS_CNTR_SET_PREAUTH			0x7C
90286b96f4SSieu Mun Tang #define MBOX_FCS_ENCRYPT_REQ				0x7E
91286b96f4SSieu Mun Tang #define MBOX_FCS_DECRYPT_REQ				0x7F
92286b96f4SSieu Mun Tang #define MBOX_FCS_RANDOM_GEN				0x80
936726390eSSieu Mun Tang #define MBOX_FCS_AES_CRYPT_REQ				0x81
947e8249a2SSieu Mun Tang #define MBOX_FCS_GET_DIGEST_REQ				0x82
95c05ea296SSieu Mun Tang #define MBOX_FCS_MAC_VERIFY_REQ				0x83
9669254105SSieu Mun Tang #define MBOX_FCS_ECDSA_HASH_SIGN_REQ			0x84
9707912da1SSieu Mun Tang #define MBOX_FCS_ECDSA_SHA2_DATA_SIGN_REQ		0x85
987e25eb87SSieu Mun Tang #define MBOX_FCS_ECDSA_HASH_SIG_VERIFY			0x86
9958305060SSieu Mun Tang #define MBOX_FCS_ECDSA_SHA2_DATA_SIGN_VERIFY		0x87
100d2fee94aSSieu Mun Tang #define MBOX_FCS_ECDSA_GET_PUBKEY			0x88
10149446866SSieu Mun Tang #define MBOX_FCS_ECDH_REQUEST				0x89
102204d5e67SSieu Mun Tang #define MBOX_FCS_HKDF_REQUEST				0x8B
1036dc00c24SSieu Mun Tang #define MBOX_FCS_OPEN_CS_SESSION			0xA0
1046dc00c24SSieu Mun Tang #define MBOX_FCS_CLOSE_CS_SESSION			0xA1
105342a0618SSieu Mun Tang #define MBOX_FCS_IMPORT_CS_KEY				0xA5
106342a0618SSieu Mun Tang #define MBOX_FCS_EXPORT_CS_KEY				0xA6
107342a0618SSieu Mun Tang #define MBOX_FCS_REMOVE_CS_KEY				0xA7
108342a0618SSieu Mun Tang #define MBOX_FCS_GET_CS_KEY_INFO			0xA8
109204d5e67SSieu Mun Tang #define MBOX_FCS_CREATE_CS_KEY				0xA9
110d1740831SSieu Mun Tang 
111d1740831SSieu Mun Tang /* PSG SIGMA Commands */
112d1740831SSieu Mun Tang #define MBOX_PSG_SIGMA_TEARDOWN				0xD5
113d1740831SSieu Mun Tang 
114d1740831SSieu Mun Tang /* Attestation Commands */
115581182c1SSieu Mun Tang #define MBOX_CREATE_CERT_ON_RELOAD			0x180
116581182c1SSieu Mun Tang #define MBOX_GET_ATTESTATION_CERT			0x181
117d1740831SSieu Mun Tang #define MBOX_ATTESTATION_SUBKEY				0x182
118d1740831SSieu Mun Tang #define MBOX_GET_MEASUREMENT				0x183
119d1740831SSieu Mun Tang 
12077902fcaSSieu Mun Tang /* Miscellaneous commands */
121204d5e67SSieu Mun Tang #define MBOX_CMD_MCTP_MSG				0x194
12277902fcaSSieu Mun Tang #define MBOX_GET_ROM_PATCH_SHA384			0x1B0
123204d5e67SSieu Mun Tang #define MBOX_CMD_GET_DEVICEID				0x500
124516f3221SAbdul Halim, Muhammad Hadi Asyrafi 
125516f3221SAbdul Halim, Muhammad Hadi Asyrafi /* Mailbox Definitions */
126516f3221SAbdul Halim, Muhammad Hadi Asyrafi 
127516f3221SAbdul Halim, Muhammad Hadi Asyrafi #define CMD_DIRECT					0
128f8e6a09cSAbdul Halim, Muhammad Hadi Asyrafi #define CMD_INDIRECT					1
129516f3221SAbdul Halim, Muhammad Hadi Asyrafi #define CMD_CASUAL					0
130516f3221SAbdul Halim, Muhammad Hadi Asyrafi #define CMD_URGENT					1
131516f3221SAbdul Halim, Muhammad Hadi Asyrafi 
132204d5e67SSieu Mun Tang /* Mailbox command flags and related macros */
133204d5e67SSieu Mun Tang #define MBOX_CMD_FLAG_DIRECT				BIT(0)
134204d5e67SSieu Mun Tang #define MBOX_CMD_FLAG_INDIRECT				BIT(1)
135204d5e67SSieu Mun Tang #define MBOX_CMD_FLAG_CASUAL				BIT(2)
136204d5e67SSieu Mun Tang #define MBOX_CMD_FLAG_URGENT				BIT(3)
137204d5e67SSieu Mun Tang 
138204d5e67SSieu Mun Tang #define MBOX_CMD_FLAG_CASUAL_INDIRECT			(MBOX_CMD_FLAG_CASUAL | \
139204d5e67SSieu Mun Tang 							 MBOX_CMD_FLAG_INDIRECT)
140204d5e67SSieu Mun Tang 
141204d5e67SSieu Mun Tang #define IS_CMD_SET(cmd, _type)				((((cmd) & MBOX_CMD_FLAG_##_type) != 0) ? \
142204d5e67SSieu Mun Tang 								1 : 0)
143204d5e67SSieu Mun Tang 
1447db1895fSAbdul Halim, Muhammad Hadi Asyrafi #define MBOX_WORD_BYTE					4U
145516f3221SAbdul Halim, Muhammad Hadi Asyrafi #define MBOX_RESP_BUFFER_SIZE				16
146516f3221SAbdul Halim, Muhammad Hadi Asyrafi #define MBOX_CMD_BUFFER_SIZE				32
147c436707bSSieu Mun Tang #define MBOX_INC_HEADER_MAX_WORD_SIZE			1024U
148e1f97d9cSHadi Asyrafi 
149e1f97d9cSHadi Asyrafi /* Execution states for HPS_STAGE_NOTIFY */
150e1f97d9cSHadi Asyrafi #define HPS_EXECUTION_STATE_FSBL			0
151e1f97d9cSHadi Asyrafi #define HPS_EXECUTION_STATE_SSBL			1
152e1f97d9cSHadi Asyrafi #define HPS_EXECUTION_STATE_OS				2
153e1f97d9cSHadi Asyrafi 
154516f3221SAbdul Halim, Muhammad Hadi Asyrafi /* Status Response */
155516f3221SAbdul Halim, Muhammad Hadi Asyrafi #define MBOX_RET_OK					0
156516f3221SAbdul Halim, Muhammad Hadi Asyrafi #define MBOX_RET_ERROR					-1
157d09adcbaSHadi Asyrafi #define MBOX_NO_RESPONSE				-2
158d09adcbaSHadi Asyrafi #define MBOX_WRONG_ID					-3
159aad868b4SAbdul Halim, Muhammad Hadi Asyrafi #define MBOX_BUFFER_FULL				-4
1604837a640SSieu Mun Tang #define MBOX_BUSY					-5
161516f3221SAbdul Halim, Muhammad Hadi Asyrafi #define MBOX_TIMEOUT					-2047
162d09adcbaSHadi Asyrafi 
16376ed3223SSieu Mun Tang /* Key Status */
16476ed3223SSieu Mun Tang #define MBOX_RET_SDOS_DECRYPTION_ERROR_102		-258
16576ed3223SSieu Mun Tang #define MBOX_RET_SDOS_DECRYPTION_ERROR_103		-259
16676ed3223SSieu Mun Tang 
167516f3221SAbdul Halim, Muhammad Hadi Asyrafi /* Reconfig Status Response */
168d09adcbaSHadi Asyrafi #define RECONFIG_STATUS_STATE				0
169d09adcbaSHadi Asyrafi #define RECONFIG_STATUS_PIN_STATUS			2
170d09adcbaSHadi Asyrafi #define RECONFIG_STATUS_SOFTFUNC_STATUS			3
171d09adcbaSHadi Asyrafi #define PIN_STATUS_NSTATUS				(U(1) << 31)
172d09adcbaSHadi Asyrafi #define SOFTFUNC_STATUS_SEU_ERROR			(1 << 3)
173d09adcbaSHadi Asyrafi #define SOFTFUNC_STATUS_INIT_DONE			(1 << 1)
174d09adcbaSHadi Asyrafi #define SOFTFUNC_STATUS_CONF_DONE			(1 << 0)
175b68ba6ccSHadi Asyrafi #define MBOX_CFGSTAT_STATE_IDLE				0x00000000
176d09adcbaSHadi Asyrafi #define MBOX_CFGSTAT_STATE_CONFIG			0x10000000
1774b3d323aSJit Loon Lim #define MBOX_CFGSTAT_VAB_BS_PREAUTH			0x20000000
178b68ba6ccSHadi Asyrafi #define MBOX_CFGSTAT_STATE_FAILACK			0x08000000
179b68ba6ccSHadi Asyrafi #define MBOX_CFGSTAT_STATE_ERROR_INVALID		0xf0000001
180b68ba6ccSHadi Asyrafi #define MBOX_CFGSTAT_STATE_ERROR_CORRUPT		0xf0000002
181b68ba6ccSHadi Asyrafi #define MBOX_CFGSTAT_STATE_ERROR_AUTH			0xf0000003
182b68ba6ccSHadi Asyrafi #define MBOX_CFGSTAT_STATE_ERROR_CORE_IO		0xf0000004
183b68ba6ccSHadi Asyrafi #define MBOX_CFGSTAT_STATE_ERROR_HARDWARE		0xf0000005
184b68ba6ccSHadi Asyrafi #define MBOX_CFGSTAT_STATE_ERROR_FAKE			0xf0000006
185b68ba6ccSHadi Asyrafi #define MBOX_CFGSTAT_STATE_ERROR_BOOT_INFO		0xf0000007
186b68ba6ccSHadi Asyrafi #define MBOX_CFGSTAT_STATE_ERROR_QSPI_ERROR		0xf0000008
187d09adcbaSHadi Asyrafi 
188516f3221SAbdul Halim, Muhammad Hadi Asyrafi 
189516f3221SAbdul Halim, Muhammad Hadi Asyrafi /* Mailbox Macros */
190516f3221SAbdul Halim, Muhammad Hadi Asyrafi 
1917db1895fSAbdul Halim, Muhammad Hadi Asyrafi #define MBOX_ENTRY_TO_ADDR(_buf, ptr)			(MBOX_OFFSET + (MBOX_##_buf##_BUFFER) \
1927db1895fSAbdul Halim, Muhammad Hadi Asyrafi 								+ MBOX_WORD_BYTE * (ptr))
1937db1895fSAbdul Halim, Muhammad Hadi Asyrafi 
194516f3221SAbdul Halim, Muhammad Hadi Asyrafi /* Mailbox interrupt flags and masks */
195204d5e67SSieu Mun Tang #define MBOX_INT_FLAG_COE				BIT(0) /* COUT update interrupt enable */
196204d5e67SSieu Mun Tang #define MBOX_INT_FLAG_RIE				BIT(1) /* RIN update interrupt enable */
197204d5e67SSieu Mun Tang #define MBOX_INT_FLAG_UAE				BIT(8) /* Urgent ACK interrupt enable */
198204d5e67SSieu Mun Tang 
199204d5e67SSieu Mun Tang #define MBOX_COE_BIT(INTERRUPT)				((INTERRUPT) & MBOX_INT_FLAG_COE)
200204d5e67SSieu Mun Tang #define MBOX_RIE_BIT(INTERRUPT)				((INTERRUPT) & MBOX_INT_FLAG_RIE)
201204d5e67SSieu Mun Tang #define MBOX_UAE_BIT(INTERRUPT)				((INTERRUPT) & MBOX_INT_FLAG_UAE)
202516f3221SAbdul Halim, Muhammad Hadi Asyrafi 
203516f3221SAbdul Halim, Muhammad Hadi Asyrafi /* Mailbox response and status */
2046dc00c24SSieu Mun Tang #define MBOX_RESP_ERR(BUFFER)				((BUFFER) & 0x000007ff)
205516f3221SAbdul Halim, Muhammad Hadi Asyrafi #define MBOX_RESP_LEN(BUFFER)				(((BUFFER) & 0x007ff000) >> 12)
206516f3221SAbdul Halim, Muhammad Hadi Asyrafi #define MBOX_RESP_CLIENT_ID(BUFFER)			(((BUFFER) & 0xf0000000) >> 28)
207516f3221SAbdul Halim, Muhammad Hadi Asyrafi #define MBOX_RESP_JOB_ID(BUFFER)			(((BUFFER) & 0x0f000000) >> 24)
208204d5e67SSieu Mun Tang #define MBOX_RESP_TRANSACTION_ID(BUFFER)		(((BUFFER) & 0xff000000) >> 24)
209516f3221SAbdul Halim, Muhammad Hadi Asyrafi #define MBOX_STATUS_UA_MASK				(1<<8)
210516f3221SAbdul Halim, Muhammad Hadi Asyrafi 
211516f3221SAbdul Halim, Muhammad Hadi Asyrafi /* Mailbox command and response */
212516f3221SAbdul Halim, Muhammad Hadi Asyrafi #define MBOX_CLIENT_ID_CMD(CLIENT_ID)			((CLIENT_ID) << 28)
213516f3221SAbdul Halim, Muhammad Hadi Asyrafi #define MBOX_JOB_ID_CMD(JOB_ID)				(JOB_ID << 24)
214516f3221SAbdul Halim, Muhammad Hadi Asyrafi #define MBOX_CMD_LEN_CMD(CMD_LEN)			((CMD_LEN) << 12)
215f8e6a09cSAbdul Halim, Muhammad Hadi Asyrafi #define MBOX_INDIRECT(val)				((val) << 11)
21699756047SChee Hong Ang #define MBOX_CMD_MASK(header)				((header) & 0x7ff)
217516f3221SAbdul Halim, Muhammad Hadi Asyrafi 
2184837a640SSieu Mun Tang /* Mailbox payload */
2194837a640SSieu Mun Tang #define MBOX_DATA_MAX_LEN				0x3ff
2204837a640SSieu Mun Tang #define MBOX_PAYLOAD_FLAG_BUSY				BIT(0)
2214837a640SSieu Mun Tang 
222516f3221SAbdul Halim, Muhammad Hadi Asyrafi /* RSU Macros */
223516f3221SAbdul Halim, Muhammad Hadi Asyrafi #define RSU_VERSION_ACMF				BIT(8)
224516f3221SAbdul Halim, Muhammad Hadi Asyrafi #define RSU_VERSION_ACMF_MASK				0xff00
225516f3221SAbdul Halim, Muhammad Hadi Asyrafi 
226c026dfe3SSieu Mun Tang /* Config Status Macros */
227c026dfe3SSieu Mun Tang #define CONFIG_STATUS_WORD_SIZE				16U
228c026dfe3SSieu Mun Tang #define CONFIG_STATUS_FW_VER_OFFSET			1
229c026dfe3SSieu Mun Tang #define CONFIG_STATUS_FW_VER_MASK			0x00FFFFFF
230516f3221SAbdul Halim, Muhammad Hadi Asyrafi 
231204d5e67SSieu Mun Tang /* QSPI mailbox command macros */
232204d5e67SSieu Mun Tang #define MBOX_QSPI_SET_CS_OFFSET				(28)
233204d5e67SSieu Mun Tang #define MBOX_QSPI_SET_CS_MODE_OFFSET			(27)
234204d5e67SSieu Mun Tang #define MBOX_QSPI_SET_CS_CA_OFFSET			(26)
235204d5e67SSieu Mun Tang #define MBOX_QSPI_ERASE_SIZE_GRAN			(0x400)
236204d5e67SSieu Mun Tang 
237204d5e67SSieu Mun Tang #define MBOX_4K_ALIGNED_MASK				(0xFFF)
238204d5e67SSieu Mun Tang #define MBOX_IS_4K_ALIGNED(x)				((x) & MBOX_4K_ALIGNED_MASK)
239204d5e67SSieu Mun Tang #define MBOX_IS_WORD_ALIGNED(x)				(!((x) & 0x3))
240204d5e67SSieu Mun Tang #define MBOX_QSPI_RW_MAX_WORDS				(0x1000)
241204d5e67SSieu Mun Tang 
2424837a640SSieu Mun Tang /* Data structure */
2434837a640SSieu Mun Tang 
2444837a640SSieu Mun Tang typedef struct mailbox_payload {
2454837a640SSieu Mun Tang 	uint32_t header;
2464837a640SSieu Mun Tang 	uint32_t data[MBOX_DATA_MAX_LEN];
2474837a640SSieu Mun Tang } mailbox_payload_t;
2484837a640SSieu Mun Tang 
2494837a640SSieu Mun Tang typedef struct mailbox_container {
2504837a640SSieu Mun Tang 	uint32_t flag;
2514837a640SSieu Mun Tang 	uint32_t index;
2524837a640SSieu Mun Tang 	mailbox_payload_t *payload;
2534837a640SSieu Mun Tang } mailbox_container_t;
2544837a640SSieu Mun Tang 
255516f3221SAbdul Halim, Muhammad Hadi Asyrafi /* Mailbox Function Definitions */
256516f3221SAbdul Halim, Muhammad Hadi Asyrafi 
257d57318b7SAbdul Halim, Muhammad Hadi Asyrafi void mailbox_set_int(uint32_t interrupt_input);
258d09adcbaSHadi Asyrafi int mailbox_init(void);
259d09adcbaSHadi Asyrafi void mailbox_set_qspi_close(void);
260000267beSAbdul Halim, Muhammad Hadi Asyrafi void mailbox_hps_qspi_enable(void);
261d57318b7SAbdul Halim, Muhammad Hadi Asyrafi 
262d57318b7SAbdul Halim, Muhammad Hadi Asyrafi int mailbox_send_cmd(uint32_t job_id, uint32_t cmd, uint32_t *args,
263d57318b7SAbdul Halim, Muhammad Hadi Asyrafi 			unsigned int len, uint32_t urgent, uint32_t *response,
264a250c04bSSieu Mun Tang 			unsigned int *resp_len);
265d57318b7SAbdul Halim, Muhammad Hadi Asyrafi int mailbox_send_cmd_async(uint32_t *job_id, uint32_t cmd, uint32_t *args,
266d57318b7SAbdul Halim, Muhammad Hadi Asyrafi 			unsigned int len, unsigned int indirect);
267c436707bSSieu Mun Tang int mailbox_send_cmd_async_ext(uint32_t header_cmd, uint32_t *args,
268c436707bSSieu Mun Tang 			unsigned int len);
269d57318b7SAbdul Halim, Muhammad Hadi Asyrafi int mailbox_read_response(uint32_t *job_id, uint32_t *response,
270a250c04bSSieu Mun Tang 			unsigned int *resp_len);
2714837a640SSieu Mun Tang int mailbox_read_response_async(uint32_t *job_id, uint32_t *header,
2724837a640SSieu Mun Tang 			uint32_t *response, unsigned int *resp_len,
2734837a640SSieu Mun Tang 			uint8_t ignore_client_id);
274a250c04bSSieu Mun Tang int iterate_resp(uint32_t mbox_resp_len, uint32_t *resp_buf,
275a250c04bSSieu Mun Tang 			unsigned int *resp_len);
276d57318b7SAbdul Halim, Muhammad Hadi Asyrafi 
277d09adcbaSHadi Asyrafi void mailbox_reset_cold(void);
2788e59b9f4SJit Loon Lim void mailbox_reset_warm(uint32_t reset_type);
27968dd5e15STien Hock, Loh void mailbox_clear_response(void);
28068dd5e15STien Hock, Loh 
281fcf906c9SBoon Khai Ng int intel_mailbox_get_config_status(uint32_t cmd, bool init_done,
282fcf906c9SBoon Khai Ng 				    uint32_t *err_states);
283f2decc76SHadi Asyrafi int intel_mailbox_is_fpga_not_ready(void);
284d09adcbaSHadi Asyrafi 
285b727664eSSieu Mun Tang #if PLATFORM_MODEL == PLAT_SOCFPGA_AGILEX5
286b727664eSSieu Mun Tang void intel_smmu_hps_remapper_init(uint64_t *mem);
287ea906b9bSSieu Mun Tang int intel_smmu_hps_remapper_config(uint32_t remapper_bypass);
288b727664eSSieu Mun Tang #endif
289b727664eSSieu Mun Tang 
290e1f97d9cSHadi Asyrafi int mailbox_rsu_get_spt_offset(uint32_t *resp_buf, uint32_t resp_buf_len);
291e1f97d9cSHadi Asyrafi int mailbox_rsu_status(uint32_t *resp_buf, uint32_t resp_buf_len);
2928fb1b484SKah Jing Lee int mailbox_rsu_get_device_info(uint32_t *resp_buf, uint32_t resp_buf_len);
293ea9b9627SAbdul Halim, Muhammad Hadi Asyrafi int mailbox_rsu_update(uint32_t *flash_offset);
294ea9b9627SAbdul Halim, Muhammad Hadi Asyrafi int mailbox_hps_stage_notify(uint32_t execution_stage);
29552cf9c2cSKris Chaplin int mailbox_hwmon_readtemp(uint32_t chan, uint32_t *resp_buf);
29652cf9c2cSKris Chaplin int mailbox_hwmon_readvolt(uint32_t chan, uint32_t *resp_buf);
29791239f2cSJit Loon Lim int mailbox_seu_err_status(uint32_t *resp_buf, uint32_t resp_buf_len);
298fffcb25cSJit Loon Lim int mailbox_safe_inject_seu_err(uint32_t *arg, unsigned int len);
299e1f97d9cSHadi Asyrafi 
3006ce576c6SSieu Mun Tang int mailbox_send_fpga_config_comp(void);
3016ce576c6SSieu Mun Tang 
302204d5e67SSieu Mun Tang #if SIP_SVC_V3
303204d5e67SSieu Mun Tang #define MBOX_CLIENT_ID_SHIFT				(28)
304204d5e67SSieu Mun Tang #define MBOX_JOB_ID_SHIFT				(24)
305204d5e67SSieu Mun Tang #define MBOX_CMD_LEN_SHIFT				(12)
306204d5e67SSieu Mun Tang #define MBOX_INDIRECT_SHIFT				(11)
307204d5e67SSieu Mun Tang 
308204d5e67SSieu Mun Tang #define MBOX_FRAME_CMD_HEADER(client_id, job_id, args_len, indirect, cmd)\
309204d5e67SSieu Mun Tang 				((client_id << MBOX_CLIENT_ID_SHIFT) |	 \
310204d5e67SSieu Mun Tang 				(job_id << MBOX_JOB_ID_SHIFT) |		 \
311204d5e67SSieu Mun Tang 				(args_len << MBOX_CMD_LEN_SHIFT) |	 \
3121e1dbad0SGirisha Dengi 				(indirect << MBOX_INDIRECT_SHIFT) |	 \
313204d5e67SSieu Mun Tang 				cmd)
314204d5e67SSieu Mun Tang 
315204d5e67SSieu Mun Tang #define FLAG_SDM_RESPONSE_IS_VALID			BIT(0)
316204d5e67SSieu Mun Tang #define FLAG_SDM_RESPONSE_IS_USED			BIT(1)
317204d5e67SSieu Mun Tang #define FLAG_SDM_RESPONSE_IS_IN_PROGRESS		BIT(2)
318204d5e67SSieu Mun Tang #define FLAG_SDM_RESPONSE_IS_POLL_ON_INTR		BIT(3)
319204d5e67SSieu Mun Tang 
320204d5e67SSieu Mun Tang /*
321204d5e67SSieu Mun Tang  * TODO: Re-visit this queue size based on the system load.
322204d5e67SSieu Mun Tang  * 4 bits for client ID and 4 bits for job ID, total 8 bits and we can have up to
323204d5e67SSieu Mun Tang  * 256 transactions. We can tune this based on our system load at any given time
324204d5e67SSieu Mun Tang  */
325204d5e67SSieu Mun Tang #define MBOX_SVC_CMD_QUEUE_SIZE				(32)
326204d5e67SSieu Mun Tang #define MBOX_SVC_RESP_QUEUE_SIZE			(32)
327204d5e67SSieu Mun Tang #define MBOX_SVC_MAX_JOB_ID				(16)
328204d5e67SSieu Mun Tang #define MBOX_SVC_CMD_ARG_SIZE				(2)
329204d5e67SSieu Mun Tang #define MBOX_SVC_CMD_IS_USED				BIT(0)
330204d5e67SSieu Mun Tang #define MBOX_SVC_CMD_CB_ARGS_SIZE			(4)
331204d5e67SSieu Mun Tang #define MBOX_SVC_MAX_CLIENTS				(16)
332204d5e67SSieu Mun Tang #define MBOX_SVC_MAX_RESP_DATA_SIZE			(32)
333204d5e67SSieu Mun Tang #define MBOX_SVC_SMC_RET_MAX_SIZE			(8)
334204d5e67SSieu Mun Tang 
335204d5e67SSieu Mun Tang /* Client ID(4bits) + Job ID(4bits) = Transcation ID(TID - 8bits, 256 combinations) */
336204d5e67SSieu Mun Tang #define MBOX_MAX_TIDS					(256)
337204d5e67SSieu Mun Tang /* Each transcation ID bitmap holds 64bits */
338204d5e67SSieu Mun Tang #define MBOX_TID_BITMAP_SIZE				(sizeof(uint64_t) * 8)
339204d5e67SSieu Mun Tang /* Number of transcation ID bitmaps required to hold 256 combinations */
340204d5e67SSieu Mun Tang #define MBOX_MAX_TIDS_BITMAP				(MBOX_MAX_TIDS / MBOX_TID_BITMAP_SIZE)
341204d5e67SSieu Mun Tang 
342204d5e67SSieu Mun Tang /* SDM Response State (SRS) enums */
343204d5e67SSieu Mun Tang typedef enum sdm_resp_state {
344204d5e67SSieu Mun Tang 	SRS_WAIT_FOR_RESP = 0x00U,
345204d5e67SSieu Mun Tang 	SRS_WAIT_FOR_HEADER,
346204d5e67SSieu Mun Tang 	SRS_WAIT_FOR_ARGUMENTS,
347204d5e67SSieu Mun Tang 	SRS_SYNC_ERROR
348204d5e67SSieu Mun Tang } sdm_resp_state_t;
349204d5e67SSieu Mun Tang 
350204d5e67SSieu Mun Tang /* SDM response data structure */
351204d5e67SSieu Mun Tang typedef struct sdm_response {
352204d5e67SSieu Mun Tang 	bool is_poll_intr;
353204d5e67SSieu Mun Tang 	uint8_t client_id;
354204d5e67SSieu Mun Tang 	uint8_t job_id;
355204d5e67SSieu Mun Tang 	uint16_t resp_len;
356204d5e67SSieu Mun Tang 	uint16_t err_code;
357204d5e67SSieu Mun Tang 	uint32_t flags;
358204d5e67SSieu Mun Tang 	uint32_t header;
359204d5e67SSieu Mun Tang 	uint16_t rcvd_resp_len;
360204d5e67SSieu Mun Tang 	uint32_t resp_data[MBOX_SVC_MAX_RESP_DATA_SIZE];
361204d5e67SSieu Mun Tang } sdm_response_t;
362204d5e67SSieu Mun Tang 
363204d5e67SSieu Mun Tang /* SDM client callback template */
364204d5e67SSieu Mun Tang typedef uint8_t (*sdm_command_callback)(void *resp, void *cmd,
365*cdab4018SGirisha Dengi 					uint64_t *ret_args);
366204d5e67SSieu Mun Tang 
367204d5e67SSieu Mun Tang /* SDM command data structure */
368204d5e67SSieu Mun Tang typedef struct sdm_command {
369204d5e67SSieu Mun Tang 	uint8_t client_id;
370204d5e67SSieu Mun Tang 	uint8_t job_id;
371204d5e67SSieu Mun Tang 	uint32_t flags;
372204d5e67SSieu Mun Tang 	sdm_command_callback cb;
373204d5e67SSieu Mun Tang 	uint32_t *cb_args;
374204d5e67SSieu Mun Tang 	uint8_t cb_args_len;
375204d5e67SSieu Mun Tang } sdm_command_t;
376204d5e67SSieu Mun Tang 
377204d5e67SSieu Mun Tang /* Get the transcation ID from client ID and job ID. */
378204d5e67SSieu Mun Tang #define MBOX_GET_TRANS_ID(cid, jib)			(((cid) << 4) | (jib))
379204d5e67SSieu Mun Tang 
380204d5e67SSieu Mun Tang /* Mailbox service data structure */
381204d5e67SSieu Mun Tang typedef struct mailbox_service {
382204d5e67SSieu Mun Tang 	sdm_resp_state_t resp_state;
383204d5e67SSieu Mun Tang 	sdm_resp_state_t next_resp_state;
384204d5e67SSieu Mun Tang 	uint32_t flags;
385204d5e67SSieu Mun Tang 	int curr_di;
386204d5e67SSieu Mun Tang 	uint64_t received_bitmap[MBOX_MAX_TIDS_BITMAP];
387204d5e67SSieu Mun Tang 	uint64_t interrupt_bitmap[MBOX_MAX_TIDS_BITMAP];
388204d5e67SSieu Mun Tang 	sdm_command_t cmd_queue[MBOX_SVC_CMD_QUEUE_SIZE];
389204d5e67SSieu Mun Tang 	sdm_response_t resp_queue[MBOX_SVC_RESP_QUEUE_SIZE];
390204d5e67SSieu Mun Tang } mailbox_service_t;
391204d5e67SSieu Mun Tang 
392204d5e67SSieu Mun Tang int mailbox_send_cmd_async_v3(uint8_t client_id, uint8_t job_id, uint32_t cmd,
393204d5e67SSieu Mun Tang 			      uint32_t *args, uint32_t args_len, uint8_t cmd_flag,
394204d5e67SSieu Mun Tang 			      sdm_command_callback cb, uint32_t *cb_args,
395204d5e67SSieu Mun Tang 			      uint32_t cb_args_len);
396204d5e67SSieu Mun Tang 
397*cdab4018SGirisha Dengi int mailbox_response_poll_v3(uint8_t client_id, uint8_t job_id, uint64_t *ret_args,
398204d5e67SSieu Mun Tang 			     uint32_t *ret_args_size);
399204d5e67SSieu Mun Tang 
400204d5e67SSieu Mun Tang int mailbox_response_poll_on_intr_v3(uint8_t *client_id, uint8_t *job_id,
401204d5e67SSieu Mun Tang 				     uint64_t *bitmap);
402204d5e67SSieu Mun Tang 
403204d5e67SSieu Mun Tang #endif		/* #if SIP_SVC_V3 */
404204d5e67SSieu Mun Tang 
405d09adcbaSHadi Asyrafi #endif /* SOCFPGA_MBOX_H */
406