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