blob: 45259e3c50c5bdd61c15cf54d7f5b1ffe2d7bd4d [file] [log] [blame]
Biju Dasbaf086c2020-11-09 09:36:46 +00001/*
2 * Copyright (c) 2021, Renesas Electronics Corporation. All rights reserved.
3 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6
7#include <stdint.h>
8#include <string.h>
9
10#include <common/debug.h>
11#include <lib/mmio.h>
12
13#include "boot_init_dram.h"
14#include "boot_init_dram_regdef.h"
15#include "ddr_regdef.h"
16#include "dram_sub_func.h"
17#include "init_dram_tbl_g2m.h"
18#include "micro_delay.h"
19#include "rcar_def.h"
20
21/* load board configuration */
22#include "boot_init_dram_config.c"
23
24#define DDR_BACKUPMODE
25#define FATAL_MSG(x) NOTICE(x)
26
27/* variables */
28#ifdef RCAR_DDR_FIXED_LSI_TYPE
29#ifndef RCAR_AUTO
30#define RCAR_AUTO 99U
31#define RZ_G2M 100U
32
33#define RCAR_CUT_10 0U
34#define RCAR_CUT_11 1U
35#define RCAR_CUT_20 10U
36#define RCAR_CUT_30 20U
37#endif /* RCAR_AUTO */
38#ifndef RCAR_LSI
39#define RCAR_LSI RCAR_AUTO
40#endif
41
42#if (RCAR_LSI == RCAR_AUTO)
43static uint32_t prr_product;
44static uint32_t prr_cut;
45#else /* RCAR_LSI == RCAR_AUTO */
46#if (RCAR_LSI == RZ_G2M)
47static const uint32_t prr_product = PRR_PRODUCT_M3;
48#endif /* RCAR_LSI == RZ_G2M */
49
50#ifndef RCAR_LSI_CUT
51static uint32_t prr_cut;
52#else /* RCAR_LSI_CUT */
53#if (RCAR_LSI_CUT == RCAR_CUT_10)
54static const uint32_t prr_cut = PRR_PRODUCT_10;
55#elif(RCAR_LSI_CUT == RCAR_CUT_11)
56static const uint32_t prr_cut = PRR_PRODUCT_11;
57#elif(RCAR_LSI_CUT == RCAR_CUT_20)
58static const uint32_t prr_cut = PRR_PRODUCT_20;
59#elif(RCAR_LSI_CUT == RCAR_CUT_30)
60static const uint32_t prr_cut = PRR_PRODUCT_30;
61#endif /* RCAR_LSI_CUT == RCAR_CUT_10 */
62#endif /* RCAR_LSI_CUT */
63#endif /* RCAR_LSI == RCAR_AUTO */
64#else /* RCAR_DDR_FIXED_LSI_TYPE */
65static uint32_t prr_product;
66static uint32_t prr_cut;
67#endif /* RCAR_DDR_FIXED_LSI_TYPE */
68
69static const uint32_t *p_ddr_regdef_tbl;
70static uint32_t brd_clk;
71static uint32_t brd_clkdiv;
72static uint32_t brd_clkdiva;
73static uint32_t ddr_mbps;
74static uint32_t ddr_mbpsdiv;
75static uint32_t ddr_tccd;
76static uint32_t ddr_phycaslice;
77static const struct _boardcnf *board_cnf;
78static uint32_t ddr_phyvalid;
79static uint32_t ddr_density[DRAM_CH_CNT][CS_CNT];
80static uint32_t ch_have_this_cs[CS_CNT] __aligned(64);
81static uint32_t rdqdm_dly[DRAM_CH_CNT][CSAB_CNT][SLICE_CNT * 2U][9U];
82static uint32_t max_density;
83static uint32_t ddr0800_mul;
84static uint32_t ddr_mul;
85static uint32_t DDR_PHY_SLICE_REGSET_OFS;
86static uint32_t DDR_PHY_ADR_V_REGSET_OFS;
87static uint32_t DDR_PHY_ADR_I_REGSET_OFS;
88static uint32_t DDR_PHY_ADR_G_REGSET_OFS;
89static uint32_t DDR_PI_REGSET_OFS;
90static uint32_t DDR_PHY_SLICE_REGSET_SIZE;
91static uint32_t DDR_PHY_ADR_V_REGSET_SIZE;
92static uint32_t DDR_PHY_ADR_I_REGSET_SIZE;
93static uint32_t DDR_PHY_ADR_G_REGSET_SIZE;
94static uint32_t DDR_PI_REGSET_SIZE;
95static uint32_t DDR_PHY_SLICE_REGSET_NUM;
96static uint32_t DDR_PHY_ADR_V_REGSET_NUM;
97static uint32_t DDR_PHY_ADR_I_REGSET_NUM;
98static uint32_t DDR_PHY_ADR_G_REGSET_NUM;
99static uint32_t DDR_PI_REGSET_NUM;
100static uint32_t DDR_PHY_ADR_I_NUM;
101#define DDR_PHY_REGSET_MAX 128
102#define DDR_PI_REGSET_MAX 320
103static uint32_t _cnf_DDR_PHY_SLICE_REGSET[DDR_PHY_REGSET_MAX];
104static uint32_t _cnf_DDR_PHY_ADR_V_REGSET[DDR_PHY_REGSET_MAX];
105static uint32_t _cnf_DDR_PHY_ADR_I_REGSET[DDR_PHY_REGSET_MAX];
106static uint32_t _cnf_DDR_PHY_ADR_G_REGSET[DDR_PHY_REGSET_MAX];
107static uint32_t _cnf_DDR_PI_REGSET[DDR_PI_REGSET_MAX];
108static uint32_t pll3_mode;
109static uint32_t loop_max;
110#ifdef DDR_BACKUPMODE
111uint32_t ddr_backup = DRAM_BOOT_STATUS_COLD;
112/* #define DDR_BACKUPMODE_HALF */ /* for Half channel(ch0,1 only) */
113#endif
114
115#ifdef DDR_QOS_INIT_SETTING /* only for non qos_init */
116#define OPERATING_FREQ (400U) /* Mhz */
117#define BASE_SUB_SLOT_NUM (0x6U)
118#define SUB_SLOT_CYCLE (0x7EU) /* 126 */
119#define QOSWT_WTSET0_CYCLE \
120 ((SUB_SLOT_CYCLE * BASE_SUB_SLOT_NUM * 1000U) / \
121 OPERATING_FREQ) /* unit:ns */
122
123uint32_t get_refperiod(void)
124{
125 return QOSWT_WTSET0_CYCLE;
126}
127#else /* DDR_QOS_INIT_SETTING */
128extern uint32_t get_refperiod(void);
129#endif /* DDR_QOS_INIT_SETTING */
130
131#define _reg_PHY_RX_CAL_X_NUM 11U
132static const uint32_t _reg_PHY_RX_CAL_X[_reg_PHY_RX_CAL_X_NUM] = {
133 _reg_PHY_RX_CAL_DQ0,
134 _reg_PHY_RX_CAL_DQ1,
135 _reg_PHY_RX_CAL_DQ2,
136 _reg_PHY_RX_CAL_DQ3,
137 _reg_PHY_RX_CAL_DQ4,
138 _reg_PHY_RX_CAL_DQ5,
139 _reg_PHY_RX_CAL_DQ6,
140 _reg_PHY_RX_CAL_DQ7,
141 _reg_PHY_RX_CAL_DM,
142 _reg_PHY_RX_CAL_DQS,
143 _reg_PHY_RX_CAL_FDBK
144};
145
146#define _reg_PHY_CLK_WRX_SLAVE_DELAY_NUM 10U
147static const uint32_t _reg_PHY_CLK_WRX_SLAVE_DELAY
148 [_reg_PHY_CLK_WRX_SLAVE_DELAY_NUM] = {
149 _reg_PHY_CLK_WRDQ0_SLAVE_DELAY,
150 _reg_PHY_CLK_WRDQ1_SLAVE_DELAY,
151 _reg_PHY_CLK_WRDQ2_SLAVE_DELAY,
152 _reg_PHY_CLK_WRDQ3_SLAVE_DELAY,
153 _reg_PHY_CLK_WRDQ4_SLAVE_DELAY,
154 _reg_PHY_CLK_WRDQ5_SLAVE_DELAY,
155 _reg_PHY_CLK_WRDQ6_SLAVE_DELAY,
156 _reg_PHY_CLK_WRDQ7_SLAVE_DELAY,
157 _reg_PHY_CLK_WRDM_SLAVE_DELAY,
158 _reg_PHY_CLK_WRDQS_SLAVE_DELAY
159};
160
161#define _reg_PHY_RDDQS_X_FALL_SLAVE_DELAY_NUM 9U
162static const uint32_t _reg_PHY_RDDQS_X_FALL_SLAVE_DELAY
163 [_reg_PHY_RDDQS_X_FALL_SLAVE_DELAY_NUM] = {
164 _reg_PHY_RDDQS_DQ0_FALL_SLAVE_DELAY,
165 _reg_PHY_RDDQS_DQ1_FALL_SLAVE_DELAY,
166 _reg_PHY_RDDQS_DQ2_FALL_SLAVE_DELAY,
167 _reg_PHY_RDDQS_DQ3_FALL_SLAVE_DELAY,
168 _reg_PHY_RDDQS_DQ4_FALL_SLAVE_DELAY,
169 _reg_PHY_RDDQS_DQ5_FALL_SLAVE_DELAY,
170 _reg_PHY_RDDQS_DQ6_FALL_SLAVE_DELAY,
171 _reg_PHY_RDDQS_DQ7_FALL_SLAVE_DELAY,
172 _reg_PHY_RDDQS_DM_FALL_SLAVE_DELAY
173};
174
175#define _reg_PHY_RDDQS_X_RISE_SLAVE_DELAY_NUM 9U
176static const uint32_t _reg_PHY_RDDQS_X_RISE_SLAVE_DELAY
177 [_reg_PHY_RDDQS_X_RISE_SLAVE_DELAY_NUM] = {
178 _reg_PHY_RDDQS_DQ0_RISE_SLAVE_DELAY,
179 _reg_PHY_RDDQS_DQ1_RISE_SLAVE_DELAY,
180 _reg_PHY_RDDQS_DQ2_RISE_SLAVE_DELAY,
181 _reg_PHY_RDDQS_DQ3_RISE_SLAVE_DELAY,
182 _reg_PHY_RDDQS_DQ4_RISE_SLAVE_DELAY,
183 _reg_PHY_RDDQS_DQ5_RISE_SLAVE_DELAY,
184 _reg_PHY_RDDQS_DQ6_RISE_SLAVE_DELAY,
185 _reg_PHY_RDDQS_DQ7_RISE_SLAVE_DELAY,
186 _reg_PHY_RDDQS_DM_RISE_SLAVE_DELAY
187};
188
189#define _reg_PHY_PAD_TERM_X_NUM 8U
190static const uint32_t _reg_PHY_PAD_TERM_X[_reg_PHY_PAD_TERM_X_NUM] = {
191 _reg_PHY_PAD_FDBK_TERM,
192 _reg_PHY_PAD_DATA_TERM,
193 _reg_PHY_PAD_DQS_TERM,
194 _reg_PHY_PAD_ADDR_TERM,
195 _reg_PHY_PAD_CLK_TERM,
196 _reg_PHY_PAD_CKE_TERM,
197 _reg_PHY_PAD_RST_TERM,
198 _reg_PHY_PAD_CS_TERM
199};
200
201#define _reg_PHY_CLK_CACS_SLAVE_DELAY_X_NUM 10U
202static const uint32_t _reg_PHY_CLK_CACS_SLAVE_DELAY_X
203 [_reg_PHY_CLK_CACS_SLAVE_DELAY_X_NUM] = {
204 _reg_PHY_ADR0_CLK_WR_SLAVE_DELAY,
205 _reg_PHY_ADR1_CLK_WR_SLAVE_DELAY,
206 _reg_PHY_ADR2_CLK_WR_SLAVE_DELAY,
207 _reg_PHY_ADR3_CLK_WR_SLAVE_DELAY,
208 _reg_PHY_ADR4_CLK_WR_SLAVE_DELAY,
209 _reg_PHY_ADR5_CLK_WR_SLAVE_DELAY,
210
211 _reg_PHY_GRP_SLAVE_DELAY_0,
212 _reg_PHY_GRP_SLAVE_DELAY_1,
213 _reg_PHY_GRP_SLAVE_DELAY_2,
214 _reg_PHY_GRP_SLAVE_DELAY_3
215};
216
217/* Prototypes */
218static inline uint32_t vch_nxt(uint32_t pos);
219static void cpg_write_32(uint32_t a, uint32_t v);
220static void pll3_control(uint32_t high);
221static inline void dsb_sev(void);
222static void wait_dbcmd(void);
223static void send_dbcmd(uint32_t cmd);
224static uint32_t reg_ddrphy_read(uint32_t phyno, uint32_t regadd);
225static void reg_ddrphy_write(uint32_t phyno, uint32_t regadd, uint32_t regdata);
226static void reg_ddrphy_write_a(uint32_t regadd, uint32_t regdata);
227static inline uint32_t ddr_regdef(uint32_t _regdef);
228static inline uint32_t ddr_regdef_adr(uint32_t _regdef);
229static inline uint32_t ddr_regdef_lsb(uint32_t _regdef);
230static void ddr_setval_s(uint32_t ch, uint32_t slice, uint32_t _regdef,
231 uint32_t val);
232static uint32_t ddr_getval_s(uint32_t ch, uint32_t slice, uint32_t _regdef);
233static void ddr_setval(uint32_t ch, uint32_t regdef, uint32_t val);
234static void ddr_setval_ach_s(uint32_t slice, uint32_t regdef, uint32_t val);
235static void ddr_setval_ach(uint32_t regdef, uint32_t val);
236static void ddr_setval_ach_as(uint32_t regdef, uint32_t val);
237static uint32_t ddr_getval(uint32_t ch, uint32_t regdef);
238static uint32_t ddr_getval_ach(uint32_t regdef, uint32_t *p);
239static uint32_t ddr_getval_ach_as(uint32_t regdef, uint32_t *p);
240static void _tblcopy(uint32_t *to, const uint32_t *from, uint32_t size);
241static void ddrtbl_setval(uint32_t *tbl, uint32_t _regdef, uint32_t val);
242static uint32_t ddrtbl_getval(uint32_t *tbl, uint32_t _regdef);
243static uint32_t ddrphy_regif_chk(void);
244static inline void ddrphy_regif_idle(void);
245static uint16_t _f_scale(uint32_t _ddr_mbps, uint32_t _ddr_mbpsdiv, uint32_t ps,
246 uint16_t cyc);
247static void _f_scale_js2(uint32_t _ddr_mbps, uint32_t _ddr_mbpsdiv,
248 uint16_t *_js2);
249static int16_t _f_scale_adj(int16_t ps);
250static void ddrtbl_load(void);
251static void ddr_config_sub(void);
252static void ddr_config(void);
253static void dbsc_regset(void);
254static void dbsc_regset_post(void);
255static uint32_t dfi_init_start(void);
256static void change_lpddr4_en(uint32_t mode);
257static uint32_t set_term_code(void);
258static void ddr_register_set(void);
259static inline uint32_t wait_freqchgreq(uint32_t assert);
260static inline void set_freqchgack(uint32_t assert);
261static inline void set_dfifrequency(uint32_t freq);
262static uint32_t pll3_freq(uint32_t on);
263static void update_dly(void);
264static uint32_t pi_training_go(void);
265static uint32_t init_ddr(void);
266static uint32_t swlvl1(uint32_t ddr_csn, uint32_t reg_cs, uint32_t reg_kick);
267static uint32_t wdqdm_man1(void);
268static uint32_t wdqdm_man(void);
269static uint32_t rdqdm_man1(void);
270static uint32_t rdqdm_man(void);
271
272static int32_t _find_change(uint64_t val, uint32_t dir);
273static uint32_t _rx_offset_cal_updn(uint32_t code);
274static uint32_t rx_offset_cal(void);
275static uint32_t rx_offset_cal_hw(void);
276static void adjust_wpath_latency(void);
277
278struct ddrt_data {
279 int32_t init_temp; /* Initial Temperature (do) */
280 uint32_t init_cal[4U]; /* Initial io-code (4 is for G2H) */
281 uint32_t tcomp_cal[4U]; /* Temp. compensated io-code (4 is for G2H) */
282};
283
284static struct ddrt_data tcal;
285
286static void pvtcode_update(void);
287static void pvtcode_update2(void);
288static void ddr_padcal_tcompensate_getinit(uint32_t override);
289
290#ifndef DDR_FAST_INIT
291static uint32_t rdqdm_le[DRAM_CH_CNT][CS_CNT][SLICE_CNT * 2U][9U];
292static uint32_t rdqdm_te[DRAM_CH_CNT][CS_CNT][SLICE_CNT * 2U][9U];
293static uint32_t rdqdm_nw[DRAM_CH_CNT][CS_CNT][SLICE_CNT * 2U][9U];
294static uint32_t rdqdm_win[DRAM_CH_CNT][CS_CNT][SLICE_CNT];
295static uint32_t rdqdm_st[DRAM_CH_CNT][CS_CNT][SLICE_CNT * 2U];
296static void rdqdm_clr1(uint32_t ch, uint32_t ddr_csn);
297static uint32_t rdqdm_ana1(uint32_t ch, uint32_t ddr_csn);
298
299static uint32_t wdqdm_le[DRAM_CH_CNT][CS_CNT][SLICE_CNT][9U];
300static uint32_t wdqdm_te[DRAM_CH_CNT][CS_CNT][SLICE_CNT][9U];
301static uint32_t wdqdm_dly[DRAM_CH_CNT][CS_CNT][SLICE_CNT][9U];
302static uint32_t wdqdm_st[DRAM_CH_CNT][CS_CNT][SLICE_CNT];
303static uint32_t wdqdm_win[DRAM_CH_CNT][CS_CNT][SLICE_CNT];
304static void wdqdm_clr1(uint32_t ch, uint32_t ddr_csn);
305static uint32_t wdqdm_ana1(uint32_t ch, uint32_t ddr_csn);
306#endif/* DDR_FAST_INIT */
307
308/* macro for channel selection loop */
309static inline uint32_t vch_nxt(uint32_t pos)
310{
311 uint32_t posn;
312
313 for (posn = pos; posn < DRAM_CH_CNT; posn++) {
314 if ((ddr_phyvalid & (1U << posn)) != 0U) {
315 break;
316 }
317 }
318 return posn;
319}
320
321#define foreach_vch(ch) \
322for (ch = vch_nxt(0U); ch < DRAM_CH_CNT; ch = vch_nxt(ch + 1U))
323
324#define foreach_ech(ch) \
325for (ch = 0U; ch < DRAM_CH_CNT; ch++)
326
327/* Printing functions */
328#define MSG_LF(...)
329
330/* clock settings, reset control */
331static void cpg_write_32(uint32_t a, uint32_t v)
332{
333 mmio_write_32(CPG_CPGWPR, ~v);
334 mmio_write_32(a, v);
335}
336
337static void wait_for_pll3_status_bit_turned_on(void)
338{
339 uint32_t data_l;
340
341 do {
342 data_l = mmio_read_32(CPG_PLLECR);
343 } while ((data_l & CPG_PLLECR_PLL3ST_BIT) == 0);
344 dsb_sev();
345}
346
347static void pll3_control(uint32_t high)
348{
349 uint32_t data_l, data_div, data_mul, tmp_div;
350
351 if (high != 0U) {
352 tmp_div = 3999U * brd_clkdiv * (brd_clkdiva + 1U) /
353 (brd_clk * ddr_mul) / 2U;
354 data_mul = ((ddr_mul * tmp_div) - 1U) << 24U;
355 pll3_mode = 1U;
356 loop_max = 2U;
357 } else {
358 tmp_div = 3999U * brd_clkdiv * (brd_clkdiva + 1U) /
359 (brd_clk * ddr0800_mul) / 2U;
360 data_mul = ((ddr0800_mul * tmp_div) - 1U) << 24U;
361 pll3_mode = 0U;
362 loop_max = 8U;
363 }
364
365 switch (tmp_div) {
366 case 1:
367 data_div = 0U;
368 break;
369 case 2:
370 case 3:
371 case 4:
372 data_div = tmp_div;
373 break;
374 default:
375 data_div = 6U;
376 data_mul = (data_mul * tmp_div) / 3U;
377 break;
378 }
379 data_mul = data_mul | (brd_clkdiva << 7);
380
381 /* PLL3 disable */
382 data_l = mmio_read_32(CPG_PLLECR) & ~CPG_PLLECR_PLL3E_BIT;
383 cpg_write_32(CPG_PLLECR, data_l);
384 dsb_sev();
385
386 if (prr_product == PRR_PRODUCT_M3) {
387 /* PLL3 DIV resetting(Lowest value:3) */
388 data_l = 0x00030003U | (0xFF80FF80U & mmio_read_32(CPG_FRQCRD));
389 cpg_write_32(CPG_FRQCRD, data_l);
390 dsb_sev();
391
392 /* zb3 clk stop */
393 data_l = CPG_ZB3CKCR_ZB3ST_BIT | mmio_read_32(CPG_ZB3CKCR);
394 cpg_write_32(CPG_ZB3CKCR, data_l);
395 dsb_sev();
396
397 /* PLL3 enable */
398 data_l = CPG_PLLECR_PLL3E_BIT | mmio_read_32(CPG_PLLECR);
399 cpg_write_32(CPG_PLLECR, data_l);
400 dsb_sev();
401
402 wait_for_pll3_status_bit_turned_on();
403
404 /* PLL3 DIV resetting (Highest value:0) */
405 data_l = (0xFF80FF80U & mmio_read_32(CPG_FRQCRD));
406 cpg_write_32(CPG_FRQCRD, data_l);
407 dsb_sev();
408
409 /* DIV SET KICK */
410 data_l = CPG_FRQCRB_KICK_BIT | mmio_read_32(CPG_FRQCRB);
411 cpg_write_32(CPG_FRQCRB, data_l);
412 dsb_sev();
413
414 /* PLL3 multiplier set */
415 cpg_write_32(CPG_PLL3CR, data_mul);
416 dsb_sev();
417
418 wait_for_pll3_status_bit_turned_on();
419
420 /* PLL3 DIV resetting(Target value) */
421 data_l = (data_div << 16U) | data_div |
422 (mmio_read_32(CPG_FRQCRD) & 0xFF80FF80U);
423 cpg_write_32(CPG_FRQCRD, data_l);
424 dsb_sev();
425
426 /* DIV SET KICK */
427 data_l = CPG_FRQCRB_KICK_BIT | mmio_read_32(CPG_FRQCRB);
428 cpg_write_32(CPG_FRQCRB, data_l);
429 dsb_sev();
430
431 wait_for_pll3_status_bit_turned_on();
432
433 /* zb3 clk start */
434 data_l = (~CPG_ZB3CKCR_ZB3ST_BIT) & mmio_read_32(CPG_ZB3CKCR);
435 cpg_write_32(CPG_ZB3CKCR, data_l);
436 dsb_sev();
437 }
438}
439
440/* barrier */
441static inline void dsb_sev(void)
442{
443 __asm__ __volatile__("dsb sy");
444}
445
446/* DDR memory register access */
447static void wait_dbcmd(void)
448{
449 uint32_t data_l;
450 /* dummy read */
451 data_l = mmio_read_32(DBSC_DBCMD);
452 dsb_sev();
453 while (true) {
454 /* wait DBCMD 1=busy, 0=ready */
455 data_l = mmio_read_32(DBSC_DBWAIT);
456 dsb_sev();
457 if ((data_l & 0x00000001U) == 0x00U) {
458 break;
459 }
460 }
461}
462
463static void send_dbcmd(uint32_t cmd)
464{
465 /* dummy read */
466 wait_dbcmd();
467 mmio_write_32(DBSC_DBCMD, cmd);
468 dsb_sev();
469}
470
471static void dbwait_loop(uint32_t wait_loop)
472{
473 uint32_t i;
474
475 for (i = 0U; i < wait_loop; i++) {
476 wait_dbcmd();
477 }
478}
479
480/* DDRPHY register access (raw) */
481static uint32_t reg_ddrphy_read(uint32_t phyno, uint32_t regadd)
482{
483 uint32_t val;
484 uint32_t loop;
485
486 val = 0U;
487 mmio_write_32(DBSC_DBPDRGA(phyno), regadd);
488 dsb_sev();
489
490 while (mmio_read_32(DBSC_DBPDRGA(phyno)) != regadd) {
491 dsb_sev();
492 }
493 dsb_sev();
494
495 for (loop = 0U; loop < loop_max; loop++) {
496 val = mmio_read_32(DBSC_DBPDRGD(phyno));
497 dsb_sev();
498 }
499
500 return val;
501}
502
503static void reg_ddrphy_write(uint32_t phyno, uint32_t regadd, uint32_t regdata)
504{
505 uint32_t loop;
506
507 mmio_write_32(DBSC_DBPDRGA(phyno), regadd);
508 dsb_sev();
509 for (loop = 0U; loop < loop_max; loop++) {
510 mmio_read_32(DBSC_DBPDRGA(phyno));
511 dsb_sev();
512 }
513 mmio_write_32(DBSC_DBPDRGD(phyno), regdata);
514 dsb_sev();
515
516 for (loop = 0U; loop < loop_max; loop++) {
517 mmio_read_32(DBSC_DBPDRGD(phyno));
518 dsb_sev();
519 }
520}
521
522static void reg_ddrphy_write_a(uint32_t regadd, uint32_t regdata)
523{
524 uint32_t ch;
525 uint32_t loop;
526
527 foreach_vch(ch) {
528 mmio_write_32(DBSC_DBPDRGA(ch), regadd);
529 dsb_sev();
530 }
531
532 foreach_vch(ch) {
533 mmio_write_32(DBSC_DBPDRGD(ch), regdata);
534 dsb_sev();
535 }
536
537 for (loop = 0U; loop < loop_max; loop++) {
538 mmio_read_32(DBSC_DBPDRGD(0));
539 dsb_sev();
540 }
541}
542
543static inline void ddrphy_regif_idle(void)
544{
545 reg_ddrphy_read(0U, ddr_regdef_adr(_reg_PI_INT_STATUS));
546 dsb_sev();
547}
548
549/* DDRPHY register access (field modify) */
550static inline uint32_t ddr_regdef(uint32_t _regdef)
551{
552 return p_ddr_regdef_tbl[_regdef];
553}
554
555static inline uint32_t ddr_regdef_adr(uint32_t _regdef)
556{
557 return DDR_REGDEF_ADR(p_ddr_regdef_tbl[_regdef]);
558}
559
560static inline uint32_t ddr_regdef_lsb(uint32_t _regdef)
561{
562 return DDR_REGDEF_LSB(p_ddr_regdef_tbl[_regdef]);
563}
564
565static void ddr_setval_s(uint32_t ch, uint32_t slice, uint32_t _regdef,
566 uint32_t val)
567{
568 uint32_t adr;
569 uint32_t lsb;
570 uint32_t len;
571 uint32_t msk;
572 uint32_t tmp;
573 uint32_t regdef;
574
575 regdef = ddr_regdef(_regdef);
576 adr = DDR_REGDEF_ADR(regdef) + 0x80U * slice;
577 len = DDR_REGDEF_LEN(regdef);
578 lsb = DDR_REGDEF_LSB(regdef);
579 if (len == 0x20U) {
580 msk = 0xffffffffU;
581 } else {
582 msk = ((1U << len) - 1U) << lsb;
583 }
584
585 tmp = reg_ddrphy_read(ch, adr);
586 tmp = (tmp & (~msk)) | ((val << lsb) & msk);
587 reg_ddrphy_write(ch, adr, tmp);
588}
589
590static uint32_t ddr_getval_s(uint32_t ch, uint32_t slice, uint32_t _regdef)
591{
592 uint32_t adr;
593 uint32_t lsb;
594 uint32_t len;
595 uint32_t msk;
596 uint32_t tmp;
597 uint32_t regdef;
598
599 regdef = ddr_regdef(_regdef);
600 adr = DDR_REGDEF_ADR(regdef) + 0x80U * slice;
601 len = DDR_REGDEF_LEN(regdef);
602 lsb = DDR_REGDEF_LSB(regdef);
603 if (len == 0x20U) {
604 msk = 0xffffffffU;
605 } else {
606 msk = ((1U << len) - 1U);
607 }
608
609 tmp = reg_ddrphy_read(ch, adr);
610 tmp = (tmp >> lsb) & msk;
611
612 return tmp;
613}
614
615static void ddr_setval(uint32_t ch, uint32_t regdef, uint32_t val)
616{
617 ddr_setval_s(ch, 0U, regdef, val);
618}
619
620static void ddr_setval_ach_s(uint32_t slice, uint32_t regdef, uint32_t val)
621{
622 uint32_t ch;
623
624 foreach_vch(ch) {
625 ddr_setval_s(ch, slice, regdef, val);
626 }
627}
628
629static void ddr_setval_ach(uint32_t regdef, uint32_t val)
630{
631 ddr_setval_ach_s(0U, regdef, val);
632}
633
634static void ddr_setval_ach_as(uint32_t regdef, uint32_t val)
635{
636 uint32_t slice;
637
638 for (slice = 0U; slice < SLICE_CNT; slice++) {
639 ddr_setval_ach_s(slice, regdef, val);
640 }
641}
642
643static uint32_t ddr_getval(uint32_t ch, uint32_t regdef)
644{
645 return ddr_getval_s(ch, 0U, regdef);
646}
647
648static uint32_t ddr_getval_ach(uint32_t regdef, uint32_t *p)
649{
650 uint32_t ch;
651
652 foreach_vch(ch) {
653 p[ch] = ddr_getval_s(ch, 0U, regdef);
654 }
655 return p[0U];
656}
657
658static uint32_t ddr_getval_ach_as(uint32_t regdef, uint32_t *p)
659{
660 uint32_t ch, slice;
661 uint32_t *pp;
662
663 pp = p;
664 foreach_vch(ch) {
665 for (slice = 0U; slice < SLICE_CNT; slice++) {
666 *pp++ = ddr_getval_s(ch, slice, regdef);
667 }
668 }
669 return p[0U];
670}
671
672/* handling functions for setting ddrphy value table */
673static void _tblcopy(uint32_t *to, const uint32_t *from, uint32_t size)
674{
675 uint32_t i;
676
677 for (i = 0U; i < size; i++) {
678 to[i] = from[i];
679 }
680}
681
682static void ddrtbl_setval(uint32_t *tbl, uint32_t _regdef, uint32_t val)
683{
684 uint32_t adr;
685 uint32_t lsb;
686 uint32_t len;
687 uint32_t msk;
688 uint32_t tmp;
689 uint32_t adrmsk;
690 uint32_t regdef;
691
692 regdef = ddr_regdef(_regdef);
693 adr = DDR_REGDEF_ADR(regdef);
694 len = DDR_REGDEF_LEN(regdef);
695 lsb = DDR_REGDEF_LSB(regdef);
696 if (len == 0x20U) {
697 msk = 0xffffffffU;
698 } else {
699 msk = ((1U << len) - 1U) << lsb;
700 }
701
702 if (adr < 0x400U) {
703 adrmsk = 0xffU;
704 } else {
705 adrmsk = 0x7fU;
706 }
707
708 tmp = tbl[adr & adrmsk];
709 tmp = (tmp & (~msk)) | ((val << lsb) & msk);
710 tbl[adr & adrmsk] = tmp;
711}
712
713static uint32_t ddrtbl_getval(uint32_t *tbl, uint32_t _regdef)
714{
715 uint32_t adr;
716 uint32_t lsb;
717 uint32_t len;
718 uint32_t msk;
719 uint32_t tmp;
720 uint32_t adrmsk;
721 uint32_t regdef;
722
723 regdef = ddr_regdef(_regdef);
724 adr = DDR_REGDEF_ADR(regdef);
725 len = DDR_REGDEF_LEN(regdef);
726 lsb = DDR_REGDEF_LSB(regdef);
727 if (len == 0x20U) {
728 msk = 0xffffffffU;
729 } else {
730 msk = ((1U << len) - 1U);
731 }
732
733 if (adr < 0x400U) {
734 adrmsk = 0xffU;
735 } else {
736 adrmsk = 0x7fU;
737 }
738
739 tmp = tbl[adr & adrmsk];
740 tmp = (tmp >> lsb) & msk;
741
742 return tmp;
743}
744
745/* DDRPHY register access handling */
746static uint32_t ddrphy_regif_chk(void)
747{
748 uint32_t tmp_ach[DRAM_CH_CNT];
749 uint32_t ch;
750 uint32_t err;
751 uint32_t PI_VERSION_CODE;
752
753 if (prr_product == PRR_PRODUCT_M3) {
754 PI_VERSION_CODE = 0x2041U; /* G2M */
755 }
756
757 ddr_getval_ach(_reg_PI_VERSION, (uint32_t *)tmp_ach);
758 err = 0U;
759 foreach_vch(ch) {
760 if (tmp_ach[ch] != PI_VERSION_CODE) {
761 err = 1U;
762 }
763 }
764 return err;
765}
766
767/* functions and parameters for timing setting */
768struct _jedec_spec1 {
769 uint16_t fx3;
770 uint8_t rlwodbi;
771 uint8_t rlwdbi;
772 uint8_t WL;
773 uint8_t nwr;
774 uint8_t nrtp;
775 uint8_t odtlon;
776 uint8_t MR1;
777 uint8_t MR2;
778};
779
780#define JS1_USABLEC_SPEC_LO 2U
781#define JS1_USABLEC_SPEC_HI 5U
782#define JS1_FREQ_TBL_NUM 8
783#define JS1_MR1(f) (0x04U | ((f) << 4U))
784#define JS1_MR2(f) (0x00U | ((f) << 3U) | (f))
785static const struct _jedec_spec1 js1[JS1_FREQ_TBL_NUM] = {
786 /* 533.333Mbps */
787 { 800U, 6U, 6U, 4U, 6U, 8U, 0U, JS1_MR1(0U), JS1_MR2(0U) | 0x40U },
788 /* 1066.666Mbps */
789 { 1600U, 10U, 12U, 8U, 10U, 8U, 0U, JS1_MR1(1U), JS1_MR2(1U) | 0x40U },
790 /* 1600.000Mbps */
791 { 2400U, 14U, 16U, 12U, 16U, 8U, 6U, JS1_MR1(2U), JS1_MR2(2U) | 0x40U },
792 /* 2133.333Mbps */
793 { 3200U, 20U, 22U, 10U, 20U, 8U, 4U, JS1_MR1(3U), JS1_MR2(3U) },
794 /* 2666.666Mbps */
795 { 4000U, 24U, 28U, 12U, 24U, 10U, 4U, JS1_MR1(4U), JS1_MR2(4U) },
796 /* 3200.000Mbps */
797 { 4800U, 28U, 32U, 14U, 30U, 12U, 6U, JS1_MR1(5U), JS1_MR2(5U) },
798 /* 3733.333Mbps */
799 { 5600U, 32U, 36U, 16U, 34U, 14U, 6U, JS1_MR1(6U), JS1_MR2(6U) },
800 /* 4266.666Mbps */
801 { 6400U, 36U, 40U, 18U, 40U, 16U, 8U, JS1_MR1(7U), JS1_MR2(7U) }
802};
803
804struct _jedec_spec2 {
805 uint16_t ps;
806 uint16_t cyc;
807};
808
809#define js2_tsr 0
810#define js2_txp 1
811#define js2_trtp 2
812#define js2_trcd 3
813#define js2_trppb 4
814#define js2_trpab 5
815#define js2_tras 6
816#define js2_twr 7
817#define js2_twtr 8
818#define js2_trrd 9
819#define js2_tppd 10
820#define js2_tfaw 11
821#define js2_tdqsck 12
822#define js2_tckehcmd 13
823#define js2_tckelcmd 14
824#define js2_tckelpd 15
825#define js2_tmrr 16
826#define js2_tmrw 17
827#define js2_tmrd 18
828#define js2_tzqcalns 19
829#define js2_tzqlat 20
830#define js2_tiedly 21
831#define js2_tODTon_min 22
832#define JS2_TBLCNT 23
833
834#define js2_trcpb (JS2_TBLCNT)
835#define js2_trcab (JS2_TBLCNT + 1)
836#define js2_trfcab (JS2_TBLCNT + 2)
837#define JS2_CNT (JS2_TBLCNT + 3)
838
839#ifndef JS2_DERATE
840#define JS2_DERATE 0
841#endif
842static const struct _jedec_spec2 jedec_spec2[2][JS2_TBLCNT] = {
843 {
844/* tSR */ { 15000, 3 },
845/* tXP */ { 7500, 3 },
846/* tRTP */ { 7500, 8 },
847/* tRCD */ { 18000, 4 },
848/* tRPpb */ { 18000, 3 },
849/* tRPab */ { 21000, 3 },
850/* tRAS */ { 42000, 3 },
851/* tWR */ { 18000, 4 },
852/* tWTR */ { 10000, 8 },
853/* tRRD */ { 10000, 4 },
854/* tPPD */ { 0, 0 },
855/* tFAW */ { 40000, 0 },
856/* tDQSCK */ { 3500, 0 },
857/* tCKEHCMD */ { 7500, 3 },
858/* tCKELCMD */ { 7500, 3 },
859/* tCKELPD */ { 7500, 3 },
860/* tMRR */ { 0, 8 },
861/* tMRW */ { 10000, 10 },
862/* tMRD */ { 14000, 10 },
863/* tZQCALns */ { 1000 * 10, 0 },
864/* tZQLAT */ { 30000, 10 },
865/* tIEdly */ { 12500, 0 },
866/* tODTon_min */{ 1500, 0 }
867 }, {
868/* tSR */ { 15000, 3 },
869/* tXP */ { 7500, 3 },
870/* tRTP */ { 7500, 8 },
871/* tRCD */ { 19875, 4 },
872/* tRPpb */ { 19875, 3 },
873/* tRPab */ { 22875, 3 },
874/* tRAS */ { 43875, 3 },
875/* tWR */ { 18000, 4 },
876/* tWTR */ { 10000, 8 },
877/* tRRD */ { 11875, 4 },
878/* tPPD */ { 0, 0 },
879/* tFAW */ { 40000, 0 },
880/* tDQSCK */ { 3600, 0 },
881/* tCKEHCMD */ { 7500, 3 },
882/* tCKELCMD */ { 7500, 3 },
883/* tCKELPD */ { 7500, 3 },
884/* tMRR */ { 0, 8 },
885/* tMRW */ { 10000, 10 },
886/* tMRD */ { 14000, 10 },
887/* tZQCALns */ { 1000 * 10, 0 },
888/* tZQLAT */ { 30000, 10 },
889/* tIEdly */ { 12500, 0 },
890/* tODTon_min */{ 1500, 0 }
891 }
892};
893
894static const uint16_t jedec_spec2_trfc_ab[7] = {
895 /* 4Gb, 6Gb, 8Gb, 12Gb, 16Gb, 24Gb(non), 32Gb(non) */
896 130U, 180U, 180U, 280U, 280U, 560U, 560U
897};
898
899static uint32_t js1_ind;
900static uint16_t js2[JS2_CNT];
901static uint8_t RL;
902static uint8_t WL;
903
904static uint16_t _f_scale(uint32_t _ddr_mbps, uint32_t _ddr_mbpsdiv, uint32_t ps,
905 uint16_t cyc)
906{
907 uint16_t ret = cyc;
908 uint32_t tmp;
909 uint32_t div;
910
911 tmp = (((uint32_t)(ps) + 9U) / 10U) * _ddr_mbps;
912 div = tmp / (200000U * _ddr_mbpsdiv);
913 if (tmp != (div * 200000U * _ddr_mbpsdiv)) {
914 div = div + 1U;
915 }
916
917 if (div > cyc) {
918 ret = (uint16_t)div;
919 }
920
921 return ret;
922}
923
924static void _f_scale_js2(uint32_t _ddr_mbps, uint32_t _ddr_mbpsdiv,
925 uint16_t *_js2)
926{
927 int i;
928
929 for (i = 0; i < JS2_TBLCNT; i++) {
930 _js2[i] = _f_scale(_ddr_mbps, _ddr_mbpsdiv,
931 jedec_spec2[JS2_DERATE][i].ps,
932 jedec_spec2[JS2_DERATE][i].cyc);
933 }
934
935 _js2[js2_trcpb] = _js2[js2_tras] + _js2[js2_trppb];
936 _js2[js2_trcab] = _js2[js2_tras] + _js2[js2_trpab];
937}
938
939/* scaler for DELAY value */
940static int16_t _f_scale_adj(int16_t ps)
941{
942 int32_t tmp;
943 /*
944 * tmp = (int32_t)512 * ps * ddr_mbps /2 / ddr_mbpsdiv / 1000 / 1000;
945 * = ps * ddr_mbps /2 / ddr_mbpsdiv *512 / 8 / 8 / 125 / 125
946 * = ps * ddr_mbps / ddr_mbpsdiv *4 / 125 / 125
947 */
948 tmp = (int32_t)4 * (int32_t)ps * (int32_t)ddr_mbps /
949 (int32_t)ddr_mbpsdiv;
950 tmp = (int32_t)tmp / (int32_t)15625;
951
952 return (int16_t)tmp;
953}
954
955static const uint32_t reg_pi_mr1_data_fx_csx[2U][CSAB_CNT] = {
956 {
957 _reg_PI_MR1_DATA_F0_0,
958 _reg_PI_MR1_DATA_F0_1,
959 _reg_PI_MR1_DATA_F0_2,
960 _reg_PI_MR1_DATA_F0_3},
961 {
962 _reg_PI_MR1_DATA_F1_0,
963 _reg_PI_MR1_DATA_F1_1,
964 _reg_PI_MR1_DATA_F1_2,
965 _reg_PI_MR1_DATA_F1_3}
966};
967
968static const uint32_t reg_pi_mr2_data_fx_csx[2U][CSAB_CNT] = {
969 {
970 _reg_PI_MR2_DATA_F0_0,
971 _reg_PI_MR2_DATA_F0_1,
972 _reg_PI_MR2_DATA_F0_2,
973 _reg_PI_MR2_DATA_F0_3},
974 {
975 _reg_PI_MR2_DATA_F1_0,
976 _reg_PI_MR2_DATA_F1_1,
977 _reg_PI_MR2_DATA_F1_2,
978 _reg_PI_MR2_DATA_F1_3}
979};
980
981static const uint32_t reg_pi_mr3_data_fx_csx[2U][CSAB_CNT] = {
982 {
983 _reg_PI_MR3_DATA_F0_0,
984 _reg_PI_MR3_DATA_F0_1,
985 _reg_PI_MR3_DATA_F0_2,
986 _reg_PI_MR3_DATA_F0_3},
987 {
988 _reg_PI_MR3_DATA_F1_0,
989 _reg_PI_MR3_DATA_F1_1,
990 _reg_PI_MR3_DATA_F1_2,
991 _reg_PI_MR3_DATA_F1_3}
992};
993
994static const uint32_t reg_pi_mr11_data_fx_csx[2U][CSAB_CNT] = {
995 {
996 _reg_PI_MR11_DATA_F0_0,
997 _reg_PI_MR11_DATA_F0_1,
998 _reg_PI_MR11_DATA_F0_2,
999 _reg_PI_MR11_DATA_F0_3},
1000 {
1001 _reg_PI_MR11_DATA_F1_0,
1002 _reg_PI_MR11_DATA_F1_1,
1003 _reg_PI_MR11_DATA_F1_2,
1004 _reg_PI_MR11_DATA_F1_3}
1005};
1006
1007static const uint32_t reg_pi_mr12_data_fx_csx[2U][CSAB_CNT] = {
1008 {
1009 _reg_PI_MR12_DATA_F0_0,
1010 _reg_PI_MR12_DATA_F0_1,
1011 _reg_PI_MR12_DATA_F0_2,
1012 _reg_PI_MR12_DATA_F0_3},
1013 {
1014 _reg_PI_MR12_DATA_F1_0,
1015 _reg_PI_MR12_DATA_F1_1,
1016 _reg_PI_MR12_DATA_F1_2,
1017 _reg_PI_MR12_DATA_F1_3}
1018};
1019
1020static const uint32_t reg_pi_mr14_data_fx_csx[2U][CSAB_CNT] = {
1021 {
1022 _reg_PI_MR14_DATA_F0_0,
1023 _reg_PI_MR14_DATA_F0_1,
1024 _reg_PI_MR14_DATA_F0_2,
1025 _reg_PI_MR14_DATA_F0_3},
1026 {
1027 _reg_PI_MR14_DATA_F1_0,
1028 _reg_PI_MR14_DATA_F1_1,
1029 _reg_PI_MR14_DATA_F1_2,
1030 _reg_PI_MR14_DATA_F1_3}
1031};
1032
1033/*
1034 * regif pll w/a ( REGIF G2M WA )
1035 */
1036static void regif_pll_wa(void)
1037{
1038 uint32_t ch;
1039 uint32_t reg_ofs;
1040
1041 /* PLL setting for PHY : G2M */
1042 reg_ddrphy_write_a(ddr_regdef_adr(_reg_PHY_PLL_WAIT),
1043 (0x5064U <<
1044 ddr_regdef_lsb(_reg_PHY_PLL_WAIT)));
1045
1046 reg_ddrphy_write_a(ddr_regdef_adr(_reg_PHY_PLL_CTRL),
1047 (ddrtbl_getval(_cnf_DDR_PHY_ADR_G_REGSET,
1048 _reg_PHY_PLL_CTRL_TOP) << 16) |
1049 ddrtbl_getval(_cnf_DDR_PHY_ADR_G_REGSET,
1050 _reg_PHY_PLL_CTRL));
1051 reg_ddrphy_write_a(ddr_regdef_adr(_reg_PHY_PLL_CTRL_CA),
1052 ddrtbl_getval(_cnf_DDR_PHY_ADR_G_REGSET,
1053 _reg_PHY_PLL_CTRL_CA));
1054
1055 reg_ddrphy_write_a(ddr_regdef_adr(_reg_PHY_LP4_BOOT_PLL_CTRL),
1056 (ddrtbl_getval(_cnf_DDR_PHY_ADR_G_REGSET,
1057 _reg_PHY_LP4_BOOT_PLL_CTRL_CA) << 16) |
1058 ddrtbl_getval(_cnf_DDR_PHY_ADR_G_REGSET,
1059 _reg_PHY_LP4_BOOT_PLL_CTRL));
1060 reg_ddrphy_write_a(ddr_regdef_adr(_reg_PHY_LP4_BOOT_TOP_PLL_CTRL),
1061 ddrtbl_getval(_cnf_DDR_PHY_ADR_G_REGSET,
1062 _reg_PHY_LP4_BOOT_TOP_PLL_CTRL));
1063
1064 reg_ofs = ddr_regdef_adr(_reg_PHY_LPDDR3_CS) - DDR_PHY_ADR_G_REGSET_OFS;
1065 reg_ddrphy_write_a(ddr_regdef_adr(_reg_PHY_LPDDR3_CS),
1066 _cnf_DDR_PHY_ADR_G_REGSET[reg_ofs]);
1067
1068 /* protect register interface */
1069 ddrphy_regif_idle();
1070 pll3_control(0U);
1071
1072 reg_ddrphy_write_a(ddr_regdef_adr(_reg_PHY_DLL_RST_EN),
1073 (0x01U << ddr_regdef_lsb(_reg_PHY_DLL_RST_EN)));
1074 ddrphy_regif_idle();
1075
1076 /*
1077 * init start
1078 * dbdficnt0:
1079 * dfi_dram_clk_disable=1
1080 * dfi_frequency = 0
1081 * freq_ratio = 01 (2:1)
1082 * init_start =0
1083 */
1084 foreach_vch(ch) {
1085 mmio_write_32(DBSC_DBDFICNT(ch), 0x00000F10U);
1086 }
1087 dsb_sev();
1088
1089 /*
1090 * dbdficnt0:
1091 * dfi_dram_clk_disable=1
1092 * dfi_frequency = 0
1093 * freq_ratio = 01 (2:1)
1094 * init_start =1
1095 */
1096 foreach_vch(ch) {
1097 mmio_write_32(DBSC_DBDFICNT(ch), 0x00000F11U);
1098 }
1099 dsb_sev();
1100
1101 foreach_ech(ch) {
1102 if ((board_cnf->phyvalid & BIT(ch)) != 0U) {
1103 while ((mmio_read_32(DBSC_PLL_LOCK(ch)) & 0x1fU) != 0x1fU) {
1104 }
1105 }
1106 }
1107 dsb_sev();
1108}
1109
1110/* load table data into DDR registers */
1111static void ddrtbl_load(void)
1112{
1113 uint32_t i;
1114 uint32_t slice;
1115 uint32_t csab;
1116 uint32_t adr;
1117 uint32_t data_l;
1118 uint32_t tmp[3];
1119 uint16_t dataS;
1120
1121 /*
1122 * TIMING REGISTERS
1123 * search jedec_spec1 index
1124 */
1125 for (i = JS1_USABLEC_SPEC_LO; i < (uint32_t)JS1_FREQ_TBL_NUM - 1U; i++) {
1126 if ((js1[i].fx3 * 2U * ddr_mbpsdiv >= ddr_mbps * 3U) != 0U) {
1127 break;
1128 }
1129 }
1130 if (i > JS1_USABLEC_SPEC_HI) {
1131 js1_ind = JS1_USABLEC_SPEC_HI;
1132 } else {
1133 js1_ind = i;
1134 }
1135
1136 if (board_cnf->dbi_en != 0U) {
1137 RL = js1[js1_ind].rlwdbi;
1138 } else {
1139 RL = js1[js1_ind].rlwodbi;
1140 }
1141
1142 WL = js1[js1_ind].WL;
1143
1144 /* calculate jedec_spec2 */
1145 _f_scale_js2(ddr_mbps, ddr_mbpsdiv, js2);
1146
1147 /* PREPARE TBL */
1148 if (prr_product == PRR_PRODUCT_M3) {
1149 /* G2M */
1150 _tblcopy(_cnf_DDR_PHY_SLICE_REGSET,
1151 DDR_PHY_SLICE_REGSET_G2M, DDR_PHY_SLICE_REGSET_NUM_G2M);
1152 _tblcopy(_cnf_DDR_PHY_ADR_V_REGSET,
1153 DDR_PHY_ADR_V_REGSET_G2M, DDR_PHY_ADR_V_REGSET_NUM_G2M);
1154 _tblcopy(_cnf_DDR_PHY_ADR_I_REGSET,
1155 DDR_PHY_ADR_I_REGSET_G2M, DDR_PHY_ADR_I_REGSET_NUM_G2M);
1156 _tblcopy(_cnf_DDR_PHY_ADR_G_REGSET,
1157 DDR_PHY_ADR_G_REGSET_G2M, DDR_PHY_ADR_G_REGSET_NUM_G2M);
1158 _tblcopy(_cnf_DDR_PI_REGSET,
1159 DDR_PI_REGSET_G2M, DDR_PI_REGSET_NUM_G2M);
1160
1161 DDR_PHY_SLICE_REGSET_OFS = DDR_PHY_SLICE_REGSET_OFS_G2M;
1162 DDR_PHY_ADR_V_REGSET_OFS = DDR_PHY_ADR_V_REGSET_OFS_G2M;
1163 DDR_PHY_ADR_I_REGSET_OFS = DDR_PHY_ADR_I_REGSET_OFS_G2M;
1164 DDR_PHY_ADR_G_REGSET_OFS = DDR_PHY_ADR_G_REGSET_OFS_G2M;
1165 DDR_PI_REGSET_OFS = DDR_PI_REGSET_OFS_G2M;
1166 DDR_PHY_SLICE_REGSET_SIZE = DDR_PHY_SLICE_REGSET_SIZE_G2M;
1167 DDR_PHY_ADR_V_REGSET_SIZE = DDR_PHY_ADR_V_REGSET_SIZE_G2M;
1168 DDR_PHY_ADR_I_REGSET_SIZE = DDR_PHY_ADR_I_REGSET_SIZE_G2M;
1169 DDR_PHY_ADR_G_REGSET_SIZE = DDR_PHY_ADR_G_REGSET_SIZE_G2M;
1170 DDR_PI_REGSET_SIZE = DDR_PI_REGSET_SIZE_G2M;
1171 DDR_PHY_SLICE_REGSET_NUM = DDR_PHY_SLICE_REGSET_NUM_G2M;
1172 DDR_PHY_ADR_V_REGSET_NUM = DDR_PHY_ADR_V_REGSET_NUM_G2M;
1173 DDR_PHY_ADR_I_REGSET_NUM = DDR_PHY_ADR_I_REGSET_NUM_G2M;
1174 DDR_PHY_ADR_G_REGSET_NUM = DDR_PHY_ADR_G_REGSET_NUM_G2M;
1175 DDR_PI_REGSET_NUM = DDR_PI_REGSET_NUM_G2M;
1176
1177 DDR_PHY_ADR_I_NUM = 2U;
1178 }
1179
1180 /* on fly gate adjust */
1181 if ((prr_product == PRR_PRODUCT_M3) && (prr_cut == PRR_PRODUCT_10)) {
1182 ddrtbl_setval(_cnf_DDR_PHY_SLICE_REGSET,
1183 _reg_ON_FLY_GATE_ADJUST_EN, 0x00);
1184 }
1185
1186 /* Adjust PI parameters */
1187#ifdef _def_LPDDR4_ODT
1188 for (i = 0U; i < 2U; i++) {
1189 for (csab = 0U; csab < CSAB_CNT; csab++) {
1190 ddrtbl_setval(_cnf_DDR_PI_REGSET,
1191 reg_pi_mr11_data_fx_csx[i][csab],
1192 _def_LPDDR4_ODT);
1193 }
1194 }
1195#endif /* _def_LPDDR4_ODT */
1196
1197#ifdef _def_LPDDR4_VREFCA
1198 for (i = 0U; i < 2U; i++) {
1199 for (csab = 0U; csab < CSAB_CNT; csab++) {
1200 ddrtbl_setval(_cnf_DDR_PI_REGSET,
1201 reg_pi_mr12_data_fx_csx[i][csab],
1202 _def_LPDDR4_VREFCA);
1203 }
1204 }
1205#endif /* _def_LPDDR4_VREFCA */
1206
1207 if ((js2[js2_tiedly]) >= 0x0eU) {
1208 dataS = 0x0eU;
1209 } else {
1210 dataS = js2[js2_tiedly];
1211 }
1212
1213 ddrtbl_setval(_cnf_DDR_PHY_SLICE_REGSET, _reg_PHY_RDDATA_EN_DLY, dataS);
1214 ddrtbl_setval(_cnf_DDR_PHY_SLICE_REGSET, _reg_PHY_RDDATA_EN_TSEL_DLY,
1215 (dataS - 2U));
1216 ddrtbl_setval(_cnf_DDR_PI_REGSET, _reg_PI_RDLAT_ADJ_F1, RL - dataS);
1217
1218 if (ddrtbl_getval(_cnf_DDR_PHY_SLICE_REGSET, _reg_PHY_WRITE_PATH_LAT_ADD) != 0U) {
1219 data_l = WL - 1U;
1220 } else {
1221 data_l = WL;
1222 }
1223 ddrtbl_setval(_cnf_DDR_PI_REGSET, _reg_PI_WRLAT_ADJ_F1, data_l - 2U);
1224 ddrtbl_setval(_cnf_DDR_PI_REGSET, _reg_PI_WRLAT_F1, data_l);
1225
1226 if (board_cnf->dbi_en != 0U) {
1227 ddrtbl_setval(_cnf_DDR_PHY_SLICE_REGSET, _reg_PHY_DBI_MODE,
1228 0x01U);
1229 ddrtbl_setval(_cnf_DDR_PHY_SLICE_REGSET,
1230 _reg_PHY_WDQLVL_DATADM_MASK, 0x000U);
1231 } else {
1232 ddrtbl_setval(_cnf_DDR_PHY_SLICE_REGSET, _reg_PHY_DBI_MODE,
1233 0x00U);
1234 ddrtbl_setval(_cnf_DDR_PHY_SLICE_REGSET,
1235 _reg_PHY_WDQLVL_DATADM_MASK, 0x100U);
1236 }
1237
1238 tmp[0] = js1[js1_ind].MR1;
1239 tmp[1] = js1[js1_ind].MR2;
1240 data_l = ddrtbl_getval(_cnf_DDR_PI_REGSET, _reg_PI_MR3_DATA_F1_0);
1241 if (board_cnf->dbi_en != 0U) {
1242 tmp[2] = data_l | 0xc0U;
1243 } else {
1244 tmp[2] = data_l & (~0xc0U);
1245 }
1246
1247 for (i = 0U; i < 2U; i++) {
1248 for (csab = 0U; csab < CSAB_CNT; csab++) {
1249 ddrtbl_setval(_cnf_DDR_PI_REGSET,
1250 reg_pi_mr1_data_fx_csx[i][csab], tmp[0]);
1251 ddrtbl_setval(_cnf_DDR_PI_REGSET,
1252 reg_pi_mr2_data_fx_csx[i][csab], tmp[1]);
1253 ddrtbl_setval(_cnf_DDR_PI_REGSET,
1254 reg_pi_mr3_data_fx_csx[i][csab], tmp[2]);
1255 }
1256 }
1257
1258 /* DDRPHY INT START */
1259 regif_pll_wa();
1260 dbwait_loop(5U);
1261
1262 /* FREQ_SEL_MULTICAST & PER_CS_TRAINING_MULTICAST SET (for safety) */
1263 reg_ddrphy_write_a(ddr_regdef_adr(_reg_PHY_FREQ_SEL_MULTICAST_EN),
1264 BIT(ddr_regdef_lsb(_reg_PHY_FREQ_SEL_MULTICAST_EN)));
1265 ddr_setval_ach_as(_reg_PHY_PER_CS_TRAINING_MULTICAST_EN, 0x01U);
1266
1267 /* SET DATA SLICE TABLE */
1268 for (slice = 0U; slice < SLICE_CNT; slice++) {
1269 adr =
1270 DDR_PHY_SLICE_REGSET_OFS +
1271 DDR_PHY_SLICE_REGSET_SIZE * slice;
1272 for (i = 0U; i < DDR_PHY_SLICE_REGSET_NUM; i++) {
1273 reg_ddrphy_write_a(adr + i,
1274 _cnf_DDR_PHY_SLICE_REGSET[i]);
1275 }
1276 }
1277
1278 /* SET ADR SLICE TABLE */
1279 adr = DDR_PHY_ADR_V_REGSET_OFS;
1280 for (i = 0U; i < DDR_PHY_ADR_V_REGSET_NUM; i++) {
1281 reg_ddrphy_write_a(adr + i, _cnf_DDR_PHY_ADR_V_REGSET[i]);
1282 }
1283
1284 if ((prr_product == PRR_PRODUCT_M3) &&
1285 ((0x00ffffffU & (uint32_t)((board_cnf->ch[0].ca_swap) >> 40U))
1286 != 0x00U)) {
1287 adr = DDR_PHY_ADR_I_REGSET_OFS + DDR_PHY_ADR_I_REGSET_SIZE;
1288 for (i = 0U; i < DDR_PHY_ADR_V_REGSET_NUM; i++) {
1289 reg_ddrphy_write_a(adr + i,
1290 _cnf_DDR_PHY_ADR_V_REGSET[i]);
1291 }
1292 ddrtbl_setval(_cnf_DDR_PHY_ADR_G_REGSET,
1293 _reg_PHY_ADR_DISABLE, 0x02);
1294 DDR_PHY_ADR_I_NUM -= 1U;
1295 ddr_phycaslice = 1U;
1296
1297#ifndef _def_LPDDR4_ODT
1298 for (i = 0U; i < 2U; i++) {
1299 for (csab = 0U; csab < CSAB_CNT; csab++) {
1300 ddrtbl_setval(_cnf_DDR_PI_REGSET,
1301 reg_pi_mr11_data_fx_csx[i][csab],
1302 0x66);
1303 }
1304 }
1305#endif/* _def_LPDDR4_ODT */
1306 } else {
1307 ddr_phycaslice = 0U;
1308 }
1309
1310 if (DDR_PHY_ADR_I_NUM > 0U) {
1311 for (slice = 0U; slice < DDR_PHY_ADR_I_NUM; slice++) {
1312 adr =
1313 DDR_PHY_ADR_I_REGSET_OFS +
1314 DDR_PHY_ADR_I_REGSET_SIZE * slice;
1315 for (i = 0U; i < DDR_PHY_ADR_I_REGSET_NUM; i++) {
1316 reg_ddrphy_write_a(adr + i,
1317 _cnf_DDR_PHY_ADR_I_REGSET
1318 [i]);
1319 }
1320 }
1321 }
1322
1323 /* SET ADRCTRL SLICE TABLE */
1324 adr = DDR_PHY_ADR_G_REGSET_OFS;
1325 for (i = 0U; i < DDR_PHY_ADR_G_REGSET_NUM; i++) {
1326 reg_ddrphy_write_a(adr + i, _cnf_DDR_PHY_ADR_G_REGSET[i]);
1327 }
1328
1329 /* SET PI REGISTERS */
1330 adr = DDR_PI_REGSET_OFS;
1331 for (i = 0U; i < DDR_PI_REGSET_NUM; i++) {
1332 reg_ddrphy_write_a(adr + i, _cnf_DDR_PI_REGSET[i]);
1333 }
1334}
1335
1336/* CONFIGURE DDR REGISTERS */
1337static void ddr_config_sub(void)
1338{
1339 const uint32_t _par_CALVL_DEVICE_MAP = 1U;
1340 uint8_t high_byte[SLICE_CNT];
1341 uint32_t ch, slice;
1342 uint32_t data_l;
1343 uint32_t tmp;
1344 uint32_t i;
1345
1346 foreach_vch(ch) {
1347 /* BOARD SETTINGS (DQ,DM,VREF_DRIVING) */
1348 for (slice = 0U; slice < SLICE_CNT; slice++) {
1349 high_byte[slice] =
1350 (board_cnf->ch[ch].dqs_swap >> (4U * slice)) % 2U;
1351 ddr_setval_s(ch, slice, _reg_PHY_DQ_DM_SWIZZLE0,
1352 board_cnf->ch[ch].dq_swap[slice]);
1353 ddr_setval_s(ch, slice, _reg_PHY_DQ_DM_SWIZZLE1,
1354 board_cnf->ch[ch].dm_swap[slice]);
1355 if (high_byte[slice] != 0U) {
1356 /* HIGHER 16 BYTE */
1357 ddr_setval_s(ch, slice,
1358 _reg_PHY_CALVL_VREF_DRIVING_SLICE,
1359 0x00);
1360 } else {
1361 /* LOWER 16 BYTE */
1362 ddr_setval_s(ch, slice,
1363 _reg_PHY_CALVL_VREF_DRIVING_SLICE,
1364 0x01);
1365 }
1366 }
1367
1368 /* BOARD SETTINGS (CA,ADDR_SEL) */
1369 data_l = (0x00ffffffU & (uint32_t)(board_cnf->ch[ch].ca_swap)) |
1370 0x00888888U;
1371
1372 /* --- ADR_CALVL_SWIZZLE --- */
1373 if (prr_product == PRR_PRODUCT_M3) {
1374 ddr_setval(ch, _reg_PHY_ADR_CALVL_SWIZZLE0_0, data_l);
1375 ddr_setval(ch, _reg_PHY_ADR_CALVL_SWIZZLE1_0,
1376 0x00000000);
1377 ddr_setval(ch, _reg_PHY_ADR_CALVL_SWIZZLE0_1, data_l);
1378 ddr_setval(ch, _reg_PHY_ADR_CALVL_SWIZZLE1_1,
1379 0x00000000);
1380 ddr_setval(ch, _reg_PHY_ADR_CALVL_DEVICE_MAP,
1381 _par_CALVL_DEVICE_MAP);
1382 } else {
1383 ddr_setval(ch, _reg_PHY_ADR_CALVL_SWIZZLE0, data_l);
1384 ddr_setval(ch, _reg_PHY_ADR_CALVL_SWIZZLE1, 0x00000000);
1385 ddr_setval(ch, _reg_PHY_CALVL_DEVICE_MAP,
1386 _par_CALVL_DEVICE_MAP);
1387 }
1388
1389 /* --- ADR_ADDR_SEL --- */
1390 data_l = 0U;
1391 tmp = board_cnf->ch[ch].ca_swap;
1392 for (i = 0U; i < 6U; i++) {
1393 data_l |= ((tmp & 0x0fU) << (i * 5U));
1394 tmp = tmp >> 4;
1395 }
1396 ddr_setval(ch, _reg_PHY_ADR_ADDR_SEL, data_l);
1397 if (ddr_phycaslice == 1U) {
1398 /* ----------- adr slice2 swap ----------- */
1399 tmp = (uint32_t)((board_cnf->ch[ch].ca_swap) >> 40);
1400 data_l = (tmp & 0x00ffffffU) | 0x00888888U;
1401
1402 /* --- ADR_CALVL_SWIZZLE --- */
1403 if (prr_product == PRR_PRODUCT_M3) {
1404 ddr_setval_s(ch, 2,
1405 _reg_PHY_ADR_CALVL_SWIZZLE0_0,
1406 data_l);
1407 ddr_setval_s(ch, 2,
1408 _reg_PHY_ADR_CALVL_SWIZZLE1_0,
1409 0x00000000);
1410 ddr_setval_s(ch, 2,
1411 _reg_PHY_ADR_CALVL_SWIZZLE0_1,
1412 data_l);
1413 ddr_setval_s(ch, 2,
1414 _reg_PHY_ADR_CALVL_SWIZZLE1_1,
1415 0x00000000);
1416 ddr_setval_s(ch, 2,
1417 _reg_PHY_ADR_CALVL_DEVICE_MAP,
1418 _par_CALVL_DEVICE_MAP);
1419 } else {
1420 ddr_setval_s(ch, 2,
1421 _reg_PHY_ADR_CALVL_SWIZZLE0,
1422 data_l);
1423 ddr_setval_s(ch, 2,
1424 _reg_PHY_ADR_CALVL_SWIZZLE1,
1425 0x00000000);
1426 ddr_setval_s(ch, 2,
1427 _reg_PHY_CALVL_DEVICE_MAP,
1428 _par_CALVL_DEVICE_MAP);
1429 }
1430
1431 /* --- ADR_ADDR_SEL --- */
1432 data_l = 0U;
1433 for (i = 0U; i < 6U; i++) {
1434 data_l |= ((tmp & 0x0fU) << (i * 5U));
1435 tmp = tmp >> 4U;
1436 }
1437
1438 ddr_setval_s(ch, 2, _reg_PHY_ADR_ADDR_SEL, data_l);
1439 }
1440
1441 /* BOARD SETTINGS (BYTE_ORDER_SEL) */
1442 if (prr_product == PRR_PRODUCT_M3) {
1443 /* --- DATA_BYTE_SWAP --- */
1444 data_l = 0U;
1445 tmp = board_cnf->ch[ch].dqs_swap;
1446 for (i = 0U; i < 4U; i++) {
1447 data_l |= ((tmp & 0x03U) << (i * 2U));
1448 tmp = tmp >> 4U;
1449 }
1450 } else {
1451 /* --- DATA_BYTE_SWAP --- */
1452 data_l = board_cnf->ch[ch].dqs_swap;
1453 ddr_setval(ch, _reg_PI_DATA_BYTE_SWAP_EN, 0x01);
1454 ddr_setval(ch, _reg_PI_DATA_BYTE_SWAP_SLICE0,
1455 (data_l) & 0x0fU);
1456 ddr_setval(ch, _reg_PI_DATA_BYTE_SWAP_SLICE1,
1457 (data_l >> 4U * 1U) & 0x0fU);
1458 ddr_setval(ch, _reg_PI_DATA_BYTE_SWAP_SLICE2,
1459 (data_l >> 4U * 2U) & 0x0fU);
1460 ddr_setval(ch, _reg_PI_DATA_BYTE_SWAP_SLICE3,
1461 (data_l >> 4U * 3U) & 0x0fU);
1462
1463 ddr_setval(ch, _reg_PHY_DATA_BYTE_ORDER_SEL_HIGH, 0x00U);
1464 }
1465 ddr_setval(ch, _reg_PHY_DATA_BYTE_ORDER_SEL, data_l);
1466 }
1467}
1468
1469static void ddr_config(void)
1470{
1471 uint32_t num_cacs_dly = _reg_PHY_CLK_CACS_SLAVE_DELAY_X_NUM;
1472 uint32_t reg_ofs, dly;
1473 uint32_t ch, slice;
1474 uint32_t data_l;
1475 uint32_t tmp;
1476 uint32_t i;
1477 int8_t _adj;
1478 int16_t adj;
1479 uint32_t dq;
1480 union {
1481 uint32_t ui32[4];
1482 uint8_t ui8[16];
1483 } patt;
1484 uint16_t patm;
1485
1486 /* configure ddrphy registers */
1487 ddr_config_sub();
1488
1489 /* WDQ_USER_PATT */
1490 foreach_vch(ch) {
1491 for (slice = 0U; slice < SLICE_CNT; slice++) {
1492 patm = 0U;
1493 for (i = 0U; i < 16U; i++) {
1494 tmp = board_cnf->ch[ch].wdqlvl_patt[i];
1495 patt.ui8[i] = tmp & 0xffU;
1496 if ((tmp & 0x100U) != 0U) {
1497 patm |= (1U << (uint16_t)i);
1498 }
1499 }
1500 ddr_setval_s(ch, slice, _reg_PHY_USER_PATT0,
1501 patt.ui32[0]);
1502 ddr_setval_s(ch, slice, _reg_PHY_USER_PATT1,
1503 patt.ui32[1]);
1504 ddr_setval_s(ch, slice, _reg_PHY_USER_PATT2,
1505 patt.ui32[2]);
1506 ddr_setval_s(ch, slice, _reg_PHY_USER_PATT3,
1507 patt.ui32[3]);
1508 ddr_setval_s(ch, slice, _reg_PHY_USER_PATT4, patm);
1509 }
1510 }
1511
1512 /* CACS DLY */
1513 data_l = board_cnf->cacs_dly + (uint32_t)_f_scale_adj(board_cnf->cacs_dly_adj);
1514 reg_ddrphy_write_a(ddr_regdef_adr(_reg_PHY_FREQ_SEL_MULTICAST_EN), 0x00U);
1515 foreach_vch(ch) {
1516 for (i = 0U; i < num_cacs_dly - 4U; i++) {
1517 adj = _f_scale_adj(board_cnf->ch[ch].cacs_adj[i]);
1518 dly = _reg_PHY_CLK_CACS_SLAVE_DELAY_X[i];
1519 ddrtbl_setval(_cnf_DDR_PHY_ADR_V_REGSET, dly,
1520 data_l + (uint32_t)adj);
1521 reg_ofs = ddr_regdef_adr(dly) - DDR_PHY_ADR_V_REGSET_OFS;
1522 reg_ddrphy_write(ch, ddr_regdef_adr(dly),
1523 _cnf_DDR_PHY_ADR_V_REGSET[reg_ofs]);
1524 }
1525
1526 for (i = num_cacs_dly - 4U; i < num_cacs_dly; i++) {
1527 adj = _f_scale_adj(board_cnf->ch[ch].cacs_adj[i]);
1528 dly = _reg_PHY_CLK_CACS_SLAVE_DELAY_X[i];
1529 ddrtbl_setval(_cnf_DDR_PHY_ADR_G_REGSET, dly,
1530 data_l + (uint32_t)adj);
1531 reg_ofs = ddr_regdef_adr(dly) - DDR_PHY_ADR_G_REGSET_OFS;
1532 reg_ddrphy_write(ch, ddr_regdef_adr(dly),
1533 _cnf_DDR_PHY_ADR_G_REGSET[reg_ofs]);
1534 }
1535
1536 if (ddr_phycaslice == 1U) {
1537 for (i = 0U; i < 6U; i++) {
1538 adj = _f_scale_adj(board_cnf->ch[ch].cacs_adj[i + num_cacs_dly]);
1539 dly = _reg_PHY_CLK_CACS_SLAVE_DELAY_X[i];
1540 ddrtbl_setval(_cnf_DDR_PHY_ADR_V_REGSET, dly,
1541 data_l + (uint32_t)adj);
1542 reg_ofs = ddr_regdef_adr(dly) - DDR_PHY_ADR_V_REGSET_OFS;
1543 reg_ddrphy_write(ch, ddr_regdef_adr(dly) + 0x0100U,
1544 _cnf_DDR_PHY_ADR_V_REGSET[reg_ofs]);
1545 }
1546 }
1547 }
1548
1549 reg_ddrphy_write_a(ddr_regdef_adr(_reg_PHY_FREQ_SEL_MULTICAST_EN),
1550 BIT(ddr_regdef_lsb(_reg_PHY_FREQ_SEL_MULTICAST_EN)));
1551
1552 /* WDQDM DLY */
1553 data_l = board_cnf->dqdm_dly_w;
1554 foreach_vch(ch) {
1555 for (slice = 0U; slice < SLICE_CNT; slice++) {
1556 for (i = 0U; i <= 8U; i++) {
1557 dq = slice * 8U + (uint32_t)i;
1558 if (i == 8U) {
1559 _adj = board_cnf->ch[ch].dm_adj_w[slice];
1560 } else {
1561 _adj = board_cnf->ch[ch].dq_adj_w[dq];
1562 }
1563 adj = _f_scale_adj(_adj);
1564 ddr_setval_s(ch, slice,
1565 _reg_PHY_CLK_WRX_SLAVE_DELAY[i],
1566 data_l + (uint32_t)adj);
1567 }
1568 }
1569 }
1570
1571 /* RDQDM DLY */
1572 data_l = board_cnf->dqdm_dly_r;
1573 foreach_vch(ch) {
1574 for (slice = 0U; slice < SLICE_CNT; slice++) {
1575 for (i = 0U; i <= 8U; i++) {
1576 dq = slice * 8U + (uint32_t)i;
1577 if (i == 8U) {
1578 _adj = board_cnf->ch[ch].dm_adj_r[slice];
1579 } else {
1580 _adj = board_cnf->ch[ch].dq_adj_r[dq];
1581 }
1582 adj = _f_scale_adj(_adj);
1583 dly = _reg_PHY_RDDQS_X_FALL_SLAVE_DELAY[i];
1584 ddr_setval_s(ch, slice, dly, data_l + (uint32_t)adj);
1585 dly = _reg_PHY_RDDQS_X_RISE_SLAVE_DELAY[i];
1586 ddr_setval_s(ch, slice, dly, data_l + (uint32_t)adj);
1587 }
1588 }
1589 }
1590}
1591
1592/* DBSC register setting functions */
1593static void dbsc_regset_pre(void)
1594{
1595 uint32_t ch, csab;
1596 uint32_t data_l;
1597
1598 /* PRIMARY SETTINGS */
1599 /* LPDDR4, BL=16, DFI interface */
1600 mmio_write_32(DBSC_DBKIND, 0x0000000aU);
1601 mmio_write_32(DBSC_DBBL, 0x00000002U);
1602 mmio_write_32(DBSC_DBPHYCONF0, 0x00000001U);
1603
1604 /* FREQRATIO=2 */
1605 mmio_write_32(DBSC_DBSYSCONF1, 0x00000002U);
1606
1607 /*
1608 * DRAM SIZE REGISTER:
1609 * set all ranks as density=0(4Gb) for PHY initialization
1610 */
1611 foreach_vch(ch) {
1612 for (csab = 0U; csab < 4U; csab++) {
1613 mmio_write_32(DBSC_DBMEMCONF(ch, csab),
1614 DBMEMCONF_REGD(0U));
1615 }
1616 }
1617
1618 if (prr_product == PRR_PRODUCT_M3) {
1619 data_l = 0xe4e4e4e4U;
1620 foreach_ech(ch) {
1621 if ((ddr_phyvalid & (1U << ch)) != 0U) {
1622 data_l = (data_l & (~(0x000000FFU << (ch * 8U))))
1623 | (((board_cnf->ch[ch].dqs_swap & 0x0003U)
1624 | ((board_cnf->ch[ch].dqs_swap & 0x0030U) >> 2U)
1625 | ((board_cnf->ch[ch].dqs_swap & 0x0300U) >> 4U)
1626 | ((board_cnf->ch[ch].dqs_swap & 0x3000U) >> 6U))
1627 << (ch * 8U));
1628 }
1629 }
1630 mmio_write_32(DBSC_DBBSWAP, data_l);
1631 }
1632}
1633
1634static void dbsc_regset(void)
1635{
1636 int32_t i;
1637 uint32_t ch;
1638 uint32_t data_l;
1639 uint32_t data_l2;
1640 uint32_t wdql;
1641 uint32_t dqenltncy;
1642 uint32_t dql;
1643 uint32_t dqienltncy;
1644 uint32_t wrcslat;
1645 uint32_t wrcsgap;
1646 uint32_t rdcslat;
1647 uint32_t rdcsgap;
1648 uint32_t scfctst0_act_act;
1649 uint32_t scfctst0_rda_act;
1650 uint32_t scfctst0_wra_act;
1651 uint32_t scfctst0_pre_act;
1652 uint32_t scfctst1_rd_wr;
1653 uint32_t scfctst1_wr_rd;
1654 uint32_t scfctst1_act_rd_wr;
1655 uint32_t scfctst1_asyncofs;
1656 uint32_t dbschhrw1_sctrfcab;
1657
1658 /* RFC */
1659 js2[js2_trfcab] =
1660 _f_scale(ddr_mbps, ddr_mbpsdiv,
1661 jedec_spec2_trfc_ab[max_density] * 1000U, 0U);
1662 /* DBTR0.CL : RL */
1663 mmio_write_32(DBSC_DBTR(0), RL);
1664
1665 /* DBTR1.CWL : WL */
1666 mmio_write_32(DBSC_DBTR(1), WL);
1667
1668 /* DBTR2.AL : 0 */
1669 mmio_write_32(DBSC_DBTR(2), 0U);
1670
1671 /* DBTR3.TRCD: tRCD */
1672 mmio_write_32(DBSC_DBTR(3), js2[js2_trcd]);
1673
1674 /* DBTR4.TRPA,TRP: tRPab,tRPpb */
1675 mmio_write_32(DBSC_DBTR(4), (js2[js2_trpab] << 16) | js2[js2_trppb]);
1676
1677 /* DBTR5.TRC : use tRCpb */
1678 mmio_write_32(DBSC_DBTR(5), js2[js2_trcpb]);
1679
1680 /* DBTR6.TRAS : tRAS */
1681 mmio_write_32(DBSC_DBTR(6), js2[js2_tras]);
1682
1683 /* DBTR7.TRRD : tRRD */
1684 mmio_write_32(DBSC_DBTR(7), (js2[js2_trrd] << 16) | js2[js2_trrd]);
1685
1686 /* DBTR8.TFAW : tFAW */
1687 mmio_write_32(DBSC_DBTR(8), js2[js2_tfaw]);
1688
1689 /* DBTR9.TRDPR : tRTP */
1690 mmio_write_32(DBSC_DBTR(9), js2[js2_trtp]);
1691
1692 /* DBTR10.TWR : nWR */
1693 mmio_write_32(DBSC_DBTR(10), js1[js1_ind].nwr);
1694
1695 /*
1696 * DBTR11.TRDWR : RL + BL / 2 + Rounddown(tRPST) + PHY_ODTLoff -
1697 * odtlon + tDQSCK - tODTon,min +
1698 * PCB delay (out+in) + tPHY_ODToff
1699 */
1700 mmio_write_32(DBSC_DBTR(11),
1701 RL + (16U / 2U) + 1U + 2U - js1[js1_ind].odtlon +
1702 js2[js2_tdqsck] - js2[js2_tODTon_min] +
1703 _f_scale(ddr_mbps, ddr_mbpsdiv, 1300, 0));
1704
1705 /* DBTR12.TWRRD : WL + 1 + BL/2 + tWTR */
1706 data_l = WL + 1U + (16U / 2U) + js2[js2_twtr];
1707 mmio_write_32(DBSC_DBTR(12), (data_l << 16) | data_l);
1708
1709 /* DBTR13.TRFCAB : tRFCab */
1710 mmio_write_32(DBSC_DBTR(13), js2[js2_trfcab]);
1711
1712 /* DBTR14.TCKEHDLL,tCKEH : tCKEHCMD,tCKEHCMD */
1713 mmio_write_32(DBSC_DBTR(14),
1714 (js2[js2_tckehcmd] << 16) | (js2[js2_tckehcmd]));
1715
1716 /* DBTR15.TCKESR,TCKEL : tSR,tCKELPD */
1717 mmio_write_32(DBSC_DBTR(15), (js2[js2_tsr] << 16) | (js2[js2_tckelpd]));
1718
1719 /* DBTR16 */
1720 /* WDQL : tphy_wrlat + tphy_wrdata */
1721 wdql = ddrtbl_getval(_cnf_DDR_PI_REGSET, _reg_PI_WRLAT_F1);
1722 /* DQENLTNCY : tphy_wrlat = WL-2 : PHY_WRITE_PATH_LAT_ADD == 0
1723 * tphy_wrlat = WL-3 : PHY_WRITE_PATH_LAT_ADD != 0
1724 */
1725 dqenltncy = ddrtbl_getval(_cnf_DDR_PI_REGSET, _reg_PI_WRLAT_ADJ_F1);
1726 /* DQL : tphy_rdlat + trdata_en */
1727 /* it is not important for dbsc */
1728 dql = RL + 16U;
1729 /* DQIENLTNCY : trdata_en */
1730 dqienltncy = ddrtbl_getval(_cnf_DDR_PI_REGSET, _reg_PI_RDLAT_ADJ_F1) - 1U;
1731 mmio_write_32(DBSC_DBTR(16),
1732 (dqienltncy << 24) | (dql << 16) | (dqenltncy << 8) | wdql);
1733
1734 /* DBTR24 */
1735 /* WRCSLAT = WRLAT -5 */
1736 wrcslat = wdql - 5U;
1737 /* WRCSGAP = 5 */
1738 wrcsgap = 5U;
1739 /* RDCSLAT = RDLAT_ADJ +2 */
1740 rdcslat = dqienltncy;
1741 if (prr_product != PRR_PRODUCT_M3) {
1742 rdcslat += 2U;
1743 }
1744 /* RDCSGAP = 6 */
1745 rdcsgap = 6U;
1746 if (prr_product == PRR_PRODUCT_M3) {
1747 rdcsgap = 4U;
1748 }
1749 mmio_write_32(DBSC_DBTR(24),
1750 (rdcsgap << 24) | (rdcslat << 16) | (wrcsgap << 8) | wrcslat);
1751
1752 /* DBTR17.TMODRD,TMOD,TRDMR: tMRR,tMRD,(0) */
1753 mmio_write_32(DBSC_DBTR(17),
1754 (js2[js2_tmrr] << 24) | (js2[js2_tmrd] << 16));
1755
1756 /* DBTR18.RODTL, RODTA, WODTL, WODTA : do not use in LPDDR4 */
1757 mmio_write_32(DBSC_DBTR(18), 0);
1758
1759 /* DBTR19.TZQCL, TZQCS : do not use in LPDDR4 */
1760 mmio_write_32(DBSC_DBTR(19), 0);
1761
1762 /* DBTR20.TXSDLL, TXS : tRFCab+tCKEHCMD */
1763 data_l = js2[js2_trfcab] + js2[js2_tckehcmd];
1764 mmio_write_32(DBSC_DBTR(20), (data_l << 16) | data_l);
1765
1766 /* DBTR21.TCCD */
1767 /* DBTR23.TCCD */
1768 if (ddr_tccd == 8U) {
1769 data_l = 8U;
1770 mmio_write_32(DBSC_DBTR(21), (data_l << 16) | data_l);
1771 mmio_write_32(DBSC_DBTR(23), 0x00000002);
1772 } else if (ddr_tccd <= 11U) {
1773 data_l = 11U;
1774 mmio_write_32(DBSC_DBTR(21), (data_l << 16) | data_l);
1775 mmio_write_32(DBSC_DBTR(23), 0x00000000);
1776 } else {
1777 data_l = ddr_tccd;
1778 mmio_write_32(DBSC_DBTR(21), (data_l << 16) | data_l);
1779 mmio_write_32(DBSC_DBTR(23), 0x00000000);
1780 }
1781
1782 /* DBTR22.ZQLAT : */
1783 data_l = js2[js2_tzqcalns] * 100U; /* 1000 * 1000 ps */
1784 data_l = (data_l << 16U) | (js2[js2_tzqlat] + 24U + 20U);
1785 mmio_write_32(DBSC_DBTR(22), data_l);
1786
1787 /* DBTR25 : do not use in LPDDR4 */
1788 mmio_write_32(DBSC_DBTR(25), 0U);
1789
1790 /*
1791 * DBRNK :
1792 * DBSC_DBRNK2 rkrr
1793 * DBSC_DBRNK3 rkrw
1794 * DBSC_DBRNK4 rkwr
1795 * DBSC_DBRNK5 rkww
1796 */
1797#define _par_DBRNK_VAL (0x7007U)
1798
1799 for (i = 0; i < 4; i++) {
1800 data_l = (_par_DBRNK_VAL >> ((uint32_t)i * 4U)) & 0x0fU;
1801 data_l2 = 0U;
1802 foreach_vch(ch) {
1803 data_l2 = data_l2 | (data_l << (4U * ch));
1804 }
1805 mmio_write_32(DBSC_DBRNK(2 + i), data_l2);
1806 }
1807 mmio_write_32(DBSC_DBADJ0, 0x00000000U);
1808
1809 /* timing registers for scheduler */
1810 /* SCFCTST0 */
1811 /* SCFCTST0 ACT-ACT */
1812 scfctst0_act_act = js2[js2_trcpb] * 800UL * ddr_mbpsdiv / ddr_mbps;
1813 /* SCFCTST0 RDA-ACT */
1814 scfctst0_rda_act = ((16U / 2U) + js2[js2_trtp] - 8U +
1815 js2[js2_trppb]) * 800UL * ddr_mbpsdiv / ddr_mbps;
1816 /* SCFCTST0 WRA-ACT */
1817 scfctst0_wra_act = (WL + 1U + (16U / 2U) +
1818 js1[js1_ind].nwr) * 800UL * ddr_mbpsdiv / ddr_mbps;
1819 /* SCFCTST0 PRE-ACT */
1820 scfctst0_pre_act = js2[js2_trppb];
1821 mmio_write_32(DBSC_SCFCTST0,
1822 (scfctst0_act_act << 24) | (scfctst0_rda_act << 16) |
1823 (scfctst0_wra_act << 8) | scfctst0_pre_act);
1824
1825 /* SCFCTST1 */
1826 /* SCFCTST1 RD-WR */
1827 scfctst1_rd_wr = (mmio_read_32(DBSC_DBTR(11)) & 0xffU) * 800UL * ddr_mbpsdiv /
1828 ddr_mbps;
1829 /* SCFCTST1 WR-RD */
1830 scfctst1_wr_rd = (mmio_read_32(DBSC_DBTR(12)) & 0xff) * 800UL * ddr_mbpsdiv /
1831 ddr_mbps;
1832 /* SCFCTST1 ACT-RD/WR */
1833 scfctst1_act_rd_wr = js2[js2_trcd] * 800UL * ddr_mbpsdiv / ddr_mbps;
1834 /* SCFCTST1 ASYNCOFS */
1835 scfctst1_asyncofs = 12U;
1836 mmio_write_32(DBSC_SCFCTST1,
1837 (scfctst1_rd_wr << 24) | (scfctst1_wr_rd << 16) |
1838 (scfctst1_act_rd_wr << 8) | scfctst1_asyncofs);
1839
1840 /* DBSCHRW1 */
1841 /* DBSCHRW1 SCTRFCAB */
1842 dbschhrw1_sctrfcab = js2[js2_trfcab] * 800UL * ddr_mbpsdiv / ddr_mbps;
1843 data_l = (((mmio_read_32(DBSC_DBTR(16)) & 0x00FF0000U) >> 16) +
1844 (mmio_read_32(DBSC_DBTR(22)) & 0x0000FFFFU) +
1845 (0x28U * 2U)) * 400U * 2U * ddr_mbpsdiv / ddr_mbps + 7U;
1846 if (dbschhrw1_sctrfcab < data_l) {
1847 dbschhrw1_sctrfcab = data_l;
1848 }
1849
1850 if ((prr_product == PRR_PRODUCT_M3) && (prr_cut < PRR_PRODUCT_30)) {
1851 mmio_write_32(DBSC_DBSCHRW1, dbschhrw1_sctrfcab +
1852 ((mmio_read_32(DBSC_DBTR(22)) & 0x0000FFFFU) *
1853 400U * 2U * ddr_mbpsdiv + (ddr_mbps - 1U)) / ddr_mbps - 3U);
1854 } else {
1855 mmio_write_32(DBSC_DBSCHRW1, dbschhrw1_sctrfcab +
1856 ((mmio_read_32(DBSC_DBTR(22)) & 0x0000FFFFU) *
1857 400U * 2U * ddr_mbpsdiv + (ddr_mbps - 1U)) / ddr_mbps);
1858 }
1859
1860 /* QOS and CAM */
1861#ifdef DDR_QOS_INIT_SETTING /* only for non qos_init */
1862 /* wbkwait(0004), wbkmdhi(4,2),wbkmdlo(1,8) */
1863 mmio_write_32(DBSC_DBCAM0CNF1, 0x00043218U);
1864 /* 0(fillunit),8(dirtymax),4(dirtymin) */
1865 mmio_write_32(DBSC_DBCAM0CNF2, 0x000000F4U);
1866 /* stop_tolerance */
1867 mmio_write_32(DBSC_DBSCHRW0, 0x22421111U);
1868 /* rd-wr/wr-rd toggle priority */
1869 mmio_write_32(DBSC_SCFCTST2, 0x012F1123U);
1870 mmio_write_32(DBSC_DBSCHSZ0, 0x00000001U);
1871 mmio_write_32(DBSC_DBSCHCNT0, 0x000F0037U);
1872
1873 /* QoS Settings */
1874 mmio_write_32(DBSC_DBSCHQOS00, 0x00000F00U);
1875 mmio_write_32(DBSC_DBSCHQOS01, 0x00000B00U);
1876 mmio_write_32(DBSC_DBSCHQOS02, 0x00000000U);
1877 mmio_write_32(DBSC_DBSCHQOS03, 0x00000000U);
1878 mmio_write_32(DBSC_DBSCHQOS40, 0x00000300U);
1879 mmio_write_32(DBSC_DBSCHQOS41, 0x000002F0U);
1880 mmio_write_32(DBSC_DBSCHQOS42, 0x00000200U);
1881 mmio_write_32(DBSC_DBSCHQOS43, 0x00000100U);
1882 mmio_write_32(DBSC_DBSCHQOS90, 0x00000100U);
1883 mmio_write_32(DBSC_DBSCHQOS91, 0x000000F0U);
1884 mmio_write_32(DBSC_DBSCHQOS92, 0x000000A0U);
1885 mmio_write_32(DBSC_DBSCHQOS93, 0x00000040U);
1886 mmio_write_32(DBSC_DBSCHQOS120, 0x00000040U);
1887 mmio_write_32(DBSC_DBSCHQOS121, 0x00000030U);
1888 mmio_write_32(DBSC_DBSCHQOS122, 0x00000020U);
1889 mmio_write_32(DBSC_DBSCHQOS123, 0x00000010U);
1890 mmio_write_32(DBSC_DBSCHQOS130, 0x00000100U);
1891 mmio_write_32(DBSC_DBSCHQOS131, 0x000000F0U);
1892 mmio_write_32(DBSC_DBSCHQOS132, 0x000000A0U);
1893 mmio_write_32(DBSC_DBSCHQOS133, 0x00000040U);
1894 mmio_write_32(DBSC_DBSCHQOS140, 0x000000C0U);
1895 mmio_write_32(DBSC_DBSCHQOS141, 0x000000B0U);
1896 mmio_write_32(DBSC_DBSCHQOS142, 0x00000080U);
1897 mmio_write_32(DBSC_DBSCHQOS143, 0x00000040U);
1898 mmio_write_32(DBSC_DBSCHQOS150, 0x00000040U);
1899 mmio_write_32(DBSC_DBSCHQOS151, 0x00000030U);
1900 mmio_write_32(DBSC_DBSCHQOS152, 0x00000020U);
1901 mmio_write_32(DBSC_DBSCHQOS153, 0x00000010U);
1902
1903 mmio_write_32(QOSCTRL_RAEN, 0x00000001U);
1904#endif /* DDR_QOS_INIT_SETTING */
1905
1906 /* resrdis */
1907 mmio_write_32(DBSC_DBBCAMDIS, 0x00000001U);
1908}
1909
1910static void dbsc_regset_post(void)
1911{
1912 uint32_t slice, rdlat_max, rdlat_min;
1913 uint32_t ch, cs;
1914 uint32_t data_l;
1915 uint32_t srx;
1916
1917 rdlat_max = 0U;
1918 rdlat_min = 0xffffU;
1919 foreach_vch(ch) {
1920 for (cs = 0U; cs < CS_CNT; cs++) {
1921 if ((ch_have_this_cs[cs] & (1U << ch)) != 0U) {
1922 for (slice = 0U; slice < SLICE_CNT; slice++) {
1923 ddr_setval_s(ch, slice,
1924 _reg_PHY_PER_CS_TRAINING_INDEX,
1925 cs);
1926 data_l = ddr_getval_s(ch, slice,
1927 _reg_PHY_RDDQS_LATENCY_ADJUST);
1928 if (data_l > rdlat_max) {
1929 rdlat_max = data_l;
1930 }
1931 if (data_l < rdlat_min) {
1932 rdlat_min = data_l;
1933 }
1934 }
1935 }
1936 }
1937 }
1938
1939 mmio_write_32(DBSC_DBTR(24),
1940 ((rdlat_max + 2U) << 24) +
1941 ((rdlat_max + 2U) << 16) +
1942 mmio_read_32(DBSC_DBTR(24)));
1943
1944 /* set ddr density information */
1945 foreach_ech(ch) {
1946 for (cs = 0U; cs < CS_CNT; cs++) {
1947 if (ddr_density[ch][cs] == 0xffU) {
1948 mmio_write_32(DBSC_DBMEMCONF(ch, cs), 0x00U);
1949 } else {
1950 mmio_write_32(DBSC_DBMEMCONF(ch, cs),
1951 DBMEMCONF_REGD(ddr_density[ch]
1952 [cs]));
1953 }
1954 }
1955 mmio_write_32(DBSC_DBMEMCONF(ch, 2), 0x00000000U);
1956 mmio_write_32(DBSC_DBMEMCONF(ch, 3), 0x00000000U);
1957 }
1958
1959 mmio_write_32(DBSC_DBBUS0CNF1, 0x00000010U);
1960
1961 /* set DBI */
1962 if (board_cnf->dbi_en != 0U) {
1963 mmio_write_32(DBSC_DBDBICNT, 0x00000003U);
1964 }
1965
1966 /* set REFCYCLE */
1967 data_l = (get_refperiod()) * ddr_mbps / 2000U / ddr_mbpsdiv;
1968 mmio_write_32(DBSC_DBRFCNF1, 0x00080000U | (data_l & 0x0000ffffU));
1969 mmio_write_32(DBSC_DBRFCNF2, 0x00010000U | DBSC_REFINTS);
1970
1971#if RCAR_REWT_TRAINING != 0
1972 /* Periodic-WriteDQ Training seeting */
1973 if ((prr_product == PRR_PRODUCT_M3) &&
1974 (prr_cut == PRR_PRODUCT_10)) {
1975 /* G2M Ver.1.0 not support */
1976 } else {
1977 /* G2M Ver.1.1 or later */
1978 mmio_write_32(DBSC_DBDFIPMSTRCNF, 0x00000000U);
1979
1980 ddr_setval_ach_as(_reg_PHY_WDQLVL_PATT, 0x04U);
1981 ddr_setval_ach_as(_reg_PHY_WDQLVL_QTR_DLY_STEP, 0x0FU);
1982 ddr_setval_ach_as(_reg_PHY_WDQLVL_DLY_STEP, 0x50U);
1983 ddr_setval_ach_as(_reg_PHY_WDQLVL_DQDM_SLV_DLY_START, 0x0300U);
1984
1985 ddr_setval_ach(_reg_PI_WDQLVL_CS_MAP,
1986 ddrtbl_getval(_cnf_DDR_PI_REGSET,
1987 _reg_PI_WDQLVL_CS_MAP));
1988 ddr_setval_ach(_reg_PI_LONG_COUNT_MASK, 0x1fU);
1989 ddr_setval_ach(_reg_PI_WDQLVL_VREF_EN, 0x00U);
1990 ddr_setval_ach(_reg_PI_WDQLVL_ROTATE, 0x01U);
1991 ddr_setval_ach(_reg_PI_TREF_F0, 0x0000U);
1992 ddr_setval_ach(_reg_PI_TREF_F1, 0x0000U);
1993 ddr_setval_ach(_reg_PI_TREF_F2, 0x0000U);
1994
1995 if (prr_product == PRR_PRODUCT_M3) {
1996 ddr_setval_ach(_reg_PI_WDQLVL_EN, 0x02U);
1997 } else {
1998 ddr_setval_ach(_reg_PI_WDQLVL_EN_F1, 0x02U);
1999 }
2000 ddr_setval_ach(_reg_PI_WDQLVL_PERIODIC, 0x01U);
2001
2002 /* DFI_PHYMSTR_ACK , WTmode setting */
2003 /* DFI_PHYMSTR_ACK: WTmode =b'01 */
2004 mmio_write_32(DBSC_DBDFIPMSTRCNF, 0x00000011U);
2005 }
2006#endif /* RCAR_REWT_TRAINING */
2007 /* periodic dram zqcal enable */
2008 mmio_write_32(DBSC_DBCALCNF, 0x01000010U);
2009
2010 /* periodic phy ctrl update enable */
2011 if ((prr_product == PRR_PRODUCT_M3) &&
2012 (prr_cut < PRR_PRODUCT_30)) {
2013 /* non : G2M Ver.1.x not support */
2014 } else {
2015 mmio_write_32(DBSC_DBDFICUPDCNF, 0x28240001U);
2016 }
2017
2018#ifdef DDR_BACKUPMODE
2019 /* SRX */
2020 srx = 0x0A840001U; /* for All channels */
2021 if (ddr_backup == DRAM_BOOT_STATUS_WARM) {
2022#ifdef DDR_BACKUPMODE_HALF /* for Half channel(ch0, 1 only) */
2023 NOTICE("BL2: [DEBUG_MESS] DDR_BACKUPMODE_HALF\n");
2024 srx = 0x0A040001U;
2025#endif /* DDR_BACKUPMODE_HALF */
2026 send_dbcmd(srx);
2027 }
2028#endif /* DDR_BACKUPMODE */
2029
2030 /* set Auto Refresh */
2031 mmio_write_32(DBSC_DBRFEN, 0x00000001U);
2032
2033#if RCAR_REWT_TRAINING != 0
2034 /* Periodic WriteDQ Traning */
2035 if ((prr_product == PRR_PRODUCT_M3) &&
2036 (prr_cut == PRR_PRODUCT_10)) {
2037 /* non : G2M Ver.1.0 not support */
2038 } else {
2039 /* G2M Ver.1.1 or later */
2040 ddr_setval_ach(_reg_PI_WDQLVL_INTERVAL, 0x0100U);
2041 }
2042#endif /* RCAR_REWT_TRAINING */
2043
2044 /* dram access enable */
2045 mmio_write_32(DBSC_DBACEN, 0x00000001U);
2046
2047 MSG_LF(__func__ "(done)");
2048}
2049
2050/* DFI_INIT_START */
2051static uint32_t dfi_init_start(void)
2052{
2053 uint32_t ch;
2054 uint32_t phytrainingok;
2055 uint32_t retry;
2056 uint32_t data_l;
2057 uint32_t ret = 0U;
2058 const uint32_t RETRY_MAX = 0x10000U;
2059
2060 ddr_setval_ach_as(_reg_PHY_DLL_RST_EN, 0x02U);
2061 dsb_sev();
2062 ddrphy_regif_idle();
2063
2064 /* dll_rst negate */
2065 foreach_vch(ch) {
2066 mmio_write_32(DBSC_DBPDCNT3(ch), 0x0000CF01U);
2067 }
2068 dsb_sev();
2069
2070 /* wait init_complete */
2071 phytrainingok = 0U;
2072 retry = 0U;
2073 while (retry++ < RETRY_MAX) {
2074 foreach_vch(ch) {
2075 data_l = mmio_read_32(DBSC_DBDFISTAT(ch));
2076 if (data_l & 0x00000001U) {
2077 phytrainingok |= (1U << ch);
2078 }
2079 }
2080 dsb_sev();
2081 if (phytrainingok == ddr_phyvalid) {
2082 break;
2083 }
2084 if (retry % 256U == 0U) {
2085 ddr_setval_ach_as(_reg_SC_PHY_RX_CAL_START, 0x01U);
2086 }
2087 }
2088
2089 /* all ch ok? */
2090 if ((phytrainingok & ddr_phyvalid) != ddr_phyvalid) {
2091 ret = 0xffU;
2092 goto done;
2093 }
2094
2095 /*
2096 * dbdficnt0:
2097 * dfi_dram_clk_disable=0
2098 * dfi_frequency = 0
2099 * freq_ratio = 01 (2:1)
2100 * init_start =0
2101 */
2102 foreach_vch(ch) {
2103 mmio_write_32(DBSC_DBDFICNT(ch), 0x00000010U);
2104 }
2105 dsb_sev();
2106done:
2107 return ret;
2108}
2109
2110/* drivability setting : CMOS MODE ON/OFF */
2111static void change_lpddr4_en(uint32_t mode)
2112{
2113 uint32_t ch;
2114 uint32_t i;
2115 uint32_t data_l;
2116 const uint32_t _reg_PHY_PAD_DRIVE_X[3] = {
2117 _reg_PHY_PAD_ADDR_DRIVE,
2118 _reg_PHY_PAD_CLK_DRIVE,
2119 _reg_PHY_PAD_CS_DRIVE
2120 };
2121
2122 foreach_vch(ch) {
2123 for (i = 0U; i < 3U; i++) {
2124 data_l = ddr_getval(ch, _reg_PHY_PAD_DRIVE_X[i]);
2125 if (mode != 0U) {
2126 data_l |= (1U << 14);
2127 } else {
2128 data_l &= ~(1U << 14);
2129 }
2130 ddr_setval(ch, _reg_PHY_PAD_DRIVE_X[i], data_l);
2131 }
2132 }
2133}
2134
2135/* drivability setting */
2136static uint32_t set_term_code(void)
2137{
2138 uint32_t i;
2139 uint32_t ch, index;
2140 uint32_t data_l;
2141 uint32_t chip_id[2];
2142 uint32_t term_code;
2143 uint32_t override;
2144
2145 term_code = ddrtbl_getval(_cnf_DDR_PHY_ADR_G_REGSET,
2146 _reg_PHY_PAD_DATA_TERM);
2147 override = 0U;
2148 for (i = 0U; i < 2U; i++) {
2149 chip_id[i] = mmio_read_32(LIFEC_CHIPID(i));
2150 }
2151
2152 index = 0U;
2153 while (true) {
2154 if (termcode_by_sample[index][0] == 0xffffffff) {
2155 break;
2156 }
2157 if ((termcode_by_sample[index][0] == chip_id[0]) &&
2158 (termcode_by_sample[index][1] == chip_id[1])) {
2159 term_code = termcode_by_sample[index][2];
2160 override = 1;
2161 break;
2162 }
2163 index++;
2164 }
2165
2166 if (override != 0U) {
2167 for (index = 0U; index < _reg_PHY_PAD_TERM_X_NUM; index++) {
2168 data_l =
2169 ddrtbl_getval(_cnf_DDR_PHY_ADR_G_REGSET,
2170 _reg_PHY_PAD_TERM_X[index]);
2171 data_l = (data_l & 0xfffe0000U) | term_code;
2172 ddr_setval_ach(_reg_PHY_PAD_TERM_X[index], data_l);
2173 }
2174 } else if ((prr_product == PRR_PRODUCT_M3) &&
2175 (prr_cut == PRR_PRODUCT_10)) {
2176 /* non */
2177 } else {
2178 ddr_setval_ach(_reg_PHY_PAD_TERM_X[0],
2179 (ddrtbl_getval(_cnf_DDR_PHY_ADR_G_REGSET,
2180 _reg_PHY_PAD_TERM_X[0]) & 0xFFFE0000U));
2181 ddr_setval_ach(_reg_PHY_CAL_CLEAR_0, 0x01U);
2182 ddr_setval_ach(_reg_PHY_CAL_START_0, 0x01U);
2183 foreach_vch(ch) {
2184 do {
2185 data_l =
2186 ddr_getval(ch, _reg_PHY_CAL_RESULT2_OBS_0);
2187 } while (!(data_l & 0x00800000U));
2188 }
2189
2190 /* G2M Ver.1.1 or later */
2191 foreach_vch(ch) {
2192 for (index = 0U; index < _reg_PHY_PAD_TERM_X_NUM;
2193 index++) {
2194 data_l = ddr_getval(ch, _reg_PHY_PAD_TERM_X[index]);
2195 ddr_setval(ch, _reg_PHY_PAD_TERM_X[index],
2196 (data_l & 0xFFFE0FFFU) | 0x00015000U);
2197 }
2198 }
2199 }
2200
2201 ddr_padcal_tcompensate_getinit(override);
2202
2203 return 0U;
2204}
2205
2206/* DDR mode register setting */
2207static void ddr_register_set(void)
2208{
2209 int32_t fspwp;
2210 uint32_t tmp;
2211
2212 for (fspwp = 1; fspwp >= 0; fspwp--) {
2213 /*MR13, fspwp */
2214 send_dbcmd(0x0e840d08U | ((2U - fspwp) << 6));
2215
2216 tmp = ddrtbl_getval(_cnf_DDR_PI_REGSET,
2217 reg_pi_mr1_data_fx_csx[fspwp][0]);
2218 send_dbcmd(0x0e840100U | tmp);
2219
2220 tmp = ddrtbl_getval(_cnf_DDR_PI_REGSET,
2221 reg_pi_mr2_data_fx_csx[fspwp][0]);
2222 send_dbcmd(0x0e840200U | tmp);
2223
2224 tmp = ddrtbl_getval(_cnf_DDR_PI_REGSET,
2225 reg_pi_mr3_data_fx_csx[fspwp][0]);
2226 send_dbcmd(0x0e840300U | tmp);
2227
2228 tmp = ddrtbl_getval(_cnf_DDR_PI_REGSET,
2229 reg_pi_mr11_data_fx_csx[fspwp][0]);
2230 send_dbcmd(0x0e840b00U | tmp);
2231
2232 tmp = ddrtbl_getval(_cnf_DDR_PI_REGSET,
2233 reg_pi_mr12_data_fx_csx[fspwp][0]);
2234 send_dbcmd(0x0e840c00U | tmp);
2235
2236 tmp = ddrtbl_getval(_cnf_DDR_PI_REGSET,
2237 reg_pi_mr14_data_fx_csx[fspwp][0]);
2238 send_dbcmd(0x0e840e00U | tmp);
2239 /* MR22 */
2240 send_dbcmd(0x0e841616U);
2241
2242 /* ZQCAL start */
2243 send_dbcmd(0x0d84004FU);
2244
2245 /* ZQLAT */
2246 send_dbcmd(0x0d840051U);
2247 }
2248
2249 /* MR13, fspwp */
2250 send_dbcmd(0x0e840d08U);
2251}
2252
2253/* Training handshake functions */
2254static inline uint32_t wait_freqchgreq(uint32_t assert)
2255{
2256 uint32_t data_l;
2257 uint32_t count;
2258 uint32_t ch;
2259
2260 count = 100000U;
2261
2262 if (assert != 0U) {
2263 do {
2264 data_l = 1U;
2265 foreach_vch(ch) {
2266 data_l &= mmio_read_32(DBSC_DBPDSTAT(ch));
2267 }
2268 count = count - 1U;
2269 } while (((data_l & 0x01U) != 0x01U) && (count != 0U));
2270 } else {
2271 do {
2272 data_l = 0U;
2273 foreach_vch(ch) {
2274 data_l |= mmio_read_32(DBSC_DBPDSTAT(ch));
2275 }
2276 count = count - 1U;
2277 } while (((data_l & 0x01U) != 0x00U) && (count != 0U));
2278 }
2279
2280 return (count == 0U);
2281}
2282
2283static inline void set_freqchgack(uint32_t assert)
2284{
2285 uint32_t ch;
2286 uint32_t data_l;
2287
2288 if (assert != 0U) {
2289 data_l = 0x0CF20000U;
2290 } else {
2291 data_l = 0x00000000U;
2292 }
2293
2294 foreach_vch(ch) {
2295 mmio_write_32(DBSC_DBPDCNT2(ch), data_l);
2296 }
2297}
2298
2299static inline void set_dfifrequency(uint32_t freq)
2300{
2301 uint32_t ch;
2302
2303 foreach_vch(ch) {
2304 mmio_clrsetbits_32(DBSC_DBDFICNT(ch), 0x1fU << 24, freq << 24);
2305 }
2306 dsb_sev();
2307}
2308
2309static uint32_t pll3_freq(uint32_t on)
2310{
2311 uint32_t timeout;
2312
2313 timeout = wait_freqchgreq(1U);
2314
2315 if (timeout != 0U) {
2316 return 1U;
2317 }
2318
2319 pll3_control(on);
2320 set_dfifrequency(on);
2321
2322 set_freqchgack(1U);
2323 timeout = wait_freqchgreq(0U);
2324 set_freqchgack(0U);
2325
2326 if (timeout != 0U) {
2327 FATAL_MSG("BL2: Time out[2]\n");
2328 return 1U;
2329 }
2330
2331 return 0U;
2332}
2333
2334/* update dly */
2335static void update_dly(void)
2336{
2337 ddr_setval_ach(_reg_SC_PHY_MANUAL_UPDATE, 0x01U);
2338 ddr_setval_ach(_reg_PHY_ADRCTL_MANUAL_UPDATE, 0x01U);
2339}
2340
2341/* training by pi */
2342static uint32_t pi_training_go(void)
2343{
2344 uint32_t flag;
2345 uint32_t data_l;
2346 uint32_t retry;
2347 const uint32_t RETRY_MAX = 4096U * 16U;
2348 uint32_t ch;
2349 uint32_t mst_ch;
2350 uint32_t cur_frq;
2351 uint32_t complete;
2352 uint32_t frqchg_req;
2353
2354 /* pi_start */
2355 ddr_setval_ach(_reg_PI_START, 0x01U);
2356 foreach_vch(ch) {
2357 ddr_getval(ch, _reg_PI_INT_STATUS);
2358 }
2359
2360 /* set dfi_phymstr_ack = 1 */
2361 mmio_write_32(DBSC_DBDFIPMSTRCNF, 0x00000001U);
2362 dsb_sev();
2363
2364 /* wait pi_int_status[0] */
2365 mst_ch = 0U;
2366 flag = 0U;
2367 complete = 0U;
2368 cur_frq = 0U;
2369 for (retry = 0U; retry < RETRY_MAX; retry++) {
2370 frqchg_req = mmio_read_32(DBSC_DBPDSTAT(mst_ch)) & 0x01;
2371
2372 if (frqchg_req != 0U) {
2373 if (cur_frq != 0U) {
2374 /* Low frequency */
2375 flag = pll3_freq(0U);
2376 cur_frq = 0U;
2377 } else {
2378 /* High frequency */
2379 flag = pll3_freq(1U);
2380 cur_frq = 1U;
2381 }
2382 if (flag != 0U) {
2383 break;
2384 }
2385 } else {
2386 if (cur_frq != 0U) {
2387 foreach_vch(ch) {
2388 if ((complete & (1U << ch)) != 0U) {
2389 continue;
2390 }
2391 data_l = ddr_getval(ch, _reg_PI_INT_STATUS);
2392 if ((data_l & 0x01U) != 0U) {
2393 complete |= (1U << ch);
2394 }
2395 }
2396 if (complete == ddr_phyvalid) {
2397 break;
2398 }
2399 }
2400 }
2401 }
2402 foreach_vch(ch) {
2403 /* dummy read */
2404 data_l = ddr_getval_s(ch, 0U, _reg_PHY_CAL_RESULT2_OBS_0);
2405 data_l = ddr_getval(ch, _reg_PI_INT_STATUS);
2406 ddr_setval(ch, _reg_PI_INT_ACK, data_l);
2407 }
2408 if (ddrphy_regif_chk() != 0U) {
2409 complete = 0xfdU;
2410 }
2411 return complete;
2412}
2413
2414/* Initialize DDR */
2415static uint32_t init_ddr(void)
2416{
2417 uint32_t i;
2418 uint32_t data_l;
2419 uint32_t phytrainingok;
2420 uint32_t ch, slice;
2421 uint32_t index;
2422 uint32_t err;
2423 int16_t adj;
2424
2425 MSG_LF(__func__ ":0\n");
2426
2427 /* unlock phy */
2428 /* Unlock DDRPHY register(AGAIN) */
2429 foreach_vch(ch) {
2430 mmio_write_32(DBSC_DBPDLK(ch), 0x0000A55AU);
2431 }
2432 dsb_sev();
2433
2434 reg_ddrphy_write_a(0x00001010U, 0x00000001U);
2435 /* DBSC register pre-setting */
2436 dbsc_regset_pre();
2437
2438 /* load ddrphy registers */
2439 ddrtbl_load();
2440
2441 /* configure ddrphy registers */
2442 ddr_config();
2443
2444 /* dfi_reset assert */
2445 foreach_vch(ch) {
2446 mmio_write_32(DBSC_DBPDCNT0(ch), 0x01U);
2447 }
2448 dsb_sev();
2449
2450 /* dbsc register set */
2451 dbsc_regset();
2452 MSG_LF(__func__ ":1\n");
2453
2454 /* dfi_reset negate */
2455 foreach_vch(ch) {
2456 mmio_write_32(DBSC_DBPDCNT0(ch), 0x00U);
2457 }
2458 dsb_sev();
2459
2460 /* dfi_init_start (start ddrphy) */
2461 err = dfi_init_start();
2462 if (err != 0U) {
2463 return INITDRAM_ERR_I;
2464 }
2465 MSG_LF(__func__ ":2\n");
2466
2467 /* ddr backupmode end */
2468#ifdef DDR_BACKUPMODE
2469 if (ddr_backup != 0U) {
2470 NOTICE("BL2: [WARM_BOOT]\n");
2471 } else {
2472 NOTICE("BL2: [COLD_BOOT]\n");
2473 }
2474#endif
2475 MSG_LF(__func__ ":3\n");
2476
2477 /* override term code after dfi_init_complete */
2478 err = set_term_code();
2479 if (err != 0U) {
2480 return INITDRAM_ERR_I;
2481 }
2482 MSG_LF(__func__ ":4\n");
2483
2484 /* rx offset calibration */
2485 if (prr_cut > PRR_PRODUCT_11) {
2486 err = rx_offset_cal_hw();
2487 } else {
2488 err = rx_offset_cal();
2489 }
2490 if (err != 0U) {
2491 return INITDRAM_ERR_O;
2492 }
2493 MSG_LF(__func__ ":5\n");
2494
2495 /* Dummy PDE */
2496 send_dbcmd(0x08840000U);
2497
2498 /* PDX */
2499 send_dbcmd(0x08840001U);
2500
2501 /* check register i/f is alive */
2502 err = ddrphy_regif_chk();
2503 if (err != 0U) {
2504 return INITDRAM_ERR_O;
2505 }
2506 MSG_LF(__func__ ":6\n");
2507
2508 /* phy initialize end */
2509
2510 /* setup DDR mode registers */
2511 /* CMOS MODE */
2512 change_lpddr4_en(0);
2513
2514 /* MRS */
2515 ddr_register_set();
2516
2517 /* Thermal sensor setting */
2518 /* THCTR Bit6: PONM=0 , Bit0: THSST=1 */
2519 data_l = (mmio_read_32(THS1_THCTR) & 0xFFFFFFBFU) | 0x00000001U;
2520 mmio_write_32(THS1_THCTR, data_l);
2521
2522 /* LPDDR4 MODE */
2523 change_lpddr4_en(1);
2524
2525 MSG_LF(__func__ ":7\n");
2526
2527 /* mask CS_MAP if RANKx is not found */
2528 foreach_vch(ch) {
2529 data_l = ddr_getval(ch, _reg_PI_CS_MAP);
2530 if ((ch_have_this_cs[1] & (1U << ch)) == 0U) {
2531 data_l = data_l & 0x05U;
2532 }
2533 ddr_setval(ch, _reg_PI_CS_MAP, data_l);
2534 }
2535
2536 /* exec pi_training */
2537 reg_ddrphy_write_a(ddr_regdef_adr(_reg_PHY_FREQ_SEL_MULTICAST_EN),
2538 BIT(ddr_regdef_lsb(_reg_PHY_FREQ_SEL_MULTICAST_EN)));
2539 ddr_setval_ach_as(_reg_PHY_PER_CS_TRAINING_MULTICAST_EN, 0x00U);
2540
2541 foreach_vch(ch) {
2542 for (slice = 0U; slice < SLICE_CNT; slice++) {
2543 ddr_setval_s(ch, slice,
2544 _reg_PHY_PER_CS_TRAINING_EN,
2545 ((ch_have_this_cs[1]) >> ch) & 0x01U);
2546 }
2547 }
2548
2549 phytrainingok = pi_training_go();
2550
2551 if (ddr_phyvalid != (phytrainingok & ddr_phyvalid)) {
2552 return INITDRAM_ERR_T | phytrainingok;
2553 }
2554
2555 MSG_LF(__func__ ":8\n");
2556
2557 /* CACS DLY ADJUST */
2558 data_l = board_cnf->cacs_dly + (uint32_t)_f_scale_adj(board_cnf->cacs_dly_adj);
2559 foreach_vch(ch) {
2560 for (i = 0U; i < _reg_PHY_CLK_CACS_SLAVE_DELAY_X_NUM; i++) {
2561 adj = _f_scale_adj(board_cnf->ch[ch].cacs_adj[i]);
2562 ddr_setval(ch, _reg_PHY_CLK_CACS_SLAVE_DELAY_X[i],
2563 data_l + (uint32_t)adj);
2564 }
2565
2566 if (ddr_phycaslice == 1U) {
2567 for (i = 0U; i < 6U; i++) {
2568 index = i + _reg_PHY_CLK_CACS_SLAVE_DELAY_X_NUM;
2569 adj = _f_scale_adj(board_cnf->ch[ch].cacs_adj[index]);
2570 ddr_setval_s(ch, 2U,
2571 _reg_PHY_CLK_CACS_SLAVE_DELAY_X[i],
2572 data_l + (uint32_t)adj);
2573 }
2574 }
2575 }
2576
2577 update_dly();
2578 MSG_LF(__func__ ":9\n");
2579
2580 /* Adjust write path latency */
2581 if (ddrtbl_getval(_cnf_DDR_PHY_SLICE_REGSET, _reg_PHY_WRITE_PATH_LAT_ADD) != 0U) {
2582 adjust_wpath_latency();
2583 }
2584
2585 /* RDQLVL Training */
2586 if (ddrtbl_getval(_cnf_DDR_PHY_SLICE_REGSET, _reg_PHY_IE_MODE) == 0U) {
2587 ddr_setval_ach_as(_reg_PHY_IE_MODE, 0x01U);
2588 }
2589
2590 err = rdqdm_man();
2591
2592 if (ddrtbl_getval(_cnf_DDR_PHY_SLICE_REGSET, _reg_PHY_IE_MODE) == 0U) {
2593 ddr_setval_ach_as(_reg_PHY_IE_MODE, 0x00U);
2594 }
2595
2596 if (err != 0U) {
2597 return INITDRAM_ERR_T;
2598 }
2599 update_dly();
2600 MSG_LF(__func__ ":10\n");
2601
2602 /* WDQLVL Training */
2603 err = wdqdm_man();
2604 if (err != 0U) {
2605 return INITDRAM_ERR_T;
2606 }
2607 update_dly();
2608 MSG_LF(__func__ ":11\n");
2609
2610 dbsc_regset_post();
2611 MSG_LF(__func__ ":12\n");
2612
2613 return phytrainingok;
2614}
2615
2616/* SW LEVELING COMMON */
2617static uint32_t swlvl1(uint32_t ddr_csn, uint32_t reg_cs, uint32_t reg_kick)
2618{
2619 const uint32_t RETRY_MAX = 0x1000U;
2620 uint32_t ch, data_l;
2621 uint32_t waiting;
2622 uint32_t retry;
2623 uint32_t err = 0U;
2624
2625 /* set EXIT -> OP_DONE is cleared */
2626 ddr_setval_ach(_reg_PI_SWLVL_EXIT, 0x01);
2627
2628 /* kick */
2629 foreach_vch(ch) {
2630 if ((ch_have_this_cs[ddr_csn % 2U] & (1U << ch)) != 0U) {
2631 ddr_setval(ch, reg_cs, ddr_csn);
2632 ddr_setval(ch, reg_kick, 0x01U);
2633 }
2634 }
2635 foreach_vch(ch) {
2636 /*PREPARE ADDR REGISTER (for SWLVL_OP_DONE) */
2637 ddr_getval(ch, _reg_PI_SWLVL_OP_DONE);
2638 }
2639 waiting = ch_have_this_cs[ddr_csn % 2U];
2640 dsb_sev();
2641 retry = RETRY_MAX;
2642 do {
2643 foreach_vch(ch) {
2644 if ((waiting & (1U << ch)) == 0U) {
2645 continue;
2646 }
2647 data_l = ddr_getval(ch, _reg_PI_SWLVL_OP_DONE);
2648 if ((data_l & 0x01U) != 0U) {
2649 waiting &= ~(1U << ch);
2650 }
2651 }
2652 retry--;
2653 } while ((waiting != 0U) && (retry > 0U));
2654 if (retry == 0U) {
2655 err = 1U;
2656 }
2657
2658 dsb_sev();
2659 /* set EXIT -> OP_DONE is cleared */
2660 ddr_setval_ach(_reg_PI_SWLVL_EXIT, 0x01U);
2661 dsb_sev();
2662
2663 return err;
2664}
2665
2666/* WDQ TRAINING */
2667#ifndef DDR_FAST_INIT
2668static void wdqdm_clr1(uint32_t ch, uint32_t ddr_csn)
2669{
2670 uint32_t cs, slice;
2671 uint32_t data_l;
2672 int32_t i, k;
2673
2674 /* clr of training results buffer */
2675 cs = ddr_csn % 2U;
2676 data_l = board_cnf->dqdm_dly_w;
2677 for (slice = 0U; slice < SLICE_CNT; slice++) {
2678 k = (board_cnf->ch[ch].dqs_swap >> (4 * slice)) & 0x0f;
2679 if (((k >= 2) && (ddr_csn < 2)) || ((k < 2) && (ddr_csn >= 2))) {
2680 continue;
2681 }
2682
2683 for (i = 0; i <= 8; i++) {
2684 if ((ch_have_this_cs[CS_CNT - 1 - cs] & (1U << ch)) != 0U) {
2685 wdqdm_dly[ch][cs][slice][i] =
2686 wdqdm_dly[ch][CS_CNT - 1 - cs][slice][i];
2687 } else {
2688 wdqdm_dly[ch][cs][slice][i] = data_l;
2689 }
2690 wdqdm_le[ch][cs][slice][i] = 0U;
2691 wdqdm_te[ch][cs][slice][i] = 0U;
2692 }
2693 wdqdm_st[ch][cs][slice] = 0U;
2694 wdqdm_win[ch][cs][slice] = 0U;
2695 }
2696}
2697
2698static uint32_t wdqdm_ana1(uint32_t ch, uint32_t ddr_csn)
2699{
2700 const uint32_t _par_WDQLVL_RETRY_THRES = 0x7c0U;
2701 uint32_t cs, slice;
2702 uint32_t data_l;
2703 int32_t min_win;
2704 int32_t i, k;
2705 uint32_t err;
2706 int32_t win;
2707 int8_t _adj;
2708 int16_t adj;
2709 uint32_t dq;
2710
2711 /* analysis of training results */
2712 err = 0U;
2713 for (slice = 0U; slice < SLICE_CNT; slice += 1U) {
2714 k = (board_cnf->ch[ch].dqs_swap >> (4 * slice)) & 0x0f;
2715 if (((k >= 2) && (ddr_csn < 2)) || ((k < 2) && (ddr_csn >= 2))) {
2716 continue;
2717 }
2718
2719 cs = ddr_csn % 2U;
2720 ddr_setval_s(ch, slice, _reg_PHY_PER_CS_TRAINING_INDEX, cs);
2721 for (i = 0; i < 9; i++) {
2722 dq = slice * 8U + i;
2723 if (i == 8) {
2724 _adj = board_cnf->ch[ch].dm_adj_w[slice];
2725 } else {
2726 _adj = board_cnf->ch[ch].dq_adj_w[dq];
2727 }
2728 adj = _f_scale_adj(_adj);
2729
2730 data_l =
2731 ddr_getval_s(ch, slice,
2732 _reg_PHY_CLK_WRX_SLAVE_DELAY[i]) + adj;
2733 ddr_setval_s(ch, slice, _reg_PHY_CLK_WRX_SLAVE_DELAY[i],
2734 data_l);
2735 wdqdm_dly[ch][cs][slice][i] = data_l;
2736 }
2737 ddr_setval_s(ch, slice, _reg_PHY_PER_CS_TRAINING_EN, 0x00);
2738 data_l = ddr_getval_s(ch, slice, _reg_PHY_WDQLVL_STATUS_OBS);
2739 wdqdm_st[ch][cs][slice] = data_l;
2740 min_win = INT_LEAST32_MAX;
2741 for (i = 0; i <= 8; i++) {
2742 ddr_setval_s(ch, slice, _reg_PHY_WDQLVL_DQDM_OBS_SELECT,
2743 i);
2744
2745 data_l =
2746 ddr_getval_s(ch, slice,
2747 _reg_PHY_WDQLVL_DQDM_TE_DLY_OBS);
2748 wdqdm_te[ch][cs][slice][i] = data_l;
2749 data_l =
2750 ddr_getval_s(ch, slice,
2751 _reg_PHY_WDQLVL_DQDM_LE_DLY_OBS);
2752 wdqdm_le[ch][cs][slice][i] = data_l;
2753 win = (int32_t)wdqdm_te[ch][cs][slice][i] -
2754 wdqdm_le[ch][cs][slice][i];
2755 if (min_win > win) {
2756 min_win = win;
2757 }
2758 if (data_l >= _par_WDQLVL_RETRY_THRES) {
2759 err = 2;
2760 }
2761 }
2762 wdqdm_win[ch][cs][slice] = min_win;
2763 ddr_setval_s(ch, slice, _reg_PHY_PER_CS_TRAINING_EN,
2764 ((ch_have_this_cs[1]) >> ch) & 0x01);
2765 }
2766 return err;
2767}
2768#endif/* DDR_FAST_INIT */
2769
2770static void wdqdm_cp(uint32_t ddr_csn, uint32_t restore)
2771{
2772 uint32_t tgt_cs, src_cs;
2773 uint32_t ch, slice;
2774 uint32_t tmp_r;
2775 uint32_t i;
2776
2777 /* copy of training results */
2778 foreach_vch(ch) {
2779 for (tgt_cs = 0U; tgt_cs < CS_CNT; tgt_cs++) {
2780 for (slice = 0U; slice < SLICE_CNT; slice++) {
2781 ddr_setval_s(ch, slice,
2782 _reg_PHY_PER_CS_TRAINING_INDEX,
2783 tgt_cs);
2784 src_cs = ddr_csn % 2U;
2785 if ((ch_have_this_cs[1] & (1U << ch)) == 0U) {
2786 src_cs = 0U;
2787 }
2788 for (i = 0U; i <= 4U; i += 4U) {
2789 if (restore != 0U) {
2790 tmp_r = rdqdm_dly[ch][tgt_cs][slice][i];
2791 } else {
2792 tmp_r = rdqdm_dly[ch][src_cs][slice][i];
2793 }
2794
2795 ddr_setval_s(ch, slice,
2796 _reg_PHY_RDDQS_X_RISE_SLAVE_DELAY[i],
2797 tmp_r);
2798 }
2799 }
2800 }
2801 }
2802}
2803
2804static uint32_t wdqdm_man1(void)
2805{
2806 uint32_t mr14_csab0_bak[DRAM_CH_CNT];
2807 uint32_t ch, cs, ddr_csn;
2808 uint32_t data_l;
2809 uint32_t err = 0U;
2810#ifndef DDR_FAST_INIT
2811 uint32_t err_flg = 0U;
2812#endif/* DDR_FAST_INIT */
2813
2814 /* CLEAR PREV RESULT */
2815 for (cs = 0U; cs < CS_CNT; cs++) {
2816 ddr_setval_ach_as(_reg_PHY_PER_CS_TRAINING_INDEX, cs);
2817 ddr_setval_ach_as(_reg_PHY_WDQLVL_CLR_PREV_RESULTS, 0x01U);
2818 }
2819 ddrphy_regif_idle();
2820
2821 for (ddr_csn = 0U; ddr_csn < CSAB_CNT; ddr_csn++) {
2822 if (((prr_product == PRR_PRODUCT_M3) &&
2823 (prr_cut == PRR_PRODUCT_10))) {
2824 wdqdm_cp(ddr_csn, 0U);
2825 }
2826
2827 foreach_vch(ch) {
2828 data_l = ddr_getval(ch, reg_pi_mr14_data_fx_csx[1][ddr_csn]);
2829 ddr_setval(ch, reg_pi_mr14_data_fx_csx[1][0], data_l);
2830 }
2831
2832 /* KICK WDQLVL */
2833 err = swlvl1(ddr_csn, _reg_PI_WDQLVL_CS, _reg_PI_WDQLVL_REQ);
2834 if (err != 0U) {
2835 goto err_exit;
2836 }
2837
2838 if (ddr_csn == 0U) {
2839 foreach_vch(ch) {
2840 mr14_csab0_bak[ch] = ddr_getval(ch,
2841 reg_pi_mr14_data_fx_csx[1][0]);
2842 }
2843 } else {
2844 foreach_vch(ch) {
2845 ddr_setval(ch, reg_pi_mr14_data_fx_csx[1][0],
2846 mr14_csab0_bak[ch]);
2847 }
2848 }
2849#ifndef DDR_FAST_INIT
2850 foreach_vch(ch) {
2851 if ((ch_have_this_cs[ddr_csn % 2U] & (1U << ch)) == 0U) {
2852 wdqdm_clr1(ch, ddr_csn);
2853 continue;
2854 }
2855 err = wdqdm_ana1(ch, ddr_csn);
2856 if (err != 0U) {
2857 err_flg |= (1U << (ddr_csn * 4U + ch));
2858 }
2859 ddrphy_regif_idle();
2860 }
2861#endif/* DDR_FAST_INIT */
2862 }
2863err_exit:
2864#ifndef DDR_FAST_INIT
2865 err |= err_flg;
2866#endif/* DDR_FAST_INIT */
2867
2868 return err;
2869}
2870
2871static uint32_t wdqdm_man(void)
2872{
2873 uint32_t datal, ch, ddr_csn, mr14_bkup[4][4];
2874 const uint32_t retry_max = 0x10U;
2875 uint32_t err, retry_cnt;
2876
2877 datal = RL + js2[js2_tdqsck] + (16U / 2U) + 1U - WL + 2U + 2U + 19U;
2878 if ((mmio_read_32(DBSC_DBTR(11)) & 0xFF) > datal) {
2879 datal = mmio_read_32(DBSC_DBTR(11)) & 0xFF;
2880 }
2881 ddr_setval_ach(_reg_PI_TDFI_WDQLVL_RW, datal);
2882
2883 ddr_setval_ach(_reg_PI_TDFI_WDQLVL_WR,
2884 (mmio_read_32(DBSC_DBTR(12)) & 0xFF) + 10);
2885
2886 ddr_setval_ach(_reg_PI_TRFC_F0, mmio_read_32(DBSC_DBTR(13)) & 0x1FF);
2887 ddr_setval_ach(_reg_PI_TRFC_F1, mmio_read_32(DBSC_DBTR(13)) & 0x1FF);
2888
2889 retry_cnt = 0U;
2890 err = 0U;
2891 do {
2892 ddr_setval_ach(_reg_PI_WDQLVL_VREF_EN, 0x01);
2893 ddr_setval_ach(_reg_PI_WDQLVL_VREF_NORMAL_STEPSIZE, 0x01);
2894 ddr_setval_ach(_reg_PI_WDQLVL_VREF_DELTA, 0x0C);
2895 dsb_sev();
2896 err = wdqdm_man1();
2897 foreach_vch(ch) {
2898 for (ddr_csn = 0U; ddr_csn < CSAB_CNT; ddr_csn++) {
2899 mr14_bkup[ch][ddr_csn] =
2900 ddr_getval(ch, reg_pi_mr14_data_fx_csx
2901 [1][ddr_csn]);
2902 dsb_sev();
2903 }
2904 }
2905
2906 ddr_setval_ach(_reg_PI_WDQLVL_VREF_DELTA, 0x04);
2907
2908 pvtcode_update();
2909 err = wdqdm_man1();
2910 foreach_vch(ch) {
2911 for (ddr_csn = 0U; ddr_csn < CSAB_CNT; ddr_csn++) {
2912 mr14_bkup[ch][ddr_csn] =
2913 (mr14_bkup[ch][ddr_csn] +
2914 ddr_getval(ch, reg_pi_mr14_data_fx_csx
2915 [1][ddr_csn])) / 2U;
2916 ddr_setval(ch,
2917 reg_pi_mr14_data_fx_csx[1]
2918 [ddr_csn],
2919 mr14_bkup[ch][ddr_csn]);
2920 }
2921 }
2922
2923 ddr_setval_ach(_reg_PI_WDQLVL_VREF_NORMAL_STEPSIZE, 0x0U);
2924 ddr_setval_ach(_reg_PI_WDQLVL_VREF_DELTA, 0x0U);
2925 ddr_setval_ach(_reg_PI_WDQLVL_VREF_INITIAL_START_POINT, 0x0U);
2926 ddr_setval_ach(_reg_PI_WDQLVL_VREF_INITIAL_STOP_POINT, 0x0U);
2927 ddr_setval_ach(_reg_PI_WDQLVL_VREF_INITIAL_STEPSIZE, 0x0U);
2928
2929 pvtcode_update2();
2930 err = wdqdm_man1();
2931 ddr_setval_ach(_reg_PI_WDQLVL_VREF_EN, 0x0U);
2932
2933 } while ((err != 0U) && (++retry_cnt < retry_max));
2934
2935 if (prr_product == PRR_PRODUCT_M3 && prr_cut <= PRR_PRODUCT_10) {
2936 wdqdm_cp(0U, 1U);
2937 }
2938
2939 return (retry_cnt >= retry_max);
2940}
2941
2942/* RDQ TRAINING */
2943#ifndef DDR_FAST_INIT
2944static void rdqdm_clr1(uint32_t ch, uint32_t ddr_csn)
2945{
2946 uint32_t cs, slice;
2947 uint32_t data_l;
2948 int32_t i, k;
2949
2950 /* clr of training results buffer */
2951 cs = ddr_csn % 2U;
2952 data_l = board_cnf->dqdm_dly_r;
2953 for (slice = 0U; slice < SLICE_CNT; slice++) {
2954 k = (board_cnf->ch[ch].dqs_swap >> (4 * slice)) & 0x0f;
2955 if (((k >= 2) && (ddr_csn < 2)) || ((k < 2) && (ddr_csn >= 2))) {
2956 continue;
2957 }
2958
2959 for (i = 0; i <= 8; i++) {
2960 if ((ch_have_this_cs[CS_CNT - 1 - cs] & (1U << ch)) != 0U) {
2961 rdqdm_dly[ch][cs][slice][i] =
2962 rdqdm_dly[ch][CS_CNT - 1 - cs][slice][i];
2963 rdqdm_dly[ch][cs][slice + SLICE_CNT][i] =
2964 rdqdm_dly[ch][CS_CNT - 1 - cs][slice + SLICE_CNT][i];
2965 } else {
2966 rdqdm_dly[ch][cs][slice][i] = data_l;
2967 rdqdm_dly[ch][cs][slice + SLICE_CNT][i] = data_l;
2968 }
2969 rdqdm_le[ch][cs][slice][i] = 0U;
2970 rdqdm_le[ch][cs][slice + SLICE_CNT][i] = 0U;
2971 rdqdm_te[ch][cs][slice][i] = 0U;
2972 rdqdm_te[ch][cs][slice + SLICE_CNT][i] = 0U;
2973 rdqdm_nw[ch][cs][slice][i] = 0U;
2974 rdqdm_nw[ch][cs][slice + SLICE_CNT][i] = 0U;
2975 }
2976 rdqdm_st[ch][cs][slice] = 0U;
2977 rdqdm_win[ch][cs][slice] = 0U;
2978 }
2979}
2980
2981static uint32_t rdqdm_ana1(uint32_t ch, uint32_t ddr_csn)
2982{
2983 uint32_t rdq_status_obs_select;
2984 uint32_t cs, slice;
2985 uint32_t data_l;
2986 uint32_t err;
2987 uint32_t dq;
2988 int32_t min_win;
2989 int8_t _adj;
2990 int16_t adj;
2991 int32_t min_win;
2992 int32_t win;
2993 int32_t i, k;
2994
2995 /* analysis of training results */
2996 err = 0U;
2997 for (slice = 0U; slice < SLICE_CNT; slice++) {
2998 k = (board_cnf->ch[ch].dqs_swap >> (4 * slice)) & 0x0f;
2999 if (((k >= 2) && (ddr_csn < 2)) || ((k < 2) && (ddr_csn >= 2))) {
3000 continue;
3001 }
3002
3003 cs = ddr_csn % 2U;
3004 ddr_setval_s(ch, slice, _reg_PHY_PER_CS_TRAINING_INDEX, cs);
3005 ddrphy_regif_idle();
3006
3007 ddr_getval_s(ch, slice, _reg_PHY_PER_CS_TRAINING_INDEX);
3008 ddrphy_regif_idle();
3009
3010 for (i = 0; i <= 8; i++) {
3011 dq = slice * 8 + i;
3012 if (i == 8) {
3013 _adj = board_cnf->ch[ch].dm_adj_r[slice];
3014 } else {
3015 _adj = board_cnf->ch[ch].dq_adj_r[dq];
3016 }
3017
3018 adj = _f_scale_adj(_adj);
3019
3020 data_l = ddr_getval_s(ch, slice,
3021 _reg_PHY_RDDQS_X_RISE_SLAVE_DELAY[i]) + adj;
3022 ddr_setval_s(ch, slice,
3023 _reg_PHY_RDDQS_X_RISE_SLAVE_DELAY[i],
3024 data_l);
3025 rdqdm_dly[ch][cs][slice][i] = data_l;
3026
3027 data_l = ddr_getval_s(ch, slice,
3028 _reg_PHY_RDDQS_X_FALL_SLAVE_DELAY[i]) + adj;
3029 ddr_setval_s(ch, slice,
3030 _reg_PHY_RDDQS_X_FALL_SLAVE_DELAY[i],
3031 data_l);
3032 rdqdm_dly[ch][cs][slice + SLICE_CNT][i] = data_l;
3033 }
3034 min_win = INT_LEAST32_MAX;
3035 for (i = 0; i <= 8; i++) {
3036 data_l =
3037 ddr_getval_s(ch, slice, _reg_PHY_RDLVL_STATUS_OBS);
3038 rdqdm_st[ch][cs][slice] = data_l;
3039 rdqdm_st[ch][cs][slice + SLICE_CNT] = data_l;
3040 /* k : rise/fall */
3041 for (k = 0; k < 2; k++) {
3042 if (i == 8) {
3043 rdq_status_obs_select = 16 + 8 * k;
3044 } else {
3045 rdq_status_obs_select = i + k * 8;
3046 }
3047 ddr_setval_s(ch, slice,
3048 _reg_PHY_RDLVL_RDDQS_DQ_OBS_SELECT,
3049 rdq_status_obs_select);
3050
3051 data_l =
3052 ddr_getval_s(ch, slice,
3053 _reg_PHY_RDLVL_RDDQS_DQ_LE_DLY_OBS);
3054 rdqdm_le[ch][cs][slice + SLICE_CNT * k][i] = data_l;
3055
3056 data_l =
3057 ddr_getval_s(ch, slice,
3058 _reg_PHY_RDLVL_RDDQS_DQ_TE_DLY_OBS);
3059 rdqdm_te[ch][cs][slice + SLICE_CNT * k][i] = data_l;
3060
3061 data_l =
3062 ddr_getval_s(ch, slice,
3063 _reg_PHY_RDLVL_RDDQS_DQ_NUM_WINDOWS_OBS);
3064 rdqdm_nw[ch][cs][slice + SLICE_CNT * k][i] = data_l;
3065
3066 win =
3067 (int32_t)rdqdm_te[ch][cs][slice +
3068 SLICE_CNT *
3069 k][i] -
3070 rdqdm_le[ch][cs][slice + SLICE_CNT * k][i];
3071 if (i != 8) {
3072 if (min_win > win) {
3073 min_win = win;
3074 }
3075 }
3076 }
3077 }
3078 rdqdm_win[ch][cs][slice] = min_win;
3079 if (min_win <= 0) {
3080 err = 2;
3081 }
3082 }
3083 return err;
3084}
3085#else /* DDR_FAST_INIT */
3086static void rdqdm_man1_set(uint32_t ddr_csn, uint32_t ch, uint32_t slice)
3087{
3088 uint32_t i, adj, data_l;
3089
3090 for (i = 0U; i <= 8U; i++) {
3091 if (i == 8U) {
3092 adj = _f_scale_adj(board_cnf->ch[ch].dm_adj_r[slice]);
3093 } else {
3094 adj = _f_scale_adj(board_cnf->ch[ch].dq_adj_r[slice * 8U + i]);
3095 }
3096 ddr_setval_s(ch, slice, _reg_PHY_PER_CS_TRAINING_INDEX, ddr_csn);
3097 data_l = ddr_getval_s(ch, slice, _reg_PHY_RDDQS_X_RISE_SLAVE_DELAY[i]) + adj;
3098 ddr_setval_s(ch, slice, _reg_PHY_RDDQS_X_RISE_SLAVE_DELAY[i], data_l);
3099 rdqdm_dly[ch][ddr_csn][slice][i] = data_l;
3100 rdqdm_dly[ch][ddr_csn | 1U][slice][i] = data_l;
3101
3102 data_l = ddr_getval_s(ch, slice, _reg_PHY_RDDQS_X_FALL_SLAVE_DELAY[i]) + adj;
3103 ddr_setval_s(ch, slice, _reg_PHY_RDDQS_X_FALL_SLAVE_DELAY[i], data_l);
3104 rdqdm_dly[ch][ddr_csn][slice + SLICE_CNT][i] = data_l;
3105 rdqdm_dly[ch][ddr_csn | 1U][slice + SLICE_CNT][i] = data_l;
3106 }
3107}
3108#endif /* DDR_FAST_INIT */
3109
3110static uint32_t rdqdm_man1(void)
3111{
3112 uint32_t ch;
3113 uint32_t ddr_csn;
3114 uint32_t val;
3115#ifdef DDR_FAST_INIT
3116 uint32_t slice;
3117#endif/* DDR_FAST_INIT */
3118 uint32_t err;
3119
3120 /* manual execution of training */
3121 err = 0U;
3122
3123 for (ddr_csn = 0U; ddr_csn < CSAB_CNT; ddr_csn++) {
3124 /* KICK RDQLVL */
3125 err = swlvl1(ddr_csn, _reg_PI_RDLVL_CS, _reg_PI_RDLVL_REQ);
3126 if (err != 0U) {
3127 goto err_exit;
3128 }
3129#ifndef DDR_FAST_INIT
3130 foreach_vch(ch) {
3131 if ((ch_have_this_cs[ddr_csn % 2] & (1U << ch)) == 0U) {
3132 rdqdm_clr1(ch, ddr_csn);
3133 ddrphy_regif_idle();
3134 continue;
3135 }
3136 err = rdqdm_ana1(ch, ddr_csn);
3137 ddrphy_regif_idle();
3138 if (err != 0U) {
3139 goto err_exit;
3140 }
3141 }
3142#else/* DDR_FAST_INIT */
3143 foreach_vch(ch) {
3144 if ((ch_have_this_cs[ddr_csn] & (1U << ch)) != 0U) {
3145 for (slice = 0U; slice < SLICE_CNT; slice++) {
3146 val = ddr_getval_s(ch, slice, _reg_PHY_RDLVL_STATUS_OBS);
3147 if (val != 0x0D00FFFFU) {
3148 err = (1U << ch) | (0x10U << slice);
3149 goto err_exit;
3150 }
3151 }
3152 }
3153 if ((prr_product == PRR_PRODUCT_M3) &&
3154 (prr_cut <= PRR_PRODUCT_10)) {
3155 for (slice = 0U; slice < SLICE_CNT; slice++) {
3156 rdqdm_man1_set(ddr_csn, ch, slice);
3157 }
3158 }
3159 }
3160 ddrphy_regif_idle();
3161
3162#endif/* DDR_FAST_INIT */
3163 }
3164
3165err_exit:
3166 return err;
3167}
3168
3169static uint32_t rdqdm_man(void)
3170{
3171 uint32_t err, retry_cnt;
3172 const uint32_t retry_max = 0x01U;
3173
3174 ddr_setval_ach_as(_reg_PHY_DQ_TSEL_ENABLE,
3175 0x00000004U | ddrtbl_getval(_cnf_DDR_PHY_SLICE_REGSET,
3176 _reg_PHY_DQ_TSEL_ENABLE));
3177 ddr_setval_ach_as(_reg_PHY_DQS_TSEL_ENABLE,
3178 0x00000004U | ddrtbl_getval(_cnf_DDR_PHY_SLICE_REGSET,
3179 _reg_PHY_DQS_TSEL_ENABLE));
3180 ddr_setval_ach_as(_reg_PHY_DQ_TSEL_SELECT,
3181 0xFF0FFFFFU & ddrtbl_getval(_cnf_DDR_PHY_SLICE_REGSET,
3182 _reg_PHY_DQ_TSEL_SELECT));
3183 ddr_setval_ach_as(_reg_PHY_DQS_TSEL_SELECT,
3184 0xFF0FFFFFU & ddrtbl_getval(_cnf_DDR_PHY_SLICE_REGSET,
3185 _reg_PHY_DQS_TSEL_SELECT));
3186
3187 retry_cnt = 0U;
3188 do {
3189 err = rdqdm_man1();
3190 ddrphy_regif_idle();
3191 } while ((err != 0U) && (++retry_cnt < retry_max));
3192 ddr_setval_ach_as(_reg_PHY_DQ_TSEL_ENABLE,
3193 ddrtbl_getval(_cnf_DDR_PHY_SLICE_REGSET,
3194 _reg_PHY_DQ_TSEL_ENABLE));
3195 ddr_setval_ach_as(_reg_PHY_DQS_TSEL_ENABLE,
3196 ddrtbl_getval(_cnf_DDR_PHY_SLICE_REGSET,
3197 _reg_PHY_DQS_TSEL_ENABLE));
3198 ddr_setval_ach_as(_reg_PHY_DQ_TSEL_SELECT,
3199 ddrtbl_getval(_cnf_DDR_PHY_SLICE_REGSET,
3200 _reg_PHY_DQ_TSEL_SELECT));
3201 ddr_setval_ach_as(_reg_PHY_DQS_TSEL_SELECT,
3202 ddrtbl_getval(_cnf_DDR_PHY_SLICE_REGSET,
3203 _reg_PHY_DQS_TSEL_SELECT));
3204
3205 return (retry_cnt >= retry_max);
3206}
3207
3208/* rx offset calibration */
3209static int32_t _find_change(uint64_t val, uint32_t dir)
3210{
3211 int32_t i;
3212 uint32_t startval;
3213 uint32_t curval;
3214 const int32_t VAL_END = 0x3fU;
3215
3216 if (dir == 0U) {
3217 startval = (val & 0x01U);
3218 for (i = 1; i <= VAL_END; i++) {
3219 curval = (val >> i) & 0x01U;
3220 if (curval != startval) {
3221 return i;
3222 }
3223 }
3224 return VAL_END;
3225 }
3226
3227 startval = (val >> dir) & 0x01U;
3228 for (i = (int32_t)dir - 1; i >= 0; i--) {
3229 curval = (val >> i) & 0x01U;
3230 if (curval != startval) {
3231 return i;
3232 }
3233 }
3234
3235 return 0;
3236}
3237
3238static uint32_t _rx_offset_cal_updn(uint32_t code)
3239{
3240 const uint32_t CODE_MAX = 0x40U;
3241 uint32_t tmp;
3242
3243 if (code == 0U) {
3244 tmp = (1U << 6) | (CODE_MAX - 1U);
3245 } else {
3246 tmp = (code << 6) | (CODE_MAX - code);
3247 }
3248
3249 return tmp;
3250}
3251
3252static uint32_t rx_offset_cal(void)
3253{
3254 uint32_t index;
3255 uint32_t code;
3256 const uint32_t CODE_MAX = 0x40U;
3257 const uint32_t CODE_STEP = 2U;
3258 uint32_t ch, slice;
3259 uint32_t tmp;
3260 uint32_t tmp_ach_as[DRAM_CH_CNT][SLICE_CNT];
3261 uint64_t val[DRAM_CH_CNT][SLICE_CNT][_reg_PHY_RX_CAL_X_NUM];
3262 uint64_t tmpval;
3263 int32_t lsb, msb;
3264
3265 ddr_setval_ach_as(_reg_PHY_RX_CAL_OVERRIDE, 0x01);
3266 foreach_vch(ch) {
3267 for (slice = 0U; slice < SLICE_CNT; slice++) {
3268 for (index = 0U; index < _reg_PHY_RX_CAL_X_NUM; index++) {
3269 val[ch][slice][index] = 0U;
3270 }
3271 }
3272 }
3273
3274 for (code = 0U; code < CODE_MAX / CODE_STEP; code++) {
3275 tmp = _rx_offset_cal_updn(code * CODE_STEP);
3276 for (index = 0U; index < _reg_PHY_RX_CAL_X_NUM; index++) {
3277 ddr_setval_ach_as(_reg_PHY_RX_CAL_X[index], tmp);
3278 }
3279 dsb_sev();
3280 ddr_getval_ach_as(_reg_PHY_RX_CAL_OBS, (uint32_t *)tmp_ach_as);
3281
3282 foreach_vch(ch) {
3283 for (slice = 0U; slice < SLICE_CNT; slice++) {
3284 tmp = tmp_ach_as[ch][slice];
3285 for (index = 0U; index < _reg_PHY_RX_CAL_X_NUM;
3286 index++) {
3287 if ((tmp & (1U << index)) != 0U) {
3288 val[ch][slice][index] |=
3289 (1ULL << code);
3290 } else {
3291 val[ch][slice][index] &=
3292 ~(1ULL << code);
3293 }
3294 }
3295 }
3296 }
3297 }
3298 foreach_vch(ch) {
3299 for (slice = 0U; slice < SLICE_CNT; slice++) {
3300 for (index = 0U; index < _reg_PHY_RX_CAL_X_NUM;
3301 index++) {
3302 tmpval = val[ch][slice][index];
3303 lsb = _find_change(tmpval, 0U);
3304 msb = _find_change(tmpval,
3305 (CODE_MAX / CODE_STEP) - 1U);
3306 tmp = (lsb + msb) >> 1U;
3307
3308 tmp = _rx_offset_cal_updn(tmp * CODE_STEP);
3309 ddr_setval_s(ch, slice,
3310 _reg_PHY_RX_CAL_X[index], tmp);
3311 }
3312 }
3313 }
3314 ddr_setval_ach_as(_reg_PHY_RX_CAL_OVERRIDE, 0x00);
3315
3316 return 0U;
3317}
3318
3319static uint32_t rx_offset_cal_hw(void)
3320{
3321 uint32_t ch, slice;
3322 uint32_t retry;
3323 uint32_t complete;
3324 uint32_t tmp;
3325 uint32_t tmp_ach_as[DRAM_CH_CNT][SLICE_CNT];
3326
3327 ddr_setval_ach_as(_reg_PHY_RX_CAL_X[9], 0x00);
3328 ddr_setval_ach_as(_reg_PHY_RX_CAL_OVERRIDE, 0x00);
3329 ddr_setval_ach_as(_reg_PHY_RX_CAL_SAMPLE_WAIT, 0x0f);
3330
3331 retry = 0U;
3332 while (retry < 4096U) {
3333 if ((retry & 0xffU) == 0U) {
3334 ddr_setval_ach_as(_reg_SC_PHY_RX_CAL_START, 0x01);
3335 }
3336 foreach_vch(ch) {
3337 for (slice = 0U; slice < SLICE_CNT; slice++) {
3338 tmp_ach_as[ch][slice] =
3339 ddr_getval_s(ch, slice,
3340 _reg_PHY_RX_CAL_X[9]);
3341 }
3342 }
3343
3344 complete = 1U;
3345 foreach_vch(ch) {
3346 for (slice = 0U; slice < SLICE_CNT; slice++) {
3347 tmp = tmp_ach_as[ch][slice];
3348 tmp = (tmp & 0x3fU) + ((tmp >> 6) & 0x3fU);
3349 if (tmp != 0x40U) {
3350 complete = 0U;
3351 }
3352 }
3353 }
3354 if (complete != 0U) {
3355 break;
3356 }
3357
3358 retry++;
3359 }
3360
3361 return (complete == 0U);
3362}
3363
3364/* adjust wpath latency */
3365static void adjust_wpath_latency(void)
3366{
3367 uint32_t ch, cs, slice;
3368 uint32_t dly;
3369 uint32_t wpath_add;
3370 const uint32_t _par_EARLY_THRESHOLD_VAL = 0x180U;
3371
3372 foreach_vch(ch) {
3373 for (slice = 0U; slice < SLICE_CNT; slice += 1U) {
3374 for (cs = 0U; cs < CS_CNT; cs++) {
3375 ddr_setval_s(ch, slice,
3376 _reg_PHY_PER_CS_TRAINING_INDEX,
3377 cs);
3378 ddr_getval_s(ch, slice,
3379 _reg_PHY_PER_CS_TRAINING_INDEX);
3380 dly =
3381 ddr_getval_s(ch, slice,
3382 _reg_PHY_CLK_WRDQS_SLAVE_DELAY);
3383 if (dly <= _par_EARLY_THRESHOLD_VAL) {
3384 continue;
3385 }
3386
3387 wpath_add =
3388 ddr_getval_s(ch, slice,
3389 _reg_PHY_WRITE_PATH_LAT_ADD);
3390 ddr_setval_s(ch, slice,
3391 _reg_PHY_WRITE_PATH_LAT_ADD,
3392 wpath_add - 1U);
3393 }
3394 }
3395 }
3396}
3397
3398/* DDR Initialize entry */
3399int32_t rzg_dram_init(void)
3400{
3401 uint32_t ch, cs;
3402 uint32_t data_l;
3403 uint32_t bus_mbps, bus_mbpsdiv;
3404 uint32_t tmp_tccd;
3405 uint32_t failcount;
3406 uint32_t cnf_boardtype;
3407 int32_t ret = INITDRAM_NG;
3408
3409 /* Thermal sensor setting */
3410 data_l = mmio_read_32(CPG_MSTPSR5);
3411 if ((data_l & BIT(22)) != 0U) { /* case THS/TSC Standby */
3412 data_l &= ~BIT(22);
3413 cpg_write_32(CPG_SMSTPCR5, data_l);
3414 while ((mmio_read_32(CPG_MSTPSR5) & BIT(22)) != 0U) {
3415 /* wait bit=0 */
3416 }
3417 }
3418
3419 /* THCTR Bit6: PONM=0 , Bit0: THSST=0 */
3420 data_l = mmio_read_32(THS1_THCTR) & 0xFFFFFFBE;
3421 mmio_write_32(THS1_THCTR, data_l);
3422
3423 /* Judge product and cut */
3424#ifdef RCAR_DDR_FIXED_LSI_TYPE
3425#if (RCAR_LSI == RCAR_AUTO)
3426 prr_product = mmio_read_32(PRR) & PRR_PRODUCT_MASK;
3427 prr_cut = mmio_read_32(PRR) & PRR_CUT_MASK;
3428#else /* RCAR_LSI */
3429#ifndef RCAR_LSI_CUT
3430 prr_cut = mmio_read_32(PRR) & PRR_CUT_MASK;
3431#endif /* RCAR_LSI_CUT */
3432#endif /* RCAR_LSI */
3433#else /* RCAR_DDR_FIXED_LSI_TYPE */
3434 prr_product = mmio_read_32(PRR) & PRR_PRODUCT_MASK;
3435 prr_cut = mmio_read_32(PRR) & PRR_CUT_MASK;
3436#endif /* RCAR_DDR_FIXED_LSI_TYPE */
3437
3438 if (prr_product == PRR_PRODUCT_M3) {
3439 p_ddr_regdef_tbl =
3440 (const uint32_t *)&DDR_REGDEF_TBL[1][0];
3441 } else {
3442 FATAL_MSG("BL2: DDR:Unknown Product\n");
3443 goto done;
3444 }
3445
3446 if ((prr_product == PRR_PRODUCT_M3) && (prr_cut < PRR_PRODUCT_30)) {
3447 /* non : G2M Ver.1.x not support */
3448 } else {
3449 mmio_write_32(DBSC_DBSYSCNT0, 0x00001234U);
3450 }
3451
3452 /* Judge board type */
3453 cnf_boardtype = boardcnf_get_brd_type(prr_product);
3454 if (cnf_boardtype >= (uint32_t)BOARDNUM) {
3455 FATAL_MSG("BL2: DDR:Unknown Board\n");
3456 goto done;
3457 }
3458 board_cnf = (const struct _boardcnf *)&boardcnfs[cnf_boardtype];
3459
3460/* RCAR_DRAM_SPLIT_2CH (2U) */
3461#if RCAR_DRAM_SPLIT == 2
3462 ddr_phyvalid = board_cnf->phyvalid;
3463#else /* RCAR_DRAM_SPLIT_2CH */
3464 ddr_phyvalid = board_cnf->phyvalid;
3465#endif /* RCAR_DRAM_SPLIT_2CH */
3466
3467 max_density = 0U;
3468
3469 for (cs = 0U; cs < CS_CNT; cs++) {
3470 ch_have_this_cs[cs] = 0U;
3471 }
3472
3473 foreach_ech(ch) {
3474 for (cs = 0U; cs < CS_CNT; cs++) {
3475 ddr_density[ch][cs] = 0xffU;
3476 }
3477 }
3478
3479 foreach_vch(ch) {
3480 for (cs = 0U; cs < CS_CNT; cs++) {
3481 data_l = board_cnf->ch[ch].ddr_density[cs];
3482 ddr_density[ch][cs] = data_l;
3483
3484 if (data_l == 0xffU) {
3485 continue;
3486 }
3487 if (data_l > max_density) {
3488 max_density = data_l;
3489 }
3490 ch_have_this_cs[cs] |= (1U << ch);
3491 }
3492 }
3493
3494 /* Judge board clock frequency (in MHz) */
3495 boardcnf_get_brd_clk(cnf_boardtype, &brd_clk, &brd_clkdiv);
3496 if ((brd_clk / brd_clkdiv) > 25U) {
3497 brd_clkdiva = 1U;
3498 } else {
3499 brd_clkdiva = 0U;
3500 }
3501
3502 /* Judge ddr operating frequency clock(in Mbps) */
3503 boardcnf_get_ddr_mbps(cnf_boardtype, &ddr_mbps, &ddr_mbpsdiv);
3504
3505 ddr0800_mul = CLK_DIV(800U, 2U, brd_clk, brd_clkdiv * (brd_clkdiva + 1U));
3506
3507 ddr_mul = CLK_DIV(ddr_mbps, ddr_mbpsdiv * 2U, brd_clk,
3508 brd_clkdiv * (brd_clkdiva + 1U));
3509
3510 /* Adjust tccd */
3511 data_l = (0x00006000 & mmio_read_32(RST_MODEMR)) >> 13;
3512 bus_mbps = 0U;
3513 bus_mbpsdiv = 0U;
3514 switch (data_l) {
3515 case 0:
3516 bus_mbps = brd_clk * 0x60U * 2U;
3517 bus_mbpsdiv = brd_clkdiv * 1U;
3518 break;
3519 case 1:
3520 bus_mbps = brd_clk * 0x50U * 2U;
3521 bus_mbpsdiv = brd_clkdiv * 1U;
3522 break;
3523 case 2:
3524 bus_mbps = brd_clk * 0x40U * 2U;
3525 bus_mbpsdiv = brd_clkdiv * 1U;
3526 break;
3527 case 3:
3528 bus_mbps = brd_clk * 0x60U * 2U;
3529 bus_mbpsdiv = brd_clkdiv * 2U;
3530 break;
3531 default:
3532 bus_mbps = brd_clk * 0x60U * 2U;
3533 bus_mbpsdiv = brd_clkdiv * 2U;
3534 WARN("BL2: DDR using default values for adjusting tccd");
3535 break;
3536 }
3537 tmp_tccd = CLK_DIV(ddr_mbps * 8U, ddr_mbpsdiv, bus_mbps, bus_mbpsdiv);
3538 if (8U * ddr_mbps * bus_mbpsdiv != tmp_tccd * bus_mbps * ddr_mbpsdiv) {
3539 tmp_tccd = tmp_tccd + 1U;
3540 }
3541
3542 if (tmp_tccd < 8U) {
3543 ddr_tccd = 8U;
3544 } else {
3545 ddr_tccd = tmp_tccd;
3546 }
3547
3548 NOTICE("BL2: DDR%d(%s)\n", ddr_mbps / ddr_mbpsdiv, RCAR_DDR_VERSION);
3549
3550 MSG_LF("Start\n");
3551
3552 /* PLL Setting */
3553 pll3_control(1U);
3554
3555 /* initialize DDR */
3556 data_l = init_ddr();
3557 if (data_l == ddr_phyvalid) {
3558 failcount = 0U;
3559 } else {
3560 failcount = 1U;
3561 }
3562
3563 foreach_vch(ch) {
3564 mmio_write_32(DBSC_DBPDLK(ch), 0x00000000U);
3565 }
3566 if ((prr_product == PRR_PRODUCT_M3) && (prr_cut < PRR_PRODUCT_30)) {
3567 /* non : G2M Ver.1.x not support */
3568 } else {
3569 mmio_write_32(DBSC_DBSYSCNT0, 0x00000000);
3570 }
3571
3572 if (failcount == 0U) {
3573 ret = INITDRAM_OK;
3574 }
3575
3576done:
3577 return ret;
3578}
3579
3580static void pvtcode_update(void)
3581{
3582 uint32_t ch;
3583 uint32_t data_l;
3584 uint32_t pvtp[4], pvtn[4], pvtp_init, pvtn_init;
3585 int32_t pvtp_tmp, pvtn_tmp;
3586
3587 foreach_vch(ch) {
3588 pvtn_init = (tcal.tcomp_cal[ch] & 0xFC0U) >> 6;
3589 pvtp_init = (tcal.tcomp_cal[ch] & 0x03FU) >> 0;
3590
3591 if (8912U * pvtp_init > 44230U) {
3592 pvtp_tmp = (5000U + 8912U * pvtp_init - 44230U) / 10000U;
3593 } else {
3594 pvtp_tmp =
3595 -((-(5000 + 8912 * pvtp_init - 44230)) / 10000);
3596 }
3597 pvtn_tmp = (5000U + 5776U * (uint32_t)pvtn_init + 30280U) / 10000U;
3598
3599 pvtn[ch] = (uint32_t)pvtn_tmp + pvtn_init;
3600 pvtp[ch] = (uint32_t)pvtp_tmp + pvtp_init;
3601
3602 if (pvtn[ch] > 63U) {
3603 pvtn[ch] = 63U;
3604 pvtp[ch] =
3605 (pvtp_tmp) * (63 - 6 * pvtn_tmp -
3606 pvtn_init) / (pvtn_tmp) +
3607 6 * pvtp_tmp + pvtp_init;
3608 }
3609
3610 data_l = pvtp[ch] | (pvtn[ch] << 6) | 0x00015000U;
3611 reg_ddrphy_write(ch, ddr_regdef_adr(_reg_PHY_PAD_FDBK_TERM),
3612 data_l | 0x00020000U);
3613 reg_ddrphy_write(ch, ddr_regdef_adr(_reg_PHY_PAD_DATA_TERM),
3614 data_l);
3615 reg_ddrphy_write(ch, ddr_regdef_adr(_reg_PHY_PAD_DQS_TERM),
3616 data_l);
3617 reg_ddrphy_write(ch, ddr_regdef_adr(_reg_PHY_PAD_ADDR_TERM),
3618 data_l);
3619 reg_ddrphy_write(ch, ddr_regdef_adr(_reg_PHY_PAD_CS_TERM),
3620 data_l);
3621 }
3622}
3623
3624static void pvtcode_update2(void)
3625{
3626 uint32_t ch;
3627
3628 foreach_vch(ch) {
3629 reg_ddrphy_write(ch, ddr_regdef_adr(_reg_PHY_PAD_FDBK_TERM),
3630 tcal.init_cal[ch] | 0x00020000U);
3631 reg_ddrphy_write(ch, ddr_regdef_adr(_reg_PHY_PAD_DATA_TERM),
3632 tcal.init_cal[ch]);
3633 reg_ddrphy_write(ch, ddr_regdef_adr(_reg_PHY_PAD_DQS_TERM),
3634 tcal.init_cal[ch]);
3635 reg_ddrphy_write(ch, ddr_regdef_adr(_reg_PHY_PAD_ADDR_TERM),
3636 tcal.init_cal[ch]);
3637 reg_ddrphy_write(ch, ddr_regdef_adr(_reg_PHY_PAD_CS_TERM),
3638 tcal.init_cal[ch]);
3639 }
3640}
3641
3642static void ddr_padcal_tcompensate_getinit(uint32_t override)
3643{
3644 uint32_t ch;
3645 uint32_t data_l;
3646 uint32_t pvtp, pvtn;
3647
3648 tcal.init_temp = 0;
3649 for (ch = 0U; ch < 4U; ch++) {
3650 tcal.init_cal[ch] = 0U;
3651 tcal.tcomp_cal[ch] = 0U;
3652 }
3653
3654 foreach_vch(ch) {
3655 tcal.init_cal[ch] = ddr_getval(ch, _reg_PHY_PAD_TERM_X[1]);
3656 tcal.tcomp_cal[ch] = ddr_getval(ch, _reg_PHY_PAD_TERM_X[1]);
3657 }
3658
3659 if (override == 0U) {
3660 data_l = mmio_read_32(THS1_TEMP);
3661 if (data_l < 2800U) {
3662 tcal.init_temp =
3663 (143 * (int32_t)data_l - 359000) / 1000;
3664 } else {
3665 tcal.init_temp =
3666 (121 * (int32_t)data_l - 296300) / 1000;
3667 }
3668
3669 foreach_vch(ch) {
3670 pvtp = (tcal.init_cal[ch] >> 0) & 0x000003FU;
3671 pvtn = (tcal.init_cal[ch] >> 6) & 0x000003FU;
3672 if ((int32_t)pvtp >
3673 ((tcal.init_temp * 29 - 3625) / 1000)) {
3674 pvtp = (int32_t)pvtp +
3675 ((3625 - tcal.init_temp * 29) / 1000);
3676 } else {
3677 pvtp = 0U;
3678 }
3679
3680 if ((int32_t)pvtn >
3681 ((tcal.init_temp * 54 - 6750) / 1000)) {
3682 pvtn = (int32_t)pvtn +
3683 ((6750 - tcal.init_temp * 54) / 1000);
3684 } else {
3685 pvtn = 0U;
3686 }
3687
3688 tcal.init_cal[ch] = 0x00015000U | (pvtn << 6) | pvtp;
3689 }
3690 tcal.init_temp = 125;
3691 }
3692}
3693
3694#ifndef DDR_QOS_INIT_SETTING
3695/* For QoS init */
3696uint8_t rzg_get_boardcnf_phyvalid(void)
3697{
3698 return ddr_phyvalid;
3699}
3700#endif /* DDR_QOS_INIT_SETTING */