xref: /rk3399_ARM-atf/plat/intel/soc/common/drivers/ddr/ddr.h (revision 07edc5cfc7735d92d020a443ceba043b5e9e95c6)
129461e4cSJit Loon Lim /*
229461e4cSJit Loon Lim  * Copyright (c) 2022-2023, Intel Corporation. All rights reserved.
329461e4cSJit Loon Lim  *
429461e4cSJit Loon Lim  * SPDX-License-Identifier: BSD-3-Clause
529461e4cSJit Loon Lim  */
629461e4cSJit Loon Lim 
729461e4cSJit Loon Lim #ifndef DDR_H
829461e4cSJit Loon Lim #define DDR_H
929461e4cSJit Loon Lim 
1029461e4cSJit Loon Lim #include <lib/mmio.h>
1129461e4cSJit Loon Lim #include "socfpga_handoff.h"
1229461e4cSJit Loon Lim 
13*68bb3e83SJit Loon Lim enum ddr_type {
14*68bb3e83SJit Loon Lim 	DDR_TYPE_LPDDR4_0,
15*68bb3e83SJit Loon Lim 	DDR_TYPE_LPDDR4_1,
16*68bb3e83SJit Loon Lim 	DDR_TYPE_DDR4,
17*68bb3e83SJit Loon Lim 	DDR_TYPE_LPDDR5_0,
18*68bb3e83SJit Loon Lim 	DDR_TYPE_LPDDR5_1,
19*68bb3e83SJit Loon Lim 	DDR_TYPE_DDR5,
20*68bb3e83SJit Loon Lim 	DDR_TYPE_UNKNOWN
21*68bb3e83SJit Loon Lim };
22*68bb3e83SJit Loon Lim 
23*68bb3e83SJit Loon Lim /* Region size for ECCCFG0.ecc_region_map */
24*68bb3e83SJit Loon Lim enum region_size {
25*68bb3e83SJit Loon Lim 	ONE_EIGHT,
26*68bb3e83SJit Loon Lim 	ONE_SIXTEENTH,
27*68bb3e83SJit Loon Lim 	ONE_THIRTY_SECOND,
28*68bb3e83SJit Loon Lim 	ONE_SIXTY_FOURTH
29*68bb3e83SJit Loon Lim };
30*68bb3e83SJit Loon Lim 
31*68bb3e83SJit Loon Lim /* DATATYPE DEFINATION */
32*68bb3e83SJit Loon Lim typedef unsigned long long phys_addr_t;
33*68bb3e83SJit Loon Lim typedef unsigned long long phys_size_t;
34*68bb3e83SJit Loon Lim 
3529461e4cSJit Loon Lim /* MACRO DEFINATION */
3629461e4cSJit Loon Lim #define IO96B_0_REG_BASE				0x18400000
3729461e4cSJit Loon Lim #define IO96B_1_REG_BASE				0x18800000
3829461e4cSJit Loon Lim #define IO96B_CSR_BASE					0x05000000
3929461e4cSJit Loon Lim #define IO96B_CSR_REG(reg)				(IO96B_CSR_BASE + reg)
4029461e4cSJit Loon Lim 
4129461e4cSJit Loon Lim #define IOSSM_CMD_MAX_WORD_SIZE				7U
4229461e4cSJit Loon Lim #define IOSSM_RESP_MAX_WORD_SIZE			4U
4329461e4cSJit Loon Lim 
4429461e4cSJit Loon Lim #define CCU_REG_BASE					0x1C000000
4529461e4cSJit Loon Lim #define DMI0_DMIUSMCTCR					0x7300
4629461e4cSJit Loon Lim #define DMI1_DMIUSMCTCR					0x8300
4729461e4cSJit Loon Lim #define CCU_DMI_ALLOCEN					BIT(1)
4829461e4cSJit Loon Lim #define CCU_DMI_LOOKUPEN				BIT(2)
4929461e4cSJit Loon Lim #define CCU_REG(reg)					(CCU_REG_BASE + reg)
5029461e4cSJit Loon Lim 
5129461e4cSJit Loon Lim // CMD_RESPONSE_STATUS Register
5229461e4cSJit Loon Lim #define CMD_RESPONSE_STATUS				0x45C
5329461e4cSJit Loon Lim #define CMD_RESPONSE_OFFSET				0x4
5429461e4cSJit Loon Lim #define CMD_RESPONSE_DATA_SHORT_MASK			GENMASK(31, 16)
5529461e4cSJit Loon Lim #define CMD_RESPONSE_DATA_SHORT_OFFSET			16
5629461e4cSJit Loon Lim #define STATUS_CMD_RESPONSE_ERROR_MASK			GENMASK(7, 5)
5729461e4cSJit Loon Lim #define STATUS_CMD_RESPONSE_ERROR_OFFSET		5
5829461e4cSJit Loon Lim #define STATUS_GENERAL_ERROR_MASK			GENMASK(4, 1)
5929461e4cSJit Loon Lim #define STATUS_GENERAL_ERROR_OFFSET			1
6029461e4cSJit Loon Lim #define STATUS_COMMAND_RESPONSE_READY			0x1
6129461e4cSJit Loon Lim #define STATUS_COMMAND_RESPONSE_READY_CLEAR		0x0
6229461e4cSJit Loon Lim #define STATUS_COMMAND_RESPONSE_READY_MASK		0x1
6329461e4cSJit Loon Lim #define STATUS_COMMAND_RESPONSE_READY_OFFSET		0
6429461e4cSJit Loon Lim #define STATUS_COMMAND_RESPONSE(x)			(((x) & \
6529461e4cSJit Loon Lim 							STATUS_COMMAND_RESPONSE_READY_MASK) >> \
6629461e4cSJit Loon Lim 							STATUS_COMMAND_RESPONSE_READY_OFFSET)
6729461e4cSJit Loon Lim 
6829461e4cSJit Loon Lim // CMD_REQ Register
6929461e4cSJit Loon Lim #define CMD_STATUS					0x400
7029461e4cSJit Loon Lim #define CMD_PARAM					0x438
7129461e4cSJit Loon Lim #define CMD_REQ						0x43C
7229461e4cSJit Loon Lim #define CMD_PARAM_OFFSET				0x4
7329461e4cSJit Loon Lim #define CMD_TARGET_IP_TYPE_MASK				GENMASK(31, 29)
7429461e4cSJit Loon Lim #define CMD_TARGET_IP_TYPE_OFFSET			29
7529461e4cSJit Loon Lim #define CMD_TARGET_IP_INSTANCE_ID_MASK			GENMASK(28, 24)
7629461e4cSJit Loon Lim #define CMD_TARGET_IP_INSTANCE_ID_OFFSET		24
7729461e4cSJit Loon Lim #define CMD_TYPE_MASK					GENMASK(23, 16)
7829461e4cSJit Loon Lim #define CMD_TYPE_OFFSET					16
7929461e4cSJit Loon Lim #define CMD_OPCODE_MASK					GENMASK(15, 0)
8029461e4cSJit Loon Lim #define CMD_OPCODE_OFFSET				0
8129461e4cSJit Loon Lim 
8229461e4cSJit Loon Lim #define CMD_INIT					0
8329461e4cSJit Loon Lim 
8429461e4cSJit Loon Lim #define OPCODE_GET_MEM_INTF_INFO			0x0001
8529461e4cSJit Loon Lim #define OPCODE_GET_MEM_TECHNOLOGY			0x0002
8629461e4cSJit Loon Lim #define OPCODE_GET_MEM_WIDTH_INFO			0x0004
8729461e4cSJit Loon Lim #define OPCODE_TRIG_MEM_CAL				0x000A
8829461e4cSJit Loon Lim #define OPCODE_ECC_ENABLE_STATUS			0x0102
8929461e4cSJit Loon Lim #define OPCODE_ECC_INTERRUPT_MASK			0x0105
9029461e4cSJit Loon Lim #define OPCODE_ECC_SCRUB_MODE_0_START			0x0202
9129461e4cSJit Loon Lim #define OPCODE_ECC_SCRUB_MODE_1_START			0x0203
9229461e4cSJit Loon Lim #define OPCODE_BIST_RESULTS_STATUS			0x0302
9329461e4cSJit Loon Lim #define OPCODE_BIST_MEM_INIT_START			0x0303
9429461e4cSJit Loon Lim // Please update according to IOSSM mailbox spec
9529461e4cSJit Loon Lim #define MBOX_ID_IOSSM					0x00
9629461e4cSJit Loon Lim #define MBOX_CMD_GET_SYS_INFO				0x01
9729461e4cSJit Loon Lim // Please update according to IOSSM mailbox spec
9829461e4cSJit Loon Lim #define MBOX_CMD_GET_MEM_INFO				0x02
9929461e4cSJit Loon Lim #define MBOX_CMD_TRIG_CONTROLLER_OP			0x04
10029461e4cSJit Loon Lim #define MBOX_CMD_TRIG_MEM_CAL_OP			0x05
10129461e4cSJit Loon Lim #define MBOX_CMD_POKE_REG				0xFD
10229461e4cSJit Loon Lim #define MBOX_CMD_PEEK_REG				0xFE
10329461e4cSJit Loon Lim #define MBOX_CMD_GET_DEBUG_LOG				0xFF
10429461e4cSJit Loon Lim // Please update according to IOSSM mailbox spec
10529461e4cSJit Loon Lim #define MBOX_CMD_DIRECT					0x00
10629461e4cSJit Loon Lim 
10729461e4cSJit Loon Lim #define SOCFPGA_SYSMGR_BOOT_SCRATCH_POR_0_MASK		0x01
10829461e4cSJit Loon Lim 
10929461e4cSJit Loon Lim #define IOSSM_MB_WRITE(addr, data)			mmio_write_32(addr, data)
11029461e4cSJit Loon Lim 
111*68bb3e83SJit Loon Lim /* DDR4 Register */
112*68bb3e83SJit Loon Lim #define DDR4_PWRCTL_OFFSET				0x30
113*68bb3e83SJit Loon Lim #define DDR4_SBRCTL_OFFSET				0x0F24
114*68bb3e83SJit Loon Lim #define DDR4_SBRSTAT_OFFSET				0x0F28
115*68bb3e83SJit Loon Lim #define DDR4_SBRWDATA0_OFFSET				0x0F2C
116*68bb3e83SJit Loon Lim #define DDR4_SBRSTART0_OFFSET				0x0F38
117*68bb3e83SJit Loon Lim #define DDR4_SBRWDATA1_OFFSET				0x0F30
118*68bb3e83SJit Loon Lim #define DDR4_SBRSTART1_OFFSET				0x0F3C
119*68bb3e83SJit Loon Lim #define DDR4_SBRRANGE0_OFFSET				0x0F40
120*68bb3e83SJit Loon Lim #define DDR4_SBRRANGE1_OFFSET				0x0F44
121*68bb3e83SJit Loon Lim #define DDR4_ECCCFG0_OFFSET				0x70
122*68bb3e83SJit Loon Lim #define DDR4_ECCCFG1_OFFSET				0x74
123*68bb3e83SJit Loon Lim #define DDR4_PCTRL0_OFFSET				0x0490
124*68bb3e83SJit Loon Lim 
125*68bb3e83SJit Loon Lim #define LPDDR4_ECCCFG0_ECC_REGION_MAP_GRANU_SHIFT	30
126*68bb3e83SJit Loon Lim #define ALL_PROTECTED					0x7F
127*68bb3e83SJit Loon Lim #define LPDDR4_ECCCFG0_ECC_REGION_MAP_SHIFT		8
128*68bb3e83SJit Loon Lim 
129*68bb3e83SJit Loon Lim 
130*68bb3e83SJit Loon Lim 
131*68bb3e83SJit Loon Lim #define LPDDR4_ECCCFG1_ECC_REGIONS_PARITY_LOCK		BIT(4)
132*68bb3e83SJit Loon Lim #define DDR4_PCTRL0_PORT_EN				BIT(0)
133*68bb3e83SJit Loon Lim #define DDR4_SBRCTL_SCRUB_EN				BIT(0)
134*68bb3e83SJit Loon Lim #define DDR4_SBRSTAT_SCRUB_BUSY				BIT(0)
135*68bb3e83SJit Loon Lim #define DDR4_SBRCTL_SCRUB_BURST_1			BIT(4)
136*68bb3e83SJit Loon Lim #define DDR4_SBRCTL_SCRUB_WRITE				BIT(2)
137*68bb3e83SJit Loon Lim #define DDR4_SBRSTAT_SCRUB_DONE				BIT(1)
138*68bb3e83SJit Loon Lim 
13929461e4cSJit Loon Lim /* FUNCTION DEFINATION */
14029461e4cSJit Loon Lim int ddr_calibration_check(void);
14129461e4cSJit Loon Lim 
14229461e4cSJit Loon Lim int iossm_mb_init(void);
14329461e4cSJit Loon Lim 
14429461e4cSJit Loon Lim int iossm_mb_read_response(void);
14529461e4cSJit Loon Lim 
14629461e4cSJit Loon Lim int iossm_mb_send(uint32_t cmd_target_ip_type, uint32_t cmd_target_ip_instance_id,
14729461e4cSJit Loon Lim 			uint32_t cmd_type, uint32_t cmd_opcode, uint32_t *args,
14829461e4cSJit Loon Lim 			unsigned int len);
14929461e4cSJit Loon Lim 
15029461e4cSJit Loon Lim int ddr_iossm_mailbox_cmd(uint32_t cmd);
15129461e4cSJit Loon Lim 
15229461e4cSJit Loon Lim int ddr_init(void);
15329461e4cSJit Loon Lim 
15429461e4cSJit Loon Lim int ddr_config_handoff(handoff *hoff_ptr);
15529461e4cSJit Loon Lim 
15629461e4cSJit Loon Lim void ddr_enable_ns_access(void);
15729461e4cSJit Loon Lim 
15829461e4cSJit Loon Lim void ddr_enable_firewall(void);
15929461e4cSJit Loon Lim 
16029461e4cSJit Loon Lim bool is_ddr_init_in_progress(void);
16129461e4cSJit Loon Lim 
162*68bb3e83SJit Loon Lim int ddr_zerofill_scrubber(phys_addr_t umctl2_base, enum ddr_type umctl2_type);
163*68bb3e83SJit Loon Lim 
164*68bb3e83SJit Loon Lim int ddr_config_scrubber(phys_addr_t umctl2_base, enum ddr_type umctl2_type);
165*68bb3e83SJit Loon Lim 
166*68bb3e83SJit Loon Lim int poll_idle_status(uint32_t addr, uint32_t mask, uint32_t match, uint32_t delay_ms);
167*68bb3e83SJit Loon Lim 
16829461e4cSJit Loon Lim #endif
169