1 /* 2 * Copyright (c) 2015-2021, Renesas Electronics Corporation. 3 * All rights reserved. 4 * 5 * SPDX-License-Identifier: BSD-3-Clause 6 */ 7 8 #include <stdint.h> 9 #include <lib/mmio.h> 10 #include <common/debug.h> 11 #include "rcar_def.h" 12 #include "../ddr_regs.h" 13 14 #define RCAR_DDR_VERSION "rev.0.02" 15 16 /* Average periodic refresh interval[ns]. Support 3900,7800 */ 17 #define REFRESH_RATE 3900 18 19 20 #if RCAR_LSI != RCAR_D3 21 #error "Don't have DDR initialize routine." 22 #endif 23 24 static void init_ddr_d3_1866(void) 25 { 26 uint32_t i, r2, r3, r5, r6, r7, r12; 27 28 mmio_write_32(DBSC_DBSYSCNT0, 0x00001234); 29 mmio_write_32(DBSC_DBKIND, 0x00000007); 30 mmio_write_32(DBSC_DBMEMCONF_0_0, 0x0f030a01); 31 mmio_write_32(DBSC_DBPHYCONF0, 0x00000001); 32 mmio_write_32(DBSC_DBTR0, 0x0000000D); 33 mmio_write_32(DBSC_DBTR1, 0x00000009); 34 mmio_write_32(DBSC_DBTR2, 0x00000000); 35 mmio_write_32(DBSC_DBTR3, 0x0000000D); 36 mmio_write_32(DBSC_DBTR4, 0x000D000D); 37 mmio_write_32(DBSC_DBTR5, 0x0000002D); 38 mmio_write_32(DBSC_DBTR6, 0x00000020); 39 mmio_write_32(DBSC_DBTR7, 0x00060006); 40 mmio_write_32(DBSC_DBTR8, 0x00000021); 41 mmio_write_32(DBSC_DBTR9, 0x00000007); 42 mmio_write_32(DBSC_DBTR10, 0x0000000E); 43 mmio_write_32(DBSC_DBTR11, 0x0000000C); 44 mmio_write_32(DBSC_DBTR12, 0x00140014); 45 mmio_write_32(DBSC_DBTR13, 0x000000F2); 46 mmio_write_32(DBSC_DBTR14, 0x00170006); 47 mmio_write_32(DBSC_DBTR15, 0x00060005); 48 mmio_write_32(DBSC_DBTR16, 0x09210507); 49 mmio_write_32(DBSC_DBTR17, 0x040E0000); 50 mmio_write_32(DBSC_DBTR18, 0x00000200); 51 mmio_write_32(DBSC_DBTR19, 0x0129004B); 52 mmio_write_32(DBSC_DBTR20, 0x020000FB); 53 mmio_write_32(DBSC_DBTR21, 0x00040004); 54 mmio_write_32(DBSC_DBBL, 0x00000000); 55 mmio_write_32(DBSC_DBODT0, 0x00000001); 56 mmio_write_32(DBSC_DBADJ0, 0x00000001); 57 mmio_write_32(DBSC_DBSYSCONF1, 0x00000002); 58 mmio_write_32(DBSC_DBDFICNT_0, 0x00000010); 59 mmio_write_32(DBSC_DBBCAMDIS, 0x00000001); 60 mmio_write_32(DBSC_DBSCHRW1, 0x00000046); 61 mmio_write_32(DBSC_SCFCTST0, 0x0C050B03); 62 mmio_write_32(DBSC_SCFCTST1, 0x0305030C); 63 64 mmio_write_32(DBSC_DBPDLK_0, 0x0000A55A); 65 mmio_write_32(DBSC_DBCMD, 0x01000001); 66 mmio_write_32(DBSC_DBCMD, 0x08000000); 67 mmio_write_32(DBSC_DBPDRGA_0, 0x00000001); 68 mmio_write_32(DBSC_DBPDRGD_0, 0x80010000); 69 mmio_write_32(DBSC_DBPDRGA_0, 0x00000006); 70 while (!(mmio_read_32(DBSC_DBPDRGD_0) & BIT(0))) 71 ; 72 73 mmio_write_32(DBSC_DBPDRGA_0, 0x00000008); 74 mmio_write_32(DBSC_DBPDRGD_0, 0x000B8000); 75 mmio_write_32(DBSC_DBPDRGA_0, 0x00000090); 76 mmio_write_32(DBSC_DBPDRGD_0, 0x04058A04); 77 mmio_write_32(DBSC_DBPDRGA_0, 0x00000091); 78 mmio_write_32(DBSC_DBPDRGD_0, 0x0007BB6B); 79 mmio_write_32(DBSC_DBPDRGA_0, 0x00000095); 80 mmio_write_32(DBSC_DBPDRGD_0, 0x0007BBAD); 81 mmio_write_32(DBSC_DBPDRGA_0, 0x00000099); 82 mmio_write_32(DBSC_DBPDRGD_0, 0x0007BB6B); 83 mmio_write_32(DBSC_DBPDRGA_0, 0x00000090); 84 mmio_write_32(DBSC_DBPDRGD_0, 0x04058A00); 85 mmio_write_32(DBSC_DBPDRGA_0, 0x00000021); 86 mmio_write_32(DBSC_DBPDRGD_0, 0x0024641E); 87 mmio_write_32(DBSC_DBPDRGA_0, 0x00000001); 88 mmio_write_32(DBSC_DBPDRGD_0, 0x00010073); 89 mmio_write_32(DBSC_DBPDRGA_0, 0x00000006); 90 while (!(mmio_read_32(DBSC_DBPDRGD_0) & BIT(0))) 91 ; 92 93 mmio_write_32(DBSC_DBPDRGA_0, 0x00000090); 94 mmio_write_32(DBSC_DBPDRGD_0, 0x0C058A00); 95 mmio_write_32(DBSC_DBPDRGA_0, 0x00000090); 96 mmio_write_32(DBSC_DBPDRGD_0, 0x04058A00); 97 mmio_write_32(DBSC_DBPDRGA_0, 0x00000006); 98 while (!(mmio_read_32(DBSC_DBPDRGD_0) & BIT(0))) 99 ; 100 101 mmio_write_32(DBSC_DBPDRGA_0, 0x00000003); 102 mmio_write_32(DBSC_DBPDRGD_0, 0x0780C700); 103 mmio_write_32(DBSC_DBPDRGA_0, 0x00000007); 104 while (!(mmio_read_32(DBSC_DBPDRGD_0) & BIT(30))) 105 ; 106 107 mmio_write_32(DBSC_DBPDRGA_0, 0x00000004); 108 mmio_write_32(DBSC_DBPDRGD_0, 109 (uint32_t) (REFRESH_RATE * 928 / 125) - 400 110 + 0x0A300000); 111 mmio_write_32(DBSC_DBPDRGA_0, 0x00000022); 112 mmio_write_32(DBSC_DBPDRGD_0, 0x1000040B); 113 mmio_write_32(DBSC_DBPDRGA_0, 0x00000023); 114 mmio_write_32(DBSC_DBPDRGD_0, 0x35A00D77); 115 mmio_write_32(DBSC_DBPDRGA_0, 0x00000024); 116 mmio_write_32(DBSC_DBPDRGD_0, 0x2A8A2C28); 117 mmio_write_32(DBSC_DBPDRGA_0, 0x00000025); 118 mmio_write_32(DBSC_DBPDRGD_0, 0x30005E00); 119 mmio_write_32(DBSC_DBPDRGA_0, 0x00000026); 120 mmio_write_32(DBSC_DBPDRGD_0, 0x0014CB49); 121 mmio_write_32(DBSC_DBPDRGA_0, 0x00000027); 122 mmio_write_32(DBSC_DBPDRGD_0, 0x00000F14); 123 mmio_write_32(DBSC_DBPDRGA_0, 0x00000028); 124 mmio_write_32(DBSC_DBPDRGD_0, 0x00000046); 125 mmio_write_32(DBSC_DBPDRGA_0, 0x00000029); 126 if (REFRESH_RATE > 3900) { 127 mmio_write_32(DBSC_DBPDRGD_0, 0x00000020); 128 } else { 129 mmio_write_32(DBSC_DBPDRGD_0, 0x000000A0); 130 } 131 mmio_write_32(DBSC_DBPDRGA_0, 0x0000002C); 132 mmio_write_32(DBSC_DBPDRGD_0, 0x81003047); 133 mmio_write_32(DBSC_DBPDRGA_0, 0x00000020); 134 mmio_write_32(DBSC_DBPDRGD_0, 0x00181884); 135 mmio_write_32(DBSC_DBPDRGA_0, 0x0000001A); 136 mmio_write_32(DBSC_DBPDRGD_0, 0x33C03C10); 137 mmio_write_32(DBSC_DBPDRGA_0, 0x00000006); 138 while (!(mmio_read_32(DBSC_DBPDRGD_0) & BIT(0))) 139 ; 140 141 mmio_write_32(DBSC_DBPDRGA_0, 0x000000A7); 142 mmio_write_32(DBSC_DBPDRGD_0, 0x0D0D0D0D); 143 mmio_write_32(DBSC_DBPDRGA_0, 0x000000A8); 144 mmio_write_32(DBSC_DBPDRGD_0, 0x0D0D0D0D); 145 mmio_write_32(DBSC_DBPDRGA_0, 0x000000A9); 146 mmio_write_32(DBSC_DBPDRGD_0, 0x000D0D0D); 147 mmio_write_32(DBSC_DBPDRGA_0, 0x000000C7); 148 mmio_write_32(DBSC_DBPDRGD_0, 0x0D0D0D0D); 149 mmio_write_32(DBSC_DBPDRGA_0, 0x000000C8); 150 mmio_write_32(DBSC_DBPDRGD_0, 0x0D0D0D0D); 151 mmio_write_32(DBSC_DBPDRGA_0, 0x000000C9); 152 mmio_write_32(DBSC_DBPDRGD_0, 0x000D0D0D); 153 154 mmio_write_32(DBSC_DBPDRGA_0, 0x0000000E); 155 r2 = (mmio_read_32(DBSC_DBPDRGD_0) & 0x0000FF00) >> 0x9; 156 r3 = (r2 << 16) + (r2 << 8) + r2; 157 r6 = (r2 << 24) + (r2 << 16) + (r2 << 8) + r2; 158 mmio_write_32(DBSC_DBPDRGA_0, 0x00000011); 159 mmio_write_32(DBSC_DBPDRGD_0, r3); 160 mmio_write_32(DBSC_DBPDRGA_0, 0x00000012); 161 mmio_write_32(DBSC_DBPDRGD_0, r3); 162 mmio_write_32(DBSC_DBPDRGA_0, 0x00000016); 163 mmio_write_32(DBSC_DBPDRGD_0, r6); 164 mmio_write_32(DBSC_DBPDRGA_0, 0x00000017); 165 mmio_write_32(DBSC_DBPDRGD_0, r6); 166 mmio_write_32(DBSC_DBPDRGA_0, 0x00000018); 167 mmio_write_32(DBSC_DBPDRGD_0, r6); 168 mmio_write_32(DBSC_DBPDRGA_0, 0x00000019); 169 mmio_write_32(DBSC_DBPDRGD_0, r6); 170 171 mmio_write_32(DBSC_DBPDRGA_0, 0x00000001); 172 mmio_write_32(DBSC_DBPDRGD_0, 0x00010181); 173 mmio_write_32(DBSC_DBCMD, 0x08000001); 174 mmio_write_32(DBSC_DBPDRGA_0, 0x00000006); 175 while (!(mmio_read_32(DBSC_DBPDRGD_0) & BIT(0))) 176 ; 177 178 mmio_write_32(DBSC_DBPDRGA_0, 0x00000001); 179 mmio_write_32(DBSC_DBPDRGD_0, 0x00010601); 180 mmio_write_32(DBSC_DBPDRGA_0, 0x00000006); 181 while (!(mmio_read_32(DBSC_DBPDRGD_0) & BIT(0))) 182 ; 183 184 for (i = 0; i < 2; i++) { 185 mmio_write_32(DBSC_DBPDRGA_0, 0xB1 + i * 0x20); 186 r5 = (mmio_read_32(DBSC_DBPDRGD_0) & 0xFF00) >> 0x8; 187 mmio_write_32(DBSC_DBPDRGA_0, 0xB4 + i * 0x20); 188 r6 = mmio_read_32(DBSC_DBPDRGD_0) & 0xFF; 189 mmio_write_32(DBSC_DBPDRGA_0, 0xB3 + i * 0x20); 190 r7 = mmio_read_32(DBSC_DBPDRGD_0) & 0x7; 191 192 if (r6 > 0) { 193 mmio_write_32(DBSC_DBPDRGA_0, 0xB2 + i * 0x20); 194 r2 = mmio_read_32(DBSC_DBPDRGD_0) & 0xFFFFFFF8; 195 196 mmio_write_32(DBSC_DBPDRGA_0, 0xB2 + i * 0x20); 197 mmio_write_32(DBSC_DBPDRGD_0, r2 | ((r7 + 0x1) & 0x7)); 198 mmio_write_32(DBSC_DBPDRGA_0, 0xB0 + i * 0x20); 199 r2 = mmio_read_32(DBSC_DBPDRGD_0) & 0xFFFFFF00; 200 mmio_write_32(DBSC_DBPDRGA_0, 0xB0 + i * 0x20); 201 mmio_write_32(DBSC_DBPDRGD_0, r2 | r6); 202 } else { 203 mmio_write_32(DBSC_DBPDRGA_0, 0xB2 + i * 0x20); 204 r2 = mmio_read_32(DBSC_DBPDRGD_0) & 0xFFFFFFF8; 205 mmio_write_32(DBSC_DBPDRGA_0, 0xB2 + i * 0x20); 206 mmio_write_32(DBSC_DBPDRGD_0, r2 | r7); 207 208 mmio_write_32(DBSC_DBPDRGA_0, 0xB0 + i * 0x20); 209 r2 = mmio_read_32(DBSC_DBPDRGD_0) & 0xFFFFFF00; 210 mmio_write_32(DBSC_DBPDRGA_0, 0xB0 + i * 0x20); 211 mmio_write_32(DBSC_DBPDRGD_0, r2 | 212 ((r6 + (r5 << 1)) & 0xFF)); 213 } 214 } 215 216 mmio_write_32(DBSC_DBPDRGA_0, 0x00000005); 217 mmio_write_32(DBSC_DBPDRGD_0, 0xC1AA00C0); 218 mmio_write_32(DBSC_DBPDRGA_0, 0x000000A0); 219 mmio_write_32(DBSC_DBPDRGD_0, 0x7C0002C5); 220 mmio_write_32(DBSC_DBPDRGA_0, 0x000000C0); 221 mmio_write_32(DBSC_DBPDRGD_0, 0x7C0002C5); 222 mmio_write_32(DBSC_DBPDRGA_0, 0x00000001); 223 mmio_write_32(DBSC_DBPDRGD_0, 0x00010801); 224 mmio_write_32(DBSC_DBPDRGA_0, 0x00000006); 225 while (!(mmio_read_32(DBSC_DBPDRGD_0) & BIT(0))) 226 ; 227 228 mmio_write_32(DBSC_DBPDRGA_0, 0x00000005); 229 mmio_write_32(DBSC_DBPDRGD_0, 0xC1AA00D8); 230 mmio_write_32(DBSC_DBPDRGA_0, 0x00000001); 231 mmio_write_32(DBSC_DBPDRGD_0, 0x0001F001); 232 mmio_write_32(DBSC_DBPDRGA_0, 0x00000006); 233 while (!(mmio_read_32(DBSC_DBPDRGD_0) & BIT(0))) 234 ; 235 236 mmio_write_32(DBSC_DBPDRGA_0, 0x000000AF); 237 r2 = mmio_read_32(DBSC_DBPDRGD_0); 238 mmio_write_32(DBSC_DBPDRGA_0, 0x000000AF); 239 mmio_write_32(DBSC_DBPDRGD_0, ((r2 + 0x1) & 0xFF) | (r2 & 0xFFFFFF00)); 240 mmio_write_32(DBSC_DBPDRGA_0, 0x000000CF); 241 mmio_write_32(DBSC_DBPDRGA_0, 0x000000CF); 242 r2 = mmio_read_32(DBSC_DBPDRGD_0); 243 mmio_write_32(DBSC_DBPDRGD_0, ((r2 + 0x1) & 0xFF) | (r2 & 0xFFFFFF00)); 244 245 mmio_write_32(DBSC_DBPDRGA_0, 0x000000A0); 246 mmio_write_32(DBSC_DBPDRGD_0, 0x7C000285); 247 mmio_write_32(DBSC_DBPDRGA_0, 0x000000C0); 248 mmio_write_32(DBSC_DBPDRGD_0, 0x7C000285); 249 mmio_write_32(DBSC_DBPDRGA_0, 0x0000002C); 250 mmio_write_32(DBSC_DBPDRGD_0, 0x81003087); 251 mmio_write_32(DBSC_DBPDRGA_0, 0x00000001); 252 mmio_write_32(DBSC_DBPDRGD_0, 0x00010401); 253 mmio_write_32(DBSC_DBPDRGA_0, 0x00000006); 254 while (!(mmio_read_32(DBSC_DBPDRGD_0) & BIT(0))) 255 ; 256 257 for (i = 0; i < 2; i++) { 258 mmio_write_32(DBSC_DBPDRGA_0, 0xB1 + i * 0x20); 259 r5 = ((mmio_read_32(DBSC_DBPDRGD_0) & 0xFF00) >> 0x8); 260 mmio_write_32(DBSC_DBPDRGA_0, 0xB4 + i * 0x20); 261 r6 = mmio_read_32(DBSC_DBPDRGD_0) & 0xFF; 262 263 mmio_write_32(DBSC_DBPDRGA_0, 0xB3 + i * 0x20); 264 r7 = mmio_read_32(DBSC_DBPDRGD_0) & 0x7; 265 r12 = (r5 >> 0x2); 266 267 if (r12 < r6) { 268 mmio_write_32(DBSC_DBPDRGA_0, 0xB2 + i * 0x20); 269 r2 = mmio_read_32(DBSC_DBPDRGD_0) & 0xFFFFFFF8; 270 271 mmio_write_32(DBSC_DBPDRGA_0, 0xB2 + i * 0x20); 272 mmio_write_32(DBSC_DBPDRGD_0, r2 | ((r7 + 0x1) & 0x7)); 273 mmio_write_32(DBSC_DBPDRGA_0, 0xB0 + i * 0x20); 274 r2 = mmio_read_32(DBSC_DBPDRGD_0) & 0xFFFFFF00; 275 276 mmio_write_32(DBSC_DBPDRGA_0, 0xB0 + i * 0x20); 277 mmio_write_32(DBSC_DBPDRGD_0, r2 | ((r6 - r12) & 0xFF)); 278 } else { 279 mmio_write_32(DBSC_DBPDRGA_0, 0xB2 + i * 0x20); 280 r2 = mmio_read_32(DBSC_DBPDRGD_0) & 0xFFFFFFF8; 281 mmio_write_32(DBSC_DBPDRGA_0, 0xB2 + i * 0x20); 282 mmio_write_32(DBSC_DBPDRGD_0, r2 | (r7 & 0x7)); 283 mmio_write_32(DBSC_DBPDRGA_0, 0xB0 + i * 0x20); 284 r2 = mmio_read_32(DBSC_DBPDRGD_0) & 0xFFFFFF00; 285 mmio_write_32(DBSC_DBPDRGA_0, 0xB0 + i * 0x20); 286 mmio_write_32(DBSC_DBPDRGD_0, r2 | 287 ((r6 + r5 + 288 (r5 >> 1) + r12) & 0xFF)); 289 } 290 } 291 292 mmio_write_32(DBSC_DBPDRGA_0, 0x000000A0); 293 mmio_write_32(DBSC_DBPDRGD_0, 0x7C0002C5); 294 mmio_write_32(DBSC_DBPDRGA_0, 0x000000C0); 295 mmio_write_32(DBSC_DBPDRGD_0, 0x7C0002C5); 296 mmio_write_32(DBSC_DBPDRGA_0, 0x00000001); 297 mmio_write_32(DBSC_DBPDRGD_0, 0x00015001); 298 mmio_write_32(DBSC_DBPDRGA_0, 0x00000006); 299 while (!(mmio_read_32(DBSC_DBPDRGD_0) & BIT(0))) 300 ; 301 302 mmio_write_32(DBSC_DBPDRGA_0, 0x00000003); 303 mmio_write_32(DBSC_DBPDRGD_0, 0x0380C700); 304 mmio_write_32(DBSC_DBPDRGA_0, 0x00000007); 305 while (mmio_read_32(DBSC_DBPDRGD_0) & BIT(30)) 306 ; 307 mmio_write_32(DBSC_DBPDRGA_0, 0x00000021); 308 mmio_write_32(DBSC_DBPDRGD_0, 0x0024643E); 309 310 mmio_write_32(DBSC_DBBUS0CNF1, 0x00000010); 311 mmio_write_32(DBSC_DBCALCNF, 312 (uint32_t) (64000000 / REFRESH_RATE) + 0x01000000); 313 mmio_write_32(DBSC_DBRFCNF1, 314 (uint32_t) (REFRESH_RATE * 116 / 125) + 0x00080000); 315 mmio_write_32(DBSC_DBRFCNF2, 0x00010000); 316 mmio_write_32(DBSC_DBDFICUPDCNF, 0x40100001); 317 mmio_write_32(DBSC_DBRFEN, 0x00000001); 318 mmio_write_32(DBSC_DBACEN, 0x00000001); 319 mmio_write_32(DBSC_DBPDLK_0, 0x00000000); 320 mmio_write_32(DBSC_DBSYSCNT0, 0x00000000); 321 322 #ifdef ddr_qos_init_setting // only for non qos_init 323 mmio_write_32(DBSC_DBSYSCNT0, 0x00001234); 324 mmio_write_32(DBSC_DBCAM0CNF1, 0x00043218); 325 mmio_write_32(DBSC_DBCAM0CNF2, 0x000000F4); 326 mmio_write_32(DBSC_DBSCHCNT0, 0x000f0037); 327 mmio_write_32(DBSC_DBSCHSZ0, 0x00000001); 328 mmio_write_32(DBSC_DBSCHRW0, 0x22421111); 329 mmio_write_32(DBSC_SCFCTST2, 0x012F1123); 330 mmio_write_32(DBSC_DBSCHQOS00, 0x00000F00); 331 mmio_write_32(DBSC_DBSCHQOS01, 0x00000B00); 332 mmio_write_32(DBSC_DBSCHQOS02, 0x00000000); 333 mmio_write_32(DBSC_DBSCHQOS03, 0x00000000); 334 mmio_write_32(DBSC_DBSCHQOS40, 0x00000300); 335 mmio_write_32(DBSC_DBSCHQOS41, 0x000002F0); 336 mmio_write_32(DBSC_DBSCHQOS42, 0x00000200); 337 mmio_write_32(DBSC_DBSCHQOS43, 0x00000100); 338 mmio_write_32(DBSC_DBSCHQOS90, 0x00000300); 339 mmio_write_32(DBSC_DBSCHQOS91, 0x000002F0); 340 mmio_write_32(DBSC_DBSCHQOS92, 0x00000200); 341 mmio_write_32(DBSC_DBSCHQOS93, 0x00000100); 342 mmio_write_32(DBSC_DBSCHQOS130, 0x00000100); 343 mmio_write_32(DBSC_DBSCHQOS131, 0x000000F0); 344 mmio_write_32(DBSC_DBSCHQOS132, 0x000000A0); 345 mmio_write_32(DBSC_DBSCHQOS133, 0x00000040); 346 mmio_write_32(DBSC_DBSCHQOS140, 0x000000C0); 347 mmio_write_32(DBSC_DBSCHQOS141, 0x000000B0); 348 mmio_write_32(DBSC_DBSCHQOS142, 0x00000080); 349 mmio_write_32(DBSC_DBSCHQOS143, 0x00000040); 350 mmio_write_32(DBSC_DBSCHQOS150, 0x00000040); 351 mmio_write_32(DBSC_DBSCHQOS151, 0x00000030); 352 mmio_write_32(DBSC_DBSCHQOS152, 0x00000020); 353 mmio_write_32(DBSC_DBSCHQOS153, 0x00000010); 354 mmio_write_32(0xE67F0018, 0x00000001); 355 mmio_write_32(DBSC_DBSYSCNT0, 0x00000000); 356 #endif 357 } 358 359 static void init_ddr_d3_1600(void) 360 { 361 uint32_t i, r2, r3, r5, r6, r7, r12; 362 363 mmio_write_32(CPG_CPGWPR, 0x5A5AFFFF); 364 mmio_write_32(CPG_CPGWPCR, 0xA5A50000); 365 366 mmio_write_32(CPG_SRCR4, 0x20000000); 367 368 mmio_write_32(0xE61500DC, 0xe2200000); 369 while (!(mmio_read_32(CPG_PLLECR) & BIT(11))) 370 ; 371 372 mmio_write_32(CPG_SRSTCLR4, 0x20000000); 373 374 mmio_write_32(CPG_CPGWPCR, 0xA5A50001); 375 376 mmio_write_32(DBSC_DBSYSCNT0, 0x00001234); 377 mmio_write_32(DBSC_DBKIND, 0x00000007); 378 mmio_write_32(DBSC_DBMEMCONF_0_0, 0x0f030a01); 379 mmio_write_32(DBSC_DBPHYCONF0, 0x00000001); 380 mmio_write_32(DBSC_DBTR0, 0x0000000B); 381 mmio_write_32(DBSC_DBTR1, 0x00000008); 382 mmio_write_32(DBSC_DBTR2, 0x00000000); 383 mmio_write_32(DBSC_DBTR3, 0x0000000B); 384 mmio_write_32(DBSC_DBTR4, 0x000B000B); 385 mmio_write_32(DBSC_DBTR5, 0x00000027); 386 mmio_write_32(DBSC_DBTR6, 0x0000001C); 387 mmio_write_32(DBSC_DBTR7, 0x00060006); 388 mmio_write_32(DBSC_DBTR8, 0x00000020); 389 mmio_write_32(DBSC_DBTR9, 0x00000006); 390 mmio_write_32(DBSC_DBTR10, 0x0000000C); 391 mmio_write_32(DBSC_DBTR11, 0x0000000A); 392 mmio_write_32(DBSC_DBTR12, 0x00120012); 393 mmio_write_32(DBSC_DBTR13, 0x000000CE); 394 mmio_write_32(DBSC_DBTR14, 0x00140005); 395 mmio_write_32(DBSC_DBTR15, 0x00050004); 396 mmio_write_32(DBSC_DBTR16, 0x071F0305); 397 mmio_write_32(DBSC_DBTR17, 0x040C0000); 398 mmio_write_32(DBSC_DBTR18, 0x00000200); 399 mmio_write_32(DBSC_DBTR19, 0x01000040); 400 mmio_write_32(DBSC_DBTR20, 0x020000D6); 401 mmio_write_32(DBSC_DBTR21, 0x00040004); 402 mmio_write_32(DBSC_DBBL, 0x00000000); 403 mmio_write_32(DBSC_DBODT0, 0x00000001); 404 mmio_write_32(DBSC_DBADJ0, 0x00000001); 405 mmio_write_32(DBSC_DBSYSCONF1, 0x00000002); 406 mmio_write_32(DBSC_DBDFICNT_0, 0x00000010); 407 mmio_write_32(DBSC_DBBCAMDIS, 0x00000001); 408 mmio_write_32(DBSC_DBSCHRW1, 0x00000046); 409 mmio_write_32(DBSC_SCFCTST0, 0x0D050B03); 410 mmio_write_32(DBSC_SCFCTST1, 0x0306030C); 411 412 mmio_write_32(DBSC_DBPDLK_0, 0x0000A55A); 413 mmio_write_32(DBSC_DBCMD, 0x01000001); 414 mmio_write_32(DBSC_DBCMD, 0x08000000); 415 mmio_write_32(DBSC_DBPDRGA_0, 0x00000001); 416 mmio_write_32(DBSC_DBPDRGD_0, 0x80010000); 417 mmio_write_32(DBSC_DBPDRGA_0, 0x00000006); 418 while (!(mmio_read_32(DBSC_DBPDRGD_0) & BIT(0))) 419 ; 420 421 mmio_write_32(DBSC_DBPDRGA_0, 0x00000008); 422 mmio_write_32(DBSC_DBPDRGD_0, 0x000B8000); 423 mmio_write_32(DBSC_DBPDRGA_0, 0x00000090); 424 mmio_write_32(DBSC_DBPDRGD_0, 0x04058904); 425 mmio_write_32(DBSC_DBPDRGA_0, 0x00000091); 426 mmio_write_32(DBSC_DBPDRGD_0, 0x0007BB6B); 427 mmio_write_32(DBSC_DBPDRGA_0, 0x00000095); 428 mmio_write_32(DBSC_DBPDRGD_0, 0x0007BBAD); 429 mmio_write_32(DBSC_DBPDRGA_0, 0x00000099); 430 mmio_write_32(DBSC_DBPDRGD_0, 0x0007BB6B); 431 mmio_write_32(DBSC_DBPDRGA_0, 0x00000090); 432 mmio_write_32(DBSC_DBPDRGD_0, 0x04058900); 433 mmio_write_32(DBSC_DBPDRGA_0, 0x00000021); 434 mmio_write_32(DBSC_DBPDRGD_0, 0x0024641E); 435 mmio_write_32(DBSC_DBPDRGA_0, 0x00000001); 436 mmio_write_32(DBSC_DBPDRGD_0, 0x00010073); 437 mmio_write_32(DBSC_DBPDRGA_0, 0x00000006); 438 while (!(mmio_read_32(DBSC_DBPDRGD_0) & BIT(0))) 439 ; 440 441 mmio_write_32(DBSC_DBPDRGA_0, 0x00000090); 442 mmio_write_32(DBSC_DBPDRGD_0, 0x0C058900); 443 mmio_write_32(DBSC_DBPDRGA_0, 0x00000090); 444 mmio_write_32(DBSC_DBPDRGD_0, 0x04058900); 445 mmio_write_32(DBSC_DBPDRGA_0, 0x00000006); 446 while (!(mmio_read_32(DBSC_DBPDRGD_0) & BIT(0))) 447 ; 448 449 mmio_write_32(DBSC_DBPDRGA_0, 0x00000003); 450 mmio_write_32(DBSC_DBPDRGD_0, 0x0780C700); 451 mmio_write_32(DBSC_DBPDRGA_0, 0x00000007); 452 while (!(mmio_read_32(DBSC_DBPDRGD_0) & BIT(30))) 453 ; 454 455 mmio_write_32(DBSC_DBPDRGA_0, 0x00000004); 456 mmio_write_32(DBSC_DBPDRGD_0, 457 (uint32_t) (REFRESH_RATE * 792 / 125) - 400 + 0x08B00000); 458 mmio_write_32(DBSC_DBPDRGA_0, 0x00000022); 459 mmio_write_32(DBSC_DBPDRGD_0, 0x1000040B); 460 mmio_write_32(DBSC_DBPDRGA_0, 0x00000023); 461 mmio_write_32(DBSC_DBPDRGD_0, 0x2D9C0B66); 462 mmio_write_32(DBSC_DBPDRGA_0, 0x00000024); 463 mmio_write_32(DBSC_DBPDRGD_0, 0x2A88B400); 464 mmio_write_32(DBSC_DBPDRGA_0, 0x00000025); 465 mmio_write_32(DBSC_DBPDRGD_0, 0x30005200); 466 mmio_write_32(DBSC_DBPDRGA_0, 0x00000026); 467 mmio_write_32(DBSC_DBPDRGD_0, 0x0014A9C9); 468 mmio_write_32(DBSC_DBPDRGA_0, 0x00000027); 469 mmio_write_32(DBSC_DBPDRGD_0, 0x00000D70); 470 mmio_write_32(DBSC_DBPDRGA_0, 0x00000028); 471 mmio_write_32(DBSC_DBPDRGD_0, 0x00000046); 472 mmio_write_32(DBSC_DBPDRGA_0, 0x00000029); 473 if (REFRESH_RATE > 3900) { 474 mmio_write_32(DBSC_DBPDRGD_0, 0x00000018); 475 } else { 476 mmio_write_32(DBSC_DBPDRGD_0, 0x00000098); 477 } 478 mmio_write_32(DBSC_DBPDRGA_0, 0x0000002C); 479 mmio_write_32(DBSC_DBPDRGD_0, 0x81003047); 480 mmio_write_32(DBSC_DBPDRGA_0, 0x00000020); 481 mmio_write_32(DBSC_DBPDRGD_0, 0x00181884); 482 mmio_write_32(DBSC_DBPDRGA_0, 0x0000001A); 483 mmio_write_32(DBSC_DBPDRGD_0, 0x33C03C10); 484 mmio_write_32(DBSC_DBPDRGA_0, 0x00000006); 485 while (!(mmio_read_32(DBSC_DBPDRGD_0) & BIT(0))) 486 ; 487 488 mmio_write_32(DBSC_DBPDRGA_0, 0x000000A7); 489 mmio_write_32(DBSC_DBPDRGD_0, 0x0D0D0D0D); 490 mmio_write_32(DBSC_DBPDRGA_0, 0x000000A8); 491 mmio_write_32(DBSC_DBPDRGD_0, 0x0D0D0D0D); 492 mmio_write_32(DBSC_DBPDRGA_0, 0x000000A9); 493 mmio_write_32(DBSC_DBPDRGD_0, 0x000D0D0D); 494 mmio_write_32(DBSC_DBPDRGA_0, 0x000000C7); 495 mmio_write_32(DBSC_DBPDRGD_0, 0x0D0D0D0D); 496 mmio_write_32(DBSC_DBPDRGA_0, 0x000000C8); 497 mmio_write_32(DBSC_DBPDRGD_0, 0x0D0D0D0D); 498 mmio_write_32(DBSC_DBPDRGA_0, 0x000000C9); 499 mmio_write_32(DBSC_DBPDRGD_0, 0x000D0D0D); 500 501 mmio_write_32(DBSC_DBPDRGA_0, 0x0000000E); 502 r2 = (mmio_read_32(DBSC_DBPDRGD_0) & 0x0000FF00) >> 0x9; 503 r3 = (r2 << 16) + (r2 << 8) + r2; 504 r6 = (r2 << 24) + (r2 << 16) + (r2 << 8) + r2; 505 mmio_write_32(DBSC_DBPDRGA_0, 0x00000011); 506 mmio_write_32(DBSC_DBPDRGD_0, r3); 507 mmio_write_32(DBSC_DBPDRGA_0, 0x00000012); 508 mmio_write_32(DBSC_DBPDRGD_0, r3); 509 mmio_write_32(DBSC_DBPDRGA_0, 0x00000016); 510 mmio_write_32(DBSC_DBPDRGD_0, r6); 511 mmio_write_32(DBSC_DBPDRGA_0, 0x00000017); 512 mmio_write_32(DBSC_DBPDRGD_0, r6); 513 mmio_write_32(DBSC_DBPDRGA_0, 0x00000018); 514 mmio_write_32(DBSC_DBPDRGD_0, r6); 515 mmio_write_32(DBSC_DBPDRGA_0, 0x00000019); 516 mmio_write_32(DBSC_DBPDRGD_0, r6); 517 518 mmio_write_32(DBSC_DBPDRGA_0, 0x00000001); 519 mmio_write_32(DBSC_DBPDRGD_0, 0x00010181); 520 mmio_write_32(DBSC_DBCMD, 0x08000001); 521 mmio_write_32(DBSC_DBPDRGA_0, 0x00000006); 522 while (!(mmio_read_32(DBSC_DBPDRGD_0) & BIT(0))) 523 ; 524 525 mmio_write_32(DBSC_DBPDRGA_0, 0x00000001); 526 mmio_write_32(DBSC_DBPDRGD_0, 0x00010601); 527 mmio_write_32(DBSC_DBPDRGA_0, 0x00000006); 528 while (!(mmio_read_32(DBSC_DBPDRGD_0) & BIT(0))) 529 ; 530 531 for (i = 0; i < 2; i++) { 532 mmio_write_32(DBSC_DBPDRGA_0, 0xB1 + i * 0x20); 533 r5 = (mmio_read_32(DBSC_DBPDRGD_0) & 0xFF00) >> 0x8; 534 mmio_write_32(DBSC_DBPDRGA_0, 0xB4 + i * 0x20); 535 r6 = mmio_read_32(DBSC_DBPDRGD_0) & 0xFF; 536 mmio_write_32(DBSC_DBPDRGA_0, 0xB3 + i * 0x20); 537 r7 = mmio_read_32(DBSC_DBPDRGD_0) & 0x7; 538 if (r6 > 0) { 539 mmio_write_32(DBSC_DBPDRGA_0, 0xB2 + i * 0x20); 540 r2 = mmio_read_32(DBSC_DBPDRGD_0) & 0xFFFFFFF8; 541 542 mmio_write_32(DBSC_DBPDRGA_0, 0xB2 + i * 0x20); 543 mmio_write_32(DBSC_DBPDRGD_0, r2 | ((r7 + 0x1) & 0x7)); 544 mmio_write_32(DBSC_DBPDRGA_0, 0xB0 + i * 0x20); 545 r2 = mmio_read_32(DBSC_DBPDRGD_0) & 0xFFFFFF00; 546 mmio_write_32(DBSC_DBPDRGA_0, 0xB0 + i * 0x20); 547 mmio_write_32(DBSC_DBPDRGD_0, r2 | r6); 548 } else { 549 mmio_write_32(DBSC_DBPDRGA_0, 0xB2 + i * 0x20); 550 r2 = mmio_read_32(DBSC_DBPDRGD_0) & 0xFFFFFFF8; 551 mmio_write_32(DBSC_DBPDRGA_0, 0xB2 + i * 0x20); 552 mmio_write_32(DBSC_DBPDRGD_0, r2 | r7); 553 554 mmio_write_32(DBSC_DBPDRGA_0, 0xB0 + i * 0x20); 555 r2 = mmio_read_32(DBSC_DBPDRGD_0) & 0xFFFFFF00; 556 mmio_write_32(DBSC_DBPDRGA_0, 0xB0 + i * 0x20); 557 mmio_write_32(DBSC_DBPDRGD_0, r2 | 558 ((r6 + (r5 << 1)) & 0xFF)); 559 } 560 } 561 562 mmio_write_32(DBSC_DBPDRGA_0, 0x00000005); 563 mmio_write_32(DBSC_DBPDRGD_0, 0xC1AA00C0); 564 mmio_write_32(DBSC_DBPDRGA_0, 0x000000A0); 565 mmio_write_32(DBSC_DBPDRGD_0, 0x7C0002C5); 566 mmio_write_32(DBSC_DBPDRGA_0, 0x000000C0); 567 mmio_write_32(DBSC_DBPDRGD_0, 0x7C0002C5); 568 mmio_write_32(DBSC_DBPDRGA_0, 0x00000001); 569 mmio_write_32(DBSC_DBPDRGD_0, 0x00010801); 570 mmio_write_32(DBSC_DBPDRGA_0, 0x00000006); 571 while (!(mmio_read_32(DBSC_DBPDRGD_0) & BIT(0))) 572 ; 573 574 mmio_write_32(DBSC_DBPDRGA_0, 0x00000005); 575 mmio_write_32(DBSC_DBPDRGD_0, 0xC1AA00D8); 576 mmio_write_32(DBSC_DBPDRGA_0, 0x00000001); 577 mmio_write_32(DBSC_DBPDRGD_0, 0x0001F001); 578 mmio_write_32(DBSC_DBPDRGA_0, 0x00000006); 579 while (!(mmio_read_32(DBSC_DBPDRGD_0) & BIT(0))) 580 ; 581 582 mmio_write_32(DBSC_DBPDRGA_0, 0x000000AF); 583 r2 = mmio_read_32(DBSC_DBPDRGD_0); 584 mmio_write_32(DBSC_DBPDRGA_0, 0x000000AF); 585 mmio_write_32(DBSC_DBPDRGD_0, ((r2 + 0x1) & 0xFF) | (r2 & 0xFFFFFF00)); 586 mmio_write_32(DBSC_DBPDRGA_0, 0x000000CF); 587 r2 = mmio_read_32(DBSC_DBPDRGD_0); 588 mmio_write_32(DBSC_DBPDRGA_0, 0x000000CF); 589 mmio_write_32(DBSC_DBPDRGD_0, ((r2 + 0x1) & 0xFF) | (r2 & 0xFFFFFF00)); 590 591 mmio_write_32(DBSC_DBPDRGA_0, 0x000000A0); 592 mmio_write_32(DBSC_DBPDRGD_0, 0x7C000285); 593 mmio_write_32(DBSC_DBPDRGA_0, 0x000000C0); 594 mmio_write_32(DBSC_DBPDRGD_0, 0x7C000285); 595 mmio_write_32(DBSC_DBPDRGA_0, 0x0000002C); 596 mmio_write_32(DBSC_DBPDRGD_0, 0x81003087); 597 mmio_write_32(DBSC_DBPDRGA_0, 0x00000001); 598 mmio_write_32(DBSC_DBPDRGD_0, 0x00010401); 599 mmio_write_32(DBSC_DBPDRGA_0, 0x00000006); 600 while (!(mmio_read_32(DBSC_DBPDRGD_0) & BIT(0))) 601 ; 602 603 for (i = 0; i < 2; i++) { 604 mmio_write_32(DBSC_DBPDRGA_0, 0xB1 + i * 0x20); 605 r5 = (mmio_read_32(DBSC_DBPDRGD_0) & 0xFF00) >> 0x8; 606 mmio_write_32(DBSC_DBPDRGA_0, 0xB4 + i * 0x20); 607 r6 = mmio_read_32(DBSC_DBPDRGD_0) & 0xFF; 608 609 mmio_write_32(DBSC_DBPDRGA_0, 0xB3 + i * 0x20); 610 r7 = mmio_read_32(DBSC_DBPDRGD_0) & 0x7; 611 r12 = (r5 >> 0x2); 612 613 if (r12 < r6) { 614 mmio_write_32(DBSC_DBPDRGA_0, 0xB2 + i * 0x20); 615 r2 = mmio_read_32(DBSC_DBPDRGD_0) & 0xFFFFFFF8; 616 617 mmio_write_32(DBSC_DBPDRGA_0, 0xB2 + i * 0x20); 618 mmio_write_32(DBSC_DBPDRGD_0, r2 | ((r7 + 0x1) & 0x7)); 619 mmio_write_32(DBSC_DBPDRGA_0, 0xB0 + i * 0x20); 620 r2 = mmio_read_32(DBSC_DBPDRGD_0) & 0xFFFFFF00; 621 622 mmio_write_32(DBSC_DBPDRGA_0, 0xB0 + i * 0x20); 623 mmio_write_32(DBSC_DBPDRGD_0, r2 | ((r6 - r12) & 0xFF)); 624 } else { 625 mmio_write_32(DBSC_DBPDRGA_0, 0xB2 + i * 0x20); 626 r2 = mmio_read_32(DBSC_DBPDRGD_0) & 0xFFFFFFF8; 627 mmio_write_32(DBSC_DBPDRGA_0, 0xB2 + i * 0x20); 628 mmio_write_32(DBSC_DBPDRGD_0, r2 | (r7 & 0x7)); 629 mmio_write_32(DBSC_DBPDRGA_0, 0xB0 + i * 0x20); 630 r2 = mmio_read_32(DBSC_DBPDRGD_0) & 0xFFFFFF00; 631 mmio_write_32(DBSC_DBPDRGA_0, 0xB0 + i * 0x20); 632 mmio_write_32(DBSC_DBPDRGD_0, r2 | 633 ((r6 + r5 + 634 (r5 >> 1) + r12) & 0xFF)); 635 } 636 } 637 638 mmio_write_32(DBSC_DBPDRGA_0, 0x000000A0); 639 mmio_write_32(DBSC_DBPDRGD_0, 0x7C0002C5); 640 mmio_write_32(DBSC_DBPDRGA_0, 0x000000C0); 641 mmio_write_32(DBSC_DBPDRGD_0, 0x7C0002C5); 642 mmio_write_32(DBSC_DBPDRGA_0, 0x00000001); 643 mmio_write_32(DBSC_DBPDRGD_0, 0x00015001); 644 mmio_write_32(DBSC_DBPDRGA_0, 0x00000006); 645 while (!(mmio_read_32(DBSC_DBPDRGD_0) & BIT(0))) 646 ; 647 648 mmio_write_32(DBSC_DBPDRGA_0, 0x00000003); 649 mmio_write_32(DBSC_DBPDRGD_0, 0x0380C700); 650 mmio_write_32(DBSC_DBPDRGA_0, 0x00000007); 651 while (mmio_read_32(DBSC_DBPDRGD_0) & BIT(30)) 652 ; 653 mmio_write_32(DBSC_DBPDRGA_0, 0x00000021); 654 mmio_write_32(DBSC_DBPDRGD_0, 0x0024643E); 655 656 mmio_write_32(DBSC_DBBUS0CNF1, 0x00000010); 657 mmio_write_32(DBSC_DBCALCNF, 658 (uint32_t) (64000000 / REFRESH_RATE) + 0x01000000); 659 mmio_write_32(DBSC_DBRFCNF1, 660 (uint32_t) (REFRESH_RATE * 99 / 125) + 0x00080000); 661 mmio_write_32(DBSC_DBRFCNF2, 0x00010000); 662 mmio_write_32(DBSC_DBDFICUPDCNF, 0x40100001); 663 mmio_write_32(DBSC_DBRFEN, 0x00000001); 664 mmio_write_32(DBSC_DBACEN, 0x00000001); 665 mmio_write_32(DBSC_DBPDLK_0, 0x00000000); 666 mmio_write_32(DBSC_DBSYSCNT0, 0x00000000); 667 668 #ifdef ddr_qos_init_setting // only for non qos_init 669 mmio_write_32(DBSC_DBSYSCNT0, 0x00001234); 670 mmio_write_32(DBSC_DBCAM0CNF1, 0x00043218); 671 mmio_write_32(DBSC_DBCAM0CNF2, 0x000000F4); 672 mmio_write_32(DBSC_DBSCHCNT0, 0x000f0037); 673 mmio_write_32(DBSC_DBSCHSZ0, 0x00000001); 674 mmio_write_32(DBSC_DBSCHRW0, 0x22421111); 675 mmio_write_32(DBSC_SCFCTST2, 0x012F1123); 676 mmio_write_32(DBSC_DBSCHQOS00, 0x00000F00); 677 mmio_write_32(DBSC_DBSCHQOS01, 0x00000B00); 678 mmio_write_32(DBSC_DBSCHQOS02, 0x00000000); 679 mmio_write_32(DBSC_DBSCHQOS03, 0x00000000); 680 mmio_write_32(DBSC_DBSCHQOS40, 0x00000300); 681 mmio_write_32(DBSC_DBSCHQOS41, 0x000002F0); 682 mmio_write_32(DBSC_DBSCHQOS42, 0x00000200); 683 mmio_write_32(DBSC_DBSCHQOS43, 0x00000100); 684 mmio_write_32(DBSC_DBSCHQOS90, 0x00000300); 685 mmio_write_32(DBSC_DBSCHQOS91, 0x000002F0); 686 mmio_write_32(DBSC_DBSCHQOS92, 0x00000200); 687 mmio_write_32(DBSC_DBSCHQOS93, 0x00000100); 688 mmio_write_32(DBSC_DBSCHQOS130, 0x00000100); 689 mmio_write_32(DBSC_DBSCHQOS131, 0x000000F0); 690 mmio_write_32(DBSC_DBSCHQOS132, 0x000000A0); 691 mmio_write_32(DBSC_DBSCHQOS133, 0x00000040); 692 mmio_write_32(DBSC_DBSCHQOS140, 0x000000C0); 693 mmio_write_32(DBSC_DBSCHQOS141, 0x000000B0); 694 mmio_write_32(DBSC_DBSCHQOS142, 0x00000080); 695 mmio_write_32(DBSC_DBSCHQOS143, 0x00000040); 696 mmio_write_32(DBSC_DBSCHQOS150, 0x00000040); 697 mmio_write_32(DBSC_DBSCHQOS151, 0x00000030); 698 mmio_write_32(DBSC_DBSCHQOS152, 0x00000020); 699 mmio_write_32(DBSC_DBSCHQOS153, 0x00000010); 700 mmio_write_32(0xE67F0018, 0x00000001); 701 mmio_write_32(DBSC_DBSYSCNT0, 0x00000000); 702 #endif 703 } 704 705 #define PRR 0xFFF00044U 706 #define PRR_PRODUCT_MASK 0x00007F00U 707 #define PRR_PRODUCT_D3 0x00005800U 708 709 #define MODEMR_MD19 BIT(19) 710 711 int32_t rcar_dram_init(void) 712 { 713 uint32_t reg; 714 uint32_t ddr_mbps; 715 716 reg = mmio_read_32(PRR); 717 if ((reg & PRR_PRODUCT_MASK) != PRR_PRODUCT_D3) { 718 ERROR("LSI Product ID (PRR=0x%x) DDR initialize not supported.\n", 719 reg); 720 panic(); 721 } 722 723 reg = mmio_read_32(RST_MODEMR); 724 if (reg & MODEMR_MD19) { 725 init_ddr_d3_1866(); 726 ddr_mbps = 1866; 727 } else { 728 init_ddr_d3_1600(); 729 ddr_mbps = 1600; 730 } 731 732 NOTICE("BL2: DDR%d(%s)\n", ddr_mbps, RCAR_DDR_VERSION); 733 734 return 0; 735 } 736