xref: /rk3399_ARM-atf/include/drivers/nxp/ddr/s32cc/ddr_utils.h (revision 47f0a591a46da853bafdc7c3936836f6b4733cb5)
130c8a20dSKhristine Andreea Barbulescu /*
230c8a20dSKhristine Andreea Barbulescu  * Copyright 2020-2025 NXP
330c8a20dSKhristine Andreea Barbulescu  *
430c8a20dSKhristine Andreea Barbulescu  * SPDX-License-Identifier: BSD-3-Clause
530c8a20dSKhristine Andreea Barbulescu  */
630c8a20dSKhristine Andreea Barbulescu 
730c8a20dSKhristine Andreea Barbulescu #ifndef DDR_UTILS_H
830c8a20dSKhristine Andreea Barbulescu #define DDR_UTILS_H
930c8a20dSKhristine Andreea Barbulescu 
1030c8a20dSKhristine Andreea Barbulescu #include <stdbool.h>
1130c8a20dSKhristine Andreea Barbulescu #include <stdlib.h>
1230c8a20dSKhristine Andreea Barbulescu 
1330c8a20dSKhristine Andreea Barbulescu #include <lib/mmio.h>
1430c8a20dSKhristine Andreea Barbulescu 
1530c8a20dSKhristine Andreea Barbulescu #include <platform_def.h>
1630c8a20dSKhristine Andreea Barbulescu 
1730c8a20dSKhristine Andreea Barbulescu /* Possible errors */
1830c8a20dSKhristine Andreea Barbulescu #define NO_ERR              0x00000000U
1930c8a20dSKhristine Andreea Barbulescu #define TIMEOUT_ERR         0x00000002U
2030c8a20dSKhristine Andreea Barbulescu #define TRAINING_FAILED     0x00000003U
2130c8a20dSKhristine Andreea Barbulescu #define BITFIELD_EXCEEDED   0x00000004U
2230c8a20dSKhristine Andreea Barbulescu #define DEASSERT_FAILED	    0x00000005U
2330c8a20dSKhristine Andreea Barbulescu 
24a4efd428SKhristine Andreea Barbulescu /* DDRC related */
25a4efd428SKhristine Andreea Barbulescu #define DDRC_BASE                        0x403C0000U
26a4efd428SKhristine Andreea Barbulescu #define OFFSET_DDRC_SWCTL                0x320U
27a4efd428SKhristine Andreea Barbulescu #define OFFSET_DDRC_DFIMISC              0x1B0U
28a4efd428SKhristine Andreea Barbulescu #define OFFSET_DDRC_PWRCTL               0x30U
29a4efd428SKhristine Andreea Barbulescu #define OFFSET_DDRC_SWSTAT               0x324U
30a4efd428SKhristine Andreea Barbulescu #define OFFSET_DDRC_DFITMG0              0x190U
31a4efd428SKhristine Andreea Barbulescu #define OFFSET_DDRC_DBG1                 0x304U
32a4efd428SKhristine Andreea Barbulescu 
33a4efd428SKhristine Andreea Barbulescu /* DDRC masks and values */
34a4efd428SKhristine Andreea Barbulescu #define MSTR_LPDDR4_VAL		0x20U
35a4efd428SKhristine Andreea Barbulescu #define SWSTAT_SW_DONE		1U
36a4efd428SKhristine Andreea Barbulescu #define SWSTAT_SW_NOT_DONE	0U
37a4efd428SKhristine Andreea Barbulescu #define SWCTL_SWDONE_DONE	0x1U
38a4efd428SKhristine Andreea Barbulescu #define SWCTL_SWDONE_ENABLE	0x0U
39a4efd428SKhristine Andreea Barbulescu #define SWSTAT_SWDONE_ACK_MASK	GENMASK_32(1U, 0U)
40a4efd428SKhristine Andreea Barbulescu 
41a4efd428SKhristine Andreea Barbulescu #define MSTR_DRAM_MASK		GENMASK_32(5U, 0U)
42a4efd428SKhristine Andreea Barbulescu #define MSTR_ACT_RANKS_MASK GENMASK_32(25U, 24U)
43a4efd428SKhristine Andreea Barbulescu #define MSTR_DUAL_RANK_VAL  0x3000000U
44a4efd428SKhristine Andreea Barbulescu #define MSTR_BURST_RDWR_POS 16
45a4efd428SKhristine Andreea Barbulescu #define MSTR_BURST_RDWR_MASK 0xFU
46a4efd428SKhristine Andreea Barbulescu #define DFITMG0_PHY_CLK_POS  15
47a4efd428SKhristine Andreea Barbulescu #define DFITMG0_PHY_CLK_MASK 0x1U
48a4efd428SKhristine Andreea Barbulescu 
49a4efd428SKhristine Andreea Barbulescu #define DDR_SS_AXI_PARITY_ENABLE_MASK	GENMASK_32(12U, 4U)
50a4efd428SKhristine Andreea Barbulescu #define DDR_SS_AXI_PARITY_TYPE_MASK	GENMASK_32(24U, 16U)
51a4efd428SKhristine Andreea Barbulescu #define DDR_SS_DFI_1_ENABLED		0x1U
52a4efd428SKhristine Andreea Barbulescu #define DBG1_DISABLE_DE_QUEUEING	0x0U
53a4efd428SKhristine Andreea Barbulescu #define RFSHCTL3_DISABLE_AUTO_REFRESH	0x1U
54a4efd428SKhristine Andreea Barbulescu 
55a4efd428SKhristine Andreea Barbulescu #define PWRCTL_POWER_DOWN_ENABLE_MASK		BIT_32(1)
56a4efd428SKhristine Andreea Barbulescu #define PWRCTL_SELF_REFRESH_ENABLE_MASK		BIT_32(0)
57a4efd428SKhristine Andreea Barbulescu #define PWRCTL_EN_DFI_DRAM_CLOCK_DIS_MASK	BIT_32(3)
58a4efd428SKhristine Andreea Barbulescu #define DFIMISC_DFI_INIT_COMPLETE_EN_MASK	BIT_32(0)
59a4efd428SKhristine Andreea Barbulescu 
6030c8a20dSKhristine Andreea Barbulescu #define	TRAINING_OK_MSG			0x07U
6130c8a20dSKhristine Andreea Barbulescu #define	TRAINING_FAILED_MSG		0xFFU
6230c8a20dSKhristine Andreea Barbulescu 
6330c8a20dSKhristine Andreea Barbulescu #define	APBONLY_DCTWRITEPROT_ACK_EN              0U
6430c8a20dSKhristine Andreea Barbulescu #define	APBONLY_DCTWRITEPROT_ACK_DIS             1U
6530c8a20dSKhristine Andreea Barbulescu 
6630c8a20dSKhristine Andreea Barbulescu /* PHY related */
6730c8a20dSKhristine Andreea Barbulescu #define DDR_PHYA_APBONLY_UCTSHADOWREGS      0x40380404U
6830c8a20dSKhristine Andreea Barbulescu #define UCT_WRITE_PROT_SHADOW_MASK          0x1U
6930c8a20dSKhristine Andreea Barbulescu #define DDR_PHYA_DCTWRITEPROT               0x4038040CU
7030c8a20dSKhristine Andreea Barbulescu #define DDR_PHYA_APBONLY_UCTWRITEONLYSHADOW 0x40380410U
71a4efd428SKhristine Andreea Barbulescu #define OFFSET_DDRC_RFSHCTL3                0x60U
7230c8a20dSKhristine Andreea Barbulescu #define UCT_WRITE_PROT_SHADOW_ACK           0x0U
73a4efd428SKhristine Andreea Barbulescu #define TXDQDLY_COARSE                      6U
74a4efd428SKhristine Andreea Barbulescu #define DDRPHY_PIPE_DFI_MISC                1U
75a4efd428SKhristine Andreea Barbulescu #define ARDPTR_INITVAL_ADDR                 0x40381494U
76a4efd428SKhristine Andreea Barbulescu 
77a4efd428SKhristine Andreea Barbulescu #define CDD_CHA_RR_1_0    0x403B004CU
78a4efd428SKhristine Andreea Barbulescu #define CDD_CHA_RR_0_1    0x403B004DU
79a4efd428SKhristine Andreea Barbulescu #define CDD_CHA_RW_1_1    0x403B0050U
80a4efd428SKhristine Andreea Barbulescu #define CDD_CHA_RW_1_0    0x403B0051U
81a4efd428SKhristine Andreea Barbulescu #define CDD_CHA_RW_0_1    0x403B0054U
82a4efd428SKhristine Andreea Barbulescu #define CDD_CHA_RW_0_0    0x403B0055U
83a4efd428SKhristine Andreea Barbulescu #define CDD_CHA_WR_1_1    0x403B0058U
84a4efd428SKhristine Andreea Barbulescu #define CDD_CHA_WR_1_0    0x403B0059U
85a4efd428SKhristine Andreea Barbulescu #define CDD_CHA_WR_0_1    0x403B005CU
86a4efd428SKhristine Andreea Barbulescu #define CDD_CHA_WR_0_0    0x403B005DU
87a4efd428SKhristine Andreea Barbulescu #define CDD_CHA_WW_1_0    0x403B0060U
88a4efd428SKhristine Andreea Barbulescu #define CDD_CHA_WW_0_1    0x403B0061U
89a4efd428SKhristine Andreea Barbulescu 
90a4efd428SKhristine Andreea Barbulescu #define CDD_CHB_RR_1_0    0x403B00B1U
91a4efd428SKhristine Andreea Barbulescu #define CDD_CHB_RR_0_1    0x403B00B4U
92a4efd428SKhristine Andreea Barbulescu #define CDD_CHB_RW_1_1    0x403B00B5U
93a4efd428SKhristine Andreea Barbulescu #define CDD_CHB_RW_1_0    0x403B00B8U
94a4efd428SKhristine Andreea Barbulescu #define CDD_CHB_RW_0_1    0x403B00B9U
95a4efd428SKhristine Andreea Barbulescu #define CDD_CHB_RW_0_0    0x403B00BCU
96a4efd428SKhristine Andreea Barbulescu #define CDD_CHB_WR_1_1    0x403B00BDU
97a4efd428SKhristine Andreea Barbulescu #define CDD_CHB_WR_1_0    0x403B00C0U
98a4efd428SKhristine Andreea Barbulescu #define CDD_CHB_WR_0_1    0x403B00C1U
99a4efd428SKhristine Andreea Barbulescu #define CDD_CHB_WR_0_0    0x403B00C4U
100a4efd428SKhristine Andreea Barbulescu #define CDD_CHB_WW_1_0    0x403B00C5U
101a4efd428SKhristine Andreea Barbulescu #define CDD_CHB_WW_0_1    0x403B00C8U
102a4efd428SKhristine Andreea Barbulescu 
103a4efd428SKhristine Andreea Barbulescu #define CDD_CHA_RR_1_0_DDR3   0x403B0059U
104a4efd428SKhristine Andreea Barbulescu #define CDD_CHA_RR_0_1_DDR3   0x403B0060U
105a4efd428SKhristine Andreea Barbulescu #define CDD_CHA_RW_1_1_DDR3   0x403B008DU
106a4efd428SKhristine Andreea Barbulescu #define CDD_CHA_RW_1_0_DDR3   0x403B0090U
107a4efd428SKhristine Andreea Barbulescu #define CDD_CHA_RW_0_1_DDR3   0x403B0095U
108a4efd428SKhristine Andreea Barbulescu #define CDD_CHA_RW_0_0_DDR3   0x403B0098U
109a4efd428SKhristine Andreea Barbulescu #define CDD_CHA_WR_1_1_DDR3   0x403B00ADU
110a4efd428SKhristine Andreea Barbulescu #define CDD_CHA_WR_1_0_DDR3   0x403B00B0U
111a4efd428SKhristine Andreea Barbulescu #define CDD_CHA_WR_0_1_DDR3   0x403B00B5U
112a4efd428SKhristine Andreea Barbulescu #define CDD_CHA_WR_0_0_DDR3   0x403B00B8U
113a4efd428SKhristine Andreea Barbulescu #define CDD_CHA_WW_1_0_DDR3   0x403B0071U
114a4efd428SKhristine Andreea Barbulescu #define CDD_CHA_WW_0_1_DDR3   0x403B0078U
115a4efd428SKhristine Andreea Barbulescu 
116a4efd428SKhristine Andreea Barbulescu #define DBYTE0_TXDQSDLYTG0_U0 0x40394B4CU
117a4efd428SKhristine Andreea Barbulescu #define DBYTE0_TXDQSDLYTG0_U1 0x40394B50U
118a4efd428SKhristine Andreea Barbulescu #define DBYTE1_TXDQSDLYTG0_U0 0x40396B4CU
119a4efd428SKhristine Andreea Barbulescu #define DBYTE1_TXDQSDLYTG0_U1 0x40396B50U
120a4efd428SKhristine Andreea Barbulescu #define DBYTE2_TXDQSDLYTG0_U0 0x40398B4CU
121a4efd428SKhristine Andreea Barbulescu #define DBYTE2_TXDQSDLYTG0_U1 0x40398B50U
122a4efd428SKhristine Andreea Barbulescu #define DBYTE3_TXDQSDLYTG0_U0 0x4039AB4CU
123a4efd428SKhristine Andreea Barbulescu #define DBYTE3_TXDQSDLYTG0_U1 0x4039AB50U
124a4efd428SKhristine Andreea Barbulescu 
125a4efd428SKhristine Andreea Barbulescu #define DBYTE0_TXDQSDLYTG1_U0 0x40394B6CU
126a4efd428SKhristine Andreea Barbulescu #define DBYTE0_TXDQSDLYTG1_U1 0x40394B70U
127a4efd428SKhristine Andreea Barbulescu #define DBYTE1_TXDQSDLYTG1_U0 0x40396B6CU
128a4efd428SKhristine Andreea Barbulescu #define DBYTE1_TXDQSDLYTG1_U1 0x40396B70U
129a4efd428SKhristine Andreea Barbulescu #define DBYTE2_TXDQSDLYTG1_U0 0x40398B6CU
130a4efd428SKhristine Andreea Barbulescu #define DBYTE2_TXDQSDLYTG1_U1 0x40398B70U
131a4efd428SKhristine Andreea Barbulescu #define DBYTE3_TXDQSDLYTG1_U0 0x4039AB6CU
132a4efd428SKhristine Andreea Barbulescu #define DBYTE3_TXDQSDLYTG1_U1 0x4039AB70U
133a4efd428SKhristine Andreea Barbulescu 
134a4efd428SKhristine Andreea Barbulescu #define VREF_CA_A0 0x403B0095U
135a4efd428SKhristine Andreea Barbulescu #define VREF_CA_A1 0x403B0098U
136a4efd428SKhristine Andreea Barbulescu #define VREF_CA_B0 0x403B00FCU
137a4efd428SKhristine Andreea Barbulescu #define VREF_CA_B1 0x403B00FDU
138a4efd428SKhristine Andreea Barbulescu 
139a4efd428SKhristine Andreea Barbulescu #define VREF_DQ_A0 0x403B0099U
140a4efd428SKhristine Andreea Barbulescu #define VREF_DQ_A1 0x403B009CU
141a4efd428SKhristine Andreea Barbulescu #define VREF_DQ_B0 0x403B0100U
142a4efd428SKhristine Andreea Barbulescu #define VREF_DQ_B1 0x403B0101U
143a4efd428SKhristine Andreea Barbulescu 
144a4efd428SKhristine Andreea Barbulescu /* DDR Subsystem */
145a4efd428SKhristine Andreea Barbulescu #define DDR_SS_REG                0x403D0000U
14630c8a20dSKhristine Andreea Barbulescu 
14730c8a20dSKhristine Andreea Barbulescu /* Default timeout for DDR PHY operations */
14830c8a20dSKhristine Andreea Barbulescu #define DEFAULT_TIMEOUT_US 1000000U
14930c8a20dSKhristine Andreea Barbulescu 
150*47f0a591SKhristine Andreea Barbulescu /* Start addresses of IMEM and DMEM memory areas */
151*47f0a591SKhristine Andreea Barbulescu #define IMEM_START_ADDR 0x403A0000U
152*47f0a591SKhristine Andreea Barbulescu #define DMEM_START_ADDR 0x403B0000U
153*47f0a591SKhristine Andreea Barbulescu 
154a4efd428SKhristine Andreea Barbulescu struct cdd_type {
155a4efd428SKhristine Andreea Barbulescu 	uint8_t rr;
156a4efd428SKhristine Andreea Barbulescu 	uint8_t rw;
157a4efd428SKhristine Andreea Barbulescu 	uint8_t wr;
158a4efd428SKhristine Andreea Barbulescu 	uint8_t ww;
159a4efd428SKhristine Andreea Barbulescu };
160a4efd428SKhristine Andreea Barbulescu 
161a4efd428SKhristine Andreea Barbulescu struct space_timing_params {
162a4efd428SKhristine Andreea Barbulescu 	struct cdd_type cdd;
163a4efd428SKhristine Andreea Barbulescu 	uint8_t vref_ca;
164a4efd428SKhristine Andreea Barbulescu 	uint8_t vref_dq;
165a4efd428SKhristine Andreea Barbulescu 	uint16_t tphy_wrdata_delay;
166a4efd428SKhristine Andreea Barbulescu };
167a4efd428SKhristine Andreea Barbulescu 
16830c8a20dSKhristine Andreea Barbulescu /* Wait until firmware finishes execution and return training result */
16930c8a20dSKhristine Andreea Barbulescu uint32_t wait_firmware_execution(void);
17030c8a20dSKhristine Andreea Barbulescu 
171a4efd428SKhristine Andreea Barbulescu /* Set default AXI parity. */
172a4efd428SKhristine Andreea Barbulescu uint32_t set_axi_parity(void);
173a4efd428SKhristine Andreea Barbulescu 
174a4efd428SKhristine Andreea Barbulescu /* Modify bitfield value with delta, given bitfield position and mask */
175a4efd428SKhristine Andreea Barbulescu bool update_bf(uint32_t *v, uint8_t pos, uint32_t mask, int32_t delta);
176a4efd428SKhristine Andreea Barbulescu 
177a4efd428SKhristine Andreea Barbulescu /* Read Critical Delay Differences from message block and store max values */
178a4efd428SKhristine Andreea Barbulescu void read_cdds(void);
179a4efd428SKhristine Andreea Barbulescu 
180a4efd428SKhristine Andreea Barbulescu /* Read trained VrefCA from message block and store average value */
181a4efd428SKhristine Andreea Barbulescu void read_vref_ca(void);
182a4efd428SKhristine Andreea Barbulescu 
183a4efd428SKhristine Andreea Barbulescu /* Read trained VrefDQ from message block and store average value */
184a4efd428SKhristine Andreea Barbulescu void read_vref_dq(void);
185a4efd428SKhristine Andreea Barbulescu 
186a4efd428SKhristine Andreea Barbulescu /* Calculate DFITMG1.dfi_t_wrdata_delay */
187a4efd428SKhristine Andreea Barbulescu void compute_tphy_wrdata_delay(void);
188a4efd428SKhristine Andreea Barbulescu 
18930c8a20dSKhristine Andreea Barbulescu #endif /* DDR_UTILS_H */
190