1 /* 2 * Copyright (c) 2017, ARM Limited and Contributors. All rights reserved. 3 * 4 * SPDX-License-Identifier: BSD-3-Clause 5 */ 6 7 #include <arch_helpers.h> 8 #include <assert.h> 9 #include <debug.h> 10 #include <errno.h> 11 #include <hi6220.h> 12 #include <hi6553.h> 13 #include <mmio.h> 14 #include <sp804_delay_timer.h> 15 16 #include "hikey_private.h" 17 18 static void init_pll(void) 19 { 20 unsigned int data; 21 22 data = mmio_read_32((0xf7032000 + 0x000)); 23 data |= 0x1; 24 mmio_write_32((0xf7032000 + 0x000), data); 25 do { 26 data = mmio_read_32((0xf7032000 + 0x000)); 27 } while (!(data & (1 << 28))); 28 29 data = mmio_read_32((0xf7800000 + 0x000)); 30 data &= ~0x007; 31 data |= 0x004; 32 mmio_write_32((0xf7800000 + 0x000), data); 33 do { 34 data = mmio_read_32((0xf7800000 + 0x014)); 35 data &= 0x007; 36 } while (data != 0x004); 37 38 mmio_write_32(PERI_SC_PERIPH_CTRL14, 0x2101); 39 dsb(); 40 isb(); 41 udelay(10); 42 mmio_write_32(PERI_SC_PERIPH_CTRL14, 0x2001); 43 dsb(); 44 isb(); 45 udelay(10); 46 mmio_write_32(PERI_SC_PERIPH_CTRL14, 0x2201); 47 dsb(); 48 isb(); 49 udelay(10); 50 mmio_write_32(0xf7032000 + 0x02c, 0x5110103e); 51 dsb(); 52 isb(); 53 udelay(10); 54 data = mmio_read_32(0xf7032000 + 0x050); 55 data |= 1 << 28; 56 mmio_write_32(0xf7032000 + 0x050, data); 57 dsb(); 58 isb(); 59 udelay(10); 60 mmio_write_32(PERI_SC_PERIPH_CTRL14, 0x2101); 61 dsb(); 62 isb(); 63 udelay(10); 64 mmio_write_32(PERI_SC_PERIPH_CTRL14, 0x2001); 65 dsb(); 66 isb(); 67 udelay(10); 68 mmio_write_32(PERI_SC_PERIPH_CTRL14, 0x2201); 69 dsb(); 70 isb(); 71 udelay(10); 72 } 73 74 static void init_freq(void) 75 { 76 unsigned int data, tmp; 77 unsigned int cpuext_cfg, ddr_cfg; 78 79 mmio_write_32((0xf7032000 + 0x374), 0x4a); 80 mmio_write_32((0xf7032000 + 0x368), 0xda); 81 mmio_write_32((0xf7032000 + 0x36c), 0x01); 82 mmio_write_32((0xf7032000 + 0x370), 0x01); 83 mmio_write_32((0xf7032000 + 0x360), 0x60); 84 mmio_write_32((0xf7032000 + 0x364), 0x60); 85 86 mmio_write_32((0xf7032000 + 0x114), 0x1000); 87 88 data = mmio_read_32((0xf7032000 + 0x110)); 89 data |= (3 << 12); 90 mmio_write_32((0xf7032000 + 0x110), data); 91 92 data = mmio_read_32((0xf7032000 + 0x110)); 93 data |= (1 << 4); 94 mmio_write_32((0xf7032000 + 0x110), data); 95 96 97 data = mmio_read_32((0xf7032000 + 0x110)); 98 data &= ~0x7; 99 data |= 0x5; 100 mmio_write_32((0xf7032000 + 0x110), data); 101 dsb(); 102 mdelay(10); 103 104 105 do { 106 data = mmio_read_32((0xf6504000 + 0x008)); 107 data &= (3 << 20); 108 } while (data != (3 << 20)); 109 dsb(); 110 mdelay(10); 111 112 113 data = mmio_read_32((0xf6504000 + 0x054)); 114 data &= ~((1 << 0) | (1 << 11)); 115 mmio_write_32((0xf6504000 + 0x054), data); 116 mdelay(10); 117 118 data = mmio_read_32((0xf7032000 + 0x104)); 119 data &= ~(3 << 8); 120 data |= (1 << 8); 121 mmio_write_32((0xf7032000 + 0x104), data); 122 123 data = mmio_read_32((0xf7032000 + 0x100)); 124 data |= (1 << 0); 125 mmio_write_32((0xf7032000 + 0x100), data); 126 dsb(); 127 128 do { 129 data = mmio_read_32((0xf7032000 + 0x100)); 130 data &= (1 << 2); 131 } while (data != (1 << 2)); 132 133 data = mmio_read_32((0xf6504000 + 0x06c)); 134 data &= ~0xffff; 135 data |= 0x56; 136 mmio_write_32((0xf6504000 + 0x06c), data); 137 138 data = mmio_read_32((0xf6504000 + 0x06c)); 139 data &= ~(0xffffff << 8); 140 data |= 0xc7a << 8; 141 mmio_write_32((0xf6504000 + 0x06c), data); 142 143 data = mmio_read_32((0xf6504000 + 0x058)); 144 data &= ((1 << 13) - 1); 145 data |= 0xccb; 146 mmio_write_32((0xf6504000 + 0x058), data); 147 148 mmio_write_32((0xf6504000 + 0x060), 0x1fff); 149 mmio_write_32((0xf6504000 + 0x064), 0x1ffffff); 150 mmio_write_32((0xf6504000 + 0x068), 0x7fffffff); 151 mmio_write_32((0xf6504000 + 0x05c), 0x1); 152 153 data = mmio_read_32((0xf6504000 + 0x054)); 154 data &= ~(0xf << 12); 155 data |= 1 << 12; 156 mmio_write_32((0xf6504000 + 0x054), data); 157 dsb(); 158 159 160 data = mmio_read_32((0xf7032000 + 0x000)); 161 data &= ~(1 << 0); 162 mmio_write_32((0xf7032000 + 0x000), data); 163 164 mmio_write_32((0xf7032000 + 0x004), 0x5110207d); 165 mmio_write_32((0xf7032000 + 0x134), 0x10000005); 166 data = mmio_read_32((0xf7032000 + 0x134)); 167 168 169 data = mmio_read_32((0xf7032000 + 0x000)); 170 data |= (1 << 0); 171 mmio_write_32((0xf7032000 + 0x000), data); 172 173 mmio_write_32((0xf7032000 + 0x368), 0x100da); 174 data = mmio_read_32((0xf7032000 + 0x378)); 175 data &= ~((1 << 7) - 1); 176 data |= 0x6b; 177 mmio_write_32((0xf7032000 + 0x378), data); 178 dsb(); 179 do { 180 data = mmio_read_32((0xf7032000 + 0x378)); 181 tmp = data & 0x7f; 182 data = (data & (0x7f << 8)) >> 8; 183 if (data != tmp) 184 continue; 185 data = mmio_read_32((0xf7032000 + 0x37c)); 186 } while (!(data & 1)); 187 188 data = mmio_read_32((0xf7032000 + 0x104)); 189 data &= ~((3 << 0) | 190 (3 << 8)); 191 cpuext_cfg = 1; 192 ddr_cfg = 1; 193 data |= cpuext_cfg | (ddr_cfg << 8); 194 mmio_write_32((0xf7032000 + 0x104), data); 195 dsb(); 196 197 do { 198 data = mmio_read_32((0xf7032000 + 0x104)); 199 tmp = (data & (3 << 16)) >> 16; 200 if (cpuext_cfg != tmp) 201 continue; 202 tmp = (data & (3 << 24)) >> 24; 203 if (ddr_cfg != tmp) 204 continue; 205 data = mmio_read_32((0xf7032000 + 0x000)); 206 data &= 1 << 28; 207 } while (!data); 208 209 data = mmio_read_32((0xf7032000 + 0x100)); 210 data &= ~(1 << 0); 211 mmio_write_32((0xf7032000 + 0x100), data); 212 dsb(); 213 do { 214 data = mmio_read_32((0xf7032000 + 0x100)); 215 data &= (1 << 1); 216 } while (data != (1 << 1)); 217 mdelay(1000); 218 219 data = mmio_read_32((0xf6504000 + 0x054)); 220 data &= ~(1 << 28); 221 mmio_write_32((0xf6504000 + 0x054), data); 222 dsb(); 223 224 data = mmio_read_32((0xf7032000 + 0x110)); 225 data &= ~((1 << 4) | 226 (3 << 12)); 227 mmio_write_32((0xf7032000 + 0x110), data); 228 } 229 230 int cat_533mhz_800mhz(void) 231 { 232 unsigned int data, i; 233 unsigned int bdl[5]; 234 235 236 data = mmio_read_32((0xf712c000 + 0x1c8)); 237 data &= 0xfffff0f0; 238 data |= 0x100f01; 239 mmio_write_32((0xf712c000 + 0x1c8), data); 240 241 for (i = 0; i < 0x20; i++) { 242 mmio_write_32((0xf712c000 + 0x1d4), 0xc0000); 243 data = (i << 0x10) + i; 244 mmio_write_32((0xf712c000 + 0x140), data); 245 mmio_write_32((0xf712c000 + 0x144), data); 246 mmio_write_32((0xf712c000 + 0x148), data); 247 mmio_write_32((0xf712c000 + 0x14c), data); 248 mmio_write_32((0xf712c000 + 0x150), data); 249 250 251 data = mmio_read_32((0xf712c000 + 0x070)); 252 data |= 0x80000; 253 mmio_write_32((0xf712c000 + 0x070), data); 254 data = mmio_read_32((0xf712c000 + 0x070)); 255 data &= 0xfff7ffff; 256 mmio_write_32((0xf712c000 + 0x070), data); 257 258 259 mmio_write_32((0xf712c000 + 0x004), 0x8000); 260 mmio_write_32((0xf712c000 + 0x004), 0x0); 261 mmio_write_32((0xf712c000 + 0x004), 0x801); 262 do { 263 data = mmio_read_32((0xf712c000 + 0x004)); 264 } while (data & 1); 265 266 data = mmio_read_32((0xf712c000 + 0x008)); 267 if ((data & 0x400) == 0) { 268 mdelay(10); 269 return 0; 270 } 271 WARN("lpddr3 cat fail\n"); 272 data = mmio_read_32((0xf712c000 + 0x1d4)); 273 if ((data & 0x1f00) && ((data & 0x1f) == 0)) { 274 bdl[0] = mmio_read_32((0xf712c000 + 0x140)); 275 bdl[1] = mmio_read_32((0xf712c000 + 0x144)); 276 bdl[2] = mmio_read_32((0xf712c000 + 0x148)); 277 bdl[3] = mmio_read_32((0xf712c000 + 0x14c)); 278 bdl[4] = mmio_read_32((0xf712c000 + 0x150)); 279 if ((!(bdl[0] & 0x1f001f)) || (!(bdl[1] & 0x1f001f)) || 280 (!(bdl[2] & 0x1f001f)) || (!(bdl[3] & 0x1f001f)) || 281 (!(bdl[4] & 0x1f001f))) { 282 WARN("lpddr3 cat deskew error\n"); 283 if (i == 0x1f) { 284 WARN("addrnbdl is max\n"); 285 return -EINVAL; 286 } 287 mmio_write_32((0xf712c000 + 0x008), 0x400); 288 } else { 289 WARN("lpddr3 cat other error1\n"); 290 return -EINVAL; 291 } 292 } else { 293 WARN("lpddr3 cat other error2\n"); 294 return -EINVAL; 295 } 296 } 297 return -EINVAL; 298 } 299 300 static void ddrx_rdet(void) 301 { 302 unsigned int data, rdet, bdl[4]; 303 304 data = mmio_read_32((0xf712c000 + 0x0d0)); 305 data &= 0xf800ffff; 306 data |= 0x8f0000; 307 mmio_write_32((0xf712c000 + 0x0d0), data); 308 309 data = mmio_read_32((0xf712c000 + 0x0dc)); 310 data &= 0xfffffff0; 311 data |= 0xf; 312 mmio_write_32((0xf712c000 + 0x0dc), data); 313 314 315 data = mmio_read_32((0xf712c000 + 0x070)); 316 data |= 0x80000; 317 mmio_write_32((0xf712c000 + 0x070), data); 318 data = mmio_read_32((0xf712c000 + 0x070)); 319 data &= 0xfff7ffff; 320 mmio_write_32((0xf712c000 + 0x070), data); 321 322 mmio_write_32((0xf712c000 + 0x004), 0x8000); 323 mmio_write_32((0xf712c000 + 0x004), 0); 324 325 data = mmio_read_32((0xf712c000 + 0x0d0)); 326 data &= ~0xf0000000; 327 data |= 0x80000000; 328 mmio_write_32((0xf712c000 + 0x0d0), data); 329 330 mmio_write_32((0xf712c000 + 0x004), 0x101); 331 do { 332 data = mmio_read_32((0xf712c000 + 0x004)); 333 } while (!(data & 1)); 334 data = mmio_read_32((0xf712c000 + 0x008)); 335 if (data & 0x100) 336 WARN("rdet lbs fail\n"); 337 338 bdl[0] = mmio_read_32((0xf712c000 + 0x22c)) & 0x7f; 339 bdl[1] = mmio_read_32((0xf712c000 + 0x2ac)) & 0x7f; 340 bdl[2] = mmio_read_32((0xf712c000 + 0x32c)) & 0x7f; 341 bdl[3] = mmio_read_32((0xf712c000 + 0x3ac)) & 0x7f; 342 do { 343 data = mmio_read_32((0xf712c000 + 0x22c)); 344 data &= ~0x7f; 345 data |= bdl[0]; 346 mmio_write_32((0xf712c000 + 0x22c), data); 347 data = mmio_read_32((0xf712c000 + 0x2ac)); 348 data &= ~0x7f; 349 data |= bdl[1]; 350 mmio_write_32((0xf712c000 + 0x2ac), data); 351 data = mmio_read_32((0xf712c000 + 0x32c)); 352 data &= ~0x7f; 353 data |= bdl[2]; 354 mmio_write_32((0xf712c000 + 0x32c), data); 355 data = mmio_read_32((0xf712c000 + 0x3ac)); 356 data &= ~0x7f; 357 data |= bdl[3]; 358 mmio_write_32((0xf712c000 + 0x3ac), data); 359 360 361 data = mmio_read_32((0xf712c000 + 0x070)); 362 data |= 0x80000; 363 mmio_write_32((0xf712c000 + 0x070), data); 364 data = mmio_read_32((0xf712c000 + 0x070)); 365 data &= 0xfff7ffff; 366 mmio_write_32((0xf712c000 + 0x070), data); 367 368 mmio_write_32((0xf712c000 + 0x004), 0x8000); 369 mmio_write_32((0xf712c000 + 0x004), 0); 370 371 data = mmio_read_32((0xf712c000 + 0x0d0)); 372 data &= ~0xf0000000; 373 data |= 0x40000000; 374 mmio_write_32((0xf712c000 + 0x0d0), data); 375 mmio_write_32((0xf712c000 + 0x004), 0x101); 376 do { 377 data = mmio_read_32((0xf712c000 + 0x004)); 378 } while (data & 1); 379 380 data = mmio_read_32((0xf712c000 + 0x008)); 381 rdet = data & 0x100; 382 if (rdet) { 383 INFO("rdet ds fail\n"); 384 mmio_write_32((0xf712c000 + 0x008), 0x100); 385 } 386 bdl[0]++; 387 bdl[1]++; 388 bdl[2]++; 389 bdl[3]++; 390 } while (rdet); 391 392 data = mmio_read_32((0xf712c000 + 0x0d0)); 393 data &= ~0xf0000000; 394 data |= 0x30000000; 395 mmio_write_32((0xf712c000 + 0x0d0), data); 396 397 mmio_write_32((0xf712c000 + 0x004), 0x101); 398 do { 399 data = mmio_read_32((0xf712c000 + 0x004)); 400 } while (data & 1); 401 data = mmio_read_32((0xf712c000 + 0x008)); 402 if (data & 0x100) 403 INFO("rdet rbs av fail\n"); 404 } 405 406 static void ddrx_wdet(void) 407 { 408 unsigned int data, wdet, zero_bdl = 0, dq[4]; 409 int i; 410 411 data = mmio_read_32((0xf712c000 + 0x0d0)); 412 data &= ~0xf; 413 data |= 0xf; 414 mmio_write_32((0xf712c000 + 0x0d0), data); 415 416 data = mmio_read_32((0xf712c000 + 0x070)); 417 data |= 0x80000; 418 mmio_write_32((0xf712c000 + 0x070), data); 419 data = mmio_read_32((0xf712c000 + 0x070)); 420 data &= ~0x80000; 421 mmio_write_32((0xf712c000 + 0x070), data); 422 423 mmio_write_32((0xf712c000 + 0x004), 0x8000); 424 mmio_write_32((0xf712c000 + 0x004), 0); 425 data = mmio_read_32((0xf712c000 + 0x0d0)); 426 data &= ~0xf000; 427 data |= 0x8000; 428 mmio_write_32((0xf712c000 + 0x0d0), data); 429 mmio_write_32((0xf712c000 + 0x004), 0x201); 430 do { 431 data = mmio_read_32((0xf712c000 + 0x004)); 432 } while (data & 1); 433 data = mmio_read_32((0xf712c000 + 0x008)); 434 if (data & 0x200) 435 INFO("wdet lbs fail\n"); 436 437 dq[0] = mmio_read_32((0xf712c000 + 0x234)) & 0x1f00; 438 dq[1] = mmio_read_32((0xf712c000 + 0x2b4)) & 0x1f00; 439 dq[2] = mmio_read_32((0xf712c000 + 0x334)) & 0x1f00; 440 dq[3] = mmio_read_32((0xf712c000 + 0x3b4)) & 0x1f00; 441 442 do { 443 mmio_write_32((0xf712c000 + 0x234), dq[0]); 444 mmio_write_32((0xf712c000 + 0x2b4), dq[1]); 445 mmio_write_32((0xf712c000 + 0x334), dq[2]); 446 mmio_write_32((0xf712c000 + 0x3b4), dq[3]); 447 448 data = mmio_read_32((0xf712c000 + 0x070)); 449 data |= 0x80000; 450 mmio_write_32((0xf712c000 + 0x070), data); 451 data = mmio_read_32((0xf712c000 + 0x070)); 452 data &= ~0x80000; 453 mmio_write_32((0xf712c000 + 0x070), data); 454 mmio_write_32((0xf712c000 + 0x004), 0x8000); 455 mmio_write_32((0xf712c000 + 0x004), 0); 456 457 data = mmio_read_32((0xf712c000 + 0x0d0)); 458 data &= ~0xf000; 459 data |= 0x4000; 460 mmio_write_32((0xf712c000 + 0x0d0), data); 461 mmio_write_32((0xf712c000 + 0x004), 0x201); 462 do { 463 data = mmio_read_32((0xf712c000 + 0x004)); 464 } while (data & 1); 465 466 data = mmio_read_32((0xf712c000 + 0x008)); 467 wdet = data & 0x200; 468 if (wdet) { 469 INFO("wdet ds fail\n"); 470 mmio_write_32((0xf712c000 + 0x008), 0x200); 471 } 472 mdelay(10); 473 474 for (i = 0; i < 4; i++) { 475 data = mmio_read_32((0xf712c000 + 0x210 + i * 0x80)); 476 if ((!(data & 0x1f)) || (!(data & 0x1f00)) || 477 (!(data & 0x1f0000)) || (!(data & 0x1f000000))) 478 zero_bdl = 1; 479 data = mmio_read_32((0xf712c000 + 0x214 + i * 0x80)); 480 if ((!(data & 0x1f)) || (!(data & 0x1f00)) || 481 (!(data & 0x1f0000)) || (!(data & 0x1f000000))) 482 zero_bdl = 1; 483 data = mmio_read_32((0xf712c000 + 0x218 + i * 0x80)); 484 if (!(data & 0x1f)) 485 zero_bdl = 1; 486 if (zero_bdl) { 487 if (i == 0) 488 dq[0] = dq[0] - 0x100; 489 if (i == 1) 490 dq[1] = dq[1] - 0x100; 491 if (i == 2) 492 dq[2] = dq[2] - 0x100; 493 if (i == 3) 494 dq[3] = dq[3] - 0x100; 495 } 496 } 497 } while (wdet); 498 499 data = mmio_read_32((0xf712c000 + 0x0d0)); 500 data &= ~0xf000; 501 data |= 0x3000; 502 mmio_write_32((0xf712c000 + 0x0d0), data); 503 mmio_write_32((0xf712c000 + 0x004), 0x201); 504 do { 505 data = mmio_read_32((0xf712c000 + 0x004)); 506 } while (data & 1); 507 data = mmio_read_32((0xf712c000 + 0x008)); 508 if (data & 0x200) 509 INFO("wdet rbs av fail\n"); 510 } 511 512 void set_ddrc_150mhz(void) 513 { 514 unsigned int data; 515 516 mmio_write_32((0xf7032000 + 0x580), 0x1); 517 mmio_write_32((0xf7032000 + 0x5a8), 0x7); 518 data = mmio_read_32((0xf7032000 + 0x104)); 519 data &= 0xfffffcff; 520 mmio_write_32((0xf7032000 + 0x104), data); 521 522 mmio_write_32((0xf7030000 + 0x050), 0x31); 523 mmio_write_32((0xf7030000 + 0x240), 0x5ffff); 524 mmio_write_32((0xf7030000 + 0x344), 0xf5ff); 525 mmio_write_32((0xf712c000 + 0x00c), 0x80000f0f); 526 mmio_write_32((0xf712c000 + 0x00c), 0xf0f); 527 mmio_write_32((0xf712c000 + 0x018), 0x7); 528 mmio_write_32((0xf712c000 + 0x090), 0x7200000); 529 mmio_write_32((0xf712c000 + 0x258), 0x720); 530 mmio_write_32((0xf712c000 + 0x2d8), 0x720); 531 mmio_write_32((0xf712c000 + 0x358), 0x720); 532 mmio_write_32((0xf712c000 + 0x3d8), 0x720); 533 mmio_write_32((0xf712c000 + 0x018), 0x7); 534 mmio_write_32((0xf712c000 + 0x0b0), 0xf00000f); 535 mmio_write_32((0xf712c000 + 0x0b4), 0xf); 536 mmio_write_32((0xf712c000 + 0x088), 0x3fff801); 537 mmio_write_32((0xf712c000 + 0x070), 0x8940000); 538 539 data = mmio_read_32((0xf712c000 + 0x078)); 540 data |= 4; 541 mmio_write_32((0xf712c000 + 0x078), data); 542 mmio_write_32((0xf712c000 + 0x01c), 0x8000080); 543 data = mmio_read_32((0xf712c000 + 0x020)); 544 data &= 0xfffffffe; 545 mmio_write_32((0xf712c000 + 0x020), data); 546 mmio_write_32((0xf712c000 + 0x1d4), 0xc0000); 547 mmio_write_32((0xf712c000 + 0x010), 0x500000f); 548 mmio_write_32((0xf712c000 + 0x014), 0x10); 549 data = mmio_read_32((0xf712c000 + 0x1e4)); 550 data &= 0xffffff00; 551 mmio_write_32((0xf712c000 + 0x1e4), data); 552 mmio_write_32((0xf712c000 + 0x030), 0x30c82355); 553 mmio_write_32((0xf712c000 + 0x034), 0x62112bb); 554 mmio_write_32((0xf712c000 + 0x038), 0x20041022); 555 mmio_write_32((0xf712c000 + 0x03c), 0x63177497); 556 mmio_write_32((0xf712c000 + 0x040), 0x3008407); 557 mmio_write_32((0xf712c000 + 0x064), 0x10483); 558 mmio_write_32((0xf712c000 + 0x068), 0xff0a0000); 559 data = mmio_read_32((0xf712c000 + 0x070)); 560 data &= 0xffff0000; 561 data |= 0x184; 562 mmio_write_32((0xf712c000 + 0x070), data); 563 data = mmio_read_32((0xf712c000 + 0x048)); 564 data &= 0xbfffffff; 565 mmio_write_32((0xf712c000 + 0x048), data); 566 data = mmio_read_32((0xf712c000 + 0x020)); 567 data &= ~0x10; 568 mmio_write_32((0xf712c000 + 0x020), data); 569 data = mmio_read_32((0xf712c000 + 0x080)); 570 data &= ~0x2000; 571 mmio_write_32((0xf712c000 + 0x080), data); 572 mmio_write_32((0xf712c000 + 0x270), 0x3); 573 mmio_write_32((0xf712c000 + 0x2f0), 0x3); 574 mmio_write_32((0xf712c000 + 0x370), 0x3); 575 mmio_write_32((0xf712c000 + 0x3f0), 0x3); 576 mmio_write_32((0xf712c000 + 0x048), 0x90420880); 577 578 mmio_write_32((0xf7128000 + 0x040), 0x0); 579 mmio_write_32((0xf712c000 + 0x004), 0x146d); 580 mmio_write_32((0xf7128000 + 0x050), 0x100123); 581 mmio_write_32((0xf7128000 + 0x060), 0x133); 582 mmio_write_32((0xf7128000 + 0x064), 0x133); 583 mmio_write_32((0xf7128000 + 0x200), 0xa1000); 584 585 mmio_write_32((0xf7128000 + 0x100), 0xb3290d08); 586 mmio_write_32((0xf7128000 + 0x104), 0x9621821); 587 mmio_write_32((0xf7128000 + 0x108), 0x45009023); 588 mmio_write_32((0xf7128000 + 0x10c), 0xaf44c145); 589 mmio_write_32((0xf7128000 + 0x110), 0x10b00000); 590 mmio_write_32((0xf7128000 + 0x114), 0x11080806); 591 mmio_write_32((0xf7128000 + 0x118), 0x44); 592 do { 593 data = mmio_read_32((0xf712c000 + 0x004)); 594 } while (data & 1); 595 data = mmio_read_32((0xf712c000 + 0x008)); 596 if (data & 8) { 597 NOTICE("fail to init ddr3 rank0\n"); 598 return; 599 } 600 601 data = mmio_read_32((0xf712c000 + 0x048)); 602 data |= 1; 603 mmio_write_32((0xf712c000 + 0x048), data); 604 mmio_write_32((0xf712c000 + 0x004), 0x21); 605 do { 606 data = mmio_read_32((0xf712c000 + 0x004)); 607 } while (data & 1); 608 609 data = mmio_read_32((0xf712c000 + 0x008)); 610 if (data & 0x8) 611 NOTICE("ddr3 rank1 init failure\n"); 612 else 613 INFO("ddr3 rank1 init pass\n"); 614 615 data = mmio_read_32((0xf712c000 + 0x048)); 616 data &= ~0xf; 617 mmio_write_32((0xf712c000 + 0x048), data); 618 INFO("succeed to set ddrc 150mhz\n"); 619 } 620 621 void set_ddrc_266mhz(void) 622 { 623 unsigned int data; 624 625 mmio_write_32((0xf7032000 + 0x580), 0x3); 626 mmio_write_32((0xf7032000 + 0x5a8), 0x1003); 627 data = mmio_read_32((0xf7032000 + 0x104)); 628 data &= 0xfffffcff; 629 mmio_write_32((0xf7032000 + 0x104), data); 630 631 mmio_write_32((0xf7030000 + 0x050), 0x31); 632 mmio_write_32((0xf7030000 + 0x240), 0x5ffff); 633 mmio_write_32((0xf7030000 + 0x344), 0xf5ff); 634 mmio_write_32((0xf712c000 + 0x00c), 0x80000f0f); 635 mmio_write_32((0xf712c000 + 0x00c), 0xf0f); 636 mmio_write_32((0xf712c000 + 0x018), 0x7); 637 mmio_write_32((0xf712c000 + 0x090), 0x7200000); 638 mmio_write_32((0xf712c000 + 0x258), 0x720); 639 mmio_write_32((0xf712c000 + 0x2d8), 0x720); 640 mmio_write_32((0xf712c000 + 0x358), 0x720); 641 mmio_write_32((0xf712c000 + 0x3d8), 0x720); 642 mmio_write_32((0xf712c000 + 0x018), 0x7); 643 mmio_write_32((0xf712c000 + 0x0b0), 0xf00000f); 644 mmio_write_32((0xf712c000 + 0x0b4), 0xf); 645 mmio_write_32((0xf712c000 + 0x088), 0x3fff801); 646 mmio_write_32((0xf712c000 + 0x070), 0x8940000); 647 648 data = mmio_read_32((0xf712c000 + 0x078)); 649 data |= 4; 650 mmio_write_32((0xf712c000 + 0x078), data); 651 mmio_write_32((0xf712c000 + 0x01c), 0x8000080); 652 data = mmio_read_32((0xf712c000 + 0x020)); 653 data &= 0xfffffffe; 654 mmio_write_32((0xf712c000 + 0x020), data); 655 mmio_write_32((0xf712c000 + 0x1d4), 0xc0000); 656 mmio_write_32((0xf712c000 + 0x010), 0x500000f); 657 mmio_write_32((0xf712c000 + 0x014), 0x10); 658 data = mmio_read_32((0xf712c000 + 0x1e4)); 659 data &= 0xffffff00; 660 mmio_write_32((0xf712c000 + 0x1e4), data); 661 mmio_write_32((0xf712c000 + 0x030), 0x510d4455); 662 mmio_write_32((0xf712c000 + 0x034), 0x8391ebb); 663 mmio_write_32((0xf712c000 + 0x038), 0x2005103c); 664 mmio_write_32((0xf712c000 + 0x03c), 0x6329950b); 665 mmio_write_32((0xf712c000 + 0x040), 0x300858c); 666 mmio_write_32((0xf712c000 + 0x064), 0x10483); 667 mmio_write_32((0xf712c000 + 0x068), 0xff0a0000); 668 data = mmio_read_32((0xf712c000 + 0x070)); 669 data &= 0xffff0000; 670 data |= 0x184; 671 mmio_write_32((0xf712c000 + 0x070), data); 672 data = mmio_read_32((0xf712c000 + 0x048)); 673 data &= 0xbfffffff; 674 mmio_write_32((0xf712c000 + 0x048), data); 675 data = mmio_read_32((0xf712c000 + 0x020)); 676 data &= ~0x10; 677 mmio_write_32((0xf712c000 + 0x020), data); 678 data = mmio_read_32((0xf712c000 + 0x080)); 679 data &= ~0x2000; 680 mmio_write_32((0xf712c000 + 0x080), data); 681 mmio_write_32((0xf712c000 + 0x270), 0x3); 682 mmio_write_32((0xf712c000 + 0x2f0), 0x3); 683 mmio_write_32((0xf712c000 + 0x370), 0x3); 684 mmio_write_32((0xf712c000 + 0x3f0), 0x3); 685 mmio_write_32((0xf712c000 + 0x048), 0x90420880); 686 687 mmio_write_32((0xf7128000 + 0x040), 0x0); 688 mmio_write_32((0xf712c000 + 0x004), 0x146d); 689 mmio_write_32((0xf7128000 + 0x050), 0x100123); 690 mmio_write_32((0xf7128000 + 0x060), 0x133); 691 mmio_write_32((0xf7128000 + 0x064), 0x133); 692 mmio_write_32((0xf7128000 + 0x200), 0xa1000); 693 694 mmio_write_32((0xf7128000 + 0x100), 0xb441d50d); 695 mmio_write_32((0xf7128000 + 0x104), 0xf721839); 696 mmio_write_32((0xf7128000 + 0x108), 0x5500f03f); 697 mmio_write_32((0xf7128000 + 0x10c), 0xaf486145); 698 mmio_write_32((0xf7128000 + 0x110), 0x10b00000); 699 mmio_write_32((0xf7128000 + 0x114), 0x12080d06); 700 mmio_write_32((0xf7128000 + 0x118), 0x44); 701 do { 702 data = mmio_read_32((0xf712c000 + 0x004)); 703 } while (data & 1); 704 data = mmio_read_32((0xf712c000 + 0x008)); 705 if (data & 8) { 706 NOTICE("fail to init ddr3 rank0\n"); 707 return; 708 } 709 710 data = mmio_read_32((0xf712c000 + 0x048)); 711 data |= 1; 712 mmio_write_32((0xf712c000 + 0x048), data); 713 mmio_write_32((0xf712c000 + 0x004), 0x21); 714 do { 715 data = mmio_read_32((0xf712c000 + 0x004)); 716 } while (data & 1); 717 718 data = mmio_read_32((0xf712c000 + 0x008)); 719 if (data & 0x8) 720 NOTICE("ddr3 rank1 init failure\n"); 721 else 722 INFO("ddr3 rank1 init pass\n"); 723 724 data = mmio_read_32((0xf712c000 + 0x048)); 725 data &= ~0xf; 726 mmio_write_32((0xf712c000 + 0x048), data); 727 INFO("succeed to set ddrc 266mhz\n"); 728 } 729 730 void set_ddrc_400mhz(void) 731 { 732 unsigned int data; 733 734 mmio_write_32((0xf7032000 + 0x580), 0x2); 735 mmio_write_32((0xf7032000 + 0x5a8), 0x1003); 736 data = mmio_read_32((0xf7032000 + 0x104)); 737 data &= 0xfffffcff; 738 mmio_write_32((0xf7032000 + 0x104), data); 739 740 mmio_write_32((0xf7030000 + 0x050), 0x31); 741 mmio_write_32((0xf7030000 + 0x240), 0x5ffff); 742 mmio_write_32((0xf7030000 + 0x344), 0xf5ff); 743 mmio_write_32((0xf712c000 + 0x00c), 0x80000f0f); 744 mmio_write_32((0xf712c000 + 0x00c), 0xf0f); 745 mmio_write_32((0xf712c000 + 0x018), 0x7); 746 mmio_write_32((0xf712c000 + 0x090), 0x7200000); 747 mmio_write_32((0xf712c000 + 0x258), 0x720); 748 mmio_write_32((0xf712c000 + 0x2d8), 0x720); 749 mmio_write_32((0xf712c000 + 0x358), 0x720); 750 mmio_write_32((0xf712c000 + 0x3d8), 0x720); 751 mmio_write_32((0xf712c000 + 0x018), 0x7); 752 mmio_write_32((0xf712c000 + 0x0b0), 0xf00000f); 753 mmio_write_32((0xf712c000 + 0x0b4), 0xf); 754 mmio_write_32((0xf712c000 + 0x088), 0x3fff801); 755 mmio_write_32((0xf712c000 + 0x070), 0x8940000); 756 757 data = mmio_read_32((0xf712c000 + 0x078)); 758 data |= 4; 759 mmio_write_32((0xf712c000 + 0x078), data); 760 mmio_write_32((0xf712c000 + 0x01c), 0x8000080); 761 data = mmio_read_32((0xf712c000 + 0x020)); 762 data &= 0xfffffffe; 763 mmio_write_32((0xf712c000 + 0x020), data); 764 mmio_write_32((0xf712c000 + 0x1d4), 0xc0000); 765 mmio_write_32((0xf712c000 + 0x010), 0x500000f); 766 mmio_write_32((0xf712c000 + 0x014), 0x10); 767 data = mmio_read_32((0xf712c000 + 0x1e4)); 768 data &= 0xffffff00; 769 mmio_write_32((0xf712c000 + 0x1e4), data); 770 mmio_write_32((0xf712c000 + 0x030), 0x75525655); 771 mmio_write_32((0xf712c000 + 0x034), 0xa552abb); 772 mmio_write_32((0xf712c000 + 0x038), 0x20071059); 773 mmio_write_32((0xf712c000 + 0x03c), 0x633e8591); 774 mmio_write_32((0xf712c000 + 0x040), 0x3008691); 775 mmio_write_32((0xf712c000 + 0x064), 0x10483); 776 mmio_write_32((0xf712c000 + 0x068), 0xff0a0000); 777 data = mmio_read_32((0xf712c000 + 0x070)); 778 data &= 0xffff0000; 779 data |= 0x184; 780 mmio_write_32((0xf712c000 + 0x070), data); 781 data = mmio_read_32((0xf712c000 + 0x048)); 782 data &= 0xbfffffff; 783 mmio_write_32((0xf712c000 + 0x048), data); 784 data = mmio_read_32((0xf712c000 + 0x020)); 785 data &= ~0x10; 786 mmio_write_32((0xf712c000 + 0x020), data); 787 data = mmio_read_32((0xf712c000 + 0x080)); 788 data &= ~0x2000; 789 mmio_write_32((0xf712c000 + 0x080), data); 790 mmio_write_32((0xf712c000 + 0x270), 0x3); 791 mmio_write_32((0xf712c000 + 0x2f0), 0x3); 792 mmio_write_32((0xf712c000 + 0x370), 0x3); 793 mmio_write_32((0xf712c000 + 0x3f0), 0x3); 794 mmio_write_32((0xf712c000 + 0x048), 0x90420880); 795 796 mmio_write_32((0xf7128000 + 0x040), 0x0); 797 mmio_write_32((0xf712c000 + 0x004), 0x146d); 798 mmio_write_32((0xf7128000 + 0x050), 0x100123); 799 mmio_write_32((0xf7128000 + 0x060), 0x133); 800 mmio_write_32((0xf7128000 + 0x064), 0x133); 801 mmio_write_32((0xf7128000 + 0x200), 0xa1000); 802 803 mmio_write_32((0xf7128000 + 0x100), 0xb55a9d12); 804 mmio_write_32((0xf7128000 + 0x104), 0x17721855); 805 mmio_write_32((0xf7128000 + 0x108), 0x7501505f); 806 mmio_write_32((0xf7128000 + 0x10c), 0xaf4ca245); 807 mmio_write_32((0xf7128000 + 0x110), 0x10b00000); 808 mmio_write_32((0xf7128000 + 0x114), 0x13081306); 809 mmio_write_32((0xf7128000 + 0x118), 0x44); 810 do { 811 data = mmio_read_32((0xf712c000 + 0x004)); 812 } while (data & 1); 813 data = mmio_read_32((0xf712c000 + 0x008)); 814 if (data & 8) { 815 NOTICE("fail to init ddr3 rank0\n"); 816 return; 817 } 818 819 data = mmio_read_32((0xf712c000 + 0x048)); 820 data |= 1; 821 mmio_write_32((0xf712c000 + 0x048), data); 822 mmio_write_32((0xf712c000 + 0x004), 0x21); 823 do { 824 data = mmio_read_32((0xf712c000 + 0x004)); 825 } while (data & 1); 826 827 data = mmio_read_32((0xf712c000 + 0x008)); 828 if (data & 0x8) 829 NOTICE("ddr3 rank1 init failure\n"); 830 else 831 INFO("ddr3 rank1 init pass\n"); 832 833 data = mmio_read_32((0xf712c000 + 0x048)); 834 data &= ~0xf; 835 mmio_write_32((0xf712c000 + 0x048), data); 836 INFO("succeed to set ddrc 400mhz\n"); 837 } 838 839 void set_ddrc_533mhz(void) 840 { 841 unsigned int data; 842 843 mmio_write_32((0xf7032000 + 0x580), 0x3); 844 mmio_write_32((0xf7032000 + 0x5a8), 0x11111); 845 data = mmio_read_32((0xf7032000 + 0x104)); 846 data |= 0x100; 847 mmio_write_32((0xf7032000 + 0x104), data); 848 849 mmio_write_32((0xf7030000 + 0x050), 0x30); 850 mmio_write_32((0xf7030000 + 0x240), 0x5ffff); 851 mmio_write_32((0xf7030000 + 0x344), 0xf5ff); 852 mmio_write_32((0xf712c000 + 0x00c), 0x400); 853 mmio_write_32((0xf712c000 + 0x00c), 0x400); 854 mmio_write_32((0xf712c000 + 0x018), 0x7); 855 mmio_write_32((0xf712c000 + 0x090), 0x6400000); 856 mmio_write_32((0xf712c000 + 0x258), 0x640); 857 mmio_write_32((0xf712c000 + 0x2d8), 0x640); 858 mmio_write_32((0xf712c000 + 0x358), 0x640); 859 mmio_write_32((0xf712c000 + 0x3d8), 0x640); 860 mmio_write_32((0xf712c000 + 0x018), 0x0); 861 mmio_write_32((0xf712c000 + 0x0b0), 0xf00000f); 862 mmio_write_32((0xf712c000 + 0x0b4), 0xf); 863 mmio_write_32((0xf712c000 + 0x088), 0x3fff801); 864 mmio_write_32((0xf712c000 + 0x070), 0x8940000); 865 866 data = mmio_read_32((0xf712c000 + 0x078)); 867 data |= 4; 868 mmio_write_32((0xf712c000 + 0x078), data); 869 mmio_write_32((0xf712c000 + 0x01c), 0x8000080); 870 data = mmio_read_32((0xf712c000 + 0x020)); 871 data &= 0xfffffffe; 872 mmio_write_32((0xf712c000 + 0x020), data); 873 mmio_write_32((0xf712c000 + 0x1d4), 0xc0000); 874 mmio_write_32((0xf712c000 + 0x010), 0x500000f); 875 mmio_write_32((0xf712c000 + 0x014), 0x10); 876 data = mmio_read_32((0xf712c000 + 0x1e4)); 877 data &= 0xffffff00; 878 mmio_write_32((0xf712c000 + 0x1e4), data); 879 mmio_write_32((0xf712c000 + 0x030), 0x9dd87855); 880 mmio_write_32((0xf712c000 + 0x034), 0xa7138bb); 881 mmio_write_32((0xf712c000 + 0x038), 0x20091477); 882 mmio_write_32((0xf712c000 + 0x03c), 0x84534e16); 883 mmio_write_32((0xf712c000 + 0x040), 0x3008817); 884 mmio_write_32((0xf712c000 + 0x064), 0x106c3); 885 mmio_write_32((0xf712c000 + 0x068), 0xff0a0000); 886 data = mmio_read_32((0xf712c000 + 0x070)); 887 data &= 0xffff0000; 888 data |= 0x305; 889 mmio_write_32((0xf712c000 + 0x070), data); 890 data = mmio_read_32((0xf712c000 + 0x048)); 891 data |= 0x40000000; 892 mmio_write_32((0xf712c000 + 0x048), data); 893 data = mmio_read_32((0xf712c000 + 0x020)); 894 data &= ~0x10; 895 mmio_write_32((0xf712c000 + 0x020), data); 896 data = mmio_read_32((0xf712c000 + 0x080)); 897 data &= ~0x2000; 898 mmio_write_32((0xf712c000 + 0x080), data); 899 mmio_write_32((0xf712c000 + 0x270), 0x3); 900 mmio_write_32((0xf712c000 + 0x2f0), 0x3); 901 mmio_write_32((0xf712c000 + 0x370), 0x3); 902 mmio_write_32((0xf712c000 + 0x3f0), 0x3); 903 mmio_write_32((0xf712c000 + 0x048), 0xd0420900); 904 905 mmio_write_32((0xf7128000 + 0x040), 0x0); 906 mmio_write_32((0xf712c000 + 0x004), 0x140f); 907 do { 908 data = mmio_read_32((0xf712c000 + 0x004)); 909 } while (data & 1); 910 data = mmio_read_32((0xf712c000 + 0x008)); 911 if (data & 0x7fe) { 912 NOTICE("failed to init lpddr3 rank0 dram phy\n"); 913 return; 914 } 915 cat_533mhz_800mhz(); 916 917 mmio_write_32((0xf712c000 + 0x004), 0xf1); 918 mmio_write_32((0xf7128000 + 0x050), 0x100123); 919 mmio_write_32((0xf7128000 + 0x060), 0x133); 920 mmio_write_32((0xf7128000 + 0x064), 0x133); 921 mmio_write_32((0xf7128000 + 0x200), 0xa1000); 922 923 mmio_write_32((0xf7128000 + 0x100), 0xb77b6718); 924 mmio_write_32((0xf7128000 + 0x104), 0x1e82a071); 925 mmio_write_32((0xf7128000 + 0x108), 0x9501c07e); 926 mmio_write_32((0xf7128000 + 0x10c), 0xaf50c255); 927 mmio_write_32((0xf7128000 + 0x110), 0x10b00000); 928 mmio_write_32((0xf7128000 + 0x114), 0x13181908); 929 mmio_write_32((0xf7128000 + 0x118), 0x44); 930 do { 931 data = mmio_read_32((0xf712c000 + 0x004)); 932 } while (data & 1); 933 data = mmio_read_32((0xf712c000 + 0x008)); 934 if (data & 0x7fe) { 935 NOTICE("fail to init ddr3 rank0\n"); 936 return; 937 } 938 ddrx_rdet(); 939 ddrx_wdet(); 940 941 data = mmio_read_32((0xf712c000 + 0x048)); 942 data |= 1; 943 mmio_write_32((0xf712c000 + 0x048), data); 944 mmio_write_32((0xf712c000 + 0x004), 0x21); 945 do { 946 data = mmio_read_32((0xf712c000 + 0x004)); 947 } while (data & 1); 948 949 data = mmio_read_32((0xf712c000 + 0x008)); 950 if (data & 0x7fe) 951 NOTICE("ddr3 rank1 init failure\n"); 952 else 953 INFO("ddr3 rank1 init pass\n"); 954 955 data = mmio_read_32((0xf712c000 + 0x048)); 956 data &= ~0xf; 957 mmio_write_32((0xf712c000 + 0x048), data); 958 INFO("succeed to set ddrc 533mhz\n"); 959 } 960 961 void set_ddrc_800mhz(void) 962 { 963 unsigned int data; 964 965 mmio_write_32((0xf7032000 + 0x580), 0x2); 966 mmio_write_32((0xf7032000 + 0x5a8), 0x1003); 967 data = mmio_read_32((0xf7032000 + 0x104)); 968 data &= 0xfffffcff; 969 mmio_write_32((0xf7032000 + 0x104), data); 970 971 mmio_write_32((0xf7030000 + 0x050), 0x30); 972 mmio_write_32((0xf7030000 + 0x240), 0x5ffff); 973 mmio_write_32((0xf7030000 + 0x344), 0xf5ff); 974 mmio_write_32((0xf712c000 + 0x00c), 0x400); 975 mmio_write_32((0xf712c000 + 0x00c), 0x400); 976 mmio_write_32((0xf712c000 + 0x018), 0x7); 977 mmio_write_32((0xf712c000 + 0x090), 0x5400000); 978 mmio_write_32((0xf712c000 + 0x258), 0x540); 979 mmio_write_32((0xf712c000 + 0x2d8), 0x540); 980 mmio_write_32((0xf712c000 + 0x358), 0x540); 981 mmio_write_32((0xf712c000 + 0x3d8), 0x540); 982 mmio_write_32((0xf712c000 + 0x018), 0x0); 983 mmio_write_32((0xf712c000 + 0x0b0), 0xf00000f); 984 mmio_write_32((0xf712c000 + 0x0b4), 0xf); 985 mmio_write_32((0xf712c000 + 0x088), 0x3fff801); 986 mmio_write_32((0xf712c000 + 0x070), 0x8940000); 987 988 data = mmio_read_32((0xf712c000 + 0x078)); 989 data |= 4; 990 mmio_write_32((0xf712c000 + 0x078), data); 991 mmio_write_32((0xf712c000 + 0x01c), 0x8000080); 992 data = mmio_read_32((0xf712c000 + 0x020)); 993 data &= 0xfffffffe; 994 mmio_write_32((0xf712c000 + 0x020), data); 995 mmio_write_32((0xf712c000 + 0x1d4), 0xc0000); 996 mmio_write_32((0xf712c000 + 0x010), 0x500000f); 997 mmio_write_32((0xf712c000 + 0x014), 0x10); 998 data = mmio_read_32((0xf712c000 + 0x1e4)); 999 data &= 0xffffff00; 1000 mmio_write_32((0xf712c000 + 0x1e4), data); 1001 mmio_write_32((0xf712c000 + 0x030), 0xe663ab77); 1002 mmio_write_32((0xf712c000 + 0x034), 0xea952db); 1003 mmio_write_32((0xf712c000 + 0x038), 0x200d1cb1); 1004 mmio_write_32((0xf712c000 + 0x03c), 0xc67d0721); 1005 mmio_write_32((0xf712c000 + 0x040), 0x3008aa1); 1006 mmio_write_32((0xf712c000 + 0x064), 0x11a43); 1007 mmio_write_32((0xf712c000 + 0x068), 0xff0a0000); 1008 data = mmio_read_32((0xf712c000 + 0x070)); 1009 data &= 0xffff0000; 1010 data |= 0x507; 1011 mmio_write_32((0xf712c000 + 0x070), data); 1012 data = mmio_read_32((0xf712c000 + 0x048)); 1013 data |= 0x40000000; 1014 mmio_write_32((0xf712c000 + 0x048), data); 1015 data = mmio_read_32((0xf712c000 + 0x020)); 1016 data &= 0xffffffef; 1017 mmio_write_32((0xf712c000 + 0x020), data); 1018 data = mmio_read_32((0xf712c000 + 0x080)); 1019 data &= 0xffffdfff; 1020 mmio_write_32((0xf712c000 + 0x080), data); 1021 mmio_write_32((0xf712c000 + 0x270), 0x3); 1022 mmio_write_32((0xf712c000 + 0x2f0), 0x3); 1023 mmio_write_32((0xf712c000 + 0x370), 0x3); 1024 mmio_write_32((0xf712c000 + 0x3f0), 0x3); 1025 mmio_write_32((0xf712c000 + 0x048), 0xd0420900); 1026 1027 mmio_write_32((0xf7128000 + 0x040), 0x2001); 1028 mmio_write_32((0xf712c000 + 0x004), 0x140f); 1029 do { 1030 data = mmio_read_32((0xf712c000 + 0x004)); 1031 } while (data & 1); 1032 data = mmio_read_32((0xf712c000 + 0x008)); 1033 if (data & 0x7fe) { 1034 WARN("failed to init lpddr3 rank0 dram phy\n"); 1035 return; 1036 } 1037 cat_533mhz_800mhz(); 1038 1039 mmio_write_32((0xf712c000 + 0x004), 0xf1); 1040 mmio_write_32((0xf7128000 + 0x050), 0x100023); 1041 mmio_write_32((0xf7128000 + 0x060), 0x133); 1042 mmio_write_32((0xf7128000 + 0x064), 0x133); 1043 mmio_write_32((0xf7128000 + 0x200), 0xa1000); 1044 1045 mmio_write_32((0xf7128000 + 0x100), 0x755a9d12); 1046 mmio_write_32((0xf7128000 + 0x104), 0x1753b055); 1047 mmio_write_32((0xf7128000 + 0x108), 0x7401505f); 1048 mmio_write_32((0xf7128000 + 0x10c), 0x578ca244); 1049 mmio_write_32((0xf7128000 + 0x110), 0x10700000); 1050 mmio_write_32((0xf7128000 + 0x114), 0x13141306); 1051 mmio_write_32((0xf7128000 + 0x118), 0x44); 1052 do { 1053 data = mmio_read_32((0xf712c000 + 0x004)); 1054 } while (data & 1); 1055 data = mmio_read_32((0xf712c000 + 0x008)); 1056 if (data & 0x7fe) { 1057 NOTICE("fail to init ddr3 rank0\n"); 1058 return; 1059 } 1060 ddrx_rdet(); 1061 ddrx_wdet(); 1062 1063 data = mmio_read_32((0xf712c000 + 0x048)); 1064 data |= 1; 1065 mmio_write_32((0xf712c000 + 0x048), data); 1066 mmio_write_32((0xf712c000 + 0x004), 0x21); 1067 do { 1068 data = mmio_read_32((0xf712c000 + 0x004)); 1069 } while (data & 1); 1070 1071 data = mmio_read_32((0xf712c000 + 0x008)); 1072 if (data & 0x7fe) 1073 NOTICE("ddr3 rank1 init failure\n"); 1074 else 1075 INFO("ddr3 rank1 init pass\n"); 1076 1077 data = mmio_read_32((0xf712c000 + 0x048)); 1078 data &= ~0xf; 1079 mmio_write_32((0xf712c000 + 0x048), data); 1080 INFO("succeed to set ddrc 800mhz\n"); 1081 } 1082 1083 static void ddrc_common_init(int freq) 1084 { 1085 unsigned int data; 1086 1087 mmio_write_32((0xf7120000 + 0x020), 0x1); 1088 mmio_write_32((0xf7120000 + 0x100), 0x1700); 1089 mmio_write_32((0xf7120000 + 0x104), 0x71040004); 1090 mmio_write_32((0xf7121400 + 0x104), 0xf); 1091 mmio_write_32((0xf7121800 + 0x104), 0xf); 1092 mmio_write_32((0xf7121c00 + 0x104), 0xf); 1093 mmio_write_32((0xf7122000 + 0x104), 0xf); 1094 mmio_write_32((0xf7128000 + 0x02c), 0x6); 1095 mmio_write_32((0xf7128000 + 0x020), 0x30003); 1096 mmio_write_32((0xf7128000 + 0x028), 0x310201); 1097 mmio_write_32((0xf712c000 + 0x1e4), 0xfe007600); 1098 mmio_write_32((0xf7128000 + 0x01c), 0xaf001); 1099 1100 1101 data = mmio_read_32((0xf7128000 + 0x280)); 1102 data |= 1 << 7; 1103 mmio_write_32((0xf7128000 + 0x280), data); 1104 mmio_write_32((0xf7128000 + 0x244), 0x3); 1105 1106 if (freq == DDR_FREQ_800M) 1107 mmio_write_32((0xf7128000 + 0x240), 167 * (freq / 2) / 1024); 1108 else 1109 mmio_write_32((0xf7128000 + 0x240), 167 * freq / 1024); 1110 1111 data = mmio_read_32((0xf712c000 + 0x080)); 1112 data &= 0xffff; 1113 data |= 0x4002000; 1114 mmio_write_32((0xf712c000 + 0x080), data); 1115 mmio_write_32((0xf7128000 + 0x000), 0x0); 1116 do { 1117 data = mmio_read_32((0xf7128000 + 0x294)); 1118 } while (data & 1); 1119 mmio_write_32((0xf7128000 + 0x000), 0x2); 1120 } 1121 1122 1123 static int dienum_det_and_rowcol_cfg(void) 1124 { 1125 unsigned int data; 1126 1127 mmio_write_32((0xf7128000 + 0x210), 0x87); 1128 mmio_write_32((0xf7128000 + 0x218), 0x10000); 1129 mmio_write_32((0xf7128000 + 0x00c), 0x1); 1130 do { 1131 data = mmio_read_32((0xf7128000 + 0x00c)); 1132 } while (data & 1); 1133 data = mmio_read_32((0xf7128000 + 0x4a8)) & 0xfc; 1134 switch (data) { 1135 case 0x18: 1136 mmio_write_32((0xf7128000 + 0x060), 0x132); 1137 mmio_write_32((0xf7128000 + 0x064), 0x132); 1138 mmio_write_32((0xf7120000 + 0x100), 0x1600); 1139 mmio_write_32((0xf7120000 + 0x104), 0x71040004); 1140 break; 1141 case 0x1c: 1142 mmio_write_32((0xf7128000 + 0x060), 0x142); 1143 mmio_write_32((0xf7128000 + 0x064), 0x142); 1144 mmio_write_32((0xf7120000 + 0x100), 0x1700); 1145 mmio_write_32((0xf7120000 + 0x104), 0x71040004); 1146 break; 1147 case 0x58: 1148 mmio_write_32((0xf7128000 + 0x060), 0x133); 1149 mmio_write_32((0xf7128000 + 0x064), 0x133); 1150 mmio_write_32((0xf7120000 + 0x100), 0x1700); 1151 mmio_write_32((0xf7120000 + 0x104), 0x71040004); 1152 break; 1153 default: 1154 break; 1155 } 1156 if (!data) 1157 return -EINVAL; 1158 return 0; 1159 } 1160 1161 static int detect_ddr_chip_info(void) 1162 { 1163 unsigned int data, mr5, mr6, mr7; 1164 1165 mmio_write_32((0xf7128000 + 0x210), 0x57); 1166 mmio_write_32((0xf7128000 + 0x218), 0x10000); 1167 mmio_write_32((0xf7128000 + 0x00c), 0x1); 1168 1169 do { 1170 data = mmio_read_32((0xf7128000 + 0x00c)); 1171 } while (data & 1); 1172 1173 data = mmio_read_32((0xf7128000 + 0x4a8)); 1174 mr5 = data & 0xff; 1175 switch (mr5) { 1176 case 1: 1177 INFO("Samsung DDR\n"); 1178 break; 1179 case 6: 1180 INFO("Hynix DDR\n"); 1181 break; 1182 case 3: 1183 INFO("Elpida DDR\n"); 1184 break; 1185 default: 1186 INFO("DDR from other vendors\n"); 1187 break; 1188 } 1189 1190 mmio_write_32((0xf7128000 + 0x210), 0x67); 1191 mmio_write_32((0xf7128000 + 0x218), 0x10000); 1192 mmio_write_32((0xf7128000 + 0x00c), 0x1); 1193 do { 1194 data = mmio_read_32((0xf7128000 + 0x00c)); 1195 } while (data & 1); 1196 data = mmio_read_32((0xf7128000 + 0x4a8)); 1197 mr6 = data & 0xff; 1198 mmio_write_32((0xf7128000 + 0x210), 0x77); 1199 mmio_write_32((0xf7128000 + 0x218), 0x10000); 1200 mmio_write_32((0xf7128000 + 0x00c), 0x1); 1201 do { 1202 data = mmio_read_32((0xf7128000 + 0x00c)); 1203 } while (data & 1); 1204 data = mmio_read_32((0xf7128000 + 0x4a8)); 1205 mr7 = data & 0xff; 1206 data = mr5 + (mr6 << 8) + (mr7 << 16); 1207 return data; 1208 } 1209 1210 void ddr_phy_reset(void) 1211 { 1212 mmio_write_32(0xf7030340, 0xa000); 1213 mmio_write_32(0xf7030344, 0xa000); 1214 } 1215 1216 int lpddr3_freq_init(int freq) 1217 { 1218 set_ddrc_150mhz(); 1219 if (freq > DDR_FREQ_150M) { 1220 ddr_phy_reset(); 1221 set_ddrc_266mhz(); 1222 } 1223 if (freq > DDR_FREQ_266M) { 1224 ddr_phy_reset(); 1225 set_ddrc_400mhz(); 1226 } 1227 if (freq > DDR_FREQ_400M) { 1228 ddr_phy_reset(); 1229 set_ddrc_533mhz(); 1230 } 1231 if (freq > DDR_FREQ_533M) { 1232 ddr_phy_reset(); 1233 set_ddrc_800mhz(); 1234 } 1235 return 0; 1236 } 1237 1238 static void init_ddr(int freq) 1239 { 1240 unsigned int data; 1241 int ret; 1242 1243 1244 data = mmio_read_32((0xf7032000 + 0x030)); 1245 data |= 1; 1246 mmio_write_32((0xf7032000 + 0x030), data); 1247 data = mmio_read_32((0xf7032000 + 0x010)); 1248 data |= 1; 1249 mmio_write_32((0xf7032000 + 0x010), data); 1250 1251 udelay(300); 1252 do { 1253 data = mmio_read_32((0xf7032000 + 0x030)); 1254 data &= 3 << 28; 1255 } while (data != (3 << 28)); 1256 do { 1257 data = mmio_read_32((0xf7032000 + 0x010)); 1258 data &= 3 << 28; 1259 } while (data != (3 << 28)); 1260 1261 ret = lpddr3_freq_init(freq); 1262 if (ret) 1263 return; 1264 } 1265 1266 static void init_ddrc_qos(void) 1267 { 1268 unsigned int port, data; 1269 1270 mmio_write_32((0xf7124000 + 0x088), 1); 1271 1272 port = 0; 1273 mmio_write_32((0xf7120000 + 0x200 + port * 0x10), 0x1210); 1274 mmio_write_32((0xf7120000 + 0x204 + port * 0x10), 0x11111111); 1275 mmio_write_32((0xf7120000 + 0x208 + port * 0x10), 0x11111111); 1276 mmio_write_32((0xf7120000 + 0x400 + 0 * 0x10), 0x001d0007); 1277 1278 for (port = 3; port <= 4; port++) { 1279 mmio_write_32((0xf7120000 + 0x200 + port * 0x10), 0x1210); 1280 mmio_write_32((0xf7120000 + 0x204 + port * 0x10), 0x77777777); 1281 mmio_write_32((0xf7120000 + 0x208 + port * 0x10), 0x77777777); 1282 } 1283 1284 port = 1; 1285 mmio_write_32((0xf7120000 + 0x200 + port * 0x10), 0x30000); 1286 mmio_write_32((0xf7120000 + 0x204 + port * 0x10), 0x1234567); 1287 mmio_write_32((0xf7120000 + 0x208 + port * 0x10), 0x1234567); 1288 1289 mmio_write_32((0xf7124000 + 0x1f0), 0); 1290 mmio_write_32((0xf7124000 + 0x0bc), 0x3020100); 1291 mmio_write_32((0xf7124000 + 0x0d0), 0x3020100); 1292 mmio_write_32((0xf7124000 + 0x1f4), 0x01000100); 1293 mmio_write_32((0xf7124000 + 0x08c + 0 * 4), 0xd0670402); 1294 mmio_write_32((0xf7124000 + 0x068 + 0 * 4), 0x31); 1295 mmio_write_32((0xf7124000 + 0x000), 0x7); 1296 1297 data = mmio_read_32((0xf7124000 + 0x09c)); 1298 data &= ~0xff0000; 1299 data |= 0x400000; 1300 mmio_write_32((0xf7124000 + 0x09c), data); 1301 data = mmio_read_32((0xf7124000 + 0x0ac)); 1302 data &= ~0xff0000; 1303 data |= 0x400000; 1304 mmio_write_32((0xf7124000 + 0x0ac), data); 1305 port = 2; 1306 mmio_write_32((0xf7120000 + 0x200 + port * 0x10), 0x30000); 1307 mmio_write_32((0xf7120000 + 0x204 + port * 0x10), 0x1234567); 1308 mmio_write_32((0xf7120000 + 0x208 + port * 0x10), 0x1234567); 1309 1310 1311 mmio_write_32((0xf7124000 + 0x09c), 0xff7fff); 1312 mmio_write_32((0xf7124000 + 0x0a0), 0xff); 1313 mmio_write_32((0xf7124000 + 0x0ac), 0xff7fff); 1314 mmio_write_32((0xf7124000 + 0x0b0), 0xff); 1315 mmio_write_32((0xf7124000 + 0x0bc), 0x3020100); 1316 mmio_write_32((0xf7124000 + 0x0d0), 0x3020100); 1317 } 1318 1319 void hikey_ddr_init(unsigned int ddr_freq) 1320 { 1321 uint32_t data; 1322 1323 assert((ddr_freq == DDR_FREQ_150M) || (ddr_freq == DDR_FREQ_266M) || 1324 (ddr_freq == DDR_FREQ_400M) || (ddr_freq == DDR_FREQ_533M) || 1325 (ddr_freq == DDR_FREQ_800M)); 1326 init_pll(); 1327 init_freq(); 1328 1329 init_ddr(ddr_freq); 1330 1331 ddrc_common_init(ddr_freq); 1332 dienum_det_and_rowcol_cfg(); 1333 detect_ddr_chip_info(); 1334 1335 if ((ddr_freq == DDR_FREQ_400M) || (ddr_freq == DDR_FREQ_800M)) { 1336 data = mmio_read_32(0xf7032000 + 0x010); 1337 data &= ~0x1; 1338 mmio_write_32(0xf7032000 + 0x010, data); 1339 } else if ((ddr_freq == DDR_FREQ_266M) || (ddr_freq == DDR_FREQ_533M)) { 1340 data = mmio_read_32(0xf7032000 + 0x030); 1341 data &= ~0x1; 1342 mmio_write_32(0xf7032000 + 0x030, data); 1343 } else { 1344 data = mmio_read_32(0xf7032000 + 0x010); 1345 data &= ~0x1; 1346 mmio_write_32(0xf7032000 + 0x010, data); 1347 data = mmio_read_32(0xf7032000 + 0x030); 1348 data &= ~0x1; 1349 mmio_write_32(0xf7032000 + 0x030, data); 1350 } 1351 dsb(); 1352 isb(); 1353 1354 /* 1355 * Test memory access. Do not use address 0x0 because the compiler 1356 * may assume it is not a valid address and generate incorrect code 1357 * (GCC 4.9.1 without -fno-delete-null-pointer-checks for instance). 1358 */ 1359 mmio_write_32(0x4, 0xa5a55a5a); 1360 INFO("ddr test value:0x%x\n", mmio_read_32(0x4)); 1361 init_ddrc_qos(); 1362 } 1363