blob: 210a68f6496cedfa17614a22b58bbcbc0e73f60d [file] [log] [blame]
Marek Vasut1f7ba642024-12-12 14:34:30 +01001// SPDX-License-Identifier: GPL-2.0+
2/*
3 * Copyright (C) 2024 Renesas Electronics Corp.
4 */
5
6#include <asm/io.h>
7#include <dm.h>
8#include <errno.h>
9#include <hang.h>
10#include <ram.h>
11#include <linux/iopoll.h>
12#include <linux/sizes.h>
13#include "dbsc5.h"
14
15/* The number of channels V4H has */
16#define DRAM_CH_CNT 4
17/* The number of slices V4H has */
18#define SLICE_CNT 2
19/* The number of chip select V4H has */
20#define CS_CNT 2
21
22/* Number of array elements in Data Slice */
23#define DDR_PHY_SLICE_REGSET_SIZE_V4H 0x100
24/* Number of array elements in Data Slice */
25#define DDR_PHY_SLICE_REGSET_NUM_V4H 153
26/* Number of array elements in Address Slice */
27#define DDR_PHY_ADR_V_REGSET_NUM_V4H 61
28/* Number of array elements in Address Control Slice */
29#define DDR_PHY_ADR_G_REGSET_NUM_V4H 97
30/* Number of array elements in PI Register */
31#define DDR_PI_REGSET_NUM_V4H 1381
32
33/* Minimum value table for JS1 configuration table that can be taken */
34#define JS1_USABLEC_SPEC_LO 5
35/* Maximum value table for JS1 configuration table that can be taken */
36#define JS1_USABLEC_SPEC_HI 11
37/* The number of JS1 setting table */
38#define JS1_FREQ_TBL_NUM 12
39/* Macro to set the value of MR1 */
40#define JS1_MR1(f) (((f) << 4) | 0x00) /* CK mode = 0B */
41/* Macro to set the value of MR2 */
42#define JS1_MR2(f) (((f) << 4) | (f))
43
44#define JS2_tSR 0 /* Element for self refresh */
45#define JS2_tXP 1 /* Exit power-down mode to first valid command */
46#define JS2_tRCD 2 /* Active to read or write delay */
47#define JS2_tRPpb 3 /* Minimum Row Precharge Delay Time */
48#define JS2_tRPab 4 /* Minimum Row Precharge Delay Time */
49#define JS2_tRAS 5 /* ACTIVE-to-PRECHARGE command */
50#define JS2_tWTR_S 6 /* Internal WRITE-to-READ command delay */
51#define JS2_tWTR_L 7 /* Internal WRITE-to-READ command delay */
52#define JS2_tRRD 8 /* Active bank a to active bank b command */
53#define JS2_tPPD 9 /* Precharge Power Down */
54#define JS2_tFAW 10 /* Four bank ACT window */
55#define JS2_tMRR 11 /* Mode Register Read */
56#define JS2_tMRW 12 /* Mode Register Write */
57#define JS2_tMRD 13 /* LOAD MODE REGISTER command cycle time */
58#define JS2_tZQCALns 14 /* ZQ Calibration */
59#define JS2_tZQLAT 15 /* ZQ Latency */
60#define JS2_tODTon_min 16 /* Minimum time on die termination */
61#define JS2_tPDN_DSM 17 /* Recommended minimum time for Deep Sleep Mode duration */
62#define JS2_tXSR_DSM 18 /* Required time to be fully re-powered up from Deep Sleep Mode */
63#define JS2_tXDSM_XP 19 /* Delay from Deep Sleep Mode Exit to Power-Down Exit */
64#define JS2_tWCK2DQI_HF 20 /* Setting value of DQ to WCK input offset */
65#define JS2_tWCK2DQO_HF 21 /* Setting value of WCK to DQ output offset */
66#define JS2_tWCK2DQI_LF 22 /* Setting value of DQ to WCK input offset */
67#define JS2_tWCK2DQO_LF 23 /* Setting value of WCK to DQ output offset */
68#define JS2_tOSCODQI 24 /* Delay time from Stop WCK2DQI Interval Oscillator command to Mode Register Readout */
69#define JS2_tDQ72DQns 25 /* Reception time to change the value fof REF(CA) for Command Bus Training Mode2 */
70#define JS2_tCAENTns 26 /* Reception time to change the value fof REF(CA) for Command Bus Training Mode1 */
71#define JS2_tCSCAL 27 /* Minimum CA Low Duration time */
72#define JS2_TBLCNT 28 /* The number of table */
73
74#define JS2_tRCpb JS2_TBLCNT /* ACTIVATE-to-ACTIVATE command period with per bank precharge */
75#define JS2_tRCab (JS2_TBLCNT + 1) /* ACTIVATE-to-ACTIVATE command period with all bank precharge */
76#define JS2_tRFCab (JS2_TBLCNT + 2) /* Refresh Cycle Time with All Banks */
77#define JS2_tRBTP (JS2_TBLCNT + 3) /* READ Burst end to PRECHARGE command delay */
78#define JS2_tXSR (JS2_TBLCNT + 4) /* Exit Self Refresh to Valid commands */
79#define JS2_tPDN (JS2_TBLCNT + 5)
80#define JS2_tWLWCKOFF (JS2_TBLCNT + 6)
81#define JS2_CNT (JS2_TBLCNT + 7)
82
83struct jedec_spec1 {
84 u32 fx3; /* Frequency */
85 u8 RLset1; /* setting value of Read Latency */
86 u8 RLset2; /* setting value of Read Latency */
87 u8 WLsetA; /* setting value of Write Latency */
88 u8 WLsetB; /* setting value of Write Latency */
89 u32 nWR; /* Write-Recovery for Auto-Precharge commands */
90 u32 nRBTP; /* the minimum interval from a READ command to a PRE command */
91 u32 ODTLon; /* On Die Termination */
92 u8 MR1; /* Mode Register 1 */
93 u8 MR2; /* Mode Register 2 */
94 u32 WCKENLR; /* The setting time from CAS command to the Start-up of WCK in READ operation */
95 u32 WCKENLW; /* The setting time from CAS command to the Start-up of WCK in WRITE operation */
96 u32 WCKENLF; /* The setting time from CAS command to the Start-up of WCK in FAST-sync operation */
97 u32 WCKPRESTA; /* The setting time from the Start-up of WCK to WCK Clocling Start */
98 u32 WCKPRETGLR; /* The setting time from WCK Clocling Start to Reflecting frequency of WCK */
99};
100
101static const struct jedec_spec1 js1[JS1_FREQ_TBL_NUM] = {
102 /* fx3, RL1, RL2, WLA.WLB.nWR.nRBTP, ODTLon */
103 { 800, 3, 3, 2, 2, 3, 0, 1, JS1_MR1(0), JS1_MR2(0), 0, 0, 0, 1, 3 }, /* 533.333Mbps*/
104 { 1600, 4, 4, 2, 3, 5, 0, 1, JS1_MR1(1), JS1_MR2(1), 0, 0, 0, 1, 4 }, /* 1066.666Mbps*/
105 { 2400, 5, 6, 3, 4, 7, 0, 2, JS1_MR1(2), JS1_MR2(2), 1, 1, 1, 1, 4 }, /* 1600.000Mbps*/
106 { 3200, 7, 7, 4, 5, 10, 0, 2, JS1_MR1(3), JS1_MR2(3), 2, 1, 1, 2, 4 }, /* 2133.333Mbps*/
107 { 4000, 8, 9, 4, 7, 12, 1, 2, JS1_MR1(4), JS1_MR2(4), 2, 1, 1, 2, 5 }, /* 2666.666Mbps*/
108 { 4800, 10, 10, 5, 8, 14, 1, 3, JS1_MR1(5), JS1_MR2(5), 4, 2, 1, 2, 5 }, /* 3200.000Mbps*/
109 { 5600, 11, 12, 6, 9, 16, 2, 4, JS1_MR1(6), JS1_MR2(6), 4, 2, 1, 3, 5 }, /* 3733.333Mbps*/
110 { 6400, 13, 14, 6, 11, 19, 2, 3, JS1_MR1(7), JS1_MR2(7), 5, 2, 1, 3, 6 }, /* 4266.666Mbps*/
111 { 7200, 14, 15, 7, 12, 21, 3, 4, JS1_MR1(8), JS1_MR2(8), 6, 3, 2, 3, 6 }, /* 4800.000Mbps*/
112 { 8250, 16, 17, 8, 14, 24, 4, 5, JS1_MR1(9), JS1_MR2(9), 7, 3, 2, 4, 6 }, /* 5500.000Mbps*/
113 { 9000, 17, 19, 9, 15, 26, 4, 6, JS1_MR1(10), JS1_MR2(10), 7, 4, 2, 4, 7 }, /* 6000.000Mbps*/
114 { 9600, 18, 20, 9, 16, 28, 4, 6, JS1_MR1(11), JS1_MR2(11), 8, 4, 2, 4, 7 } /* 6400.000Mbps*/
115};
116
117struct jedec_spec2 {
118 u16 ps; /* Value in pico seconds */
119 u16 cyc; /* Value in cycle count */
120};
121
122static const struct jedec_spec2 jedec_spec2[2][JS2_TBLCNT] = {
123 {
124 { 15000, 2 }, /* tSR */
125 { 7000, 3 }, /* tXP */
126 { 18000, 2 }, /* tRCD */
127 { 18000, 2 }, /* tRPpb */
128 { 21000, 2 }, /* tRPab */
129 { 42000, 3 }, /* tRAS */
130 { 6250, 4 }, /* tWTR_S */
131 { 12000, 4 }, /* tWTR_L */
132 { 5000, 2 }, /* tRRD */
133 { 0, 2 }, /* tPPD */
134 { 20000, 0 }, /* tFAW */
135 { 0, 4 }, /* tMRR */
136 { 10000, 5 }, /* tMRW */
137 { 14000, 5 }, /* tMRD */
138 { 1500, 0 }, /* tZQCALns */
139 { 30000, 4 }, /* tZQLAT */
140 { 1500, 0 }, /* tODTon_min */
141 { 4000, 0 }, /* tPDN_DSMus */
142 { 200, 0 }, /* tXSR_DSMus */
143 { 190, 0 }, /* tXDSM_XPus */
144 { 700, 0 }, /* tWCK2DQI_HF */
145 { 1600, 0 }, /* tWCK2DQO_HF */
146 { 900, 0 }, /* tWCK2DQI_LF */
147 { 1900, 0 }, /* tWCK2DQO_LF */
148 { 40000, 8 }, /* tOSCODQI */
149 { 125, 0 }, /* tDQ72DQns */
150 { 250, 0 }, /* tCAENTns */
151 { 1750, 0 } /* tCSCAL */
152 }, {
153 { 15000, 2 }, /* tSR */
154 { 7000, 3 }, /* tXP */
155 { 19875, 2 }, /* tRCD */
156 { 19875, 2 }, /* tRPpb */
157 { 22875, 2 }, /* tRPab */
158 { 43875, 3 }, /* tRAS */
159 { 6250, 4 }, /* tWTR_S */
160 { 12000, 4 }, /* tWTR_L */
161 { 5000, 2 }, /* tRRD */
162 { 0, 2 }, /* tPPD */
163 { 20000, 0 }, /* tFAW */
164 { 0, 4 }, /* tMRR */
165 { 10000, 5 }, /* tMRW */
166 { 14000, 5 }, /* tMRD */
167 { 1500, 0 }, /* tZQCALns */
168 { 30000, 4 }, /* tZQLAT */
169 { 1500, 0 }, /* tODTon_min */
170 { 4000, 0 }, /* tPDN_DSMus */
171 { 200, 0 }, /* tXSR_DSMus */
172 { 190, 0 }, /* tXDSM_XPus */
173 { 715, 0 }, /* tWCK2DQI_HF */
174 { 1635, 0 }, /* tWCK2DQO_HF */
175 { 920, 0 }, /* tWCK2DQI_LF */
176 { 1940, 0 }, /* tWCK2DQO_LF */
177 { 40000, 8 }, /* tOSCODQI */
178 { 125, 0 }, /* tDQ72DQns */
179 { 250, 0 }, /* tCAENTns */
180 { 1750, 0 } /* tCSCAL */
181 }
182};
183
184static const u16 jedec_spec2_tRFC_ab[] = {
185 /* 2Gb, 3Gb, 4Gb, 6Gb, 8Gb, 12Gb, 16Gb, 24Gb, 32Gb */
186 130, 180, 180, 210, 210, 280, 280, 380, 380
187};
188
189/* The address offsets of PI Register */
190#define DDR_PI_REGSET_OFS_V4H 0x0800
191/* The address offsets of Data Slice */
192#define DDR_PHY_SLICE_REGSET_OFS_V4H 0x1000
193/* The address offsets of Address Slice */
194#define DDR_PHY_ADR_V_REGSET_OFS_V4H 0x1200
195/* The address offsets of Address Control Slice */
196#define DDR_PHY_ADR_G_REGSET_OFS_V4H 0x1300
197
198#define DDR_REGDEF_ADR(regdef) ((regdef) & 0xFFFF)
199#define DDR_REGDEF_LEN(regdef) (((regdef) >> 16) & 0xFF)
200#define DDR_REGDEF_LSB(regdef) (((regdef) >> 24) & 0xFF)
201
202#define DDR_REGDEF(lsb, len, adr) \
203 (((lsb) << 24) | ((len) << 16) | (adr))
204
205#define PHY_LP4_BOOT_RX_PCLK_CLK_SEL DDR_REGDEF(0x10, 0x03, 0x1000)
206#define PHY_PER_CS_TRAINING_MULTICAST_EN DDR_REGDEF(0x10, 0x01, 0x1006)
207#define PHY_PER_CS_TRAINING_INDEX DDR_REGDEF(0x18, 0x01, 0x1006)
208#define PHY_VREF_INITIAL_STEPSIZE DDR_REGDEF(0x18, 0x08, 0x100D)
209#define PHY_RDLVL_BEST_THRSHLD DDR_REGDEF(0x00, 0x04, 0x100E)
210#define PHY_RDLVL_VREF_OUTLIER DDR_REGDEF(0x10, 0x03, 0x100E)
211#define SC_PHY_WCK_CALC DDR_REGDEF(0x18, 0x01, 0x101A)
212#define PHY_RDLVL_RDDQS_DQ_OBS_SELECT DDR_REGDEF(0x10, 0x05, 0x102C)
213#define PHY_CALVL_VREF_DRIVING_SLICE DDR_REGDEF(0x18, 0x01, 0x1030)
214#define PHY_WRLVL_HARD0_DELAY_OBS DDR_REGDEF(0x00, 0x0A, 0x1038)
215#define PHY_WRLVL_HARD1_DELAY_OBS DDR_REGDEF(0x10, 0x0A, 0x1038)
216#define PHY_WRLVL_STATUS_OBS DDR_REGDEF(0x00, 0x1C, 0x1039)
217#define PHY_WRLVL_ERROR_OBS DDR_REGDEF(0x00, 0x10, 0x103B)
218#define PHY_GTLVL_STATUS_OBS DDR_REGDEF(0x00, 0x12, 0x103D)
219#define PHY_RDLVL_RDDQS_DQ_LE_DLY_OBS DDR_REGDEF(0x10, 0x09, 0x103E)
220#define PHY_RDLVL_RDDQS_DQ_TE_DLY_OBS DDR_REGDEF(0x00, 0x09, 0x103F)
221#define PHY_WDQLVL_STATUS_OBS DDR_REGDEF(0x00, 0x20, 0x1043)
222#define PHY_DATA_DC_CAL_START DDR_REGDEF(0x18, 0x01, 0x104D)
223#define PHY_REGULATOR_EN_CNT DDR_REGDEF(0x18, 0x06, 0x1050)
224#define PHY_VREF_INITIAL_START_POINT DDR_REGDEF(0x00, 0x09, 0x1055)
225#define PHY_VREF_INITIAL_STOP_POINT DDR_REGDEF(0x10, 0x09, 0x1055)
226#define PHY_VREF_TRAINING_CTRL DDR_REGDEF(0x00, 0x02, 0x1056)
227#define PHY_RDDQ0_SLAVE_DELAY DDR_REGDEF(0x00, 0x09, 0x105D)
228#define PHY_RDDQ1_SLAVE_DELAY DDR_REGDEF(0x10, 0x09, 0x105D)
229#define PHY_RDDQ2_SLAVE_DELAY DDR_REGDEF(0x00, 0x09, 0x105E)
230#define PHY_RDDQ3_SLAVE_DELAY DDR_REGDEF(0x10, 0x09, 0x105E)
231#define PHY_RDDQ4_SLAVE_DELAY DDR_REGDEF(0x00, 0x09, 0x105F)
232#define PHY_RDDQ5_SLAVE_DELAY DDR_REGDEF(0x10, 0x09, 0x105F)
233#define PHY_RDDQ6_SLAVE_DELAY DDR_REGDEF(0x00, 0x09, 0x1060)
234#define PHY_RDDQ7_SLAVE_DELAY DDR_REGDEF(0x10, 0x09, 0x1060)
235#define PHY_RDDM_SLAVE_DELAY DDR_REGDEF(0x00, 0x09, 0x1061)
236#define PHY_RX_CAL_ALL_DLY DDR_REGDEF(0x18, 0x06, 0x1061)
237#define PHY_RX_PCLK_CLK_SEL DDR_REGDEF(0x00, 0x03, 0x1062)
238#define PHY_DATA_DC_CAL_CLK_SEL DDR_REGDEF(0x18, 0x03, 0x1063)
239#define PHY_PAD_VREF_CTRL_DQ DDR_REGDEF(0x00, 0x0E, 0x1067)
240#define PHY_PER_CS_TRAINING_EN DDR_REGDEF(0x00, 0x01, 0x1068)
241#define PHY_RDDATA_EN_TSEL_DLY DDR_REGDEF(0x18, 0x05, 0x1069)
242#define PHY_RDDATA_EN_OE_DLY DDR_REGDEF(0x00, 0x05, 0x106A)
243#define PHY_RPTR_UPDATE DDR_REGDEF(0x10, 0x04, 0x106C)
244#define PHY_WRLVL_RESP_WAIT_CNT DDR_REGDEF(0x08, 0x06, 0x106D)
245#define PHY_RDLVL_DLY_STEP DDR_REGDEF(0x08, 0x04, 0x1070)
246#define PHY_RDLVL_MAX_EDGE DDR_REGDEF(0x00, 0x09, 0x1071)
247#define PHY_DATA_DC_WDQLVL_ENABLE DDR_REGDEF(0x08, 0x02, 0x1075)
248#define PHY_RDDATA_EN_DLY DDR_REGDEF(0x10, 0x05, 0x1076)
249#define PHY_MEAS_DLY_STEP_ENABLE DDR_REGDEF(0x08, 0x06, 0x1076)
250#define PHY_DQ_DM_SWIZZLE0 DDR_REGDEF(0x00, 0x20, 0x1077)
251#define PHY_DQ_DM_SWIZZLE1 DDR_REGDEF(0x00, 0x04, 0x1078)
252#define PHY_CLK_WRDQS_SLAVE_DELAY DDR_REGDEF(0x00, 0x09, 0x107E)
253#define PHY_WRITE_PATH_LAT_DEC DDR_REGDEF(0x10, 0x01, 0x107E)
254#define PHY_RDDQS_GATE_SLAVE_DELAY DDR_REGDEF(0x00, 0x09, 0x1088)
255#define PHY_RDDQS_LATENCY_ADJUST DDR_REGDEF(0x10, 0x05, 0x1088)
256#define PHY_WRITE_PATH_LAT_ADD DDR_REGDEF(0x18, 0x03, 0x1088)
257#define PHY_WRITE_PATH_LAT_FRAC DDR_REGDEF(0x00, 0x08, 0x1089)
258#define PHY_GTLVL_LAT_ADJ_START DDR_REGDEF(0x00, 0x05, 0x108A)
259#define PHY_DATA_DC_DQS_CLK_ADJUST DDR_REGDEF(0x00, 0x08, 0x108C)
260#define PHY_ADR_CALVL_SWIZZLE0 DDR_REGDEF(0x00, 0x20, 0x1202)
261#define PHY_ADR_MEAS_DLY_STEP_ENABLE DDR_REGDEF(0x10, 0x01, 0x1203)
262#define PHY_ADR_CALVL_RANK_CTRL DDR_REGDEF(0x18, 0x02, 0x1205)
263#define PHY_ADR_CALVL_OBS1 DDR_REGDEF(0x00, 0x20, 0x120A)
264#define PHY_ADR_CALVL_OBS2 DDR_REGDEF(0x00, 0x20, 0x120B)
265#define PHY_ADR_CALVL_DLY_STEP DDR_REGDEF(0x00, 0x04, 0x1210)
266#define PHY_CS_ACS_ALLOCATION_BIT2_2 DDR_REGDEF(0x08, 0x02, 0x1215)
267#define PHY_CS_ACS_ALLOCATION_BIT3_2 DDR_REGDEF(0x10, 0x02, 0x1215)
268#define PHY_CSLVL_OBS1 DDR_REGDEF(0x00, 0x20, 0x1221)
269#define PHY_CLK_DC_CAL_CLK_SEL DDR_REGDEF(0x08, 0x03, 0x123A)
270#define PHY_FREQ_SEL_MULTICAST_EN DDR_REGDEF(0x08, 0x01, 0x1301)
271#define PHY_FREQ_SEL_INDEX DDR_REGDEF(0x10, 0x02, 0x1301)
272#define SC_PHY_MANUAL_UPDATE DDR_REGDEF(0x18, 0x01, 0x1304)
273#define PHY_SET_DFI_INPUT_RST_PAD DDR_REGDEF(0x18, 0x01, 0x1311)
274#define PHY_CAL_MODE_0 DDR_REGDEF(0x00, 0x0D, 0x132C)
275#define PHY_CAL_INTERVAL_COUNT_0 DDR_REGDEF(0x00, 0x20, 0x132D)
276#define PHY_DATA_BYTE_ORDER_SEL DDR_REGDEF(0x00, 0x20, 0x133E)
277#define PHY_PAD_ACS_RX_PCLK_CLK_SEL DDR_REGDEF(0x10, 0x03, 0x1348)
278#define PHY_PLL_CTRL DDR_REGDEF(0x00, 0x0E, 0x134B)
279#define PHY_PLL_CTRL_8X DDR_REGDEF(0x10, 0x0E, 0x134B)
280#define PHY_CAL_CLK_SELECT_0 DDR_REGDEF(0x00, 0x03, 0x1360)
281
282#define PI_START DDR_REGDEF(0x00, 0x01, 0x0800)
283#define PI_TRAIN_ALL_FREQ_REQ DDR_REGDEF(0x18, 0x01, 0x0802)
284#define PI_CS_MAP DDR_REGDEF(0x08, 0x02, 0x0813)
285#define PI_WRLVL_REQ DDR_REGDEF(0x10, 0x01, 0x081C)
286#define PI_WRLVL_CS_SW DDR_REGDEF(0x18, 0x02, 0x081C)
287#define PI_RDLVL_REQ DDR_REGDEF(0x18, 0x01, 0x0824)
288#define PI_RDLVL_GATE_REQ DDR_REGDEF(0x00, 0x01, 0x0825)
289#define PI_RDLVL_CS_SW DDR_REGDEF(0x08, 0x02, 0x0825)
290#define PI_RDLVL_PERIODIC DDR_REGDEF(0x08, 0x01, 0x082E)
291#define PI_RDLVL_INTERVAL DDR_REGDEF(0x08, 0x10, 0x0835)
292#define PI_DRAMDCA_FLIP_MASK DDR_REGDEF(0x08, 0x02, 0x083B)
293#define PI_DRAMDCA_LVL_REQ DDR_REGDEF(0x10, 0x01, 0x083D)
294#define PI_DCMLVL_CS_SW DDR_REGDEF(0x18, 0x02, 0x083D)
295#define PI_WRDCM_LVL_EN_F1 DDR_REGDEF(0x00, 0x02, 0x083F)
296#define PI_DRAMDCA_LVL_EN_F1 DDR_REGDEF(0x08, 0x02, 0x083F)
297#define PI_WRDCM_LVL_EN_F2 DDR_REGDEF(0x18, 0x02, 0x083F)
298#define PI_DRAMDCA_LVL_EN_F2 DDR_REGDEF(0x00, 0x02, 0x0840)
299#define PI_DRAMDCA_LVL_ACTIVE_SEQ_2 DDR_REGDEF(0x00, 0x1B, 0x0868)
300#define PI_DRAMDCA_LVL_ACTIVE_SEQ_3 DDR_REGDEF(0x00, 0x1B, 0x0869)
301#define PI_DRAMDCA_LVL_ACTIVE_SEQ_4 DDR_REGDEF(0x00, 0x1B, 0x086A)
302#define PI_TCKCKEL_F2 DDR_REGDEF(0x18, 0x04, 0x089D)
303#define PI_WDQLVL_VREF_EN DDR_REGDEF(0x08, 0x04, 0x089E)
304#define PI_WDQLVL_PERIODIC DDR_REGDEF(0x00, 0x01, 0x08A0)
305#define PI_WDQLVL_INTERVAL DDR_REGDEF(0x00, 0x10, 0x08A4)
306#define PI_INT_STATUS DDR_REGDEF(0x00, 0x20, 0x0900)
307#define PI_INT_ACK_0 DDR_REGDEF(0x00, 0x20, 0x0902)
308#define PI_INT_ACK_1 DDR_REGDEF(0x00, 0x03, 0x0903)
309#define PI_LONG_COUNT_MASK DDR_REGDEF(0x10, 0x05, 0x090F)
310#define PI_ADDR_MUX_0 DDR_REGDEF(0x00, 0x03, 0x0910)
311#define PI_ADDR_MUX_1 DDR_REGDEF(0x08, 0x03, 0x0910)
312#define PI_ADDR_MUX_2 DDR_REGDEF(0x10, 0x03, 0x0910)
313#define PI_ADDR_MUX_3 DDR_REGDEF(0x18, 0x03, 0x0910)
314#define PI_ADDR_MUX_4 DDR_REGDEF(0x00, 0x03, 0x0911)
315#define PI_ADDR_MUX_5 DDR_REGDEF(0x08, 0x03, 0x0911)
316#define PI_ADDR_MUX_6 DDR_REGDEF(0x10, 0x03, 0x0911)
317#define PI_DATA_BYTE_SWAP_EN DDR_REGDEF(0x18, 0x01, 0x0911)
318#define PI_DATA_BYTE_SWAP_SLICE0 DDR_REGDEF(0x00, 0x01, 0x0912)
319#define PI_DATA_BYTE_SWAP_SLICE1 DDR_REGDEF(0x08, 0x01, 0x0912)
320#define PI_PWRUP_SREFRESH_EXIT DDR_REGDEF(0x18, 0x01, 0x093D)
321#define PI_PWRUP_SREFRESH_EXIT DDR_REGDEF(0x18, 0x01, 0x093D)
322#define PI_DLL_RST DDR_REGDEF(0x00, 0x01, 0x0941)
323#define PI_TDELAY_RDWR_2_BUS_IDLE_F2 DDR_REGDEF(0x00, 0x08, 0x0964)
324#define PI_WRLAT_F2 DDR_REGDEF(0x10, 0x07, 0x096A)
325#define PI_TWCKENL_WR_ADJ_F2 DDR_REGDEF(0x18, 0x06, 0x096A)
326#define PI_TWCKENL_RD_ADJ_F2 DDR_REGDEF(0x00, 0x06, 0x096B)
327#define PI_TWCKPRE_STATIC_F2 DDR_REGDEF(0x08, 0x06, 0x096B)
328#define PI_TWCKPRE_TOGGLE_RD_F2 DDR_REGDEF(0x18, 0x06, 0x096B)
329#define PI_TWCKENL_FS_ADJ_F2 DDR_REGDEF(0x00, 0x06, 0x096C)
330#define PI_CASLAT_F2 DDR_REGDEF(0x08, 0x07, 0x096C)
331#define PI_TRFC_F2 DDR_REGDEF(0x00, 0x0A, 0x0971)
332#define PI_TREF_F2 DDR_REGDEF(0x00, 0x14, 0x0972)
333#define PI_TDFI_WRLVL_WW_F0 DDR_REGDEF(0x00, 0x0A, 0x0974)
334#define PI_TDFI_WRLVL_WW_F1 DDR_REGDEF(0x00, 0x0A, 0x0975)
335#define PI_WRLVL_EN_F2 DDR_REGDEF(0x18, 0x02, 0x0975)
336#define PI_TDFI_WRLVL_WW_F2 DDR_REGDEF(0x00, 0x0A, 0x0976)
337#define PI_WRLVL_WCKOFF_F2 DDR_REGDEF(0x10, 0x08, 0x0976)
338#define PI_RDLVL_EN_F2 DDR_REGDEF(0x18, 0x02, 0x097A)
339#define PI_RDLVL_GATE_EN_F2 DDR_REGDEF(0x00, 0x02, 0x097B)
340#define PI_RDLVL_VREF_EN_F0 DDR_REGDEF(0x10, 0x04, 0x097B)
341#define PI_RDLVL_VREF_EN_F1 DDR_REGDEF(0x00, 0x04, 0x097D)
342#define PI_RDLVL_VREF_EN_F2 DDR_REGDEF(0x10, 0x04, 0x097E)
343#define PI_RDLAT_ADJ_F2 DDR_REGDEF(0x00, 0x09, 0x0981)
344#define PI_WRLAT_ADJ_F2 DDR_REGDEF(0x00, 0x07, 0x0982)
345#define PI_TDFI_CALVL_CC_F2 DDR_REGDEF(0x00, 0x0A, 0x0985)
346#define PI_TDFI_CALVL_CAPTURE_F2 DDR_REGDEF(0x10, 0x0A, 0x0985)
347#define PI_CALVL_EN_F2 DDR_REGDEF(0x10, 0x02, 0x0986)
348#define PI_TCAENT_F2 DDR_REGDEF(0x00, 0x0E, 0x0989)
349#define PI_TVREF_SHORT_F2 DDR_REGDEF(0x00, 0x0A, 0x098F)
350#define PI_TVREF_LONG_F2 DDR_REGDEF(0x10, 0x0A, 0x098F)
351#define PI_TVRCG_ENABLE_F2 DDR_REGDEF(0x00, 0x0A, 0x0990)
352#define PI_TVRCG_DISABLE_F2 DDR_REGDEF(0x10, 0x0A, 0x0990)
353#define PI_CALVL_VREF_INITIAL_START_POINT_F0 DDR_REGDEF(0x00, 0x07, 0x0991)
354#define PI_CALVL_VREF_INITIAL_STOP_POINT_F0 DDR_REGDEF(0x08, 0x07, 0x0991)
355#define PI_CALVL_VREF_INITIAL_START_POINT_F1 DDR_REGDEF(0x18, 0x07, 0x0991)
356#define PI_CALVL_VREF_INITIAL_STOP_POINT_F1 DDR_REGDEF(0x00, 0x07, 0x0992)
357#define PI_CALVL_VREF_INITIAL_START_POINT_F2 DDR_REGDEF(0x10, 0x07, 0x0992)
358#define PI_CALVL_VREF_INITIAL_STOP_POINT_F2 DDR_REGDEF(0x18, 0x07, 0x0992)
359#define PI_TDFI_CALVL_STROBE_F2 DDR_REGDEF(0x08, 0x04, 0x0995)
360#define PI_TXP_F2 DDR_REGDEF(0x10, 0x05, 0x0995)
361#define PI_TMRWCKEL_F2 DDR_REGDEF(0x18, 0x08, 0x0995)
362#define PI_TCKEHDQS_F2 DDR_REGDEF(0x10, 0x06, 0x099D)
363#define PI_TFC_F2 DDR_REGDEF(0x00, 0x0A, 0x099E)
364#define PI_WDQLVL_VREF_INITIAL_START_POINT_F0 DDR_REGDEF(0x10, 0x07, 0x09A0)
365#define PI_WDQLVL_VREF_INITIAL_STOP_POINT_F0 DDR_REGDEF(0x18, 0x07, 0x09A0)
366#define PI_WDQLVL_VREF_INITIAL_START_POINT_F1 DDR_REGDEF(0x00, 0x07, 0x09A4)
367#define PI_WDQLVL_VREF_INITIAL_STOP_POINT_F1 DDR_REGDEF(0x08, 0x07, 0x09A4)
368#define PI_TDFI_WDQLVL_WR_F2 DDR_REGDEF(0x00, 0x0A, 0x09A6)
369#define PI_TDFI_WDQLVL_RW_F2 DDR_REGDEF(0x10, 0x0A, 0x09A6)
370#define PI_WDQLVL_VREF_INITIAL_START_POINT_F2 DDR_REGDEF(0x00, 0x07, 0x09A7)
371#define PI_WDQLVL_VREF_INITIAL_STOP_POINT_F2 DDR_REGDEF(0x08, 0x07, 0x09A7)
372#define PI_WDQLVL_EN_F2 DDR_REGDEF(0x18, 0x02, 0x09A7)
373#define PI_MBIST_RDLAT_ADJ_F2 DDR_REGDEF(0x08, 0x09, 0x09A8)
374#define PI_MBIST_TWCKENL_RD_ADJ_F2 DDR_REGDEF(0x18, 0x06, 0x09A8)
375#define PI_TRTP_F2 DDR_REGDEF(0x18, 0x08, 0x09B3)
376#define PI_TRP_F2 DDR_REGDEF(0x00, 0x08, 0x09B4)
377#define PI_TRCD_F2 DDR_REGDEF(0x08, 0x08, 0x09B4)
378#define PI_TWTR_S_F2 DDR_REGDEF(0x18, 0x06, 0x09B4)
379#define PI_TWTR_L_F2 DDR_REGDEF(0x00, 0x06, 0x09B5)
380#define PI_TWTR_F2 DDR_REGDEF(0x10, 0x06, 0x09B5)
381#define PI_TWR_F2 DDR_REGDEF(0x18, 0x08, 0x09B5)
382#define PI_TRAS_MIN_F2 DDR_REGDEF(0x10, 0x09, 0x09B6)
383#define PI_TDQSCK_MAX_F2 DDR_REGDEF(0x00, 0x04, 0x09B7)
384#define PI_TSR_F2 DDR_REGDEF(0x10, 0x08, 0x09B7)
385#define PI_TMRD_F2 DDR_REGDEF(0x18, 0x08, 0x09B7)
386#define PI_TDFI_CTRLUPD_MAX_F2 DDR_REGDEF(0x00, 0x15, 0x09BC)
387#define PI_TDFI_CTRLUPD_INTERVAL_F2 DDR_REGDEF(0x00, 0x20, 0x09BD)
388#define PI_TINIT_F2 DDR_REGDEF(0x00, 0x18, 0x09CC)
389#define PI_TINIT1_F2 DDR_REGDEF(0x00, 0x18, 0x09CD)
390#define PI_TINIT3_F2 DDR_REGDEF(0x00, 0x18, 0x09CE)
391#define PI_TINIT4_F2 DDR_REGDEF(0x00, 0x18, 0x09CF)
392#define PI_TINIT5_F2 DDR_REGDEF(0x00, 0x18, 0x09D0)
393#define PI_TXSNR_F2 DDR_REGDEF(0x00, 0x10, 0x09D1)
394#define PI_TZQCAL_F2 DDR_REGDEF(0x10, 0x0C, 0x09D6)
395#define PI_TZQLAT_F2 DDR_REGDEF(0x00, 0x07, 0x09D7)
396#define PI_ZQRESET_F2 DDR_REGDEF(0x10, 0x0C, 0x09D8)
397#define PI_TDQ72DQ_F2 DDR_REGDEF(0x10, 0x0A, 0x09DD)
398#define PI_TCBTRTW_F2 DDR_REGDEF(0x00, 0x06, 0x09DE)
399#define PI_MC_TRFC_F2 DDR_REGDEF(0x00, 0x0A, 0x09E1)
400#define PI_CKE_MUX_0 DDR_REGDEF(0x00, 0x03, 0x09E6)
401#define PI_CKE_MUX_1 DDR_REGDEF(0x08, 0x03, 0x09E6)
402#define PI_SEQ_DEC_SW_CS DDR_REGDEF(0x00, 0x02, 0x0A4E)
403#define PI_SW_SEQ_START DDR_REGDEF(0x10, 0x01, 0x0A4E)
404#define PI_SW_SEQ_0 DDR_REGDEF(0x00, 0x1B, 0x0BF1)
405#define PI_SW_SEQ_1 DDR_REGDEF(0x00, 0x1B, 0x0BF2)
406#define PI_DFS_ENTRY_SEQ_0 DDR_REGDEF(0x00, 0x1D, 0x0BFB)
407#define PI_DFS_INITIALIZATION_SEQ_1 DDR_REGDEF(0x00, 0x1D, 0x0C24)
408#define PI_DFS_INITIALIZATION_SEQ_9 DDR_REGDEF(0x00, 0x1D, 0x0C2C)
409#define PI_DFS_INITIALIZATION_SEQ_10 DDR_REGDEF(0x00, 0x1D, 0x0C2D)
410#define PI_RDLVL_TRAIN_SEQ_1 DDR_REGDEF(0x00, 0x1B, 0x0C42)
411#define PI_RDLVL_TRAIN_SEQ_2 DDR_REGDEF(0x00, 0x1B, 0x0C43)
412#define PI_RDLVL_TRAIN_SEQ_3 DDR_REGDEF(0x00, 0x1B, 0x0C44)
413#define PI_RDLVL_TRAIN_SEQ_4 DDR_REGDEF(0x00, 0x1B, 0x0C45)
414#define PI_RDLVL_TRAIN_SEQ_5 DDR_REGDEF(0x00, 0x1B, 0x0C46)
415#define PI_SEQ_WAIT_16_F2 DDR_REGDEF(0x00, 0x18, 0x0C77)
416#define PI_SEQ_WAIT_17_F2 DDR_REGDEF(0x00, 0x18, 0x0C7A)
417#define PI_SEQ_WAIT_18_F2 DDR_REGDEF(0x00, 0x18, 0x0C7D)
418#define PI_SEQ_WAIT_19_F2 DDR_REGDEF(0x00, 0x18, 0x0C80)
419#define PI_SEQ_WAIT_20_F2 DDR_REGDEF(0x00, 0x18, 0x0C83)
420#define PI_SEQ_WAIT_21_F2 DDR_REGDEF(0x00, 0x18, 0x0C86)
421#define PI_SEQ_WAIT_22_F2 DDR_REGDEF(0x00, 0x18, 0x0C89)
422#define PI_SEQ_WAIT_23_F2 DDR_REGDEF(0x00, 0x18, 0x0C8C)
423#define PI_SEQ_WAIT_24_F2 DDR_REGDEF(0x00, 0x18, 0x0C8F)
424#define PI_SEQ_WAIT_25_F2 DDR_REGDEF(0x00, 0x18, 0x0C92)
425#define PI_SEQ_WAIT_26_F2 DDR_REGDEF(0x00, 0x18, 0x0C95)
426#define PI_SEQ_WAIT_30_F2 DDR_REGDEF(0x00, 0x18, 0x0CA1)
427#define PI_DARRAY3_0_CS0_F0 DDR_REGDEF(0x00, 0x08, 0x0D0B)
428#define PI_DARRAY3_1_CS0_F0 DDR_REGDEF(0x08, 0x08, 0x0D0B)
429#define PI_DARRAY3_0_CS0_F1 DDR_REGDEF(0x00, 0x08, 0x0D15)
430#define PI_DARRAY3_1_CS0_F1 DDR_REGDEF(0x08, 0x08, 0x0D15)
431#define PI_DARRAY3_0_CS0_F2 DDR_REGDEF(0x00, 0x08, 0x0D1F)
432#define PI_DARRAY3_1_CS0_F2 DDR_REGDEF(0x08, 0x08, 0x0D1F)
433#define PI_DARRAY3_4_CS0_F2 DDR_REGDEF(0x00, 0x08, 0x0D20)
434#define PI_DARRAY3_20_CS0_F2 DDR_REGDEF(0x00, 0x08, 0x0D24)
435#define PI_DARRAY3_0_CS1_F0 DDR_REGDEF(0x00, 0x08, 0x0D29)
436#define PI_DARRAY3_1_CS1_F0 DDR_REGDEF(0x08, 0x08, 0x0D29)
437#define PI_DARRAY3_0_CS1_F1 DDR_REGDEF(0x00, 0x08, 0x0D33)
438#define PI_DARRAY3_1_CS1_F1 DDR_REGDEF(0x08, 0x08, 0x0D33)
439#define PI_DARRAY3_0_CS1_F2 DDR_REGDEF(0x00, 0x08, 0x0D3D)
440#define PI_DARRAY3_1_CS1_F2 DDR_REGDEF(0x08, 0x08, 0x0D3D)
441#define PI_DARRAY3_4_CS1_F2 DDR_REGDEF(0x00, 0x08, 0x0D3E)
442#define PI_DARRAY3_20_CS1_F2 DDR_REGDEF(0x00, 0x08, 0x0D42)
443
444/* The setting table of Data Slice for V4H */
445static const u32 DDR_PHY_SLICE_REGSET_V4H[DDR_PHY_SLICE_REGSET_NUM_V4H] = {
446 0x30020370, 0x00000000, 0x01000002, 0x00000000,
447 0x00000000, 0x00000000, 0x00010300, 0x04000100,
448 0x00010000, 0x01000000, 0x00000000, 0x00000000,
449 0x00010000, 0x08010000, 0x00022003, 0x00000000,
450 0x040F0100, 0x1404034F, 0x04040102, 0x04040404,
451 0x00000100, 0x00000000, 0x00000000, 0x000800C0,
452 0x000F18FF, 0x00000000, 0x00000001, 0x00070000,
453 0x0000AAAA, 0x00005555, 0x0000B5B5, 0x00004A4A,
454 0x00005656, 0x0000A9A9, 0x0000A9A9, 0x0000B5B5,
455 0x00000000, 0xBFBF0000, 0xCCCCF7F7, 0x00000000,
456 0x00000000, 0x00000000, 0x00080815, 0x08040000,
457 0x00000004, 0x00103000, 0x000C0040, 0x00200200,
458 0x01010000, 0x00000000, 0x00000000, 0x00000000,
459 0x00000000, 0x00000000, 0x00000000, 0x00000000,
460 0x00000000, 0x00000000, 0x00000000, 0x00000000,
461 0x00000000, 0x00000000, 0x00000020, 0x00000000,
462 0x00000000, 0x00000000, 0x00000000, 0x00000000,
463 0x00000000, 0x00000000, 0x00000000, 0x00000000,
464 0x00000000, 0x00000004, 0x001F07FF, 0x08000303,
465 0x10200080, 0x00000006, 0x00000401, 0x00000000,
466 0x20CEC201, 0x00000001, 0x00017706, 0x01007706,
467 0x00000000, 0x008D006D, 0x00100001, 0x03FF0100,
468 0x00006E01, 0x00000301, 0x00000000, 0x00000000,
469 0x00000000, 0x00500050, 0x00500050, 0x00500050,
470 0x00500050, 0x0D000050, 0x10100004, 0x06102010,
471 0x61619041, 0x07097000, 0x00644180, 0x00803280,
472 0x00808001, 0x13010100, 0x02000016, 0x10001003,
473 0x06093E42, 0x0F063D01, 0x011700C8, 0x04100140,
474 0x00000100, 0x000001D1, 0x05000068, 0x00030402,
475 0x01400000, 0x80800300, 0x00160010, 0x76543210,
476 0x00000008, 0x03010301, 0x03010301, 0x03010301,
477 0x03010301, 0x03010301, 0x00000000, 0x00500050,
478 0x00500050, 0x00500050, 0x00500050, 0x00500050,
479 0x00500050, 0x00500050, 0x00500050, 0x00500050,
480 0x00070087, 0x00000000, 0x08010007, 0x00000000,
481 0x20202020, 0x20202020, 0x20202020, 0x00000000,
482 0x00000000, 0x00000000, 0x00000000, 0x00000000,
483 0x00000000, 0x00000000, 0x00000000, 0x00000000,
484 0x00000000
485};
486
487/* The setting table of Address Slice for V4H */
488static const u32 DDR_PHY_ADR_V_REGSET_V4H[DDR_PHY_ADR_V_REGSET_NUM_V4H] = {
489 0x00200030, 0x00200002, 0x76543210, 0x00010001,
490 0x06543210, 0x03070000, 0x00001000, 0x00000000,
491 0x00000000, 0x00000000, 0x00000000, 0x00000000,
492 0x00000000, 0x00000000, 0x00000000, 0x0000807F,
493 0x00000001, 0x00000003, 0x00000000, 0x000F0000,
494 0x030C000F, 0x00020103, 0x0000000F, 0x00000100,
495 0x00000000, 0x00000000, 0x00000000, 0x00000000,
496 0x00000000, 0x02000400, 0x0000002A, 0x00000000,
497 0x00000000, 0x00000000, 0x00000000, 0x00200101,
498 0x10002C03, 0x00000003, 0x00030240, 0x00008008,
499 0x00081020, 0x01200000, 0x00010001, 0x00000000,
500 0x00100302, 0x003E4208, 0x01400140, 0x01400140,
501 0x01400140, 0x01400140, 0x00000100, 0x00000100,
502 0x00000100, 0x00000100, 0x00000000, 0x00000000,
503 0x00000000, 0x00000000, 0x00020580, 0x03000040,
504 0x00000000
505};
506
507/* The setting table of Address Control Slice for V4H */
508static const u32 DDR_PHY_ADR_G_REGSET_V4H[DDR_PHY_ADR_G_REGSET_NUM_V4H] = {
509 0x00000000, 0x00000100, 0x00000001, 0x23800000,
510 0x00000000, 0x01000101, 0x00000000, 0x00000001,
511 0x00000000, 0x00000000, 0x00000000, 0x00000000,
512 0x00040101, 0x00000000, 0x00000000, 0x00000064,
513 0x00000000, 0x00000000, 0x39421B42, 0x00010124,
514 0x00520052, 0x00000052, 0x00000000, 0x00000000,
515 0x00000000, 0x00000000, 0x00000000, 0x00000000,
516 0x00000000, 0x00000000, 0x00000000, 0x07030102,
517 0x01030307, 0x00000054, 0x00004096, 0x08200820,
518 0x08200820, 0x08200820, 0x08200820, 0x00000820,
519 0x004103B8, 0x0000003F, 0x000C0006, 0x00000000,
520 0x000004C0, 0x00007A12, 0x00000208, 0x00000000,
521 0x00000000, 0x00000000, 0x00000000, 0x00000000,
522 0x03000000, 0x00000000, 0x00000000, 0x04102002,
523 0x00041020, 0x01C98C98, 0x3F400000, 0x003F3F3F,
524 0x00000000, 0x00000000, 0x76543210, 0x00010198,
525 0x00000007, 0x00000000, 0x00000000, 0x00000000,
526 0x00000002, 0x00000000, 0x00000000, 0x00000000,
527 0x01032380, 0x00000100, 0x00000000, 0x31421342,
528 0x00308000, 0x00000080, 0x00063F77, 0x00000006,
529 0x0000033F, 0x00000000, 0x0000033F, 0x00000000,
530 0x0000033F, 0x00000000, 0x00033F00, 0x00CC0000,
531 0x00033F77, 0x00000000, 0x00033F00, 0x00EE0000,
532 0x00033F00, 0x00EE0000, 0x00033F00, 0x00EE0000,
533 0x00200106
534};
535
536/* The setting table of PI Register for V4H */
537static const u32 DDR_PI_REGSET_V4H[DDR_PI_REGSET_NUM_V4H] = {
538 0x00000D00, 0x00010100, 0x00640004, 0x00000001,
539 0x00000000, 0x00000000, 0x00000000, 0x00000000,
540 0xFFFFFFFF, 0x02010000, 0x00000003, 0x00000005,
541 0x00000002, 0x00000000, 0x00000101, 0x0012080E,
542 0x00000000, 0x001E2C0E, 0x00000000, 0x00030300,
543 0x01010700, 0x00000001, 0x00000000, 0x00000000,
544 0x00000000, 0x00000000, 0x00000000, 0x00000000,
545 0x01000000, 0x00002807, 0x00000000, 0x32000300,
546 0x00000000, 0x00000000, 0x04022004, 0x01040100,
547 0x00010000, 0x00000100, 0x000000AA, 0x00000055,
548 0x000000B5, 0x0000004A, 0x00000056, 0x000000A9,
549 0x000000A9, 0x000000B5, 0x00000000, 0x01000000,
550 0x00030300, 0x0000001A, 0x000007D0, 0x00000300,
551 0x00000000, 0x00000000, 0x01000000, 0x00000101,
552 0x00000000, 0x00000000, 0x00000000, 0x00000200,
553 0x03030300, 0x01000000, 0x00000000, 0x00000100,
554 0x00000003, 0x001100EF, 0x01A1120B, 0x00051400,
555 0x001A0700, 0x001101FC, 0x00011A00, 0x00000000,
556 0x001F0000, 0x00000000, 0x00000000, 0x00051500,
557 0x001103FC, 0x00011A00, 0x00051500, 0x001102FC,
558 0x00011A00, 0x00001A00, 0x00000000, 0x001F0000,
559 0x001100FC, 0x00011A00, 0x01A1120B, 0x001A0701,
560 0x00000000, 0x001F0000, 0x00000000, 0x00000000,
561 0x001100EF, 0x01A1120B, 0x00051400, 0x01910480,
562 0x01821009, 0x001F0000, 0x00000000, 0x00000000,
563 0x00000000, 0x00000000, 0x001A0700, 0x01A11E14,
564 0x001101FC, 0x00211A00, 0x00051500, 0x001103FC,
565 0x00011A00, 0x00051500, 0x001102FC, 0x00011A00,
566 0x00031A00, 0x001A0701, 0x00000000, 0x001F0000,
567 0x00000000, 0x00000000, 0x01A11E14, 0x01A1120B,
568 0x00000000, 0x001F0000, 0x00000000, 0x00000000,
569 0x00000000, 0x00000000, 0x001100FD, 0x00012E00,
570 0x00051700, 0x01A1120B, 0x001A0701, 0x001F0000,
571 0x00000000, 0x00000000, 0x001100EF, 0x01A1120B,
572 0x00051400, 0x001A0700, 0x001102FD, 0x00012E00,
573 0x00000000, 0x001F0000, 0x00000000, 0x00000000,
574 0x00070700, 0x00000000, 0x01000000, 0x00000300,
575 0x17030000, 0x00000000, 0x00000000, 0x00000000,
576 0x0A0A140A, 0x10020201, 0x332A0002, 0x01010000,
577 0x0B000404, 0x04030308, 0x00010100, 0x02020301,
578 0x01001000, 0x00000034, 0x00000000, 0x00000000,
579 0x00000000, 0x00000000, 0x55AA55AA, 0x33CC33CC,
580 0x0FF00FF0, 0x0F0FF0F0, 0x00008E38, 0x00000001,
581 0x00000002, 0x00020001, 0x00020001, 0x02010201,
582 0x0000000F, 0x00000000, 0x00000000, 0x00000000,
583 0x00000000, 0x00000000, 0x00000000, 0x00000000,
584 0x00000000, 0x00000000, 0x00000000, 0xAAAAA593,
585 0xA5939999, 0x00000000, 0x00005555, 0x00003333,
586 0x0000CCCC, 0x00000000, 0x0003FFFF, 0x00003333,
587 0x0000CCCC, 0x00000000, 0x036DB6DB, 0x00249249,
588 0x05B6DB6D, 0x00000000, 0x00000000, 0x00000000,
589 0x00000000, 0x00000000, 0x036DB6DB, 0x00249249,
590 0x05B6DB6D, 0x00000000, 0x00000000, 0x00000000,
591 0x00000000, 0x00000000, 0x01000000, 0x00000100,
592 0x00000000, 0x00000000, 0x00000000, 0x00000000,
593 0x00000000, 0x00000000, 0x00000000, 0x00000000,
594 0x00010000, 0x00000000, 0x00000000, 0x00000000,
595 0x00000000, 0x00000000, 0x00000000, 0x00000000,
596 0x00000000, 0x00000000, 0x00000000, 0x00000000,
597 0x00000000, 0x00010000, 0x00000000, 0x00000000,
598 0x00000000, 0x00000000, 0x00000000, 0x00000000,
599 0x00000000, 0x00000000, 0x00000000, 0x00000000,
600 0x00000000, 0x00000000, 0x00080000, 0x00000000,
601 0x00000000, 0x00000000, 0x00000000, 0x00000000,
602 0x00000000, 0x00000000, 0x00000000, 0x00000000,
603 0x00000000, 0x00000000, 0x00000000, 0x00000000,
604 0x00000000, 0x00000000, 0x00000000, 0x00000000,
605 0x00000000, 0x00000000, 0x00000000, 0x01180400,
606 0x03020100, 0x00060504, 0x00010100, 0x00000008,
607 0x00080000, 0x00000001, 0x00000000, 0x0001AA00,
608 0x00000100, 0x00000000, 0x00010000, 0x00000000,
609 0x00000000, 0x00000000, 0x00000000, 0x00000000,
610 0x00000000, 0x00000000, 0x00000000, 0x00000000,
611 0x00000000, 0x00000000, 0x00000000, 0x00000000,
612 0x00000000, 0x00000000, 0x00000000, 0x00000000,
613 0x00000000, 0x00000000, 0x00000000, 0x00000000,
614 0x00000000, 0x00000000, 0x00000000, 0x00000000,
615 0x00000000, 0x00000000, 0x00000000, 0x00000000,
616 0x00000000, 0x00000000, 0x00000000, 0x00000000,
617 0x00020000, 0x00000100, 0x00010000, 0x0000000B,
618 0x0000001C, 0x00000100, 0x00000000, 0x00000000,
619 0x00000000, 0x00000000, 0x03010000, 0x01000100,
620 0x01020001, 0x00010300, 0x05000104, 0x01060001,
621 0x00010700, 0x00000000, 0x00000000, 0x00010000,
622 0x00000000, 0x00000000, 0x00000000, 0x00000000,
623 0x00000301, 0x00000000, 0x00000000, 0x01010000,
624 0x00000000, 0x00000200, 0x00000000, 0xB8000000,
625 0x010000FF, 0x0000FFE8, 0x00FFA801, 0xFFD80100,
626 0x00007F10, 0x00000000, 0x00000034, 0x0000003D,
627 0x00020079, 0x02000200, 0x02000204, 0x06000C06,
628 0x04040200, 0x04100804, 0x14090004, 0x1C081024,
629 0x0000120C, 0x00000015, 0x000000CF, 0x00000026,
630 0x0000017F, 0x00000130, 0x04000C2E, 0x00000404,
631 0x01080032, 0x01080032, 0x000F0032, 0x00000000,
632 0x00000000, 0x00000000, 0x00010300, 0x00010301,
633 0x03030000, 0x00000001, 0x00010303, 0x00030000,
634 0x0013000C, 0x0A060037, 0x03030526, 0x000C0032,
635 0x0017003D, 0x0025004B, 0x00010101, 0x0000000E,
636 0x00000019, 0x010000C8, 0x000F000F, 0x0007000C,
637 0x001A0100, 0x0015001A, 0x0100000B, 0x00C900C9,
638 0x005100A1, 0x29003329, 0x33290033, 0x0A070600,
639 0x0A07060D, 0x0D09070D, 0x000C000D, 0x00001000,
640 0x00000C00, 0x00001000, 0x00000C00, 0x02001000,
641 0x0002000E, 0x00160019, 0x1E1A00C8, 0x00100004,
642 0x361C0008, 0x00000000, 0x0000000C, 0x0006000C,
643 0x0300361C, 0x04001300, 0x000D0019, 0x0000361C,
644 0x20003300, 0x00000000, 0x02000000, 0x04040802,
645 0x00060404, 0x0003C34F, 0x05022001, 0x0203000A,
646 0x04040408, 0xC34F0604, 0x10010005, 0x040A0502,
647 0x0A080F11, 0x1C0A040A, 0x0022C34F, 0x0C0C1002,
648 0x00019E0A, 0x0000102C, 0x000002FE, 0x00001DEC,
649 0x0000185C, 0x0000F398, 0x04000400, 0x03030400,
650 0x002AF803, 0x00002AF8, 0x0000D6D7, 0x00000003,
651 0x0000006E, 0x00000016, 0x00004E20, 0x00004E20,
652 0x00030D40, 0x00000005, 0x000000C8, 0x00000027,
653 0x00027100, 0x00027100, 0x00186A00, 0x00000028,
654 0x00000640, 0x01000136, 0x00530040, 0x00010004,
655 0x00960040, 0x00010004, 0x04B00040, 0x00000318,
656 0x00280005, 0x05040404, 0x00070603, 0x06030503,
657 0x0503000D, 0x00640603, 0x06040608, 0x00040604,
658 0x00260015, 0x01050130, 0x01000100, 0x00020201,
659 0x04040000, 0x01010104, 0x03020302, 0x00000100,
660 0x02020101, 0x00000000, 0x09910260, 0x11911600,
661 0x19A21009, 0x19A10100, 0x19A10201, 0x19A10302,
662 0x19A10A03, 0x19A10B04, 0x19A10C05, 0x19A10E07,
663 0x19A10F08, 0x19A1110A, 0x19A1120B, 0x19A1130C,
664 0x19A1140D, 0x19A00C00, 0x199F0000, 0x199F0000,
665 0x199F0000, 0x199F0000, 0x01910300, 0x01A21009,
666 0x019F0000, 0x019F0000, 0x019F0000, 0x019F0000,
667 0x001140BF, 0x01811009, 0x01850400, 0x01A10C05,
668 0x01850300, 0x01A10C11, 0x01850300, 0x001100BF,
669 0x01811009, 0x01850500, 0x019F0000, 0x019F0000,
670 0x01510001, 0x01D102A0, 0x01E21009, 0x00051900,
671 0x019F0000, 0x019F0000, 0x019F0000, 0x019F0000,
672 0x019F0000, 0x019F0000, 0x019F0000, 0x019F0000,
673 0x019F0000, 0x019F0000, 0x019F0000, 0x01510001,
674 0x01D10290, 0x01E21009, 0x01510001, 0x01D10000,
675 0x01E21009, 0x00051800, 0x019F0000, 0x019F0000,
676 0x019F0000, 0x019F0000, 0x019F0000, 0x019F0000,
677 0x019F0000, 0x019F0000, 0x0011008F, 0x00910000,
678 0x01811009, 0x01910040, 0x01A21009, 0x019F0000,
679 0x01911000, 0x01A21009, 0x01A10100, 0x01A10201,
680 0x01A10302, 0x01A10A03, 0x01A10B04, 0x01A10C05,
681 0x01A10E07, 0x01A10F08, 0x01A1110A, 0x01A1120B,
682 0x01A1130C, 0x01A1140D, 0x01A00C00, 0x01910800,
683 0x01A21009, 0x019F0000, 0x019F0000, 0x019F0000,
684 0x0101017F, 0x00010101, 0x00000000, 0x00000000,
685 0x00000000, 0x00000000, 0x01000000, 0x01000101,
686 0x00000000, 0x00000000, 0x00050000, 0x00070100,
687 0x000F0200, 0x00000000, 0x01A10100, 0x01A10201,
688 0x01A10302, 0x01A00B04, 0x00210D06, 0x01A1110A,
689 0x01A1140D, 0x00098000, 0x019F0000, 0x019F0000,
690 0x019F0000, 0x019F0000, 0x019F0000, 0x019F0000,
691 0x019F0000, 0x019F0000, 0x019F0000, 0x019F0000,
692 0x019F0000, 0x019F0000, 0x019F0000, 0x019F0000,
693 0x019F0000, 0x019F0000, 0x019F0000, 0x019F0000,
694 0x019F0000, 0x019F0000, 0x019F0000, 0x019F0000,
695 0x019F0000, 0x019F0000, 0x019F0000, 0x019F0000,
696 0x019F0000, 0x019F0000, 0x019F0000, 0x019F0000,
697 0x019F0000, 0x019F0000, 0x019F0000, 0x019F0000,
698 0x019F0000, 0x019F0000, 0x019F0000, 0x019F0000,
699 0x019F0000, 0x019F0000, 0x019F0000, 0x019F0000,
700 0x019F0000, 0x019F0000, 0x019F0000, 0x019F0000,
701 0x019F0000, 0x019F0000, 0x019F0000, 0x019F0000,
702 0x019F0000, 0x019F0000, 0x01A10100, 0x01A10201,
703 0x01A10302, 0x01A10A03, 0x01A10B04, 0x00210D06,
704 0x01A1110A, 0x00000000, 0x01A1140D, 0x00000000,
705 0x00000000, 0x00000000, 0x01A1120B, 0x000A0000,
706 0x001F0000, 0x001F0000, 0x001F0000, 0x001F0000,
707 0x001F0000, 0x001F0000, 0x000A0000, 0x01061300,
708 0x00000000, 0x00000000, 0x00061180, 0x000612C0,
709 0x00000000, 0x00000000, 0x001F0000, 0x00000000,
710 0x00000000, 0x00000000, 0x00000000, 0x00000000,
711 0x00000000, 0x00000000, 0x00000000, 0x00000000,
712 0x00000000, 0x00000000, 0x01811009, 0x0011EFAF,
713 0x01A1120B, 0x001F0000, 0x001F0000, 0x001F0000,
714 0x001F0000, 0x001F0000, 0x001F0000, 0x001100BF,
715 0x01A1120B, 0x080D0000, 0x001F0000, 0x001F0000,
716 0x001F0000, 0x080C0000, 0x001F0000, 0x001F0000,
717 0x001F0000, 0x001F0000, 0x001F0000, 0x001F0000,
718 0x001F0000, 0x001F0000, 0x001F0200, 0x001F0200,
719 0x001F0200, 0x001F0200, 0x001F0200, 0x001F0200,
720 0x001F0200, 0x001F0200, 0x001F0200, 0x001F0200,
721 0x001F0200, 0x001F0200, 0x001100EF, 0x01A1120B,
722 0x001F0000, 0x00000000, 0x00000000, 0x00000000,
723 0x00000000, 0x00000000, 0x00000000, 0x00000000,
724 0x00000000, 0x00000000, 0x00000000, 0x00000000,
725 0x00000000, 0x00000000, 0x01A1120B, 0x001F0000,
726 0x00000000, 0x00000000, 0x00000000, 0x00000000,
727 0x00000000, 0x00000000, 0x00000000, 0x00000000,
728 0x00000000, 0x00000000, 0x00000000, 0x00000000,
729 0x00000000, 0x00000000, 0x001100EF, 0x01A1120B,
730 0x001F0000, 0x00000000, 0x00000000, 0x00000000,
731 0x00000000, 0x00000000, 0x00000000, 0x00000000,
732 0x00000000, 0x00000000, 0x00000000, 0x00000000,
733 0x00000000, 0x00000000, 0x00211F14, 0x00212014,
734 0x00212116, 0x00212217, 0x001F0000, 0x00000000,
735 0x00000000, 0x00000000, 0x00000000, 0x00000000,
736 0x001A85FF, 0x00051E00, 0x001F0000, 0x00000000,
737 0x00211F14, 0x00212015, 0x00212116, 0x00212217,
738 0x01A1120B, 0x001F0000, 0x00000000, 0x00000000,
739 0x00000000, 0x00000000, 0x0031FFBF, 0x01A11009,
740 0x01A10E07, 0x01A10F08, 0x003100BF, 0x01A11009,
741 0x00051800, 0x003F0000, 0x003F0000, 0x003F0000,
742 0x003F0000, 0x003F0000, 0x003F0000, 0x003F0000,
743 0x003F0000, 0x003F0000, 0x0031FFBF, 0x01A11009,
744 0x01A10E07, 0x01A10F08, 0x003100BF, 0x01A11009,
745 0x00051800, 0x003F0000, 0x003F0000, 0x003F0000,
746 0x003F0000, 0x003F0000, 0x003F0000, 0x003F0000,
747 0x003F0000, 0x003F0000, 0x08084340, 0x0011FFFF,
748 0x2011FFFB, 0x00012E00, 0x001100EF, 0x01A1120B,
749 0x001F0000, 0x001F0000, 0x001F0000, 0x001F0000,
750 0x001F0000, 0x001F0000, 0x001F0000, 0x001F0000,
751 0x001F0000, 0x001F0000, 0x001F0000, 0x001F0000,
752 0x001F0000, 0x001F0000, 0x001F0000, 0x001F0000,
753 0x001F0000, 0x001F0000, 0x083E4340, 0x00212E00,
754 0x01A1120B, 0x003F0000, 0x003F0000, 0x003F0000,
755 0x003F0000, 0x003F0000, 0x003F0000, 0x08201020,
756 0x28100020, 0x08083020, 0x08400020, 0x08402020,
757 0x08483020, 0x10083020, 0x20180020, 0x30480020,
758 0x78880020, 0x488010E0, 0x494B0000, 0x49089080,
759 0x49080000, 0x490011C0, 0x0A000020, 0x08000020,
760 0x08000020, 0x08000020, 0x08000020, 0x08000020,
761 0x08000020, 0x08000020, 0x08000020, 0x08000020,
762 0x08000020, 0x08000020, 0x08000020, 0x08000020,
763 0x08000020, 0x08000020, 0x08000020, 0x08000020,
764 0x08000020, 0x08000020, 0x08000020, 0x08000020,
765 0x08000020, 0x08000020, 0x08000020, 0x08000020,
766 0x08000020, 0x08000020, 0x08000020, 0x08000020,
767 0x001100FF, 0x01810302, 0x001100DF, 0x00010D06,
768 0x001100EF, 0x01A1120B, 0x001F0000, 0x001F0000,
769 0x001F0000, 0x001F0000, 0x001F0000, 0x001F0000,
770 0x001F0000, 0x001F0000, 0x001F0000, 0x001F0000,
771 0x00010D06, 0x01810302, 0x0181160E, 0x001F0000,
772 0x001F0000, 0x001F0000, 0x001F0000, 0x001F0000,
773 0x081A52FD, 0x001A12FF, 0x00051A00, 0x001A13FF,
774 0x00051B00, 0x001F13FF, 0x081A52FD, 0x001A12FF,
775 0x00051A00, 0x001A13FF, 0x00051B00, 0x001F13FF,
776 0x081A52FD, 0x001A12FF, 0x00051A00, 0x001A13FF,
777 0x00051B00, 0x001F13FF, 0x00032300, 0x00032400,
778 0x001F0000, 0x001F0000, 0x00800000, 0x0031FFBF,
779 0x01A11009, 0x01A10E07, 0x01A10F08, 0x003100BF,
780 0x01A11009, 0x00051800, 0x003F0000, 0x003F0000,
781 0x003F0000, 0x003F0000, 0x003F0000, 0x003F0000,
782 0x003F0000, 0x003F0000, 0x00800000, 0x0031FFBF,
783 0x01A11009, 0x01A10E07, 0x01A10F08, 0x003100BF,
784 0x01A11009, 0x00051800, 0x003F0000, 0x003F0000,
785 0x003F0000, 0x003F0000, 0x003F0000, 0x003F0000,
786 0x003F0000, 0x003F0000, 0x081100DF, 0x08010D06,
787 0x0011000F, 0x0181160E, 0x001100EF, 0x01A1120B,
788 0x001F0000, 0x001F0000, 0x001F0000, 0x009C0000,
789 0x08010D06, 0x0181160E, 0x01A1120B, 0x001F0000,
790 0x001F0000, 0x001F0000, 0x00000000, 0x00000000,
791 0x00000000, 0x00000000, 0x00000000, 0x00000000,
792 0x00000000, 0x00000000, 0x00000000, 0x11910048,
793 0x09910060, 0x19A21009, 0x19A10100, 0x19A10201,
794 0x19A10302, 0x19A10A03, 0x19A10B04, 0x18051C00,
795 0x19A1110A, 0x19A1120B, 0x19A1130C, 0x19A1140D,
796 0x19A1160E, 0x181140BF, 0x19A11009, 0x19A10C05,
797 0x19A00C00, 0x19A10E07, 0x19A10F08, 0x19910280,
798 0x19A21009, 0x18051000, 0x18861101, 0x181F0000,
799 0x18000000, 0x18000000, 0x18000000, 0x18000000,
800 0x18000000, 0x18000000, 0x18000000, 0x18000000,
801 0x18000000, 0x18000000, 0x18000000, 0x18000000,
802 0x18000000, 0x18000000, 0x18000000, 0x18861100,
803 0x19A11009, 0x101B0001, 0x181B0100, 0x18000500,
804 0x181B0200, 0x00000000, 0x181B0600, 0x181B0C00,
805 0x181B0100, 0x181B0200, 0x181B0300, 0x181B0400,
806 0x181F0000, 0x18000000, 0x18000000, 0x18000000,
807 0x18000000, 0x18000000, 0x18000000, 0x18000000,
808 0x18000000, 0x18000000, 0x18000000, 0x18000000,
809 0x18000000, 0x18000000, 0x18000000, 0x18000000,
810 0x18000000, 0x004B1040, 0x001011C0, 0x00089080,
811 0x000811C0, 0x040811C0, 0x02000000, 0x00000000,
812 0x00000000, 0x00000000, 0x00000000, 0x00000000,
813 0x00000000, 0x00000000, 0x00000000, 0x00000000,
814 0x00000000, 0x00000000, 0x00000000, 0x00000000,
815 0x00000000, 0x00000000, 0x00000000, 0x5F407FAA,
816 0x007B776F, 0x4AB555AA, 0xB5A9A956, 0x9F80BFAA,
817 0x00BBB7AF, 0x00000000, 0x00000000, 0x00000000,
818 0x00000000, 0x00000000, 0x00000000, 0x00000000,
819 0x00000000, 0x00002AF8, 0x0000D6D7, 0x0000006E,
820 0x00000000, 0x00000000, 0x00000000, 0x00000000,
821 0x00000000, 0x00000000, 0x00000000, 0x00000000,
822 0x00000000, 0x00000000, 0x00000000, 0x00000000,
823 0x00000000, 0x0000000E, 0x00000019, 0x000000C8,
824 0x00000001, 0x00000001, 0x00000003, 0x00000007,
825 0x00000007, 0x00000009, 0x00000001, 0x00000001,
826 0x00000003, 0x00000001, 0x00000001, 0x00000003,
827 0x0000006E, 0x000000C8, 0x00000640, 0x00000001,
828 0x00000001, 0x00000003, 0x00000002, 0x00000004,
829 0x0000001C, 0x00000007, 0x0000000B, 0x00000051,
830 0x0000000C, 0x00000015, 0x000000A1, 0x00000003,
831 0x00000000, 0x0000000C, 0x00000000, 0x00000000,
832 0x00000000, 0x0000000F, 0x0000000F, 0x0000000F,
833 0x00002AF9, 0x00002AF9, 0x00002AF9, 0x00000034,
834 0x0000001E, 0x0000003C, 0x00000000, 0x00000000,
835 0x00000000, 0x00000000, 0x00000000, 0x00000000,
836 0x00000000, 0x00000000, 0x00000000, 0x00000000,
837 0x00000000, 0x00000000, 0x00000000, 0x00000000,
838 0x00000000, 0x00000000, 0x00000000, 0x00000000,
839 0x00000000, 0x00000000, 0x00000000, 0x00000000,
840 0x00000000, 0x00000000, 0x00000000, 0x00000000,
841 0x00000000, 0x00000000, 0x00000000, 0x00000000,
842 0x00000000, 0x00000000, 0x00000000, 0x00000000,
843 0x00000000, 0x00000000, 0x00000000, 0x00000000,
844 0x00000000, 0x00000000, 0x00000000, 0x00000000,
845 0x00000000, 0x00000000, 0x00000000, 0x00000000,
846 0x00000000, 0x00000000, 0x00000000, 0x00000000,
847 0x000000C0, 0x00000000, 0x00000000, 0x55550000,
848 0x00003C5A, 0x00000000, 0x00000000, 0x00000000,
849 0x00000000, 0x00000000, 0x00000000, 0x00000000,
850 0x00000000, 0x00000000, 0x00000000, 0x00000000,
851 0x00000000, 0x00000000, 0x00000000, 0x00000000,
852 0x00000000, 0x00000000, 0x00000000, 0x00000000,
853 0x00000000, 0x00000000, 0x00000000, 0x00000000,
854 0x00000000, 0x00000000, 0x00000000, 0x00000000,
855 0x00000000, 0x00000000, 0x00000000, 0x00000000,
856 0x00000000, 0x00000000, 0x00000000, 0x00000000,
857 0x00000000, 0x00000000, 0x00000000, 0x00000000,
858 0x00000000, 0x00000000, 0x00000000, 0x00000000,
859 0x00000000, 0x00000000, 0x00000000, 0x00000000,
860 0x00000000, 0x00000000, 0x00000000, 0x00D60000,
861 0x50005000, 0x803E0050, 0x00000200, 0x00000000,
862 0x00000000, 0x00007800, 0x00000000, 0x00000000,
863 0x00000000, 0x00C61110, 0x2C002834, 0x0C06002C,
864 0x00000200, 0x00000000, 0x00000000, 0x00007800,
865 0x00000000, 0x00000000, 0x00000000, 0x00C6BBB0,
866 0x2C002834, 0x0C06002C, 0x00000200, 0x00000000,
867 0x00000000, 0x00007800, 0x00000000, 0x00000000,
868 0x00000000, 0x00D60000, 0x50005000, 0x803E0050,
869 0x00000200, 0x00000000, 0x00000000, 0x00007800,
870 0x00000000, 0x00000000, 0x00000000, 0x00C61110,
871 0x2C002834, 0x082E002C, 0x00000200, 0x00000000,
872 0x00000000, 0x00007800, 0x00000000, 0x00000000,
873 0x00000000, 0x00C6BBB0, 0x2C002834, 0x082E002C,
874 0x00000200, 0x00000000, 0x00000000, 0x00007800,
875 0x00000000, 0x00000000, 0x00000000, 0x80808080,
876 0x800D8080, 0x80808080, 0x17808080, 0x80808025,
877 0x2221201F, 0x80808080, 0x80808080, 0x80808080,
878 0x80808080, 0x80808080, 0x80808080, 0x80808080,
879 0x80808080, 0x80808080, 0x80808080, 0x80808080,
880 0x80808080, 0x80808080, 0x80808080, 0x0A030201,
881 0x0E800C0B, 0x1211100F, 0x80161413, 0x08004C80,
882 0x8080801E, 0x80804E80, 0x80808080, 0x80808080,
883 0x80808080
884};
885
886struct dbsc5_table_patch {
887 const u32 reg;
888 const u32 val;
889};
890
891static const struct dbsc5_table_patch dbsc5_table_patch_slice_3200[] = {
892 { PHY_REGULATOR_EN_CNT, 0x10 },
893 { PHY_RX_CAL_ALL_DLY, 0x07 },
894 { PHY_RDDATA_EN_TSEL_DLY, 0x08 },
895 { PHY_RDDATA_EN_OE_DLY, 0x0B },
896 { PHY_RPTR_UPDATE, 0x07 },
897 { PHY_WRLVL_RESP_WAIT_CNT, 0x25 },
898 { PHY_RDLVL_MAX_EDGE, 0x012D },
899 { PHY_RDDATA_EN_DLY, 0x0B },
900 { PHY_RDDQS_LATENCY_ADJUST, 0x04 },
901 { PHY_RDDQS_GATE_SLAVE_DELAY, 0x05 },
902 { PHY_GTLVL_LAT_ADJ_START, 0x03 },
903 { PHY_LP4_BOOT_RX_PCLK_CLK_SEL, 0x00 }
904};
905
906static const struct dbsc5_table_patch dbsc5_table_patch_adr_v_3200[] = {
907 { PHY_ADR_MEAS_DLY_STEP_ENABLE, 0x00 },
908 { PHY_ADR_CALVL_DLY_STEP, 0x02 }
909};
910
911static const struct dbsc5_table_patch dbsc5_table_patch_pi_3200[] = {
912 { PI_TCKCKEL_F2, 0x03 },
913 { PI_TDELAY_RDWR_2_BUS_IDLE_F2, 0x57 },
914 { PI_TREF_F2, 0x613 },
915 { PI_TDFI_WRLVL_WW_F0, 0x2B },
916 { PI_TDFI_WRLVL_WW_F1, 0x2B },
917 { PI_TDFI_WRLVL_WW_F2, 0x2B },
918 { PI_RDLAT_ADJ_F2, 0x22 },
919 { PI_TDFI_CALVL_CAPTURE_F2, 0x1D },
920 { PI_TDFI_CALVL_CC_F2, 0x43 },
921 { PI_TVRCG_ENABLE_F2, 0x51 },
922 { PI_TVRCG_DISABLE_F2, 0x29 },
923 { PI_TXP_F2, 0x07 },
924 { PI_TMRWCKEL_F2, 0x0A },
925 { PI_TDFI_CALVL_STROBE_F2, 0x06 },
926 { PI_TFC_F2, 0x64 },
927 { PI_TCKEHDQS_F2, 0x12 },
928 { PI_TDFI_WDQLVL_RW_F2, 0x09 },
929 { PI_TDFI_WDQLVL_WR_F2, 0x10 },
930 { PI_MBIST_TWCKENL_RD_ADJ_F2, 0x10 },
931 { PI_MBIST_RDLAT_ADJ_F2, 0x1E },
932 { PI_TWTR_S_F2, 0x05 },
933 { PI_TWTR_L_F2, 0x05 },
934 { PI_TWTR_F2, 0x05 },
935 { PI_TWR_F2, 0x0E },
936 { PI_TDQSCK_MAX_F2, 0x01 },
937 { PI_TDFI_CTRLUPD_MAX_F2, 0x0C26 },
938 { PI_TDFI_CTRLUPD_INTERVAL_F2, 0x797C },
939 { PI_TXSNR_F2, 0x9B },
940 { PI_ZQRESET_F2, 0x0014 },
941 { PI_TCBTRTW_F2, 0x04 },
942 { PI_SEQ_WAIT_16_F2, 0x000064 },
943 { PI_SEQ_WAIT_17_F2, 0x000002 },
944 { PI_SEQ_WAIT_18_F2, 0x000007 },
945 { PI_SEQ_WAIT_19_F2, 0x000002 },
946 { PI_SEQ_WAIT_20_F2, 0x000002 },
947 { PI_SEQ_WAIT_21_F2, 0x000320 },
948 { PI_SEQ_WAIT_22_F2, 0x000002 },
949 { PI_SEQ_WAIT_23_F2, 0x00000E },
950 { PI_SEQ_WAIT_24_F2, 0x000029 },
951 { PI_SEQ_WAIT_25_F2, 0x000051 },
952 { PI_SEQ_WAIT_26_F2, 0x000003 },
953 { PI_SEQ_WAIT_30_F2, 0x00002B },
954 { PI_WRDCM_LVL_EN_F1, 0x00 },
955 { PI_WRDCM_LVL_EN_F2, 0x00 },
956 { PI_DRAMDCA_LVL_EN_F1, 0x00 },
957 { PI_DRAMDCA_LVL_EN_F2, 0x00 },
958 { PI_TINIT_F2, 0x013880 },
959 { PI_TINIT1_F2, 0x013880 },
960 { PI_TINIT3_F2, 0x0C3500 },
961 { PI_TINIT4_F2, 0x000014 },
962 { PI_TINIT5_F2, 0x000320 }
963};
964
965static const struct dbsc5_table_patch dbsc5_table_patch_slice_3733[] = {
966 { PHY_REGULATOR_EN_CNT, 0x13 },
967 { PHY_RX_CAL_ALL_DLY, 0x08 },
968 { PHY_RDDATA_EN_TSEL_DLY, 0x0A },
969 { PHY_RDDATA_EN_OE_DLY, 0x0D },
970 { PHY_RPTR_UPDATE, 0x08 },
971 { PHY_WRLVL_RESP_WAIT_CNT, 0x2A },
972 { PHY_RDLVL_MAX_EDGE, 0x0149 },
973 { PHY_RDDATA_EN_DLY, 0x0D },
974 { PHY_RDDQS_LATENCY_ADJUST, 0x04 },
975 { PHY_RDDQS_GATE_SLAVE_DELAY, 0x9C },
976 { PHY_GTLVL_LAT_ADJ_START, 0x04 },
977 { PHY_LP4_BOOT_RX_PCLK_CLK_SEL, 0x00 }
978};
979
980static const struct dbsc5_table_patch dbsc5_table_patch_adr_v_3733[] = {
981 { PHY_ADR_MEAS_DLY_STEP_ENABLE, 0x00 },
982 { PHY_ADR_CALVL_DLY_STEP, 0x02 }
983};
984
985static const struct dbsc5_table_patch dbsc5_table_patch_pi_3733[] = {
986 { PI_TCKCKEL_F2, 0x03 },
987 { PI_TDELAY_RDWR_2_BUS_IDLE_F2, 0x5B },
988 { PI_TREF_F2, 0x717 },
989 { PI_TDFI_WRLVL_WW_F0, 0x2C },
990 { PI_TDFI_WRLVL_WW_F1, 0x2C },
991 { PI_TDFI_WRLVL_WW_F2, 0x2C },
992 { PI_RDLAT_ADJ_F2, 0x24 },
993 { PI_TDFI_CALVL_CAPTURE_F2, 0x1F },
994 { PI_TDFI_CALVL_CC_F2, 0x45 },
995 { PI_TVRCG_ENABLE_F2, 0x5F },
996 { PI_TVRCG_DISABLE_F2, 0x30 },
997 { PI_TXP_F2, 0x07 },
998 { PI_TMRWCKEL_F2, 0x0A },
999 { PI_TDFI_CALVL_STROBE_F2, 0x06 },
1000 { PI_TFC_F2, 0x75 },
1001 { PI_TCKEHDQS_F2, 0x13 },
1002 { PI_TDFI_WDQLVL_RW_F2, 0x09 },
1003 { PI_TDFI_WDQLVL_WR_F2, 0x12 },
1004 { PI_MBIST_TWCKENL_RD_ADJ_F2, 0x10 },
1005 { PI_MBIST_RDLAT_ADJ_F2, 0x20 },
1006 { PI_TWTR_S_F2, 0x06 },
1007 { PI_TWTR_L_F2, 0x06 },
1008 { PI_TWTR_F2, 0x06 },
1009 { PI_TWR_F2, 0x10 },
1010 { PI_TDFI_CTRLUPD_MAX_F2, 0x0E2E },
1011 { PI_TDFI_CTRLUPD_INTERVAL_F2, 0x8DCC },
1012 { PI_TXSNR_F2, 0xB5 },
1013 { PI_ZQRESET_F2, 0x0018 },
1014 { PI_TCBTRTW_F2, 0x05 },
1015 { PI_SEQ_WAIT_16_F2, 0x000075 },
1016 { PI_SEQ_WAIT_17_F2, 0x000002 },
1017 { PI_SEQ_WAIT_18_F2, 0x000007 },
1018 { PI_SEQ_WAIT_19_F2, 0x000002 },
1019 { PI_SEQ_WAIT_20_F2, 0x000002 },
1020 { PI_SEQ_WAIT_21_F2, 0x0003A6 },
1021 { PI_SEQ_WAIT_22_F2, 0x000002 },
1022 { PI_SEQ_WAIT_23_F2, 0x000011 },
1023 { PI_SEQ_WAIT_24_F2, 0x000030 },
1024 { PI_SEQ_WAIT_25_F2, 0x00005F },
1025 { PI_SEQ_WAIT_26_F2, 0x000005 },
1026 { PI_SEQ_WAIT_30_F2, 0x00002D },
1027 { PI_TINIT_F2, 0x016C90 },
1028 { PI_TINIT1_F2, 0x016C90 },
1029 { PI_TINIT3_F2, 0x0E3D98 },
1030 { PI_TINIT4_F2, 0x000018 },
1031 { PI_TINIT5_F2, 0x0003A6 }
1032};
1033
1034static const struct dbsc5_table_patch dbsc5_table_patch_slice_4266[] = {
1035 { PHY_REGULATOR_EN_CNT, 0x16 },
1036 { PHY_RX_CAL_ALL_DLY, 0x09 },
1037 { PHY_RDDATA_EN_TSEL_DLY, 0x0B },
1038 { PHY_RDDATA_EN_OE_DLY, 0x0E },
1039 { PHY_RPTR_UPDATE, 0x08 },
1040 { PHY_WRLVL_RESP_WAIT_CNT, 0x2E },
1041 { PHY_RDLVL_MAX_EDGE, 0x0164 },
1042 { PHY_RDDATA_EN_DLY, 0x0E },
1043 { PHY_RDDQS_LATENCY_ADJUST, 0x05 },
1044 { PHY_RDDQS_GATE_SLAVE_DELAY, 0x30 },
1045 { PHY_GTLVL_LAT_ADJ_START, 0x04 },
1046 { PHY_LP4_BOOT_RX_PCLK_CLK_SEL, 0x00 }
1047};
1048
1049static const struct dbsc5_table_patch dbsc5_table_patch_adr_v_4266[] = {
1050 { PHY_ADR_MEAS_DLY_STEP_ENABLE, 0x00 },
1051 { PHY_ADR_CALVL_DLY_STEP, 0x02 }
1052};
1053
1054static const struct dbsc5_table_patch dbsc5_table_patch_pi_4266[] = {
1055 { PI_TCKCKEL_F2, 0x03 },
1056 { PI_TDELAY_RDWR_2_BUS_IDLE_F2, 0x64 },
1057 { PI_TREF_F2, 0x81C },
1058 { PI_TDFI_WRLVL_WW_F0, 0x2D },
1059 { PI_TDFI_WRLVL_WW_F1, 0x2D },
1060 { PI_TDFI_WRLVL_WW_F2, 0x2D },
1061 { PI_RDLAT_ADJ_F2, 0x2B },
1062 { PI_TDFI_CALVL_CAPTURE_F2, 0x20 },
1063 { PI_TDFI_CALVL_CC_F2, 0x46 },
1064 { PI_TVRCG_ENABLE_F2, 0x6C },
1065 { PI_TVRCG_DISABLE_F2, 0x37 },
1066 { PI_TXP_F2, 0x07 },
1067 { PI_TMRWCKEL_F2, 0x0A },
1068 { PI_TFC_F2, 0x86 },
1069 { PI_TCKEHDQS_F2, 0x14 },
1070 { PI_TDFI_WDQLVL_RW_F2, 0x0B },
1071 { PI_TDFI_WDQLVL_WR_F2, 0x13 },
1072 { PI_MBIST_TWCKENL_RD_ADJ_F2, 0x14 },
1073 { PI_MBIST_RDLAT_ADJ_F2, 0x27 },
1074 { PI_TWTR_S_F2, 0x07 },
1075 { PI_TWTR_L_F2, 0x07 },
1076 { PI_TWTR_F2, 0x07 },
1077 { PI_TWR_F2, 0x13 },
1078 { PI_TDFI_CTRLUPD_MAX_F2, 0x1038 },
1079 { PI_TDFI_CTRLUPD_INTERVAL_F2, 0xA230 },
1080 { PI_TXSNR_F2, 0xCF },
1081 { PI_ZQRESET_F2, 0x001B },
1082 { PI_TCBTRTW_F2, 0x06 },
1083 { PI_SEQ_WAIT_16_F2, 0x000086 },
1084 { PI_SEQ_WAIT_17_F2, 0x000002 },
1085 { PI_SEQ_WAIT_18_F2, 0x000007 },
1086 { PI_SEQ_WAIT_19_F2, 0x000002 },
1087 { PI_SEQ_WAIT_20_F2, 0x000002 },
1088 { PI_SEQ_WAIT_21_F2, 0x00042B },
1089 { PI_SEQ_WAIT_22_F2, 0x000002 },
1090 { PI_SEQ_WAIT_23_F2, 0x000013 },
1091 { PI_SEQ_WAIT_24_F2, 0x000037 },
1092 { PI_SEQ_WAIT_25_F2, 0x00006C },
1093 { PI_SEQ_WAIT_26_F2, 0x000006 },
1094 { PI_SEQ_WAIT_30_F2, 0x000032 },
1095 { PI_TINIT_F2, 0x01A0AB },
1096 { PI_TINIT1_F2, 0x01A0AB },
1097 { PI_TINIT3_F2, 0x1046AB },
1098 { PI_TINIT4_F2, 0x00001B },
1099 { PI_TINIT5_F2, 0x00042B }
1100};
1101
1102static const struct dbsc5_table_patch dbsc5_table_patch_slice_4800[] = {
1103 { PHY_REGULATOR_EN_CNT, 0x18 },
1104 { PHY_RX_CAL_ALL_DLY, 0x0A },
1105 { PHY_RDDATA_EN_TSEL_DLY, 0x0D },
1106 { PHY_RDDATA_EN_OE_DLY, 0x10 },
1107 { PHY_RPTR_UPDATE, 0x08 },
1108 { PHY_WRLVL_RESP_WAIT_CNT, 0x31 },
1109 { PHY_RDLVL_MAX_EDGE, 0x017F },
1110 { PHY_RDDATA_EN_DLY, 0x10 },
1111 { PHY_RDDQS_LATENCY_ADJUST, 0x05 },
1112 { PHY_RDDQS_GATE_SLAVE_DELAY, 0xC6 },
1113 { PHY_GTLVL_LAT_ADJ_START, 0x05 },
1114 { PHY_LP4_BOOT_RX_PCLK_CLK_SEL, 0x00 }
1115};
1116
1117static const struct dbsc5_table_patch dbsc5_table_patch_adr_v_4800[] = {
1118 { PHY_ADR_MEAS_DLY_STEP_ENABLE, 0x00 },
1119 { PHY_ADR_CALVL_DLY_STEP, 0x02 }
1120};
1121
1122static const struct dbsc5_table_patch dbsc5_table_patch_pi_4800[] = {
1123 { PI_TCKCKEL_F2, 0x03 },
1124 { PI_TDELAY_RDWR_2_BUS_IDLE_F2, 0x68 },
1125 { PI_RDLAT_ADJ_F2, 0x2D },
1126 { PI_TREF_F2, 0x920 },
1127 { PI_TDFI_WRLVL_WW_F0, 0x2E },
1128 { PI_TDFI_WRLVL_WW_F1, 0x2E },
1129 { PI_TDFI_WRLVL_WW_F2, 0x2E },
1130 { PI_TDFI_CALVL_CAPTURE_F2, 0x21 },
1131 { PI_TDFI_CALVL_CC_F2, 0x47 },
1132 { PI_TVRCG_DISABLE_F2, 0x3D },
1133 { PI_TVRCG_ENABLE_F2, 0x79 },
1134 { PI_TXP_F2, 0x08 },
1135 { PI_TMRWCKEL_F2, 0x0A },
1136 { PI_TCKEHDQS_F2, 0x14 },
1137 { PI_TFC_F2, 0x96 },
1138 { PI_TDFI_WDQLVL_RW_F2, 0x0B },
1139 { PI_TDFI_WDQLVL_WR_F2, 0x15 },
1140 { PI_MBIST_TWCKENL_RD_ADJ_F2, 0x18 },
1141 { PI_MBIST_RDLAT_ADJ_F2, 0x29 },
1142 { PI_TWTR_S_F2, 0x08 },
1143 { PI_TWR_F2, 0x15 },
1144 { PI_TWTR_F2, 0x08 },
1145 { PI_TWTR_L_F2, 0x08 },
1146 { PI_TDFI_CTRLUPD_MAX_F2, 0x1240 },
1147 { PI_TDFI_CTRLUPD_INTERVAL_F2, 0xB680 },
1148 { PI_TXSNR_F2, 0x0E9 },
1149 { PI_ZQRESET_F2, 0x001E },
1150 { PI_TCBTRTW_F2, 0x06 },
1151 { PI_SEQ_WAIT_16_F2, 0x000096 },
1152 { PI_SEQ_WAIT_17_F2, 0x000002 },
1153 { PI_SEQ_WAIT_18_F2, 0x000008 },
1154 { PI_SEQ_WAIT_19_F2, 0x000002 },
1155 { PI_SEQ_WAIT_20_F2, 0x000002 },
1156 { PI_SEQ_WAIT_21_F2, 0x0004B0 },
1157 { PI_SEQ_WAIT_22_F2, 0x000002 },
1158 { PI_SEQ_WAIT_23_F2, 0x000015 },
1159 { PI_SEQ_WAIT_24_F2, 0x00003D },
1160 { PI_SEQ_WAIT_25_F2, 0x000079 },
1161 { PI_SEQ_WAIT_26_F2, 0x000008 },
1162 { PI_SEQ_WAIT_30_F2, 0x000034 },
1163 { PI_TINIT_F2, 0x01D4A9 },
1164 { PI_TINIT1_F2, 0x01D4A9 },
1165 { PI_TINIT3_F2, 0x124E91 },
1166 { PI_TINIT4_F2, 0x00001E },
1167 { PI_TINIT5_F2, 0x0004B0 }
1168};
1169
1170static const struct dbsc5_table_patch dbsc5_table_patch_slice_5500[] = {
1171 { PHY_REGULATOR_EN_CNT, 0x1C },
1172 { PHY_RX_CAL_ALL_DLY, 0x0C },
1173 { PHY_RDDATA_EN_TSEL_DLY, 0x10 },
1174 { PHY_RDDATA_EN_OE_DLY, 0x13 },
1175 { PHY_WRLVL_RESP_WAIT_CNT, 0x37 },
1176 { PHY_RDLVL_MAX_EDGE, 0x01A3 },
1177 { PHY_RDDATA_EN_DLY, 0x13 },
1178 { PHY_RDDQS_LATENCY_ADJUST, 0x06 },
1179 { PHY_RDDQS_GATE_SLAVE_DELAY, 0x8F },
1180 { PHY_GTLVL_LAT_ADJ_START, 0x06 },
1181 { PHY_LP4_BOOT_RX_PCLK_CLK_SEL, 0x00 }
1182};
1183
1184static const struct dbsc5_table_patch dbsc5_table_patch_adr_v_5500[] = {
1185 { PHY_ADR_MEAS_DLY_STEP_ENABLE, 0x00 },
1186 { PHY_ADR_CALVL_DLY_STEP, 0x02 }
1187};
1188
1189static const struct dbsc5_table_patch dbsc5_table_patch_pi_5500[] = {
1190 { PI_TDELAY_RDWR_2_BUS_IDLE_F2, 0x71 },
1191 { PI_RDLAT_ADJ_F2, 0x32 },
1192 { PI_TREF_F2, 0xA79 },
1193 { PI_TDFI_WRLVL_WW_F0, 0x30 },
1194 { PI_TDFI_WRLVL_WW_F1, 0x30 },
1195 { PI_TDFI_WRLVL_WW_F2, 0x30 },
1196 { PI_TDFI_CALVL_CAPTURE_F2, 0x23 },
1197 { PI_TDFI_CALVL_CC_F2, 0x49 },
1198 { PI_TVRCG_DISABLE_F2, 0x46 },
1199 { PI_TVRCG_ENABLE_F2, 0x8B },
1200 { PI_TMRWCKEL_F2, 0x0B },
1201 { PI_TCKEHDQS_F2, 0x15 },
1202 { PI_TFC_F2, 0xAD },
1203 { PI_TDFI_WDQLVL_RW_F2, 0x0C },
1204 { PI_TDFI_WDQLVL_WR_F2, 0x17 },
1205 { PI_MBIST_TWCKENL_RD_ADJ_F2, 0x1C },
1206 { PI_MBIST_RDLAT_ADJ_F2, 0x2E },
1207 { PI_TWTR_S_F2, 0x09 },
1208 { PI_TWR_F2, 0x18 },
1209 { PI_TWTR_F2, 0x09 },
1210 { PI_TWTR_L_F2, 0x09 },
1211 { PI_TDFI_CTRLUPD_MAX_F2, 0x14F2 },
1212 { PI_TDFI_CTRLUPD_INTERVAL_F2, 0xD174 },
1213 { PI_TXSNR_F2, 0x10B },
1214 { PI_ZQRESET_F2, 0x0023 },
1215 { PI_TCBTRTW_F2, 0x07 },
1216 { PI_SEQ_WAIT_16_F2, 0x0000AD },
1217 { PI_SEQ_WAIT_21_F2, 0x000561 },
1218 { PI_SEQ_WAIT_23_F2, 0x000019 },
1219 { PI_SEQ_WAIT_24_F2, 0x000046 },
1220 { PI_SEQ_WAIT_25_F2, 0x00008B },
1221 { PI_SEQ_WAIT_26_F2, 0x00000A },
1222 { PI_SEQ_WAIT_30_F2, 0x000038 },
1223 { PI_TINIT_F2, 0x0219AF },
1224 { PI_TINIT1_F2, 0x0219AF },
1225 { PI_TINIT3_F2, 0x1500CF },
1226 { PI_TINIT4_F2, 0x000023 },
1227 { PI_TINIT5_F2, 0x000561 }
1228};
1229
1230static const struct dbsc5_table_patch dbsc5_table_patch_slice_6000[] = {
1231 { PHY_REGULATOR_EN_CNT, 0x1F },
1232 { PHY_RDDATA_EN_TSEL_DLY, 0x12 },
1233 { PHY_RDDATA_EN_OE_DLY, 0x15 },
1234 { PHY_WRLVL_RESP_WAIT_CNT, 0x3A },
1235 { PHY_RDLVL_MAX_EDGE, 0x01BD },
1236 { PHY_RDDATA_EN_DLY, 0x15 },
1237 { PHY_RDDQS_LATENCY_ADJUST, 0x07 },
1238 { PHY_RDDQS_GATE_SLAVE_DELAY, 0x1B },
1239 { PHY_GTLVL_LAT_ADJ_START, 0x06 },
1240 { PHY_LP4_BOOT_RX_PCLK_CLK_SEL, 0x00 }
1241};
1242
1243static const struct dbsc5_table_patch dbsc5_table_patch_adr_v_6000[] = {
1244 { PHY_ADR_MEAS_DLY_STEP_ENABLE, 0x00 },
1245 { PHY_ADR_CALVL_DLY_STEP, 0x02 }
1246};
1247
1248static const struct dbsc5_table_patch dbsc5_table_patch_pi_6000[] = {
1249 { PI_TDELAY_RDWR_2_BUS_IDLE_F2, 0x75 },
1250 { PI_RDLAT_ADJ_F2, 0x34 },
1251 { PI_TREF_F2, 0xB6B },
1252 { PI_TDFI_WRLVL_WW_F0, 0x31 },
1253 { PI_TDFI_WRLVL_WW_F1, 0x31 },
1254 { PI_TDFI_WRLVL_WW_F2, 0x31 },
1255 { PI_TVRCG_DISABLE_F2, 0x4D },
1256 { PI_TVRCG_ENABLE_F2, 0x98 },
1257 { PI_TMRWCKEL_F2, 0x0C },
1258 { PI_TFC_F2, 0xBC },
1259 { PI_TDFI_WDQLVL_RW_F2, 0x0C },
1260 { PI_MBIST_TWCKENL_RD_ADJ_F2, 0x1C },
1261 { PI_MBIST_RDLAT_ADJ_F2, 0x30 },
1262 { PI_TWR_F2, 0x1A },
1263 { PI_TDFI_CTRLUPD_MAX_F2, 0x16D6 },
1264 { PI_TDFI_CTRLUPD_INTERVAL_F2, 0xE45C },
1265 { PI_TXSNR_F2, 0x123 },
1266 { PI_ZQRESET_F2, 0x0026 },
1267 { PI_SEQ_WAIT_16_F2, 0x0000BC },
1268 { PI_SEQ_WAIT_21_F2, 0x0005DD },
1269 { PI_SEQ_WAIT_23_F2, 0x00001B },
1270 { PI_SEQ_WAIT_24_F2, 0x00004D },
1271 { PI_SEQ_WAIT_25_F2, 0x000098 },
1272 { PI_SEQ_WAIT_30_F2, 0x00003A },
1273 { PI_TINIT_F2, 0x024A16 },
1274 { PI_TINIT1_F2, 0x024A16 },
1275 { PI_TINIT3_F2, 0x16E4D8 },
1276 { PI_TINIT4_F2, 0x000026 },
1277 { PI_TINIT5_F2, 0x0005DD }
1278};
1279
1280static const struct dbsc5_table_patch dbsc5_table_patch_slice_mbpsdiv_640 = {
1281 PHY_DATA_DC_CAL_CLK_SEL, 0x05
1282};
1283
1284static const struct dbsc5_table_patch dbsc5_table_patch_adr_v_mbpsdiv_640 = {
1285 PHY_CLK_DC_CAL_CLK_SEL, 0x04
1286};
1287
1288static const struct dbsc5_table_patch dbsc5_table_patch_adr_g_mbpsdiv_640 = {
1289 PHY_CAL_CLK_SELECT_0, 0x05
1290};
1291
1292static const struct dbsc5_table_patch dbsc5_table_patch_slice_mbpsdiv_572 = {
1293 PHY_RX_PCLK_CLK_SEL, 0x3
1294};
1295
1296static const struct dbsc5_table_patch dbsc5_table_patch_adr_g_mbpsdiv_572 = {
1297 PHY_PAD_ACS_RX_PCLK_CLK_SEL, 0x03
1298};
1299
1300static const struct dbsc5_table_patch dbsc5_table_patch_adr_g_mbpsdiv_400[] = {
1301 { PHY_PLL_CTRL, 0x1542 },
1302 { PHY_PLL_CTRL_8X, 0x3342 }
1303};
1304
1305/* Array of addresses for setting PI_DARRAY3_0 in each CS and frequency-set */
1306static const u32 PI_DARRAY3_0_CSx_Fx[CS_CNT][3] = {
1307 { PI_DARRAY3_0_CS0_F0, PI_DARRAY3_0_CS0_F1, PI_DARRAY3_0_CS0_F2 },
1308 { PI_DARRAY3_0_CS1_F0, PI_DARRAY3_0_CS1_F1, PI_DARRAY3_0_CS1_F2 }
1309};
1310
1311/* Array of addresses for setting PI_DARRAY3_1 in each CS and frequency-set */
1312static const u32 PI_DARRAY3_1_CSx_Fx[CS_CNT][3] = {
1313 { PI_DARRAY3_1_CS0_F0, PI_DARRAY3_1_CS0_F1, PI_DARRAY3_1_CS0_F2 },
1314 { PI_DARRAY3_1_CS1_F0, PI_DARRAY3_1_CS1_F1, PI_DARRAY3_1_CS1_F2 }
1315};
1316
1317/* DBSC registers */
1318#define DBSC_DBSYSCONF0 0x0
1319#define DBSC_DBSYSCONF1 0x0
1320#define DBSC_DBSYSCONF1A 0x4
1321#define DBSC_DBSYSCONF2 0x4
1322#define DBSC_DBPHYCONF0 0x8
1323#define DBSC_DBSYSCONF2A 0x8
1324#define DBSC_DBMEMKIND 0x20
1325#define DBSC_DBMEMKINDA 0x20
1326#define DBSC_DBMEMCONF(ch, cs) (0x30 + (0x2000 * ((ch) & 0x2)) + (0x10 * ((ch) & 0x1)) + (0x4 * (cs)))
1327#define DBSC_DBMEMCONFA(ch, cs) (0x30 + (0x4000 * ((ch) & 0x2)) + (0x10 * ((ch) & 0x1)) + (0x4 * (cs)))
1328#define DBSC_DBSYSCNT0 0x100
1329#define DBSC_DBSYSCNT0A 0x100
1330#define DBSC_DBACEN 0x200
1331#define DBSC_DBRFEN 0x204
1332#define DBSC_DBCMD 0x208
1333#define DBSC_DBWAIT 0x210
1334#define DBSC_DBBL 0x400
1335#define DBSC_DBBLA 0x400
1336#define DBSC_DBRFCNF1 0x414
1337#define DBSC_DBRFCNF2 0x418
1338#define DBSC_DBCALCNF 0x424
1339#define DBSC_DBDBICNT 0x518
1340#define DBSC_DBDFIPMSTRCNF 0x520
1341#define DBSC_DBDFICUPDCNF 0x540
1342#define DBSC_DBBCAMDIS 0x9FC
1343#define DBSC_DBSCHRW1 0x1024
1344#define DBSC_DBSCHTR0 0x1030
1345#define DBSC_DBTR(x) (0x300 + (0x4 * (x)))
1346#define DBSC_DBRNK(x) (0x430 + (0x4 * (x)))
1347#define DBSC_DBDFISTAT(ch) (0x600 + (0x2000 * ((ch) & 0x2)) + (0x40 * ((ch) & 0x1)))
1348#define DBSC_DBDFICNT(ch) (0x604 + (0x2000 * ((ch) & 0x2)) + (0x40 * ((ch) & 0x1)))
1349#define DBSC_DBPDCNT2(ch) (0x618 + (0x2000 * ((ch) & 0x2)) + (0x40 * ((ch) & 0x1)))
1350#define DBSC_DBPDLK(ch) (0x620 + (0x2000 * ((ch) & 0x2)) + (0x40 * ((ch) & 0x1)))
1351#define DBSC_DBPDRGA(ch) (0x624 + (0x2000 * ((ch) & 0x2)) + (0x40 * ((ch) & 0x1)))
1352#define DBSC_DBPDRGD(ch) (0x628 + (0x2000 * ((ch) & 0x2)) + (0x40 * ((ch) & 0x1)))
1353#define DBSC_DBPDRGM(ch) (0x62C + (0x2000 * ((ch) & 0x2)) + (0x40 * ((ch) & 0x1)))
1354#define DBSC_DBPDSTAT0(ch) (0x630 + (0x2000 * ((ch) & 0x2)) + (0x40 * ((ch) & 0x1)))
1355#define DBSC_DBPDSTAT1(ch) (0x634 + (0x2000 * ((ch) & 0x2)) + (0x40 * ((ch) & 0x1)))
1356#define DBSC_DBSCHFCTST0 0x1040
1357#define DBSC_DBSCHFCTST1 0x1044
1358
1359/* CPG PLL3 registers */
1360#define CPG_CPGWPR 0x0
1361#define CPG_FRQCRD0 0x80C
1362#define CPG_PLLECR 0x820
1363#define CPG_PLL3CR0 0x83C
1364#define CPG_PLL3CR1 0x8C0
1365#define CPG_FSRCHKCLRR4 0x590
1366#define CPG_FSRCHKSETR4 0x510
1367#define CPG_FSRCHKRA4 0x410
1368#define CPG_SRCR4 0x2C10
1369#define CPG_SRSTCLR4 0x2C90
1370
1371#define CPG_FRQCRD_KICK_BIT BIT(31)
1372#define CPG_PLL3CR0_KICK_BIT BIT(31)
1373#define CPG_PLLECR_PLL3ST_BIT BIT(11)
1374
1375#define CLK_DIV(a, diva, b, divb) (((a) * (divb)) / ((b) * (diva)))
1376
1377struct renesas_dbsc5_board_config {
1378 /* Channels in use */
1379 u8 bdcfg_phyvalid;
1380 /* Read vref (SoC) training range */
1381 u32 bdcfg_vref_r;
1382 /* Write vref (MR14, MR15) training range */
1383 u16 bdcfg_vref_w;
1384 /* CA vref (MR12) training range */
1385 u16 bdcfg_vref_ca;
1386 /* RFM required check */
1387 bool bdcfg_rfm_chk;
1388
1389 /* Board parameter about channels */
1390 struct {
1391 /*
1392 * 0x00: 4Gb dual channel die / 2Gb single channel die
1393 * 0x01: 6Gb dual channel die / 3Gb single channel die
1394 * 0x02: 8Gb dual channel die / 4Gb single channel die
1395 * 0x03: 12Gb dual channel die / 6Gb single channel die
1396 * 0x04: 16Gb dual channel die / 8Gb single channel die
1397 * 0x05: 24Gb dual channel die / 12Gb single channel die
1398 * 0x06: 32Gb dual channel die / 16Gb single channel die
1399 * 0x07: 24Gb single channel die
1400 * 0x08: 32Gb single channel die
1401 * 0xFF: NO_MEMORY
1402 */
1403 u8 bdcfg_ddr_density[CS_CNT];
1404 /* SoC caX([6][5][4][3][2][1][0]) -> MEM caY: */
1405 u32 bdcfg_ca_swap;
1406 /* SoC dqsX([1][0]) -> MEM dqsY: */
1407 u8 bdcfg_dqs_swap;
1408 /* SoC dq([7][6][5][4][3][2][1][0]) -> MEM dqY/dm: (8 means DM) */
1409 u32 bdcfg_dq_swap[SLICE_CNT];
1410 /* SoC dm -> MEM dqY/dm: (8 means DM) */
1411 u8 bdcfg_dm_swap[SLICE_CNT];
1412 /* SoC ckeX([1][0]) -> MEM csY */
1413 u8 bdcfg_cs_swap;
1414 } ch[4];
1415};
1416
1417struct renesas_dbsc5_dram_priv {
1418 void __iomem *regs;
1419 void __iomem *cpg_regs;
1420
1421 /* The board parameter structure of the board */
1422 const struct renesas_dbsc5_board_config *dbsc5_board_config;
1423
1424 /* The board clock frequency */
1425 u32 brd_clk;
1426 u32 brd_clkdiv;
1427 u32 brd_clkdiva;
1428
1429 /* The Mbps of Bus */
1430 u32 bus_clk;
1431 u32 bus_clkdiv;
1432
1433 /* The Mbps of DDR */
1434 u32 ddr_mbps;
1435 u32 ddr_mbpsdiv;
1436
1437 /* DDR memory multiplier setting value */
1438 u32 ddr_mul;
1439 u32 ddr_mul_nf;
1440 u32 ddr_mul_low;
1441 u32 ddr_mul_reg;
1442
1443 /* Value indicating the enabled channel */
1444 u32 ddr_phyvalid;
1445
1446 /* The tccd value of DDR */
1447 u32 ddr_tccd;
1448
1449 /* Memory capacity in each channel and each CS */
1450 u8 ddr_density[DRAM_CH_CNT][CS_CNT];
1451 /* Channels used for each memory rank */
1452 u32 ch_have_this_cs[CS_CNT];
1453 /* The maximum memory capacity */
1454 u32 max_density;
1455
1456 /* Index of jedec spec1 setting table you use */
1457 u32 js1_ind;
1458 /* Array of jedec spec2 setting table */
1459 u32 js2[JS2_CNT];
1460 /* Read latency */
1461 u32 RL;
1462 /* Write latency */
1463 u32 WL;
1464
1465 /* Array for DDR PI Slice settings */
1466 u32 DDR_PI_REGSET[DDR_PI_REGSET_NUM_V4H];
1467 /* Array for DDRPHY Slice settings */
1468 u32 DDR_PHY_SLICE_REGSET[DDR_PHY_SLICE_REGSET_NUM_V4H];
1469 /* Array for DDRPHY ADRRESS VALUE Slice settings */
1470 u32 DDR_PHY_ADR_V_REGSET[DDR_PHY_SLICE_REGSET_NUM_V4H];
1471 /* Array for DDRPHY ADRRESS CONTROL Slice settings */
1472 u32 DDR_PHY_ADR_G_REGSET[DDR_PHY_SLICE_REGSET_NUM_V4H];
1473};
1474
1475static const struct renesas_dbsc5_board_config renesas_v4h_dbsc5_board_config = {
1476 /* RENESAS V4H White Hawk (64Gbit 1rank) */
1477 .bdcfg_phyvalid = 0xF,
1478 .bdcfg_vref_r = 0x0,
1479 .bdcfg_vref_w = 0x0,
1480 .bdcfg_vref_ca = 0x0,
1481 .bdcfg_rfm_chk = true,
1482 .ch = {
1483 [0] = {
1484 .bdcfg_ddr_density = { 0x06, 0xFF },
1485 .bdcfg_ca_swap = 0x04506132,
1486 .bdcfg_dqs_swap = 0x01,
1487 .bdcfg_dq_swap = { 0x26147085, 0x12306845 },
1488 .bdcfg_dm_swap = { 0x03, 0x07 },
1489 .bdcfg_cs_swap = 0x10
1490 },
1491 [1] = {
1492 .bdcfg_ddr_density = { 0x06, 0xFF },
1493 .bdcfg_ca_swap = 0x02341065,
1494 .bdcfg_dqs_swap = 0x10,
1495 .bdcfg_dq_swap = { 0x56782314, 0x71048365 },
1496 .bdcfg_dm_swap = { 0x00, 0x02 },
1497 .bdcfg_cs_swap = 0x10
1498 },
1499 [2] = {
1500 .bdcfg_ddr_density = { 0x06, 0xFF },
1501 .bdcfg_ca_swap = 0x02150643,
1502 .bdcfg_dqs_swap = 0x10,
1503 .bdcfg_dq_swap = { 0x58264071, 0x41207536 },
1504 .bdcfg_dm_swap = { 0x03, 0x08 },
1505 .bdcfg_cs_swap = 0x10
1506 },
1507 [3] = {
1508 .bdcfg_ddr_density = { 0x06, 0xFF },
1509 .bdcfg_ca_swap = 0x01546230,
1510 .bdcfg_dqs_swap = 0x01,
1511 .bdcfg_dq_swap = { 0x45761328, 0x62801745 },
1512 .bdcfg_dm_swap = { 0x00, 0x03 },
1513 .bdcfg_cs_swap = 0x10
1514 }
1515 }
1516};
1517
1518/**
1519 * r_vch_nxt() - Macro for channel selection loop
1520 *
1521 * Return the ID of the channel to be used. Check for valid channels
1522 * between the value of posn and the maximum number of CHs. If a valid
1523 * channel is found, returns the value of that channel.
1524 */
1525static u32 r_vch_nxt(struct udevice *dev, u32 pos)
1526{
1527 struct renesas_dbsc5_dram_priv *priv = dev_get_priv(dev);
1528 int posn;
1529
1530 for (posn = pos; posn < DRAM_CH_CNT; posn++)
1531 if (priv->ddr_phyvalid & BIT(posn))
1532 break;
1533
1534 return posn;
1535}
1536
1537/* Select only valid channels in all channels from CH0. */
1538#define r_foreach_vch(dev, ch) \
1539for ((ch) = r_vch_nxt((dev), 0); (ch) < DRAM_CH_CNT; (ch) = r_vch_nxt((dev), (ch) + 1))
1540
1541/* All channels are selected. */
1542#define r_foreach_ech(ch) \
1543for (ch = 0; ch < DRAM_CH_CNT; ch++)
1544
1545/**
1546 * dbsc5_clk_cpg_write_32() - Write clock control register
1547 *
1548 * Write the complement value of setting value to the CPG_CPGWPR register
1549 * for releaseing the protect. Write setting value to destination address.
1550 */
1551static void dbsc5_clk_cpg_write_32(struct udevice *dev, void __iomem *a, u32 v)
1552{
1553 struct renesas_dbsc5_dram_priv *priv = dev_get_priv(dev);
1554
1555 writel(~v, priv->cpg_regs + CPG_CPGWPR);
1556 writel(v, a);
1557}
1558
1559enum dbsc5_clk_pll3_mode {
1560 PLL3_LOW_FREQUENCY_MODE = 0,
1561 PLL3_HIGH_FREQUENCY_MODE,
1562 PLL3_HIGH_FREQUENCY_MODE_LOAD_REGISTER
1563};
1564
1565/**
1566 * dbsc5_clk_pll3_control() - Set PLL3
1567 * @dev: DBSC5 device
1568 * @mode: PLL3 frequency mode
1569 *
1570 * Determine the set value according to the frequency mode of the argument.
1571 * Write the set value to CPG_FRQCRD0 register and CPG_FRQCRD0 one.
1572 * Reflect settings
1573 */
1574static void dbsc5_clk_pll3_control(struct udevice *dev, u32 mode)
1575{
1576 struct renesas_dbsc5_dram_priv *priv = dev_get_priv(dev);
1577 u32 data_div, data_mul, data_nf, ssmode, val;
1578 int ret;
1579
1580 /*
1581 * PLL3VCO = EXTAL * priv->ddr_mul * 1/2
1582 * clk_ctlr_sync = PLL3VCO * pll3_div
1583 * priv->ddr_mul = (NI[7:0] + 1) * 2 + NF[24:0] / 2^24
1584 */
1585
1586 switch (mode) {
1587 case PLL3_LOW_FREQUENCY_MODE:
1588 /* Low frequency mode (50MHz) */
1589 data_mul = (priv->ddr_mul_low / 2) - 1; /* PLL3VCO = 1600MHz */
1590 data_div = 0x9; /* div = 32 */
1591 data_nf = 0x0;
1592 ssmode = 0x0;
1593 break;
1594 case PLL3_HIGH_FREQUENCY_MODE:
1595 /* High frequency mode */
1596 data_mul = (priv->ddr_mul / 2) - 1;
1597 data_div = 0x0; /* div = 2 */
1598 data_nf = priv->ddr_mul_nf;
1599 ssmode = 0x4;
1600 break;
1601 case PLL3_HIGH_FREQUENCY_MODE_LOAD_REGISTER:
1602 /* High frequency mode for loading to DDRPHY registers */
1603 data_mul = (priv->ddr_mul_reg / 2) - 1;
1604 data_div = 0x0; /* div = 2 */
1605 data_nf = 0x0;
1606 ssmode = 0x4;
1607 break;
1608 default:
1609 printf("%s Mode %d not supported\n", __func__, mode);
1610 hang();
1611 }
1612
1613 data_mul = (data_mul << 20) | (ssmode << 16);
1614 data_nf = data_nf << 21;
1615
1616 if (((readl(priv->cpg_regs + CPG_PLL3CR0) & 0x3FFFFF7F) != data_mul) ||
1617 (readl(priv->cpg_regs + CPG_PLL3CR1) != data_nf)) {
1618 /* PLL3CR0 multiplie set */
1619 dbsc5_clk_cpg_write_32(dev, priv->cpg_regs + CPG_PLL3CR0, data_mul);
1620 /* PLL3CR1 multiplie set */
1621 dbsc5_clk_cpg_write_32(dev, priv->cpg_regs + CPG_PLL3CR1, data_nf);
1622 dbsc5_clk_cpg_write_32(dev, priv->cpg_regs + CPG_PLL3CR0,
1623 readl(priv->cpg_regs + CPG_PLL3CR0) |
1624 CPG_PLL3CR0_KICK_BIT);
1625
1626 ret = readl_poll_timeout(priv->cpg_regs + CPG_PLLECR, val,
1627 (val & CPG_PLLECR_PLL3ST_BIT),
1628 1000000);
1629 if (ret < 0) {
1630 printf("%s CPG_PLLECR bit CPG_PLLECR_PLL3ST_BIT timeout\n", __func__);
1631 hang();
1632 }
1633 }
1634
1635 /* PLL3 DIV set(Target value) */
1636 ret = readl_poll_timeout(priv->cpg_regs + CPG_FRQCRD0, val,
1637 ((val & CPG_FRQCRD_KICK_BIT) == 0),
1638 1000000);
1639 if (ret < 0) {
1640 printf("%s CPG_FRQCRD0 bit CPG_FRQCRD_KICK_BIT div set timeout\n", __func__);
1641 hang();
1642 }
1643
1644 dbsc5_clk_cpg_write_32(dev, priv->cpg_regs + CPG_FRQCRD0,
1645 (readl(priv->cpg_regs + CPG_FRQCRD0) & 0xFFFFFFF0) |
1646 data_div);
1647 dbsc5_clk_cpg_write_32(dev, priv->cpg_regs + CPG_FRQCRD0,
1648 readl(priv->cpg_regs + CPG_FRQCRD0) |
1649 CPG_FRQCRD_KICK_BIT);
1650 ret = readl_poll_timeout(priv->cpg_regs + CPG_FRQCRD0, val,
1651 ((val & CPG_FRQCRD_KICK_BIT) == 0),
1652 1000000);
1653 if (ret < 0) {
1654 printf("%s CPG_FRQCRD0 bit CPG_FRQCRD_KICK_BIT timeout\n", __func__);
1655 hang();
1656 }
1657}
1658
1659/**
1660 * dbsc5_clk_wait_freqchgreq() - Training handshake functions
1661 *
1662 * Check the value of the argument req_assert. If req_assert is 1, wait until
1663 * FREQCHGREQ of all channels is 1 before time expires. If req_assert is 0,
1664 * wait until FREQCHGREQ of all channels is 0 before time expires. Return the
1665 * result of whether time has expired or not as a return value.
1666 */
1667static u32 dbsc5_clk_wait_freqchgreq(struct udevice *dev, u32 req_assert)
1668{
1669 struct renesas_dbsc5_dram_priv *priv = dev_get_priv(dev);
1670 void __iomem *regs_dbsc_d = priv->regs + DBSC5_DBSC_D_OFFSET;
1671 u32 count = 0xFFFFFF;
1672 u32 ch, reg;
1673
1674 do {
1675 reg = !!req_assert;
1676 r_foreach_vch(dev, ch)
1677 reg &= readl(regs_dbsc_d + DBSC_DBPDSTAT0(ch));
1678 count = count - 1;
1679 } while (((reg & 0x1) != !!req_assert) && (count != 0));
1680
1681 return count == 0x0;
1682}
1683
1684/**
1685 * dbsc5_clk_set_freqchgack() - Training handshake functions
1686 * @dev: DBSC5 device
1687 * @ack_assert: Select DBSC_DBPDCNT2 content
1688 *
1689 * Check the value of the argument ackassert. If the value of ackassert
1690 * is greater than or equal to 0, write 0xCF01 to DBSC_DBPDCNT2.
1691 * If the value of ackassert is 0, write 0x0 to DBSC_DBPDCNT2.
1692 */
1693static void dbsc5_clk_set_freqchgack(struct udevice *dev, u32 ack_assert)
1694{
1695 struct renesas_dbsc5_dram_priv *priv = dev_get_priv(dev);
1696 void __iomem *regs_dbsc_d = priv->regs + DBSC5_DBSC_D_OFFSET;
1697 const u32 reg = ack_assert ? 0xcf01 : 0x0;
1698 u32 ch;
1699
1700 r_foreach_vch(dev, ch)
1701 writel(reg, regs_dbsc_d + DBSC_DBPDCNT2(ch));
1702}
1703
1704/**
1705 * dbsc5_clk_wait_dbpdstat1() - Wait for status register update
1706 * @dev: DBSC5 device
1707 * @status: Expected status
1708 *
1709 * Read value the DBSC_DBPDSTAT1(ch) register. Wait until the contents
1710 * of the status register are the same as status.
1711 */
1712static void dbsc5_clk_wait_dbpdstat1(struct udevice *dev, u32 status)
1713{
1714 struct renesas_dbsc5_dram_priv *priv = dev_get_priv(dev);
1715 void __iomem *regs_dbsc_d = priv->regs + DBSC5_DBSC_D_OFFSET;
1716 u32 i, ch, reg;
1717
1718 for (i = 0; i < 2; i++) {
1719 do {
1720 reg = status;
1721 r_foreach_vch(dev, ch)
1722 reg &= readl(regs_dbsc_d + DBSC_DBPDSTAT1(ch));
1723 } while (reg != status);
1724 }
1725}
1726
1727/**
1728 * dbsc5_clk_pll3_freq() - Set up the pll3 frequency
1729 * @dev: DBSC5 device
1730 *
1731 * Wait for frequency change request. DBSC_DBPDSTAT0 value determines whether
1732 * dbsc5_clk_pll3_control is called in low frequency mode or high frequency
1733 * mode. Call dbsc5_clk_set_freqchgack(1) function. Check update completion until
1734 * timeout. Call dbsc5_clk_set_freqchgack(0) function. If timed out, return with
1735 * error log Wait for status register update.
1736 */
1737static int dbsc5_clk_pll3_freq(struct udevice *dev)
1738{
1739 struct renesas_dbsc5_dram_priv *priv = dev_get_priv(dev);
1740 void __iomem *regs_dbsc_d = priv->regs + DBSC5_DBSC_D_OFFSET;
1741 u32 fsel, timeout;
1742
1743 dbsc5_clk_wait_freqchgreq(dev, 1);
1744
1745 fsel = (readl(regs_dbsc_d + DBSC_DBPDSTAT0(0)) & 0x300) >> 8;
1746 dbsc5_clk_pll3_control(dev, fsel ? PLL3_HIGH_FREQUENCY_MODE :
1747 PLL3_LOW_FREQUENCY_MODE);
1748
1749 dbsc5_clk_set_freqchgack(dev, 1);
1750 timeout = dbsc5_clk_wait_freqchgreq(dev, 0);
1751 dbsc5_clk_set_freqchgack(dev, 0);
1752
1753 if (timeout) {
1754 printf("Time out\n");
1755 return -ETIMEDOUT;
1756 }
1757
1758 dbsc5_clk_wait_dbpdstat1(dev, 0x7);
1759
1760 return 0;
1761}
1762
1763/**
1764 * dbsc5_reg_write() - Write DBSC register
1765 * @addr: Destination address
1766 * @data: Setting value to be written
1767 *
1768 * Write 32bit value @data to register at @addr .
1769 */
1770static void dbsc5_reg_write(void __iomem *addr, u32 data)
1771{
1772 writel(data, addr);
1773
1774 if (((uintptr_t)addr & 0x000A0000) == 0x000A0000)
1775 writel(data, addr + 0x4000);
1776 else
1777 writel(data, addr + 0x8000);
1778}
1779
1780/**
1781 * dbsc5_reg_write() - DRAM Command Write Access
1782 * @dev: DBSC5 device
1783 * @cmd DRAM command.
1784 *
1785 * First, execute the dummy read to DBSC_DBCMD.
1786 * Confirm that no DBSC command operation is in progress 0.
1787 * Write the contents of the command to be sent to DRAM.
1788 */
1789static void dbsc5_send_dbcmd2(struct udevice *dev, u32 cmd)
1790{
1791 struct renesas_dbsc5_dram_priv *priv = dev_get_priv(dev);
1792 void __iomem *regs_dbsc_d = priv->regs + DBSC5_DBSC_D_OFFSET;
1793 u32 val;
1794 int ret;
1795
1796 /* dummy read */
1797 readl(regs_dbsc_d + DBSC_DBCMD);
1798
1799 ret = readl_poll_timeout(regs_dbsc_d + DBSC_DBWAIT, val, ((val & BIT(0)) == 0), 1000000);
1800 if (ret < 0) {
1801 printf("%s DBWAIT bit 0 timeout\n", __func__);
1802 hang();
1803 }
1804
1805 ret = readl_poll_timeout(regs_dbsc_d + DBSC_DBWAIT + 0x4000, val, ((val & BIT(0)) == 0), 1000000);
1806 if (ret < 0) {
1807 printf("%s DBWAIT + 0x4000 bit 0 timeout\n", __func__);
1808 hang();
1809 }
1810
1811 dbsc5_reg_write(regs_dbsc_d + DBSC_DBCMD, cmd);
1812}
1813
1814/**
1815 * dbsc5_reg_ddrphy_read() - Read setting from DDR PHY register
1816 * @dev: DBSC5 device
1817 * @ch: Target channel
1818 * @regadd: Destination address
1819 *
1820 * Write matching values to DBPDRGA register and read value out of DBSC_DBPDRGD.
1821 * Wait until the write process completed in each step.
1822 */
1823static u32 dbsc5_reg_ddrphy_read(struct udevice *dev, u32 ch, u32 regadd)
1824{
1825 struct renesas_dbsc5_dram_priv *priv = dev_get_priv(dev);
1826 void __iomem *regs_dbsc_d = priv->regs + DBSC5_DBSC_D_OFFSET;
1827 u32 val;
1828 int ret;
1829
1830 writel(regadd | BIT(14), regs_dbsc_d + DBSC_DBPDRGA(ch));
1831 ret = readl_poll_timeout(regs_dbsc_d + DBSC_DBPDRGA(ch), val, (val == (regadd | BIT(15) | BIT(14))), 1000000);
1832 if (ret < 0) {
1833 printf("%s regs_dbsc_d + DBSC_DBPDRGA timeout\n", __func__);
1834 hang();
1835 }
1836
1837 val = readl(regs_dbsc_d + DBSC_DBPDRGA(ch));
1838
1839 writel(regadd | BIT(15), regs_dbsc_d + DBSC_DBPDRGA(ch));
1840 ret = readl_poll_timeout(regs_dbsc_d + DBSC_DBPDRGA(ch), val, (val == regadd), 1000000);
1841 if (ret < 0) {
1842 printf("%s regs_dbsc_d + DBSC_DBPDRGA | BIT(15) timeout\n", __func__);
1843 hang();
1844 }
1845
1846 writel(regadd | BIT(15), regs_dbsc_d + DBSC_DBPDRGA(ch));
1847 ret = readl_poll_timeout(regs_dbsc_d + DBSC_DBPDRGA(ch), val, (val == regadd), 1000000);
1848 if (ret < 0) {
1849 printf("%s regs_dbsc_d + DBSC_DBPDRGA | BIT(15) again timeout\n", __func__);
1850 hang();
1851 }
1852
1853 return readl(regs_dbsc_d + DBSC_DBPDRGD(ch));
1854}
1855
1856/**
1857 * dbsc5_reg_ddrphy_write(dev, ) - Write setting to DDR PHY register
1858 * @dev: DBSC5 device
1859 * @ch: Target channel
1860 * @regadd: Destination address
1861 * @regdata: Value to be written
1862 *
1863 * Write matching values to DBPDRGA, DBPDRGD, DBPDRGA, DBPDRGA registers.
1864 * Wait until the write process completed in each step.
1865 */
1866static void dbsc5_reg_ddrphy_write(struct udevice *dev, u32 ch, u32 regadd, u32 regdata)
1867{
1868 struct renesas_dbsc5_dram_priv *priv = dev_get_priv(dev);
1869 void __iomem *regs_dbsc_d = priv->regs + DBSC5_DBSC_D_OFFSET;
1870 u32 val;
1871 int ret;
1872
1873 writel(regadd, regs_dbsc_d + DBSC_DBPDRGA(ch));
1874 ret = readl_poll_timeout(regs_dbsc_d + DBSC_DBPDRGA(ch), val, (val == regadd), 1000000);
1875 if (ret < 0) {
1876 printf("%s regs_dbsc_d + DBSC_DBPDRGA timeout\n", __func__);
1877 hang();
1878 }
1879
1880 writel(regdata, regs_dbsc_d + DBSC_DBPDRGD(ch));
1881 ret = readl_poll_timeout(regs_dbsc_d + DBSC_DBPDRGA(ch), val, (val == (regadd | BIT(15))), 1000000);
1882 if (ret < 0) {
1883 printf("%s regs_dbsc_d + DBSC_DBPDRGD timeout\n", __func__);
1884 hang();
1885 }
1886
1887 writel(regadd | BIT(15), regs_dbsc_d + DBSC_DBPDRGA(ch));
1888 ret = readl_poll_timeout(regs_dbsc_d + DBSC_DBPDRGA(ch), val, (val == regadd), 1000000);
1889 if (ret < 0) {
1890 printf("%s regs_dbsc_d + DBSC_DBPDRGA | BIT(15) timeout\n", __func__);
1891 hang();
1892 }
1893
1894 writel(regadd, regs_dbsc_d + DBSC_DBPDRGA(ch));
1895}
1896
1897/*
1898 * dbsc5_reg_ddrphy_write_all() - Write setting from DDR PHY register for all channels
1899 * @dev: DBSC5 device
1900 * @regadd: Destination address
1901 * @regdata: Value to be written
1902 *
1903 * Wrapper around dbsc5_reg_ddrphy_write() for all channels.
1904 */
1905static void dbsc5_reg_ddrphy_write_all(struct udevice *dev, u32 regadd, u32 regdata)
1906{
1907 u32 ch;
1908
1909 r_foreach_vch(dev, ch)
1910 dbsc5_reg_ddrphy_write(dev, ch, regadd, regdata);
1911}
1912
1913/**
1914 * dbsc5_reg_ddrphy_masked_write() - Write setting to DDR PHY register with mask
1915 * @dev: DBSC5 device
1916 * @ch: Target channel
1917 * @regadd: Destination address
1918 * @regdata: Value to be written
1919 * @msk: Register mask
1920 *
1921 * Wrapper around dbsc5_reg_ddrphy_write() with DBPDRGM set.
1922 */
1923static void dbsc5_reg_ddrphy_masked_write(struct udevice *dev, u32 ch, u32 regadd, u32 regdata, u32 msk)
1924{
1925 struct renesas_dbsc5_dram_priv *priv = dev_get_priv(dev);
1926 void __iomem *regs_dbsc_d = priv->regs + DBSC5_DBSC_D_OFFSET;
1927 u32 val;
1928 int ret;
1929
1930 writel(msk, regs_dbsc_d + DBSC_DBPDRGM(ch));
1931 ret = readl_poll_timeout(regs_dbsc_d + DBSC_DBPDRGM(ch), val, (val == msk), 1000000);
1932 if (ret < 0) {
1933 printf("%s regs_dbsc_d + DBSC_DBPDRGM timeout\n", __func__);
1934 hang();
1935 }
1936
1937 dbsc5_reg_ddrphy_write(dev, ch, regadd, regdata);
1938
1939 writel(0, regs_dbsc_d + DBSC_DBPDRGM(ch));
1940 ret = readl_poll_timeout(regs_dbsc_d + DBSC_DBPDRGM(ch), val, (val == 0), 1000000);
1941 if (ret < 0) {
1942 printf("%s regs_dbsc_d + DBSC_DBPDRGM != 0 timeout\n", __func__);
1943 hang();
1944 }
1945}
1946
1947/**
1948 * dbsc5_ddr_setval_slice() - Write setting to DDR PHY hardware
1949 * @dev: DBSC5 device
1950 * @ch: Target channel
1951 * @slice: Target slice
1952 * @regdef: Encoded PHY/PI register and bitfield
1953 * @val: Value to be written
1954 *
1955 * Calculate the bit field in which to write the setting value
1956 * from encoded register and bitfield @regdef parameter. Call
1957 * dbsc5_reg_ddrphy_masked_write() to write the value to hardware.
1958 */
1959static void dbsc5_ddr_setval_slice(struct udevice *dev, u32 ch, u32 slice, u32 regdef, u32 val)
1960{
1961 const u32 adr = DDR_REGDEF_ADR(regdef) + (0x100 * slice);
1962 const u32 len = DDR_REGDEF_LEN(regdef);
1963 const u32 lsb = DDR_REGDEF_LSB(regdef);
1964 const u32 msk = (len == 32) ? 0xffffffff : ((BIT(len) - 1) << lsb);
1965 const u32 dms = ~((!!(msk & BIT(24)) << 3) | (!!(msk & BIT(16)) << 2) |
1966 (!!(msk & BIT(8)) << 1) | !!(msk & BIT(0))) & 0xf;
1967
1968 dbsc5_reg_ddrphy_masked_write(dev, ch, adr, val << lsb, dms);
1969}
1970
1971/*
1972 * dbsc5_ddr_setval() - Write setting from DDR PHY hardware slice 0
1973 * @dev: DBSC5 device
1974 * @ch: Target channel
1975 * @regdef: Encoded PHY/PI register and bitfield
1976 * @val: Value to be written
1977 *
1978 * Wrapper around dbsc5_ddr_setval_slice() for slice 0.
1979 */
1980static void dbsc5_ddr_setval(struct udevice *dev, u32 ch, u32 regdef, u32 val)
1981{
1982 dbsc5_ddr_setval_slice(dev, ch, 0, regdef, val);
1983}
1984
1985/*
1986 * dbsc5_ddr_setval_all_ch_slice() - Write setting from DDR PHY hardware for all channels and one slice
1987 * @dev: DBSC5 device
1988 * @slice: Target slice
1989 * @regdef: Encoded PHY/PI register and bitfield
1990 * @val: Value to be written
1991 *
1992 * Wrapper around dbsc5_ddr_setval_slice() for slice 0.
1993 */
1994static void dbsc5_ddr_setval_all_ch_slice(struct udevice *dev, u32 slice, u32 regdef, u32 val)
1995{
1996 u32 ch;
1997
1998 r_foreach_vch(dev, ch)
1999 dbsc5_ddr_setval_slice(dev, ch, slice, regdef, val);
2000}
2001
2002/*
2003 * dbsc5_ddr_setval_all_ch() - Write setting from DDR PHY hardware for all channels and slice 0
2004 * @dev: DBSC5 device
2005 * @regdef: Encoded PHY/PI register and bitfield
2006 * @val: Value to be written
2007 *
2008 * Wrapper around dbsc5_ddr_setval_all_ch_slice() for slice 0.
2009 */
2010static void dbsc5_ddr_setval_all_ch(struct udevice *dev, u32 regdef, u32 val)
2011{
2012 dbsc5_ddr_setval_all_ch_slice(dev, 0, regdef, val);
2013}
2014
2015/*
2016 * dbsc5_ddr_setval_all_ch_all_slice() - Write setting from DDR PHY hardware for all channels and all slices
2017 * @dev: DBSC5 device
2018 * @regdef: Encoded PHY/PI register and bitfield
2019 * @val: Value to be written
2020 *
2021 * Wrapper around dbsc5_ddr_setval_all_ch_slice() for slice 0.
2022 */
2023static void dbsc5_ddr_setval_all_ch_all_slice(struct udevice *dev, u32 regdef, u32 val)
2024{
2025 u32 slice;
2026
2027 for (slice = 0; slice < SLICE_CNT; slice++)
2028 dbsc5_ddr_setval_all_ch_slice(dev, slice, regdef, val);
2029}
2030
2031/**
2032 * dbsc5_ddr_getval_slice() - Read setting from DDR PHY/PI hardware
2033 * @dev: DBSC5 device
2034 * @ch: Target channel
2035 * @slice: Target slice
2036 * @regdef: Encoded PHY/PI register and bitfield
2037 *
2038 * Calculate the address and the bit-field from "regdef" value.
2039 * Call dbsc5_reg_ddrphy_read() to read value from the target address.
2040 */
2041static u32 dbsc5_ddr_getval_slice(struct udevice *dev, u32 ch, u32 slice, u32 regdef)
2042{
2043 const u32 adr = DDR_REGDEF_ADR(regdef) + (0x100 * slice);
2044 const u32 len = DDR_REGDEF_LEN(regdef);
2045 const u32 lsb = DDR_REGDEF_LSB(regdef);
2046 const u32 msk = (len == 32) ? 0xffffffff : (BIT(len) - 1);
2047
2048 return (dbsc5_reg_ddrphy_read(dev, ch, adr) >> lsb) & msk;
2049}
2050
2051/**
2052 * dbsc5_ddr_getval() - Read setting from DDR PHY/PI hardware slice 0
2053 * @dev: DBSC5 device
2054 * @ch: Target channel
2055 * @regdef: Encoded PHY/PI register and bitfield
2056 *
2057 * Wrapper around dbsc5_ddr_getval_slice() for slice 0.
2058 */
2059static u32 dbsc5_ddr_getval(struct udevice *dev, u32 ch, u32 regdef)
2060{
2061 return dbsc5_ddr_getval_slice(dev, ch, 0, regdef);
2062}
2063
2064/**
2065 * dbsc5_table_patch_set() - Modify DDR PHY/PI settings table
2066 * @tbl: DDR PHY/PI setting table pointer
2067 * @adrmsk_pi: Use wider address mask for PI register
2068 * @patch: List of modifications to the settings table
2069 * @patchlen: Length of the list of modifications to the settings table
2070 *
2071 * Calculate the target index of settings table, calculate the bit-field
2072 * to write the setting value, and write the setting value to the target
2073 * bit-field in the index.
2074 */
2075static void dbsc5_table_patch_set(u32 *tbl, const bool adrmsk_pi,
2076 const struct dbsc5_table_patch *patch,
2077 int patchlen)
2078{
2079 const u32 adrmsk = adrmsk_pi ? 0x7FF : 0xFF;
2080 u32 adr, len, lsb, msk;
2081 int i;
2082
2083 for (i = 0; i < patchlen; i++) {
2084 adr = DDR_REGDEF_ADR(patch[i].reg);
2085 len = DDR_REGDEF_LEN(patch[i].reg);
2086 lsb = DDR_REGDEF_LSB(patch[i].reg);
2087 msk = (len == 32) ? 0xffffffff : ((BIT(len) - 1) << lsb);
2088
2089 tbl[adr & adrmsk] &= ~msk;
2090 tbl[adr & adrmsk] |= (patch[i].val << lsb) & msk;
2091 }
2092}
2093
2094/**
2095 * dbsc5_ddrtbl_getval() - Read setting from DDR PHY/PI settings table
2096 * @tbl: DDR PHY/PI setting table pointer
2097 * @regdef: Encoded PHY/PI register and bitfield
2098 * @adrmsk_pi: Use wider address mask for PI register
2099 *
2100 * Calculate the target index of *tbl and the bit-field to read the
2101 * setting value and read and return the setting value from the target
2102 * bit-field in the index.
2103 */
2104static u32 dbsc5_ddrtbl_getval(const u32 *tbl, u32 regdef, bool adrmsk_pi)
2105{
2106 const u32 adrmsk = adrmsk_pi ? 0x7FF : 0xFF;
2107 const u32 adr = DDR_REGDEF_ADR(regdef);
2108 const u32 len = DDR_REGDEF_LEN(regdef);
2109 const u32 lsb = DDR_REGDEF_LSB(regdef);
2110 const u32 msk = (len == 32) ? 0xffffffff : (BIT(len) - 1);
2111
2112 return (tbl[adr & adrmsk] >> lsb) & msk;
2113}
2114
2115/**
2116 * dbsc5_f_scale() - Calculate the best value for DBSC timing setting
2117 * @priv: Driver private data
2118 * @frac: Perform fractional rounding
2119 * @ps Optimal setting value in pico second
2120 * @cyc Optimal setting value in cycle count
2121 *
2122 * Convert the optimal value in pico second to in cycle count. Optionally, if @frac is true,
2123 * perform fractional rounding. Compare the value of the result of the conversion with the
2124 * value of the argument @cyc and return the larger value.
2125 */
2126static u32 dbsc5_f_scale(struct renesas_dbsc5_dram_priv *priv, const bool frac, u32 ps, u32 cyc)
2127{
2128 const u32 mul = frac ? 8 : 800000;
2129 const u32 tmp = DIV_ROUND_UP(ps, 10UL) * priv->ddr_mbps;
2130 const u32 f_scale_div = DIV_ROUND_UP(tmp, mul * priv->ddr_mbpsdiv);
2131
2132 return (f_scale_div > cyc) ? f_scale_div : cyc;
2133}
2134
2135/**
2136 * dbsc5_f_scale_js2() - Select optimal settings based on jedec_spec2
2137 * @priv: Driver private data
2138 *
2139 * Calculate and assign each setting value of jedec_spec2 by "dbsc5_f_scale" function.
2140 * Only the following array elements are calculated using different formulas from those
2141 * described above -- JS2_tRRD/JS2_tFAW/JS2_tZQCALns/JS2_tRCpb/JS2_tRCab.
2142 */
2143static void dbsc5_f_scale_js2(struct renesas_dbsc5_dram_priv *priv)
2144{
2145 const int derate = 0;
2146 int i;
2147
2148 for (i = 0; i < JS2_TBLCNT; i++) {
2149 priv->js2[i] = dbsc5_f_scale(priv, false,
2150 jedec_spec2[derate][i].ps,
2151 jedec_spec2[derate][i].cyc);
2152 }
2153
2154 priv->js2[JS2_tZQCALns] = dbsc5_f_scale(priv, false,
2155 jedec_spec2[derate][JS2_tZQCALns].ps * 1000UL, 0);
2156 priv->js2[JS2_tDQ72DQns] = dbsc5_f_scale(priv, false,
2157 jedec_spec2[derate][JS2_tDQ72DQns].ps * 1000UL, 0);
2158 priv->js2[JS2_tCAENTns] = dbsc5_f_scale(priv, false,
2159 jedec_spec2[derate][JS2_tCAENTns].ps * 1000UL, 0);
2160 priv->js2[JS2_tRCpb] = priv->js2[JS2_tRAS] + priv->js2[JS2_tRPpb];
2161 priv->js2[JS2_tRCab] = priv->js2[JS2_tRAS] + priv->js2[JS2_tRPab];
2162 priv->js2[JS2_tRFCab] = dbsc5_f_scale(priv, false,
2163 jedec_spec2_tRFC_ab[priv->max_density] * 1000UL, 0);
2164
2165 priv->js2[JS2_tRBTP] = dbsc5_f_scale(priv, false, 7500, 2) - 2;
2166 priv->js2[JS2_tXSR] = priv->js2[JS2_tRFCab] +
2167 dbsc5_f_scale(priv, false, 7500, 2);
2168 priv->js2[JS2_tPDN] = dbsc5_f_scale(priv, false, 10000, 0) + 1;
2169 priv->js2[JS2_tPDN_DSM] = dbsc5_f_scale(priv, true,
2170 jedec_spec2[derate][JS2_tPDN_DSM].ps * 10UL, 0);
2171 priv->js2[JS2_tXSR_DSM] = dbsc5_f_scale(priv, true,
2172 jedec_spec2[derate][JS2_tXSR_DSM].ps * 10UL, 0);
2173 priv->js2[JS2_tXDSM_XP] = dbsc5_f_scale(priv, true,
2174 jedec_spec2[derate][JS2_tXDSM_XP].ps * 10UL, 0);
2175 priv->js2[JS2_tWLWCKOFF] = dbsc5_f_scale(priv, false, 14000, 5);
2176}
2177
2178/**
2179 * dbsc5_ddrtbl_calc() - Calculate JS1/JS2
2180 * @priv: Driver private data
2181 *
2182 * Determine jedec_spec1 configuration table based on priv->ddr_mbps
2183 * and priv->ddr_mbpsdiv. Calculate the value of the jedec_spec2
2184 * configuration table from priv->ddr_mbps and priv->ddr_mbpsdiv.
2185 */
2186static void dbsc5_ddrtbl_calc(struct renesas_dbsc5_dram_priv *priv)
2187{
2188 int i;
2189
2190 /* Search jedec_spec1 index */
2191 for (i = JS1_USABLEC_SPEC_LO; i < JS1_FREQ_TBL_NUM - 1; i++)
2192 if (js1[i].fx3 * 2 * priv->ddr_mbpsdiv >= priv->ddr_mbps * 3)
2193 break;
2194
2195 priv->js1_ind = max(i, JS1_USABLEC_SPEC_HI);
2196
2197 priv->RL = js1[priv->js1_ind].RLset1;
2198 priv->WL = js1[priv->js1_ind].WLsetA;
2199
2200 /* Calculate jedec_spec2 */
2201 dbsc5_f_scale_js2(priv);
2202};
2203
2204/**
2205 * dbsc5_ddrtbl_load() Load table data into DDR registers
2206 * @dev: DBSC5 device
2207 *
2208 * Copy the base configuration table to a local array. Change PI register table
2209 * settings to match priv->ddr_mbps and priv->ddr_mbpsdiv.
2210 *
2211 * If the set value vref_r is not 0, change the "Read Vref (SoC side) Training range"
2212 * setting in the configuration table.
2213 *
2214 * If the set value vref_w is not 0, change the "Write Vref (MR14, MR15) Training range"
2215 * setting in the configuration table.
2216 *
2217 * If the set value vref_ca is not 0, change the "CA Vref (MR12) Training range"
2218 * setting in the configuration table.
2219 *
2220 * If priv->ddr_mbps/priv->ddr_mbpsdiv is less than 5120,
2221 * change the contents of the PHY register setting table.
2222 * If priv->ddr_mbps/priv->ddr_mbpsdiv is less than 4576,
2223 * change the contents of the PHY register setting table.
2224 *
2225 * Reflect the contents of the configuration table in the register.
2226 */
2227static void dbsc5_ddrtbl_load(struct udevice *dev)
2228{
2229 struct renesas_dbsc5_dram_priv *priv = dev_get_priv(dev);
2230 const struct dbsc5_table_patch dbsc5_table_patch_adr_g_mbps = {
2231 PHY_CAL_INTERVAL_COUNT_0, 10000 * priv->ddr_mbps / priv->ddr_mbpsdiv / 8 / 256,
2232 };
2233
2234 const struct dbsc5_table_patch dbsc5_table_patch_pi_js[] = {
2235 { PI_WRLAT_F2, priv->WL },
2236 { PI_TWCKENL_WR_ADJ_F2, (js1[priv->js1_ind].WCKENLW * 4) + 4 },
2237 { PI_TWCKENL_RD_ADJ_F2, (js1[priv->js1_ind].WCKENLR * 4) + 4 },
2238 { PI_TWCKPRE_STATIC_F2, (js1[priv->js1_ind].WCKPRESTA * 4) },
2239 { PI_TWCKPRE_TOGGLE_RD_F2, (js1[priv->js1_ind].WCKPRETGLR) * 4 },
2240 { PI_CASLAT_F2, priv->RL },
2241 { PI_TWCKENL_FS_ADJ_F2, (js1[priv->js1_ind].WCKENLF * 4) + 4 },
2242 { PI_TRFC_F2, priv->js2[JS2_tRFCab] },
2243 { PI_WRLVL_WCKOFF_F2, (priv->js2[JS2_tWLWCKOFF]) + 3 },
2244 { PI_WRLAT_ADJ_F2, (priv->WL * 4) + 2 },
2245 { PI_TCAENT_F2, priv->js2[JS2_tCAENTns] },
2246 { PI_TVREF_LONG_F2, (priv->js2[JS2_tCAENTns]) + 1 },
2247 { PI_TVREF_SHORT_F2, (priv->js2[JS2_tCAENTns]) + 1 },
2248 { PI_TRCD_F2, priv->js2[JS2_tRCD] },
2249 { PI_TRP_F2, priv->js2[JS2_tRPab] },
2250 { PI_TRTP_F2, js1[priv->js1_ind].nRBTP },
2251 { PI_TRAS_MIN_F2, priv->js2[JS2_tRAS] },
2252 { PI_TMRD_F2, (priv->js2[JS2_tMRD]) + 1 },
2253 { PI_TSR_F2, priv->js2[JS2_tSR] },
2254 { PI_TZQCAL_F2, priv->js2[JS2_tZQCALns] },
2255 { PI_TZQLAT_F2, priv->js2[JS2_tZQLAT] },
2256 { PI_TDQ72DQ_F2, priv->js2[JS2_tDQ72DQns] },
2257 { PI_MC_TRFC_F2, priv->js2[JS2_tRFCab] },
2258 };
2259
2260 const u32 vref_r = priv->dbsc5_board_config->bdcfg_vref_r;
2261 const struct dbsc5_table_patch dbsc5_table_patch_slice_vref_r[] = {
2262 { PHY_VREF_INITIAL_START_POINT, vref_r & 0xFF },
2263 { PHY_VREF_INITIAL_STOP_POINT, (vref_r & 0xFF00) >> 8 },
2264 { PHY_VREF_INITIAL_STEPSIZE, (vref_r & 0xFF0000) >> 16 }
2265 };
2266
2267 const u32 vref_w = priv->dbsc5_board_config->bdcfg_vref_w;
2268 const struct dbsc5_table_patch dbsc5_table_patch_pi_vref_w[] = {
2269 { PI_WDQLVL_VREF_INITIAL_START_POINT_F0, vref_w & 0xff },
2270 { PI_WDQLVL_VREF_INITIAL_START_POINT_F1, vref_w & 0xff },
2271 { PI_WDQLVL_VREF_INITIAL_START_POINT_F2, vref_w & 0xff },
2272 { PI_WDQLVL_VREF_INITIAL_STOP_POINT_F0, (vref_w & 0xff00) >> 8 },
2273 { PI_WDQLVL_VREF_INITIAL_STOP_POINT_F1, (vref_w & 0xff00) >> 8 },
2274 { PI_WDQLVL_VREF_INITIAL_STOP_POINT_F2, (vref_w & 0xff00) >> 8 }
2275 };
2276
2277 const u32 vref_ca = priv->dbsc5_board_config->bdcfg_vref_ca;
2278 const struct dbsc5_table_patch dbsc5_table_patch_pi_vref_ca[] = {
2279 { PI_CALVL_VREF_INITIAL_START_POINT_F0, vref_ca & 0xff },
2280 { PI_CALVL_VREF_INITIAL_START_POINT_F1, vref_ca & 0xff },
2281 { PI_CALVL_VREF_INITIAL_START_POINT_F2, vref_ca & 0xff },
2282 { PI_CALVL_VREF_INITIAL_STOP_POINT_F0, (vref_ca & 0xff00) >> 8 },
2283 { PI_CALVL_VREF_INITIAL_STOP_POINT_F1, (vref_ca & 0xff00) >> 8 },
2284 { PI_CALVL_VREF_INITIAL_STOP_POINT_F2, (vref_ca & 0xff00) >> 8 }
2285 };
2286
2287 int i, cs, slice;
2288 u32 adr;
2289
2290 /* Prepare register tables */
2291 memcpy(priv->DDR_PHY_SLICE_REGSET, DDR_PHY_SLICE_REGSET_V4H, sizeof(DDR_PHY_SLICE_REGSET_V4H));
2292 memcpy(priv->DDR_PHY_ADR_V_REGSET, DDR_PHY_ADR_V_REGSET_V4H, sizeof(DDR_PHY_ADR_V_REGSET_V4H));
2293 memcpy(priv->DDR_PHY_ADR_G_REGSET, DDR_PHY_ADR_G_REGSET_V4H, sizeof(DDR_PHY_ADR_G_REGSET_V4H));
2294 memcpy(priv->DDR_PI_REGSET, DDR_PI_REGSET_V4H, sizeof(DDR_PI_REGSET_V4H));
2295
2296 /* Adjust PI parameters */
2297 dbsc5_table_patch_set(priv->DDR_PHY_ADR_G_REGSET, false,
2298 &dbsc5_table_patch_adr_g_mbps, 1);
2299 dbsc5_table_patch_set(priv->DDR_PI_REGSET, true,
2300 dbsc5_table_patch_pi_js,
2301 ARRAY_SIZE(dbsc5_table_patch_pi_js));
2302
2303 if (priv->ddr_mbps < (3201 * priv->ddr_mbpsdiv)) {
2304 /* 2751-3200 */
2305 dbsc5_table_patch_set(priv->DDR_PHY_SLICE_REGSET, false,
2306 dbsc5_table_patch_slice_3200,
2307 ARRAY_SIZE(dbsc5_table_patch_slice_3200));
2308 dbsc5_table_patch_set(priv->DDR_PHY_ADR_V_REGSET, false,
2309 dbsc5_table_patch_adr_v_3200,
2310 ARRAY_SIZE(dbsc5_table_patch_adr_v_3200));
2311 dbsc5_table_patch_set(priv->DDR_PI_REGSET, true,
2312 dbsc5_table_patch_pi_3200,
2313 ARRAY_SIZE(dbsc5_table_patch_pi_3200));
2314 } else if (priv->ddr_mbps < (3734 * priv->ddr_mbpsdiv)) {
2315 /* 3201-3733 */
2316 dbsc5_table_patch_set(priv->DDR_PHY_SLICE_REGSET, false,
2317 dbsc5_table_patch_slice_3733,
2318 ARRAY_SIZE(dbsc5_table_patch_slice_3733));
2319 dbsc5_table_patch_set(priv->DDR_PHY_ADR_V_REGSET, false,
2320 dbsc5_table_patch_adr_v_3733,
2321 ARRAY_SIZE(dbsc5_table_patch_adr_v_3733));
2322 dbsc5_table_patch_set(priv->DDR_PI_REGSET, true,
2323 dbsc5_table_patch_pi_3733,
2324 ARRAY_SIZE(dbsc5_table_patch_pi_3733));
2325 } else if (priv->ddr_mbps < (4268 * priv->ddr_mbpsdiv)) {
2326 /* 3734-4267 */
2327 dbsc5_table_patch_set(priv->DDR_PHY_SLICE_REGSET, false,
2328 dbsc5_table_patch_slice_4266,
2329 ARRAY_SIZE(dbsc5_table_patch_slice_4266));
2330 dbsc5_table_patch_set(priv->DDR_PHY_ADR_V_REGSET, false,
2331 dbsc5_table_patch_adr_v_4266,
2332 ARRAY_SIZE(dbsc5_table_patch_adr_v_4266));
2333 dbsc5_table_patch_set(priv->DDR_PI_REGSET, true,
2334 dbsc5_table_patch_pi_4266,
2335 ARRAY_SIZE(dbsc5_table_patch_pi_4266));
2336 } else if (priv->ddr_mbps < (4801 * priv->ddr_mbpsdiv)) {
2337 /* 4269-4800 */
2338 dbsc5_table_patch_set(priv->DDR_PHY_SLICE_REGSET, false,
2339 dbsc5_table_patch_slice_4800,
2340 ARRAY_SIZE(dbsc5_table_patch_slice_4800));
2341 dbsc5_table_patch_set(priv->DDR_PHY_ADR_V_REGSET, false,
2342 dbsc5_table_patch_adr_v_4800,
2343 ARRAY_SIZE(dbsc5_table_patch_adr_v_4800));
2344 dbsc5_table_patch_set(priv->DDR_PI_REGSET, true,
2345 dbsc5_table_patch_pi_4800,
2346 ARRAY_SIZE(dbsc5_table_patch_pi_4800));
2347 } else if (priv->ddr_mbps < (5501 * priv->ddr_mbpsdiv)) {
2348 /* 4801 - 5500 */
2349 dbsc5_table_patch_set(priv->DDR_PHY_SLICE_REGSET, false,
2350 dbsc5_table_patch_slice_5500,
2351 ARRAY_SIZE(dbsc5_table_patch_slice_5500));
2352 dbsc5_table_patch_set(priv->DDR_PHY_ADR_V_REGSET, false,
2353 dbsc5_table_patch_adr_v_5500,
2354 ARRAY_SIZE(dbsc5_table_patch_adr_v_5500));
2355 dbsc5_table_patch_set(priv->DDR_PI_REGSET, true,
2356 dbsc5_table_patch_pi_5500,
2357 ARRAY_SIZE(dbsc5_table_patch_pi_5500));
2358 } else if (priv->ddr_mbps < (6001 * priv->ddr_mbpsdiv)) {
2359 /* 5501 - 6000 */
2360 dbsc5_table_patch_set(priv->DDR_PHY_SLICE_REGSET, false,
2361 dbsc5_table_patch_slice_6000,
2362 ARRAY_SIZE(dbsc5_table_patch_slice_6000));
2363 dbsc5_table_patch_set(priv->DDR_PHY_ADR_V_REGSET, false,
2364 dbsc5_table_patch_adr_v_6000,
2365 ARRAY_SIZE(dbsc5_table_patch_adr_v_6000));
2366 dbsc5_table_patch_set(priv->DDR_PI_REGSET, true,
2367 dbsc5_table_patch_pi_6000,
2368 ARRAY_SIZE(dbsc5_table_patch_pi_6000));
2369 }
2370
2371 for (cs = 0; cs < CS_CNT; cs++) {
2372 struct dbsc5_table_patch dbsc5_table_patch_pi_mr12[] = {
2373 { PI_DARRAY3_0_CSx_Fx[cs][2], js1[priv->js1_ind].MR1 },
2374 { PI_DARRAY3_1_CSx_Fx[cs][2], js1[priv->js1_ind].MR2 },
2375 };
2376
2377 dbsc5_table_patch_set(priv->DDR_PI_REGSET, true,
2378 dbsc5_table_patch_pi_mr12,
2379 ARRAY_SIZE(dbsc5_table_patch_pi_mr12));
2380 }
2381
2382 /* Read Vref (SoC side) Training range */
2383 if (priv->dbsc5_board_config->bdcfg_vref_r) {
2384 dbsc5_table_patch_set(priv->DDR_PHY_SLICE_REGSET, false,
2385 dbsc5_table_patch_slice_vref_r,
2386 ARRAY_SIZE(dbsc5_table_patch_slice_vref_r));
2387 }
2388
2389 /* Write Vref (MR14, MR15) Training range */
2390 if (priv->dbsc5_board_config->bdcfg_vref_w) {
2391 dbsc5_table_patch_set(priv->DDR_PI_REGSET, true,
2392 dbsc5_table_patch_pi_vref_w,
2393 ARRAY_SIZE(dbsc5_table_patch_pi_vref_w));
2394 }
2395
2396 /* CA Vref (MR12) Training range */
2397 if (priv->dbsc5_board_config->bdcfg_vref_ca) {
2398 dbsc5_table_patch_set(priv->DDR_PI_REGSET, true,
2399 dbsc5_table_patch_pi_vref_ca,
2400 ARRAY_SIZE(dbsc5_table_patch_pi_vref_ca));
2401 }
2402
2403 /* Low Freq setting */
2404 if (priv->ddr_mbps < (8 * 640 * priv->ddr_mbpsdiv)) {
2405 /* CAL_CLK(10-20MHz) */
2406 dbsc5_table_patch_set(priv->DDR_PHY_SLICE_REGSET, false,
2407 &dbsc5_table_patch_slice_mbpsdiv_640, 1);
2408 dbsc5_table_patch_set(priv->DDR_PHY_ADR_V_REGSET, false,
2409 &dbsc5_table_patch_adr_v_mbpsdiv_640, 1);
2410 dbsc5_table_patch_set(priv->DDR_PHY_ADR_G_REGSET, false,
2411 &dbsc5_table_patch_adr_g_mbpsdiv_640, 1);
2412 }
2413
2414 if (priv->ddr_mbps < (8 * 572 * priv->ddr_mbpsdiv)) {
2415 /* CAL_CLK(10-20MHz) */
2416 dbsc5_table_patch_set(priv->DDR_PHY_SLICE_REGSET, false,
2417 &dbsc5_table_patch_slice_mbpsdiv_572, 1);
2418 dbsc5_table_patch_set(priv->DDR_PHY_ADR_G_REGSET, false,
2419 &dbsc5_table_patch_adr_g_mbpsdiv_572, 1);
2420 }
2421
2422 if (priv->ddr_mbps < (8 * 401 * priv->ddr_mbpsdiv)) {
2423 dbsc5_table_patch_set(priv->DDR_PHY_ADR_G_REGSET, false,
2424 dbsc5_table_patch_adr_g_mbpsdiv_400,
2425 ARRAY_SIZE(dbsc5_table_patch_adr_g_mbpsdiv_400));
2426 }
2427
2428 /* SET DATA SLICE TABLE */
2429 for (slice = 0; slice < SLICE_CNT; slice++) {
2430 adr = DDR_PHY_SLICE_REGSET_OFS_V4H + (DDR_PHY_SLICE_REGSET_SIZE_V4H * slice);
2431 for (i = 0; i < DDR_PHY_SLICE_REGSET_NUM_V4H; i++)
2432 dbsc5_reg_ddrphy_write_all(dev, adr + i, priv->DDR_PHY_SLICE_REGSET[i]);
2433 }
2434
2435 /* SET ADR SLICE TABLE */
2436 for (i = 0; i < DDR_PHY_ADR_V_REGSET_NUM_V4H; i++)
2437 dbsc5_reg_ddrphy_write_all(dev, DDR_PHY_ADR_V_REGSET_OFS_V4H + i, priv->DDR_PHY_ADR_V_REGSET[i]);
2438
2439 /* SET ADRCTRL SLICE TABLE */
2440 for (i = 0; i < DDR_PHY_ADR_G_REGSET_NUM_V4H; i++)
2441 dbsc5_reg_ddrphy_write_all(dev, DDR_PHY_ADR_G_REGSET_OFS_V4H + i, priv->DDR_PHY_ADR_G_REGSET[i]);
2442
2443 /* SET PI REGISTERS */
2444 for (i = 0; i < DDR_PI_REGSET_NUM_V4H; i++)
2445 dbsc5_reg_ddrphy_write_all(dev, DDR_PI_REGSET_OFS_V4H + i, priv->DDR_PI_REGSET[i]);
2446}
2447
2448/**
2449 * dbsc5_ddr_config() - Configure DDR registers
2450 * @dev: DBSC5 device
2451 *
2452 * Set up wiring for DQ and DM pins and VREF_DRIVING. Set the CA pin wiring
2453 * and ADR_CALVL_SWIZZLE settings. Make wiring settings for the CS pin. When
2454 * memory rank is 1, set RANK setting to 1 to disable CS training. Configure
2455 * the DATA_BYTE_SWAP setting.
2456 */
2457static void dbsc5_ddr_config(struct udevice *dev)
2458{
2459 struct renesas_dbsc5_dram_priv *priv = dev_get_priv(dev);
2460 u32 ca_swap, cs_swap, dqs_swap;
2461 u32 ch, slice;
2462
2463 r_foreach_vch(dev, ch) {
2464 /* Board settings (DQ, DM, VREF_DRIVING) */
2465 dqs_swap = priv->dbsc5_board_config->ch[ch].bdcfg_dqs_swap;
2466 for (slice = 0; slice < SLICE_CNT; slice++) {
2467 dbsc5_ddr_setval_slice(dev, ch, slice, PHY_DQ_DM_SWIZZLE0,
2468 priv->dbsc5_board_config->ch[ch].bdcfg_dq_swap[slice]);
2469 dbsc5_ddr_setval_slice(dev, ch, slice, PHY_DQ_DM_SWIZZLE1,
2470 priv->dbsc5_board_config->ch[ch].bdcfg_dm_swap[slice]);
2471 dbsc5_ddr_setval_slice(dev, ch, slice, PHY_CALVL_VREF_DRIVING_SLICE,
2472 !((dqs_swap >> (4 * slice)) & 1));
2473 }
2474 dbsc5_ddr_setval(dev, ch, PHY_DATA_BYTE_ORDER_SEL,
2475 priv->dbsc5_board_config->ch[ch].bdcfg_dqs_swap | 0x76543200);
2476
2477 /* Board settings (CA, ADDR_MUX) */
2478 ca_swap = priv->dbsc5_board_config->ch[ch].bdcfg_ca_swap;
2479
2480 /* ADDR_MUX */
2481 dbsc5_ddr_setval(dev, ch, PI_ADDR_MUX_0, ca_swap & 0xf);
2482 ca_swap >>= 4;
2483 dbsc5_ddr_setval(dev, ch, PI_ADDR_MUX_1, ca_swap & 0xf);
2484 ca_swap >>= 4;
2485 dbsc5_ddr_setval(dev, ch, PI_ADDR_MUX_2, ca_swap & 0xf);
2486 ca_swap >>= 4;
2487 dbsc5_ddr_setval(dev, ch, PI_ADDR_MUX_3, ca_swap & 0xf);
2488 ca_swap >>= 4;
2489 dbsc5_ddr_setval(dev, ch, PI_ADDR_MUX_4, ca_swap & 0xf);
2490 ca_swap >>= 4;
2491 dbsc5_ddr_setval(dev, ch, PI_ADDR_MUX_5, ca_swap & 0xf);
2492 ca_swap >>= 4;
2493 dbsc5_ddr_setval(dev, ch, PI_ADDR_MUX_6, ca_swap & 0xf);
2494 ca_swap >>= 4;
2495
2496 /* ADR_CALVL_SWIZZLE */
2497 ca_swap = priv->dbsc5_board_config->ch[ch].bdcfg_ca_swap;
2498 dbsc5_ddr_setval(dev, ch, PHY_ADR_CALVL_SWIZZLE0, ca_swap & 0x0fffffff);
2499
2500 /* Board settings (CS) */
2501 /* CKE_MUX */
2502 /* SoC CKE -> DRAM CS */
2503 cs_swap = priv->dbsc5_board_config->ch[ch].bdcfg_cs_swap;
2504 dbsc5_ddr_setval(dev, ch, PI_CKE_MUX_0, (cs_swap & 0xf) + 2);
2505 dbsc5_ddr_setval(dev, ch, PI_CKE_MUX_1, ((cs_swap >> 4) & 0xf) + 2);
2506 dbsc5_ddr_setval(dev, ch, PHY_CS_ACS_ALLOCATION_BIT2_2, (cs_swap & 0xf) + 1);
2507 dbsc5_ddr_setval(dev, ch, PHY_CS_ACS_ALLOCATION_BIT3_2, ((cs_swap >> 4) & 0xf) + 1);
2508
2509 /* Mask CS_MAP if RANK1 is not found */
2510 if (!(priv->ch_have_this_cs[1] & BIT(ch))) {
2511 dbsc5_ddr_setval(dev, ch, PHY_ADR_CALVL_RANK_CTRL, 0x0);
2512 for (slice = 0; slice < SLICE_CNT; slice++)
2513 dbsc5_ddr_setval_slice(dev, ch, slice, PHY_PER_CS_TRAINING_EN, 0x0);
2514 }
2515 }
2516
2517 r_foreach_vch(dev, ch) {
2518 /* DATA_BYTE_SWAP */
2519 dqs_swap = priv->dbsc5_board_config->ch[ch].bdcfg_dqs_swap;
2520
2521 dbsc5_ddr_setval(dev, ch, PI_DATA_BYTE_SWAP_EN, 0x1);
2522 dbsc5_ddr_setval(dev, ch, PI_DATA_BYTE_SWAP_SLICE0, dqs_swap & 0xf);
2523 dbsc5_ddr_setval(dev, ch, PI_DATA_BYTE_SWAP_SLICE1, (dqs_swap >> 4) & 0xf);
2524
2525 if (!(priv->ch_have_this_cs[1] & BIT(ch)))
2526 dbsc5_ddr_setval(dev, ch, PI_CS_MAP, 0x1);
2527 }
2528}
2529
2530/**
2531 * dbsc5_dbsc_regset_pre() - Configure primary DDR registers
2532 * @dev: DBSC5 device
2533 *
2534 * Set SDRAM type, Burst length, and PHY type. Frequency mode setting.
2535 * Write SDRAM configuration contents to registers.
2536 */
2537static void dbsc5_dbsc_regset_pre(struct udevice *dev)
2538{
2539#define DBMEMCONF_REG(d3, row, bg, bank, col, dw) \
2540 (((d3) << 30) | ((row) << 24) | ((bg) << 20) | ((bank) << 16) | ((col) << 8) | (dw))
2541#define DBMEMCONF_REGD(density) /* 16bit */ \
2542 DBMEMCONF_REG(((density) % 2), ((((density) + 1) / 2) + (28 - 2 - 2 - 10 - 1)), 2, 2, 10, 1)
2543
2544 struct renesas_dbsc5_dram_priv *priv = dev_get_priv(dev);
2545 void __iomem *regs_dbsc_a = priv->regs + DBSC5_DBSC_A_OFFSET;
2546 void __iomem *regs_dbsc_d = priv->regs + DBSC5_DBSC_D_OFFSET;
2547 u32 density;
2548 u32 ch, cs;
2549
2550 /* Primary settings */
2551 /* LPDDR5, BL=16, DFI interface */
2552 dbsc5_reg_write(regs_dbsc_d + DBSC_DBMEMKIND, 0xC);
2553 dbsc5_reg_write(regs_dbsc_a + DBSC_DBMEMKINDA, 0xC);
2554 dbsc5_reg_write(regs_dbsc_d + DBSC_DBBL, 0x2);
2555 dbsc5_reg_write(regs_dbsc_a + DBSC_DBBLA, 0x2);
2556 dbsc5_reg_write(regs_dbsc_d + DBSC_DBPHYCONF0, 0x1);
2557
2558 dbsc5_reg_write(regs_dbsc_a + DBSC_DBSYSCONF0, 0x1);
2559
2560 /* FREQRATIO=2 */
2561 dbsc5_reg_write(regs_dbsc_d + DBSC_DBSYSCONF1, 0x20000);
2562 dbsc5_reg_write(regs_dbsc_a + DBSC_DBSYSCONF1A, 0x0);
2563
2564 dbsc5_reg_write(regs_dbsc_d + DBSC_DBSYSCONF2, 0x1);
2565 dbsc5_reg_write(regs_dbsc_a + DBSC_DBSYSCONF2A, 0x241);
2566
2567 r_foreach_ech(ch) {
2568 for (cs = 0; cs < CS_CNT; cs++) {
2569 if (priv->ddr_density[ch][cs] == 0xFF) {
2570 writel(0x00, regs_dbsc_d + DBSC_DBMEMCONF(ch, cs));
2571 writel(0x00, regs_dbsc_a + DBSC_DBMEMCONFA(ch, cs));
2572 } else {
2573 density = priv->ddr_density[ch][cs];
2574 writel(DBMEMCONF_REGD(density),
2575 regs_dbsc_d + DBSC_DBMEMCONF(ch, cs));
2576 writel(DBMEMCONF_REGD(density),
2577 regs_dbsc_a + DBSC_DBMEMCONFA(ch, cs));
2578 }
2579 }
2580 }
2581}
2582
2583/**
2584 * dbsc5_dbsc_regset() - Set DBSC timing parameters
2585 * @dev: DBSC5 device
2586 *
2587 * Set the timing registers of the DBSC.
2588 * Configure Scheduler settings.
2589 */
2590static void dbsc5_dbsc_regset(struct udevice *dev)
2591{
2592 struct renesas_dbsc5_dram_priv *priv = dev_get_priv(dev);
2593 void __iomem *regs_dbsc_a = priv->regs + DBSC5_DBSC_A_OFFSET;
2594 void __iomem *regs_dbsc_d = priv->regs + DBSC5_DBSC_D_OFFSET;
2595 u32 tmp[4];
2596
2597 /* DBTR0.CL : RL */
2598 dbsc5_reg_write(regs_dbsc_d + DBSC_DBTR(0), priv->RL);
2599
2600 /* DBTR1.CWL : WL */
2601 dbsc5_reg_write(regs_dbsc_d + DBSC_DBTR(1), priv->WL);
2602
2603 /* DBTR2.AL = 0 */
2604 dbsc5_reg_write(regs_dbsc_d + DBSC_DBTR(2), 0x0);
2605
2606 /* DBTR3.TRCD: tRCD */
2607 dbsc5_reg_write(regs_dbsc_d + DBSC_DBTR(3), priv->js2[JS2_tRCD]);
2608
2609 /* DBTR4.TRPA,TRP: tRPab,tRPpb */
2610 dbsc5_reg_write(regs_dbsc_d + DBSC_DBTR(4), (priv->js2[JS2_tRPab] << 16) |
2611 priv->js2[JS2_tRPpb]);
2612
2613 /* DBTR5.TRC : tRCpb */
2614 dbsc5_reg_write(regs_dbsc_d + DBSC_DBTR(5), priv->js2[JS2_tRCpb]);
2615
2616 /* DBTR6.TRAS : tRAS */
2617 dbsc5_reg_write(regs_dbsc_d + DBSC_DBTR(6), priv->js2[JS2_tRAS]);
2618
2619 /* DBTR7.TRRD : tRRD */
2620 dbsc5_reg_write(regs_dbsc_d + DBSC_DBTR(7), ((priv->js2[JS2_tRRD] - 1) << 16) |
2621 (priv->js2[JS2_tRRD] - 1));
2622
2623 /* DBTR8.TFAW : tFAW */
2624 dbsc5_reg_write(regs_dbsc_d + DBSC_DBTR(8), priv->js2[JS2_tFAW] - 1);
2625
2626 /* DBTR9.TRDPR: nRBTP */
2627 dbsc5_reg_write(regs_dbsc_d + DBSC_DBTR(9), js1[priv->js1_ind].nRBTP);
2628
2629 /* DBTR10.TWR : nWR */
2630 dbsc5_reg_write(regs_dbsc_d + DBSC_DBTR(10), js1[priv->js1_ind].nWR);
2631
2632 /*
2633 * DBTR11.TRDWR : RL + BL/n_max + RU(tWCK2DQO(max)/tCK) +
2634 * RD(tRPST/tCK) - ODTLon - RD(tODTon(min)/tCK) + 1 + feature
2635 */
2636 dbsc5_reg_write(regs_dbsc_d + DBSC_DBTR(11),
2637 priv->RL + 4 + priv->js2[JS2_tWCK2DQO_HF] -
2638 js1[priv->js1_ind].ODTLon - priv->js2[JS2_tODTon_min]);
2639
2640 /* DBTR12.TWRRD_S : WL + BL/2 + tWTR_S, TWRRD_L : WL + BL + tWTR_L */
2641 dbsc5_reg_write(regs_dbsc_d + DBSC_DBTR(12),
2642 ((priv->WL + 2 + priv->js2[JS2_tWTR_S]) << 16) |
2643 (priv->WL + 4 + priv->js2[JS2_tWTR_L]));
2644
2645 /* DBTR13.TRFCAB : tRFCab */
2646 dbsc5_reg_write(regs_dbsc_d + DBSC_DBTR(13), priv->js2[JS2_tRFCab]);
2647
2648 /* DBTR14.TCSCAL,TCKEHDLL,tCKEH : tCSCAL,tXP,tXP */
2649 dbsc5_reg_write(regs_dbsc_d + DBSC_DBTR(14), (priv->js2[JS2_tCSCAL] << 24) |
2650 (priv->js2[JS2_tXP] << 16) |
2651 priv->js2[JS2_tXP]);
2652
2653 /* DBTR15.TESPD,TCKESR,TCKEL : tESPD = 2,tSR,tSR */
2654 dbsc5_reg_write(regs_dbsc_d + DBSC_DBTR(15), (0x02 << 24) |
2655 (priv->js2[JS2_tSR] << 16) |
2656 priv->js2[JS2_tSR]);
2657
2658 /* DBTR16 */
2659 /* wdql(tphy_wrlat + tphy_wrdata) */
2660 tmp[0] = (priv->WL * 4) - 1 + 5;
2661 /* dqenltcy(tphy_wrlat) */
2662 tmp[1] = (priv->WL * 4) - 2 - 2 + 5;
2663 /* dql(tphy_rdlat + trddata_en) RL * 4 + phy_rptr_update + phy_rddqs_latency_adjust + 39 */
2664 tmp[2] = (priv->RL * 4) +
2665 dbsc5_ddrtbl_getval(priv->DDR_PHY_SLICE_REGSET, PHY_RPTR_UPDATE, false) +
2666 dbsc5_ddrtbl_getval(priv->DDR_PHY_SLICE_REGSET, PHY_RDDQS_LATENCY_ADJUST, false) +
2667 39;
2668 /* dqienltncy(trddata_en) RL * 4 - phy_rddata_en_dly_X + 4 * phy_wck_freq_ratio_X */
2669 tmp[3] = (priv->RL * 4) + 4 -
2670 dbsc5_ddrtbl_getval(priv->DDR_PHY_SLICE_REGSET, PHY_RDDATA_EN_DLY, false);
2671 dbsc5_reg_write(regs_dbsc_d + DBSC_DBTR(16), (tmp[3] << 24) | (tmp[2] << 16) |
2672 (tmp[1] << 8) | tmp[0]);
2673
2674 /* DBTR17.TMODRD,TMOD: tMRR,tMRW */
2675 dbsc5_reg_write(regs_dbsc_d + DBSC_DBTR(17), (priv->js2[JS2_tMRR] << 24) |
2676 (priv->js2[JS2_tMRW] << 16));
2677
2678 /* DBTR18. RODTL, RODTA = 0 */
2679 dbsc5_reg_write(regs_dbsc_d + DBSC_DBTR(18), 0x0);
2680
2681 /* DBTR19. TZQCL, TZQCS = 0 */
2682 dbsc5_reg_write(regs_dbsc_d + DBSC_DBTR(19), 0x0);
2683
2684 /* DBTR20.TXSDLL, TXS : tXSR,tXSR */
2685 dbsc5_reg_write(regs_dbsc_d + DBSC_DBTR(20), ((priv->js2[JS2_tXSR]) << 16) |
2686 priv->js2[JS2_tXSR]);
2687
2688 /* DBTR21.TCCD */
2689 dbsc5_reg_write(regs_dbsc_d + DBSC_DBTR(21), (priv->ddr_tccd << 16) |
2690 (priv->ddr_tccd * 2));
2691
2692 /* DBTR22.TZQCAL,TZQLAT : tZQCAL,tZQLAT */
2693 dbsc5_reg_write(regs_dbsc_d + DBSC_DBTR(22), (priv->js2[JS2_tZQCALns] << 16) | priv->js2[JS2_tZQLAT]);
2694
2695 /* DBTR23. RRSPC = 0 */
2696 dbsc5_reg_write(regs_dbsc_d + DBSC_DBTR(23), 0x0);
2697
2698 /* DBTR24 */
2699 /* WRCSLAT(tphy_wrcslat) */
2700 tmp[0] = (priv->WL * 4) - 2;
2701 /* WRCSGAP(tphy_wrcsgap) */
2702 tmp[1] = 0x0C;
2703 /* RDCSLAT(tphy_rdcslat) */
2704 tmp[2] = priv->RL * 4;
2705 /* RDCSGAP(tphy_rdcsgap) */
2706 tmp[3] = 0x0C;
2707 dbsc5_reg_write(regs_dbsc_d + DBSC_DBTR(24), (tmp[3] << 24) | (tmp[2] << 16) |
2708 (tmp[1] << 8) | tmp[0]);
2709
2710 /* DBTR25. TWDQLVLDIS = 0 */
2711 dbsc5_reg_write(regs_dbsc_d + DBSC_DBTR(25), 0x0);
2712
2713 /* DBTR26. TWCK2DQOOSC,TDQSOSC : WCK2DQI interval timer run time, WCK2DQO interval timer run time */
2714 dbsc5_reg_write(regs_dbsc_d + DBSC_DBTR(26), 0x0);
2715
2716 /* DBTR27.TPDN : tPDN */
2717 dbsc5_reg_write(regs_dbsc_d + DBSC_DBTR(27), priv->js2[JS2_tPDN]);
2718
2719 /* DBTR28.txsrdsm : tXSR_DSM */
2720 dbsc5_reg_write(regs_dbsc_d + DBSC_DBTR(28), priv->js2[JS2_tXSR_DSM]);
2721
2722 /* DBTR29.tdsmxp : tXDSM_XP */
2723 dbsc5_reg_write(regs_dbsc_d + DBSC_DBTR(29), priv->js2[JS2_tXDSM_XP]);
2724
2725 /* DBTR30.TCMDPD : tCMDPD = 3 */
2726 dbsc5_reg_write(regs_dbsc_d + DBSC_DBTR(30), 0x3);
2727
2728 /* DBTR31.TWCK2DQOMAX,TWCK2DQIMAX : tWCK2DQI/O_HF/LF */
2729 dbsc5_reg_write(regs_dbsc_d + DBSC_DBTR(31), (priv->js2[JS2_tWCK2DQO_HF] << 4) |
2730 priv->js2[JS2_tWCK2DQI_HF]);
2731
2732 /* DBTR32 */
2733 /* twckenr */
2734 tmp[0] = (js1[priv->js1_ind].WCKENLR * 4) + 4 - 1;
2735 /* twckenw */
2736 tmp[1] = (js1[priv->js1_ind].WCKENLW * 4) + 4 - 1;
2737 /* twckenlf */
2738 tmp[2] = (js1[priv->js1_ind].WCKENLF * 4) + 4;
2739 /* twckpresta */
2740 tmp[3] = js1[priv->js1_ind].WCKPRESTA * 4;
2741 dbsc5_reg_write(regs_dbsc_d + DBSC_DBTR(32), (tmp[3] << 24) | (tmp[2] << 16) |
2742 (tmp[1] << 8) | tmp[0]);
2743
2744 /* DBTR33 */
2745 /* TWCKTGL */
2746 tmp[0] = 4;
2747 /* TWCKDIS (RL+ bl/n_max) * 4 + RU(tWCKPST/tWCK) : tWCKPST = 2.5(MR10[3:2]) */
2748 tmp[1] = ((priv->RL + 4) * 4) + 3;
2749 dbsc5_reg_write(regs_dbsc_d + DBSC_DBTR(33), (tmp[1] << 8) | tmp[0]);
2750
2751 /* DBTR34 */
2752 /* TWCKSUS = 4 */
2753 tmp[0] = 4;
2754 /* TWCKPST RU(tWCKPST/tCK) : tWCKPST=2.5(MR10[3:2]) */
2755 tmp[1] = 1;
2756 dbsc5_reg_write(regs_dbsc_d + DBSC_DBTR(34), (tmp[1] << 8) | tmp[0]);
2757
2758 /* DBTR35 */
2759 /* TRD2WCKOFF RL + BL/n_max + RD(tWCKPST/tCK) + 1 */
2760 tmp[0] = priv->RL + 4 + 0 + 1;
2761 /* TWR2WCKOFF WL + BL/n_max + RD(tWCKPST/tCK) + 1 */
2762 tmp[1] = priv->WL + 4 + 0 + 1;
2763 dbsc5_reg_write(regs_dbsc_d + DBSC_DBTR(35), (tmp[1] << 16) | tmp[0]);
2764
2765 /* DBTR36 */
2766 /* TWSSUSWRX : CAS(WCKSUS)WRX */
2767 tmp[0] = 3;
2768 /* TWSOFFWRX : CAS(WS_OFF)WRX */
2769 tmp[1] = 3;
2770 /* TWSFSWRX : CAS(WS_FS)WRX */
2771 tmp[2] = 2;
2772 dbsc5_reg_write(regs_dbsc_d + DBSC_DBTR(36), (tmp[2] << 16) | (tmp[1] << 8) | tmp[0]);
2773
2774 /* DBTR37 */
2775 /* tOSCO */
2776 dbsc5_reg_write(regs_dbsc_d + DBSC_DBTR(37), priv->js2[JS2_tOSCODQI]);
2777
2778 /* DBRNK2 */
2779 /* RNKRR = 12 */
2780 dbsc5_reg_write(regs_dbsc_d + DBSC_DBRNK(2), 0xCC);
2781
2782 /* DBRNK3 */
2783 /* RNKRW = 6 */
2784 dbsc5_reg_write(regs_dbsc_d + DBSC_DBRNK(3), 0x66);
2785
2786 /* DBRNK4 */
2787 /* RNKWR = 6 */
2788 dbsc5_reg_write(regs_dbsc_d + DBSC_DBRNK(4), 0x66);
2789
2790 /* DBRNK5 */
2791 /* RNKWW = 14 */
2792 dbsc5_reg_write(regs_dbsc_d + DBSC_DBRNK(5), 0xEE);
2793
2794 /* Timing registers for Scheduler */
2795 /* SCFCTST0 */
2796 /* SCPREACT */
2797 tmp[0] = priv->js2[JS2_tRPpb] * priv->bus_clk * priv->ddr_mbpsdiv * 8UL /
2798 priv->ddr_mbps / priv->bus_clkdiv;
2799 /* SCACTRDWR */
2800 tmp[1] = (priv->WL + 2 + 1 + js1[priv->js1_ind].nWR + priv->js2[JS2_tRPpb]) *
2801 priv->bus_clk * priv->ddr_mbpsdiv * 8UL /
2802 priv->ddr_mbps / priv->bus_clkdiv;
2803 /* SCRDACRT */
2804 tmp[2] = ((js1[priv->js1_ind].nRBTP + 2) + priv->js2[JS2_tRPpb]) *
2805 priv->bus_clk * priv->ddr_mbpsdiv * 8UL /
2806 priv->ddr_mbps / priv->bus_clkdiv;
2807 /* SCACTACT */
2808 tmp[3] = priv->js2[JS2_tRCpb] * priv->bus_clk * priv->ddr_mbpsdiv * 8UL /
2809 priv->ddr_mbps / priv->bus_clkdiv;
2810 dbsc5_reg_write(regs_dbsc_a + DBSC_DBSCHFCTST0, (tmp[3] << 24) | (tmp[2] << 16) |
2811 (tmp[1] << 8) | tmp[0]);
2812
2813 /* SCFCTST1 */
2814 /* SCASYNCOFS */
2815 tmp[0] = 12;
2816 /* SCACTRDWR */
2817 tmp[1] = priv->js2[JS2_tRCD] * priv->bus_clk * priv->ddr_mbpsdiv * 8UL /
2818 priv->ddr_mbps / priv->bus_clkdiv;
2819 /* SCWRRD */
2820 tmp[2] = (readl(regs_dbsc_d + DBSC_DBTR(12)) & 0xFF) * priv->bus_clk * priv->ddr_mbpsdiv * 8UL /
2821 priv->ddr_mbps / priv->bus_clkdiv;
2822 /* SCRDWR */
2823 tmp[3] = (readl(regs_dbsc_d + DBSC_DBTR(11)) & 0xFF) * priv->bus_clk * priv->ddr_mbpsdiv * 8UL /
2824 priv->ddr_mbps / priv->bus_clkdiv;
2825 dbsc5_reg_write(regs_dbsc_a + DBSC_DBSCHFCTST1, (tmp[3] << 24) | (tmp[2] << 16) |
2826 (tmp[1] << 8) | tmp[0]);
2827
2828 /* DBSCHRW1 */
2829 /* SCTRFCAB */
2830 tmp[0] = (priv->js2[JS2_tRFCab] + priv->js2[JS2_tZQLAT]) *
2831 priv->bus_clk * priv->ddr_mbpsdiv * 8UL /
2832 priv->ddr_mbps / priv->bus_clkdiv;
2833 dbsc5_reg_write(regs_dbsc_a + DBSC_DBSCHRW1, tmp[0]);
2834
2835 /* DBSCHTR0 */
2836 /* SCDT0 */
2837 tmp[0] = (4 * priv->bus_clk * priv->ddr_mbpsdiv * 8UL /
2838 priv->ddr_mbps / priv->bus_clkdiv) - 1;
2839 /* SCDT1 */
2840 tmp[1] = (8 * priv->bus_clk * priv->ddr_mbpsdiv * 8UL /
2841 priv->ddr_mbps / priv->bus_clkdiv) - 1;
2842 /* SCDT2 */
2843 tmp[2] = (12 * priv->bus_clk * priv->ddr_mbpsdiv * 8UL /
2844 priv->ddr_mbps / priv->bus_clkdiv) - 1;
2845 /* SCDT3 */
2846 tmp[3] = (16 * priv->bus_clk * priv->ddr_mbpsdiv * 8UL /
2847 priv->ddr_mbps / priv->bus_clkdiv) - 1;
2848 dbsc5_reg_write(regs_dbsc_a + DBSC_DBSCHTR0, (tmp[3] << 24) | (tmp[2] << 16) |
2849 (tmp[1] << 8) | tmp[0]);
2850
2851 /* QOS and CAM */
2852 dbsc5_reg_write(regs_dbsc_a + DBSC_DBBCAMDIS, 0x1);
2853}
2854
2855/**
2856 * dbsc5_dbsc_regset_post() - Set DBSC registers
2857 * @dev: DBSC5 device
2858 *
2859 * If memory rank is 2, CS_TRAINING_EN is set to the other side.
2860 * Configure DBI read/write settings. Execute DRAM refresh settings.
2861 * Set WTmode of DFI PHY to OFF. Set up PHY Periodic Write DQ training.
2862 * Set WTmode of DFI PHY to ON. Calibration settings for PHY PAD.
2863 * Set SDRAM calibration. Make DFI Control Update Setting settings.
2864 * In the case of WARM_BOOT, cancel the self-refresh setting.
2865 * Enable SDRAM auto refresh. Set up PHY Periodic Write DQ training.
2866 * Enable access to SDRAM.
2867 */
2868static void dbsc5_dbsc_regset_post(struct udevice *dev)
2869{
2870 struct renesas_dbsc5_dram_priv *priv = dev_get_priv(dev);
2871 void __iomem *regs_dbsc_a = priv->regs + DBSC5_DBSC_A_OFFSET;
2872 void __iomem *regs_dbsc_d = priv->regs + DBSC5_DBSC_D_OFFSET;
2873 /* Average periodic refresh interval/Average Refresh Interval [ns] */
2874 const u32 dbsc_refint = 1920;
2875 /* 0: Average interval is REFINT, 1: Average interval is 1/2 REFINT */
2876 const u32 dbsc_refints = 0;
2877 /* Periodic-WriteDQ/ReadDQ Training Interval [us] */
2878 const u32 periodic_training_interval = 20000;
2879 u32 phymster_req_interval;
2880 u32 ch, slice;
2881 u32 clk_count;
2882 u32 refcycle;
2883 u32 ctrl_clk;
2884 u32 reg;
2885
2886 if ((renesas_get_cpu_rev_integer() < 3) && priv->ch_have_this_cs[1]) {
2887 r_foreach_vch(dev, ch) {
2888 for (slice = 0; slice < SLICE_CNT; slice++) {
2889 dbsc5_ddr_setval_slice(dev, ch, slice,
2890 PHY_PER_CS_TRAINING_EN,
2891 0x0);
2892 }
2893 }
2894 }
2895
2896 dbsc5_reg_write(regs_dbsc_d + DBSC_DBDBICNT, 0x3);
2897
2898 /* set REFCYCLE */
2899 refcycle = dbsc_refint * priv->ddr_mbps / 8000 / priv->ddr_mbpsdiv;
2900 /* refpmax=8 */
2901 dbsc5_reg_write(regs_dbsc_d + DBSC_DBRFCNF1, (refcycle & 0xFFFF) | BIT(19));
2902 /* refpmin=1 */
2903 dbsc5_reg_write(regs_dbsc_d + DBSC_DBRFCNF2, dbsc_refints | BIT(16));
2904
2905 dbsc5_reg_write(regs_dbsc_d + DBSC_DBDFIPMSTRCNF, 0x0);
2906
2907 /* Periodic-WriteDQ Training setting */
2908 dbsc5_ddr_setval_all_ch(dev, PI_WDQLVL_EN_F2, 0x3);
2909 dbsc5_ddr_setval_all_ch(dev, PI_WDQLVL_VREF_EN, 0x0);
2910 dbsc5_ddr_setval_all_ch_all_slice(dev, PHY_DATA_DC_WDQLVL_ENABLE, 0x0);
2911 dbsc5_ddr_setval_all_ch(dev, PI_WDQLVL_PERIODIC, 0x1);
2912
2913 /* Periodic-ReadDQ Training setting */
2914 dbsc5_ddr_setval_all_ch(dev, PI_RDLVL_EN_F2, 0x3);
2915 dbsc5_ddr_setval_all_ch(dev, PI_RDLVL_VREF_EN_F2, 0x0);
2916 dbsc5_ddr_setval_all_ch_all_slice(dev, PHY_RDLVL_DLY_STEP, 0x4);
2917 dbsc5_ddr_setval_all_ch(dev, PI_RDLVL_PERIODIC, 0x1);
2918
2919 /* DFI_PHYMSTR_ACK , WTmode = b'01 */
2920 dbsc5_reg_write(regs_dbsc_d + DBSC_DBDFIPMSTRCNF, 0x11);
2921
2922 /* periodic SoC zqcal enable */
2923 reg = dbsc5_ddrtbl_getval(priv->DDR_PHY_ADR_G_REGSET, PHY_CAL_MODE_0, false);
2924 dbsc5_ddr_setval_all_ch(dev, PHY_CAL_MODE_0, reg | BIT(1));
2925
2926 /* Periodic dram zqcal enable */
2927 dbsc5_reg_write(regs_dbsc_d + DBSC_DBCALCNF, 0x1000010);
2928
2929 /* Periodic phy ctrl update enable */
2930 dbsc5_reg_write(regs_dbsc_d + DBSC_DBDFICUPDCNF, 0x504C0001);
2931
2932 /* Set Auto Refresh */
2933 dbsc5_reg_write(regs_dbsc_d + DBSC_DBRFEN, 0x1);
2934
2935 /* Periodic-WriteDQ/ReadDQ Training Interval setting */
2936 phymster_req_interval = periodic_training_interval - 3000;
2937 clk_count = 1024 - (dbsc5_ddrtbl_getval(priv->DDR_PI_REGSET, PI_LONG_COUNT_MASK, true) * 32);
2938 ctrl_clk = priv->ddr_mbps / priv->ddr_mbpsdiv / 8;
2939 reg = phymster_req_interval * ctrl_clk / clk_count;
2940
2941 dbsc5_ddr_setval_all_ch(dev, PI_WDQLVL_INTERVAL, reg);
2942
2943 /* DRAM access enable */
2944 dbsc5_reg_write(regs_dbsc_a + DBSC_DBACEN, 0x1);
2945}
2946
2947/**
2948 * dbsc5_pi_training() - Training by PI
2949 * @dev: DBSC5 device
2950 *
2951 * Enable WCK signal training and read gate training. Start PI training.
2952 * After DFI initialization for all channels is once turned off, turned
2953 * on all chennels of it. Power down the DRAM device once and then release
2954 * the power down mode. Perform training in low frequency mode and training
2955 * in high frequency mode. Wait for the DFI training completion status
2956 * bit to stand until the time limit. Turn off DFI initialization for all
2957 * channels. Turn off WTMODE of DFI PHY. Check if CA/CS Training has failed.
2958 * Check if Wrlvl training is in error. If an error can be confirmed from
2959 * the check result, the result is returned as a return value. Clear the
2960 * status register for PI training.
2961 */
2962static u32 dbsc5_pi_training(struct udevice *dev)
2963{
2964 struct renesas_dbsc5_dram_priv *priv = dev_get_priv(dev);
2965 void __iomem *regs_dbsc_d = priv->regs + DBSC5_DBSC_D_OFFSET;
2966 const int retry_max = 0x10000;
2967 u32 ca_training_ng = 0;
2968 u32 wr_training_ng = 0;
2969 u32 phytrainingok = 0;
2970 u32 complete_ng = 0;
2971 bool frqchg_req;
2972 u32 ch, reg;
2973 int retry;
2974 int ret;
2975
2976 /* Init start */
2977 dbsc5_ddr_setval_all_ch(dev, PI_RDLVL_GATE_EN_F2, 0x0);
2978 dbsc5_ddr_setval_all_ch(dev, PI_WRDCM_LVL_EN_F2, 0x0);
2979 dbsc5_ddr_setval_all_ch(dev, PI_DRAMDCA_LVL_EN_F2, 0x0);
2980 dbsc5_ddr_setval_all_ch(dev, PI_RDLVL_EN_F2, 0x0);
2981 dbsc5_ddr_setval_all_ch(dev, PI_WDQLVL_EN_F2, 0x0);
2982 dbsc5_ddr_setval_all_ch(dev, PI_DFS_INITIALIZATION_SEQ_9, 0x0);
2983 dbsc5_ddr_setval_all_ch(dev, PI_DFS_INITIALIZATION_SEQ_10, 0x0);
2984
2985 /* PI_START */
2986 dbsc5_ddr_setval_all_ch(dev, PI_START, 0x1);
2987
2988 r_foreach_vch(dev, ch)
2989 writel(0x20, regs_dbsc_d + DBSC_DBDFICNT(ch));
2990
2991 r_foreach_vch(dev, ch)
2992 writel(0x21, regs_dbsc_d + DBSC_DBDFICNT(ch));
2993
2994 /* Dummy PDE */
2995 dbsc5_send_dbcmd2(dev, 0x8840000);
2996
2997 /* PDX */
2998 dbsc5_send_dbcmd2(dev, 0x8840001);
2999
3000 /* Wait init_complete */
3001 for (retry = 0; retry < retry_max; retry++) {
3002 frqchg_req = false;
3003 for (ch = 0; ch < DRAM_CH_CNT; ch++) {
3004 if (!((~phytrainingok & priv->ddr_phyvalid) & BIT(ch)))
3005 continue;
3006
3007 if (!(readl(regs_dbsc_d + DBSC_DBPDSTAT0(ch)) & BIT(0)))
3008 continue;
3009
3010 frqchg_req = true;
3011 break;
3012 }
3013
3014 if (frqchg_req) {
3015 ret = dbsc5_clk_pll3_freq(dev);
3016 if (ret)
3017 break;
3018 } else {
3019 r_foreach_vch(dev, ch) {
3020 if (readl(regs_dbsc_d + DBSC_DBDFISTAT(ch)) & BIT(0))
3021 phytrainingok |= BIT(ch);
3022 }
3023
3024 if (phytrainingok == priv->ddr_phyvalid)
3025 break;
3026 }
3027 }
3028
3029 /*
3030 * dbdficnt0:
3031 * dfi_dram_clk_disable=0
3032 * dfi_frequency = 0
3033 * freq_ratio = 10 (4:1)
3034 * init_start =0
3035 */
3036 r_foreach_vch(dev, ch)
3037 writel(0x20, regs_dbsc_d + DBSC_DBDFICNT(ch));
3038
3039 /* DFI_PHYMSTR_ACK */
3040 dbsc5_reg_write(regs_dbsc_d + DBSC_DBDFIPMSTRCNF, 0x1);
3041
3042 /* Error check */
3043 r_foreach_vch(dev, ch) {
3044 /* CA/CS Training Error Check */
3045 /* PI_CALVL_ERROR_BIT */
3046 reg = dbsc5_ddr_getval(dev, ch, PI_INT_STATUS) & BIT(4);
3047 /* Error on decrement/increment pass */
3048 reg |= dbsc5_ddr_getval(dev, ch, PHY_ADR_CALVL_OBS1) & (0x3 << 30);
3049 /* Start outside of initial search range */
3050 reg |= dbsc5_ddr_getval(dev, ch, PHY_ADR_CALVL_OBS2) & (0x3 << 24);
3051 /* CSlvl error */
3052 reg |= dbsc5_ddr_getval(dev, ch, PHY_CSLVL_OBS1) & (0xF << 28);
3053 if (reg) {
3054 ca_training_ng |= BIT(ch);
3055 printf("%s pi_training_error:1\n", __func__);
3056 }
3057
3058 /* Wrlvl Error Check */
3059 /* PI_WRLVL_ERROR_BIT */
3060 reg = dbsc5_ddr_getval(dev, ch, PI_INT_STATUS) & BIT(3);
3061 /* SLICE0 wrlvl error */
3062 reg |= dbsc5_ddr_getval_slice(dev, ch, 0, PHY_WRLVL_STATUS_OBS) & BIT(12);
3063 /* SLICE1 wrlvl error */
3064 reg |= dbsc5_ddr_getval_slice(dev, ch, 1, PHY_WRLVL_STATUS_OBS) & BIT(12);
3065 /* SLICE0 wrlvl error */
3066 reg |= dbsc5_ddr_getval_slice(dev, ch, 0, PHY_WRLVL_ERROR_OBS);
3067 /* SLICE1 wrlvl error */
3068 reg |= dbsc5_ddr_getval_slice(dev, ch, 1, PHY_WRLVL_ERROR_OBS);
3069 if (reg) {
3070 wr_training_ng |= BIT(ch);
3071 printf("%s pi_training_error:2\n", __func__);
3072 }
3073 }
3074
3075 complete_ng = (wr_training_ng | ca_training_ng);
3076 if (complete_ng)
3077 return ~complete_ng;
3078
3079 /* PI_INT_ACK assert */
3080 r_foreach_vch(dev, ch) {
3081 dbsc5_ddr_setval(dev, ch, PI_INT_ACK_0, 0xFFFFFFFF);
3082 dbsc5_ddr_setval(dev, ch, PI_INT_ACK_1, 0x7);
3083 }
3084
3085 return phytrainingok;
3086}
3087
3088/**
3089 * dbsc5_write_leveling_adjust() - Write Leveling Cycle Adjust
3090 * @dev: DBSC5 device
3091 *
3092 * Get delay value from the result write leveling of slice 0 and 1.
3093 * Calculate latency of dfi_wrdata_en / dfi_wrdata / dfi_wrdata_mask
3094 * signals based on delay values.
3095 */
3096static void dbsc5_write_leveling_adjust(struct udevice *dev)
3097{
3098 u32 result_hard0, result_hard1;
3099 u32 avg, avg_frac, avg_cycle;
3100 u32 ch;
3101
3102 r_foreach_vch(dev, ch) {
3103 /* SLICE0 */
3104 result_hard0 = dbsc5_ddr_getval_slice(dev, ch, 0, PHY_WRLVL_HARD0_DELAY_OBS);
3105 result_hard1 = dbsc5_ddr_getval_slice(dev, ch, 0, PHY_WRLVL_HARD1_DELAY_OBS);
3106
3107 avg = result_hard0 + result_hard1;
3108 if (result_hard0 > result_hard1)
3109 avg += 0x400;
3110 avg /= 2;
3111
3112 avg_frac = avg & 0xFF;
3113 avg_cycle = (avg >> 8) & 0x3;
3114
3115 if (avg_cycle == 0x3) {
3116 dbsc5_ddr_setval_slice(dev, ch, 0, PHY_WRITE_PATH_LAT_DEC, 0x1);
3117 dbsc5_ddr_setval_slice(dev, ch, 0, PHY_WRITE_PATH_LAT_ADD, 0x0);
3118 } else {
3119 dbsc5_ddr_setval_slice(dev, ch, 0, PHY_WRITE_PATH_LAT_DEC, 0x0);
3120 dbsc5_ddr_setval_slice(dev, ch, 0, PHY_WRITE_PATH_LAT_ADD, avg_cycle);
3121 }
3122 dbsc5_ddr_setval_slice(dev, ch, 0, PHY_WRITE_PATH_LAT_FRAC, avg_frac);
3123
3124 /* SLICE1 */
3125 result_hard0 = dbsc5_ddr_getval_slice(dev, ch, 1, PHY_WRLVL_HARD0_DELAY_OBS);
3126 result_hard1 = dbsc5_ddr_getval_slice(dev, ch, 1, PHY_WRLVL_HARD1_DELAY_OBS);
3127
3128 avg = result_hard0 + result_hard1;
3129 if (result_hard0 >= result_hard1)
3130 avg += 0x400;
3131 avg /= 2;
3132 avg_frac = avg & 0xFF;
3133 avg_cycle = (avg >> 8) & 0x3;
3134
3135 if (avg_cycle == 0x3) {
3136 dbsc5_ddr_setval_slice(dev, ch, 1, PHY_WRITE_PATH_LAT_DEC, 0x1);
3137 dbsc5_ddr_setval_slice(dev, ch, 1, PHY_WRITE_PATH_LAT_ADD, 0x0);
3138 } else {
3139 dbsc5_ddr_setval_slice(dev, ch, 1, PHY_WRITE_PATH_LAT_DEC, 0x0);
3140 dbsc5_ddr_setval_slice(dev, ch, 1, PHY_WRITE_PATH_LAT_ADD, avg_cycle);
3141 }
3142 dbsc5_ddr_setval_slice(dev, ch, 1, PHY_WRITE_PATH_LAT_FRAC, avg_frac);
3143 }
3144
3145 dbsc5_ddr_setval_all_ch_all_slice(dev, SC_PHY_WCK_CALC, 0x1);
3146}
3147
3148/**
3149 * dbsc5_wl_gt_training() - Re-run Write Leveling & Read Gate Training
3150 * @dev: DBSC5 device
3151 *
3152 * Set CA leveling OFF, read gate leveling ON, write gate leveling ON,
3153 * PI dram wck training ON. Perform PI_DFS configuration. Start PI
3154 * frequency training in manual mode. Perform training in high-frequency
3155 * mode. Check for Write leveling Error and Gate leveling Error. If an
3156 * error is identified, the resulting value is inverted and returned.
3157 * Clear the PI status register.
3158 */
3159static u32 dbsc5_wl_gt_training(struct udevice *dev)
3160{
3161 struct renesas_dbsc5_dram_priv *priv = dev_get_priv(dev);
3162 const int retry_max = 0x10000;
3163 u32 gt_training_ng = 0;
3164 u32 wr_training_ng = 0;
3165 u32 phytrainingok = 0;
3166 u32 complete_ng = 0;
3167 int retry, ret;
3168 u32 ch, reg;
3169
3170 dbsc5_ddr_setval_all_ch(dev, PI_CALVL_EN_F2, 0x0);
3171 dbsc5_ddr_setval_all_ch(dev, PI_RDLVL_GATE_EN_F2, 0x1);
3172
3173 dbsc5_ddr_setval_all_ch(dev, PI_DFS_ENTRY_SEQ_0, 0x181F0000);
3174 dbsc5_ddr_setval_all_ch(dev, PI_DFS_INITIALIZATION_SEQ_1, 0x0);
3175 dbsc5_ddr_setval_all_ch(dev, PI_TRAIN_ALL_FREQ_REQ, 0x1);
3176
3177 /* Freq Change High to High*/
3178 ret = dbsc5_clk_pll3_freq(dev);
3179 if (ret)
3180 return ret;
3181
3182 for (retry = 0; retry < retry_max; retry++) {
3183 r_foreach_vch(dev, ch)
3184 if (dbsc5_ddr_getval(dev, ch, PI_INT_STATUS) & BIT(0))
3185 phytrainingok |= BIT(ch);
3186
3187 if (phytrainingok == priv->ddr_phyvalid)
3188 break;
3189 }
3190
3191 /* Error Check */
3192 r_foreach_vch(dev, ch) {
3193 /* Wrlvl Error Check */
3194 /* PI_WRLVL_ERROR_BIT */
3195 reg = dbsc5_ddr_getval(dev, ch, PI_INT_STATUS) & BIT(3);
3196 /* SLICE0 wrlvl error */
3197 reg |= dbsc5_ddr_getval_slice(dev, ch, 0, PHY_WRLVL_STATUS_OBS) & BIT(12);
3198 /* SLICE1 wrlvl error */
3199 reg |= dbsc5_ddr_getval_slice(dev, ch, 1, PHY_WRLVL_STATUS_OBS) & BIT(12);
3200 /* SLICE0 wrlvl error */
3201 reg |= dbsc5_ddr_getval_slice(dev, ch, 0, PHY_WRLVL_ERROR_OBS);
3202 /* SLICE1 wrlvl error */
3203 reg |= dbsc5_ddr_getval_slice(dev, ch, 1, PHY_WRLVL_ERROR_OBS);
3204 if (reg) {
3205 wr_training_ng |= BIT(ch);
3206 printf("%s wl_gt_training_error:1\n", __func__);
3207 }
3208
3209 /* Gtlvl Error Check */
3210 /* PI_RDLVL_GATE_ERROR_BIT */
3211 reg = dbsc5_ddr_getval(dev, ch, PI_INT_STATUS) & BIT(2);
3212 /* SLICE0 delay setup error */
3213 reg |= dbsc5_ddr_getval_slice(dev, ch, 0, PHY_GTLVL_STATUS_OBS) & (0x3 << 7);
3214 /* SLICE1 delay setup error */
3215 reg |= dbsc5_ddr_getval_slice(dev, ch, 1, PHY_GTLVL_STATUS_OBS) & (0x3 << 7);
3216 if (reg) {
3217 gt_training_ng |= BIT(ch);
3218 printf("%s wl_gt_training_error:2\n", __func__);
3219 }
3220 }
3221
3222 complete_ng = (wr_training_ng | gt_training_ng);
3223 if (complete_ng)
3224 return ~complete_ng;
3225
3226 /* PI_INT_ACK assert */
3227 r_foreach_vch(dev, ch) {
3228 dbsc5_ddr_setval(dev, ch, PI_INT_ACK_0, 0xFFFFFFFF);
3229 dbsc5_ddr_setval(dev, ch, PI_INT_ACK_1, 0x7);
3230 }
3231
3232 return phytrainingok;
3233}
3234
3235/**
3236 * dbsc5_pi_int_ack_0_assert() - Training handshake functions
3237 * @dev: DBSC5 device
3238 * @bit: Status bit to poll
3239 *
3240 * Wait for the status bit specified in the argument to become 1 until the
3241 * time limit. After checking status bits on all channels, clear the target
3242 * status bits and returns the result of the check as the return value.
3243 */
3244static u32 dbsc5_pi_int_ack_0_assert(struct udevice *dev, u32 bit)
3245{
3246 struct renesas_dbsc5_dram_priv *priv = dev_get_priv(dev);
3247 const int retry_max = 0x10000;
3248 u32 ch, phytrainingok = 0;
3249 int retry;
3250
3251 for (retry = 0; retry < retry_max; retry++) {
3252 r_foreach_vch(dev, ch)
3253 if (dbsc5_ddr_getval(dev, ch, PI_INT_STATUS) & BIT(bit))
3254 phytrainingok |= BIT(ch);
3255
3256 if (phytrainingok == priv->ddr_phyvalid)
3257 break;
3258 }
3259
3260 if (phytrainingok != priv->ddr_phyvalid)
3261 return phytrainingok;
3262
3263 r_foreach_vch(dev, ch)
3264 dbsc5_ddr_setval(dev, ch, PI_INT_ACK_0, BIT(bit));
3265
3266 return phytrainingok;
3267}
3268
3269/**
3270 * dbsc5_write_dca() - Write DCA Training
3271 * @dev: DBSC5 device
3272 *
3273 * Get DCA Training CS0 Flip-0 training results for RANK0.
3274 * Get DCA Training CS1 Flip-0 training results for RANK0.
3275 * Calculate DRAMDCA settings from training results and write
3276 * them to registers. Set DRAM DCA in MR30. Ensure that the
3277 * training has been successfully completed. Clear CA status
3278 * to 0.
3279 */
3280static void dbsc5_write_dca(struct udevice *dev)
3281{
3282 struct renesas_dbsc5_dram_priv *priv = dev_get_priv(dev);
3283 const int retry_max = 0x10000;
3284 u32 phytrainingok = 0;
3285 u32 ch, reg;
3286 int retry;
3287
3288 dbsc5_ddr_setval_all_ch_all_slice(dev, PHY_DATA_DC_CAL_START, 0x1);
3289
3290 for (retry = 0; retry < retry_max; retry++) {
3291 r_foreach_vch(dev, ch) {
3292 reg = dbsc5_ddr_getval_slice(dev, ch, 0, PHY_DATA_DC_CAL_START) |
3293 dbsc5_ddr_getval_slice(dev, ch, 1, PHY_DATA_DC_CAL_START);
3294 if (!reg)
3295 phytrainingok |= BIT(ch);
3296 }
3297
3298 if (phytrainingok == priv->ddr_phyvalid)
3299 break;
3300 }
3301}
3302
3303/**
3304 * dbsc5_dramdca_training() - DRAM DCA Training and Calculations
3305 * @dev: DBSC5 device
3306 *
3307 * Get DCA Training CS0 Flip-0 training results for RANK0.
3308 * Get DCA Training CS1 Flip-0 training results for RANK0.
3309 * Calculate DRAMDCA settings from training results and write
3310 * them to registers. Set DRAM DCA in MR30. Ensure that the
3311 * training has been successfully completed. Clear CA status
3312 * to 0.
3313 */
3314static u32 dbsc5_dramdca_training(struct udevice *dev)
3315{
3316 struct renesas_dbsc5_dram_priv *priv = dev_get_priv(dev);
3317 const u32 rank = priv->ch_have_this_cs[1] ? 0x3 : 0x1;
3318 const u32 mr30_conv[16] = {
3319 0x8, 0x7, 0x6, 0x5, 0x4, 0x3, 0x2, 0x1,
3320 0x0, 0x9, 0xA, 0xB, 0xC, 0xD, 0xE, 0xF
3321 };
3322 u32 dca_result_l_0[DRAM_CH_CNT][CS_CNT];
3323 u32 dca_result_u_0[DRAM_CH_CNT][CS_CNT];
3324 u32 dca_result_l_1[DRAM_CH_CNT][CS_CNT];
3325 u32 dca_result_u_1[DRAM_CH_CNT][CS_CNT];
3326 u32 ch, phytrainingok, reg;
3327 u32 tempu, templ;
3328
3329 /* Run DRAM DCA Training for Flip-0 */
3330 dbsc5_ddr_setval_all_ch(dev, PI_DCMLVL_CS_SW, rank);
3331
3332 /* DRAMDCA go */
3333 dbsc5_ddr_setval_all_ch(dev, PI_DRAMDCA_LVL_REQ, 0x1);
3334
3335 /* PI_INT_ACK assert */
3336 phytrainingok = dbsc5_pi_int_ack_0_assert(dev, 28);
3337 if (phytrainingok != priv->ddr_phyvalid)
3338 return phytrainingok;
3339
3340 /* Result for DRAMDCA flip-0 */
3341 r_foreach_vch(dev, ch) {
3342 reg = dbsc5_ddr_getval(dev, ch, PI_DARRAY3_20_CS0_F2);
3343 dca_result_u_0[ch][0] = mr30_conv[reg >> 4];
3344 dca_result_l_0[ch][0] = mr30_conv[reg & 0xF];
3345 if (!(rank & 0x2))
3346 continue;
3347
3348 reg = dbsc5_ddr_getval(dev, ch, PI_DARRAY3_20_CS1_F2);
3349 dca_result_u_0[ch][1] = mr30_conv[reg >> 4];
3350 dca_result_l_0[ch][1] = mr30_conv[reg & 0xF];
3351 }
3352
3353 /* Run DRAM DCA Training for Flip-1 */
3354 dbsc5_ddr_setval_all_ch(dev, PI_DRAMDCA_FLIP_MASK, 0x1);
3355 dbsc5_ddr_setval_all_ch(dev, PI_DRAMDCA_LVL_ACTIVE_SEQ_2, 0x0);
3356 dbsc5_ddr_setval_all_ch(dev, PI_DRAMDCA_LVL_ACTIVE_SEQ_3, 0x0);
3357 dbsc5_ddr_setval_all_ch(dev, PI_DRAMDCA_LVL_ACTIVE_SEQ_4, 0x0);
3358
3359 /* DRAMDCA go */
3360 dbsc5_ddr_setval_all_ch(dev, PI_DRAMDCA_LVL_REQ, 0x1);
3361
3362 /* PI_INT_ACK assert */
3363 phytrainingok = dbsc5_pi_int_ack_0_assert(dev, 28);
3364 if (phytrainingok != priv->ddr_phyvalid)
3365 return phytrainingok;
3366
3367 /* Result for DRAMDCA flip-1 */
3368 r_foreach_vch(dev, ch) {
3369 reg = dbsc5_ddr_getval(dev, ch, PI_DARRAY3_20_CS0_F2);
3370 dca_result_u_1[ch][0] = mr30_conv[reg >> 4];
3371 dca_result_l_1[ch][0] = mr30_conv[reg & 0xF];
3372 if (!(rank & 0x2))
3373 continue;
3374
3375 reg = dbsc5_ddr_getval(dev, ch, PI_DARRAY3_20_CS1_F2);
3376 dca_result_u_1[ch][1] = mr30_conv[reg >> 4];
3377 dca_result_l_1[ch][1] = mr30_conv[reg & 0xF];
3378 }
3379
3380 /* Calculate and set DRAMDCA value */
3381 r_foreach_vch(dev, ch) {
3382 /* CS0 */
3383 tempu = (dca_result_u_0[ch][0] + dca_result_u_1[ch][0]) / 2;
3384 templ = (dca_result_l_0[ch][0] + dca_result_l_1[ch][0]) / 2;
3385 reg = (mr30_conv[tempu] << 4) | mr30_conv[templ];
3386 dbsc5_ddr_setval(dev, ch, PI_DARRAY3_20_CS0_F2, reg);
3387 if (!(rank & 0x2))
3388 continue;
3389
3390 /* CS1 */
3391 tempu = (dca_result_u_0[ch][1] + dca_result_u_1[ch][1]) / 2;
3392 templ = (dca_result_l_0[ch][1] + dca_result_l_1[ch][1]) / 2;
3393 reg = (mr30_conv[tempu] << 4) | mr30_conv[templ];
3394 dbsc5_ddr_setval(dev, ch, PI_DARRAY3_20_CS1_F2, reg);
3395 }
3396
3397 /* Set DRAMDCA value in MR30 */
3398 dbsc5_ddr_setval_all_ch(dev, PI_SW_SEQ_0, 0x1A11E14);
3399 dbsc5_ddr_setval_all_ch(dev, PI_SW_SEQ_1, 0x1F0000);
3400 dbsc5_ddr_setval_all_ch(dev, PI_SEQ_DEC_SW_CS, rank);
3401 dbsc5_ddr_setval_all_ch(dev, PI_SW_SEQ_START, 0x1);
3402
3403 /* PI_INT_ACK assert */
3404 phytrainingok = dbsc5_pi_int_ack_0_assert(dev, 19);
3405 if (phytrainingok != priv->ddr_phyvalid)
3406 return phytrainingok;
3407
3408 dbsc5_ddr_setval_all_ch(dev, PI_SEQ_DEC_SW_CS, 0x0);
3409 dbsc5_ddr_setval_all_ch(dev, PI_DRAMDCA_FLIP_MASK, 0x2);
3410 dbsc5_ddr_setval_all_ch(dev, PI_DRAMDCA_LVL_ACTIVE_SEQ_2, 0x1101FC);
3411 dbsc5_ddr_setval_all_ch(dev, PI_DRAMDCA_LVL_ACTIVE_SEQ_3, 0x211A00);
3412 dbsc5_ddr_setval_all_ch(dev, PI_DRAMDCA_LVL_ACTIVE_SEQ_4, 0x51500);
3413
3414 return phytrainingok;
3415}
3416
3417/**
3418 * dbsc5_write_leveling() - Re-run Write Leveling
3419 * @dev: DBSC5 device
3420 *
3421 * CALVL training is set to OFF, WRDCM training is set to OFF, and DRAMDCA
3422 * training is set to OFF. Set the memory rank for the Write leveling target
3423 * and start leveling. Wait until leveling is complete.
3424 *
3425 * Check for Write leveling errors. If an error is confirmed to have occurred,
3426 * the result is returned as a return value. Clear the PI status bit.
3427 */
3428static u32 dbsc5_write_leveling(struct udevice *dev)
3429{
3430 struct renesas_dbsc5_dram_priv *priv = dev_get_priv(dev);
3431 const u32 rank = priv->ch_have_this_cs[1] ? 0x3 : 0x1;
3432 const int retry_max = 0x10000;
3433 u32 wr_training_ng = 0;
3434 u32 phytrainingok = 0;
3435 u32 ch, reg;
3436 int retry;
3437
3438 dbsc5_ddr_setval_all_ch(dev, PI_CALVL_EN_F2, 0x0);
3439 dbsc5_ddr_setval_all_ch(dev, PI_WRDCM_LVL_EN_F2, 0x0);
3440 dbsc5_ddr_setval_all_ch(dev, PI_DRAMDCA_LVL_EN_F2, 0x0);
3441 dbsc5_ddr_setval_all_ch(dev, PI_WRLVL_CS_SW, rank);
3442 dbsc5_ddr_setval_all_ch(dev, PI_WRLVL_REQ, 0x1);
3443
3444 for (retry = 0; retry < retry_max; retry++) {
3445 r_foreach_vch(dev, ch)
3446 if (dbsc5_ddr_getval(dev, ch, PI_INT_STATUS) & BIT(29))
3447 phytrainingok |= BIT(ch);
3448
3449 if (phytrainingok == priv->ddr_phyvalid)
3450 break;
3451 }
3452
3453 /* Error check */
3454 r_foreach_vch(dev, ch) {
3455 /* Wrlvl Error Check */
3456 /* PI_WRLVL_ERROR_BIT */
3457 reg = dbsc5_ddr_getval(dev, ch, PI_INT_STATUS) & BIT(3);
3458 /* SLICE0 wrlvl error */
3459 reg |= dbsc5_ddr_getval_slice(dev, ch, 0, PHY_WRLVL_STATUS_OBS) & BIT(12);
3460 /* SLICE1 wrlvl error */
3461 reg |= dbsc5_ddr_getval_slice(dev, ch, 1, PHY_WRLVL_STATUS_OBS) & BIT(12);
3462 /* SLICE0 wrlvl error */
3463 reg |= dbsc5_ddr_getval_slice(dev, ch, 0, PHY_WRLVL_ERROR_OBS);
3464 /* SLICE1 wrlvl error */
3465 reg |= dbsc5_ddr_getval_slice(dev, ch, 1, PHY_WRLVL_ERROR_OBS);
3466 if (reg) {
3467 wr_training_ng |= BIT(ch);
3468 printf("%s write_leveling_error:1\n", __func__);
3469 }
3470 }
3471
3472 if (wr_training_ng)
3473 return ~wr_training_ng;
3474
3475 /* PI_INT_ACK assert */
3476 r_foreach_vch(dev, ch) {
3477 dbsc5_ddr_setval(dev, ch, PI_INT_ACK_0, 0xFFFFFFFF);
3478 dbsc5_ddr_setval(dev, ch, PI_INT_ACK_1, 0x7);
3479 }
3480
3481 return phytrainingok;
3482}
3483
3484/**
3485 * dbsc5_manual_write_dca() - Manual Write DCA Training
3486 * @dev: DBSC5 device
3487 *
3488 * Write DCA training according to memory rank.
3489 */
3490static void dbsc5_manual_write_dca(struct udevice *dev)
3491{
3492 struct renesas_dbsc5_dram_priv *priv = dev_get_priv(dev);
3493 const u32 rank = priv->ch_have_this_cs[1] ? 0x2 : 0x1;
3494 u32 slv_dly_center[DRAM_CH_CNT][CS_CNT][SLICE_CNT];
3495 u32 slv_dly_center_cyc;
3496 u32 slv_dly_center_dly;
3497 u32 slv_dly_min[DRAM_CH_CNT][SLICE_CNT];
3498 u32 slv_dly_max[DRAM_CH_CNT][SLICE_CNT];
3499 u32 slv_dly_min_tmp[DRAM_CH_CNT][CS_CNT][SLICE_CNT];
3500 u32 slv_dly_max_tmp[DRAM_CH_CNT][CS_CNT][SLICE_CNT];
3501 u32 phy_dcc_code_min[DRAM_CH_CNT][SLICE_CNT];
3502 u32 phy_dcc_code_max[DRAM_CH_CNT][SLICE_CNT];
3503 u32 phy_dcc_code_mid;
3504 const int retry_max = 0x10000;
3505 const u8 ratio_min_div = 0xA;
3506 const u8 ratio_max_div = 0x2;
3507 const u8 ratio_min = 0x6;
3508 const u8 ratio_max = 0x3;
3509 u32 ch, cs, slice, tmp;
3510 u32 complete = 0;
3511 int i, retry;
3512
3513 r_foreach_vch(dev, ch) {
3514 for (slice = 0; slice < SLICE_CNT; slice++) {
3515 phy_dcc_code_min[ch][slice] = 0x7F;
3516 phy_dcc_code_max[ch][slice] = 0x0;
3517 }
3518 }
3519
3520 for (cs = 0; cs < rank; cs++) {
3521 dbsc5_ddr_setval_all_ch_all_slice(dev, PHY_PER_CS_TRAINING_INDEX, cs);
3522 r_foreach_vch(dev, ch) {
3523 for (slice = 0; slice < SLICE_CNT; slice++) {
3524 slv_dly_center[ch][cs][slice] =
3525 dbsc5_ddr_getval_slice(dev, ch, slice, PHY_CLK_WRDQS_SLAVE_DELAY);
3526 slv_dly_center_cyc = slv_dly_center[ch][cs][slice] & 0x180;
3527 slv_dly_center_dly = slv_dly_center[ch][cs][slice] & 0x7F;
3528 slv_dly_min_tmp[ch][cs][slice] =
3529 slv_dly_center_cyc |
3530 (slv_dly_center_dly * ratio_min / ratio_min_div);
3531 slv_dly_max_tmp[ch][cs][slice] = slv_dly_center_cyc;
3532 if ((slv_dly_center_dly * ratio_max) > (0x7F * ratio_max_div))
3533 slv_dly_max_tmp[ch][cs][slice] |= 0x7F;
3534 else
3535 slv_dly_max_tmp[ch][cs][slice] |= slv_dly_center_dly * ratio_max / ratio_max_div;
3536 }
3537 }
3538 }
3539
3540 r_foreach_vch(dev, ch) {
3541 for (slice = 0; slice < SLICE_CNT; slice++) {
3542 if (rank == 0x2) {
3543 if (slv_dly_max_tmp[ch][0][slice] < slv_dly_max_tmp[ch][1][slice])
3544 slv_dly_max[ch][slice] = slv_dly_max_tmp[ch][1][slice];
3545 else
3546 slv_dly_max[ch][slice] = slv_dly_max_tmp[ch][0][slice];
3547
3548 if (slv_dly_min_tmp[ch][0][slice] < slv_dly_min_tmp[ch][1][slice])
3549 slv_dly_min[ch][slice] = slv_dly_min_tmp[ch][0][slice];
3550 else
3551 slv_dly_min[ch][slice] = slv_dly_min_tmp[ch][1][slice];
3552 } else {
3553 slv_dly_max[ch][slice] = slv_dly_max_tmp[ch][0][slice];
3554 slv_dly_min[ch][slice] = slv_dly_min_tmp[ch][0][slice];
3555 }
3556 }
3557 }
3558
3559 for (i = 0; i <= 0x7F; i++) {
3560 r_foreach_vch(dev, ch) {
3561 for (slice = 0; slice < SLICE_CNT; slice++) {
3562 if (slv_dly_max[ch][slice] < (slv_dly_min[ch][slice] + i)) {
3563 complete |= BIT(ch) << (8 * slice);
3564 } else {
3565 /* CS0/1 same setting, Need masked write */
3566 dbsc5_ddr_setval_slice(dev, ch, slice,
3567 PHY_CLK_WRDQS_SLAVE_DELAY,
3568 slv_dly_min[ch][slice] + i);
3569 dbsc5_ddr_setval_slice(dev, ch, slice, SC_PHY_WCK_CALC, 0x1);
3570 dbsc5_ddr_setval(dev, ch, SC_PHY_MANUAL_UPDATE, 0x1);
3571 }
3572 }
3573 }
3574
3575 if (complete == (priv->ddr_phyvalid | (priv->ddr_phyvalid << 8)))
3576 break;
3577
3578 /* Execute write dca */
3579 r_foreach_vch(dev, ch)
3580 for (slice = 0; slice < SLICE_CNT; slice++)
3581 if (!(((complete >> (8 * slice)) >> ch) & 0x1))
3582 dbsc5_ddr_setval_slice(dev, ch, slice, PHY_DATA_DC_CAL_START, 0x1);
3583
3584 r_foreach_vch(dev, ch) {
3585 for (slice = 0; slice < SLICE_CNT; slice++) {
3586 if (!(((complete >> (8 * slice)) >> ch) & 0x1)) {
3587 for (retry = 0; retry < retry_max; retry++) {
3588 tmp = dbsc5_ddr_getval_slice(dev, ch, slice,
3589 PHY_DATA_DC_CAL_START);
3590 if (!tmp)
3591 break;
3592 }
3593 }
3594 }
3595 }
3596
3597 r_foreach_vch(dev, ch) {
3598 for (slice = 0; slice < SLICE_CNT; slice++) {
3599 if ((slv_dly_min[ch][slice] + i) > slv_dly_max[ch][slice])
3600 continue;
3601
3602 tmp = (dbsc5_ddr_getval_slice(dev, ch, slice, PHY_DATA_DC_DQS_CLK_ADJUST));
3603 if ((tmp >> 6) == 0x1)
3604 tmp = 0x0;
3605 else if ((tmp >> 6) == 0x2)
3606 tmp = 0x3F;
3607
3608 if (tmp < phy_dcc_code_min[ch][slice])
3609 phy_dcc_code_min[ch][slice] = tmp;
3610
3611 if (phy_dcc_code_max[ch][slice] < tmp)
3612 phy_dcc_code_max[ch][slice] = tmp;
3613 }
3614 }
3615 }
3616
3617 dbsc5_ddr_setval_all_ch_all_slice(dev, PHY_PER_CS_TRAINING_MULTICAST_EN, 0x0);
3618 for (cs = 0; cs < rank; cs++) {
3619 dbsc5_ddr_setval_all_ch_all_slice(dev, PHY_PER_CS_TRAINING_INDEX, cs);
3620 r_foreach_vch(dev, ch) {
3621 for (slice = 0; slice < SLICE_CNT; slice++) {
3622 dbsc5_ddr_setval_slice(dev, ch, slice,
3623 PHY_CLK_WRDQS_SLAVE_DELAY,
3624 slv_dly_center[ch][cs][slice]);
3625 dbsc5_ddr_setval_slice(dev, ch, slice,
3626 SC_PHY_WCK_CALC, 0x1);
3627 dbsc5_ddr_setval(dev, ch, SC_PHY_MANUAL_UPDATE, 0x1);
3628 }
3629 }
3630 }
3631 dbsc5_ddr_setval_all_ch_all_slice(dev, PHY_PER_CS_TRAINING_MULTICAST_EN, 0x1);
3632
3633 r_foreach_vch(dev, ch) {
3634 for (slice = 0; slice < SLICE_CNT; slice++) {
3635 phy_dcc_code_mid = (phy_dcc_code_min[ch][slice] +
3636 phy_dcc_code_max[ch][slice]) / 2;
3637 dbsc5_ddr_setval_slice(dev, ch, slice,
3638 PHY_DATA_DC_DQS_CLK_ADJUST,
3639 phy_dcc_code_mid);
3640 }
3641 }
3642}
3643
3644/**
3645 * dbsc5_read_gate_training() - Re-run read gate training by PI
3646 * @dev: DBSC5 device
3647 *
3648 * Write leveling set to OFF, read gate leveling set to ON. Set memory rank
3649 * for leveling target, turn on read gate leveling. Wait for leveling to be
3650 * completed until the time limit. Check for errors during gate leveling.
3651 *
3652 * If an error is confirmed to have occurred, the result is returned as a
3653 * return value. Clear the PI status register.
3654 */
3655static u32 dbsc5_read_gate_training(struct udevice *dev)
3656{
3657 struct renesas_dbsc5_dram_priv *priv = dev_get_priv(dev);
3658 const u32 rank = priv->ch_have_this_cs[1] ? 0x3 : 0x1;
3659 const int retry_max = 0x10000;
3660 u32 gt_training_ng = 0;
3661 u32 phytrainingok = 0;
3662 u32 ch, reg;
3663 int retry;
3664
3665 dbsc5_ddr_setval_all_ch(dev, PI_WRLVL_EN_F2, 0x0);
3666 dbsc5_ddr_setval_all_ch(dev, PI_RDLVL_GATE_EN_F2, 0x1);
3667 dbsc5_ddr_setval_all_ch(dev, PI_RDLVL_CS_SW, rank);
3668 dbsc5_ddr_setval_all_ch(dev, PI_RDLVL_GATE_REQ, 0x1);
3669
3670 for (retry = 0; retry < retry_max; retry++) {
3671 r_foreach_vch(dev, ch)
3672 if (dbsc5_ddr_getval(dev, ch, PI_INT_STATUS) & BIT(24))
3673 phytrainingok |= BIT(ch);
3674
3675 if (phytrainingok == priv->ddr_phyvalid)
3676 break;
3677 }
3678
3679 /* Error Check */
3680 r_foreach_vch(dev, ch) {
3681 /* Gtlvl Error Check */
3682 /* PI_RDLVL_GATE_ERROR_BIT */
3683 reg = (dbsc5_ddr_getval(dev, ch, PI_INT_STATUS) & BIT(2));
3684 /* SLICE0 delay setup error */
3685 reg |= dbsc5_ddr_getval_slice(dev, ch, 0, PHY_GTLVL_STATUS_OBS) & (0x3 << 7);
3686 /* SLICE1 delay setup error */
3687 reg |= dbsc5_ddr_getval_slice(dev, ch, 1, PHY_GTLVL_STATUS_OBS) & (0x3 << 7);
3688 if (reg) {
3689 gt_training_ng |= BIT(ch);
3690 printf("%s read_gate_training_error\n", __func__);
3691 }
3692 }
3693
3694 if (gt_training_ng)
3695 return ~gt_training_ng;
3696
3697 /* PI_INT_ACK assert */
3698 r_foreach_vch(dev, ch) {
3699 dbsc5_ddr_setval(dev, ch, PI_INT_ACK_0, 0xFFFFFFFF);
3700 dbsc5_ddr_setval(dev, ch, PI_INT_ACK_1, 0x7);
3701 }
3702
3703 return phytrainingok;
3704}
3705
3706/**
3707 * dbsc5_read_vref_training() - Read Data Training with VREF Training
3708 * @dev: DBSC5 device
3709 *
3710 * Set reading leveling to ON and Vref leveling of reading to OFF.
3711 * Set Vref reading training to OFF. Get start value, end value and
3712 * number of steps for Vref training. Determine the optimal VREFSEL
3713 * value while increasing the Vref training setpoint by the starting
3714 * value+step value.
3715 */
3716static u32 dbsc5_read_vref_training(struct udevice *dev)
3717{
3718 struct renesas_dbsc5_dram_priv *priv = dev_get_priv(dev);
3719 const u32 rank = priv->ch_have_this_cs[1] ? 0x3 : 0x1;
3720 u32 best_dvw_min_byte0, best_dvw_min_byte1;
3721 u32 dvw_min_byte0_table[DRAM_CH_CNT][128];
3722 u32 dvw_min_byte1_table[DRAM_CH_CNT][128];
3723 u32 dvw_min_byte0[DRAM_CH_CNT] = { 0 };
3724 u32 dvw_min_byte1[DRAM_CH_CNT] = { 0 };
3725 u32 best_lower_vref, best_upper_vref;
3726 u32 best_vref_byte0, best_vref_byte1;
3727 u32 vref_start, vref_stop, vref_step;
3728 u32 best_vref_byte0_index = 0;
3729 u32 best_vref_byte1_index = 0;
3730 const int retry_max = 0x10000;
3731 u32 win_byte0, win_byte1;
3732 u32 phytrainingok = 0;
3733 u32 vref_stop_index;
3734 u32 temple, tempte;
3735 u32 best_thrshld;
3736 u32 vref_outlier;
3737 u32 outlier_cnt;
3738 u32 curr_rank;
3739 int i, retry;
3740 u32 obs_sel;
3741 u32 ch, reg;
3742
3743 dbsc5_ddr_setval_all_ch(dev, PI_RDLVL_EN_F2, 0x3);
3744 dbsc5_ddr_setval_all_ch(dev, PI_RDLVL_VREF_EN_F0, 0x0);
3745 dbsc5_ddr_setval_all_ch(dev, PI_RDLVL_VREF_EN_F1, 0x0);
3746 dbsc5_ddr_setval_all_ch(dev, PI_RDLVL_VREF_EN_F2, 0x0);
3747 dbsc5_ddr_setval_all_ch_all_slice(dev, PHY_VREF_TRAINING_CTRL, 0x0);
3748
3749 /* ch0 vref_point */
3750 vref_start = dbsc5_ddr_getval(dev, 0, PHY_VREF_INITIAL_START_POINT);
3751 vref_stop = dbsc5_ddr_getval(dev, 0, PHY_VREF_INITIAL_STOP_POINT);
3752 vref_step = dbsc5_ddr_getval(dev, 0, PHY_VREF_INITIAL_STEPSIZE);
3753 vref_stop_index = (vref_stop - vref_start) / vref_step;
3754
3755 if (vref_stop_index > 0x80)
3756 return 0;
3757
3758 for (i = 0; i <= vref_stop_index; i++) {
3759 r_foreach_vch(dev, ch) {
3760 reg = dbsc5_ddr_getval_slice(dev, ch, 0, PHY_PAD_VREF_CTRL_DQ);
3761 reg &= 0xF << 10;
3762 dbsc5_ddr_setval_slice(dev, ch, 0, PHY_PAD_VREF_CTRL_DQ,
3763 reg | BIT(9) | (vref_start + (vref_step * i)));
3764 reg = dbsc5_ddr_getval_slice(dev, ch, 1, PHY_PAD_VREF_CTRL_DQ);
3765 reg &= 0xF << 10;
3766 dbsc5_ddr_setval_slice(dev, ch, 1, PHY_PAD_VREF_CTRL_DQ,
3767 reg | BIT(9) | (vref_start + (vref_step * i)));
3768 }
3769
3770 for (curr_rank = 0; curr_rank < rank; curr_rank++) {
3771 /* All ch Read Training Start */
3772 dbsc5_ddr_setval_all_ch(dev, PI_RDLVL_CS_SW, BIT(curr_rank));
3773 dbsc5_ddr_setval_all_ch(dev, PI_RDLVL_REQ, 0x1);
3774
3775 phytrainingok = 0;
3776 for (retry = 0; retry < retry_max; retry++) {
3777 r_foreach_vch(dev, ch)
3778 if (dbsc5_ddr_getval(dev, ch, PI_INT_STATUS) & BIT(25))
3779 phytrainingok |= BIT(ch);
3780
3781 if (phytrainingok == priv->ddr_phyvalid)
3782 break;
3783 }
3784
3785 /* Read Training End */
3786 dbsc5_ddr_setval_all_ch(dev, PI_INT_ACK_0, BIT(25));
3787
3788 r_foreach_vch(dev, ch) {
3789 /* minimum Data Valid Window for each VREF */
3790 dvw_min_byte0[ch] = 0xFFFFFFFF;
3791 dvw_min_byte1[ch] = 0xFFFFFFFF;
3792 for (obs_sel = 0x0; obs_sel < 0x19; obs_sel++) {
3793 if (!((obs_sel < 0x11) || (obs_sel == 0x18)))
3794 continue;
3795
3796 dbsc5_ddr_setval_slice(dev, ch, 0,
3797 PHY_RDLVL_RDDQS_DQ_OBS_SELECT,
3798 obs_sel);
3799 dbsc5_ddr_setval_slice(dev, ch, 1,
3800 PHY_RDLVL_RDDQS_DQ_OBS_SELECT,
3801 obs_sel);
3802
3803 temple = dbsc5_ddr_getval_slice(dev, ch, 0,
3804 PHY_RDLVL_RDDQS_DQ_LE_DLY_OBS);
3805 tempte = dbsc5_ddr_getval_slice(dev, ch, 0,
3806 PHY_RDLVL_RDDQS_DQ_TE_DLY_OBS);
3807 if (tempte > temple)
3808 win_byte0 = tempte - temple;
3809 else
3810 win_byte0 = 0;
3811
3812 temple = dbsc5_ddr_getval_slice(dev, ch, 1,
3813 PHY_RDLVL_RDDQS_DQ_LE_DLY_OBS);
3814 tempte = dbsc5_ddr_getval_slice(dev, ch, 1,
3815 PHY_RDLVL_RDDQS_DQ_TE_DLY_OBS);
3816 if (tempte > temple)
3817 win_byte1 = tempte - temple;
3818 else
3819 win_byte1 = 0;
3820
3821 if (dvw_min_byte0[ch] > win_byte0)
3822 dvw_min_byte0[ch] = win_byte0;
3823
3824 if (dvw_min_byte1[ch] > win_byte1)
3825 dvw_min_byte1[ch] = win_byte1;
3826 }
3827 }
3828 }
3829
3830 r_foreach_vch(dev, ch) {
3831 dvw_min_byte0_table[ch][i] = dvw_min_byte0[ch];
3832 dvw_min_byte1_table[ch][i] = dvw_min_byte1[ch];
3833 }
3834 }
3835
3836 r_foreach_vch(dev, ch) {
3837 /* Search best VREF byte0 */
3838 best_vref_byte0 = vref_start;
3839 best_vref_byte0_index = 0;
3840 best_dvw_min_byte0 = dvw_min_byte0_table[ch][0];
3841
3842 for (i = 0; i <= vref_stop_index; i++) {
3843 if (best_dvw_min_byte0 >= dvw_min_byte0_table[ch][i])
3844 continue;
3845
3846 best_vref_byte0 = vref_start + (vref_step * i);
3847 best_vref_byte0_index = i;
3848 best_dvw_min_byte0 = dvw_min_byte0_table[ch][i];
3849 }
3850
3851 /* Search best_lower VREF byte0 */
3852 reg = dbsc5_ddr_getval_slice(dev, ch, 0, PHY_RDLVL_DLY_STEP);
3853 if (reg == 0)
3854 reg = 1;
3855 best_thrshld = dbsc5_ddr_getval_slice(dev, ch, 0, PHY_RDLVL_BEST_THRSHLD) * reg;
3856
3857 vref_outlier = dbsc5_ddr_getval_slice(dev, ch, 0, PHY_RDLVL_VREF_OUTLIER);
3858 best_lower_vref = best_vref_byte0;
3859 outlier_cnt = vref_outlier;
3860 for (i = best_vref_byte0_index; i >= 0; i--) {
3861 if (dvw_min_byte0_table[ch][i] <= 0)
3862 break;
3863
3864 if (dvw_min_byte0_table[ch][i] >= (best_dvw_min_byte0 - best_thrshld)) {
3865 best_lower_vref = vref_start + (vref_step * i);
3866 } else {
3867 if (outlier_cnt > 0)
3868 outlier_cnt--;
3869 else
3870 break;
3871 }
3872
3873 if (i == 0)
3874 break;
3875 }
3876
3877 /* Search best_upper VREF byte0 */
3878 vref_outlier = dbsc5_ddr_getval_slice(dev, ch, 0, PHY_RDLVL_VREF_OUTLIER);
3879 best_upper_vref = best_vref_byte0;
3880 outlier_cnt = vref_outlier;
3881 for (i = best_vref_byte0_index; i <= vref_stop_index; i++) {
3882 if (dvw_min_byte0_table[ch][i] <= 0)
3883 break;
3884
3885 if (dvw_min_byte0_table[ch][i] >= (best_dvw_min_byte0 - best_thrshld)) {
3886 best_upper_vref = vref_start + (vref_step * i);
3887 } else {
3888 if (outlier_cnt > 0)
3889 outlier_cnt--;
3890 else
3891 break;
3892 }
3893 }
3894
3895 /* Calculate center of best vref range byte0 */
3896 best_vref_byte0 = (best_lower_vref + best_upper_vref) / 2;
3897
3898 /* Search best VREF byte1 */
3899 best_vref_byte1 = vref_start;
3900 best_vref_byte1_index = 0;
3901 best_dvw_min_byte1 = dvw_min_byte1_table[ch][0];
3902 for (i = 0; i <= vref_stop_index; i++) {
3903 if (best_dvw_min_byte1 >= dvw_min_byte1_table[ch][i])
3904 continue;
3905
3906 best_vref_byte1 = vref_start + (vref_step * i);
3907 best_vref_byte1_index = i;
3908 best_dvw_min_byte1 = dvw_min_byte1_table[ch][i];
3909 }
3910
3911 /* Search best_lower VREF byte1 */
3912 reg = dbsc5_ddr_getval_slice(dev, ch, 1, PHY_RDLVL_DLY_STEP);
3913 if (reg == 0)
3914 reg = 1;
3915 best_thrshld = dbsc5_ddr_getval_slice(dev, ch, 1, PHY_RDLVL_BEST_THRSHLD) * reg;
3916
3917 vref_outlier = dbsc5_ddr_getval_slice(dev, ch, 1, PHY_RDLVL_VREF_OUTLIER);
3918 best_lower_vref = best_vref_byte1;
3919 outlier_cnt = vref_outlier;
3920 for (i = best_vref_byte1_index; i >= 0; i--) {
3921 if (dvw_min_byte1_table[ch][i] <= 0)
3922 break;
3923
3924 if (dvw_min_byte1_table[ch][i] >= (best_dvw_min_byte1 - best_thrshld)) {
3925 best_lower_vref = vref_start + (vref_step * i);
3926 } else {
3927 if (outlier_cnt > 0)
3928 outlier_cnt--;
3929 else
3930 break;
3931 }
3932
3933 if (i == 0)
3934 break;
3935 }
3936
3937 /* Search best_upper VREF byte1 */
3938 vref_outlier = dbsc5_ddr_getval_slice(dev, ch, 1, PHY_RDLVL_VREF_OUTLIER);
3939 best_upper_vref = best_vref_byte1;
3940 outlier_cnt = vref_outlier;
3941 for (i = best_vref_byte1_index; i <= vref_stop_index; i++) {
3942 if (dvw_min_byte1_table[ch][i] <= 0)
3943 break;
3944
3945 if (dvw_min_byte1_table[ch][i] >= (best_dvw_min_byte1 - best_thrshld)) {
3946 best_upper_vref = vref_start + (vref_step * i);
3947 } else {
3948 if (outlier_cnt > 0)
3949 outlier_cnt--;
3950 else
3951 break;
3952 }
3953 }
3954
3955 /* Calculate center of best vref range byte1 */
3956 best_vref_byte1 = (best_lower_vref + best_upper_vref) / 2;
3957
3958 reg = dbsc5_ddr_getval_slice(dev, ch, 0, PHY_PAD_VREF_CTRL_DQ);
3959 reg &= 0xF << 10;
3960 dbsc5_ddr_setval_slice(dev, ch, 0, PHY_PAD_VREF_CTRL_DQ,
3961 reg | BIT(9) | best_vref_byte0);
3962 reg = dbsc5_ddr_getval_slice(dev, ch, 1, PHY_PAD_VREF_CTRL_DQ);
3963 reg &= 0xF << 10;
3964 dbsc5_ddr_setval_slice(dev, ch, 1, PHY_PAD_VREF_CTRL_DQ,
3965 reg | BIT(9) | best_vref_byte1);
3966 }
3967
3968 return phytrainingok;
3969}
3970
3971/**
3972 * dbsc5_read_write_training() - Read Data & RDDQ Training with best VREF & Write DQ VREF Training
3973 * @dev: DBSC5 device
3974 *
3975 * Set read DQS/RDQS slave delay setting to 0. Write leveling set to OFF,
3976 * read gate leveling set to OFF. Turn on read and write leveling. Start
3977 * frequency training. Training in high-frequency mode. Wait until training
3978 * is complete. Check for errors in write dq leveling and read leveling.
3979
3980 * If an error is confirmed to have occurred, return the inverted result
3981 * value. Clear the PI status register.
3982 */
3983static u32 dbsc5_read_write_training(struct udevice *dev)
3984{
3985 struct renesas_dbsc5_dram_priv *priv = dev_get_priv(dev);
3986 const int retry_max = 0x10000;
3987 u32 wdq_training_ng = 0;
3988 u32 rd_training_ng = 0;
3989 u32 phytrainingok = 0;
3990 u32 complete_ng = 0;
3991 int retry, ret;
3992 u32 ch, reg;
3993
3994 /* RDDQ_SLAVE_DELAY Set 0x0050 -> 0x0000 */
3995 dbsc5_ddr_setval_all_ch_all_slice(dev, PHY_RDDQ0_SLAVE_DELAY, 0x0);
3996 dbsc5_ddr_setval_all_ch_all_slice(dev, PHY_RDDQ1_SLAVE_DELAY, 0x0);
3997 dbsc5_ddr_setval_all_ch_all_slice(dev, PHY_RDDQ2_SLAVE_DELAY, 0x0);
3998 dbsc5_ddr_setval_all_ch_all_slice(dev, PHY_RDDQ3_SLAVE_DELAY, 0x0);
3999 dbsc5_ddr_setval_all_ch_all_slice(dev, PHY_RDDQ4_SLAVE_DELAY, 0x0);
4000 dbsc5_ddr_setval_all_ch_all_slice(dev, PHY_RDDQ5_SLAVE_DELAY, 0x0);
4001 dbsc5_ddr_setval_all_ch_all_slice(dev, PHY_RDDQ6_SLAVE_DELAY, 0x0);
4002 dbsc5_ddr_setval_all_ch_all_slice(dev, PHY_RDDQ7_SLAVE_DELAY, 0x0);
4003 dbsc5_ddr_setval_all_ch_all_slice(dev, PHY_RDDM_SLAVE_DELAY, 0x0);
4004
4005 dbsc5_ddr_setval_all_ch(dev, PI_WRLVL_EN_F2, 0x0);
4006 dbsc5_ddr_setval_all_ch(dev, PI_RDLVL_GATE_EN_F2, 0x0);
4007 dbsc5_ddr_setval_all_ch(dev, PI_RDLVL_EN_F2, 0x3);
4008 dbsc5_ddr_setval_all_ch(dev, PI_WDQLVL_EN_F2, 0x3);
4009
4010 dbsc5_ddr_setval_all_ch(dev, PI_TRAIN_ALL_FREQ_REQ, 0x1);
4011
4012 /* Freq Change High to High*/
4013 ret = dbsc5_clk_pll3_freq(dev);
4014 if (ret)
4015 return ret;
4016
4017 for (retry = 0; retry < retry_max; retry++) {
4018 r_foreach_vch(dev, ch)
4019 if (dbsc5_ddr_getval(dev, ch, PI_INT_STATUS) & BIT(0))
4020 phytrainingok |= BIT(ch);
4021
4022 if (phytrainingok == priv->ddr_phyvalid)
4023 break;
4024 }
4025
4026 /* Error Check */
4027 r_foreach_vch(dev, ch) {
4028 /* Rdlvl Error Check */
4029 /* PI_RDLVL_ERROR_BIT */
4030 reg = dbsc5_ddr_getval(dev, ch, PI_INT_STATUS) & BIT(1);
4031 if (reg) {
4032 rd_training_ng |= BIT(ch);
4033 printf("%s read_write_training_error:1\n", __func__);
4034 }
4035
4036 /* Wdqlvl Error Check */
4037 /* PI_WDQLVL_ERROR_BIT */
4038 reg = dbsc5_ddr_getval(dev, ch, PI_INT_STATUS) & BIT(5);
4039 /* SLICE0 wdqlvl_fail_dqZ */
4040 reg |= dbsc5_ddr_getval_slice(dev, ch, 0, PHY_WDQLVL_STATUS_OBS) & (0x1FF << 18);
4041 /* SLICE1 wdqlvl_fail_dqZ */
4042 reg |= dbsc5_ddr_getval_slice(dev, ch, 1, PHY_WDQLVL_STATUS_OBS) & (0x1FF << 18);
4043 if (reg) {
4044 wdq_training_ng |= BIT(ch);
4045 printf("%s read_write_training_error:2\n", __func__);
4046 }
4047 }
4048
4049 complete_ng = wdq_training_ng | rd_training_ng;
4050 if (complete_ng)
4051 return ~complete_ng;
4052
4053 /* PI_INT_ACK assert */
4054 r_foreach_vch(dev, ch) {
4055 dbsc5_ddr_setval(dev, ch, PI_INT_ACK_0, 0xFFFFFFFF);
4056 dbsc5_ddr_setval(dev, ch, PI_INT_ACK_1, 0x7);
4057 }
4058
4059 return phytrainingok;
4060}
4061
4062/**
4063 * dbsc5_read_training() - Correct RDDQ Training result & Re-Run Read Data Training
4064 * @dev: DBSC5 device
4065 *
4066 * Set the Read DQ correction value and its upper limit from the board
4067 * settings. Check DDR memory ranks. Add the offset value to the current
4068 * Read DQ value and write it to the register. Write the setting value
4069 * to PI_RDLVL_TRAIN_SEQ_x. Start the Read training. PI_INT_ACK assert.
4070 * Execute the Rdlvl Error Check. Confirm that training has been successfully
4071 * completed. Return the result of the confirmation as the return value.
4072 */
4073static u32 dbsc5_read_training(struct udevice *dev)
4074{
4075 struct renesas_dbsc5_dram_priv *priv = dev_get_priv(dev);
4076 const u32 rank = priv->ch_have_this_cs[1] ? 0x3 : 0x1;
4077 const u32 rddq_delay_offset_ps = 0x19;
4078 const u32 rddq_delay_max_ps = 0x67;
4079 const u32 rddq_delay_addr[] = {
4080 PHY_RDDQ0_SLAVE_DELAY, PHY_RDDQ1_SLAVE_DELAY, PHY_RDDQ2_SLAVE_DELAY,
4081 PHY_RDDQ3_SLAVE_DELAY, PHY_RDDQ4_SLAVE_DELAY, PHY_RDDQ5_SLAVE_DELAY,
4082 PHY_RDDQ6_SLAVE_DELAY, PHY_RDDQ7_SLAVE_DELAY, PHY_RDDM_SLAVE_DELAY
4083 };
4084 const u32 rddq_delay_offset = rddq_delay_offset_ps * priv->ddr_mbps * 256 /
4085 (priv->ddr_mbpsdiv * 2 * 1000000);
4086 const u32 rddq_delay_max = rddq_delay_max_ps * priv->ddr_mbps * 256 /
4087 (priv->ddr_mbpsdiv * 2 * 1000000);
4088 u32 rd_training_ng = 0;
4089 u32 ch, reg, slice;
4090 u32 phytrainingok;
4091 int i;
4092
4093 r_foreach_vch(dev, ch) {
4094 for (slice = 0; slice < SLICE_CNT; slice++) {
4095 for (i = 0; i < 9; i++) {
4096 reg = dbsc5_ddr_getval_slice(dev, ch, slice,
4097 rddq_delay_addr[i]) +
4098 rddq_delay_offset;
4099 if (reg > rddq_delay_max)
4100 reg = rddq_delay_max;
4101 dbsc5_ddr_setval_slice(dev, ch, slice, rddq_delay_addr[i], reg);
4102 }
4103 }
4104 }
4105
4106 dbsc5_ddr_setval_all_ch(dev, PI_RDLVL_TRAIN_SEQ_1, 0x89080);
4107 dbsc5_ddr_setval_all_ch(dev, PI_RDLVL_TRAIN_SEQ_2, 0x811C0);
4108 dbsc5_ddr_setval_all_ch(dev, PI_RDLVL_TRAIN_SEQ_3, 0x40811C0);
4109 dbsc5_ddr_setval_all_ch(dev, PI_RDLVL_TRAIN_SEQ_4, 0x2000000);
4110 dbsc5_ddr_setval_all_ch(dev, PI_RDLVL_TRAIN_SEQ_5, 0x0);
4111 dbsc5_ddr_setval_all_ch(dev, PI_RDLVL_CS_SW, rank);
4112
4113 /* Read training go */
4114 dbsc5_ddr_setval_all_ch(dev, PI_RDLVL_REQ, 0x1);
4115
4116 /* PI_INT_ACK assert */
4117 phytrainingok = dbsc5_pi_int_ack_0_assert(dev, 25);
4118 if (phytrainingok != priv->ddr_phyvalid)
4119 return phytrainingok;
4120
4121 /* Error Check */
4122 r_foreach_vch(dev, ch) {
4123 /* Rdlvl Error Check */
4124 /* PI_RDLVL_ERROR_BIT */
4125 reg = dbsc5_ddr_getval(dev, ch, PI_INT_STATUS) & BIT(1);
4126 if (reg) {
4127 rd_training_ng |= BIT(ch);
4128 printf("%s read_training_error\n", __func__);
4129 }
4130 }
4131
4132 if (rd_training_ng)
4133 return ~rd_training_ng;
4134
4135 return phytrainingok;
4136}
4137
4138/**
4139 * dbsc5_ddr_register_set() - DDR mode register setting
4140 * @dev: DBSC5 device
4141 *
4142 * Set the mode register 28 of the SDRAM.
4143 * ZQ Mode: Command-Based ZQ Calibration
4144 * ZQ interval: Background Cal Interval < 64ms
4145 */
4146static void dbsc5_ddr_register_set(struct udevice *dev)
4147{
4148 dbsc5_send_dbcmd2(dev, 0xE841C24);
4149}
4150
4151/**
4152 * dbsc5_ddr_register_read() - DDR mode register read
4153 * @dev: DBSC5 device
4154 *
4155 * Set the mode register 27 and 57 of the SDRAM.
4156 */
4157static void dbsc5_ddr_register_read(struct udevice *dev)
4158{
4159 struct renesas_dbsc5_dram_priv *priv = dev_get_priv(dev);
4160
4161 if (!priv->dbsc5_board_config->bdcfg_rfm_chk)
4162 return;
4163
4164 /* MR27 rank0 */
4165 dbsc5_send_dbcmd2(dev, 0xF801B00);
4166 /* MR57 rank0 */
4167 dbsc5_send_dbcmd2(dev, 0xF803900);
4168
4169 if (!priv->ch_have_this_cs[1])
4170 return;
4171
4172 /* MR27 rank1 */
4173 dbsc5_send_dbcmd2(dev, 0xF811B00);
4174 /* MR57 rank1 */
4175 dbsc5_send_dbcmd2(dev, 0xF813900);
4176}
4177
4178/**
4179 * dbsc5_init_ddr() - Initialize DDR
4180 * @dev: DBSC5 device
4181 *
4182 * Status monitor and perform reset and software reset for DDR.
4183 * Disable DDRPHY software reset. Unprotect the DDRPHY register.
4184 * Perform pre-setting of DBSC registers. Configure the ddrphy
4185 * registers. Process ddr backup. Set DBSC registers.
4186 *
4187 * Initialize DFI and perform PI training. Setup DDR mode registers
4188 * pre-traning. Adjust number of write leveling cycles. Perform PI
4189 * training in manual mode. Perform DRAM DCA training. Perform write
4190 * leveling. Execute phydca training. Execute read gate training.
4191 *
4192 * Perform Vref training on read gate. Read DQ Write DQ Execute.
4193 * Frequency selection change (F1->F2). Disable the FREQ_SEL_MULTICAST &
4194 * PER_CS_TRAINING_MULTICAST. Start setting DDR mode registers. Set DBSC
4195 * registers after training is completed. Set write protection for PHY
4196 * registers.
4197 */
4198static u32 dbsc5_init_ddr(struct udevice *dev)
4199{
4200 struct renesas_dbsc5_dram_priv *priv = dev_get_priv(dev);
4201 void __iomem *regs_dbsc_d = priv->regs + DBSC5_DBSC_D_OFFSET;
4202 u32 phytrainingok;
4203 u32 ch, val;
4204 int ret;
4205
4206 /* PLL3 initialization setting */
4207 /* Reset Status Monitor clear */
4208 dbsc5_clk_cpg_write_32(dev, priv->cpg_regs + CPG_FSRCHKCLRR4, 0x600);
4209 /* Reset Status Monitor set */
4210 dbsc5_clk_cpg_write_32(dev, priv->cpg_regs + CPG_FSRCHKSETR4, 0x600);
4211 /* ddrphy soft reset assert */
4212 dbsc5_clk_cpg_write_32(dev, priv->cpg_regs + CPG_SRCR4, readl(priv->cpg_regs + CPG_SRCR4) | 0x600);
4213 /* Wait reset FB */
4214 ret = readl_poll_timeout(priv->cpg_regs + CPG_FSRCHKRA4, val, ((val & 0x600) == 0), 1000000);
4215 if (ret < 0) {
4216 printf("%s CPG_FSRCHKRA4 Wait reset FB timeout\n", __func__);
4217 hang();
4218 }
4219 /* Reset Status Monitor clear */
4220 dbsc5_clk_cpg_write_32(dev, priv->cpg_regs + CPG_FSRCHKCLRR4, 0x600);
4221
4222 /* Initialize PLL3 setting */
4223 dbsc5_clk_pll3_control(dev, PLL3_HIGH_FREQUENCY_MODE_LOAD_REGISTER);
4224
4225 /* DDRPHY soft reset negate */
4226 dbsc5_clk_cpg_write_32(dev, priv->cpg_regs + CPG_SRSTCLR4, 0x600);
4227 ret = readl_poll_timeout(priv->cpg_regs + CPG_SRCR4, val, ((val & 0x600) == 0), 1000000);
4228 if (ret < 0) {
4229 printf("%s CPG_SRCR4 DDRPHY soft reset negate timeout\n", __func__);
4230 hang();
4231 }
4232
4233 /* Unlock PHY */
4234 /* Unlock DDRPHY register */
4235 r_foreach_vch(dev, ch)
4236 writel(0xA55A, regs_dbsc_d + DBSC_DBPDLK(ch));
4237
4238 /* DBSC register pre-setting */
4239 dbsc5_dbsc_regset_pre(dev);
4240
4241 /* Load DDRPHY registers */
4242 dbsc5_ddrtbl_calc(priv);
4243 dbsc5_ddrtbl_load(dev);
4244
4245 /* Configure ddrphy registers */
4246 dbsc5_ddr_config(dev);
4247
4248 /* DDR backupmode end */
4249
4250 /* DBSC register set */
4251 dbsc5_dbsc_regset(dev);
4252
4253 /* Frequency selection change (F1->F2) */
4254 dbsc5_ddr_setval_all_ch(dev, PHY_FREQ_SEL_INDEX, 0x1);
4255 dbsc5_ddr_setval_all_ch(dev, PHY_FREQ_SEL_MULTICAST_EN, 0x0);
4256
4257 /* dfi_init_start (start ddrphy) & execute pi_training */
4258 phytrainingok = dbsc5_pi_training(dev);
4259 if (priv->ddr_phyvalid != phytrainingok) {
4260 printf("%s init_ddr_error:1\n", __func__);
4261 return phytrainingok;
4262 }
4263
4264 /* Write leveling cycle adjust */
4265 dbsc5_write_leveling_adjust(dev);
4266
4267 /* Execute write leveling & read gate training */
4268 phytrainingok = dbsc5_wl_gt_training(dev);
4269 if (priv->ddr_phyvalid != phytrainingok) {
4270 printf("%s init_ddr_error:2\n", __func__);
4271 return phytrainingok;
4272 }
4273
4274 /* Execute write dca training */
4275 dbsc5_write_dca(dev);
4276
4277 /* Execute dram dca training */
4278 phytrainingok = dbsc5_dramdca_training(dev);
4279
4280 if (priv->ddr_phyvalid != phytrainingok) {
4281 printf("%s init_ddr_error:3\n", __func__);
4282 return phytrainingok;
4283 }
4284
4285 /* Execute write leveling */
4286 phytrainingok = dbsc5_write_leveling(dev);
4287
4288 if (priv->ddr_phyvalid != phytrainingok) {
4289 printf("%s init_ddr_error:4\n", __func__);
4290 return phytrainingok;
4291 }
4292
4293 /* Execute manual write dca training */
4294 dbsc5_manual_write_dca(dev);
4295
4296 /* Execute read gate training */
4297 phytrainingok = dbsc5_read_gate_training(dev);
4298
4299 if (priv->ddr_phyvalid != phytrainingok) {
4300 printf("%s init_ddr_error:5\n", __func__);
4301 return phytrainingok;
4302 }
4303
4304 /* Execute read vref training */
4305 phytrainingok = dbsc5_read_vref_training(dev);
4306
4307 if (priv->ddr_phyvalid != phytrainingok) {
4308 printf("%s init_ddr_error:6\n", __func__);
4309 return phytrainingok;
4310 }
4311
4312 /* Execute read dq & write dq training with best vref */
4313 phytrainingok = dbsc5_read_write_training(dev);
4314 if (priv->ddr_phyvalid != phytrainingok) {
4315 printf("%s init_ddr_error:7\n", __func__);
4316 return phytrainingok;
4317 }
4318
4319 /* correct rddq training result & Execute read dq training */
4320 phytrainingok = dbsc5_read_training(dev);
4321
4322 if (priv->ddr_phyvalid != phytrainingok) {
4323 printf("%s init_ddr_error:8\n", __func__);
4324 return phytrainingok;
4325 }
4326
4327 /* PER_CS_TRAINING_MULTICAST SET (disable) */
4328 dbsc5_ddr_setval_all_ch_all_slice(dev, PHY_PER_CS_TRAINING_MULTICAST_EN, 0x0);
4329
4330 /* setup DDR mode registers */
4331 /* MRS */
4332 dbsc5_ddr_register_set(dev);
4333
4334 /* MRR */
4335 dbsc5_ddr_register_read(dev);
4336
4337 /* training complete, setup DBSC */
4338 dbsc5_dbsc_regset_post(dev);
4339
4340 /* Lock PHY */
4341 /* Lock DDRPHY register */
4342 r_foreach_vch(dev, ch)
4343 writel(0x0, regs_dbsc_d + DBSC_DBPDLK(ch));
4344
4345 return phytrainingok;
4346}
4347
4348/**
4349 * dbsc5_get_board_data() - Obtain board specific DRAM configuration
4350 *
4351 * Return board specific DRAM configuration structure pointer.
4352 */
4353__weak const struct renesas_dbsc5_board_config *dbsc5_get_board_data(void)
4354{
4355 return &renesas_v4h_dbsc5_board_config;
4356}
4357
4358/**
4359 * renesas_dbsc5_dram_probe() - DDR Initialize entry
4360 * @dev: DBSC5 device
4361 *
4362 * Remove write protection on DBSC register. Read DDR configuration
4363 * information from driver data. Calculate board clock frequency and
4364 * operating frequency from DDR configuration information. Call the
4365 * main function of DDR initialization. Perform DBSC write protection
4366 * after initialization is complete.
4367 */
4368static int renesas_dbsc5_dram_probe(struct udevice *dev)
4369{
4370#define RST_MODEMR0 0x0
4371#define RST_MODEMR1 0x4
4372 struct renesas_dbsc5_data *data = (struct renesas_dbsc5_data *)dev_get_driver_data(dev);
4373 ofnode cnode = ofnode_by_compatible(ofnode_null(), data->clock_node);
4374 ofnode rnode = ofnode_by_compatible(ofnode_null(), data->reset_node);
4375 struct renesas_dbsc5_dram_priv *priv = dev_get_priv(dev);
4376 void __iomem *regs_dbsc_a = priv->regs + DBSC5_DBSC_A_OFFSET;
4377 void __iomem *regs_dbsc_d = priv->regs + DBSC5_DBSC_D_OFFSET;
4378 phys_addr_t rregs = ofnode_get_addr(rnode);
4379 const u32 modemr0 = readl(rregs + RST_MODEMR0);
4380 const u32 modemr1 = readl(rregs + RST_MODEMR1);
4381 u32 breg, reg, md, sscg;
4382 u32 ch, cs;
4383
4384 /* Get board data */
4385 priv->dbsc5_board_config = dbsc5_get_board_data();
4386 priv->ddr_phyvalid = (u32)(priv->dbsc5_board_config->bdcfg_phyvalid);
4387 priv->max_density = 0;
4388 priv->cpg_regs = (void __iomem *)ofnode_get_addr(cnode);
4389
4390 for (cs = 0; cs < CS_CNT; cs++)
4391 priv->ch_have_this_cs[cs] = 0;
4392
4393 r_foreach_ech(ch)
4394 for (cs = 0; cs < CS_CNT; cs++)
4395 priv->ddr_density[ch][cs] = 0xFF;
4396
4397 r_foreach_vch(dev, ch) {
4398 for (cs = 0; cs < CS_CNT; cs++) {
4399 priv->ddr_density[ch][cs] = priv->dbsc5_board_config->ch[ch].bdcfg_ddr_density[cs];
4400
4401 if (priv->ddr_density[ch][cs] == 0xFF)
4402 continue;
4403
4404 if (priv->ddr_density[ch][cs] > priv->max_density)
4405 priv->max_density = priv->ddr_density[ch][cs];
4406
4407 priv->ch_have_this_cs[cs] |= BIT(ch);
4408 }
4409 }
4410
4411 /* Decode board clock frequency from MD[14:13] pins */
4412 priv->brd_clkdiv = 3;
4413
4414 breg = (modemr0 >> 13) & 0x3;
4415 if (breg == 0) {
4416 priv->brd_clk = 50; /* 16.66 MHz */
4417 priv->bus_clk = priv->brd_clk * 0x18;
4418 priv->bus_clkdiv = priv->brd_clkdiv;
4419 } else if (breg == 1) {
4420 priv->brd_clk = 60; /* 20 MHz */
4421 priv->bus_clk = priv->brd_clk * 0x14;
4422 priv->bus_clkdiv = priv->brd_clkdiv;
4423 } else if (breg == 3) {
4424 priv->brd_clk = 100; /* 33.33 MHz */
4425 priv->bus_clk = priv->brd_clk * 0x18;
4426 priv->bus_clkdiv = priv->brd_clkdiv * 2;
4427 } else {
4428 printf("MD[14:13] setting 0x%x not supported!", breg);
4429 hang();
4430 }
4431
4432 priv->brd_clkdiva = !!(modemr0 & BIT(14)); /* MD14 */
4433
4434 /* Decode DDR operating frequency from MD[37:36,19,17] pins */
4435 md = ((modemr0 & BIT(19)) >> 18) | ((modemr0 & BIT(17)) >> 17);
4436 sscg = (modemr1 >> 4) & 0x03;
4437 if (sscg == 2) {
4438 printf("MD[37:36] setting 0x%x not supported!", sscg);
4439 hang();
4440 }
4441
4442 if (md == 0) {
4443 if (sscg == 0) {
4444 priv->ddr_mbps = 6400;
4445 priv->ddr_mbpsdiv = 1;
4446 } else {
4447 priv->ddr_mbps = 19000;
4448 priv->ddr_mbpsdiv = 3;
4449 }
4450 } else if (md == 1) {
4451 priv->ddr_mbps = 6000;
4452 priv->ddr_mbpsdiv = 1;
4453 } else if (md == 1) {
4454 priv->ddr_mbps = 5500;
4455 priv->ddr_mbpsdiv = 1;
4456 } else if (md == 1) {
4457 priv->ddr_mbps = 4800;
4458 priv->ddr_mbpsdiv = 1;
4459 }
4460
4461 priv->ddr_mul = CLK_DIV(priv->ddr_mbps, priv->ddr_mbpsdiv * 2,
4462 priv->brd_clk, priv->brd_clkdiv * (priv->brd_clkdiva + 1));
4463 priv->ddr_mul_low = CLK_DIV(6400, 2, priv->brd_clk,
4464 priv->brd_clkdiv * (priv->brd_clkdiva + 1));
4465
4466 priv->ddr_mul_reg = priv->ddr_mul_low;
4467 if (sscg != 0)
4468 priv->ddr_mul_reg -= 2;
4469
4470 priv->ddr_mul_nf = ((8 * priv->ddr_mbps * priv->brd_clkdiv * (priv->brd_clkdiva + 1)) /
4471 (priv->ddr_mbpsdiv * priv->brd_clk * 2)) - (8 * (priv->ddr_mul / 2) * 2);
4472
4473 /* Adjust tccd */
4474 priv->ddr_tccd = 2;
4475
4476 /* Initialize DDR */
4477 dbsc5_reg_write(regs_dbsc_d + DBSC_DBSYSCNT0, 0x1234);
4478 dbsc5_reg_write(regs_dbsc_a + DBSC_DBSYSCNT0A, 0x1234);
4479
4480 reg = dbsc5_init_ddr(dev);
4481
4482 dbsc5_reg_write(regs_dbsc_d + DBSC_DBSYSCNT0, 0x0);
4483 dbsc5_reg_write(regs_dbsc_a + DBSC_DBSYSCNT0A, 0x0);
4484
4485 return reg != priv->ddr_phyvalid;
4486}
4487
4488/**
4489 * renesas_dbsc5_dram_of_to_plat() - Convert OF data to plat data
4490 * @dev: DBSC5 device
4491 *
4492 * Extract DBSC5 address from DT and store it in driver data.
4493 */
4494static int renesas_dbsc5_dram_of_to_plat(struct udevice *dev)
4495{
4496 struct renesas_dbsc5_dram_priv *priv = dev_get_priv(dev);
4497
4498 priv->regs = dev_read_addr_ptr(dev);
4499 if (!priv->regs)
4500 return -EINVAL;
4501
4502 return 0;
4503}
4504
4505/**
4506 * renesas_dbsc5_dram_get_info() - Return RAM size
4507 * @dev: DBSC5 device
4508 * @info: Output RAM info
4509 *
4510 * Return size of the RAM managed by this RAM driver.
4511 */
4512static int renesas_dbsc5_dram_get_info(struct udevice *dev,
4513 struct ram_info *info)
4514{
4515 info->base = 0x40000000;
4516 info->size = 0;
4517
4518 return 0;
4519}
4520
4521static const struct ram_ops renesas_dbsc5_dram_ops = {
4522 .get_info = renesas_dbsc5_dram_get_info,
4523};
4524
4525U_BOOT_DRIVER(renesas_dbsc5_dram) = {
4526 .name = "dbsc5_dram",
4527 .id = UCLASS_RAM,
4528 .of_to_plat = renesas_dbsc5_dram_of_to_plat,
4529 .ops = &renesas_dbsc5_dram_ops,
4530 .probe = renesas_dbsc5_dram_probe,
4531 .priv_auto = sizeof(struct renesas_dbsc5_dram_priv),
4532};