blob: 71bd696c5a8c8284d6be456b9411bff698885645 [file] [log] [blame]
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001/*
Hiroyuki Nakano82e63c82019-05-16 09:21:37 +09002 * Copyright (c) 2015-2019, Renesas Electronics Corporation. All rights reserved.
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02003 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6
Marek Vasutb9e78d42019-07-14 09:22:57 +02007#include <lib/mmio.h>
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02008#include <stdint.h>
Antonio Nino Diaze0f90632018-12-14 00:18:21 +00009
10#include <common/debug.h>
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +020011
Marek Vasut11d94432019-07-14 11:19:18 +020012#include "boot_init_dram.h"
Marek Vasut291bbfe2019-07-14 09:10:34 +020013#include "boot_init_dram_regdef.h"
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +020014
15#include "../dram_sub_func.h"
16
Marek Vasut11d94432019-07-14 11:19:18 +020017#define RCAR_E3_DDR_VERSION "rev.0.12"
18
19#ifdef ddr_qos_init_setting
20#define REFRESH_RATE 3900 /* Average periodic refresh interval[ns]. Support 3900,7800 */
21#else
22#if RCAR_REF_INT == 1
23#define REFRESH_RATE 7800
24#else
25#define REFRESH_RATE 3900
26#endif
27#endif
28
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +020029/*******************************************************************************
30 * variables
31 ******************************************************************************/
32uint32_t ddrBackup;
33
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +020034/*******************************************************************************
35 * Initialize ddr
36 ******************************************************************************/
37uint32_t init_ddr(void)
38{
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +020039 uint32_t RegVal_R2, RegVal_R5, RegVal_R6, RegVal_R7, RegVal_R12, i;
40 uint32_t ddr_md;
41
42/* rev.0.08 */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +010043 uint32_t RegVal, j;
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +020044 uint32_t dqsgd_0c, bdlcount_0c, bdlcount_0c_div2, bdlcount_0c_div4, bdlcount_0c_div8, bdlcount_0c_div16;
45 uint32_t gatesl_0c, rdqsd_0c, rdqsnd_0c, rbd_0c[4];
Marek Vasut1ddb3bf2018-12-16 19:28:59 +010046 uint32_t pdqsr_ctl, lcdl_ctl, lcdl_judge1, lcdl_judge2;
Marek Vasut432d7672018-12-12 18:06:39 +010047/* rev.0.10 */
48 uint32_t pdr_ctl;
49/* rev.0.11 */
50 uint32_t byp_ctl;
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +020051
52/* rev.0.08 */
Marek Vasutb9e78d42019-07-14 09:22:57 +020053 if ((mmio_read_32(0xFFF00044) & 0x000000FF) == 0x00000000) {
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +020054 pdqsr_ctl = 1;
55 lcdl_ctl = 1;
Marek Vasut432d7672018-12-12 18:06:39 +010056 pdr_ctl = 1; /* rev.0.10 */
57 byp_ctl = 1; /* rev.0.11 */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +010058 } else {
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +020059 pdqsr_ctl = 0;
60 lcdl_ctl = 0;
Marek Vasut432d7672018-12-12 18:06:39 +010061 pdr_ctl = 0; /* rev.0.10 */
62 byp_ctl = 0; /* rev.0.11 */
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +020063 }
64
65 /* Judge the DDR bit rate (ddr_md : 0 = 1584Mbps, 1 = 1856Mbps) */
Marek Vasutb9e78d42019-07-14 09:22:57 +020066 ddr_md = (mmio_read_32(RST_MODEMR) >> 19) & BIT(0);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +020067
68 /* 1584Mbps setting */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +010069 if (ddr_md == 0) {
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +020070 /* CPG setting ===============================================*/
Marek Vasutb9e78d42019-07-14 09:22:57 +020071 mmio_write_32(CPG_CPGWPR, 0x5A5AFFFF);
72 mmio_write_32(CPG_CPGWPCR, 0xA5A50000);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +020073
Marek Vasutb9e78d42019-07-14 09:22:57 +020074 mmio_write_32(CPG_SRCR4, 0x20000000);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +020075
Marek Vasutb9e78d42019-07-14 09:22:57 +020076 mmio_write_32(0xE61500DC, 0xe2200000); /* Change to 1584Mbps */
77 while ((BIT(11) & mmio_read_32(CPG_PLLECR)) == 0);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +020078
Marek Vasutb9e78d42019-07-14 09:22:57 +020079 mmio_write_32(CPG_SRSTCLR4, 0x20000000);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +020080
Marek Vasutb9e78d42019-07-14 09:22:57 +020081 mmio_write_32(CPG_CPGWPCR, 0xA5A50001);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +020082
83 /* CPG setting ===============================================*/
84 } /* ddr_md */
85
Marek Vasutb9e78d42019-07-14 09:22:57 +020086 mmio_write_32(DBSC_DBSYSCNT0, 0x00001234);
87 mmio_write_32(DBSC_DBKIND, 0x00000007);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +020088
89#if RCAR_DRAM_DDR3L_MEMCONF == 0
Marek Vasutb9e78d42019-07-14 09:22:57 +020090 mmio_write_32(DBSC_DBMEMCONF00, 0x0f030a02); /* 1GB */
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +020091#else
Marek Vasutb9e78d42019-07-14 09:22:57 +020092 mmio_write_32(DBSC_DBMEMCONF00, 0x10030a02); /* 2GB(default) */
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +020093#endif
94
95#if RCAR_DRAM_DDR3L_MEMDUAL == 1
Marek Vasutb9e78d42019-07-14 09:22:57 +020096 RegVal_R2 = (mmio_read_32(0xE6790614));
97 mmio_write_32(0xE6790614, RegVal_R2 | 0x00000003); /* MCS1_N/MODT1 are activated. */
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +020098#endif
99
100
Marek Vasutb9e78d42019-07-14 09:22:57 +0200101 mmio_write_32(DBSC_DBPHYCONF0, 0x00000001);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200102
103 /* Select setting value in bps */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100104 if (ddr_md == 0) { /* 1584Mbps */
Marek Vasutb9e78d42019-07-14 09:22:57 +0200105 mmio_write_32(DBSC_DBTR0, 0x0000000B);
106 mmio_write_32(DBSC_DBTR1, 0x00000008);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200107 } else { /* 1856Mbps */
Marek Vasutb9e78d42019-07-14 09:22:57 +0200108 mmio_write_32(DBSC_DBTR0, 0x0000000D);
109 mmio_write_32(DBSC_DBTR1, 0x00000009);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200110 } /* ddr_md */
111
Marek Vasutb9e78d42019-07-14 09:22:57 +0200112 mmio_write_32(DBSC_DBTR2, 0x00000000);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200113
114 /* Select setting value in bps */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100115 if (ddr_md == 0) { /* 1584Mbps */
Marek Vasutb9e78d42019-07-14 09:22:57 +0200116 mmio_write_32(DBSC_DBTR3, 0x0000000B);
117 mmio_write_32(DBSC_DBTR4, 0x000B000B);
118 mmio_write_32(DBSC_DBTR5, 0x00000027);
119 mmio_write_32(DBSC_DBTR6, 0x0000001C);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200120 } else { /* 1856Mbps */
Marek Vasutb9e78d42019-07-14 09:22:57 +0200121 mmio_write_32(DBSC_DBTR3, 0x0000000D);
122 mmio_write_32(DBSC_DBTR4, 0x000D000D);
123 mmio_write_32(DBSC_DBTR5, 0x0000002D);
124 mmio_write_32(DBSC_DBTR6, 0x00000020);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200125 } /* ddr_md */
126
Marek Vasutb9e78d42019-07-14 09:22:57 +0200127 mmio_write_32(DBSC_DBTR7, 0x00060006);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200128
129 /* Select setting value in bps */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100130 if (ddr_md == 0) { /* 1584Mbps */
Marek Vasutb9e78d42019-07-14 09:22:57 +0200131 mmio_write_32(DBSC_DBTR8, 0x00000020);
132 mmio_write_32(DBSC_DBTR9, 0x00000006);
133 mmio_write_32(DBSC_DBTR10, 0x0000000C);
134 mmio_write_32(DBSC_DBTR11, 0x0000000A);
135 mmio_write_32(DBSC_DBTR12, 0x00120012);
136 mmio_write_32(DBSC_DBTR13, 0x000000CE);
137 mmio_write_32(DBSC_DBTR14, 0x00140005);
138 mmio_write_32(DBSC_DBTR15, 0x00050004);
139 mmio_write_32(DBSC_DBTR16, 0x071F0305);
140 mmio_write_32(DBSC_DBTR17, 0x040C0000);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200141 } else { /* 1856Mbps */
Marek Vasutb9e78d42019-07-14 09:22:57 +0200142 mmio_write_32(DBSC_DBTR8, 0x00000021);
143 mmio_write_32(DBSC_DBTR9, 0x00000007);
144 mmio_write_32(DBSC_DBTR10, 0x0000000E);
145 mmio_write_32(DBSC_DBTR11, 0x0000000C);
146 mmio_write_32(DBSC_DBTR12, 0x00140014);
147 mmio_write_32(DBSC_DBTR13, 0x000000F2);
148 mmio_write_32(DBSC_DBTR14, 0x00170006);
149 mmio_write_32(DBSC_DBTR15, 0x00060005);
150 mmio_write_32(DBSC_DBTR16, 0x09210507);
151 mmio_write_32(DBSC_DBTR17, 0x040E0000);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200152 } /* ddr_md */
153
Marek Vasutb9e78d42019-07-14 09:22:57 +0200154 mmio_write_32(DBSC_DBTR18, 0x00000200);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200155
156 /* Select setting value in bps */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100157 if (ddr_md == 0) { /* 1584Mbps */
Marek Vasutb9e78d42019-07-14 09:22:57 +0200158 mmio_write_32(DBSC_DBTR19, 0x01000040);
159 mmio_write_32(DBSC_DBTR20, 0x020000D6);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200160 } else { /* 1856Mbps */
Marek Vasutb9e78d42019-07-14 09:22:57 +0200161 mmio_write_32(DBSC_DBTR19, 0x0129004B);
162 mmio_write_32(DBSC_DBTR20, 0x020000FB);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200163 } /* ddr_md */
164
Marek Vasutb9e78d42019-07-14 09:22:57 +0200165 mmio_write_32(DBSC_DBTR21, 0x00040004);
166 mmio_write_32(DBSC_DBBL, 0x00000000);
167 mmio_write_32(DBSC_DBODT0, 0x00000001);
168 mmio_write_32(DBSC_DBADJ0, 0x00000001);
169 mmio_write_32(DBSC_DBSYSCONF1, 0x00000002);
170 mmio_write_32(DBSC_DBDFICNT0, 0x00000010);
171 mmio_write_32(DBSC_DBBCAMDIS, 0x00000001);
172 mmio_write_32(DBSC_DBSCHRW1, 0x00000046);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200173
174 /* Select setting value in bps */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100175 if (ddr_md == 0) { /* 1584Mbps */
Marek Vasutb9e78d42019-07-14 09:22:57 +0200176 mmio_write_32(DBSC_SCFCTST0, 0x0D050B03);
177 mmio_write_32(DBSC_SCFCTST1, 0x0306030C);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200178 } else { /* 1856Mbps */
Marek Vasutb9e78d42019-07-14 09:22:57 +0200179 mmio_write_32(DBSC_SCFCTST0, 0x0C050B03);
180 mmio_write_32(DBSC_SCFCTST1, 0x0305030C);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200181 } /* ddr_md */
182
183 /* rev.0.03 add Comment */
184 /****************************************************************************
185 * Initial_Step0( INITBYP )
186 ***************************************************************************/
Marek Vasutb9e78d42019-07-14 09:22:57 +0200187 mmio_write_32(DBSC_DBPDLK0, 0x0000A55A);
188 mmio_write_32(DBSC_DBCMD, 0x01840001);
189 mmio_write_32(DBSC_DBCMD, 0x08840000);
Marek Vasut432d7672018-12-12 18:06:39 +0100190 NOTICE("BL2: [COLD_BOOT]\n"); /* rev.0.11 */
Marek Vasutb9e78d42019-07-14 09:22:57 +0200191 mmio_write_32(DBSC_DBPDRGA0, 0x00000001);
192 mmio_write_32(DBSC_DBPDRGD0, 0x80010000);
193 mmio_write_32(DBSC_DBPDRGA0, 0x00000006);
194 while ((BIT(0) & mmio_read_32(DBSC_DBPDRGD0)) == 0);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200195
196 /* rev.0.03 add Comment */
197 /****************************************************************************
198 * Initial_Step1( ZCAL,PLLINIT,DCAL,PHYRST training )
199 ***************************************************************************/
Marek Vasutb9e78d42019-07-14 09:22:57 +0200200 mmio_write_32(DBSC_DBPDRGA0, 0x00000008);
201 mmio_write_32(DBSC_DBPDRGD0, 0x000B8000);
202 mmio_write_32(DBSC_DBPDRGA0, 0x00000090);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200203
204 /* Select setting value in bps */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100205 if (ddr_md == 0) { /* 1584Mbps */
Marek Vasutb9e78d42019-07-14 09:22:57 +0200206 mmio_write_32(DBSC_DBPDRGD0, 0x04058904);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200207 } else { /* 1856Mbps */
Marek Vasutb9e78d42019-07-14 09:22:57 +0200208 mmio_write_32(DBSC_DBPDRGD0, 0x04058A04);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200209 } /* ddr_md */
210
Marek Vasutb9e78d42019-07-14 09:22:57 +0200211 mmio_write_32(DBSC_DBPDRGA0, 0x00000091);
212 mmio_write_32(DBSC_DBPDRGD0, 0x0007BB6B);
213 mmio_write_32(DBSC_DBPDRGA0, 0x00000095);
214 mmio_write_32(DBSC_DBPDRGD0, 0x0007BBAD);
215 mmio_write_32(DBSC_DBPDRGA0, 0x00000099);
216 mmio_write_32(DBSC_DBPDRGD0, 0x0007BB6B);
217 mmio_write_32(DBSC_DBPDRGA0, 0x00000090);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200218
219 /* Select setting value in bps */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100220 if (ddr_md == 0) { /* 1584Mbps */
Marek Vasutb9e78d42019-07-14 09:22:57 +0200221 mmio_write_32(DBSC_DBPDRGD0, 0x04058900);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200222 } else { /* 1856Mbps */
Marek Vasutb9e78d42019-07-14 09:22:57 +0200223 mmio_write_32(DBSC_DBPDRGD0, 0x04058A00);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200224 } /* ddr_md */
225
Marek Vasutb9e78d42019-07-14 09:22:57 +0200226 mmio_write_32(DBSC_DBPDRGA0, 0x00000021);
227 mmio_write_32(DBSC_DBPDRGD0, 0x0024641E);
228 mmio_write_32(DBSC_DBPDRGA0, 0x00000001);
229 mmio_write_32(DBSC_DBPDRGD0, 0x00010073);
230 mmio_write_32(DBSC_DBPDRGA0, 0x00000006);
231 while ((BIT(0) & mmio_read_32(DBSC_DBPDRGD0)) == 0);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200232
233 /* rev.0.03 add Comment */
234 /****************************************************************************
235 * Initial_Step2( DRAMRST/DRAMINT training )
236 ***************************************************************************/
Marek Vasutb9e78d42019-07-14 09:22:57 +0200237 mmio_write_32(DBSC_DBPDRGA0, 0x00000090);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200238
239 /* Select setting value in bps */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100240 if (ddr_md == 0) { /* 1584Mbps */
Marek Vasutb9e78d42019-07-14 09:22:57 +0200241 mmio_write_32(DBSC_DBPDRGD0, 0x0C058900);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200242 } else { /* 1856Mbps */
Marek Vasutb9e78d42019-07-14 09:22:57 +0200243 mmio_write_32(DBSC_DBPDRGD0, 0x0C058A00);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200244 } /* ddr_md */
245
Marek Vasutb9e78d42019-07-14 09:22:57 +0200246 mmio_write_32(DBSC_DBPDRGA0, 0x00000090);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200247
248 /* Select setting value in bps */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100249 if (ddr_md == 0) { /* 1584Mbps */
Marek Vasutb9e78d42019-07-14 09:22:57 +0200250 mmio_write_32(DBSC_DBPDRGD0, 0x04058900);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200251 } else { /* 1856Mbps */
Marek Vasutb9e78d42019-07-14 09:22:57 +0200252 mmio_write_32(DBSC_DBPDRGD0, 0x04058A00);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200253 } /* ddr_md */
254
Marek Vasutb9e78d42019-07-14 09:22:57 +0200255 mmio_write_32(DBSC_DBPDRGA0, 0x00000006);
256 while ((BIT(0) & mmio_read_32(DBSC_DBPDRGD0)) == 0);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200257
Marek Vasutb9e78d42019-07-14 09:22:57 +0200258 mmio_write_32(DBSC_DBPDRGA0, 0x00000003);
Marek Vasut432d7672018-12-12 18:06:39 +0100259 if (byp_ctl == 1) {
Marek Vasutb9e78d42019-07-14 09:22:57 +0200260 mmio_write_32(DBSC_DBPDRGD0, 0x0780C720);
Marek Vasut432d7672018-12-12 18:06:39 +0100261 } else {
Marek Vasutb9e78d42019-07-14 09:22:57 +0200262 mmio_write_32(DBSC_DBPDRGD0, 0x0780C700);
Marek Vasut432d7672018-12-12 18:06:39 +0100263 }
Marek Vasutb9e78d42019-07-14 09:22:57 +0200264 mmio_write_32(DBSC_DBPDRGA0, 0x00000007);
265 while ((BIT(30) & mmio_read_32(DBSC_DBPDRGD0)) == 0);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200266
Marek Vasutb9e78d42019-07-14 09:22:57 +0200267 mmio_write_32(DBSC_DBPDRGA0, 0x00000004);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200268
269 /* Select setting value in bps */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100270 if (ddr_md == 0) { /* 1584Mbps */
Marek Vasutb9e78d42019-07-14 09:22:57 +0200271 mmio_write_32(DBSC_DBPDRGD0, (uint32_t)(REFRESH_RATE * 792 / 125) - 400 + 0x08B00000);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200272 } else { /* 1856Mbps */
Marek Vasutb9e78d42019-07-14 09:22:57 +0200273 mmio_write_32(DBSC_DBPDRGD0, (uint32_t)(REFRESH_RATE * 928 / 125) - 400 + 0x0A300000);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200274 } /* ddr_md */
275
Marek Vasutb9e78d42019-07-14 09:22:57 +0200276 mmio_write_32(DBSC_DBPDRGA0, 0x00000022);
277 mmio_write_32(DBSC_DBPDRGD0, 0x1000040B);
278 mmio_write_32(DBSC_DBPDRGA0, 0x00000023);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200279
280 /* Select setting value in bps */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100281 if (ddr_md == 0) { /* 1584Mbps */
Marek Vasutb9e78d42019-07-14 09:22:57 +0200282 mmio_write_32(DBSC_DBPDRGD0, 0x2D9C0B66);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200283 } else { /* 1856Mbps */
Marek Vasutb9e78d42019-07-14 09:22:57 +0200284 mmio_write_32(DBSC_DBPDRGD0, 0x35A00D77);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200285 } /* ddr_md */
286
Marek Vasutb9e78d42019-07-14 09:22:57 +0200287 mmio_write_32(DBSC_DBPDRGA0, 0x00000024);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200288
289 /* Select setting value in bps */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100290 if (ddr_md == 0) { /* 1584Mbps */
Marek Vasutb9e78d42019-07-14 09:22:57 +0200291 mmio_write_32(DBSC_DBPDRGD0, 0x2A88B400);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200292 } else { /* 1856Mbps */
Marek Vasutb9e78d42019-07-14 09:22:57 +0200293 mmio_write_32(DBSC_DBPDRGD0, 0x2A8A2C28);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200294 } /* ddr_md */
295
Marek Vasutb9e78d42019-07-14 09:22:57 +0200296 mmio_write_32(DBSC_DBPDRGA0, 0x00000025);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200297
298 /* Select setting value in bps */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100299 if (ddr_md == 0) { /* 1584Mbps */
Marek Vasutb9e78d42019-07-14 09:22:57 +0200300 mmio_write_32(DBSC_DBPDRGD0, 0x30005200);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200301 } else { /* 1856Mbps */
Marek Vasutb9e78d42019-07-14 09:22:57 +0200302 mmio_write_32(DBSC_DBPDRGD0, 0x30005E00);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200303 } /* ddr_md */
304
Marek Vasutb9e78d42019-07-14 09:22:57 +0200305 mmio_write_32(DBSC_DBPDRGA0, 0x00000026);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200306
307 /* Select setting value in bps */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100308 if (ddr_md == 0) { /* 1584Mbps */
Marek Vasutb9e78d42019-07-14 09:22:57 +0200309 mmio_write_32(DBSC_DBPDRGD0, 0x0014A9C9);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200310 } else { /* 1856Mbps */
Marek Vasutb9e78d42019-07-14 09:22:57 +0200311 mmio_write_32(DBSC_DBPDRGD0, 0x0014CB49);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200312 } /* ddr_md */
313
Marek Vasutb9e78d42019-07-14 09:22:57 +0200314 mmio_write_32(DBSC_DBPDRGA0, 0x00000027);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200315
316 /* Select setting value in bps */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100317 if (ddr_md == 0) { /* 1584Mbps */
Marek Vasutb9e78d42019-07-14 09:22:57 +0200318 mmio_write_32(DBSC_DBPDRGD0, 0x00000D70);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200319 } else { /* 1856Mbps */
Marek Vasutb9e78d42019-07-14 09:22:57 +0200320 mmio_write_32(DBSC_DBPDRGD0, 0x00000F14);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200321 } /* ddr_md */
322
Marek Vasutb9e78d42019-07-14 09:22:57 +0200323 mmio_write_32(DBSC_DBPDRGA0, 0x00000028);
324 mmio_write_32(DBSC_DBPDRGD0, 0x00000046);
325 mmio_write_32(DBSC_DBPDRGA0, 0x00000029);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200326
327 /* Select setting value in bps */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100328 if (ddr_md == 0) { /* 1584Mbps */
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200329 if (REFRESH_RATE > 3900) {
Marek Vasutb9e78d42019-07-14 09:22:57 +0200330 mmio_write_32(DBSC_DBPDRGD0, 0x00000018); /* [7]SRT=0 */
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200331 } else {
Marek Vasutb9e78d42019-07-14 09:22:57 +0200332 mmio_write_32(DBSC_DBPDRGD0, 0x00000098); /* [7]SRT=1 */
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200333 }
334 } else { /* 1856Mbps */
335 if (REFRESH_RATE > 3900) {
Marek Vasutb9e78d42019-07-14 09:22:57 +0200336 mmio_write_32(DBSC_DBPDRGD0, 0x00000020); /* [7]SRT=0 */
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200337 } else {
Marek Vasutb9e78d42019-07-14 09:22:57 +0200338 mmio_write_32(DBSC_DBPDRGD0, 0x000000A0); /* [7]SRT=1 */
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200339 } /* REFRESH_RATE */
340 } /* ddr_md */
341
Marek Vasutb9e78d42019-07-14 09:22:57 +0200342 mmio_write_32(DBSC_DBPDRGA0, 0x0000002C);
343 mmio_write_32(DBSC_DBPDRGD0, 0x81003047);
344 mmio_write_32(DBSC_DBPDRGA0, 0x00000020);
345 mmio_write_32(DBSC_DBPDRGD0, 0x00181884);
346 mmio_write_32(DBSC_DBPDRGA0, 0x0000001A);
347 mmio_write_32(DBSC_DBPDRGD0, 0x33C03C10);
348 mmio_write_32(DBSC_DBPDRGA0, 0x00000006);
349 while ((BIT(0) & mmio_read_32(DBSC_DBPDRGD0)) == 0);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200350
Marek Vasutb9e78d42019-07-14 09:22:57 +0200351 mmio_write_32(DBSC_DBPDRGA0, 0x000000A7);
352 mmio_write_32(DBSC_DBPDRGD0, 0x0D0D0D0D);
353 mmio_write_32(DBSC_DBPDRGA0, 0x000000A8);
354 mmio_write_32(DBSC_DBPDRGD0, 0x0D0D0D0D);
355 mmio_write_32(DBSC_DBPDRGA0, 0x000000A9);
356 mmio_write_32(DBSC_DBPDRGD0, 0x000D0D0D);
357 mmio_write_32(DBSC_DBPDRGA0, 0x000000C7);
358 mmio_write_32(DBSC_DBPDRGD0, 0x0D0D0D0D);
359 mmio_write_32(DBSC_DBPDRGA0, 0x000000C8);
360 mmio_write_32(DBSC_DBPDRGD0, 0x0D0D0D0D);
361 mmio_write_32(DBSC_DBPDRGA0, 0x000000C9);
362 mmio_write_32(DBSC_DBPDRGD0, 0x000D0D0D);
363 mmio_write_32(DBSC_DBPDRGA0, 0x000000E7);
364 mmio_write_32(DBSC_DBPDRGD0, 0x0D0D0D0D);
365 mmio_write_32(DBSC_DBPDRGA0, 0x000000E8);
366 mmio_write_32(DBSC_DBPDRGD0, 0x0D0D0D0D);
367 mmio_write_32(DBSC_DBPDRGA0, 0x000000E9);
368 mmio_write_32(DBSC_DBPDRGD0, 0x000D0D0D);
369 mmio_write_32(DBSC_DBPDRGA0, 0x00000107);
370 mmio_write_32(DBSC_DBPDRGD0, 0x0D0D0D0D);
371 mmio_write_32(DBSC_DBPDRGA0, 0x00000108);
372 mmio_write_32(DBSC_DBPDRGD0, 0x0D0D0D0D);
373 mmio_write_32(DBSC_DBPDRGA0, 0x00000109);
374 mmio_write_32(DBSC_DBPDRGD0, 0x000D0D0D);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200375
Marek Vasutb9e78d42019-07-14 09:22:57 +0200376 mmio_write_32(DBSC_DBPDRGA0, 0x00000001);
377 mmio_write_32(DBSC_DBPDRGD0, 0x00010181);
378 mmio_write_32(DBSC_DBCMD, 0x08840001);
379 mmio_write_32(DBSC_DBPDRGA0, 0x00000006);
380 while ((BIT(0) & mmio_read_32(DBSC_DBPDRGD0)) == 0);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200381
382 /* rev.0.03 add Comment */
383 /****************************************************************************
384 * Initial_Step3( WL/QSG training )
385 ***************************************************************************/
Marek Vasutb9e78d42019-07-14 09:22:57 +0200386 mmio_write_32(DBSC_DBPDRGA0, 0x00000001);
387 mmio_write_32(DBSC_DBPDRGD0, 0x00010601);
388 mmio_write_32(DBSC_DBPDRGA0, 0x00000006);
389 while ((BIT(0) & mmio_read_32(DBSC_DBPDRGD0)) == 0);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200390
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100391 for (i = 0; i < 4; i++) {
Marek Vasutb9e78d42019-07-14 09:22:57 +0200392 mmio_write_32(DBSC_DBPDRGA0, 0x000000B1 + i * 0x20);
393 RegVal_R5 = (mmio_read_32(DBSC_DBPDRGD0) & 0x0000FF00) >> 0x8;
394 mmio_write_32(DBSC_DBPDRGA0, 0x000000B4 + i * 0x20);
395 RegVal_R6 = (mmio_read_32(DBSC_DBPDRGD0) & 0x000000FF);
396 mmio_write_32(DBSC_DBPDRGA0, 0x000000B3 + i * 0x20);
397 RegVal_R7 = (mmio_read_32(DBSC_DBPDRGD0) & 0x00000007);
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100398 if (RegVal_R6 > 0) {
Marek Vasutb9e78d42019-07-14 09:22:57 +0200399 mmio_write_32(DBSC_DBPDRGA0, 0x000000B2 + i * 0x20);
400 RegVal_R2 = (mmio_read_32(DBSC_DBPDRGD0) & 0xFFFFFFF8);
401 mmio_write_32(DBSC_DBPDRGA0, 0x000000B2 + i * 0x20);
402 mmio_write_32(DBSC_DBPDRGD0, RegVal_R2 | ((RegVal_R7 + 0x1) & 0x00000007));
403 mmio_write_32(DBSC_DBPDRGA0, 0x000000B0 + i * 0x20);
404 RegVal_R2 = (mmio_read_32(DBSC_DBPDRGD0) & 0xFFFFFF00);
405 mmio_write_32(DBSC_DBPDRGA0, 0x000000B0 + i * 0x20);
406 mmio_write_32(DBSC_DBPDRGD0, RegVal_R2 | RegVal_R6);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200407 } else {
Marek Vasutb9e78d42019-07-14 09:22:57 +0200408 mmio_write_32(DBSC_DBPDRGA0, 0x000000B2 + i * 0x20);
409 RegVal_R2 = (mmio_read_32(DBSC_DBPDRGD0) & 0xFFFFFFF8);
410 mmio_write_32(DBSC_DBPDRGA0, 0x000000B2 + i * 0x20);
411 mmio_write_32(DBSC_DBPDRGD0, RegVal_R2 | RegVal_R7);
412 mmio_write_32(DBSC_DBPDRGA0, 0x000000B0 + i * 0x20);
413 RegVal_R2 = (mmio_read_32(DBSC_DBPDRGD0) & 0xFFFFFF00);
414 mmio_write_32(DBSC_DBPDRGA0, 0x000000B0 + i * 0x20);
415 mmio_write_32(DBSC_DBPDRGD0, RegVal_R2 | ((RegVal_R6 + ((RegVal_R5) << 1)) & 0x000000FF));
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200416 } /* RegVal_R6 */
417 } /* for i */
418
Marek Vasut432d7672018-12-12 18:06:39 +0100419 /* rev.0.10 move Comment */
420 /****************************************************************************
421 * Initial_Step4( WLADJ training )
422 ***************************************************************************/
Marek Vasutb9e78d42019-07-14 09:22:57 +0200423 mmio_write_32(DBSC_DBPDRGA0, 0x00000005);
424 mmio_write_32(DBSC_DBPDRGD0, 0xC1AA00C0);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200425
426 /* rev.0.08 */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100427 if (pdqsr_ctl == 1){} else {
Marek Vasutb9e78d42019-07-14 09:22:57 +0200428 mmio_write_32(DBSC_DBPDRGA0, 0x000000A0);
429 mmio_write_32(DBSC_DBPDRGD0, 0x7C0002C5);
430 mmio_write_32(DBSC_DBPDRGA0, 0x000000C0);
431 mmio_write_32(DBSC_DBPDRGD0, 0x7C0002C5);
432 mmio_write_32(DBSC_DBPDRGA0, 0x000000E0);
433 mmio_write_32(DBSC_DBPDRGD0, 0x7C0002C5);
434 mmio_write_32(DBSC_DBPDRGA0, 0x00000100);
435 mmio_write_32(DBSC_DBPDRGD0, 0x7C0002C5);
Marek Vasut432d7672018-12-12 18:06:39 +0100436 }
437
438 /* PDR always off */ /* rev.0.10 */
439 if (pdr_ctl == 1) {
Marek Vasutb9e78d42019-07-14 09:22:57 +0200440 mmio_write_32(DBSC_DBPDRGA0, 0x000000A3);
441 mmio_write_32(DBSC_DBPDRGD0, 0x00000008);
442 mmio_write_32(DBSC_DBPDRGA0, 0x000000C3);
443 mmio_write_32(DBSC_DBPDRGD0, 0x00000008);
444 mmio_write_32(DBSC_DBPDRGA0, 0x000000E3);
445 mmio_write_32(DBSC_DBPDRGD0, 0x00000008);
446 mmio_write_32(DBSC_DBPDRGA0, 0x00000103);
447 mmio_write_32(DBSC_DBPDRGD0, 0x00000008);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200448 }
449
Marek Vasutb9e78d42019-07-14 09:22:57 +0200450 mmio_write_32(DBSC_DBPDRGA0, 0x00000001);
451 mmio_write_32(DBSC_DBPDRGD0, 0x00010801);
452 mmio_write_32(DBSC_DBPDRGA0, 0x00000006);
453 while ((BIT(0) & mmio_read_32(DBSC_DBPDRGD0)) == 0);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200454
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200455 /****************************************************************************
Marek Vasut432d7672018-12-12 18:06:39 +0100456 * Initial_Step5(Read Data Bit Deskew)
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200457 ***************************************************************************/
Marek Vasutb9e78d42019-07-14 09:22:57 +0200458 mmio_write_32(DBSC_DBPDRGA0, 0x00000005);
459 mmio_write_32(DBSC_DBPDRGD0, 0xC1AA00D8);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200460
461 /* rev.0.08 */
Marek Vasutb9e78d42019-07-14 09:22:57 +0200462 mmio_write_32(DBSC_DBPDRGA0, 0x00000001);
463 mmio_write_32(DBSC_DBPDRGD0, 0x00011001);
464 mmio_write_32(DBSC_DBPDRGA0, 0x00000006);
465 while ((BIT(0) & mmio_read_32(DBSC_DBPDRGD0)) == 0);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200466
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100467if (pdqsr_ctl == 1) {
Marek Vasutb9e78d42019-07-14 09:22:57 +0200468 mmio_write_32(DBSC_DBPDRGA0, 0x000000A0);
469 mmio_write_32(DBSC_DBPDRGD0, 0x7C0002C5);
470 mmio_write_32(DBSC_DBPDRGA0, 0x000000C0);
471 mmio_write_32(DBSC_DBPDRGD0, 0x7C0002C5);
472 mmio_write_32(DBSC_DBPDRGA0, 0x000000E0);
473 mmio_write_32(DBSC_DBPDRGD0, 0x7C0002C5);
474 mmio_write_32(DBSC_DBPDRGA0, 0x00000100);
475 mmio_write_32(DBSC_DBPDRGD0, 0x7C0002C5);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200476}
477
Marek Vasut432d7672018-12-12 18:06:39 +0100478 /* PDR dynamic */ /* rev.0.10 */
479 if (pdr_ctl == 1) {
Marek Vasutb9e78d42019-07-14 09:22:57 +0200480 mmio_write_32(DBSC_DBPDRGA0, 0x000000A3);
481 mmio_write_32(DBSC_DBPDRGD0, 0x00000000);
482 mmio_write_32(DBSC_DBPDRGA0, 0x000000C3);
483 mmio_write_32(DBSC_DBPDRGD0, 0x00000000);
484 mmio_write_32(DBSC_DBPDRGA0, 0x000000E3);
485 mmio_write_32(DBSC_DBPDRGD0, 0x00000000);
486 mmio_write_32(DBSC_DBPDRGA0, 0x00000103);
487 mmio_write_32(DBSC_DBPDRGD0, 0x00000000);
Marek Vasut432d7672018-12-12 18:06:39 +0100488 }
489
490 /****************************************************************************
491 * Initial_Step6(Write Data Bit Deskew)
492 ***************************************************************************/
Marek Vasutb9e78d42019-07-14 09:22:57 +0200493 mmio_write_32(DBSC_DBPDRGA0, 0x00000001);
494 mmio_write_32(DBSC_DBPDRGD0, 0x00012001);
495 mmio_write_32(DBSC_DBPDRGA0, 0x00000006);
496 while ((BIT(0) & mmio_read_32(DBSC_DBPDRGD0)) == 0);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200497
Marek Vasut432d7672018-12-12 18:06:39 +0100498 /****************************************************************************
499 * Initial_Step7(Read Data Eye Training)
500 ***************************************************************************/
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100501if (pdqsr_ctl == 1) {
Marek Vasutb9e78d42019-07-14 09:22:57 +0200502 mmio_write_32(DBSC_DBPDRGA0, 0x000000A0);
503 mmio_write_32(DBSC_DBPDRGD0, 0x7C000285);
504 mmio_write_32(DBSC_DBPDRGA0, 0x000000C0);
505 mmio_write_32(DBSC_DBPDRGD0, 0x7C000285);
506 mmio_write_32(DBSC_DBPDRGA0, 0x000000E0);
507 mmio_write_32(DBSC_DBPDRGD0, 0x7C000285);
508 mmio_write_32(DBSC_DBPDRGA0, 0x00000100);
509 mmio_write_32(DBSC_DBPDRGD0, 0x7C000285);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200510}
511
Marek Vasut432d7672018-12-12 18:06:39 +0100512 /* PDR always off */ /* rev.0.10 */
513 if (pdr_ctl == 1) {
Marek Vasutb9e78d42019-07-14 09:22:57 +0200514 mmio_write_32(DBSC_DBPDRGA0, 0x000000A3);
515 mmio_write_32(DBSC_DBPDRGD0, 0x00000008);
516 mmio_write_32(DBSC_DBPDRGA0, 0x000000C3);
517 mmio_write_32(DBSC_DBPDRGD0, 0x00000008);
518 mmio_write_32(DBSC_DBPDRGA0, 0x000000E3);
519 mmio_write_32(DBSC_DBPDRGD0, 0x00000008);
520 mmio_write_32(DBSC_DBPDRGA0, 0x00000103);
521 mmio_write_32(DBSC_DBPDRGD0, 0x00000008);
Marek Vasut432d7672018-12-12 18:06:39 +0100522 }
523
Marek Vasutb9e78d42019-07-14 09:22:57 +0200524 mmio_write_32(DBSC_DBPDRGA0, 0x00000001);
525 mmio_write_32(DBSC_DBPDRGD0, 0x00014001);
526 mmio_write_32(DBSC_DBPDRGA0, 0x00000006);
527 while ((BIT(0) & mmio_read_32(DBSC_DBPDRGD0)) == 0);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200528
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100529if (pdqsr_ctl == 1) {
Marek Vasutb9e78d42019-07-14 09:22:57 +0200530 mmio_write_32(DBSC_DBPDRGA0, 0x000000A0);
531 mmio_write_32(DBSC_DBPDRGD0, 0x7C0002C5);
532 mmio_write_32(DBSC_DBPDRGA0, 0x000000C0);
533 mmio_write_32(DBSC_DBPDRGD0, 0x7C0002C5);
534 mmio_write_32(DBSC_DBPDRGA0, 0x000000E0);
535 mmio_write_32(DBSC_DBPDRGD0, 0x7C0002C5);
536 mmio_write_32(DBSC_DBPDRGA0, 0x00000100);
537 mmio_write_32(DBSC_DBPDRGD0, 0x7C0002C5);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200538}
539
Marek Vasut432d7672018-12-12 18:06:39 +0100540 /* PDR dynamic */ /* rev.0.10 */
541 if (pdr_ctl == 1) {
Marek Vasutb9e78d42019-07-14 09:22:57 +0200542 mmio_write_32(DBSC_DBPDRGA0, 0x000000A3);
543 mmio_write_32(DBSC_DBPDRGD0, 0x00000000);
544 mmio_write_32(DBSC_DBPDRGA0, 0x000000C3);
545 mmio_write_32(DBSC_DBPDRGD0, 0x00000000);
546 mmio_write_32(DBSC_DBPDRGA0, 0x000000E3);
547 mmio_write_32(DBSC_DBPDRGD0, 0x00000000);
548 mmio_write_32(DBSC_DBPDRGA0, 0x00000103);
549 mmio_write_32(DBSC_DBPDRGD0, 0x00000000);
Marek Vasut432d7672018-12-12 18:06:39 +0100550 }
551
552 /****************************************************************************
553 * Initial_Step8(Write Data Eye Training)
554 ***************************************************************************/
Marek Vasutb9e78d42019-07-14 09:22:57 +0200555 mmio_write_32(DBSC_DBPDRGA0, 0x00000001);
556 mmio_write_32(DBSC_DBPDRGD0, 0x00018001);
557 mmio_write_32(DBSC_DBPDRGA0, 0x00000006);
558 while ((BIT(0) & mmio_read_32(DBSC_DBPDRGD0)) == 0);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200559
560 /* rev.0.03 add Comment */
561 /****************************************************************************
562 * Initial_Step3_2( DQS Gate Training )
563 ***************************************************************************/
Marek Vasutb9e78d42019-07-14 09:22:57 +0200564 mmio_write_32(DBSC_DBPDRGA0, 0x000000A0);
565 mmio_write_32(DBSC_DBPDRGD0, 0x7C000285);
566 mmio_write_32(DBSC_DBPDRGA0, 0x000000C0);
567 mmio_write_32(DBSC_DBPDRGD0, 0x7C000285);
568 mmio_write_32(DBSC_DBPDRGA0, 0x000000E0);
569 mmio_write_32(DBSC_DBPDRGD0, 0x7C000285);
570 mmio_write_32(DBSC_DBPDRGA0, 0x00000100);
571 mmio_write_32(DBSC_DBPDRGD0, 0x7C000285);
572 mmio_write_32(DBSC_DBPDRGA0, 0x0000002C);
573 mmio_write_32(DBSC_DBPDRGD0, 0x81003087);
574 mmio_write_32(DBSC_DBPDRGA0, 0x00000001);
575 mmio_write_32(DBSC_DBPDRGD0, 0x00010401);
576 mmio_write_32(DBSC_DBPDRGA0, 0x00000006);
577 while ((BIT(0) & mmio_read_32(DBSC_DBPDRGD0)) == 0);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200578
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100579 for (i = 0; i < 4; i++) {
Marek Vasutb9e78d42019-07-14 09:22:57 +0200580 mmio_write_32(DBSC_DBPDRGA0, 0x000000B1 + i * 0x20);
581 RegVal_R5 = ((mmio_read_32(DBSC_DBPDRGD0) & 0x0000FF00) >> 0x8);
582 mmio_write_32(DBSC_DBPDRGA0, 0x000000B4 + i * 0x20);
583 RegVal_R6 = (mmio_read_32(DBSC_DBPDRGD0) & 0x000000FF);
584 mmio_write_32(DBSC_DBPDRGA0, 0x000000B3 + i * 0x20);
585 RegVal_R7 = (mmio_read_32(DBSC_DBPDRGD0) & 0x00000007);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200586 RegVal_R12 = (RegVal_R5 >> 0x2);
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100587 if (RegVal_R12 < RegVal_R6) {
Marek Vasutb9e78d42019-07-14 09:22:57 +0200588 mmio_write_32(DBSC_DBPDRGA0, 0x000000B2 + i * 0x20);
589 RegVal_R2 = (mmio_read_32(DBSC_DBPDRGD0) & 0xFFFFFFF8);
590 mmio_write_32(DBSC_DBPDRGA0, 0x000000B2 + i * 0x20);
591 mmio_write_32(DBSC_DBPDRGD0, RegVal_R2 | ((RegVal_R7 + 0x1) & 0x00000007));
592 mmio_write_32(DBSC_DBPDRGA0, 0x000000B0 + i * 0x20);
593 RegVal_R2 = (mmio_read_32(DBSC_DBPDRGD0) & 0xFFFFFF00);
594 mmio_write_32(DBSC_DBPDRGA0, 0x000000B0 + i * 0x20);
595 mmio_write_32(DBSC_DBPDRGD0, RegVal_R2 | ((RegVal_R6 - (RegVal_R12)) & 0x000000FF));
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200596 } else {
Marek Vasutb9e78d42019-07-14 09:22:57 +0200597 mmio_write_32(DBSC_DBPDRGA0, 0x000000B2 + i * 0x20);
598 RegVal_R2 = (mmio_read_32(DBSC_DBPDRGD0) & 0xFFFFFFF8);
599 mmio_write_32(DBSC_DBPDRGA0, 0x000000B2 + i * 0x20);
600 mmio_write_32(DBSC_DBPDRGD0, RegVal_R2 | (RegVal_R7 & 0x00000007));
601 mmio_write_32(DBSC_DBPDRGA0, 0x000000B0 + i * 0x20);
602 RegVal_R2 = (mmio_read_32(DBSC_DBPDRGD0) & 0xFFFFFF00);
603 mmio_write_32(DBSC_DBPDRGA0, 0x000000B0 + i * 0x20);
604 mmio_write_32(DBSC_DBPDRGD0, RegVal_R2 | ((RegVal_R6 + (RegVal_R5) + ((RegVal_R5) >> 1) + (RegVal_R12)) & 0x000000FF));
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200605 } /* RegVal_R12 < RegVal_R6 */
606 } /* for i */
607
Marek Vasut432d7672018-12-12 18:06:39 +0100608 /* rev.0.10 move Comment */
609 /****************************************************************************
610 * Initial_Step5-2_7-2( Rd bit Rd eye )
611 ***************************************************************************/
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200612/* rev.0.08 */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100613 if (pdqsr_ctl == 1){} else {
Marek Vasutb9e78d42019-07-14 09:22:57 +0200614 mmio_write_32(DBSC_DBPDRGA0, 0x000000A0);
615 mmio_write_32(DBSC_DBPDRGD0, 0x7C0002C5);
616 mmio_write_32(DBSC_DBPDRGA0, 0x000000C0);
617 mmio_write_32(DBSC_DBPDRGD0, 0x7C0002C5);
618 mmio_write_32(DBSC_DBPDRGA0, 0x000000E0);
619 mmio_write_32(DBSC_DBPDRGD0, 0x7C0002C5);
620 mmio_write_32(DBSC_DBPDRGA0, 0x00000100);
621 mmio_write_32(DBSC_DBPDRGD0, 0x7C0002C5);
Marek Vasut432d7672018-12-12 18:06:39 +0100622 }
623
624 /* PDR always off */ /* rev.0.10 */
625 if (pdr_ctl == 1) {
Marek Vasutb9e78d42019-07-14 09:22:57 +0200626 mmio_write_32(DBSC_DBPDRGA0, 0x000000A3);
627 mmio_write_32(DBSC_DBPDRGD0, 0x00000008);
628 mmio_write_32(DBSC_DBPDRGA0, 0x000000C3);
629 mmio_write_32(DBSC_DBPDRGD0, 0x00000008);
630 mmio_write_32(DBSC_DBPDRGA0, 0x000000E3);
631 mmio_write_32(DBSC_DBPDRGD0, 0x00000008);
632 mmio_write_32(DBSC_DBPDRGA0, 0x00000103);
633 mmio_write_32(DBSC_DBPDRGD0, 0x00000008);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200634 }
635
Marek Vasutb9e78d42019-07-14 09:22:57 +0200636 mmio_write_32(DBSC_DBPDRGA0, 0x00000001);
637 mmio_write_32(DBSC_DBPDRGD0, 0x00015001);
638 mmio_write_32(DBSC_DBPDRGA0, 0x00000006);
639 while ((BIT(0) & mmio_read_32(DBSC_DBPDRGD0)) == 0);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200640
641/* rev.0.08 */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100642 if (lcdl_ctl == 1) {
643 for (i = 0; i < 4; i++) {
Marek Vasutb9e78d42019-07-14 09:22:57 +0200644 mmio_write_32(DBSC_DBPDRGA0, 0x000000B0 + i * 0x20);
645 dqsgd_0c = (mmio_read_32(DBSC_DBPDRGD0) & 0x000000FF);
646 mmio_write_32(DBSC_DBPDRGA0, 0x000000B1 + i * 0x20);
647 bdlcount_0c = ((mmio_read_32(DBSC_DBPDRGD0) & 0x0000FF00) >> 8);
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100648 bdlcount_0c_div2 = (bdlcount_0c >> 1);
649 bdlcount_0c_div4 = (bdlcount_0c >> 2);
650 bdlcount_0c_div8 = (bdlcount_0c >> 3);
651 bdlcount_0c_div16 = (bdlcount_0c >> 4);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200652
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100653 if (ddr_md == 0) { /* 1584Mbps */
654 lcdl_judge1 = bdlcount_0c_div2 + bdlcount_0c_div4 + bdlcount_0c_div8;
655 lcdl_judge2 = bdlcount_0c + bdlcount_0c_div4 + bdlcount_0c_div16;
656 } else { /* 1856Mbps */
657 lcdl_judge1 = bdlcount_0c_div2 + bdlcount_0c_div4;
658 lcdl_judge2 = bdlcount_0c + bdlcount_0c_div4;
659 } /* ddr_md */
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200660
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100661 if (dqsgd_0c > lcdl_judge1) {
662 if (dqsgd_0c <= lcdl_judge2) {
Marek Vasutb9e78d42019-07-14 09:22:57 +0200663 mmio_write_32(DBSC_DBPDRGA0, 0x000000B0 + i * 0x20);
664 RegVal = (mmio_read_32(DBSC_DBPDRGD0) & 0xFFFFFF00);
665 mmio_write_32(DBSC_DBPDRGD0, ((dqsgd_0c - bdlcount_0c_div8) | RegVal));
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100666 } else {
Marek Vasutb9e78d42019-07-14 09:22:57 +0200667 mmio_write_32(DBSC_DBPDRGA0, 0x000000B0 + i * 0x20);
668 RegVal = (mmio_read_32(DBSC_DBPDRGD0) & 0xFFFFFF00);
669 mmio_write_32(DBSC_DBPDRGD0, RegVal);
670 mmio_write_32(DBSC_DBPDRGA0, 0x000000B2 + i * 0x20);
671 gatesl_0c = (mmio_read_32(DBSC_DBPDRGD0) & 0x00000007);
672 mmio_write_32(DBSC_DBPDRGA0, 0x000000B2 + i * 0x20);
673 RegVal = (mmio_read_32(DBSC_DBPDRGD0) & 0xFFFFFFF8);
674 mmio_write_32(DBSC_DBPDRGD0, (RegVal | (gatesl_0c + 1)));
675 mmio_write_32(DBSC_DBPDRGA0, 0x000000AF + i * 0x20);
676 RegVal = (mmio_read_32(DBSC_DBPDRGD0));
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100677 rdqsd_0c = (RegVal & 0x0000FF00) >> 8;
678 rdqsnd_0c = (RegVal & 0x00FF0000) >> 16;
Marek Vasutb9e78d42019-07-14 09:22:57 +0200679 mmio_write_32(DBSC_DBPDRGA0, 0x000000AF + i * 0x20);
680 mmio_write_32(DBSC_DBPDRGD0, ((RegVal & 0xFF0000FF) | ((rdqsd_0c + bdlcount_0c_div4) << 8) | ((rdqsnd_0c + bdlcount_0c_div4) << 16)));
681 mmio_write_32(DBSC_DBPDRGA0, 0x000000AA + i * 0x20);
682 RegVal = (mmio_read_32(DBSC_DBPDRGD0));
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100683 rbd_0c[0] = (RegVal) &0x0000001f;
684 rbd_0c[1] = (RegVal >> 8) & 0x0000001f;
685 rbd_0c[2] = (RegVal >> 16) & 0x0000001f;
686 rbd_0c[3] = (RegVal >> 24) & 0x0000001f;
Marek Vasutb9e78d42019-07-14 09:22:57 +0200687 mmio_write_32(DBSC_DBPDRGA0, 0x000000AA + i * 0x20);
688 RegVal = (mmio_read_32(DBSC_DBPDRGD0) & 0xE0E0E0E0);
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100689 for (j = 0; j < 4; j++) {
690 rbd_0c[j] = (rbd_0c[j] + bdlcount_0c_div4);
691 if (rbd_0c[j] > 0x1F) rbd_0c[j] = 0x1F;
692 RegVal = RegVal | (rbd_0c[j] << 8 * j);
693 }
Marek Vasutb9e78d42019-07-14 09:22:57 +0200694 mmio_write_32(DBSC_DBPDRGD0, RegVal);
695 mmio_write_32(DBSC_DBPDRGA0, 0x000000AB + i * 0x20);
696 RegVal = (mmio_read_32(DBSC_DBPDRGD0));
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100697 rbd_0c[0] = (RegVal) &0x0000001f;
698 rbd_0c[1] = (RegVal >> 8) & 0x0000001f;
699 rbd_0c[2] = (RegVal >> 16) & 0x0000001f;
700 rbd_0c[3] = (RegVal >> 24) & 0x0000001f;
Marek Vasutb9e78d42019-07-14 09:22:57 +0200701 mmio_write_32(DBSC_DBPDRGA0, 0x000000AB + i * 0x20);
702 RegVal = (mmio_read_32(DBSC_DBPDRGD0) & 0xE0E0E0E0);
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100703 for (j = 0; j < 4; j++) {
704 rbd_0c[j] = (rbd_0c[j] + bdlcount_0c_div4);
705 if (rbd_0c[j] > 0x1F) rbd_0c[j] = 0x1F;
706 RegVal = RegVal | (rbd_0c[j] << 8 * j);
707 }
Marek Vasutb9e78d42019-07-14 09:22:57 +0200708 mmio_write_32(DBSC_DBPDRGD0, RegVal);
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100709 }
710 }
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200711 }
Marek Vasutb9e78d42019-07-14 09:22:57 +0200712 mmio_write_32(DBSC_DBPDRGA0, 0x00000002);
713 mmio_write_32(DBSC_DBPDRGD0, 0x07D81E37);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200714 }
715
Marek Vasutb9e78d42019-07-14 09:22:57 +0200716 mmio_write_32(DBSC_DBPDRGA0, 0x00000003);
Marek Vasut432d7672018-12-12 18:06:39 +0100717 if (byp_ctl == 1) {
Marek Vasutb9e78d42019-07-14 09:22:57 +0200718 mmio_write_32(DBSC_DBPDRGD0, 0x0380C720);
Marek Vasut432d7672018-12-12 18:06:39 +0100719 } else {
Marek Vasutb9e78d42019-07-14 09:22:57 +0200720 mmio_write_32(DBSC_DBPDRGD0, 0x0380C700);
Marek Vasut432d7672018-12-12 18:06:39 +0100721 }
Marek Vasutb9e78d42019-07-14 09:22:57 +0200722 mmio_write_32(DBSC_DBPDRGA0, 0x00000007);
723 while ((BIT(30) & mmio_read_32(DBSC_DBPDRGD0)) != 0);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200724
Marek Vasutb9e78d42019-07-14 09:22:57 +0200725 mmio_write_32(DBSC_DBPDRGA0, 0x00000021);
726 mmio_write_32(DBSC_DBPDRGD0, 0x0024643E);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200727
Marek Vasutb9e78d42019-07-14 09:22:57 +0200728 mmio_write_32(DBSC_DBBUS0CNF1, 0x00000010);
729 mmio_write_32(DBSC_DBCALCNF, (uint32_t)(64000000 / REFRESH_RATE) + 0x01000000);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200730 /* Select setting value in bps */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100731 if (ddr_md == 0) { /* 1584Mbps */
Marek Vasutb9e78d42019-07-14 09:22:57 +0200732 mmio_write_32(DBSC_DBRFCNF1, (uint32_t)(REFRESH_RATE * 99 / 125) + 0x00080000);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200733 } else { /* 1856Mbps */
Marek Vasutb9e78d42019-07-14 09:22:57 +0200734 mmio_write_32(DBSC_DBRFCNF1, (uint32_t)(REFRESH_RATE * 116 / 125) + 0x00080000);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200735 } /* ddr_md */
736
Marek Vasutb9e78d42019-07-14 09:22:57 +0200737 mmio_write_32(DBSC_DBRFCNF2, 0x00010000);
738 mmio_write_32(DBSC_DBDFICUPDCNF, 0x40100001);
739 mmio_write_32(DBSC_DBRFEN, 0x00000001);
740 mmio_write_32(DBSC_DBACEN, 0x00000001);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200741
742/* rev.0.08 */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100743 if (pdqsr_ctl == 1) {
Marek Vasutb9e78d42019-07-14 09:22:57 +0200744 mmio_write_32(0xE67F0018, 0x00000001);
745 RegVal = mmio_read_32(0x40000000);
746 mmio_write_32(DBSC_DBPDRGA0, 0x00000000);
747 mmio_write_32(DBSC_DBPDRGD0, RegVal);
748 mmio_write_32(DBSC_DBPDRGA0, 0x000000A0);
749 mmio_write_32(DBSC_DBPDRGD0, 0x7C0002C5);
750 mmio_write_32(DBSC_DBPDRGA0, 0x000000C0);
751 mmio_write_32(DBSC_DBPDRGD0, 0x7C0002C5);
752 mmio_write_32(DBSC_DBPDRGA0, 0x000000E0);
753 mmio_write_32(DBSC_DBPDRGD0, 0x7C0002C5);
754 mmio_write_32(DBSC_DBPDRGA0, 0x00000100);
755 mmio_write_32(DBSC_DBPDRGD0, 0x7C0002C5);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200756 }
757
Marek Vasut432d7672018-12-12 18:06:39 +0100758 /* PDR dynamic */ /* rev.0.10 */
759 if (pdr_ctl == 1) {
Marek Vasutb9e78d42019-07-14 09:22:57 +0200760 mmio_write_32(DBSC_DBPDRGA0, 0x000000A3);
761 mmio_write_32(DBSC_DBPDRGD0, 0x00000000);
762 mmio_write_32(DBSC_DBPDRGA0, 0x000000C3);
763 mmio_write_32(DBSC_DBPDRGD0, 0x00000000);
764 mmio_write_32(DBSC_DBPDRGA0, 0x000000E3);
765 mmio_write_32(DBSC_DBPDRGD0, 0x00000000);
766 mmio_write_32(DBSC_DBPDRGA0, 0x00000103);
767 mmio_write_32(DBSC_DBPDRGD0, 0x00000000);
Marek Vasut432d7672018-12-12 18:06:39 +0100768 }
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200769
770 /* rev.0.03 add Comment */
771 /****************************************************************************
772 * Initial_Step9( Initial End )
773 ***************************************************************************/
Marek Vasutb9e78d42019-07-14 09:22:57 +0200774 mmio_write_32(DBSC_DBPDLK0, 0x00000000);
775 mmio_write_32(DBSC_DBSYSCNT0, 0x00000000);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200776
777#ifdef ddr_qos_init_setting /* only for non qos_init */
Marek Vasutb9e78d42019-07-14 09:22:57 +0200778 mmio_write_32(DBSC_DBSYSCNT0, 0x00001234);
779 mmio_write_32(DBSC_DBCAM0CNF1, 0x00043218);
780 mmio_write_32(DBSC_DBCAM0CNF2, 0x000000F4);
781 mmio_write_32(DBSC_DBSCHCNT0, 0x000f0037);
782 mmio_write_32(DBSC_DBSCHSZ0, 0x00000001);
783 mmio_write_32(DBSC_DBSCHRW0, 0x22421111);
784 mmio_write_32(DBSC_SCFCTST2, 0x012F1123);
785 mmio_write_32(DBSC_DBSCHQOS00, 0x00000F00);
786 mmio_write_32(DBSC_DBSCHQOS01, 0x00000B00);
787 mmio_write_32(DBSC_DBSCHQOS02, 0x00000000);
788 mmio_write_32(DBSC_DBSCHQOS03, 0x00000000);
789 mmio_write_32(DBSC_DBSCHQOS40, 0x00000300);
790 mmio_write_32(DBSC_DBSCHQOS41, 0x000002F0);
791 mmio_write_32(DBSC_DBSCHQOS42, 0x00000200);
792 mmio_write_32(DBSC_DBSCHQOS43, 0x00000100);
793 mmio_write_32(DBSC_DBSCHQOS90, 0x00000100);
794 mmio_write_32(DBSC_DBSCHQOS91, 0x000000F0);
795 mmio_write_32(DBSC_DBSCHQOS92, 0x000000A0);
796 mmio_write_32(DBSC_DBSCHQOS93, 0x00000040);
797 mmio_write_32(DBSC_DBSCHQOS130, 0x00000100);
798 mmio_write_32(DBSC_DBSCHQOS131, 0x000000F0);
799 mmio_write_32(DBSC_DBSCHQOS132, 0x000000A0);
800 mmio_write_32(DBSC_DBSCHQOS133, 0x00000040);
801 mmio_write_32(DBSC_DBSCHQOS140, 0x000000C0);
802 mmio_write_32(DBSC_DBSCHQOS141, 0x000000B0);
803 mmio_write_32(DBSC_DBSCHQOS142, 0x00000080);
804 mmio_write_32(DBSC_DBSCHQOS143, 0x00000040);
805 mmio_write_32(DBSC_DBSCHQOS150, 0x00000040);
806 mmio_write_32(DBSC_DBSCHQOS151, 0x00000030);
807 mmio_write_32(DBSC_DBSCHQOS152, 0x00000020);
808 mmio_write_32(DBSC_DBSCHQOS153, 0x00000010);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200809
810/* rev.0.08 */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100811 if (pdqsr_ctl == 1){} else {
Marek Vasutb9e78d42019-07-14 09:22:57 +0200812 mmio_write_32(0xE67F0018, 0x00000001);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200813 }
814
Marek Vasutb9e78d42019-07-14 09:22:57 +0200815 mmio_write_32(DBSC_DBSYSCNT0, 0x00000000);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200816#endif
817
818 return 1; /* rev.0.04 Restore the return code */
819
820} /* init_ddr */
821
822/* rev.0.04 add function */
823uint32_t recovery_from_backup_mode(void)
824{
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200825 /****************************************************************************
826 * recovery_Step0(DBSC Setting 1) / same "init_ddr"
827 ***************************************************************************/
828 uint32_t RegVal_R2, RegVal_R5, RegVal_R6, RegVal_R7, RegVal_R12, i;
829 uint32_t ddr_md;
830 uint32_t err;
831
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200832/* rev.0.08 */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100833 uint32_t RegVal, j;
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200834 uint32_t dqsgd_0c, bdlcount_0c, bdlcount_0c_div2, bdlcount_0c_div4, bdlcount_0c_div8, bdlcount_0c_div16;
835 uint32_t gatesl_0c, rdqsd_0c, rdqsnd_0c, rbd_0c[4];
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100836 uint32_t pdqsr_ctl, lcdl_ctl, lcdl_judge1, lcdl_judge2;
Marek Vasut432d7672018-12-12 18:06:39 +0100837 /* rev.0.10 */
838 uint32_t pdr_ctl;
839 /* rev.0.11 */
840 uint32_t byp_ctl;
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200841
842/* rev.0.08 */
Marek Vasutb9e78d42019-07-14 09:22:57 +0200843 if ((mmio_read_32(0xFFF00044) & 0x000000FF) == 0x00000000) {
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200844 pdqsr_ctl = 1;
845 lcdl_ctl = 1;
Marek Vasut432d7672018-12-12 18:06:39 +0100846 pdr_ctl = 1; /* rev.0.10 */
847 byp_ctl = 1; /* rev.0.11 */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100848 } else {
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200849 pdqsr_ctl = 0;
850 lcdl_ctl = 0;
Marek Vasut432d7672018-12-12 18:06:39 +0100851 pdr_ctl = 0; /* rev.0.10 */
852 byp_ctl = 0; /* rev.0.11 */
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200853 }
854
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200855 /* Judge the DDR bit rate (ddr_md : 0 = 1584Mbps, 1 = 1856Mbps) */
Marek Vasutb9e78d42019-07-14 09:22:57 +0200856 ddr_md = (mmio_read_32(RST_MODEMR) >> 19) & BIT(0);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200857
858 /* 1584Mbps setting */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100859 if (ddr_md == 0) {
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200860 /* CPG setting ===============================================*/
Marek Vasutb9e78d42019-07-14 09:22:57 +0200861 mmio_write_32(CPG_CPGWPR, 0x5A5AFFFF);
862 mmio_write_32(CPG_CPGWPCR, 0xA5A50000);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200863
Marek Vasutb9e78d42019-07-14 09:22:57 +0200864 mmio_write_32(CPG_SRCR4, 0x20000000);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200865
Marek Vasutb9e78d42019-07-14 09:22:57 +0200866 mmio_write_32(0xE61500DC, 0xe2200000); /* Change to 1584Mbps */
867 while ((BIT(11) & mmio_read_32(CPG_PLLECR)) == 0);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200868
Marek Vasutb9e78d42019-07-14 09:22:57 +0200869 mmio_write_32(CPG_SRSTCLR4, 0x20000000);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200870
Marek Vasutb9e78d42019-07-14 09:22:57 +0200871 mmio_write_32(CPG_CPGWPCR, 0xA5A50001);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200872
873 /* CPG setting ===============================================*/
874 } /* ddr_md */
875
Marek Vasutb9e78d42019-07-14 09:22:57 +0200876 mmio_write_32(DBSC_DBSYSCNT0, 0x00001234);
877 mmio_write_32(DBSC_DBKIND, 0x00000007);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200878
879#if RCAR_DRAM_DDR3L_MEMCONF == 0
Marek Vasutb9e78d42019-07-14 09:22:57 +0200880 mmio_write_32(DBSC_DBMEMCONF00, 0x0f030a02);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200881#else
Marek Vasutb9e78d42019-07-14 09:22:57 +0200882 mmio_write_32(DBSC_DBMEMCONF00, 0x10030a02);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200883#endif
884
885/* rev.0.08 */
886#if RCAR_DRAM_DDR3L_MEMDUAL == 1
Marek Vasutb9e78d42019-07-14 09:22:57 +0200887 RegVal_R2 = (mmio_read_32(0xE6790614));
888 mmio_write_32(0xE6790614, RegVal_R2 | 0x00000003); /* MCS1_N/MODT1 are activated. */
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200889#endif
890
Marek Vasutb9e78d42019-07-14 09:22:57 +0200891 mmio_write_32(DBSC_DBPHYCONF0, 0x00000001);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200892
893 /* Select setting value in bps */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100894 if (ddr_md == 0) { /* 1584Mbps */
Marek Vasutb9e78d42019-07-14 09:22:57 +0200895 mmio_write_32(DBSC_DBTR0, 0x0000000B);
896 mmio_write_32(DBSC_DBTR1, 0x00000008);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200897 } else { /* 1856Mbps */
Marek Vasutb9e78d42019-07-14 09:22:57 +0200898 mmio_write_32(DBSC_DBTR0, 0x0000000D);
899 mmio_write_32(DBSC_DBTR1, 0x00000009);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200900 } /* ddr_md */
901
Marek Vasutb9e78d42019-07-14 09:22:57 +0200902 mmio_write_32(DBSC_DBTR2, 0x00000000);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200903
904 /* Select setting value in bps */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100905 if (ddr_md == 0) { /* 1584Mbps */
Marek Vasutb9e78d42019-07-14 09:22:57 +0200906 mmio_write_32(DBSC_DBTR3, 0x0000000B);
907 mmio_write_32(DBSC_DBTR4, 0x000B000B);
908 mmio_write_32(DBSC_DBTR5, 0x00000027);
909 mmio_write_32(DBSC_DBTR6, 0x0000001C);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200910 } else { /* 1856Mbps */
Marek Vasutb9e78d42019-07-14 09:22:57 +0200911 mmio_write_32(DBSC_DBTR3, 0x0000000D);
912 mmio_write_32(DBSC_DBTR4, 0x000D000D);
913 mmio_write_32(DBSC_DBTR5, 0x0000002D);
914 mmio_write_32(DBSC_DBTR6, 0x00000020);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200915 } /* ddr_md */
916
Marek Vasutb9e78d42019-07-14 09:22:57 +0200917 mmio_write_32(DBSC_DBTR7, 0x00060006);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200918
919 /* Select setting value in bps */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100920 if (ddr_md == 0) { /* 1584Mbps */
Marek Vasutb9e78d42019-07-14 09:22:57 +0200921 mmio_write_32(DBSC_DBTR8, 0x00000020);
922 mmio_write_32(DBSC_DBTR9, 0x00000006);
923 mmio_write_32(DBSC_DBTR10, 0x0000000C);
924 mmio_write_32(DBSC_DBTR11, 0x0000000A);
925 mmio_write_32(DBSC_DBTR12, 0x00120012);
926 mmio_write_32(DBSC_DBTR13, 0x000000CE);
927 mmio_write_32(DBSC_DBTR14, 0x00140005);
928 mmio_write_32(DBSC_DBTR15, 0x00050004);
929 mmio_write_32(DBSC_DBTR16, 0x071F0305);
930 mmio_write_32(DBSC_DBTR17, 0x040C0000);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200931 } else { /* 1856Mbps */
Marek Vasutb9e78d42019-07-14 09:22:57 +0200932 mmio_write_32(DBSC_DBTR8, 0x00000021);
933 mmio_write_32(DBSC_DBTR9, 0x00000007);
934 mmio_write_32(DBSC_DBTR10, 0x0000000E);
935 mmio_write_32(DBSC_DBTR11, 0x0000000C);
936 mmio_write_32(DBSC_DBTR12, 0x00140014);
937 mmio_write_32(DBSC_DBTR13, 0x000000F2);
938 mmio_write_32(DBSC_DBTR14, 0x00170006);
939 mmio_write_32(DBSC_DBTR15, 0x00060005);
940 mmio_write_32(DBSC_DBTR16, 0x09210507);
941 mmio_write_32(DBSC_DBTR17, 0x040E0000);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200942 } /* ddr_md */
943
Marek Vasutb9e78d42019-07-14 09:22:57 +0200944 mmio_write_32(DBSC_DBTR18, 0x00000200);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200945
946 /* Select setting value in bps */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100947 if (ddr_md == 0) { /* 1584Mbps */
Marek Vasutb9e78d42019-07-14 09:22:57 +0200948 mmio_write_32(DBSC_DBTR19, 0x01000040);
949 mmio_write_32(DBSC_DBTR20, 0x020000D6);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200950 } else { /* 1856Mbps */
Marek Vasutb9e78d42019-07-14 09:22:57 +0200951 mmio_write_32(DBSC_DBTR19, 0x0129004B);
952 mmio_write_32(DBSC_DBTR20, 0x020000FB);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200953 } /* ddr_md */
954
Marek Vasutb9e78d42019-07-14 09:22:57 +0200955 mmio_write_32(DBSC_DBTR21, 0x00040004);
956 mmio_write_32(DBSC_DBBL, 0x00000000);
957 mmio_write_32(DBSC_DBODT0, 0x00000001);
958 mmio_write_32(DBSC_DBADJ0, 0x00000001);
959 mmio_write_32(DBSC_DBSYSCONF1, 0x00000002);
960 mmio_write_32(DBSC_DBDFICNT0, 0x00000010);
961 mmio_write_32(DBSC_DBBCAMDIS, 0x00000001);
962 mmio_write_32(DBSC_DBSCHRW1, 0x00000046);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200963
964 /* Select setting value in bps */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100965 if (ddr_md == 0) { /* 1584Mbps */
Marek Vasutb9e78d42019-07-14 09:22:57 +0200966 mmio_write_32(DBSC_SCFCTST0, 0x0D050B03);
967 mmio_write_32(DBSC_SCFCTST1, 0x0306030C);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200968 } else { /* 1856Mbps */
Marek Vasutb9e78d42019-07-14 09:22:57 +0200969 mmio_write_32(DBSC_SCFCTST0, 0x0C050B03);
970 mmio_write_32(DBSC_SCFCTST1, 0x0305030C);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200971 } /* ddr_md */
972
973 /****************************************************************************
974 * recovery_Step1(PHY setting 1)
975 ***************************************************************************/
Marek Vasutb9e78d42019-07-14 09:22:57 +0200976 mmio_write_32(DBSC_DBPDLK0, 0x0000A55A);
977 mmio_write_32(DBSC_DBCMD, 0x01840001);
978 mmio_write_32(DBSC_DBCMD, 0x0A840000);
979 mmio_write_32(DBSC_DBPDRGA0, 0x00000008); /* DDR_PLLCR */
980 mmio_write_32(DBSC_DBPDRGD0, 0x000B8000);
981 mmio_write_32(DBSC_DBPDRGA0, 0x00000003); /* DDR_PGCR1 */
Marek Vasut432d7672018-12-12 18:06:39 +0100982 if (byp_ctl == 1) {
Marek Vasutb9e78d42019-07-14 09:22:57 +0200983 mmio_write_32(DBSC_DBPDRGD0, 0x0780C720);
Marek Vasut432d7672018-12-12 18:06:39 +0100984 } else {
Marek Vasutb9e78d42019-07-14 09:22:57 +0200985 mmio_write_32(DBSC_DBPDRGD0, 0x0780C700);
Marek Vasut432d7672018-12-12 18:06:39 +0100986 }
Marek Vasutb9e78d42019-07-14 09:22:57 +0200987 mmio_write_32(DBSC_DBPDRGA0, 0x00000020); /* DDR_DXCCR */
988 mmio_write_32(DBSC_DBPDRGD0, 0x00181884);
989 mmio_write_32(DBSC_DBPDRGA0, 0x0000001A); /* DDR_ACIOCR0 */
990 mmio_write_32(DBSC_DBPDRGD0, 0x33C03C10);
991 mmio_write_32(DBSC_DBPDRGA0, 0x00000007);
992 while ((BIT(30) & mmio_read_32(DBSC_DBPDRGD0)) == 0);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200993
Marek Vasutb9e78d42019-07-14 09:22:57 +0200994 mmio_write_32(DBSC_DBPDRGA0, 0x00000004);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200995
996 /* Select setting value in bps */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100997 if (ddr_md == 0) { /* 1584Mbps */
Marek Vasutb9e78d42019-07-14 09:22:57 +0200998 mmio_write_32(DBSC_DBPDRGD0, (uint32_t)(REFRESH_RATE * 792 / 125) - 400 + 0x08B00000);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200999 } else { /* 1856Mbps */
Marek Vasutb9e78d42019-07-14 09:22:57 +02001000 mmio_write_32(DBSC_DBPDRGD0, (uint32_t)(REFRESH_RATE * 928 / 125) - 400 + 0x0A300000);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001001 } /* ddr_md */
1002
Marek Vasutb9e78d42019-07-14 09:22:57 +02001003 mmio_write_32(DBSC_DBPDRGA0, 0x00000022);
1004 mmio_write_32(DBSC_DBPDRGD0, 0x1000040B);
1005 mmio_write_32(DBSC_DBPDRGA0, 0x00000023);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001006
1007 /* Select setting value in bps */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001008 if (ddr_md == 0) { /* 1584Mbps */
Marek Vasutb9e78d42019-07-14 09:22:57 +02001009 mmio_write_32(DBSC_DBPDRGD0, 0x2D9C0B66);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001010 } else { /* 1856Mbps */
Marek Vasutb9e78d42019-07-14 09:22:57 +02001011 mmio_write_32(DBSC_DBPDRGD0, 0x35A00D77);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001012 } /* ddr_md */
1013
Marek Vasutb9e78d42019-07-14 09:22:57 +02001014 mmio_write_32(DBSC_DBPDRGA0, 0x00000024);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001015
1016 /* Select setting value in bps */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001017 if (ddr_md == 0) { /* 1584Mbps */
Marek Vasutb9e78d42019-07-14 09:22:57 +02001018 mmio_write_32(DBSC_DBPDRGD0, 0x2A88B400);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001019 } else { /* 1856Mbps */
Marek Vasutb9e78d42019-07-14 09:22:57 +02001020 mmio_write_32(DBSC_DBPDRGD0, 0x2A8A2C28);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001021 } /* ddr_md */
1022
Marek Vasutb9e78d42019-07-14 09:22:57 +02001023 mmio_write_32(DBSC_DBPDRGA0, 0x00000025);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001024
1025 /* Select setting value in bps */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001026 if (ddr_md == 0) { /* 1584Mbps */
Marek Vasutb9e78d42019-07-14 09:22:57 +02001027 mmio_write_32(DBSC_DBPDRGD0, 0x30005200);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001028 } else { /* 1856Mbps */
Marek Vasutb9e78d42019-07-14 09:22:57 +02001029 mmio_write_32(DBSC_DBPDRGD0, 0x30005E00);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001030 } /* ddr_md */
1031
Marek Vasutb9e78d42019-07-14 09:22:57 +02001032 mmio_write_32(DBSC_DBPDRGA0, 0x00000026);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001033
1034 /* Select setting value in bps */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001035 if (ddr_md == 0) { /* 1584Mbps */
Marek Vasutb9e78d42019-07-14 09:22:57 +02001036 mmio_write_32(DBSC_DBPDRGD0, 0x0014A9C9);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001037 } else { /* 1856Mbps */
Marek Vasutb9e78d42019-07-14 09:22:57 +02001038 mmio_write_32(DBSC_DBPDRGD0, 0x0014CB49);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001039 } /* ddr_md */
1040
Marek Vasutb9e78d42019-07-14 09:22:57 +02001041 mmio_write_32(DBSC_DBPDRGA0, 0x00000027);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001042
1043 /* Select setting value in bps */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001044 if (ddr_md == 0) { /* 1584Mbps */
Marek Vasutb9e78d42019-07-14 09:22:57 +02001045 mmio_write_32(DBSC_DBPDRGD0, 0x00000D70);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001046 } else { /* 1856Mbps */
Marek Vasutb9e78d42019-07-14 09:22:57 +02001047 mmio_write_32(DBSC_DBPDRGD0, 0x00000F14);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001048 } /* ddr_md */
1049
Marek Vasutb9e78d42019-07-14 09:22:57 +02001050 mmio_write_32(DBSC_DBPDRGA0, 0x00000028);
1051 mmio_write_32(DBSC_DBPDRGD0, 0x00000046);
1052 mmio_write_32(DBSC_DBPDRGA0, 0x00000029);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001053
1054 /* Select setting value in bps */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001055 if (ddr_md == 0) { /* 1584Mbps */
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001056 if (REFRESH_RATE > 3900) {
Marek Vasutb9e78d42019-07-14 09:22:57 +02001057 mmio_write_32(DBSC_DBPDRGD0, 0x00000018); /* [7]SRT=0 */
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001058 } else {
Marek Vasutb9e78d42019-07-14 09:22:57 +02001059 mmio_write_32(DBSC_DBPDRGD0, 0x00000098); /* [7]SRT=1 */
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001060 }
1061 } else { /* 1856Mbps */
1062 if (REFRESH_RATE > 3900) {
Marek Vasutb9e78d42019-07-14 09:22:57 +02001063 mmio_write_32(DBSC_DBPDRGD0, 0x00000020); /* [7]SRT=0 */
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001064 } else {
Marek Vasutb9e78d42019-07-14 09:22:57 +02001065 mmio_write_32(DBSC_DBPDRGD0, 0x000000A0); /* [7]SRT=1 */
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001066 } /* REFRESH_RATE */
1067 } /* ddr_md */
1068
Marek Vasutb9e78d42019-07-14 09:22:57 +02001069 mmio_write_32(DBSC_DBPDRGA0, 0x0000002C);
1070 mmio_write_32(DBSC_DBPDRGD0, 0x81003047);
1071 mmio_write_32(DBSC_DBPDRGA0, 0x00000091);
1072 mmio_write_32(DBSC_DBPDRGD0, 0x0007BB6B);
1073 mmio_write_32(DBSC_DBPDRGA0, 0x00000095);
1074 mmio_write_32(DBSC_DBPDRGD0, 0x0007BBAD);
1075 mmio_write_32(DBSC_DBPDRGA0, 0x00000099);
1076 mmio_write_32(DBSC_DBPDRGD0, 0x0007BB6B);
1077 mmio_write_32(DBSC_DBPDRGA0, 0x00000021); /* DDR_DSGCR */
1078 mmio_write_32(DBSC_DBPDRGD0, 0x0024641E);
1079 mmio_write_32(DBSC_DBPDRGA0, 0x00000006); /* DDR_PGSR0 */
1080 while ((BIT(0) & mmio_read_32(DBSC_DBPDRGD0)) == 0);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001081
Marek Vasutb9e78d42019-07-14 09:22:57 +02001082 mmio_write_32(DBSC_DBPDRGA0, 0x00000001); /* DDR_PIR */
1083 mmio_write_32(DBSC_DBPDRGD0, 0x40010000);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001084
Marek Vasutb9e78d42019-07-14 09:22:57 +02001085 mmio_write_32(DBSC_DBPDRGA0, 0x00000006); /* DDR_PGSR0 */
1086 while ((BIT(0) & mmio_read_32(DBSC_DBPDRGD0)) == 0);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001087
Marek Vasutb9e78d42019-07-14 09:22:57 +02001088 mmio_write_32(DBSC_DBPDRGA0, 0x00000092); /* DDR_ZQ0DR */
1089 mmio_write_32(DBSC_DBPDRGD0, 0xC2C59AB5);
1090 mmio_write_32(DBSC_DBPDRGA0, 0x00000096); /* DDR_ZQ1DR */
1091 mmio_write_32(DBSC_DBPDRGD0, 0xC4285FBF);
1092 mmio_write_32(DBSC_DBPDRGA0, 0x0000009A); /* DDR_ZQ2DR */
1093 mmio_write_32(DBSC_DBPDRGD0, 0xC2C59AB5);
1094 mmio_write_32(DBSC_DBPDRGA0, 0x00000090); /* DDR_ZQCR */
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001095
1096 /* Select setting value in bps */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001097 if (ddr_md == 0) { /* 1584Mbps */
Marek Vasutb9e78d42019-07-14 09:22:57 +02001098 mmio_write_32(DBSC_DBPDRGD0, 0x0C058900);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001099 } else { /* 1856Mbps */
Marek Vasutb9e78d42019-07-14 09:22:57 +02001100 mmio_write_32(DBSC_DBPDRGD0, 0x0C058A00);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001101 } /* ddr_md */
1102
Marek Vasutb9e78d42019-07-14 09:22:57 +02001103 mmio_write_32(DBSC_DBPDRGA0, 0x00000090); /* DDR_ZQCR */
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001104
1105 /* Select setting value in bps */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001106 if (ddr_md == 0) { /* 1584Mbps */
Marek Vasutb9e78d42019-07-14 09:22:57 +02001107 mmio_write_32(DBSC_DBPDRGD0, 0x04058900);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001108 } else { /* 1856Mbps */
Marek Vasutb9e78d42019-07-14 09:22:57 +02001109 mmio_write_32(DBSC_DBPDRGD0, 0x04058A00);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001110 } /* ddr_md */
1111
Marek Vasutb9e78d42019-07-14 09:22:57 +02001112 mmio_write_32(DBSC_DBPDRGA0, 0x00000001); /* DDR_PIR */
1113 mmio_write_32(DBSC_DBPDRGD0, 0x00050001);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001114
Marek Vasutb9e78d42019-07-14 09:22:57 +02001115 mmio_write_32(DBSC_DBPDRGA0, 0x00000006); /* DDR_PGSR0 */
1116 while ((BIT(0) & mmio_read_32(DBSC_DBPDRGD0)) == 0);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001117
1118 /* ddr backupmode end */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001119 if (ddrBackup) {
Marek Vasut56519892019-01-21 23:11:33 +01001120 NOTICE("BL2: [WARM_BOOT]\n");
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001121 } else {
Marek Vasut56519892019-01-21 23:11:33 +01001122 NOTICE("BL2: [COLD_BOOT]\n");
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001123 } /* ddrBackup */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001124 err = rcar_dram_update_boot_status(ddrBackup);
1125 if (err) {
Marek Vasut56519892019-01-21 23:11:33 +01001126 NOTICE("BL2: [BOOT_STATUS_UPDATE_ERROR]\n");
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001127 return INITDRAM_ERR_I;
1128 } /* err */
1129
Marek Vasutb9e78d42019-07-14 09:22:57 +02001130 mmio_write_32(DBSC_DBPDRGA0, 0x00000092); /* DDR_ZQ0DR */
1131 mmio_write_32(DBSC_DBPDRGD0, 0x02C59AB5);
1132 mmio_write_32(DBSC_DBPDRGA0, 0x00000096); /* DDR_ZQ1DR */
1133 mmio_write_32(DBSC_DBPDRGD0, 0x04285FBF);
1134 mmio_write_32(DBSC_DBPDRGA0, 0x0000009A); /* DDR_ZQ2DR */
1135 mmio_write_32(DBSC_DBPDRGD0, 0x02C59AB5);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001136
Marek Vasutb9e78d42019-07-14 09:22:57 +02001137 mmio_write_32(DBSC_DBPDRGA0, 0x00000001); /* DDR_PIR */
1138 mmio_write_32(DBSC_DBPDRGD0, 0x08000000);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001139
Marek Vasutb9e78d42019-07-14 09:22:57 +02001140 mmio_write_32(DBSC_DBPDRGA0, 0x00000001); /* DDR_PIR */
1141 mmio_write_32(DBSC_DBPDRGD0, 0x00000003);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001142
Marek Vasutb9e78d42019-07-14 09:22:57 +02001143 mmio_write_32(DBSC_DBPDRGA0, 0x00000006); /* DDR_PGSR0 */
1144 while ((BIT(0) & mmio_read_32(DBSC_DBPDRGD0)) == 0);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001145
Marek Vasutb9e78d42019-07-14 09:22:57 +02001146 mmio_write_32(DBSC_DBPDRGA0, 0x00000001); /* DDR_PIR */
1147 mmio_write_32(DBSC_DBPDRGD0, 0x80010000);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001148
Marek Vasutb9e78d42019-07-14 09:22:57 +02001149 mmio_write_32(DBSC_DBPDRGA0, 0x00000006); /* DDR_PGSR0 */
1150 while ((BIT(0) & mmio_read_32(DBSC_DBPDRGD0)) == 0);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001151
Marek Vasutb9e78d42019-07-14 09:22:57 +02001152 mmio_write_32(DBSC_DBPDRGA0, 0x00000001); /* DDR_PIR */
1153 mmio_write_32(DBSC_DBPDRGD0, 0x00010073);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001154
Marek Vasutb9e78d42019-07-14 09:22:57 +02001155 mmio_write_32(DBSC_DBPDRGA0, 0x00000006); /* DDR_PGSR0 */
1156 while ((BIT(0) & mmio_read_32(DBSC_DBPDRGD0)) == 0);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001157
Marek Vasutb9e78d42019-07-14 09:22:57 +02001158 mmio_write_32(DBSC_DBPDRGA0, 0x00000090); /* DDR_ZQCR */
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001159
1160 /* Select setting value in bps */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001161 if (ddr_md == 0) { /* 1584Mbps */
Marek Vasutb9e78d42019-07-14 09:22:57 +02001162 mmio_write_32(DBSC_DBPDRGD0, 0x0C058900);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001163 } else { /* 1856Mbps */
Marek Vasutb9e78d42019-07-14 09:22:57 +02001164 mmio_write_32(DBSC_DBPDRGD0, 0x0C058A00);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001165 } /* ddr_md */
1166
Marek Vasutb9e78d42019-07-14 09:22:57 +02001167 mmio_write_32(DBSC_DBPDRGA0, 0x00000090); /* DDR_ZQCR */
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001168
1169 /* Select setting value in bps */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001170 if (ddr_md == 0) { /* 1584Mbps */
Marek Vasutb9e78d42019-07-14 09:22:57 +02001171 mmio_write_32(DBSC_DBPDRGD0, 0x04058900);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001172 } else { /* 1856Mbps */
Marek Vasutb9e78d42019-07-14 09:22:57 +02001173 mmio_write_32(DBSC_DBPDRGD0, 0x04058A00);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001174 } /* ddr_md */
1175
1176/* rev0.08 */
Marek Vasutb9e78d42019-07-14 09:22:57 +02001177 mmio_write_32(DBSC_DBPDRGA0, 0x0000000C);
1178 mmio_write_32(DBSC_DBPDRGD0, 0x18000040);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001179
1180 /****************************************************************************
1181 * recovery_Step2(PHY setting 2)
1182 ***************************************************************************/
Marek Vasutb9e78d42019-07-14 09:22:57 +02001183 mmio_write_32(DBSC_DBPDRGA0, 0x00000006);
1184 while ((BIT(0) & mmio_read_32(DBSC_DBPDRGD0)) == 0);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001185
Marek Vasutb9e78d42019-07-14 09:22:57 +02001186 mmio_write_32(DBSC_DBPDRGA0, 0x000000A7);
1187 mmio_write_32(DBSC_DBPDRGD0, 0x0D0D0D0D);
1188 mmio_write_32(DBSC_DBPDRGA0, 0x000000A8);
1189 mmio_write_32(DBSC_DBPDRGD0, 0x0D0D0D0D);
1190 mmio_write_32(DBSC_DBPDRGA0, 0x000000A9);
1191 mmio_write_32(DBSC_DBPDRGD0, 0x000D0D0D);
1192 mmio_write_32(DBSC_DBPDRGA0, 0x000000C7);
1193 mmio_write_32(DBSC_DBPDRGD0, 0x0D0D0D0D);
1194 mmio_write_32(DBSC_DBPDRGA0, 0x000000C8);
1195 mmio_write_32(DBSC_DBPDRGD0, 0x0D0D0D0D);
1196 mmio_write_32(DBSC_DBPDRGA0, 0x000000C9);
1197 mmio_write_32(DBSC_DBPDRGD0, 0x000D0D0D);
1198 mmio_write_32(DBSC_DBPDRGA0, 0x000000E7);
1199 mmio_write_32(DBSC_DBPDRGD0, 0x0D0D0D0D);
1200 mmio_write_32(DBSC_DBPDRGA0, 0x000000E8);
1201 mmio_write_32(DBSC_DBPDRGD0, 0x0D0D0D0D);
1202 mmio_write_32(DBSC_DBPDRGA0, 0x000000E9);
1203 mmio_write_32(DBSC_DBPDRGD0, 0x000D0D0D);
1204 mmio_write_32(DBSC_DBPDRGA0, 0x00000107);
1205 mmio_write_32(DBSC_DBPDRGD0, 0x0D0D0D0D);
1206 mmio_write_32(DBSC_DBPDRGA0, 0x00000108);
1207 mmio_write_32(DBSC_DBPDRGD0, 0x0D0D0D0D);
1208 mmio_write_32(DBSC_DBPDRGA0, 0x00000109);
1209 mmio_write_32(DBSC_DBPDRGD0, 0x000D0D0D);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001210
Marek Vasutb9e78d42019-07-14 09:22:57 +02001211 mmio_write_32(DBSC_DBCALCNF, (uint32_t)(64000000 / REFRESH_RATE) + 0x01000000);
1212 mmio_write_32(DBSC_DBBUS0CNF1, 0x00000010);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001213
1214 /* Select setting value in bps */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001215 if (ddr_md == 0) { /* 1584Mbps */
Marek Vasutb9e78d42019-07-14 09:22:57 +02001216 mmio_write_32(DBSC_DBRFCNF1, (uint32_t)(REFRESH_RATE * 99 / 125) + 0x00080000);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001217 } else { /* 1856Mbps */
Marek Vasutb9e78d42019-07-14 09:22:57 +02001218 mmio_write_32(DBSC_DBRFCNF1, (uint32_t)(REFRESH_RATE * 116 / 125) + 0x00080000);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001219 } /* ddr_md */
1220
Marek Vasutb9e78d42019-07-14 09:22:57 +02001221 mmio_write_32(DBSC_DBRFCNF2, 0x00010000);
1222 mmio_write_32(DBSC_DBRFEN, 0x00000001);
1223 mmio_write_32(DBSC_DBCMD, 0x0A840001);
1224 while ((BIT(0) & mmio_read_32(DBSC_DBWAIT)) != 0);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001225
Marek Vasutb9e78d42019-07-14 09:22:57 +02001226 mmio_write_32(DBSC_DBCMD, 0x00000000);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001227
Marek Vasutb9e78d42019-07-14 09:22:57 +02001228 mmio_write_32(DBSC_DBCMD, 0x04840010);
1229 while ((BIT(0) & mmio_read_32(DBSC_DBWAIT)) != 0);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001230
Marek Vasutb9e78d42019-07-14 09:22:57 +02001231 mmio_write_32(DBSC_DBPDRGA0, 0x00000006); /* DDR_PGSR0 */
1232 while ((BIT(0) & mmio_read_32(DBSC_DBPDRGD0)) == 0);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001233
Marek Vasutb9e78d42019-07-14 09:22:57 +02001234 mmio_write_32(DBSC_DBPDRGA0, 0x00000001); /* DDR_PIR */
1235 mmio_write_32(DBSC_DBPDRGD0, 0x00010701);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001236
Marek Vasutb9e78d42019-07-14 09:22:57 +02001237 mmio_write_32(DBSC_DBPDRGA0, 0x00000006); /* DDR_PGSR0 */
1238 while ((BIT(0) & mmio_read_32(DBSC_DBPDRGD0)) == 0);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001239
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001240 for (i = 0; i < 4; i++)
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001241 {
Marek Vasutb9e78d42019-07-14 09:22:57 +02001242 mmio_write_32(DBSC_DBPDRGA0, 0x000000B1 + i * 0x20);
1243 RegVal_R5 = (mmio_read_32(DBSC_DBPDRGD0) & 0x0000FF00) >> 0x8;
1244 mmio_write_32(DBSC_DBPDRGA0, 0x000000B4 + i * 0x20);
1245 RegVal_R6 = (mmio_read_32(DBSC_DBPDRGD0) & 0x000000FF);
1246 mmio_write_32(DBSC_DBPDRGA0, 0x000000B3 + i * 0x20);
1247 RegVal_R7 = (mmio_read_32(DBSC_DBPDRGD0) & 0x00000007);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001248
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001249 if (RegVal_R6 > 0) {
Marek Vasutb9e78d42019-07-14 09:22:57 +02001250 mmio_write_32(DBSC_DBPDRGA0, 0x000000B2 + i * 0x20);
1251 RegVal_R2 = (mmio_read_32(DBSC_DBPDRGD0) & 0xFFFFFFF8);
1252 mmio_write_32(DBSC_DBPDRGA0, 0x000000B2 + i * 0x20);
1253 mmio_write_32(DBSC_DBPDRGD0, RegVal_R2 | ((RegVal_R7 + 0x1) & 0x00000007));
1254 mmio_write_32(DBSC_DBPDRGA0, 0x000000B0 + i * 0x20);
1255 RegVal_R2 = (mmio_read_32(DBSC_DBPDRGD0) & 0xFFFFFF00);
1256 mmio_write_32(DBSC_DBPDRGA0, 0x000000B0 + i * 0x20);
1257 mmio_write_32(DBSC_DBPDRGD0, RegVal_R2 | RegVal_R6);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001258 } else {
Marek Vasutb9e78d42019-07-14 09:22:57 +02001259 mmio_write_32(DBSC_DBPDRGA0, 0x000000B2 + i * 0x20);
1260 RegVal_R2 = (mmio_read_32(DBSC_DBPDRGD0) & 0xFFFFFFF8);
1261 mmio_write_32(DBSC_DBPDRGA0, 0x000000B2 + i * 0x20);
1262 mmio_write_32(DBSC_DBPDRGD0, RegVal_R2 | RegVal_R7);
1263 mmio_write_32(DBSC_DBPDRGA0, 0x000000B0 + i * 0x20);
1264 RegVal_R2 = (mmio_read_32(DBSC_DBPDRGD0) & 0xFFFFFF00);
1265 mmio_write_32(DBSC_DBPDRGA0, 0x000000B0 + i * 0x20);
1266 mmio_write_32(DBSC_DBPDRGD0, RegVal_R2 | ((RegVal_R6 + ((RegVal_R5) << 1)) & 0x000000FF));
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001267 } /* RegVal_R6 */
1268 } /* for i */
1269
Marek Vasutb9e78d42019-07-14 09:22:57 +02001270 mmio_write_32(DBSC_DBPDRGA0, 0x00000005);
1271 mmio_write_32(DBSC_DBPDRGD0, 0xC1AA00C0);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001272
1273 /* rev.0.08 */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001274 if (pdqsr_ctl == 1){} else {
Marek Vasutb9e78d42019-07-14 09:22:57 +02001275 mmio_write_32(DBSC_DBPDRGA0, 0x000000A0);
1276 mmio_write_32(DBSC_DBPDRGD0, 0x7C0002C5);
1277 mmio_write_32(DBSC_DBPDRGA0, 0x000000C0);
1278 mmio_write_32(DBSC_DBPDRGD0, 0x7C0002C5);
1279 mmio_write_32(DBSC_DBPDRGA0, 0x000000E0);
1280 mmio_write_32(DBSC_DBPDRGD0, 0x7C0002C5);
1281 mmio_write_32(DBSC_DBPDRGA0, 0x00000100);
1282 mmio_write_32(DBSC_DBPDRGD0, 0x7C0002C5);
Marek Vasut432d7672018-12-12 18:06:39 +01001283 }
1284
1285 /* PDR always off */ /* rev.0.10 */
1286 if (pdr_ctl == 1) {
Marek Vasutb9e78d42019-07-14 09:22:57 +02001287 mmio_write_32(DBSC_DBPDRGA0, 0x000000A3);
1288 mmio_write_32(DBSC_DBPDRGD0, 0x00000008);
1289 mmio_write_32(DBSC_DBPDRGA0, 0x000000C3);
1290 mmio_write_32(DBSC_DBPDRGD0, 0x00000008);
1291 mmio_write_32(DBSC_DBPDRGA0, 0x000000E3);
1292 mmio_write_32(DBSC_DBPDRGD0, 0x00000008);
1293 mmio_write_32(DBSC_DBPDRGA0, 0x00000103);
1294 mmio_write_32(DBSC_DBPDRGD0, 0x00000008);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001295 }
1296
Marek Vasutb9e78d42019-07-14 09:22:57 +02001297 mmio_write_32(DBSC_DBPDRGA0, 0x00000001);
1298 mmio_write_32(DBSC_DBPDRGD0, 0x00010801);
1299 mmio_write_32(DBSC_DBPDRGA0, 0x00000006);
1300 while ((BIT(0) & mmio_read_32(DBSC_DBPDRGD0)) == 0);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001301
Marek Vasutb9e78d42019-07-14 09:22:57 +02001302 mmio_write_32(DBSC_DBPDRGA0, 0x00000005);
1303 mmio_write_32(DBSC_DBPDRGD0, 0xC1AA00D8);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001304
1305 /* rev.0.08 */
Marek Vasutb9e78d42019-07-14 09:22:57 +02001306 mmio_write_32(DBSC_DBPDRGA0, 0x00000001);
1307 mmio_write_32(DBSC_DBPDRGD0, 0x00011001);
1308 mmio_write_32(DBSC_DBPDRGA0, 0x00000006);
1309 while ((BIT(0) & mmio_read_32(DBSC_DBPDRGD0)) == 0);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001310
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001311if (pdqsr_ctl == 1) {
Marek Vasutb9e78d42019-07-14 09:22:57 +02001312 mmio_write_32(DBSC_DBPDRGA0, 0x000000A0);
1313 mmio_write_32(DBSC_DBPDRGD0, 0x7C0002C5);
1314 mmio_write_32(DBSC_DBPDRGA0, 0x000000C0);
1315 mmio_write_32(DBSC_DBPDRGD0, 0x7C0002C5);
1316 mmio_write_32(DBSC_DBPDRGA0, 0x000000E0);
1317 mmio_write_32(DBSC_DBPDRGD0, 0x7C0002C5);
1318 mmio_write_32(DBSC_DBPDRGA0, 0x00000100);
1319 mmio_write_32(DBSC_DBPDRGD0, 0x7C0002C5);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001320}
1321
Marek Vasut432d7672018-12-12 18:06:39 +01001322 /* PDR dynamic */ /* rev.0.10 */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001323 if (pdr_ctl == 1) {
Marek Vasutb9e78d42019-07-14 09:22:57 +02001324 mmio_write_32(DBSC_DBPDRGA0, 0x000000A3);
1325 mmio_write_32(DBSC_DBPDRGD0, 0x00000000);
1326 mmio_write_32(DBSC_DBPDRGA0, 0x000000C3);
1327 mmio_write_32(DBSC_DBPDRGD0, 0x00000000);
1328 mmio_write_32(DBSC_DBPDRGA0, 0x000000E3);
1329 mmio_write_32(DBSC_DBPDRGD0, 0x00000000);
1330 mmio_write_32(DBSC_DBPDRGA0, 0x00000103);
1331 mmio_write_32(DBSC_DBPDRGD0, 0x00000000);
Marek Vasut432d7672018-12-12 18:06:39 +01001332 }
1333
Marek Vasutb9e78d42019-07-14 09:22:57 +02001334 mmio_write_32(DBSC_DBPDRGA0, 0x00000001);
1335 mmio_write_32(DBSC_DBPDRGD0, 0x00012001);
1336 mmio_write_32(DBSC_DBPDRGA0, 0x00000006);
1337 while ((BIT(0) & mmio_read_32(DBSC_DBPDRGD0)) == 0);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001338
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001339if (pdqsr_ctl == 1) {
Marek Vasutb9e78d42019-07-14 09:22:57 +02001340 mmio_write_32(DBSC_DBPDRGA0, 0x000000A0);
1341 mmio_write_32(DBSC_DBPDRGD0, 0x7C000285);
1342 mmio_write_32(DBSC_DBPDRGA0, 0x000000C0);
1343 mmio_write_32(DBSC_DBPDRGD0, 0x7C000285);
1344 mmio_write_32(DBSC_DBPDRGA0, 0x000000E0);
1345 mmio_write_32(DBSC_DBPDRGD0, 0x7C000285);
1346 mmio_write_32(DBSC_DBPDRGA0, 0x00000100);
1347 mmio_write_32(DBSC_DBPDRGD0, 0x7C000285);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001348}
1349
Marek Vasut432d7672018-12-12 18:06:39 +01001350 /* PDR always off */ /* rev.0.10 */
1351 if (pdr_ctl == 1) {
Marek Vasutb9e78d42019-07-14 09:22:57 +02001352 mmio_write_32(DBSC_DBPDRGA0, 0x000000A3);
1353 mmio_write_32(DBSC_DBPDRGD0, 0x00000008);
1354 mmio_write_32(DBSC_DBPDRGA0, 0x000000C3);
1355 mmio_write_32(DBSC_DBPDRGD0, 0x00000008);
1356 mmio_write_32(DBSC_DBPDRGA0, 0x000000E3);
1357 mmio_write_32(DBSC_DBPDRGD0, 0x00000008);
1358 mmio_write_32(DBSC_DBPDRGA0, 0x00000103);
1359 mmio_write_32(DBSC_DBPDRGD0, 0x00000008);
Marek Vasut432d7672018-12-12 18:06:39 +01001360 }
1361
Marek Vasutb9e78d42019-07-14 09:22:57 +02001362 mmio_write_32(DBSC_DBPDRGA0, 0x00000001);
1363 mmio_write_32(DBSC_DBPDRGD0, 0x00014001);
1364 mmio_write_32(DBSC_DBPDRGA0, 0x00000006);
1365 while ((BIT(0) & mmio_read_32(DBSC_DBPDRGD0)) == 0);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001366
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001367if (pdqsr_ctl == 1) {
Marek Vasutb9e78d42019-07-14 09:22:57 +02001368 mmio_write_32(DBSC_DBPDRGA0, 0x000000A0);
1369 mmio_write_32(DBSC_DBPDRGD0, 0x7C0002C5);
1370 mmio_write_32(DBSC_DBPDRGA0, 0x000000C0);
1371 mmio_write_32(DBSC_DBPDRGD0, 0x7C0002C5);
1372 mmio_write_32(DBSC_DBPDRGA0, 0x000000E0);
1373 mmio_write_32(DBSC_DBPDRGD0, 0x7C0002C5);
1374 mmio_write_32(DBSC_DBPDRGA0, 0x00000100);
1375 mmio_write_32(DBSC_DBPDRGD0, 0x7C0002C5);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001376}
1377
Marek Vasut432d7672018-12-12 18:06:39 +01001378 /* PDR dynamic */ /* rev.0.10 */
1379 if (pdr_ctl == 1) {
Marek Vasutb9e78d42019-07-14 09:22:57 +02001380 mmio_write_32(DBSC_DBPDRGA0, 0x000000A3);
1381 mmio_write_32(DBSC_DBPDRGD0, 0x00000000);
1382 mmio_write_32(DBSC_DBPDRGA0, 0x000000C3);
1383 mmio_write_32(DBSC_DBPDRGD0, 0x00000000);
1384 mmio_write_32(DBSC_DBPDRGA0, 0x000000E3);
1385 mmio_write_32(DBSC_DBPDRGD0, 0x00000000);
1386 mmio_write_32(DBSC_DBPDRGA0, 0x00000103);
1387 mmio_write_32(DBSC_DBPDRGD0, 0x00000000);
Marek Vasut432d7672018-12-12 18:06:39 +01001388 }
1389
Marek Vasutb9e78d42019-07-14 09:22:57 +02001390 mmio_write_32(DBSC_DBPDRGA0, 0x00000001);
1391 mmio_write_32(DBSC_DBPDRGD0, 0x00018001);
1392 mmio_write_32(DBSC_DBPDRGA0, 0x00000006);
1393 while ((BIT(0) & mmio_read_32(DBSC_DBPDRGD0)) == 0);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001394
Marek Vasutb9e78d42019-07-14 09:22:57 +02001395 mmio_write_32(DBSC_DBPDRGA0, 0x000000A0);
1396 mmio_write_32(DBSC_DBPDRGD0, 0x7C000285);
1397 mmio_write_32(DBSC_DBPDRGA0, 0x000000C0);
1398 mmio_write_32(DBSC_DBPDRGD0, 0x7C000285);
1399 mmio_write_32(DBSC_DBPDRGA0, 0x000000E0);
1400 mmio_write_32(DBSC_DBPDRGD0, 0x7C000285);
1401 mmio_write_32(DBSC_DBPDRGA0, 0x00000100);
1402 mmio_write_32(DBSC_DBPDRGD0, 0x7C000285);
1403 mmio_write_32(DBSC_DBPDRGA0, 0x0000002C);
1404 mmio_write_32(DBSC_DBPDRGD0, 0x81003087);
1405 mmio_write_32(DBSC_DBPDRGA0, 0x00000001);
1406 mmio_write_32(DBSC_DBPDRGD0, 0x00010401);
1407 mmio_write_32(DBSC_DBPDRGA0, 0x00000006);
1408 while ((BIT(0) & mmio_read_32(DBSC_DBPDRGD0)) == 0);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001409
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001410 for (i = 0; i < 4; i++) {
Marek Vasutb9e78d42019-07-14 09:22:57 +02001411 mmio_write_32(DBSC_DBPDRGA0, 0x000000B1 + i * 0x20);
1412 RegVal_R5 = ((mmio_read_32(DBSC_DBPDRGD0) & 0x0000FF00) >> 0x8);
1413 mmio_write_32(DBSC_DBPDRGA0, 0x000000B4 + i * 0x20);
1414 RegVal_R6 = (mmio_read_32(DBSC_DBPDRGD0) & 0x000000FF);
1415 mmio_write_32(DBSC_DBPDRGA0, 0x000000B3 + i * 0x20);
1416 RegVal_R7 = (mmio_read_32(DBSC_DBPDRGD0) & 0x00000007);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001417 RegVal_R12 = (RegVal_R5 >> 0x2);
1418
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001419 if (RegVal_R12 < RegVal_R6) {
Marek Vasutb9e78d42019-07-14 09:22:57 +02001420 mmio_write_32(DBSC_DBPDRGA0, 0x000000B2 + i * 0x20);
1421 RegVal_R2 = (mmio_read_32(DBSC_DBPDRGD0) & 0xFFFFFFF8);
1422 mmio_write_32(DBSC_DBPDRGA0, 0x000000B2 + i * 0x20);
1423 mmio_write_32(DBSC_DBPDRGD0, RegVal_R2 | ((RegVal_R7 + 0x1) & 0x00000007));
1424 mmio_write_32(DBSC_DBPDRGA0, 0x000000B0 + i * 0x20);
1425 RegVal_R2 = (mmio_read_32(DBSC_DBPDRGD0) & 0xFFFFFF00);
1426 mmio_write_32(DBSC_DBPDRGA0, 0x000000B0 + i * 0x20);
1427 mmio_write_32(DBSC_DBPDRGD0, RegVal_R2 | ((RegVal_R6 - (RegVal_R12)) & 0x000000FF));
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001428 } else {
Marek Vasutb9e78d42019-07-14 09:22:57 +02001429 mmio_write_32(DBSC_DBPDRGA0, 0x000000B2 + i * 0x20);
1430 RegVal_R2 = (mmio_read_32(DBSC_DBPDRGD0) & 0xFFFFFFF8);
1431 mmio_write_32(DBSC_DBPDRGA0, 0x000000B2 + i * 0x20);
1432 mmio_write_32(DBSC_DBPDRGD0, RegVal_R2 | (RegVal_R7 & 0x00000007));
1433 mmio_write_32(DBSC_DBPDRGA0, 0x000000B0 + i * 0x20);
1434 RegVal_R2 = (mmio_read_32(DBSC_DBPDRGD0) & 0xFFFFFF00);
1435 mmio_write_32(DBSC_DBPDRGA0, 0x000000B0 + i * 0x20);
1436 mmio_write_32(DBSC_DBPDRGD0, RegVal_R2 | ((RegVal_R6 + (RegVal_R5) + ((RegVal_R5) >> 1) + (RegVal_R12)) & 0x000000FF));
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001437 } /* RegVal_R12 < RegVal_R6 */
1438 } /* for i */
1439
1440/* rev.0.08 */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001441 if (pdqsr_ctl == 1){} else {
Marek Vasutb9e78d42019-07-14 09:22:57 +02001442 mmio_write_32(DBSC_DBPDRGA0, 0x000000A0);
1443 mmio_write_32(DBSC_DBPDRGD0, 0x7C0002C5);
1444 mmio_write_32(DBSC_DBPDRGA0, 0x000000C0);
1445 mmio_write_32(DBSC_DBPDRGD0, 0x7C0002C5);
1446 mmio_write_32(DBSC_DBPDRGA0, 0x000000E0);
1447 mmio_write_32(DBSC_DBPDRGD0, 0x7C0002C5);
1448 mmio_write_32(DBSC_DBPDRGA0, 0x00000100);
1449 mmio_write_32(DBSC_DBPDRGD0, 0x7C0002C5);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001450 }
1451
Marek Vasut432d7672018-12-12 18:06:39 +01001452 /* PDR always off */ /* rev.0.10 */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001453 if (pdr_ctl == 1) {
Marek Vasutb9e78d42019-07-14 09:22:57 +02001454 mmio_write_32(DBSC_DBPDRGA0, 0x000000A3);
1455 mmio_write_32(DBSC_DBPDRGD0, 0x00000008);
1456 mmio_write_32(DBSC_DBPDRGA0, 0x000000C3);
1457 mmio_write_32(DBSC_DBPDRGD0, 0x00000008);
1458 mmio_write_32(DBSC_DBPDRGA0, 0x000000E3);
1459 mmio_write_32(DBSC_DBPDRGD0, 0x00000008);
1460 mmio_write_32(DBSC_DBPDRGA0, 0x00000103);
1461 mmio_write_32(DBSC_DBPDRGD0, 0x00000008);
Marek Vasut432d7672018-12-12 18:06:39 +01001462 }
1463
Marek Vasutb9e78d42019-07-14 09:22:57 +02001464 mmio_write_32(DBSC_DBPDRGA0, 0x00000001);
1465 mmio_write_32(DBSC_DBPDRGD0, 0x00015001);
1466 mmio_write_32(DBSC_DBPDRGA0, 0x00000006);
1467 while ((BIT(0) & mmio_read_32(DBSC_DBPDRGD0)) == 0);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001468
1469/* rev.0.08 */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001470 if (lcdl_ctl == 1) {
1471 for (i = 0; i < 4; i++) {
Marek Vasutb9e78d42019-07-14 09:22:57 +02001472 mmio_write_32(DBSC_DBPDRGA0, 0x000000B0 + i * 0x20);
1473 dqsgd_0c = (mmio_read_32(DBSC_DBPDRGD0) & 0x000000FF);
1474 mmio_write_32(DBSC_DBPDRGA0, 0x000000B1 + i * 0x20);
1475 bdlcount_0c = ((mmio_read_32(DBSC_DBPDRGD0) & 0x0000FF00) >> 8);
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001476 bdlcount_0c_div2 = (bdlcount_0c >> 1);
1477 bdlcount_0c_div4 = (bdlcount_0c >> 2);
1478 bdlcount_0c_div8 = (bdlcount_0c >> 3);
1479 bdlcount_0c_div16 = (bdlcount_0c >> 4);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001480
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001481 if (ddr_md == 0) { /* 1584Mbps */
1482 lcdl_judge1 = bdlcount_0c_div2 + bdlcount_0c_div4 + bdlcount_0c_div8;
1483 lcdl_judge2 = bdlcount_0c + bdlcount_0c_div4 + bdlcount_0c_div16;
1484 } else { /* 1856Mbps */
1485 lcdl_judge1 = bdlcount_0c_div2 + bdlcount_0c_div4;
1486 lcdl_judge2 = bdlcount_0c + bdlcount_0c_div4;
1487 } /* ddr_md */
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001488
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001489 if (dqsgd_0c > lcdl_judge1) {
1490 if (dqsgd_0c <= lcdl_judge2) {
Marek Vasutb9e78d42019-07-14 09:22:57 +02001491 mmio_write_32(DBSC_DBPDRGA0, 0x000000B0 + i * 0x20);
1492 RegVal = (mmio_read_32(DBSC_DBPDRGD0) & 0xFFFFFF00);
1493 mmio_write_32(DBSC_DBPDRGD0, ((dqsgd_0c - bdlcount_0c_div8) | RegVal));
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001494 } else {
Marek Vasutb9e78d42019-07-14 09:22:57 +02001495 mmio_write_32(DBSC_DBPDRGA0, 0x000000B0 + i * 0x20);
1496 RegVal = (mmio_read_32(DBSC_DBPDRGD0) & 0xFFFFFF00);
1497 mmio_write_32(DBSC_DBPDRGD0, RegVal);
1498 mmio_write_32(DBSC_DBPDRGA0, 0x000000B2 + i * 0x20);
1499 gatesl_0c = (mmio_read_32(DBSC_DBPDRGD0) & 0x00000007);
1500 mmio_write_32(DBSC_DBPDRGA0, 0x000000B2 + i * 0x20);
1501 RegVal = (mmio_read_32(DBSC_DBPDRGD0) & 0xFFFFFFF8);
1502 mmio_write_32(DBSC_DBPDRGD0, (RegVal | (gatesl_0c + 1)));
1503 mmio_write_32(DBSC_DBPDRGA0, 0x000000AF + i * 0x20);
1504 RegVal = (mmio_read_32(DBSC_DBPDRGD0));
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001505 rdqsd_0c = (RegVal & 0x0000FF00) >> 8;
1506 rdqsnd_0c = (RegVal & 0x00FF0000) >> 16;
Marek Vasutb9e78d42019-07-14 09:22:57 +02001507 mmio_write_32(DBSC_DBPDRGA0, 0x000000AF + i * 0x20);
1508 mmio_write_32(DBSC_DBPDRGD0, ((RegVal & 0xFF0000FF) | ((rdqsd_0c + bdlcount_0c_div4) << 8) | ((rdqsnd_0c + bdlcount_0c_div4) << 16)));
1509 mmio_write_32(DBSC_DBPDRGA0, 0x000000AA + i * 0x20);
1510 RegVal = (mmio_read_32(DBSC_DBPDRGD0));
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001511 rbd_0c[0] = (RegVal) &0x0000001f;
1512 rbd_0c[1] = (RegVal >> 8) & 0x0000001f;
1513 rbd_0c[2] = (RegVal >> 16) & 0x0000001f;
1514 rbd_0c[3] = (RegVal >> 24) & 0x0000001f;
Marek Vasutb9e78d42019-07-14 09:22:57 +02001515 mmio_write_32(DBSC_DBPDRGA0, 0x000000AA + i * 0x20);
1516 RegVal = (mmio_read_32(DBSC_DBPDRGD0) & 0xE0E0E0E0);
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001517 for (j = 0; j < 4; j++) {
1518 rbd_0c[j] = (rbd_0c[j] + bdlcount_0c_div4);
1519 if (rbd_0c[j] > 0x1F) rbd_0c[j] = 0x1F;
1520 RegVal = RegVal | (rbd_0c[j] << 8 * j);
1521 }
Marek Vasutb9e78d42019-07-14 09:22:57 +02001522 mmio_write_32(DBSC_DBPDRGD0, RegVal);
1523 mmio_write_32(DBSC_DBPDRGA0, 0x000000AB + i * 0x20);
1524 RegVal = (mmio_read_32(DBSC_DBPDRGD0));
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001525 rbd_0c[0] = (RegVal) &0x0000001f;
1526 rbd_0c[1] = (RegVal >> 8) & 0x0000001f;
1527 rbd_0c[2] = (RegVal >> 16) & 0x0000001f;
1528 rbd_0c[3] = (RegVal >> 24) & 0x0000001f;
Marek Vasutb9e78d42019-07-14 09:22:57 +02001529 mmio_write_32(DBSC_DBPDRGA0, 0x000000AB + i * 0x20);
1530 RegVal = (mmio_read_32(DBSC_DBPDRGD0) & 0xE0E0E0E0);
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001531 for (j = 0; j < 4; j++) {
1532 rbd_0c[j] = (rbd_0c[j] + bdlcount_0c_div4);
1533 if (rbd_0c[j] > 0x1F) rbd_0c[j] = 0x1F;
1534 RegVal = RegVal | (rbd_0c[j] << 8 * j);
1535 }
Marek Vasutb9e78d42019-07-14 09:22:57 +02001536 mmio_write_32(DBSC_DBPDRGD0, RegVal);
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001537 }
1538 }
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001539 }
Marek Vasutb9e78d42019-07-14 09:22:57 +02001540 mmio_write_32(DBSC_DBPDRGA0, 0x00000002);
1541 mmio_write_32(DBSC_DBPDRGD0, 0x07D81E37);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001542 }
1543
1544
Marek Vasutb9e78d42019-07-14 09:22:57 +02001545 mmio_write_32(DBSC_DBPDRGA0, 0x00000003);
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001546 if (byp_ctl == 1) {
Marek Vasutb9e78d42019-07-14 09:22:57 +02001547 mmio_write_32(DBSC_DBPDRGD0, 0x0380C720);
Marek Vasut432d7672018-12-12 18:06:39 +01001548 } else {
Marek Vasutb9e78d42019-07-14 09:22:57 +02001549 mmio_write_32(DBSC_DBPDRGD0, 0x0380C700);
Marek Vasut432d7672018-12-12 18:06:39 +01001550 }
Marek Vasutb9e78d42019-07-14 09:22:57 +02001551 mmio_write_32(DBSC_DBPDRGA0, 0x00000007);
1552 while ((BIT(30) & mmio_read_32(DBSC_DBPDRGD0)) != 0);
1553 mmio_write_32(DBSC_DBPDRGA0, 0x00000021);
1554 mmio_write_32(DBSC_DBPDRGD0, 0x0024643E);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001555
1556 /****************************************************************************
1557 * recovery_Step3(DBSC Setting 2)
1558 ***************************************************************************/
Marek Vasutb9e78d42019-07-14 09:22:57 +02001559 mmio_write_32(DBSC_DBDFICUPDCNF, 0x40100001);
1560 mmio_write_32(DBSC_DBACEN, 0x00000001);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001561
1562/* rev.0.08 */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001563 if (pdqsr_ctl == 1) {
Marek Vasutb9e78d42019-07-14 09:22:57 +02001564 mmio_write_32(0xE67F0018, 0x00000001);
1565 RegVal = mmio_read_32(0x40000000);
1566 mmio_write_32(DBSC_DBPDRGA0, 0x00000000);
1567 mmio_write_32(DBSC_DBPDRGD0, RegVal);
1568 mmio_write_32(DBSC_DBPDRGA0, 0x000000A0);
1569 mmio_write_32(DBSC_DBPDRGD0, 0x7C0002C5);
1570 mmio_write_32(DBSC_DBPDRGA0, 0x000000C0);
1571 mmio_write_32(DBSC_DBPDRGD0, 0x7C0002C5);
1572 mmio_write_32(DBSC_DBPDRGA0, 0x000000E0);
1573 mmio_write_32(DBSC_DBPDRGD0, 0x7C0002C5);
1574 mmio_write_32(DBSC_DBPDRGA0, 0x00000100);
1575 mmio_write_32(DBSC_DBPDRGD0, 0x7C0002C5);
Marek Vasut432d7672018-12-12 18:06:39 +01001576 }
1577
1578 /* PDR dynamic */ /* rev.0.10 */
1579 if (pdr_ctl == 1) {
Marek Vasutb9e78d42019-07-14 09:22:57 +02001580 mmio_write_32(DBSC_DBPDRGA0, 0x000000A3);
1581 mmio_write_32(DBSC_DBPDRGD0, 0x00000000);
1582 mmio_write_32(DBSC_DBPDRGA0, 0x000000C3);
1583 mmio_write_32(DBSC_DBPDRGD0, 0x00000000);
1584 mmio_write_32(DBSC_DBPDRGA0, 0x000000E3);
1585 mmio_write_32(DBSC_DBPDRGD0, 0x00000000);
1586 mmio_write_32(DBSC_DBPDRGA0, 0x00000103);
1587 mmio_write_32(DBSC_DBPDRGD0, 0x00000000);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001588 }
1589
Marek Vasutb9e78d42019-07-14 09:22:57 +02001590 mmio_write_32(DBSC_DBPDLK0, 0x00000000);
1591 mmio_write_32(DBSC_DBSYSCNT0, 0x00000000);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001592
1593#ifdef ddr_qos_init_setting /* only for non qos_init */
Marek Vasutb9e78d42019-07-14 09:22:57 +02001594 mmio_write_32(DBSC_DBSYSCNT0, 0x00001234);
1595 mmio_write_32(DBSC_DBCAM0CNF1, 0x00043218);
1596 mmio_write_32(DBSC_DBCAM0CNF2, 0x000000F4);
1597 mmio_write_32(DBSC_DBSCHCNT0, 0x000f0037);
1598 mmio_write_32(DBSC_DBSCHSZ0, 0x00000001);
1599 mmio_write_32(DBSC_DBSCHRW0, 0x22421111);
1600 mmio_write_32(DBSC_SCFCTST2, 0x012F1123);
1601 mmio_write_32(DBSC_DBSCHQOS00, 0x00000F00);
1602 mmio_write_32(DBSC_DBSCHQOS01, 0x00000B00);
1603 mmio_write_32(DBSC_DBSCHQOS02, 0x00000000);
1604 mmio_write_32(DBSC_DBSCHQOS03, 0x00000000);
1605 mmio_write_32(DBSC_DBSCHQOS40, 0x00000300);
1606 mmio_write_32(DBSC_DBSCHQOS41, 0x000002F0);
1607 mmio_write_32(DBSC_DBSCHQOS42, 0x00000200);
1608 mmio_write_32(DBSC_DBSCHQOS43, 0x00000100);
1609 mmio_write_32(DBSC_DBSCHQOS90, 0x00000100);
1610 mmio_write_32(DBSC_DBSCHQOS91, 0x000000F0);
1611 mmio_write_32(DBSC_DBSCHQOS92, 0x000000A0);
1612 mmio_write_32(DBSC_DBSCHQOS93, 0x00000040);
1613 mmio_write_32(DBSC_DBSCHQOS130, 0x00000100);
1614 mmio_write_32(DBSC_DBSCHQOS131, 0x000000F0);
1615 mmio_write_32(DBSC_DBSCHQOS132, 0x000000A0);
1616 mmio_write_32(DBSC_DBSCHQOS133, 0x00000040);
1617 mmio_write_32(DBSC_DBSCHQOS140, 0x000000C0);
1618 mmio_write_32(DBSC_DBSCHQOS141, 0x000000B0);
1619 mmio_write_32(DBSC_DBSCHQOS142, 0x00000080);
1620 mmio_write_32(DBSC_DBSCHQOS143, 0x00000040);
1621 mmio_write_32(DBSC_DBSCHQOS150, 0x00000040);
1622 mmio_write_32(DBSC_DBSCHQOS151, 0x00000030);
1623 mmio_write_32(DBSC_DBSCHQOS152, 0x00000020);
1624 mmio_write_32(DBSC_DBSCHQOS153, 0x00000010);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001625
1626/* rev.0.08 */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001627 if (pdqsr_ctl == 1){} else {
Marek Vasutb9e78d42019-07-14 09:22:57 +02001628 mmio_write_32(0xE67F0018, 0x00000001);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001629 }
1630
Marek Vasutb9e78d42019-07-14 09:22:57 +02001631 mmio_write_32(DBSC_DBSYSCNT0, 0x00000000);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001632#endif
1633
1634 return 1;
1635
1636} /* recovery_from_backup_mode */
1637
1638/*******************************************************************************
1639 * init_ddr : MD19=0,DDR3L,1584Mbps / MD19=1,DDR3L,1856Mbps
1640 ******************************************************************************/
1641
1642/*******************************************************************************
1643 * DDR Initialize entry for IPL
1644 ******************************************************************************/
ldts0a596b42018-11-06 10:17:12 +01001645int32_t rcar_dram_init(void)
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001646{
1647 uint32_t dataL;
1648 uint32_t failcount;
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001649 uint32_t md = 0;
1650 uint32_t ddr = 0;
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001651
1652 md = *((volatile uint32_t*)RST_MODEMR);
1653 ddr = (md & 0x00080000) >> 19;
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001654 if (ddr == 0x0) {
Marek Vasut56519892019-01-21 23:11:33 +01001655 NOTICE("BL2: DDR1584(%s)\n", RCAR_E3_DDR_VERSION);
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001656 } else if(ddr == 0x1){
Marek Vasut56519892019-01-21 23:11:33 +01001657 NOTICE("BL2: DDR1856(%s)\n", RCAR_E3_DDR_VERSION);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001658 } /* ddr */
1659
ldts0a596b42018-11-06 10:17:12 +01001660 rcar_dram_get_boot_status(&ddrBackup);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001661
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001662 if (ddrBackup == DRAM_BOOT_STATUS_WARM) {
1663 dataL = recovery_from_backup_mode(); /* WARM boot */
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001664 } else {
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001665 dataL = init_ddr(); /* COLD boot */
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001666 } /* ddrBackup */
1667
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001668 if (dataL == 1) {
1669 failcount = 0;
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001670 } else {
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001671 failcount = 1;
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001672 } /* dataL */
1673
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001674 if (failcount == 0) {
1675 return INITDRAM_OK;
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001676 } else {
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001677 return INITDRAM_NG;
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001678 } /* failcount */
1679} /* InitDram */
1680
1681/*******************************************************************************
1682 * END
1683 ******************************************************************************/