1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0+ */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * Copyright (C) 2018 Rockchip Electronics Co., Ltd 4*4882a593Smuzhiyun */ 5*4882a593Smuzhiyun 6*4882a593Smuzhiyun #ifndef _ASM_ARCH_SDRAM_PX30_H 7*4882a593Smuzhiyun #define _ASM_ARCH_SDRAM_PX30_H 8*4882a593Smuzhiyun #include <asm/arch/sdram_common.h> 9*4882a593Smuzhiyun #include <asm/arch/sdram_msch.h> 10*4882a593Smuzhiyun #include <asm/arch/sdram_pctl_px30.h> 11*4882a593Smuzhiyun #include <asm/arch/sdram_phy_px30.h> 12*4882a593Smuzhiyun #include <asm/arch/sdram_phy_ron_rtt_px30.h> 13*4882a593Smuzhiyun 14*4882a593Smuzhiyun #define SR_IDLE 93 15*4882a593Smuzhiyun #define PD_IDLE 13 16*4882a593Smuzhiyun 17*4882a593Smuzhiyun /* PMUGRF */ 18*4882a593Smuzhiyun #define PMUGRF_OS_REG0 (0x200) 19*4882a593Smuzhiyun #define PMUGRF_OS_REG(n) (PMUGRF_OS_REG0 + (n) * 4) 20*4882a593Smuzhiyun 21*4882a593Smuzhiyun /* DDR GRF */ 22*4882a593Smuzhiyun #define DDR_GRF_CON(n) (0 + (n) * 4) 23*4882a593Smuzhiyun #define DDR_GRF_STATUS_BASE (0X100) 24*4882a593Smuzhiyun #define DDR_GRF_STATUS(n) (DDR_GRF_STATUS_BASE + (n) * 4) 25*4882a593Smuzhiyun #define DDR_GRF_LP_CON (0x20) 26*4882a593Smuzhiyun 27*4882a593Smuzhiyun #define SPLIT_MODE_32_L16_VALID (0) 28*4882a593Smuzhiyun #define SPLIT_MODE_32_H16_VALID (1) 29*4882a593Smuzhiyun #define SPLIT_MODE_16_L8_VALID (2) 30*4882a593Smuzhiyun #define SPLIT_MODE_16_H8_VALID (3) 31*4882a593Smuzhiyun 32*4882a593Smuzhiyun #define DDR_GRF_SPLIT_CON (0x8) 33*4882a593Smuzhiyun #define SPLIT_MODE_MASK (0x3) 34*4882a593Smuzhiyun #define SPLIT_MODE_OFFSET (9) 35*4882a593Smuzhiyun #define SPLIT_BYPASS_MASK (1) 36*4882a593Smuzhiyun #define SPLIT_BYPASS_OFFSET (8) 37*4882a593Smuzhiyun #define SPLIT_SIZE_MASK (0xff) 38*4882a593Smuzhiyun #define SPLIT_SIZE_OFFSET (0) 39*4882a593Smuzhiyun 40*4882a593Smuzhiyun /* CRU define */ 41*4882a593Smuzhiyun /* CRU_PLL_CON0 */ 42*4882a593Smuzhiyun #define PB(n) ((0x1 << (15 + 16)) | ((n) << 15)) 43*4882a593Smuzhiyun #define POSTDIV1(n) ((0x7 << (12 + 16)) | ((n) << 12)) 44*4882a593Smuzhiyun #define FBDIV(n) ((0xFFF << 16) | (n)) 45*4882a593Smuzhiyun 46*4882a593Smuzhiyun /* CRU_PLL_CON1 */ 47*4882a593Smuzhiyun #define RSTMODE(n) ((0x1 << (15 + 16)) | ((n) << 15)) 48*4882a593Smuzhiyun #define RST(n) ((0x1 << (14 + 16)) | ((n) << 14)) 49*4882a593Smuzhiyun #define PD(n) ((0x1 << (13 + 16)) | ((n) << 13)) 50*4882a593Smuzhiyun #define DSMPD(n) ((0x1 << (12 + 16)) | ((n) << 12)) 51*4882a593Smuzhiyun #define LOCK(n) (((n) >> 10) & 0x1) 52*4882a593Smuzhiyun #define POSTDIV2(n) ((0x7 << (6 + 16)) | ((n) << 6)) 53*4882a593Smuzhiyun #define REFDIV(n) ((0x3F << 16) | (n)) 54*4882a593Smuzhiyun 55*4882a593Smuzhiyun /* CRU_MODE */ 56*4882a593Smuzhiyun #define CLOCK_FROM_XIN_OSC (0) 57*4882a593Smuzhiyun #define CLOCK_FROM_PLL (1) 58*4882a593Smuzhiyun #define CLOCK_FROM_RTC_32K (2) 59*4882a593Smuzhiyun #define DPLL_MODE(n) ((0x3 << (4 + 16)) | ((n) << 4)) 60*4882a593Smuzhiyun 61*4882a593Smuzhiyun /* CRU_SOFTRESET_CON1 */ 62*4882a593Smuzhiyun #define upctl2_psrstn_req(n) (((0x1 << 6) << 16) | ((n) << 6)) 63*4882a593Smuzhiyun #define upctl2_asrstn_req(n) (((0x1 << 5) << 16) | ((n) << 5)) 64*4882a593Smuzhiyun #define upctl2_srstn_req(n) (((0x1 << 4) << 16) | ((n) << 4)) 65*4882a593Smuzhiyun 66*4882a593Smuzhiyun /* CRU_SOFTRESET_CON2 */ 67*4882a593Smuzhiyun #define ddrphy_psrstn_req(n) (((0x1 << 2) << 16) | ((n) << 2)) 68*4882a593Smuzhiyun #define ddrphy_srstn_req(n) (((0x1 << 0) << 16) | ((n) << 0)) 69*4882a593Smuzhiyun 70*4882a593Smuzhiyun /* CRU register */ 71*4882a593Smuzhiyun #define CRU_PLL_CON(pll_id, n) ((pll_id) * 0x20 + (n) * 4) 72*4882a593Smuzhiyun #define CRU_MODE (0xa0) 73*4882a593Smuzhiyun #define CRU_GLB_CNT_TH (0xb0) 74*4882a593Smuzhiyun #define CRU_CLKSEL_CON_BASE 0x100 75*4882a593Smuzhiyun #define CRU_CLKSELS_CON(i) (CRU_CLKSEL_CON_BASE + ((i) * 4)) 76*4882a593Smuzhiyun #define CRU_CLKGATE_CON_BASE 0x200 77*4882a593Smuzhiyun #define CRU_CLKGATE_CON(i) (CRU_CLKGATE_CON_BASE + ((i) * 4)) 78*4882a593Smuzhiyun #define CRU_CLKSFTRST_CON_BASE 0x300 79*4882a593Smuzhiyun #define CRU_CLKSFTRST_CON(i) (CRU_CLKSFTRST_CON_BASE + ((i) * 4)) 80*4882a593Smuzhiyun 81*4882a593Smuzhiyun u8 ddr_cfg_2_rbc[] = { 82*4882a593Smuzhiyun /* 83*4882a593Smuzhiyun * [6:4] max row: 13+n 84*4882a593Smuzhiyun * [3] bank(0:4bank,1:8bank) 85*4882a593Smuzhiyun * [2:0] col(10+n) 86*4882a593Smuzhiyun */ 87*4882a593Smuzhiyun ((5 << 4) | (1 << 3) | 0), /* 0 */ 88*4882a593Smuzhiyun ((5 << 4) | (1 << 3) | 1), /* 1 */ 89*4882a593Smuzhiyun ((4 << 4) | (1 << 3) | 2), /* 2 */ 90*4882a593Smuzhiyun ((3 << 4) | (1 << 3) | 3), /* 3 */ 91*4882a593Smuzhiyun ((2 << 4) | (1 << 3) | 4), /* 4 */ 92*4882a593Smuzhiyun ((5 << 4) | (0 << 3) | 2), /* 5 */ 93*4882a593Smuzhiyun ((4 << 4) | (1 << 3) | 2), /* 6 */ 94*4882a593Smuzhiyun /*((0<<3)|3),*/ /* 12 for ddr4 */ 95*4882a593Smuzhiyun /*((1<<3)|1),*/ /* 13 B,C exchange for rkvdec */ 96*4882a593Smuzhiyun }; 97*4882a593Smuzhiyun 98*4882a593Smuzhiyun /* 99*4882a593Smuzhiyun * for ddr4 if ddrconfig=7, upctl should set 7 and noc should 100*4882a593Smuzhiyun * set to 1 for more efficient. 101*4882a593Smuzhiyun * noc ddrconf, upctl addrmap 102*4882a593Smuzhiyun * 1 7 103*4882a593Smuzhiyun * 2 8 104*4882a593Smuzhiyun * 3 9 105*4882a593Smuzhiyun * 12 10 106*4882a593Smuzhiyun * 5 11 107*4882a593Smuzhiyun */ 108*4882a593Smuzhiyun u8 d4_rbc_2_d3_rbc[] = { 109*4882a593Smuzhiyun 1, /* 7 */ 110*4882a593Smuzhiyun 2, /* 8 */ 111*4882a593Smuzhiyun 3, /* 9 */ 112*4882a593Smuzhiyun 12, /* 10 */ 113*4882a593Smuzhiyun 5, /* 11 */ 114*4882a593Smuzhiyun }; 115*4882a593Smuzhiyun 116*4882a593Smuzhiyun /* 117*4882a593Smuzhiyun * row higher than cs should be disabled by set to 0xf 118*4882a593Smuzhiyun * rank addrmap calculate by real cap. 119*4882a593Smuzhiyun */ 120*4882a593Smuzhiyun u32 addrmap[][8] = { 121*4882a593Smuzhiyun /* map0 map1, map2, map3, map4, map5 122*4882a593Smuzhiyun * map6, map7, map8 123*4882a593Smuzhiyun * ------------------------------------------------------- 124*4882a593Smuzhiyun * bk2-0 col 5-2 col 9-6 col 11-10 row 11-0 125*4882a593Smuzhiyun * row 15-12 row 17-16 bg1,0 126*4882a593Smuzhiyun * ------------------------------------------------------- 127*4882a593Smuzhiyun * 4,3,2 5-2 9-6 6 128*4882a593Smuzhiyun * 3,2 129*4882a593Smuzhiyun */ 130*4882a593Smuzhiyun {0x00060606, 0x00000000, 0x1f1f0000, 0x00001f1f, 0x05050505, 131*4882a593Smuzhiyun 0x05050505, 0x00000505, 0x3f3f}, /* 0 */ 132*4882a593Smuzhiyun {0x00070707, 0x00000000, 0x1f000000, 0x00001f1f, 0x06060606, 133*4882a593Smuzhiyun 0x06060606, 0x06060606, 0x3f3f}, /* 1 */ 134*4882a593Smuzhiyun {0x00080808, 0x00000000, 0x00000000, 0x00001f1f, 0x07070707, 135*4882a593Smuzhiyun 0x07070707, 0x00000f07, 0x3f3f}, /* 2 */ 136*4882a593Smuzhiyun {0x00090909, 0x00000000, 0x00000000, 0x00001f00, 0x08080808, 137*4882a593Smuzhiyun 0x08080808, 0x00000f0f, 0x3f3f}, /* 3 */ 138*4882a593Smuzhiyun {0x000a0a0a, 0x00000000, 0x00000000, 0x00000000, 0x09090909, 139*4882a593Smuzhiyun 0x0f090909, 0x00000f0f, 0x3f3f}, /* 4 */ 140*4882a593Smuzhiyun {0x00080808, 0x00000000, 0x00000000, 0x00001f1f, 0x06060606, 141*4882a593Smuzhiyun 0x06060606, 0x00000606, 0x3f3f}, /* 5 */ 142*4882a593Smuzhiyun {0x00080808, 0x00000000, 0x00000000, 0x00001f1f, 0x07070707, 143*4882a593Smuzhiyun 0x07070707, 0x00000f0f, 0x3f3f}, /* 6 */ 144*4882a593Smuzhiyun {0x003f0808, 0x00000006, 0x1f1f0000, 0x00001f1f, 0x06060606, 145*4882a593Smuzhiyun 0x06060606, 0x00000606, 0x0600}, /* 7 */ 146*4882a593Smuzhiyun {0x003f0909, 0x00000007, 0x1f000000, 0x00001f1f, 0x07070707, 147*4882a593Smuzhiyun 0x07070707, 0x00000f07, 0x0700}, /* 8 */ 148*4882a593Smuzhiyun {0x003f0a0a, 0x01010100, 0x01010101, 0x00001f1f, 0x08080808, 149*4882a593Smuzhiyun 0x08080808, 0x00000f0f, 0x0801}, /* 9 */ 150*4882a593Smuzhiyun {0x003f0909, 0x01010100, 0x01010101, 0x00001f1f, 0x07070707, 151*4882a593Smuzhiyun 0x07070707, 0x00000f07, 0x3f01}, /* 10 */ 152*4882a593Smuzhiyun {0x003f0808, 0x00000007, 0x1f000000, 0x00001f1f, 0x06060606, 153*4882a593Smuzhiyun 0x06060606, 0x00000606, 0x3f00}, /* 11 */ 154*4882a593Smuzhiyun /* when ddr4 12 map to 10, when ddr3 12 unused */ 155*4882a593Smuzhiyun {0x003f0909, 0x01010100, 0x01010101, 0x00001f1f, 0x07070707, 156*4882a593Smuzhiyun 0x07070707, 0x00000f07, 0x3f01}, /* 10 */ 157*4882a593Smuzhiyun {0x00070706, 0x00000000, 0x1f010000, 0x00001f1f, 0x06060606, 158*4882a593Smuzhiyun 0x06060606, 0x00000606, 0x3f3f}, /* 13 */ 159*4882a593Smuzhiyun }; 160*4882a593Smuzhiyun 161*4882a593Smuzhiyun struct px30_ddr_grf_regs { 162*4882a593Smuzhiyun u32 ddr_grf_con[4]; 163*4882a593Smuzhiyun u32 reserved1[(0x20 - 0x10) / 4]; 164*4882a593Smuzhiyun u32 ddr_grf_lp_con; 165*4882a593Smuzhiyun u32 reserved2[(0x100 - 0x24) / 4]; 166*4882a593Smuzhiyun u32 ddr_grf_status[11]; 167*4882a593Smuzhiyun }; 168*4882a593Smuzhiyun 169*4882a593Smuzhiyun struct msch_regs { 170*4882a593Smuzhiyun u32 coreid; 171*4882a593Smuzhiyun u32 revisionid; 172*4882a593Smuzhiyun u32 deviceconf; 173*4882a593Smuzhiyun u32 devicesize; 174*4882a593Smuzhiyun u32 ddrtiminga0; 175*4882a593Smuzhiyun u32 ddrtimingb0; 176*4882a593Smuzhiyun u32 ddrtimingc0; 177*4882a593Smuzhiyun u32 devtodev0; 178*4882a593Smuzhiyun u32 reserved1[(0x110 - 0x20) / 4]; 179*4882a593Smuzhiyun u32 ddrmode; 180*4882a593Smuzhiyun u32 ddr4timing; 181*4882a593Smuzhiyun u32 reserved2[(0x1000 - 0x118) / 4]; 182*4882a593Smuzhiyun u32 agingx0; 183*4882a593Smuzhiyun u32 reserved3[(0x1040 - 0x1004) / 4]; 184*4882a593Smuzhiyun u32 aging0; 185*4882a593Smuzhiyun u32 aging1; 186*4882a593Smuzhiyun u32 aging2; 187*4882a593Smuzhiyun u32 aging3; 188*4882a593Smuzhiyun }; 189*4882a593Smuzhiyun 190*4882a593Smuzhiyun struct sdram_msch_timings { 191*4882a593Smuzhiyun union noc_ddrtiminga0 ddrtiminga0; 192*4882a593Smuzhiyun union noc_ddrtimingb0 ddrtimingb0; 193*4882a593Smuzhiyun union noc_ddrtimingc0 ddrtimingc0; 194*4882a593Smuzhiyun union noc_devtodev0 devtodev0; 195*4882a593Smuzhiyun union noc_ddrmode ddrmode; 196*4882a593Smuzhiyun union noc_ddr4timing ddr4timing; 197*4882a593Smuzhiyun u32 agingx0; 198*4882a593Smuzhiyun }; 199*4882a593Smuzhiyun 200*4882a593Smuzhiyun struct px30_sdram_channel { 201*4882a593Smuzhiyun struct sdram_cap_info cap_info; 202*4882a593Smuzhiyun struct sdram_msch_timings noc_timings; 203*4882a593Smuzhiyun }; 204*4882a593Smuzhiyun 205*4882a593Smuzhiyun struct px30_sdram_params { 206*4882a593Smuzhiyun struct px30_sdram_channel ch; 207*4882a593Smuzhiyun struct sdram_base_params base; 208*4882a593Smuzhiyun struct ddr_pctl_regs pctl_regs; 209*4882a593Smuzhiyun struct ddr_phy_regs phy_regs; 210*4882a593Smuzhiyun struct ddr_phy_skew *skew; 211*4882a593Smuzhiyun }; 212*4882a593Smuzhiyun #endif 213