1 /*
2 * Copyright (c) 2020 - 2024 Renesas Electronics Corporation and/or its affiliates
3 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6 
7 /***********************************************************************************************************************
8  * Includes <System Includes> , "Project Includes"
9  **********************************************************************************************************************/
10 #include <stdio.h>
11 #include "bsp_api.h"
12 
13 #if (BSP_FEATURE_DDR_SUPPORTED)
14  #if (1 == BSP_CFG_DDR_INIT_ENABLE)
15   #include "bsp_ddr.h"
16   #include "bsp_ddr_fw_param.h"
17 
18   #if (1 == BSP_CFG_BOARD_RZN2H_EVB)
19    #include "../../../../../board/rzn2h_evb/board_ddr_param.h"
20   #elif (1 == BSP_CFG_BOARD_CUSTOM)
21    #include "../../../../../board/custom/board_ddr_param.h"
22   #endif
23 
24 /***********************************************************************************************************************
25  * Typedef definitions
26  **********************************************************************************************************************/
27   #define ARRAY_SIZE(a)    (sizeof(a) / sizeof(a[0]))
28 
29 /***********************************************************************************************************************
30  * Exported global variables (to be accessed by other files)
31  **********************************************************************************************************************/
32 
33 /***********************************************************************************************************************
34  * Private global variables and functions
35  **********************************************************************************************************************/
36 static void bsp_prv_ddr_reg_init(void);
37 static void bsp_prv_ddr_phyinit_c(void);
38 static void bsp_prv_ddr_phyinit_d2h_1d(void);
39 static void bsp_prv_ddr_phyinit_d2h_2d(void);
40 static void bsp_prv_ddr_phyinit_mc(void);
41 static void bsp_prv_ddr_phyinit_i(void);
42 static void bsp_prv_ddr_phyinit_j(void);
43 
44   #if (1 == BSP_CFG_DDR_ZERO_INITIALIZED_ENABLE)
45 static void bsp_prv_ddr_prog_all0(uint64_t start_addr, uint32_t addr_space);
46 
47   #endif
48 
49 static int8_t bsp_prv_dwc_ddrphy_cdd_int(uint8_t val);
50 static int8_t bsp_prv_dwc_ddrphy_cdd_abs(uint8_t val);
51 
52 static uint32_t bsp_get_mail(uint8_t mode_32bits);
53 static void     bsp_prv_dwc_ddrphy_phyinit_userCustom_G_waitDone(uint8_t sel_train);
54 static void     bsp_prv_ddr_setup_mc(void);
55 static void     bsp_prv_ddr_update_mc(void);
56 
57 static void bsp_prv_ddr_phyinit_configuration(void);
58 static void bsp_prv_ddr_phyinit_pin_swizzling(void);
59 static void bsp_prv_ddr_phyinit_load_1d_image(void);
60 static void bsp_prv_ddr_phyinit_exec_1d_image(void);
61 static void bsp_prv_ddr_phyinit_load_2d_image(void);
62 static void bsp_prv_ddr_phyinit_exec_2d_image(void);
63 static void bsp_prv_ddr_phyinit_load_eng_image(void);
64 
65 const uint32_t param_phyinit_c_size       = ARRAY_SIZE(param_phyinit_c);
66 const uint32_t param_phyinit_i_size       = ARRAY_SIZE(param_phyinit_i);
67 const uint32_t param_phyinit_f_1d_0_size  = ARRAY_SIZE(param_phyinit_f_1d_0);
68 const uint32_t param_phyinit_f_2d_0_size  = ARRAY_SIZE(param_phyinit_f_2d_0);
69 const uint32_t param_phyinit_swizzle_size = ARRAY_SIZE(param_phyinit_swizzle);
70 const uint32_t param_mcinit_size          = ARRAY_SIZE(param_mcinit);
71 
72 /*******************************************************************************************************************//**
73  * Executes bsp_prv_ddr_reg_init
74  **********************************************************************************************************************/
bsp_prv_ddr_reg_init(void)75 static void bsp_prv_ddr_reg_init (void)
76 {
77     R_BSP_RegisterProtectDisable(BSP_REG_PROTECT_LPC_RESET);
78 
79     R_BSP_MODULE_START(FSP_IP_DDRSS, 0);
80 
81     R_BSP_ModuleResetDisable(BSP_MODULE_RESET_DDRSS_RST_N);
82     R_BSP_ModuleResetDisable(BSP_MODULE_RESET_DDRSS_RST_PWROKLN);
83     R_BSP_ModuleResetDisable(BSP_MODULE_RESET_DDRSS_RESET);
84     R_BSP_ModuleResetDisable(BSP_MODULE_RESET_DDRSS_AXI0_ARESETN);
85     R_BSP_ModuleResetDisable(BSP_MODULE_RESET_DDRSS_AXI1_ARESETN);
86     R_BSP_ModuleResetDisable(BSP_MODULE_RESET_DDRSS_AXI2_ARESETN);
87     R_BSP_ModuleResetDisable(BSP_MODULE_RESET_DDRSS_AXI3_ARESETN);
88     R_BSP_ModuleResetDisable(BSP_MODULE_RESET_DDRSS_AXI4_ARESETN);
89     R_BSP_ModuleResetDisable(BSP_MODULE_RESET_DDRSS_MC_PRESETN);
90     R_BSP_ModuleResetDisable(BSP_MODULE_RESET_DDRSS_PHY_PRESETN);
91 
92     R_BSP_RegisterProtectEnable(BSP_REG_PROTECT_LPC_RESET);
93 }
94 
95 /*******************************************************************************************************************//**
96  * Executes bsp_ddr_init
97  **********************************************************************************************************************/
bsp_ddr_init(void)98 void bsp_ddr_init (void)
99 {
100     R_BSP_RegisterProtectDisable(BSP_REG_PROTECT_SYSTEM);
101 
102     R_BSP_SlaveStopRelease(BSP_BUS_SLAVE_DDRSS_A0_IF);
103     R_BSP_SlaveStopRelease(BSP_BUS_SLAVE_DDRSS_A1_IF);
104     R_BSP_SlaveStopRelease(BSP_BUS_SLAVE_DDRSS_R2_IF);
105     R_BSP_SlaveStopRelease(BSP_BUS_SLAVE_DDRSS_R3_IF);
106     R_BSP_SlaveStopRelease(BSP_BUS_SLAVE_DDRSS_A4_IF);
107     R_SSC->SSTPCR4_b.DDRAPB = 0;
108 
109     R_BSP_RegisterProtectEnable(BSP_REG_PROTECT_SYSTEM);
110 
111     bsp_prv_ddr_reg_init();
112 
113     bsp_prv_ddr_setup_mc();
114 
115     bsp_prv_ddr_phyinit_c();
116     bsp_prv_ddr_phyinit_d2h_1d();
117     bsp_prv_ddr_phyinit_d2h_2d();
118 
119     bsp_prv_ddr_phyinit_mc();
120 
121     bsp_prv_ddr_phyinit_i();
122     bsp_prv_ddr_phyinit_j();
123 
124   #if (1 == BSP_CFG_DDR_ZERO_INITIALIZED_ENABLE)
125     uint32_t val;
126     uint32_t addr_space, end_addr17;
127 
128     val = R_DDRSS->DDR_MEMC_DENALI_CTL_312_b.CS_MAP;
129     if (val == 0x01)
130     {
131         end_addr17 = R_DDRSS->DDR_MEMC_DENALI_CTL_304_b.CS_VAL_UPPER_0;
132     }
133     else
134     {
135         end_addr17 = R_DDRSS->DDR_MEMC_DENALI_CTL_306_b.CS_VAL_UPPER_1;
136     }
137 
138     if (end_addr17 == 0xdfff)
139     {
140         addr_space = 33;
141     }
142     else if (end_addr17 == 0x6fff)
143     {
144         addr_space = 32;
145     }
146     else if (end_addr17 == 0x37ff)
147     {
148         addr_space = 31;
149     }
150     else if (end_addr17 == 0x1bff)
151     {
152         addr_space = 30;
153     }
154     else if (end_addr17 == 0x0dff)
155     {
156         addr_space = 29;
157     }
158     else
159     {
160         addr_space = 33;
161     }
162     bsp_prv_ddr_prog_all0(BPS_DDR_BASE_ADDR, addr_space);
163   #endif
164 
165     bsp_prv_ddr_update_mc();
166 }
167 
168 /*******************************************************************************************************************//**
169  * Executes bsp_prv_ddr_phyinit_c
170  **********************************************************************************************************************/
bsp_prv_ddr_phyinit_c(void)171 static void bsp_prv_ddr_phyinit_c (void)
172 {
173     bsp_prv_ddr_phyinit_configuration();
174     bsp_prv_ddr_phyinit_pin_swizzling();
175 }
176 
177 /*******************************************************************************************************************//**
178  * Executes bsp_prv_ddr_phyinit_d2h_1d
179  **********************************************************************************************************************/
bsp_prv_ddr_phyinit_d2h_1d(void)180 static void bsp_prv_ddr_phyinit_d2h_1d (void)
181 {
182     bsp_prv_ddr_phyinit_load_1d_image();
183     bsp_prv_ddr_phyinit_exec_1d_image();
184 }
185 
186 /*******************************************************************************************************************//**
187  * Executes bsp_prv_ddr_phyinit_d2h_2d
188  **********************************************************************************************************************/
bsp_prv_ddr_phyinit_d2h_2d(void)189 static void bsp_prv_ddr_phyinit_d2h_2d (void)
190 {
191     bsp_prv_ddr_phyinit_load_2d_image();
192     bsp_prv_ddr_phyinit_exec_2d_image();
193 }
194 
195 /*******************************************************************************************************************//**
196  * Executes bsp_prv_ddr_phyinit_i
197  **********************************************************************************************************************/
bsp_prv_ddr_phyinit_i(void)198 static void bsp_prv_ddr_phyinit_i (void)
199 {
200     bsp_prv_ddr_phyinit_load_eng_image();
201 }
202 
203 /*******************************************************************************************************************//**
204  * Executes bsp_prv_ddr_phyinit_j
205  **********************************************************************************************************************/
bsp_prv_ddr_phyinit_j(void)206 static void bsp_prv_ddr_phyinit_j (void)
207 {
208     R_DDRSS->DDR_MEMC_DENALI_CTL_00_b.start = 1;
209     FSP_HARDWARE_REGISTER_WAIT((R_DDRSS->DDR_MEMC_DENALI_CTL_335_b.INT_STATUS_INIT & 0x02), 0x02);
210 }
211 
212 /*******************************************************************************************************************//**
213  * Executes bsp_prv_ddr_phyinit_mc
214  **********************************************************************************************************************/
bsp_prv_ddr_phyinit_mc(void)215 static void bsp_prv_ddr_phyinit_mc (void)
216 {
217     uint32_t val, num_rank, num_byte, tctrl_delay, bl, x, tx_dqs_dly;
218 
219     bsp_dwc_ddrphy_apb_wr(0x0d0000, 0x0);
220 
221     val      = R_DDRSS->DDR_MEMC_DENALI_CTL_312_b.CS_MAP;
222     num_rank = (val == 3) ? 2 : 1;
223 
224     val = R_DDRSS->DDR_MEMC_DENALI_CTL_313_b.MEM_DP_REDUCTION;
225 
226     num_byte    = (val == 1) ? 2 : 4;
227     val         = bsp_dwc_ddrphy_apb_rd(0x02002e);
228     tctrl_delay = ((val >> 1) + (val & 1)) + 8;
229 
230     val = R_DDRSS->DDR_MEMC_DENALI_CTL_64_b.BSTLEN;
231     bl  = (1 << val);
232 
233     x = 0;
234     if (num_byte > 0)
235     {
236         val = bsp_dwc_ddrphy_apb_rd(0x010020);
237         x   = (val > x) ? val : x;
238     }
239 
240     if (num_byte > 1)
241     {
242         val = bsp_dwc_ddrphy_apb_rd(0x011020);
243         x   = (val > x) ? val : x;
244     }
245 
246     if (num_byte > 2)
247     {
248         val = bsp_dwc_ddrphy_apb_rd(0x012020); x = (val > x) ? val : x;
249     }
250 
251     if (num_byte > 3)
252     {
253         val = bsp_dwc_ddrphy_apb_rd(0x013020); x = (val > x) ? val : x;
254     }
255 
256     val = 16 + tctrl_delay + (2 * x);
257     R_DDRSS->DDR_MEMC_DENALI_CTL_732_b.TDFI_PHY_RDLAT_F0 = (val & 0x7F);
258 
259     x = 0;
260     if ((num_rank > 0) && (num_byte > 0))
261     {
262         val = bsp_dwc_ddrphy_apb_rd(0x0100d0);
263         x   = (val > x) ? val : x;
264         val = bsp_dwc_ddrphy_apb_rd(0x0101d0);
265         x   = (val > x) ? val : x;
266     }
267 
268     if ((num_rank > 0) && (num_byte > 1))
269     {
270         val = bsp_dwc_ddrphy_apb_rd(0x0110d0);
271         x   = (val > x) ? val : x;
272         val = bsp_dwc_ddrphy_apb_rd(0x0111d0);
273         x   = (val > x) ? val : x;
274     }
275 
276     if ((num_rank > 0) && (num_byte > 2))
277     {
278         val = bsp_dwc_ddrphy_apb_rd(0x0120d0);
279         x   = (val > x) ? val : x;
280         val = bsp_dwc_ddrphy_apb_rd(0x0121d0);
281         x   = (val > x) ? val : x;
282     }
283 
284     if ((num_rank > 0) && (num_byte > 3))
285     {
286         val = bsp_dwc_ddrphy_apb_rd(0x0130d0);
287         x   = (val > x) ? val : x;
288         val = bsp_dwc_ddrphy_apb_rd(0x0131d0);
289         x   = (val > x) ? val : x;
290     }
291 
292     if ((num_rank > 1) && (num_byte > 0))
293     {
294         val = bsp_dwc_ddrphy_apb_rd(0x0100d1);
295         x   = (val > x) ? val : x;
296         val = bsp_dwc_ddrphy_apb_rd(0x0101d1);
297         x   = (val > x) ? val : x;
298     }
299 
300     if ((num_rank > 1) && (num_byte > 1))
301     {
302         val = bsp_dwc_ddrphy_apb_rd(0x0110d1);
303         x   = (val > x) ? val : x;
304         val = bsp_dwc_ddrphy_apb_rd(0x0111d1);
305         x   = (val > x) ? val : x;
306     }
307 
308     if ((num_rank > 1) && (num_byte > 2))
309     {
310         val = bsp_dwc_ddrphy_apb_rd(0x0120d1);
311         x   = (val > x) ? val : x;
312         val = bsp_dwc_ddrphy_apb_rd(0x0121d1);
313         x   = (val > x) ? val : x;
314     }
315 
316     if ((num_rank > 1) && (num_byte > 3))
317     {
318         val = bsp_dwc_ddrphy_apb_rd(0x0130d1);
319         x   = (val > x) ? val : x;
320         val = bsp_dwc_ddrphy_apb_rd(0x0131d1);
321         x   = (val > x) ? val : x;
322     }
323 
324     tx_dqs_dly = ((x >> 6) & 0xf) + (((x >> 4) & 0x01) + ((x >> 3) & 0x1));
325     val        = tctrl_delay + (6 + (bl / 2)) + tx_dqs_dly;
326     R_DDRSS->DDR_MEMC_DENALI_CTL_761_b.TDFI_WRDATA = (val & 0xff);
327 
328     bsp_dwc_ddrphy_apb_wr(0x0d0000, 0x1);
329 }
330 
331   #if (1 == BSP_CFG_DDR_ZERO_INITIALIZED_ENABLE)
332 
333 /*******************************************************************************************************************//**
334  * Executes bsp_prv_ddr_prog_all0
335  *
336  * @param[in] start_addr    First argument
337  * @param[in] addr_space    Second argument
338  **********************************************************************************************************************/
bsp_prv_ddr_prog_all0(uint64_t start_addr,uint32_t addr_space)339 static void bsp_prv_ddr_prog_all0 (uint64_t start_addr, uint32_t addr_space)
340 {
341     uint32_t bak_lp_auto_entry_en;
342 
343     R_DDRSS->DDR_MEMC_DENALI_CTL_232_b.ECC_DISABLE_W_UC_ERR = 1;
344 
345     bak_lp_auto_entry_en = R_DDRSS->DDR_MEMC_DENALI_CTL_160_b.LP_AUTO_ENTRY_EN;
346 
347     R_DDRSS->DDR_MEMC_DENALI_CTL_160_b.LP_AUTO_ENTRY_EN = 0x0;
348 
349     R_DDRSS->DDR_MEMC_DENALI_CTL_221_b.BIST_START_ADDRESS   = (start_addr & 0xffffffff);
350     R_DDRSS->DDR_MEMC_DENALI_CTL_222_b.BIST_START_ADDRESS32 = ((start_addr >> 32) & 0x00000001);
351     R_DDRSS->DDR_MEMC_DENALI_CTL_219_b.ADDR_SPACE           = (addr_space & 0x3F);
352     R_DDRSS->DDR_MEMC_DENALI_CTL_220_b.BIST_DATA_CHECK      = 1;
353     R_DDRSS->DDR_MEMC_DENALI_CTL_225_b.BIST_TEST_MODE       = 0b100;
354     R_DDRSS->DDR_MEMC_DENALI_CTL_226_b.BIST_DATA_PATTERN0   = 0x00000000;
355     R_DDRSS->DDR_MEMC_DENALI_CTL_227_b.BIST_DATA_PATTERN1   = 0x00000000;
356     R_DDRSS->DDR_MEMC_DENALI_CTL_228_b.BIST_DATA_PATTERN2   = 0x00000000;
357     R_DDRSS->DDR_MEMC_DENALI_CTL_229_b.BIST_DATA_PATTERN3   = 0x00000000;
358 
359     R_BSP_SoftwareDelay(1, BSP_DELAY_UNITS_MICROSECONDS);
360 
361     R_DDRSS->DDR_MEMC_DENALI_CTL_219_b.BIST_GO = 1;
362     FSP_HARDWARE_REGISTER_WAIT((R_DDRSS->DDR_MEMC_DENALI_CTL_334_b.INT_STATUS_BIST & 0x01), 0x01);
363 
364     R_DDRSS->DDR_MEMC_DENALI_CTL_219_b.BIST_GO      = 0;
365     R_DDRSS->DDR_MEMC_DENALI_CTL_343_b.INT_ACK_BIST = 1;
366     R_DDRSS->DDR_MEMC_DENALI_CTL_338_b.INT_ACK_ECC  = 0x000001CF;
367 
368     FSP_HARDWARE_REGISTER_WAIT(R_DDRSS->DDR_MEMC_DENALI_CTL_334_b.INT_STATUS_BIST, 0);
369     FSP_HARDWARE_REGISTER_WAIT(R_DDRSS->DDR_MEMC_DENALI_CTL_329_b.INT_STATUS_ECC, 0);
370 
371     R_DDRSS->DDR_MEMC_DENALI_CTL_160_b.LP_AUTO_ENTRY_EN     = (bak_lp_auto_entry_en & 0xf);
372     R_DDRSS->DDR_MEMC_DENALI_CTL_232_b.ECC_DISABLE_W_UC_ERR = 0;
373 
374     R_BSP_SoftwareDelay(1, BSP_DELAY_UNITS_MICROSECONDS);
375 }
376 
377   #endif
378 
379 /*******************************************************************************************************************//**
380  * Executes bsp_prv_dwc_ddrphy_phyinit_userCustom_G_waitDone
381  *
382  * @param[in] sel_train     First argument
383  **********************************************************************************************************************/
bsp_prv_dwc_ddrphy_phyinit_userCustom_G_waitDone(uint8_t sel_train)384 void bsp_prv_dwc_ddrphy_phyinit_userCustom_G_waitDone (uint8_t sel_train)
385 {
386     volatile uint32_t train_done = 0;
387     volatile uint32_t mail       = 0;
388     volatile uint32_t data       = 0;
389 
390     while (train_done == 0)
391     {
392         data = bsp_dwc_ddrphy_apb_rd(0x0d0004);
393 
394         if ((data & 0x1) == 0)
395         {
396             mail = bsp_get_mail(0);
397             if ((mail == 0xff) || (mail == 0x07))
398             {
399                 train_done = 1;
400             }
401         }
402     }
403 
404     FSP_PARAMETER_NOT_USED(sel_train);
405 }
406 
407 /*******************************************************************************************************************//**
408  * Executes bsp_get_mail
409  *
410  * @param[in] mode_32bits   First argument
411  *
412  * @retval                  Returns the value of uint32_t
413  **********************************************************************************************************************/
bsp_get_mail(uint8_t mode_32bits)414 uint32_t bsp_get_mail (uint8_t mode_32bits)
415 {
416     uint32_t mail = 0;
417 
418     while ((bsp_dwc_ddrphy_apb_rd(0x0d0004) & 0x1) != 0)
419     {
420         ;
421     }
422 
423     mail = bsp_dwc_ddrphy_apb_rd(0x0d0032);
424 
425     if (mode_32bits != 0)
426     {
427         mail = (bsp_dwc_ddrphy_apb_rd(0x0d0034) << 16) | mail;
428     }
429 
430     bsp_dwc_ddrphy_apb_wr(0x0d0031, 0x0000);
431 
432     while ((bsp_dwc_ddrphy_apb_rd(0x0d0004) & 0x1) == 0)
433     {
434         ;
435     }
436 
437     bsp_dwc_ddrphy_apb_wr(0x0d0031, 0x0001);
438 
439     return mail;
440 }
441 
442 /*******************************************************************************************************************//**
443  * Executes bsp_prv_dwc_ddrphy_cdd_int
444  *
445  * @param[in] val           First argument
446  *
447  * @return                  Returns the value of uint8_t
448  **********************************************************************************************************************/
bsp_prv_dwc_ddrphy_cdd_int(uint8_t val)449 static int8_t bsp_prv_dwc_ddrphy_cdd_int (uint8_t val)
450 {
451     return (int8_t) ((((val >> 7) & 0x1) == 1) ? -((0x7f ^ ((val >> 0) & 0x7f)) + 1) : ((val >> 0) & 0x7f));
452 }
453 
454 /*******************************************************************************************************************//**
455  * Executes bsp_prv_dwc_ddrphy_cdd_abs
456  *
457  * @param[in] val           First argument
458  *
459  * @return                  Returns the value of uint8_t
460  **********************************************************************************************************************/
bsp_prv_dwc_ddrphy_cdd_abs(uint8_t val)461 static int8_t bsp_prv_dwc_ddrphy_cdd_abs (uint8_t val)
462 {
463     return (uint8_t) ((((val >> 7) & 0x1) == 1) ? ((0x7f ^ ((val >> 0) & 0x7f)) + 1) : ((val >> 0) & 0x7f));
464 }
465 
466 /*******************************************************************************************************************//**
467  * Executes bsp_prv_ddr_setup_mc
468  **********************************************************************************************************************/
bsp_prv_ddr_setup_mc(void)469 void bsp_prv_ddr_setup_mc (void)
470 {
471     uint32_t i;
472 
473     for (i = 0; i < param_mcinit_size; i++)
474     {
475         bsp_ddrtop_mc_apb_wr(param_mcinit[i][0], param_mcinit[i][1]);
476     }
477 }
478 
479 /*******************************************************************************************************************//**
480  * Executes bsp_prv_ddr_phyinit_configuration
481  **********************************************************************************************************************/
bsp_prv_ddr_phyinit_configuration(void)482 static void bsp_prv_ddr_phyinit_configuration (void)
483 {
484     uint32_t i;
485 
486     for (i = 0; i < param_phyinit_c_size; i++)
487     {
488         bsp_dwc_ddrphy_apb_wr(param_phyinit_c[i][0], param_phyinit_c[i][1]);
489     }
490 }
491 
492 /*******************************************************************************************************************//**
493  * Executes bsp_prv_ddr_phyinit_pin_swizzling
494  **********************************************************************************************************************/
bsp_prv_ddr_phyinit_pin_swizzling(void)495 static void bsp_prv_ddr_phyinit_pin_swizzling (void)
496 {
497     uint32_t i;
498 
499     for (i = 0; i < param_phyinit_swizzle_size; i++)
500     {
501         bsp_dwc_ddrphy_apb_wr(param_phyinit_swizzle[i][0], param_phyinit_swizzle[i][1]);
502     }
503 }
504 
505 /*******************************************************************************************************************//**
506  * Executes bsp_prv_ddr_phyinit_load_1d_image
507  **********************************************************************************************************************/
bsp_prv_ddr_phyinit_load_1d_image(void)508 static void bsp_prv_ddr_phyinit_load_1d_image (void)
509 {
510     uint32_t i;
511 
512     bsp_dwc_ddrphy_apb_wr(0x020060, 0x2);
513     bsp_dwc_ddrphy_apb_wr(0x0d0000, 0x0);
514 
515     for (i = 0x0; i <= 0x3fff; i++)
516     {
517         bsp_dwc_ddrphy_apb_wr((uint32_t) (0x50000 + i), (uint32_t) (phyinit_fw_1d[i]));
518     }
519 
520     bsp_dwc_ddrphy_apb_wr(0x0d0000, 0x1);
521 
522     for (i = 0; i < param_phyinit_f_1d_0_size; i++)
523     {
524         bsp_dwc_ddrphy_apb_wr(param_phyinit_f_1d_0[i][0], param_phyinit_f_1d_0[i][1]);
525     }
526 }
527 
528 /*******************************************************************************************************************//**
529  * Executes bsp_prv_ddr_phyinit_exec_1d_image
530  **********************************************************************************************************************/
bsp_prv_ddr_phyinit_exec_1d_image(void)531 static void bsp_prv_ddr_phyinit_exec_1d_image (void)
532 {
533     uint8_t  sel_train;
534     uint32_t val;
535 
536     bsp_dwc_ddrphy_apb_wr(0x0d0000, 0x0);
537     val       = bsp_dwc_ddrphy_apb_rd(0x01005f);
538     sel_train = ((val & 0x700) == 0x100) ? 0 : 2;
539     bsp_dwc_ddrphy_apb_wr(0x0d0000, 0x1);
540 
541     bsp_dwc_ddrphy_apb_wr(0x0d0000, 0x1);
542     bsp_dwc_ddrphy_apb_wr(0x0d0099, 0x9);
543     bsp_dwc_ddrphy_apb_wr(0x0d0099, 0x1);
544     bsp_dwc_ddrphy_apb_wr(0x0d0099, 0x0);
545     bsp_prv_dwc_ddrphy_phyinit_userCustom_G_waitDone(sel_train);
546     bsp_dwc_ddrphy_apb_wr(0x0d0099, 0x1);
547 
548     bsp_dwc_ddrphy_apb_wr(0x0d0000, 0x0);
549 
550     uint32_t num_rank;
551     val      = R_DDRSS->DDR_MEMC_DENALI_CTL_312_b.CS_MAP;
552     num_rank = (val == 3) ? 2 : 1;
553 
554     int8_t val0;
555     int8_t val1;
556     int8_t cdd_rr;
557     int8_t cdd_rw_abs;
558     int8_t cdd_ww;
559     int8_t cdd_ww_abs;
560 
561     if (num_rank > 1)
562     {
563         val    = bsp_dwc_ddrphy_apb_rd(0x54013);
564         val0   = bsp_prv_dwc_ddrphy_cdd_int((val >> 0) & 0xff);
565         val1   = bsp_prv_dwc_ddrphy_cdd_int((val >> 8) & 0xff);
566         cdd_rr = val0;
567         cdd_rr = (val1 > cdd_rr) ? val1 : cdd_rr;
568 
569         val        = bsp_dwc_ddrphy_apb_rd(0x54014);
570         val0       = bsp_prv_dwc_ddrphy_cdd_abs((val >> 0) & 0xff);
571         val1       = bsp_prv_dwc_ddrphy_cdd_abs((val >> 8) & 0xff);
572         cdd_rw_abs = val0;
573         cdd_rw_abs = (val1 > cdd_rw_abs) ? val1 : cdd_rw_abs;
574 
575         val        = bsp_dwc_ddrphy_apb_rd(0x54015);
576         val0       = bsp_prv_dwc_ddrphy_cdd_abs((val >> 0) & 0xff);
577         val1       = bsp_prv_dwc_ddrphy_cdd_abs((val >> 8) & 0xff);
578         cdd_rw_abs = (val0 > cdd_rw_abs) ? val0 : cdd_rw_abs;
579         cdd_rw_abs = (val1 > cdd_rw_abs) ? val1 : cdd_rw_abs;
580 
581         val        = bsp_dwc_ddrphy_apb_rd(0x54018);
582         val0       = bsp_prv_dwc_ddrphy_cdd_int((val >> 0) & 0xff);
583         val1       = bsp_prv_dwc_ddrphy_cdd_int((val >> 8) & 0xff);
584         cdd_ww     = val0;
585         cdd_ww     = (val1 > cdd_ww) ? val1 : cdd_ww;
586         val0       = bsp_prv_dwc_ddrphy_cdd_abs((val >> 0) & 0xff);
587         val1       = bsp_prv_dwc_ddrphy_cdd_abs((val >> 8) & 0xff);
588         cdd_ww_abs = val0;
589         cdd_ww_abs = (val1 > cdd_ww_abs) ? val1 : cdd_ww_abs;
590 
591         val    = bsp_dwc_ddrphy_apb_rd(0x5402c);
592         val1   = bsp_prv_dwc_ddrphy_cdd_int((val >> 8) & 0xff);
593         cdd_rr = (val1 > cdd_rr) ? val1 : cdd_rr;
594 
595         val        = bsp_dwc_ddrphy_apb_rd(0x5402d);
596         val0       = bsp_prv_dwc_ddrphy_cdd_int((val >> 0) & 0xff);
597         cdd_rr     = (val0 > cdd_rr) ? val0 : cdd_rr;
598         val1       = bsp_prv_dwc_ddrphy_cdd_abs((val >> 8) & 0xff);
599         cdd_rw_abs = (val1 > cdd_rw_abs) ? val1 : cdd_rw_abs;
600 
601         val        = bsp_dwc_ddrphy_apb_rd(0x5402e);
602         val0       = bsp_prv_dwc_ddrphy_cdd_abs((val >> 0) & 0xff);
603         val1       = bsp_prv_dwc_ddrphy_cdd_abs((val >> 8) & 0xff);
604         cdd_rw_abs = (val0 > cdd_rw_abs) ? val0 : cdd_rw_abs;
605         cdd_rw_abs = (val1 > cdd_rw_abs) ? val1 : cdd_rw_abs;
606 
607         val        = bsp_dwc_ddrphy_apb_rd(0x5402f);
608         val0       = bsp_prv_dwc_ddrphy_cdd_abs((val >> 0) & 0xff);
609         cdd_rw_abs = (val0 > cdd_rw_abs) ? val0 : cdd_rw_abs;
610 
611         val        = bsp_dwc_ddrphy_apb_rd(0x54031);
612         val1       = bsp_prv_dwc_ddrphy_cdd_int((val >> 8) & 0xff);
613         cdd_ww     = (val1 > cdd_ww) ? val1 : cdd_ww;
614         val1       = bsp_prv_dwc_ddrphy_cdd_abs((val >> 8) & 0xff);
615         cdd_ww_abs = (val1 > cdd_ww_abs) ? val1 : cdd_ww_abs;
616 
617         val        = bsp_dwc_ddrphy_apb_rd(0x54032);
618         val0       = bsp_prv_dwc_ddrphy_cdd_int((val >> 0) & 0xff);
619         cdd_ww     = (val0 > cdd_ww) ? val0 : cdd_ww;
620         val0       = bsp_prv_dwc_ddrphy_cdd_abs((val >> 0) & 0xff);
621         cdd_ww_abs = (val0 > cdd_ww_abs) ? val0 : cdd_ww_abs;
622 
623         if (cdd_rr > 0)
624         {
625             val  = R_DDRSS->DDR_MEMC_DENALI_CTL_376_b.R2R_DIFFCS_DLY_F0;
626             val += (uint32_t) ((uint8_t) cdd_rr);
627             R_DDRSS->DDR_MEMC_DENALI_CTL_376_b.R2R_DIFFCS_DLY_F0 = (val & 0x1F);
628         }
629 
630         if (cdd_ww > 0)
631         {
632             val  = R_DDRSS->DDR_MEMC_DENALI_CTL_377_b.W2W_DIFFCS_DLY_F0;
633             val += (uint32_t) ((uint8_t) cdd_ww);
634             R_DDRSS->DDR_MEMC_DENALI_CTL_377_b.W2W_DIFFCS_DLY_F0 = (val & 0x1F);
635         }
636 
637         val  = R_DDRSS->DDR_MEMC_DENALI_CTL_376_b.R2W_DIFFCS_DLY_F0;
638         val += (uint32_t) ((uint8_t) cdd_rw_abs);
639         R_DDRSS->DDR_MEMC_DENALI_CTL_376_b.R2W_DIFFCS_DLY_F0 = (val & 0x1F);
640 
641         val  = R_DDRSS->DDR_MEMC_DENALI_CTL_377_b.W2R_DIFFCS_DLY_F0;
642         val += (uint32_t) ((uint8_t) cdd_ww_abs);
643         R_DDRSS->DDR_MEMC_DENALI_CTL_377_b.W2R_DIFFCS_DLY_F0 = (val & 0x1F);
644     }
645 
646     bsp_dwc_ddrphy_apb_wr(0x0d0000, 0x1);
647 }
648 
649 /*******************************************************************************************************************//**
650  * Executes bsp_prv_ddr_phyinit_load_2d_image
651  **********************************************************************************************************************/
bsp_prv_ddr_phyinit_load_2d_image(void)652 void bsp_prv_ddr_phyinit_load_2d_image (void)
653 {
654     uint32_t i;
655 
656     bsp_dwc_ddrphy_apb_wr(0x0d0000, 0x0);
657     for (i = 0x0; i <= 0x3fff; i++)
658     {
659         bsp_dwc_ddrphy_apb_wr((uint32_t) (0x50000 + i), (uint32_t) (phyinit_fw_2d[i]));
660     }
661 
662     bsp_dwc_ddrphy_apb_wr(0x0d0000, 0x1);
663 
664     for (i = 0; i < param_phyinit_f_2d_0_size; i++)
665     {
666         bsp_dwc_ddrphy_apb_wr(param_phyinit_f_2d_0[i][0], param_phyinit_f_2d_0[i][1]);
667     }
668 }
669 
670 /*******************************************************************************************************************//**
671  * Executes bsp_prv_ddr_phyinit_exec_2d_image
672  **********************************************************************************************************************/
bsp_prv_ddr_phyinit_exec_2d_image(void)673 void bsp_prv_ddr_phyinit_exec_2d_image (void)
674 {
675     uint8_t  sel_train;
676     uint32_t val;
677 
678     bsp_dwc_ddrphy_apb_wr(0x0d0000, 0x0);
679     val       = bsp_dwc_ddrphy_apb_rd(0x01005f);
680     sel_train = ((val & 0x700) == 0x100) ? 1 : 3;
681     bsp_dwc_ddrphy_apb_wr(0x0d0000, 0x1);
682     bsp_dwc_ddrphy_apb_wr(0x0d0000, 0x1);
683     bsp_dwc_ddrphy_apb_wr(0x0d0099, 0x9);
684     bsp_dwc_ddrphy_apb_wr(0x0d0099, 0x1);
685     bsp_dwc_ddrphy_apb_wr(0x0d0099, 0x0);
686     bsp_prv_dwc_ddrphy_phyinit_userCustom_G_waitDone(sel_train);
687     bsp_dwc_ddrphy_apb_wr(0x0d0099, 0x1);
688 
689     bsp_dwc_ddrphy_apb_wr(0x0d0000, 0x0);
690     bsp_dwc_ddrphy_apb_wr(0x0d0000, 0x1);
691 }
692 
693 /*******************************************************************************************************************//**
694  * Executes bsp_prv_ddr_phyinit_load_eng_image
695  **********************************************************************************************************************/
bsp_prv_ddr_phyinit_load_eng_image(void)696 void bsp_prv_ddr_phyinit_load_eng_image (void)
697 {
698     uint32_t i;
699 
700     for (i = 0; i < param_phyinit_i_size; i++)
701     {
702         bsp_dwc_ddrphy_apb_wr(param_phyinit_i[i][0], param_phyinit_i[i][1]);
703     }
704 }
705 
706 /*******************************************************************************************************************//**
707  * Executes bsp_prv_ddr_update_mc
708  **********************************************************************************************************************/
bsp_prv_ddr_update_mc(void)709 void bsp_prv_ddr_update_mc (void)
710 {
711     uint32_t val;
712 
713     R_DDRSS->DDR_MEMC_DENALI_CTL_327_b.INT_MASK_MASTER = 0;
714 
715     val = R_DDRSS->DDR_MEMC_DENALI_CTL_167_b.PCPCS_PD_EN;
716     if (val == 1)
717     {
718         R_DDRSS->DDR_MEMC_DENALI_CTL_158_b.LPI_WAKEUP_EN = 0x1E;
719     }
720     else
721     {
722         R_DDRSS->DDR_MEMC_DENALI_CTL_158_b.LPI_WAKEUP_EN = 0x1F;
723     }
724 }
725 
726  #endif
727 #endif
728