xref: /rk3399_ARM-atf/plat/intel/soc/agilex5/include/agilex5_iossm_mailbox.h (revision aac2ee3838ac1b70b12c63d1d8f89435b7e05d0e)
1ce21a1a9SSieu Mun Tang /*
292d22776SGirisha Dengi  * Copyright (c) 2024-2025, Altera Corporation. All rights reserved.
3ce21a1a9SSieu Mun Tang  *
4ce21a1a9SSieu Mun Tang  * SPDX-License-Identifier: BSD-3-Clause
5ce21a1a9SSieu Mun Tang  */
6ce21a1a9SSieu Mun Tang 
7ce21a1a9SSieu Mun Tang #ifndef AGILEX5_IOSSM_MAILBOX_H
8ce21a1a9SSieu Mun Tang #define AGILEX5_IOSSM_MAILBOX_H
9ce21a1a9SSieu Mun Tang 
10ce21a1a9SSieu Mun Tang #include <stdbool.h>
11ce21a1a9SSieu Mun Tang #include <stdint.h>
12ce21a1a9SSieu Mun Tang #include <stdlib.h>
13ce21a1a9SSieu Mun Tang 
14ce21a1a9SSieu Mun Tang #include "lib/mmio.h"
15ce21a1a9SSieu Mun Tang #include "agilex5_ddr.h"
16ce21a1a9SSieu Mun Tang 
1792d22776SGirisha Dengi #define __bf_shf(x)					(__builtin_ffsll(x) - 1U)
1892d22776SGirisha Dengi #define FIELD_GET(_mask, _reg)						\
1992d22776SGirisha Dengi 	({								\
2092d22776SGirisha Dengi 		(typeof(_mask))(((_reg) & (_mask)) >> __bf_shf(_mask));	\
2192d22776SGirisha Dengi 	})
2292d22776SGirisha Dengi 
2392d22776SGirisha Dengi #define FIELD_PREP(_mask, _val)						\
2492d22776SGirisha Dengi 	({ \
2592d22776SGirisha Dengi 		((typeof(_mask))(_val) << __bf_shf(_mask)) & (_mask);	\
2692d22776SGirisha Dengi 	})
2792d22776SGirisha Dengi 
2892d22776SGirisha Dengi #define IOSSM_TIMEOUT_MS				120000U
29ce21a1a9SSieu Mun Tang #define TIMEOUT_5000MS					5000
30ce21a1a9SSieu Mun Tang #define TIMEOUT						TIMEOUT_5000MS
31ce21a1a9SSieu Mun Tang #define IOSSM_STATUS_CAL_SUCCESS			BIT(0)
32ce21a1a9SSieu Mun Tang #define IOSSM_STATUS_CAL_FAIL				BIT(1)
33ce21a1a9SSieu Mun Tang #define IOSSM_STATUS_CAL_BUSY				BIT(2)
34ce21a1a9SSieu Mun Tang #define IOSSM_STATUS_COMMAND_RESPONSE_READY		1
35ce21a1a9SSieu Mun Tang #define IOSSM_CMD_RESPONSE_STATUS_OFFSET		0x45C
36ce21a1a9SSieu Mun Tang #define IOSSM_CMD_RESPONSE_DATA_0_OFFSET		0x458
37ce21a1a9SSieu Mun Tang #define IOSSM_CMD_RESPONSE_DATA_1_OFFSET		0x454
38ce21a1a9SSieu Mun Tang #define IOSSM_CMD_RESPONSE_DATA_2_OFFSET		0x450
39ce21a1a9SSieu Mun Tang #define IOSSM_CMD_REQ_OFFSET				0x43C
40ce21a1a9SSieu Mun Tang #define IOSSM_CMD_PARAM_0_OFFSET			0x438
41ce21a1a9SSieu Mun Tang #define IOSSM_CMD_PARAM_1_OFFSET			0x434
42ce21a1a9SSieu Mun Tang #define IOSSM_CMD_PARAM_2_OFFSET			0x430
43ce21a1a9SSieu Mun Tang #define IOSSM_CMD_PARAM_3_OFFSET			0x42C
44ce21a1a9SSieu Mun Tang #define IOSSM_CMD_PARAM_4_OFFSET			0x428
45ce21a1a9SSieu Mun Tang #define IOSSM_CMD_PARAM_5_OFFSET			0x424
46ce21a1a9SSieu Mun Tang #define IOSSM_CMD_PARAM_6_OFFSET			0x420
47ce21a1a9SSieu Mun Tang #define IOSSM_STATUS_OFFSET				0x400
48ce21a1a9SSieu Mun Tang #define IOSSM_CMD_RESPONSE_DATA_SHORT_MASK		GENMASK(31, 16)
49ce21a1a9SSieu Mun Tang #define IOSSM_CMD_RESPONSE_DATA_SHORT(data)		(((data) & \
50ce21a1a9SSieu Mun Tang 							IOSSM_CMD_RESPONSE_DATA_SHORT_MASK) >> 16)
51ce21a1a9SSieu Mun Tang #define MAX_IO96B_SUPPORTED				2
52ce21a1a9SSieu Mun Tang #define MAX_MEM_INTERFACES_SUPPORTED			2
5392d22776SGirisha Dengi #define SZ_8						0x00000008
5492d22776SGirisha Dengi #define GET_INLINE_ECC_HW_DDR_SIZE(size)		(((size) * 7) / 8)
5592d22776SGirisha Dengi 
56*f1b1fae9SJit Loon Lim #define IOSSM_MEM_INTF_INFO_0_OFFSET			0x200
57*f1b1fae9SJit Loon Lim #define IOSSM_MEM_INTF_INFO_1_OFFSET			0x280
58*f1b1fae9SJit Loon Lim #define INTF_IP_TYPE_MASK				GENMASK(31, 29)
59*f1b1fae9SJit Loon Lim #define INTF_INSTANCE_ID_MASK				GENMASK(28, 24)
60*f1b1fae9SJit Loon Lim 
61*f1b1fae9SJit Loon Lim #define IOSSM_ECC_ENABLE_INTF0_OFFSET			0x240
62*f1b1fae9SJit Loon Lim #define IOSSM_ECC_ENABLE_INTF1_OFFSET			0x2C0
63*f1b1fae9SJit Loon Lim #define INTF_ECC_ENABLE_TYPE_MASK			GENMASK(1, 0)
64*f1b1fae9SJit Loon Lim #define INTF_ECC_TYPE_MASK				BIT(8)
65*f1b1fae9SJit Loon Lim 
66*f1b1fae9SJit Loon Lim #define MAX_MEM_INTERFACE_SUPPORTED			2
67*f1b1fae9SJit Loon Lim #define IOSSM_MEM_TOTAL_CAPACITY_INTF0_OFFSET		0x234
68*f1b1fae9SJit Loon Lim #define IOSSM_MEM_TOTAL_CAPACITY_INTF1_OFFSET		0x2B4
69*f1b1fae9SJit Loon Lim 
70*f1b1fae9SJit Loon Lim /* offset info of MEM_TOTAL_CAPACITY_INTF */
71*f1b1fae9SJit Loon Lim #define INTF_CAPACITY_GBITS_MASK			GENMASK(7, 0)
72*f1b1fae9SJit Loon Lim 
73*f1b1fae9SJit Loon Lim /* offset info of ECC_ENABLE_INTF */
74*f1b1fae9SJit Loon Lim #define INTF_BIST_STATUS_MASK				BIT(0)
75*f1b1fae9SJit Loon Lim 
76*f1b1fae9SJit Loon Lim #define IOSSM_MEM_INIT_STATUS_INTF0_OFFSET		0x260
77*f1b1fae9SJit Loon Lim #define IOSSM_MEM_INIT_STATUS_INTF1_OFFSET		0x2E0
78*f1b1fae9SJit Loon Lim 
7992d22776SGirisha Dengi /* ECC error status related register offsets/commands. */
8092d22776SGirisha Dengi #define IOSSM_ECC_ERR_STATUS_OFFSET			0x300
8192d22776SGirisha Dengi #define IOSSM_ECC_ERR_DATA_START_OFFSET			0x310
8292d22776SGirisha Dengi #define IOSSM_ECC_CLEAR_ERR_BUFFER			0x0110
8392d22776SGirisha Dengi 
8492d22776SGirisha Dengi /* Offset info of ECC_ERR_STATUS */
8592d22776SGirisha Dengi #define ECC_ERR_COUNTER_MASK				GENMASK(15, 0)
8692d22776SGirisha Dengi #define ECC_ERR_OVERFLOW_MASK				GENMASK(31, 16)
8792d22776SGirisha Dengi 
8892d22776SGirisha Dengi /* Offset info of ECC_ERR_DATA */
8992d22776SGirisha Dengi #define ECC_ERR_IP_TYPE_MASK				GENMASK(24, 22)
9092d22776SGirisha Dengi #define ECC_ERR_INSTANCE_ID_MASK			GENMASK(21, 17)
9192d22776SGirisha Dengi #define ECC_ERR_SOURCE_ID_MASK				GENMASK(16, 10)
9292d22776SGirisha Dengi #define ECC_ERR_TYPE_MASK				GENMASK(9, 6)
9392d22776SGirisha Dengi #define ECC_ERR_ADDR_UPPER_MASK				GENMASK(5, 0)
9492d22776SGirisha Dengi #define ECC_ERR_ADDR_LOWER_MASK				GENMASK(31, 0)
9592d22776SGirisha Dengi 
9692d22776SGirisha Dengi #define MAX_ECC_ERR_COUNT				16U
9792d22776SGirisha Dengi 
98*f1b1fae9SJit Loon Lim #define IOSSM_CONTROLLER_TRIGGER_OFFSET			0x300
99*f1b1fae9SJit Loon Lim 
10092d22776SGirisha Dengi #define BIST_START_ADDR_SPACE_MASK			GENMASK(5, 0)
10192d22776SGirisha Dengi #define BIST_START_ADDR_LOW_MASK			GENMASK(31, 0)
10292d22776SGirisha Dengi #define BIST_START_ADDR_HIGH_MASK			GENMASK(37, 32)
103ce21a1a9SSieu Mun Tang 
104ce21a1a9SSieu Mun Tang /* supported mailbox command type */
105ce21a1a9SSieu Mun Tang enum iossm_mailbox_cmd_type  {
106ce21a1a9SSieu Mun Tang 	CMD_NOP,
107ce21a1a9SSieu Mun Tang 	CMD_GET_SYS_INFO,
108ce21a1a9SSieu Mun Tang 	CMD_GET_MEM_INFO,
109ce21a1a9SSieu Mun Tang 	CMD_GET_MEM_CAL_INFO,
110ce21a1a9SSieu Mun Tang 	CMD_TRIG_CONTROLLER_OP,
111ce21a1a9SSieu Mun Tang 	CMD_TRIG_MEM_CAL_OP
112ce21a1a9SSieu Mun Tang };
113ce21a1a9SSieu Mun Tang 
11492d22776SGirisha Dengi /* ECC error types */
11592d22776SGirisha Dengi enum ecc_error_type {
11692d22776SGirisha Dengi 	SINGLE_BIT_ERROR = 0,			/* 0b0000 */
11792d22776SGirisha Dengi 	MULTIPLE_SINGLE_BIT_ERRORS = 1,		/* 0b0001 */
11892d22776SGirisha Dengi 	DOUBLE_BIT_ERROR = 2,			/* 0b0010 */
11992d22776SGirisha Dengi 	MULTIPLE_DOUBLE_BIT_ERRORS = 3,		/* 0b0011 */
12092d22776SGirisha Dengi 	SINGLE_BIT_ERROR_SCRUBBING = 8,		/* 0b1000 */
12192d22776SGirisha Dengi 	WRITE_LINK_SINGLE_BIT_ERROR = 9,	/* 0b1001 */
12292d22776SGirisha Dengi 	WRITE_LINK_DOUBLE_BIT_ERROR = 10,	/* 0b1010 */
12392d22776SGirisha Dengi 	READ_LINK_SINGLE_BIT_ERROR = 11,	/* 0b1011 */
12492d22776SGirisha Dengi 	READ_LINK_DOUBLE_BIT_ERROR = 12,	/* 0b1100 */
12592d22776SGirisha Dengi 	READ_MODIFY_WRITE_DOUBLE_BIT_ERROR = 13	/* 0b1101 */
12692d22776SGirisha Dengi };
12792d22776SGirisha Dengi 
128ce21a1a9SSieu Mun Tang /* supported mailbox command opcode */
129ce21a1a9SSieu Mun Tang enum iossm_mailbox_cmd_opcode  {
130ce21a1a9SSieu Mun Tang 	GET_MEM_INTF_INFO = 0x0001,
131ce21a1a9SSieu Mun Tang 	GET_MEM_TECHNOLOGY,
132ce21a1a9SSieu Mun Tang 	GET_MEMCLK_FREQ_KHZ,
133ce21a1a9SSieu Mun Tang 	GET_MEM_WIDTH_INFO,
134ce21a1a9SSieu Mun Tang 	ECC_ENABLE_SET = 0x0101,
135ce21a1a9SSieu Mun Tang 	ECC_ENABLE_STATUS,
136ce21a1a9SSieu Mun Tang 	ECC_INTERRUPT_STATUS,
137ce21a1a9SSieu Mun Tang 	ECC_INTERRUPT_ACK,
138ce21a1a9SSieu Mun Tang 	ECC_INTERRUPT_MASK,
139ce21a1a9SSieu Mun Tang 	ECC_WRITEBACK_ENABLE,
140ce21a1a9SSieu Mun Tang 	ECC_SCRUB_IN_PROGRESS_STATUS = 0x0201,
141ce21a1a9SSieu Mun Tang 	ECC_SCRUB_MODE_0_START,
142ce21a1a9SSieu Mun Tang 	ECC_SCRUB_MODE_1_START,
143ce21a1a9SSieu Mun Tang 	BIST_STANDARD_MODE_START = 0x0301,
144ce21a1a9SSieu Mun Tang 	BIST_RESULTS_STATUS,
145ce21a1a9SSieu Mun Tang 	BIST_MEM_INIT_START,
146ce21a1a9SSieu Mun Tang 	BIST_MEM_INIT_STATUS,
147ce21a1a9SSieu Mun Tang 	BIST_SET_DATA_PATTERN_UPPER,
148ce21a1a9SSieu Mun Tang 	BIST_SET_DATA_PATTERN_LOWER,
149ce21a1a9SSieu Mun Tang 	TRIG_MEM_CAL = 0x000a,
150ce21a1a9SSieu Mun Tang 	GET_MEM_CAL_STATUS
151ce21a1a9SSieu Mun Tang };
152ce21a1a9SSieu Mun Tang 
153ce21a1a9SSieu Mun Tang /*
154ce21a1a9SSieu Mun Tang  * IOSSM mailbox required information
155ce21a1a9SSieu Mun Tang  *
156ce21a1a9SSieu Mun Tang  * @num_mem_interface:	Number of memory interfaces instantiated
157ce21a1a9SSieu Mun Tang  * @ip_type:		IP type implemented on the IO96B
158ce21a1a9SSieu Mun Tang  * @ip_instance_id:	IP identifier for every IP instance implemented on the IO96B
15992d22776SGirisha Dengi  * @memory_size[2]:	Memory size for every IP instance implemented on the IO96B
160ce21a1a9SSieu Mun Tang  */
161ce21a1a9SSieu Mun Tang struct io96b_mb_ctrl {
162ce21a1a9SSieu Mun Tang 	uint32_t num_mem_interface;
163ce21a1a9SSieu Mun Tang 	uint32_t ip_type[2];
164ce21a1a9SSieu Mun Tang 	uint32_t ip_instance_id[2];
16592d22776SGirisha Dengi 	phys_size_t memory_size[2];
166ce21a1a9SSieu Mun Tang };
167ce21a1a9SSieu Mun Tang 
168ce21a1a9SSieu Mun Tang /*
169ce21a1a9SSieu Mun Tang  * IOSSM mailbox response outputs
170ce21a1a9SSieu Mun Tang  *
171ce21a1a9SSieu Mun Tang  * @cmd_resp_status: Command Interface status
172ce21a1a9SSieu Mun Tang  * @cmd_resp_data_*: More spaces for command response
173ce21a1a9SSieu Mun Tang  */
174ce21a1a9SSieu Mun Tang struct io96b_mb_resp {
175ce21a1a9SSieu Mun Tang 	uint32_t cmd_resp_status;
176ce21a1a9SSieu Mun Tang 	uint32_t cmd_resp_data_0;
177ce21a1a9SSieu Mun Tang 	uint32_t cmd_resp_data_1;
178ce21a1a9SSieu Mun Tang 	uint32_t cmd_resp_data_2;
179ce21a1a9SSieu Mun Tang };
180ce21a1a9SSieu Mun Tang 
181ce21a1a9SSieu Mun Tang /*
182ce21a1a9SSieu Mun Tang  * IO96B instance specific information
183ce21a1a9SSieu Mun Tang  *
184ce21a1a9SSieu Mun Tang  * @io96b_csr_addr:	IO96B instance CSR address
185ce21a1a9SSieu Mun Tang  * @cal_status:		IO96B instance calibration status
186ce21a1a9SSieu Mun Tang  * @mb_ctrl:		IOSSM mailbox required information
187ce21a1a9SSieu Mun Tang  */
188ce21a1a9SSieu Mun Tang struct io96b_instance {
189ce21a1a9SSieu Mun Tang 	phys_addr_t io96b_csr_addr;
190ce21a1a9SSieu Mun Tang 	bool cal_status;
191ce21a1a9SSieu Mun Tang 	struct io96b_mb_ctrl mb_ctrl;
192ce21a1a9SSieu Mun Tang };
193ce21a1a9SSieu Mun Tang 
194ce21a1a9SSieu Mun Tang /*
195ce21a1a9SSieu Mun Tang  * Overall IO96B instance(s) information
196ce21a1a9SSieu Mun Tang  *
197ce21a1a9SSieu Mun Tang  * @num_instance:	Number of instance(s) assigned to HPS
198ce21a1a9SSieu Mun Tang  * @overall_cal_status: Overall calibration status for all IO96B instance(s)
199ce21a1a9SSieu Mun Tang  * @ddr_type:		DDR memory type
200ce21a1a9SSieu Mun Tang  * @ecc_status:		ECC enable status (false = disabled, true = enabled)
201ce21a1a9SSieu Mun Tang  * @overall_size:	Total DDR memory size
202ce21a1a9SSieu Mun Tang  * @io96b_0:		IO96B 0 instance specific information
203ce21a1a9SSieu Mun Tang  * @io96b_1:		IO96B 1 instance specific information
204ce21a1a9SSieu Mun Tang  */
205ce21a1a9SSieu Mun Tang struct io96b_info {
206ce21a1a9SSieu Mun Tang 	uint8_t num_instance;
207ce21a1a9SSieu Mun Tang 	bool overall_cal_status;
208ce21a1a9SSieu Mun Tang 	const char *ddr_type;
209ce21a1a9SSieu Mun Tang 	bool ecc_status;
21092d22776SGirisha Dengi 	bool is_inline_ecc;
21192d22776SGirisha Dengi 	phys_size_t overall_size;
212ce21a1a9SSieu Mun Tang 	struct io96b_instance io96b_0;
213ce21a1a9SSieu Mun Tang 	struct io96b_instance io96b_1;
214ce21a1a9SSieu Mun Tang };
215ce21a1a9SSieu Mun Tang 
216ce21a1a9SSieu Mun Tang int io96b_mb_req(phys_addr_t io96b_csr_addr, uint32_t ip_type, uint32_t instance_id,
217ce21a1a9SSieu Mun Tang 		 uint32_t usr_cmd_type, uint32_t usr_cmd_opcode, uint32_t cmd_param_0,
218ce21a1a9SSieu Mun Tang 		 uint32_t cmd_param_1, uint32_t cmd_param_2, uint32_t cmd_param_3,
219ce21a1a9SSieu Mun Tang 		 uint32_t cmd_param_4, uint32_t cmd_param_5, uint32_t cmd_param_6,
220ce21a1a9SSieu Mun Tang 		 uint32_t resp_data_len, struct io96b_mb_resp *resp);
221ce21a1a9SSieu Mun Tang 
222ce21a1a9SSieu Mun Tang /* Supported IOSSM mailbox function */
223ce21a1a9SSieu Mun Tang void io96b_mb_init(struct io96b_info *io96b_ctrl);
224ce21a1a9SSieu Mun Tang int io96b_cal_status(phys_addr_t addr);
225ce21a1a9SSieu Mun Tang void init_mem_cal(struct io96b_info *io96b_ctrl);
226ce21a1a9SSieu Mun Tang int trig_mem_cal(struct io96b_info *io96b_ctrl);
227ce21a1a9SSieu Mun Tang int get_mem_technology(struct io96b_info *io96b_ctrl);
228ce21a1a9SSieu Mun Tang int get_mem_width_info(struct io96b_info *io96b_ctrl);
229ce21a1a9SSieu Mun Tang int ecc_enable_status(struct io96b_info *io96b_ctrl);
230ce21a1a9SSieu Mun Tang int bist_mem_init_start(struct io96b_info *io96b_ctrl);
23192d22776SGirisha Dengi bool get_ecc_dbe_status(struct io96b_info *io96b_ctrl);
232ce21a1a9SSieu Mun Tang 
233ce21a1a9SSieu Mun Tang #endif /* AGILEX5_IOSSM_MAILBOX_H */
234