1fe877779SCaesar Wang /* 2fe877779SCaesar Wang * Copyright (c) 2016, ARM Limited and Contributors. All rights reserved. 3fe877779SCaesar Wang * 4fe877779SCaesar Wang * Redistribution and use in source and binary forms, with or without 5fe877779SCaesar Wang * modification, are permitted provided that the following conditions are met: 6fe877779SCaesar Wang * 7fe877779SCaesar Wang * Redistributions of source code must retain the above copyright notice, this 8fe877779SCaesar Wang * list of conditions and the following disclaimer. 9fe877779SCaesar Wang * 10fe877779SCaesar Wang * Redistributions in binary form must reproduce the above copyright notice, 11fe877779SCaesar Wang * this list of conditions and the following disclaimer in the documentation 12fe877779SCaesar Wang * and/or other materials provided with the distribution. 13fe877779SCaesar Wang * 14fe877779SCaesar Wang * Neither the name of ARM nor the names of its contributors may be used 15fe877779SCaesar Wang * to endorse or promote products derived from this software without specific 16fe877779SCaesar Wang * prior written permission. 17fe877779SCaesar Wang * 18fe877779SCaesar Wang * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 19fe877779SCaesar Wang * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 20fe877779SCaesar Wang * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 21fe877779SCaesar Wang * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 22fe877779SCaesar Wang * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 23fe877779SCaesar Wang * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 24fe877779SCaesar Wang * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 25fe877779SCaesar Wang * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 26fe877779SCaesar Wang * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 27fe877779SCaesar Wang * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 28fe877779SCaesar Wang * POSSIBILITY OF SUCH DAMAGE. 29fe877779SCaesar Wang */ 30fe877779SCaesar Wang 31*613038bcSCaesar Wang #ifndef __SOC_ROCKCHIP_RK3399_DRAM_H__ 32*613038bcSCaesar Wang #define __SOC_ROCKCHIP_RK3399_DRAM_H__ 33*613038bcSCaesar Wang #include <plat_private.h> 34*613038bcSCaesar Wang #include <stdint.h> 35fe877779SCaesar Wang 36*613038bcSCaesar Wang #define CTL_BASE(ch) (0xffa80000 + (ch) * 0x8000) 37*613038bcSCaesar Wang #define CTL_REG(ch, n) (CTL_BASE(ch) + (n) * 0x4) 38*613038bcSCaesar Wang 39*613038bcSCaesar Wang #define PI_OFFSET 0x800 40*613038bcSCaesar Wang #define PI_BASE(ch) (CTL_BASE(ch) + PI_OFFSET) 41*613038bcSCaesar Wang #define PI_REG(ch, n) (PI_BASE(ch) + (n) * 0x4) 42*613038bcSCaesar Wang 43*613038bcSCaesar Wang #define PHY_OFFSET 0x2000 44*613038bcSCaesar Wang #define PHY_BASE(ch) (CTL_BASE(ch) + PHY_OFFSET) 45*613038bcSCaesar Wang #define PHY_REG(ch, n) (PHY_BASE(ch) + (n) * 0x4) 46*613038bcSCaesar Wang 47*613038bcSCaesar Wang #define MSCH_BASE(ch) (0xffa84000 + (ch) * 0x8000) 48*613038bcSCaesar Wang #define MSCH_ID_COREID 0x0 49*613038bcSCaesar Wang #define MSCH_ID_REVISIONID 0x4 50*613038bcSCaesar Wang #define MSCH_DEVICECONF 0x8 51*613038bcSCaesar Wang #define MSCH_DEVICESIZE 0xc 52*613038bcSCaesar Wang #define MSCH_DDRTIMINGA0 0x10 53*613038bcSCaesar Wang #define MSCH_DDRTIMINGB0 0x14 54*613038bcSCaesar Wang #define MSCH_DDRTIMINGC0 0x18 55*613038bcSCaesar Wang #define MSCH_DEVTODEV0 0x1c 56*613038bcSCaesar Wang #define MSCH_DDRMODE 0x110 57*613038bcSCaesar Wang #define MSCH_AGINGX0 0x1000 58*613038bcSCaesar Wang 59*613038bcSCaesar Wang #define CIC_CTRL0 0x0 60*613038bcSCaesar Wang #define CIC_CTRL1 0x4 61*613038bcSCaesar Wang #define CIC_IDLE_TH 0x8 62*613038bcSCaesar Wang #define CIC_CG_WAIT_TH 0xc 63*613038bcSCaesar Wang #define CIC_STATUS0 0x10 64*613038bcSCaesar Wang #define CIC_STATUS1 0x14 65*613038bcSCaesar Wang #define CIC_CTRL2 0x18 66*613038bcSCaesar Wang #define CIC_CTRL3 0x1c 67*613038bcSCaesar Wang #define CIC_CTRL4 0x20 68fe877779SCaesar Wang 69fe877779SCaesar Wang /* DENALI_CTL_00 */ 70*613038bcSCaesar Wang #define START 1 71fe877779SCaesar Wang 72fe877779SCaesar Wang /* DENALI_CTL_68 */ 73fe877779SCaesar Wang #define PWRUP_SREFRESH_EXIT (1 << 16) 74fe877779SCaesar Wang 75fe877779SCaesar Wang /* DENALI_CTL_274 */ 76*613038bcSCaesar Wang #define MEM_RST_VALID 1 77*613038bcSCaesar Wang 78*613038bcSCaesar Wang #define PHY_DRV_ODT_Hi_Z 0x0 79*613038bcSCaesar Wang #define PHY_DRV_ODT_240 0x1 80*613038bcSCaesar Wang #define PHY_DRV_ODT_120 0x8 81*613038bcSCaesar Wang #define PHY_DRV_ODT_80 0x9 82*613038bcSCaesar Wang #define PHY_DRV_ODT_60 0xc 83*613038bcSCaesar Wang #define PHY_DRV_ODT_48 0xd 84*613038bcSCaesar Wang #define PHY_DRV_ODT_40 0xe 85*613038bcSCaesar Wang #define PHY_DRV_ODT_34_3 0xf 86*613038bcSCaesar Wang 87*613038bcSCaesar Wang /* 88*613038bcSCaesar Wang * sys_reg bitfield struct 89*613038bcSCaesar Wang * [31] row_3_4_ch1 90*613038bcSCaesar Wang * [30] row_3_4_ch0 91*613038bcSCaesar Wang * [29:28] chinfo 92*613038bcSCaesar Wang * [27] rank_ch1 93*613038bcSCaesar Wang * [26:25] col_ch1 94*613038bcSCaesar Wang * [24] bk_ch1 95*613038bcSCaesar Wang * [23:22] cs0_row_ch1 96*613038bcSCaesar Wang * [21:20] cs1_row_ch1 97*613038bcSCaesar Wang * [19:18] bw_ch1 98*613038bcSCaesar Wang * [17:16] dbw_ch1; 99*613038bcSCaesar Wang * [15:13] ddrtype 100*613038bcSCaesar Wang * [12] channelnum 101*613038bcSCaesar Wang * [11] rank_ch0 102*613038bcSCaesar Wang * [10:9] col_ch0 103*613038bcSCaesar Wang * [8] bk_ch0 104*613038bcSCaesar Wang * [7:6] cs0_row_ch0 105*613038bcSCaesar Wang * [5:4] cs1_row_ch0 106*613038bcSCaesar Wang * [3:2] bw_ch0 107*613038bcSCaesar Wang * [1:0] dbw_ch0 108*613038bcSCaesar Wang */ 109*613038bcSCaesar Wang #define SYS_REG_ENC_ROW_3_4(n, ch) ((n) << (30 + (ch))) 110*613038bcSCaesar Wang #define SYS_REG_DEC_ROW_3_4(n, ch) (((n) >> (30 + (ch))) & 0x1) 111*613038bcSCaesar Wang #define SYS_REG_ENC_CHINFO(ch) (1 << (28 + (ch))) 112*613038bcSCaesar Wang #define SYS_REG_DEC_CHINFO(n, ch) (((n) >> (28 + (ch))) & 0x1) 113*613038bcSCaesar Wang #define SYS_REG_ENC_DDRTYPE(n) ((n) << 13) 114*613038bcSCaesar Wang #define SYS_REG_DEC_DDRTYPE(n) (((n) >> 13) & 0x7) 115*613038bcSCaesar Wang #define SYS_REG_ENC_NUM_CH(n) (((n) - 1) << 12) 116*613038bcSCaesar Wang #define SYS_REG_DEC_NUM_CH(n) (1 + (((n) >> 12) & 0x1)) 117*613038bcSCaesar Wang #define SYS_REG_ENC_RANK(n, ch) (((n) - 1) << (11 + (ch) * 16)) 118*613038bcSCaesar Wang #define SYS_REG_DEC_RANK(n, ch) (1 + (((n) >> (11 + (ch) * 16)) & 0x1)) 119*613038bcSCaesar Wang #define SYS_REG_ENC_COL(n, ch) (((n) - 9) << (9 + (ch) * 16)) 120*613038bcSCaesar Wang #define SYS_REG_DEC_COL(n, ch) (9 + (((n) >> (9 + (ch) * 16)) & 0x3)) 121*613038bcSCaesar Wang #define SYS_REG_ENC_BK(n, ch) (((n) == 3 ? 0 : 1) << (8 + (ch) * 16)) 122*613038bcSCaesar Wang #define SYS_REG_DEC_BK(n, ch) (3 - (((n) >> (8 + (ch) * 16)) & 0x1)) 123*613038bcSCaesar Wang #define SYS_REG_ENC_CS0_ROW(n, ch) (((n) - 13) << (6 + (ch) * 16)) 124*613038bcSCaesar Wang #define SYS_REG_DEC_CS0_ROW(n, ch) (13 + (((n) >> (6 + (ch) * 16)) & 0x3)) 125*613038bcSCaesar Wang #define SYS_REG_ENC_CS1_ROW(n, ch) (((n) - 13) << (4 + (ch) * 16)) 126*613038bcSCaesar Wang #define SYS_REG_DEC_CS1_ROW(n, ch) (13 + (((n) >> (4 + (ch) * 16)) & 0x3)) 127*613038bcSCaesar Wang #define SYS_REG_ENC_BW(n, ch) ((2 >> (n)) << (2 + (ch) * 16)) 128*613038bcSCaesar Wang #define SYS_REG_DEC_BW(n, ch) (2 >> (((n) >> (2 + (ch) * 16)) & 0x3)) 129*613038bcSCaesar Wang #define SYS_REG_ENC_DBW(n, ch) ((2 >> (n)) << (0 + (ch) * 16)) 130*613038bcSCaesar Wang #define SYS_REG_DEC_DBW(n, ch) (2 >> (((n) >> (0 + (ch) * 16)) & 0x3)) 131*613038bcSCaesar Wang #define DDR_STRIDE(n) mmio_write_32(SGRF_BASE + SGRF_SOC_CON3_7(4), \ 132*613038bcSCaesar Wang (0x1f<<(10+16))|((n)<<10)) 133*613038bcSCaesar Wang 134*613038bcSCaesar Wang #define CTL_REG_NUM 332 135*613038bcSCaesar Wang #define PHY_REG_NUM 959 136*613038bcSCaesar Wang #define PI_REG_NUM 200 137*613038bcSCaesar Wang 138*613038bcSCaesar Wang enum { 139*613038bcSCaesar Wang DDR3 = 3, 140*613038bcSCaesar Wang LPDDR2 = 5, 141*613038bcSCaesar Wang LPDDR3 = 6, 142*613038bcSCaesar Wang LPDDR4 = 7, 143*613038bcSCaesar Wang UNUSED = 0xff 144*613038bcSCaesar Wang }; 145fe877779SCaesar Wang 146fe877779SCaesar Wang struct rk3399_ddr_pctl_regs { 147*613038bcSCaesar Wang uint32_t denali_ctl[CTL_REG_NUM]; 148fe877779SCaesar Wang }; 149fe877779SCaesar Wang 150fe877779SCaesar Wang struct rk3399_ddr_publ_regs { 151*613038bcSCaesar Wang uint32_t denali_phy[PHY_REG_NUM]; 152fe877779SCaesar Wang }; 153fe877779SCaesar Wang 154fe877779SCaesar Wang struct rk3399_ddr_pi_regs { 155*613038bcSCaesar Wang uint32_t denali_pi[PI_REG_NUM]; 156fe877779SCaesar Wang }; 157fe877779SCaesar Wang union noc_ddrtiminga0 { 158fe877779SCaesar Wang uint32_t d32; 159fe877779SCaesar Wang struct { 160fe877779SCaesar Wang unsigned acttoact : 6; 161fe877779SCaesar Wang unsigned reserved0 : 2; 162fe877779SCaesar Wang unsigned rdtomiss : 6; 163fe877779SCaesar Wang unsigned reserved1 : 2; 164fe877779SCaesar Wang unsigned wrtomiss : 6; 165fe877779SCaesar Wang unsigned reserved2 : 2; 166fe877779SCaesar Wang unsigned readlatency : 8; 167fe877779SCaesar Wang } b; 168fe877779SCaesar Wang }; 169fe877779SCaesar Wang 170fe877779SCaesar Wang union noc_ddrtimingb0 { 171fe877779SCaesar Wang uint32_t d32; 172fe877779SCaesar Wang struct { 173fe877779SCaesar Wang unsigned rdtowr : 5; 174fe877779SCaesar Wang unsigned reserved0 : 3; 175fe877779SCaesar Wang unsigned wrtord : 5; 176fe877779SCaesar Wang unsigned reserved1 : 3; 177fe877779SCaesar Wang unsigned rrd : 4; 178fe877779SCaesar Wang unsigned reserved2 : 4; 179fe877779SCaesar Wang unsigned faw : 6; 180fe877779SCaesar Wang unsigned reserved3 : 2; 181fe877779SCaesar Wang } b; 182fe877779SCaesar Wang }; 183fe877779SCaesar Wang 184fe877779SCaesar Wang union noc_ddrtimingc0 { 185fe877779SCaesar Wang uint32_t d32; 186fe877779SCaesar Wang struct { 187fe877779SCaesar Wang unsigned burstpenalty : 4; 188fe877779SCaesar Wang unsigned reserved0 : 4; 189fe877779SCaesar Wang unsigned wrtomwr : 6; 190fe877779SCaesar Wang unsigned reserved1 : 18; 191fe877779SCaesar Wang } b; 192fe877779SCaesar Wang }; 193fe877779SCaesar Wang 194fe877779SCaesar Wang union noc_devtodev0 { 195fe877779SCaesar Wang uint32_t d32; 196fe877779SCaesar Wang struct { 197fe877779SCaesar Wang unsigned busrdtord : 3; 198fe877779SCaesar Wang unsigned reserved0 : 1; 199fe877779SCaesar Wang unsigned busrdtowr : 3; 200fe877779SCaesar Wang unsigned reserved1 : 1; 201fe877779SCaesar Wang unsigned buswrtord : 3; 202fe877779SCaesar Wang unsigned reserved2 : 1; 203fe877779SCaesar Wang unsigned buswrtowr : 3; 204fe877779SCaesar Wang unsigned reserved3 : 17; 205fe877779SCaesar Wang } b; 206fe877779SCaesar Wang }; 207fe877779SCaesar Wang 208fe877779SCaesar Wang union noc_ddrmode { 209fe877779SCaesar Wang uint32_t d32; 210fe877779SCaesar Wang struct { 211fe877779SCaesar Wang unsigned autoprecharge : 1; 212fe877779SCaesar Wang unsigned bypassfiltering : 1; 213fe877779SCaesar Wang unsigned fawbank : 1; 214fe877779SCaesar Wang unsigned burstsize : 2; 215fe877779SCaesar Wang unsigned mwrsize : 2; 216fe877779SCaesar Wang unsigned reserved2 : 1; 217fe877779SCaesar Wang unsigned forceorder : 8; 218fe877779SCaesar Wang unsigned forceorderstate : 8; 219fe877779SCaesar Wang unsigned reserved3 : 8; 220fe877779SCaesar Wang } b; 221fe877779SCaesar Wang }; 222fe877779SCaesar Wang 223fe877779SCaesar Wang struct rk3399_msch_timings { 224fe877779SCaesar Wang union noc_ddrtiminga0 ddrtiminga0; 225fe877779SCaesar Wang union noc_ddrtimingb0 ddrtimingb0; 226fe877779SCaesar Wang union noc_ddrtimingc0 ddrtimingc0; 227fe877779SCaesar Wang union noc_devtodev0 devtodev0; 228fe877779SCaesar Wang union noc_ddrmode ddrmode; 229fe877779SCaesar Wang uint32_t agingx0; 230fe877779SCaesar Wang }; 231*613038bcSCaesar Wang 232fe877779SCaesar Wang struct rk3399_sdram_channel { 233fe877779SCaesar Wang unsigned char rank; 234fe877779SCaesar Wang /* col = 0, means this channel is invalid */ 235fe877779SCaesar Wang unsigned char col; 236fe877779SCaesar Wang /* 3:8bank, 2:4bank */ 237fe877779SCaesar Wang unsigned char bk; 238fe877779SCaesar Wang /* channel buswidth, 2:32bit, 1:16bit, 0:8bit */ 239fe877779SCaesar Wang unsigned char bw; 240fe877779SCaesar Wang /* die buswidth, 2:32bit, 1:16bit, 0:8bit */ 241fe877779SCaesar Wang unsigned char dbw; 242fe877779SCaesar Wang /* row_3_4 = 1: 6Gb or 12Gb die 243fe877779SCaesar Wang * row_3_4 = 0: normal die, power of 2 244fe877779SCaesar Wang */ 245fe877779SCaesar Wang unsigned char row_3_4; 246fe877779SCaesar Wang unsigned char cs0_row; 247fe877779SCaesar Wang unsigned char cs1_row; 248fe877779SCaesar Wang uint32_t ddrconfig; 249fe877779SCaesar Wang struct rk3399_msch_timings noc_timings; 250fe877779SCaesar Wang }; 251fe877779SCaesar Wang 252fe877779SCaesar Wang struct rk3399_sdram_params { 253fe877779SCaesar Wang struct rk3399_sdram_channel ch[2]; 254fe877779SCaesar Wang uint32_t ddr_freq; 255fe877779SCaesar Wang unsigned char dramtype; 256fe877779SCaesar Wang unsigned char num_channels; 257fe877779SCaesar Wang unsigned char stride; 258fe877779SCaesar Wang unsigned char odt; 259fe877779SCaesar Wang struct rk3399_ddr_pctl_regs pctl_regs; 260fe877779SCaesar Wang struct rk3399_ddr_pi_regs pi_regs; 261fe877779SCaesar Wang struct rk3399_ddr_publ_regs phy_regs; 262fe877779SCaesar Wang }; 263fe877779SCaesar Wang 264*613038bcSCaesar Wang extern __sramdata struct rk3399_sdram_params sdram_config; 265fe877779SCaesar Wang 266*613038bcSCaesar Wang void dram_init(void); 267fe877779SCaesar Wang 268fe877779SCaesar Wang #endif 269