1 /* 2 * Copyright (c) 2015-2019, Renesas Electronics Corporation 3 * All rights reserved. 4 * 5 * SPDX-License-Identifier: BSD-3-Clause 6 */ 7 8 #include <lib/mmio.h> 9 #include <lib/utils_def.h> 10 #include <stdint.h> 11 #include "boot_init_dram.h" 12 #include "rcar_def.h" 13 #include "../ddr_regs.h" 14 15 static uint32_t init_ddr_v3m_1600(void) 16 { 17 uint32_t i, r2, r5, r6, r7, r12; 18 19 mmio_write_32(DBSC_DBSYSCNT0, 0x00001234); 20 mmio_write_32(DBSC_DBKIND, 0x00000007); 21 #if RCAR_DRAM_DDR3L_MEMCONF == 0 22 mmio_write_32(DBSC_DBMEMCONF_0_0, 0x0f030a02); // 1GB: Eagle 23 #else 24 mmio_write_32(DBSC_DBMEMCONF_0_0, 0x10030a02); // 2GB: V3MSK 25 #endif 26 mmio_write_32(DBSC_DBPHYCONF0, 0x00000001); 27 mmio_write_32(DBSC_DBTR0, 0x0000000B); 28 mmio_write_32(DBSC_DBTR1, 0x00000008); 29 mmio_write_32(DBSC_DBTR3, 0x0000000B); 30 mmio_write_32(DBSC_DBTR4, 0x000B000B); 31 mmio_write_32(DBSC_DBTR5, 0x00000027); 32 mmio_write_32(DBSC_DBTR6, 0x0000001C); 33 mmio_write_32(DBSC_DBTR7, 0x00060006); 34 mmio_write_32(DBSC_DBTR8, 0x00000020); 35 mmio_write_32(DBSC_DBTR9, 0x00000006); 36 mmio_write_32(DBSC_DBTR10, 0x0000000C); 37 mmio_write_32(DBSC_DBTR11, 0x0000000B); 38 mmio_write_32(DBSC_DBTR12, 0x00120012); 39 mmio_write_32(DBSC_DBTR13, 0x01180118); 40 mmio_write_32(DBSC_DBTR14, 0x00140005); 41 mmio_write_32(DBSC_DBTR15, 0x00050004); 42 mmio_write_32(DBSC_DBTR16, 0x071D0305); 43 mmio_write_32(DBSC_DBTR17, 0x040C0010); 44 mmio_write_32(DBSC_DBTR18, 0x00000200); 45 mmio_write_32(DBSC_DBTR19, 0x01000040); 46 mmio_write_32(DBSC_DBTR20, 0x02000120); 47 mmio_write_32(DBSC_DBTR21, 0x00040004); 48 mmio_write_32(DBSC_DBBL, 0x00000000); 49 mmio_write_32(DBSC_DBODT0, 0x00000001); 50 mmio_write_32(DBSC_DBADJ0, 0x00000001); 51 mmio_write_32(DBSC_DBCAM0CNF1, 0x00082010); 52 mmio_write_32(DBSC_DBCAM0CNF2, 0x00002000); 53 mmio_write_32(DBSC_DBSCHCNT0, 0x080f003f); 54 mmio_write_32(DBSC_DBSCHCNT1, 0x00001010); 55 mmio_write_32(DBSC_DBSCHSZ0, 0x00000001); 56 mmio_write_32(DBSC_DBSCHRW0, 0x00000200); 57 mmio_write_32(DBSC_DBSCHRW1, 0x00000040); 58 mmio_write_32(DBSC_DBSCHQOS40, 0x00000600); 59 mmio_write_32(DBSC_DBSCHQOS41, 0x00000480); 60 mmio_write_32(DBSC_DBSCHQOS42, 0x00000300); 61 mmio_write_32(DBSC_DBSCHQOS43, 0x00000180); 62 mmio_write_32(DBSC_DBSCHQOS90, 0x00000400); 63 mmio_write_32(DBSC_DBSCHQOS91, 0x00000300); 64 mmio_write_32(DBSC_DBSCHQOS92, 0x00000200); 65 mmio_write_32(DBSC_DBSCHQOS93, 0x00000100); 66 mmio_write_32(DBSC_DBSCHQOS130, 0x00000300); 67 mmio_write_32(DBSC_DBSCHQOS131, 0x00000240); 68 mmio_write_32(DBSC_DBSCHQOS132, 0x00000180); 69 mmio_write_32(DBSC_DBSCHQOS133, 0x000000c0); 70 mmio_write_32(DBSC_DBSCHQOS140, 0x00000200); 71 mmio_write_32(DBSC_DBSCHQOS141, 0x00000180); 72 mmio_write_32(DBSC_DBSCHQOS142, 0x00000100); 73 mmio_write_32(DBSC_DBSCHQOS143, 0x00000080); 74 mmio_write_32(DBSC_DBSCHQOS150, 0x00000100); 75 mmio_write_32(DBSC_DBSCHQOS151, 0x000000c0); 76 mmio_write_32(DBSC_DBSCHQOS152, 0x00000080); 77 mmio_write_32(DBSC_DBSCHQOS153, 0x00000040); 78 mmio_write_32(DBSC_DBSYSCONF1, 0x00000002); 79 mmio_write_32(DBSC_DBCAM0CNF1, 0x00040C04); 80 mmio_write_32(DBSC_DBCAM0CNF2, 0x000001c4); 81 mmio_write_32(DBSC_DBSCHSZ0, 0x00000003); 82 mmio_write_32(DBSC_DBSCHRW1, 0x001a0080); 83 mmio_write_32(DBSC_DBDFICNT_0, 0x00000010); 84 85 mmio_write_32(DBSC_DBPDLK_0, 0x0000A55A); 86 mmio_write_32(DBSC_DBCMD, 0x01000001); 87 mmio_write_32(DBSC_DBCMD, 0x08000000); 88 mmio_write_32(DBSC_DBPDRGA_0, 0x00000001); 89 mmio_write_32(DBSC_DBPDRGD_0, 0x80010000); 90 mmio_write_32(DBSC_DBPDRGA_0, 0x00000006); 91 while (!(mmio_read_32(DBSC_DBPDRGD_0) & BIT(0))) 92 ; 93 94 mmio_write_32(DBSC_DBPDRGA_0, 0x00000008); 95 mmio_write_32(DBSC_DBPDRGD_0, 0x000B8000); 96 mmio_write_32(DBSC_DBPDRGA_0, 0x00000090); 97 mmio_write_32(DBSC_DBPDRGD_0, 0x04058904); 98 mmio_write_32(DBSC_DBPDRGA_0, 0x00000091); 99 mmio_write_32(DBSC_DBPDRGD_0, 0x0007BB6D); 100 mmio_write_32(DBSC_DBPDRGA_0, 0x00000095); 101 mmio_write_32(DBSC_DBPDRGD_0, 0x0007BB6B); 102 mmio_write_32(DBSC_DBPDRGA_0, 0x00000099); 103 mmio_write_32(DBSC_DBPDRGD_0, 0x0007BB6D); 104 mmio_write_32(DBSC_DBPDRGA_0, 0x00000090); 105 mmio_write_32(DBSC_DBPDRGD_0, 0x04058900); 106 mmio_write_32(DBSC_DBPDRGA_0, 0x00000021); 107 mmio_write_32(DBSC_DBPDRGD_0, 0x0024641E); 108 mmio_write_32(DBSC_DBPDRGA_0, 0x00000001); 109 mmio_write_32(DBSC_DBPDRGD_0, 0x00010073); 110 mmio_write_32(DBSC_DBPDRGA_0, 0x00000006); 111 while (!(mmio_read_32(DBSC_DBPDRGD_0) & BIT(0))) 112 ; 113 114 mmio_write_32(DBSC_DBPDRGA_0, 0x00000090); 115 mmio_write_32(DBSC_DBPDRGD_0, 0x0C058900); 116 mmio_write_32(DBSC_DBPDRGA_0, 0x00000090); 117 mmio_write_32(DBSC_DBPDRGD_0, 0x04058900); 118 mmio_write_32(DBSC_DBPDRGA_0, 0x00000006); 119 while (!(mmio_read_32(DBSC_DBPDRGD_0) & BIT(0))) 120 ; 121 122 mmio_write_32(DBSC_DBPDRGA_0, 0x00000003); 123 mmio_write_32(DBSC_DBPDRGD_0, 0x0780C700); 124 mmio_write_32(DBSC_DBPDRGA_0, 0x00000007); 125 while (!(mmio_read_32(DBSC_DBPDRGD_0) & BIT(30))) 126 ; 127 128 mmio_write_32(DBSC_DBPDRGA_0, 0x00000004); 129 mmio_write_32(DBSC_DBPDRGD_0, 0x08C0C170); 130 mmio_write_32(DBSC_DBPDRGA_0, 0x00000022); 131 mmio_write_32(DBSC_DBPDRGD_0, 0x1000040B); 132 mmio_write_32(DBSC_DBPDRGA_0, 0x00000023); 133 mmio_write_32(DBSC_DBPDRGD_0, 0x2D9C0B66); 134 mmio_write_32(DBSC_DBPDRGA_0, 0x00000024); 135 mmio_write_32(DBSC_DBPDRGD_0, 0x2A88C400); 136 mmio_write_32(DBSC_DBPDRGA_0, 0x00000025); 137 mmio_write_32(DBSC_DBPDRGD_0, 0x30005200); 138 mmio_write_32(DBSC_DBPDRGA_0, 0x00000026); 139 mmio_write_32(DBSC_DBPDRGD_0, 0x0014A9C9); 140 mmio_write_32(DBSC_DBPDRGA_0, 0x00000027); 141 mmio_write_32(DBSC_DBPDRGD_0, 0x00000D70); 142 mmio_write_32(DBSC_DBPDRGA_0, 0x00000028); 143 mmio_write_32(DBSC_DBPDRGD_0, 0x00000004); 144 mmio_write_32(DBSC_DBPDRGA_0, 0x00000029); 145 mmio_write_32(DBSC_DBPDRGD_0, 0x00000018); 146 mmio_write_32(DBSC_DBPDRGA_0, 0x0000002C); 147 mmio_write_32(DBSC_DBPDRGD_0, 0x81003047); 148 mmio_write_32(DBSC_DBPDRGA_0, 0x00000020); 149 mmio_write_32(DBSC_DBPDRGD_0, 0x00181884); 150 mmio_write_32(DBSC_DBPDRGA_0, 0x0000001A); 151 mmio_write_32(DBSC_DBPDRGD_0, 0x13C03C10); 152 mmio_write_32(DBSC_DBPDRGA_0, 0x00000006); 153 while (!(mmio_read_32(DBSC_DBPDRGD_0) & BIT(0))) 154 ; 155 156 mmio_write_32(DBSC_DBPDRGA_0, 0x000000A7); 157 mmio_write_32(DBSC_DBPDRGD_0, 0x0D0D0D0D); 158 mmio_write_32(DBSC_DBPDRGA_0, 0x000000A8); 159 mmio_write_32(DBSC_DBPDRGD_0, 0x0D0D0D0D); 160 mmio_write_32(DBSC_DBPDRGA_0, 0x000000A9); 161 mmio_write_32(DBSC_DBPDRGD_0, 0x000D0D0D); 162 mmio_write_32(DBSC_DBPDRGA_0, 0x000000C7); 163 mmio_write_32(DBSC_DBPDRGD_0, 0x0D0D0D0D); 164 mmio_write_32(DBSC_DBPDRGA_0, 0x000000C8); 165 mmio_write_32(DBSC_DBPDRGD_0, 0x0D0D0D0D); 166 mmio_write_32(DBSC_DBPDRGA_0, 0x000000C9); 167 mmio_write_32(DBSC_DBPDRGD_0, 0x000D0D0D); 168 mmio_write_32(DBSC_DBPDRGA_0, 0x000000E7); 169 mmio_write_32(DBSC_DBPDRGD_0, 0x0D0D0D0D); 170 mmio_write_32(DBSC_DBPDRGA_0, 0x000000E8); 171 mmio_write_32(DBSC_DBPDRGD_0, 0x0D0D0D0D); 172 mmio_write_32(DBSC_DBPDRGA_0, 0x000000E9); 173 mmio_write_32(DBSC_DBPDRGD_0, 0x000D0D0D); 174 mmio_write_32(DBSC_DBPDRGA_0, 0x00000107); 175 mmio_write_32(DBSC_DBPDRGD_0, 0x0D0D0D0D); 176 mmio_write_32(DBSC_DBPDRGA_0, 0x00000108); 177 mmio_write_32(DBSC_DBPDRGD_0, 0x0D0D0D0D); 178 mmio_write_32(DBSC_DBPDRGA_0, 0x00000109); 179 mmio_write_32(DBSC_DBPDRGD_0, 0x000D0D0D); 180 mmio_write_32(DBSC_DBPDRGA_0, 0x00000001); 181 mmio_write_32(DBSC_DBPDRGD_0, 0x00010181); 182 mmio_write_32(DBSC_DBCMD, 0x08000001); 183 mmio_write_32(DBSC_DBPDRGA_0, 0x00000006); 184 while (!(mmio_read_32(DBSC_DBPDRGD_0) & BIT(0))) 185 ; 186 187 mmio_write_32(DBSC_DBPDRGA_0, 0x00000001); 188 mmio_write_32(DBSC_DBPDRGD_0, 0x00010601); 189 mmio_write_32(DBSC_DBPDRGA_0, 0x00000006); 190 while (!(mmio_read_32(DBSC_DBPDRGD_0) & BIT(0))) 191 ; 192 193 for (i = 0; i < 4; i++) { 194 mmio_write_32(DBSC_DBPDRGA_0, 0xB1 + i * 0x20); 195 r5 = (mmio_read_32(DBSC_DBPDRGD_0) & 0xFF00) >> 8; 196 mmio_write_32(DBSC_DBPDRGA_0, 0xB4 + i * 0x20); 197 r6 = mmio_read_32(DBSC_DBPDRGD_0) & 0xFF; 198 mmio_write_32(DBSC_DBPDRGA_0, 0xB3 + i * 0x20); 199 r7 = mmio_read_32(DBSC_DBPDRGD_0) & 0x7; 200 201 if (r6 > 0) { 202 mmio_write_32(DBSC_DBPDRGA_0, 0xB2 + i * 0x20); 203 r2 = (mmio_read_32(DBSC_DBPDRGD_0) & 0xFFFFFFF8); 204 205 mmio_write_32(DBSC_DBPDRGA_0, 0xB2 + i * 0x20); 206 mmio_write_32(DBSC_DBPDRGD_0, ((r7 + 1) & 0x7) | r2); 207 mmio_write_32(DBSC_DBPDRGA_0, 0xB0 + i * 0x20); 208 r2 = (mmio_read_32(DBSC_DBPDRGD_0) & 0xFFFFFF00); 209 mmio_write_32(DBSC_DBPDRGA_0, 0xB0 + i * 0x20); 210 mmio_write_32(DBSC_DBPDRGD_0, r2 | r6); 211 } else { 212 mmio_write_32(DBSC_DBPDRGA_0, 0xB2 + i * 0x20); 213 r2 = (mmio_read_32(DBSC_DBPDRGD_0) & 0xFFFFFFF8); 214 mmio_write_32(DBSC_DBPDRGA_0, 0xB2 + i * 0x20); 215 mmio_write_32(DBSC_DBPDRGD_0, r2 | r7); 216 217 mmio_write_32(DBSC_DBPDRGA_0, 0xB0 + i * 0x20); 218 r2 = (mmio_read_32(DBSC_DBPDRGD_0) & 0xFFFFFF00); 219 mmio_write_32(DBSC_DBPDRGA_0, 0xB0 + i * 0x20); 220 mmio_write_32(DBSC_DBPDRGD_0, r2 | 221 (((r5 << 1) + r6) & 0xFF)); 222 } 223 } 224 225 mmio_write_32(DBSC_DBPDRGA_0, 0x00000005); 226 mmio_write_32(DBSC_DBPDRGD_0, 0xC1AA00A0); 227 mmio_write_32(DBSC_DBPDRGA_0, 0x000000A0); 228 mmio_write_32(DBSC_DBPDRGD_0, 0x7C0002C5); 229 mmio_write_32(DBSC_DBPDRGA_0, 0x000000C0); 230 mmio_write_32(DBSC_DBPDRGD_0, 0x7C0002C5); 231 mmio_write_32(DBSC_DBPDRGA_0, 0x000000E0); 232 mmio_write_32(DBSC_DBPDRGD_0, 0x7C0002C5); 233 mmio_write_32(DBSC_DBPDRGA_0, 0x00000100); 234 mmio_write_32(DBSC_DBPDRGD_0, 0x7C0002C5); 235 mmio_write_32(DBSC_DBPDRGA_0, 0x00000001); 236 mmio_write_32(DBSC_DBPDRGD_0, 0x00010801); 237 mmio_write_32(DBSC_DBPDRGA_0, 0x00000006); 238 while (!(mmio_read_32(DBSC_DBPDRGD_0) & BIT(0))) 239 ; 240 241 mmio_write_32(DBSC_DBPDRGA_0, 0x00000005); 242 mmio_write_32(DBSC_DBPDRGD_0, 0xC1AA00B8); 243 mmio_write_32(DBSC_DBPDRGA_0, 0x00000001); 244 mmio_write_32(DBSC_DBPDRGD_0, 0x0001F001); 245 mmio_write_32(DBSC_DBPDRGA_0, 0x00000006); 246 while (!(mmio_read_32(DBSC_DBPDRGD_0) & BIT(0))) 247 ; 248 249 mmio_write_32(DBSC_DBPDRGA_0, 0x000000A0); 250 mmio_write_32(DBSC_DBPDRGD_0, 0x7C000285); 251 mmio_write_32(DBSC_DBPDRGA_0, 0x000000C0); 252 mmio_write_32(DBSC_DBPDRGD_0, 0x7C000285); 253 mmio_write_32(DBSC_DBPDRGA_0, 0x000000E0); 254 mmio_write_32(DBSC_DBPDRGD_0, 0x7C000285); 255 mmio_write_32(DBSC_DBPDRGA_0, 0x00000100); 256 mmio_write_32(DBSC_DBPDRGD_0, 0x7C000285); 257 mmio_write_32(DBSC_DBPDRGA_0, 0x0000002C); 258 mmio_write_32(DBSC_DBPDRGD_0, 0x81003087); 259 mmio_write_32(DBSC_DBPDRGA_0, 0x00000001); 260 mmio_write_32(DBSC_DBPDRGD_0, 0x00010401); 261 mmio_write_32(DBSC_DBPDRGA_0, 0x00000006); 262 while (!(mmio_read_32(DBSC_DBPDRGD_0) & BIT(0))) 263 ; 264 265 for (i = 0; i < 4; i++) { 266 mmio_write_32(DBSC_DBPDRGA_0, 0xB1 + i * 0x20); 267 r5 = (mmio_read_32(DBSC_DBPDRGD_0) & 0xFF00) >> 8; 268 mmio_write_32(DBSC_DBPDRGA_0, 0xB4 + i * 0x20); 269 r6 = (mmio_read_32(DBSC_DBPDRGD_0) & 0xFF); 270 271 mmio_write_32(DBSC_DBPDRGA_0, 0xB3 + i * 0x20); 272 r7 = (mmio_read_32(DBSC_DBPDRGD_0) & 0x7); 273 r12 = (r5 >> 2); 274 if (r6 - r12 > 0) { 275 mmio_write_32(DBSC_DBPDRGA_0, 0xB2 + i * 0x20); 276 r2 = (mmio_read_32(DBSC_DBPDRGD_0) & 0xFFFFFFF8); 277 278 mmio_write_32(DBSC_DBPDRGA_0, 0xB2 + i * 0x20); 279 mmio_write_32(DBSC_DBPDRGD_0, ((r7 + 1) & 0x7) | r2); 280 mmio_write_32(DBSC_DBPDRGA_0, 0xB0 + i * 0x20); 281 r2 = (mmio_read_32(DBSC_DBPDRGD_0) & 0xFFFFFF00); 282 283 mmio_write_32(DBSC_DBPDRGA_0, 0xB0 + i * 0x20); 284 mmio_write_32(DBSC_DBPDRGD_0, ((r6 - r12) & 0xFF) | r2); 285 } else { 286 mmio_write_32(DBSC_DBPDRGA_0, 0xB2 + i * 0x20); 287 r2 = (mmio_read_32(DBSC_DBPDRGD_0) & 0xFFFFFFF8); 288 mmio_write_32(DBSC_DBPDRGA_0, 0xB2 + i * 0x20); 289 mmio_write_32(DBSC_DBPDRGD_0, (r7 & 0x7) | r2); 290 mmio_write_32(DBSC_DBPDRGA_0, 0xB0 + i * 0x20); 291 r2 = (mmio_read_32(DBSC_DBPDRGD_0) & 0xFFFFFF00); 292 mmio_write_32(DBSC_DBPDRGA_0, 0xB0 + i * 0x20); 293 mmio_write_32(DBSC_DBPDRGD_0, r2 | 294 ((r6 + r5 + 295 (r5 >> 1) + r12) & 0xFF)); 296 } 297 } 298 299 mmio_write_32(DBSC_DBPDRGA_0, 0x000000A0); 300 mmio_write_32(DBSC_DBPDRGD_0, 0x7C0002C5); 301 mmio_write_32(DBSC_DBPDRGA_0, 0x000000C0); 302 mmio_write_32(DBSC_DBPDRGD_0, 0x7C0002C5); 303 mmio_write_32(DBSC_DBPDRGA_0, 0x000000E0); 304 mmio_write_32(DBSC_DBPDRGD_0, 0x7C0002C5); 305 mmio_write_32(DBSC_DBPDRGA_0, 0x00000100); 306 mmio_write_32(DBSC_DBPDRGD_0, 0x7C0002C5); 307 mmio_write_32(DBSC_DBPDRGA_0, 0x00000001); 308 mmio_write_32(DBSC_DBPDRGD_0, 0x00015001); 309 mmio_write_32(DBSC_DBPDRGA_0, 0x00000006); 310 while (!(mmio_read_32(DBSC_DBPDRGD_0) & BIT(0))) 311 ; 312 313 mmio_write_32(DBSC_DBPDRGA_0, 0x00000003); 314 mmio_write_32(DBSC_DBPDRGD_0, 0x0380C700); 315 mmio_write_32(DBSC_DBPDRGA_0, 0x00000007); 316 while (mmio_read_32(DBSC_DBPDRGD_0) & BIT(30)) 317 ; 318 mmio_write_32(DBSC_DBPDRGA_0, 0x00000021); 319 mmio_write_32(DBSC_DBPDRGD_0, 0x0024643E); 320 321 mmio_write_32(DBSC_DBBUS0CNF1, 0x00000000); 322 mmio_write_32(DBSC_DBBUS0CNF0, 0x00010001); 323 mmio_write_32(DBSC_DBCALCNF, 0x0100200E); 324 mmio_write_32(DBSC_DBRFCNF1, 0x00081860); 325 mmio_write_32(DBSC_DBRFCNF2, 0x00010000); 326 mmio_write_32(DBSC_DBDFICUPDCNF, 0x40100001); 327 mmio_write_32(DBSC_DBRFEN, 0x00000001); 328 mmio_write_32(DBSC_DBACEN, 0x00000001); 329 mmio_write_32(DBSC_DBPDLK_0, 0x00000000); 330 mmio_write_32(0xE67F0024, 0x00000001); 331 mmio_write_32(DBSC_DBSYSCNT0, 0x00000000); 332 333 return INITDRAM_OK; 334 } 335 336 int32_t rcar_dram_init(void) 337 { 338 return init_ddr_v3m_1600(); 339 } 340