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_SHARE_H 7*4882a593Smuzhiyun #define _ASM_ARCH_SDRAM_SHARE_H 8*4882a593Smuzhiyun 9*4882a593Smuzhiyun #ifndef MHZ 10*4882a593Smuzhiyun #define MHZ (1000 * 1000) 11*4882a593Smuzhiyun #endif 12*4882a593Smuzhiyun 13*4882a593Smuzhiyun #define PATTERN (0x5aa5f00f) 14*4882a593Smuzhiyun 15*4882a593Smuzhiyun #define MIN(a, b) (((a) > (b)) ? (b) : (a)) 16*4882a593Smuzhiyun #define MAX(a, b) (((a) > (b)) ? (a) : (b)) 17*4882a593Smuzhiyun 18*4882a593Smuzhiyun /* get head info for initial */ 19*4882a593Smuzhiyun #define DDR_FREQ_F0_SHIFT (0) 20*4882a593Smuzhiyun #define DDR_FREQ_F1_SHIFT (12) 21*4882a593Smuzhiyun #define DDR_FREQ_F2_SHIFT (0) 22*4882a593Smuzhiyun #define DDR_FREQ_F3_SHIFT (12) 23*4882a593Smuzhiyun #define DDR_FREQ_F4_SHIFT (0) 24*4882a593Smuzhiyun #define DDR_FREQ_F5_SHIFT (12) 25*4882a593Smuzhiyun #define DDR_FREQ_MASK (0xfff) 26*4882a593Smuzhiyun 27*4882a593Smuzhiyun #define UART_INFO_ID_SHIFT (28) 28*4882a593Smuzhiyun #define UART_INFO_IOMUX_SHIFT (24) 29*4882a593Smuzhiyun #define UART_INFO_BAUD_SHIFT (0) 30*4882a593Smuzhiyun #define UART_INFO_ID(n) (((n) >> 28) & 0xf) 31*4882a593Smuzhiyun #define UART_INFO_IOMUX(n) (((n) >> 24) & 0xf) 32*4882a593Smuzhiyun #define UART_INFO_BAUD(n) ((n) & 0xffffff) 33*4882a593Smuzhiyun 34*4882a593Smuzhiyun /* g_ch_info[15:0]: g_stdby_idle */ 35*4882a593Smuzhiyun #define STANDBY_IDLE(n) ((n) & 0xffff) 36*4882a593Smuzhiyun 37*4882a593Smuzhiyun #define SR_INFO(n) (((n) >> 16) & 0xffff) 38*4882a593Smuzhiyun #define PD_INFO(n) ((n) & 0xffff) 39*4882a593Smuzhiyun 40*4882a593Smuzhiyun #define FIRST_SCAN_CH(n) (((n) >> 28) & 0xf) 41*4882a593Smuzhiyun #define CHANNEL_MASK(n) (((n) >> 24) & 0xf) 42*4882a593Smuzhiyun #define STRIDE_TYPE(n) (((n) >> 16) & 0xff) 43*4882a593Smuzhiyun 44*4882a593Smuzhiyun #define DDR_2T_INFO(n) ((n) & 1) 45*4882a593Smuzhiyun #define PLL_SSMOD_SPREAD(n) (((n) >> 1) & 0xff) 46*4882a593Smuzhiyun #define PLL_SSMOD_DIV(n) (((n) >> 9) & 0xff) 47*4882a593Smuzhiyun #define PLL_SSMOD_DOWNSPREAD(n) (((n) >> 17) & 0x3) 48*4882a593Smuzhiyun 49*4882a593Smuzhiyun /* sdram_head_info_v2 define */ 50*4882a593Smuzhiyun /* for *_drv_odten and *_drv_odtoff */ 51*4882a593Smuzhiyun #define PHY_DQ_DRV_SHIFT 0 52*4882a593Smuzhiyun #define PHY_CA_DRV_SHIFT 8 53*4882a593Smuzhiyun #define PHY_CLK_DRV_SHIFT 16 54*4882a593Smuzhiyun #define DRAM_DQ_DRV_SHIFT 24 55*4882a593Smuzhiyun #define DRV_INFO_PHY_DQ_DRV(n) ((n) & 0xff) 56*4882a593Smuzhiyun #define DRV_INFO_PHY_CA_DRV(n) (((n) >> PHY_CA_DRV_SHIFT) & 0xff) 57*4882a593Smuzhiyun #define DRV_INFO_PHY_CLK_DRV(n) (((n) >> PHY_CLK_DRV_SHIFT) & 0xff) 58*4882a593Smuzhiyun #define DRV_INFO_DRAM_DQ_DRV(n) (((n) >> DRAM_DQ_DRV_SHIFT) & 0xff) 59*4882a593Smuzhiyun 60*4882a593Smuzhiyun /* for *_odt_info */ 61*4882a593Smuzhiyun #define DRAM_ODT_SHIFT 0 62*4882a593Smuzhiyun #define PHY_ODT_SHIFT 8 63*4882a593Smuzhiyun #define PHY_ODT_PUUP_EN_SHIFT 18 64*4882a593Smuzhiyun #define PHY_ODT_PUDN_EN_SHIFT 19 65*4882a593Smuzhiyun #define ODT_INFO_DRAM_ODT(n) (((n) >> DRAM_ODT_SHIFT) & 0xff) 66*4882a593Smuzhiyun #define ODT_INFO_PHY_ODT(n) (((n) >> PHY_ODT_SHIFT) & 0x3ff) 67*4882a593Smuzhiyun #define ODT_INFO_PULLUP_EN(n) (((n) >> PHY_ODT_PUUP_EN_SHIFT) & 1) 68*4882a593Smuzhiyun #define ODT_INFO_PULLDOWN_EN(n) (((n) >> PHY_ODT_PUDN_EN_SHIFT) & 1) 69*4882a593Smuzhiyun 70*4882a593Smuzhiyun /* for *odt_en_freq; */ 71*4882a593Smuzhiyun #define DRAM_ODT_EN_FREQ_SHIFT 0 72*4882a593Smuzhiyun #define PHY_ODT_EN_FREQ_SHIFT 12 73*4882a593Smuzhiyun #define DRAMODT_EN_FREQ(n) (((n) >> DRAM_ODT_EN_FREQ_SHIFT) & \ 74*4882a593Smuzhiyun 0xfff) 75*4882a593Smuzhiyun #define PHYODT_EN_FREQ(n) (((n) >> PHY_ODT_EN_FREQ_SHIFT) & 0xfff) 76*4882a593Smuzhiyun 77*4882a593Smuzhiyun #define PHY_DQ_SR_SHIFT 0 78*4882a593Smuzhiyun #define PHY_CA_SR_SHIFT 8 79*4882a593Smuzhiyun #define PHY_CLK_SR_SHIFT 16 80*4882a593Smuzhiyun #define DQ_SR_INFO(n) (((n) >> PHY_DQ_SR_SHIFT) & 0xff) 81*4882a593Smuzhiyun #define CA_SR_INFO(n) (((n) >> PHY_CA_SR_SHIFT) & 0xff) 82*4882a593Smuzhiyun #define CLK_SR_INFO(n) (((n) >> PHY_CLK_SR_SHIFT) & 0xff) 83*4882a593Smuzhiyun 84*4882a593Smuzhiyun /* LP4 */ 85*4882a593Smuzhiyun #define LP4_CA_ODT_SHIFT (18) 86*4882a593Smuzhiyun #define LP4_DRV_PU_CAL_ODTEN_SHIFT (26) 87*4882a593Smuzhiyun #define LP4_DRV_PU_CAL_ODTOFF_SHIFT (27) 88*4882a593Smuzhiyun #define PHY_LP4_DRV_PULLDOWN_EN_ODTEN_SHIFT (28) 89*4882a593Smuzhiyun #define PHY_LP4_DRV_PULLDOWN_EN_ODTOFF_SHIFT (29) 90*4882a593Smuzhiyun #define ODT_INFO_LP4_CA_ODT(n) (((n) >> LP4_CA_ODT_SHIFT) & \ 91*4882a593Smuzhiyun 0xff) 92*4882a593Smuzhiyun #define LP4_DRV_PU_CAL_ODTEN(n) \ 93*4882a593Smuzhiyun (((n) >> LP4_DRV_PU_CAL_ODTEN_SHIFT) & 1) 94*4882a593Smuzhiyun #define LP4_DRV_PU_CAL_ODTOFF(n) \ 95*4882a593Smuzhiyun (((n) >> LP4_DRV_PU_CAL_ODTOFF_SHIFT) & 1) 96*4882a593Smuzhiyun #define PHY_LP4_DRV_PULLDOWN_EN_ODTEN(n) \ 97*4882a593Smuzhiyun (((n) >> PHY_LP4_DRV_PULLDOWN_EN_ODTEN_SHIFT) & 1) 98*4882a593Smuzhiyun #define PHY_LP4_DRV_PULLDOWN_EN_ODTOFF(n) \ 99*4882a593Smuzhiyun (((n) >> PHY_LP4_DRV_PULLDOWN_EN_ODTOFF_SHIFT) & 1) 100*4882a593Smuzhiyun 101*4882a593Smuzhiyun #define PHY_LP4_CS_DRV_ODTEN_SHIFT (0) 102*4882a593Smuzhiyun #define PHY_LP4_CS_DRV_ODTOFF_SHIFT (8) 103*4882a593Smuzhiyun #define LP4_ODTE_CK_SHIFT (16) 104*4882a593Smuzhiyun #define LP4_ODTE_CS_EN_SHIFT (17) 105*4882a593Smuzhiyun #define LP4_ODTD_CA_EN_SHIFT (18) 106*4882a593Smuzhiyun #define PHY_LP4_CS_DRV_ODTEN(n) \ 107*4882a593Smuzhiyun (((n) >> PHY_LP4_CS_DRV_ODTEN_SHIFT) & 0xff) 108*4882a593Smuzhiyun #define PHY_LP4_CS_DRV_ODTOFF(n) \ 109*4882a593Smuzhiyun (((n) >> PHY_LP4_CS_DRV_ODTOFF_SHIFT) & 0xff) 110*4882a593Smuzhiyun #define LP4_ODTE_CK_EN(n) (((n) >> LP4_ODTE_CK_SHIFT) & 1) 111*4882a593Smuzhiyun #define LP4_ODTE_CS_EN(n) (((n) >> LP4_ODTE_CS_EN_SHIFT) & 1) 112*4882a593Smuzhiyun #define LP4_ODTD_CA_EN(n) (((n) >> LP4_ODTD_CA_EN_SHIFT) & 1) 113*4882a593Smuzhiyun 114*4882a593Smuzhiyun #define PHY_LP4_DQ_VREF_SHIFT (0) 115*4882a593Smuzhiyun #define LP4_DQ_VREF_SHIFT (10) 116*4882a593Smuzhiyun #define LP4_CA_VREF_SHIFT (20) 117*4882a593Smuzhiyun 118*4882a593Smuzhiyun #define PHY_LP4_DQ_VREF(n) \ 119*4882a593Smuzhiyun (((n) >> PHY_LP4_DQ_VREF_SHIFT) & 0x3ff) 120*4882a593Smuzhiyun #define LP4_DQ_VREF(n) (((n) >> LP4_DQ_VREF_SHIFT) & 0x3ff) 121*4882a593Smuzhiyun #define LP4_CA_VREF(n) (((n) >> LP4_CA_VREF_SHIFT) & 0x3ff) 122*4882a593Smuzhiyun 123*4882a593Smuzhiyun #define LP4_DQ_ODT_EN_FREQ_SHIFT (0) 124*4882a593Smuzhiyun #define PHY_LP4_ODT_EN_FREQ_SHIFT (12) 125*4882a593Smuzhiyun #define LP4_CA_ODT_EN_FREQ_SHIFT (0) 126*4882a593Smuzhiyun #define PHY_LP4_ODT_EN_FREQ(n) \ 127*4882a593Smuzhiyun (((n) >> PHY_LP4_ODT_EN_FREQ_SHIFT) & 0xfff) 128*4882a593Smuzhiyun #define LP4_DQ_ODT_EN_FREQ(n) \ 129*4882a593Smuzhiyun (((n) >> LP4_DQ_ODT_EN_FREQ_SHIFT) & 0xfff) 130*4882a593Smuzhiyun #define LP4_CA_ODT_EN_FREQ(n) \ 131*4882a593Smuzhiyun (((n) >> LP4_CA_ODT_EN_FREQ_SHIFT) & 0xfff) 132*4882a593Smuzhiyun 133*4882a593Smuzhiyun struct sdram_head_info_v0 { 134*4882a593Smuzhiyun u32 start_tag; 135*4882a593Smuzhiyun u32 version_info; 136*4882a593Smuzhiyun u32 gcpu_gen_freq; 137*4882a593Smuzhiyun u32 g_d2_lp2_freq; 138*4882a593Smuzhiyun u32 g_d3_lp3_freq; 139*4882a593Smuzhiyun u32 g_d4_lp4_freq; 140*4882a593Smuzhiyun u32 g_uart_info; 141*4882a593Smuzhiyun u32 g_sr_pd_idle; 142*4882a593Smuzhiyun u32 g_ch_info; 143*4882a593Smuzhiyun u32 g_2t_info; 144*4882a593Smuzhiyun u32 reserved11; 145*4882a593Smuzhiyun u32 reserved12; 146*4882a593Smuzhiyun u32 reserved13; 147*4882a593Smuzhiyun }; 148*4882a593Smuzhiyun 149*4882a593Smuzhiyun struct index_info { 150*4882a593Smuzhiyun u8 offset; 151*4882a593Smuzhiyun u8 size; 152*4882a593Smuzhiyun }; 153*4882a593Smuzhiyun 154*4882a593Smuzhiyun struct sdram_head_info_index_v2 { 155*4882a593Smuzhiyun u32 start_tag; 156*4882a593Smuzhiyun u32 version_info; 157*4882a593Smuzhiyun struct index_info cpu_gen_index; 158*4882a593Smuzhiyun struct index_info global_index; 159*4882a593Smuzhiyun 160*4882a593Smuzhiyun struct index_info ddr2_index; 161*4882a593Smuzhiyun struct index_info ddr3_index; 162*4882a593Smuzhiyun 163*4882a593Smuzhiyun struct index_info ddr4_index; 164*4882a593Smuzhiyun struct index_info ddr5_index; 165*4882a593Smuzhiyun 166*4882a593Smuzhiyun struct index_info lp2_index; 167*4882a593Smuzhiyun struct index_info lp3_index; 168*4882a593Smuzhiyun 169*4882a593Smuzhiyun struct index_info lp4_index; 170*4882a593Smuzhiyun struct index_info lp5_index; 171*4882a593Smuzhiyun 172*4882a593Smuzhiyun struct index_info skew_index; 173*4882a593Smuzhiyun struct index_info dq_map_index; 174*4882a593Smuzhiyun 175*4882a593Smuzhiyun struct index_info lp4x_index; 176*4882a593Smuzhiyun struct index_info reserved; 177*4882a593Smuzhiyun }; 178*4882a593Smuzhiyun 179*4882a593Smuzhiyun struct global_info { 180*4882a593Smuzhiyun u32 uart_info; 181*4882a593Smuzhiyun u32 sr_pd_info; 182*4882a593Smuzhiyun u32 ch_info; 183*4882a593Smuzhiyun u32 info_2t; 184*4882a593Smuzhiyun u32 reserved[4]; 185*4882a593Smuzhiyun }; 186*4882a593Smuzhiyun 187*4882a593Smuzhiyun struct ddr2_3_4_lp2_3_info { 188*4882a593Smuzhiyun u32 ddr_freq0_1; 189*4882a593Smuzhiyun u32 ddr_freq2_3; 190*4882a593Smuzhiyun u32 ddr_freq4_5; 191*4882a593Smuzhiyun u32 drv_when_odten; 192*4882a593Smuzhiyun u32 drv_when_odtoff; 193*4882a593Smuzhiyun u32 odt_info; 194*4882a593Smuzhiyun u32 odten_freq; 195*4882a593Smuzhiyun u32 sr_when_odten; 196*4882a593Smuzhiyun u32 sr_when_odtoff; 197*4882a593Smuzhiyun }; 198*4882a593Smuzhiyun 199*4882a593Smuzhiyun struct lp4_info { 200*4882a593Smuzhiyun u32 ddr_freq0_1; 201*4882a593Smuzhiyun u32 ddr_freq2_3; 202*4882a593Smuzhiyun u32 ddr_freq4_5; 203*4882a593Smuzhiyun u32 drv_when_odten; 204*4882a593Smuzhiyun u32 drv_when_odtoff; 205*4882a593Smuzhiyun u32 odt_info; 206*4882a593Smuzhiyun u32 dq_odten_freq; 207*4882a593Smuzhiyun u32 sr_when_odten; 208*4882a593Smuzhiyun u32 sr_when_odtoff; 209*4882a593Smuzhiyun u32 ca_odten_freq; 210*4882a593Smuzhiyun u32 cs_drv_ca_odt_info; 211*4882a593Smuzhiyun u32 vref_when_odten; 212*4882a593Smuzhiyun u32 vref_when_odtoff; 213*4882a593Smuzhiyun }; 214*4882a593Smuzhiyun 215*4882a593Smuzhiyun struct dq_map_info { 216*4882a593Smuzhiyun u32 byte_map[2]; 217*4882a593Smuzhiyun u32 lp3_dq0_7_map; 218*4882a593Smuzhiyun u32 lp2_dq0_7_map; 219*4882a593Smuzhiyun u32 ddr4_dq_map[4]; 220*4882a593Smuzhiyun }; 221*4882a593Smuzhiyun 222*4882a593Smuzhiyun struct sdram_cap_info { 223*4882a593Smuzhiyun unsigned int rank; 224*4882a593Smuzhiyun unsigned int col; 225*4882a593Smuzhiyun /* 3:8bank, 2:4bank */ 226*4882a593Smuzhiyun unsigned int bk; 227*4882a593Smuzhiyun /* channel buswidth, 2:32bit, 1:16bit, 0:8bit */ 228*4882a593Smuzhiyun unsigned int bw; 229*4882a593Smuzhiyun /* die buswidth, 2:32bit, 1:16bit, 0:8bit */ 230*4882a593Smuzhiyun unsigned int dbw; 231*4882a593Smuzhiyun unsigned int row_3_4; 232*4882a593Smuzhiyun unsigned int cs0_row; 233*4882a593Smuzhiyun unsigned int cs1_row; 234*4882a593Smuzhiyun unsigned int cs2_row; 235*4882a593Smuzhiyun unsigned int cs3_row; 236*4882a593Smuzhiyun unsigned int cs0_high16bit_row; 237*4882a593Smuzhiyun unsigned int cs1_high16bit_row; 238*4882a593Smuzhiyun unsigned int cs2_high16bit_row; 239*4882a593Smuzhiyun unsigned int cs3_high16bit_row; 240*4882a593Smuzhiyun unsigned int ddrconfig; 241*4882a593Smuzhiyun }; 242*4882a593Smuzhiyun 243*4882a593Smuzhiyun struct sdram_base_params { 244*4882a593Smuzhiyun unsigned int ddr_freq; 245*4882a593Smuzhiyun unsigned int dramtype; 246*4882a593Smuzhiyun unsigned int num_channels; 247*4882a593Smuzhiyun unsigned int stride; 248*4882a593Smuzhiyun unsigned int odt; 249*4882a593Smuzhiyun }; 250*4882a593Smuzhiyun 251*4882a593Smuzhiyun /* store result of read and write training, for ddr_dq_eye tool in u-boot */ 252*4882a593Smuzhiyun #define DDR_DQ_EYE_FLAG 0xdddeefa0 253*4882a593Smuzhiyun 254*4882a593Smuzhiyun #define FSP_NUM 4 255*4882a593Smuzhiyun #define CS_NUM 4 256*4882a593Smuzhiyun #define BYTE_NUM 5 257*4882a593Smuzhiyun 258*4882a593Smuzhiyun struct dqs_rw_trn_result { 259*4882a593Smuzhiyun u16 dq_deskew[8]; 260*4882a593Smuzhiyun u16 dqs_deskew; 261*4882a593Smuzhiyun u16 dq_min[8]; 262*4882a593Smuzhiyun u16 dq_max[8]; 263*4882a593Smuzhiyun }; 264*4882a593Smuzhiyun 265*4882a593Smuzhiyun struct cs_rw_trn_result { 266*4882a593Smuzhiyun struct dqs_rw_trn_result dqs[BYTE_NUM]; 267*4882a593Smuzhiyun }; 268*4882a593Smuzhiyun 269*4882a593Smuzhiyun struct fsp_rw_trn_result { 270*4882a593Smuzhiyun u16 min_val; 271*4882a593Smuzhiyun struct cs_rw_trn_result cs[CS_NUM]; 272*4882a593Smuzhiyun }; 273*4882a593Smuzhiyun 274*4882a593Smuzhiyun struct rw_trn_result { 275*4882a593Smuzhiyun u32 flag; 276*4882a593Smuzhiyun u8 cs_num; 277*4882a593Smuzhiyun u8 byte_en; 278*4882a593Smuzhiyun u16 fsp_mhz[FSP_NUM]; 279*4882a593Smuzhiyun struct fsp_rw_trn_result rd_fsp[FSP_NUM]; 280*4882a593Smuzhiyun struct fsp_rw_trn_result wr_fsp[FSP_NUM]; 281*4882a593Smuzhiyun }; 282*4882a593Smuzhiyun 283*4882a593Smuzhiyun /* for modify tRFC and related timing */ 284*4882a593Smuzhiyun #define DIE_CAP_512MBIT 64 285*4882a593Smuzhiyun #define DIE_CAP_1GBIT 128 286*4882a593Smuzhiyun #define DIE_CAP_2GBIT 256 287*4882a593Smuzhiyun #define DIE_CAP_4GBIT 512 288*4882a593Smuzhiyun #define DIE_CAP_8GBIT 1024 289*4882a593Smuzhiyun #define DIE_CAP_16GBIT 2048 290*4882a593Smuzhiyun #define DIE_CAP_32GBIT 4096 291*4882a593Smuzhiyun 292*4882a593Smuzhiyun /* 293*4882a593Smuzhiyun * sys_reg bitfield struct 294*4882a593Smuzhiyun * [31] row_3_4_ch1 295*4882a593Smuzhiyun * [30] row_3_4_ch0 296*4882a593Smuzhiyun * [29:28] chinfo 297*4882a593Smuzhiyun * [27] rank_ch1 298*4882a593Smuzhiyun * [26:25] col_ch1 299*4882a593Smuzhiyun * [24] bk_ch1 300*4882a593Smuzhiyun * [23:22] cs0_row_ch1 301*4882a593Smuzhiyun * [21:20] cs1_row_ch1 302*4882a593Smuzhiyun * [19:18] bw_ch1 303*4882a593Smuzhiyun * [17:16] dbw_ch1; 304*4882a593Smuzhiyun * [15:13] ddrtype 305*4882a593Smuzhiyun * [12] channelnum 306*4882a593Smuzhiyun * [11] rank_ch0 307*4882a593Smuzhiyun * [10:9] col_ch0 308*4882a593Smuzhiyun * [8] bk_ch0 309*4882a593Smuzhiyun * [7:6] cs0_row_ch0 310*4882a593Smuzhiyun * [5:4] cs1_row_ch0 311*4882a593Smuzhiyun * [3:2] bw_ch0 312*4882a593Smuzhiyun * [1:0] dbw_ch0 313*4882a593Smuzhiyun */ 314*4882a593Smuzhiyun 315*4882a593Smuzhiyun #define DDR_SYS_REG_VERSION (0x2) 316*4882a593Smuzhiyun #define SYS_REG_ENC_ROW_3_4(n, ch) ((n) << (30 + (ch))) 317*4882a593Smuzhiyun #define SYS_REG_DEC_ROW_3_4(n, ch) (((n) >> (30 + (ch))) & 0x1) 318*4882a593Smuzhiyun #define SYS_REG_ENC_CHINFO(ch) (1 << (28 + (ch))) 319*4882a593Smuzhiyun #define SYS_REG_DEC_CHINFO(n, ch) (((n) >> (28 + (ch))) & 0x1) 320*4882a593Smuzhiyun #define SYS_REG_ENC_DDRTYPE(n) ((n) << 13) 321*4882a593Smuzhiyun #define SYS_REG_DEC_DDRTYPE(n) (((n) >> 13) & 0x7) 322*4882a593Smuzhiyun #define SYS_REG_ENC_NUM_CH(n) (((n) - 1) << 12) 323*4882a593Smuzhiyun #define SYS_REG_DEC_NUM_CH(n) (1 + (((n) >> 12) & 0x1)) 324*4882a593Smuzhiyun #define SYS_REG_ENC_RANK(n, ch) (((n) - 1) << (11 + ((ch) * 16))) 325*4882a593Smuzhiyun #define SYS_REG_DEC_RANK(n, ch) (1 + (((n) >> (11 + 16 * (ch))) & 0x1)) 326*4882a593Smuzhiyun #define SYS_REG_ENC_COL(n, ch) (((n) - 9) << (9 + ((ch) * 16))) 327*4882a593Smuzhiyun #define SYS_REG_DEC_COL(n, ch) (9 + (((n) >> (9 + 16 * (ch))) & 0x3)) 328*4882a593Smuzhiyun #define SYS_REG_ENC_BK(n, ch) (((n) == 3 ? 0 : 1) << \ 329*4882a593Smuzhiyun (8 + ((ch) * 16))) 330*4882a593Smuzhiyun #define SYS_REG_DEC_BK(n, ch) (3 - (((n) >> (8 + 16 * (ch))) & 0x1)) 331*4882a593Smuzhiyun #define SYS_REG_ENC_BW(n, ch) ((2 >> (n)) << (2 + ((ch) * 16))) 332*4882a593Smuzhiyun #define SYS_REG_DEC_BW(n, ch) (2 >> (((n) >> (2 + 16 * (ch))) & 0x3)) 333*4882a593Smuzhiyun #define SYS_REG_ENC_DBW(n, ch) ((2 >> (n)) << (0 + ((ch) * 16))) 334*4882a593Smuzhiyun #define SYS_REG_DEC_DBW(n, ch) (2 >> (((n) >> (0 + 16 * (ch))) & 0x3)) 335*4882a593Smuzhiyun /* sys reg 3 */ 336*4882a593Smuzhiyun #define SYS_REG_ENC_VERSION(n) ((n) << 28) 337*4882a593Smuzhiyun #define SYS_REG_DEC_VERSION(n) (((n) >> 28) & 0xf) 338*4882a593Smuzhiyun #define SYS_REG_ENC_CS0_ROW(n, os_reg2, os_reg3, ch) do { \ 339*4882a593Smuzhiyun (os_reg2) &= (~(0x3 << (6 + 16 * (ch)))); \ 340*4882a593Smuzhiyun (os_reg3) &= (~(0x1 << (5 + 2 * (ch)))); \ 341*4882a593Smuzhiyun (os_reg2) |= (((n) - 13) & 0x3) << (6 + 16 * (ch)); \ 342*4882a593Smuzhiyun (os_reg3) |= ((((n) - 13) & 0x4) >> 2) << \ 343*4882a593Smuzhiyun (5 + 2 * (ch)); \ 344*4882a593Smuzhiyun } while (0) 345*4882a593Smuzhiyun 346*4882a593Smuzhiyun #define SYS_REG_DEC_CS0_ROW(os_reg2, os_reg3, ch) \ 347*4882a593Smuzhiyun ((((((os_reg2) >> (6 + 16 * (ch)) & 0x3) | \ 348*4882a593Smuzhiyun ((((os_reg3) >> (5 + 2 * (ch))) & 0x1) << 2)) + 1) & 0x7) + 12) 349*4882a593Smuzhiyun 350*4882a593Smuzhiyun #define SYS_REG_ENC_CS1_ROW(n, os_reg2, os_reg3, ch) do { \ 351*4882a593Smuzhiyun (os_reg2) &= (~(0x3 << (4 + 16 * (ch)))); \ 352*4882a593Smuzhiyun (os_reg3) &= (~(0x1 << (4 + 2 * (ch)))); \ 353*4882a593Smuzhiyun (os_reg2) |= (((n) - 13) & 0x3) << (4 + 16 * (ch)); \ 354*4882a593Smuzhiyun (os_reg3) |= ((((n) - 13) & 0x4) >> 2) << \ 355*4882a593Smuzhiyun (4 + 2 * (ch)); \ 356*4882a593Smuzhiyun } while (0) 357*4882a593Smuzhiyun 358*4882a593Smuzhiyun #define SYS_REG_DEC_CS1_ROW(os_reg2, os_reg3, ch) \ 359*4882a593Smuzhiyun ((((((os_reg2) >> (4 + 16 * (ch)) & 0x3) | \ 360*4882a593Smuzhiyun ((((os_reg3) >> (4 + 2 * (ch))) & 0x1) << 2)) + 1) & 0x7) + 12) 361*4882a593Smuzhiyun 362*4882a593Smuzhiyun #define SYS_REG_ENC_CS1_COL(n, ch) (((n) - 9) << (0 + 2 * (ch))) 363*4882a593Smuzhiyun #define SYS_REG_DEC_CS1_COL(n, ch) (9 + (((n) >> (0 + 2 * (ch))) & 0x3)) 364*4882a593Smuzhiyun 365*4882a593Smuzhiyun /* DDR SYS REG Version 3 */ 366*4882a593Smuzhiyun #define DDR_SYS_REG_VERSION_3 (0x3) 367*4882a593Smuzhiyun #define SYS_REG_ENC_ROW_3_4_V3(row3_4, ch) SYS_REG_ENC_ROW_3_4(row3_4, ch) 368*4882a593Smuzhiyun #define SYS_REG_DEC_ROW_3_4_V3(reg2, ch) SYS_REG_DEC_ROW_3_4(reg2, ch) 369*4882a593Smuzhiyun #define SYS_REG_ENC_CHINFO_V3(ch) SYS_REG_ENC_CHINFO(ch) 370*4882a593Smuzhiyun #define SYS_REG_DEC_CHINFO_V3(reg2, ch) SYS_REG_DEC_CHINFO(reg2, ch) 371*4882a593Smuzhiyun #define SYS_REG_ENC_DDRTYPE_V3(n, reg2, reg3) do { \ 372*4882a593Smuzhiyun (reg2) &= (~(0x7 << 13)); \ 373*4882a593Smuzhiyun (reg3) &= (~(0x3 << 12)); \ 374*4882a593Smuzhiyun (reg2) |= (((n) & 0x7) << 13); \ 375*4882a593Smuzhiyun (reg3) |= (((n) >> 3) & 0x3) << 12; \ 376*4882a593Smuzhiyun } while (0) 377*4882a593Smuzhiyun #define SYS_REG_DEC_DDRTYPE_V3(reg2, reg3) \ 378*4882a593Smuzhiyun ((((reg2) >> 13) & 0x7) | \ 379*4882a593Smuzhiyun ((((reg3) >> 12) & 0x3) << 3)) 380*4882a593Smuzhiyun 381*4882a593Smuzhiyun #define SYS_REG_ENC_NUM_CH_V3(n) SYS_REG_ENC_NUM_CH(n) 382*4882a593Smuzhiyun #define SYS_REG_DEC_NUM_CH_V3(reg2) SYS_REG_DEC_NUM_CH(reg2) 383*4882a593Smuzhiyun #define SYS_REG_ENC_CH1_3_RANK(cs) SYS_REG_ENC_RANK(cs, 1) 384*4882a593Smuzhiyun #define SYS_REG_DEC_CH1_3_RANK(reg2) SYS_REG_DEC_RANK(reg2, 1) 385*4882a593Smuzhiyun #define SYS_REG_ENC_CH0_2_RANK_V3(n, reg2, reg3) do { \ 386*4882a593Smuzhiyun (reg2) &= (~(1 << 11)); \ 387*4882a593Smuzhiyun (reg3) &= (~(1 << 14)); \ 388*4882a593Smuzhiyun (reg2) |= (((n) == 2) ? 1 : 0) << 11; \ 389*4882a593Smuzhiyun (reg3) |= (((n) == 4) ? 1 : 0) << 14; \ 390*4882a593Smuzhiyun } while (0) 391*4882a593Smuzhiyun #define SYS_REG_DEC_CH0_2_RANK_V3(reg2, reg3) \ 392*4882a593Smuzhiyun (1 << ((((reg2) >> 11) & 1) | ((((reg3) >> 14) & 1) << 1))) 393*4882a593Smuzhiyun #define SYS_REG_ENC_COL_V3(col, ch) SYS_REG_ENC_COL(col, ch) 394*4882a593Smuzhiyun #define SYS_REG_DEC_COL_V3(reg2, ch) SYS_REG_DEC_COL(reg2, ch) 395*4882a593Smuzhiyun #define SYS_REG_ENC_BK_V3(bk, ch) SYS_REG_ENC_BK(bk, ch) 396*4882a593Smuzhiyun #define SYS_REG_DEC_BK_V3(reg2, ch) SYS_REG_DEC_BK(reg2, ch) 397*4882a593Smuzhiyun #define SYS_REG_ENC_BW_V3(bw, ch) SYS_REG_ENC_BW(bw, ch) 398*4882a593Smuzhiyun #define SYS_REG_DEC_BW_V3(reg2, ch) SYS_REG_DEC_BW(reg2, ch) 399*4882a593Smuzhiyun #define SYS_REG_ENC_DBW_V3(dbw, ch) SYS_REG_ENC_DBW(dbw, ch) 400*4882a593Smuzhiyun #define SYS_REG_DEC_DBW_V3(reg2, ch) SYS_REG_DEC_DBW(reg2, ch) 401*4882a593Smuzhiyun #define SYS_REG_ENC_VERSION_V3(n) SYS_REG_ENC_VERSION(n) 402*4882a593Smuzhiyun #define SYS_REG_DEC_VERSION_V3(reg3) SYS_REG_DEC_VERSION(reg3) 403*4882a593Smuzhiyun #define SYS_REG_ENC_CS0_ROW_V3(row, reg2, reg3, ch) \ 404*4882a593Smuzhiyun SYS_REG_ENC_CS0_ROW(row, reg2, reg3, ch) 405*4882a593Smuzhiyun #define SYS_REG_DEC_CS0_ROW_V3(reg2, reg3, ch) \ 406*4882a593Smuzhiyun SYS_REG_DEC_CS0_ROW(reg2, reg3, ch) 407*4882a593Smuzhiyun #define SYS_REG_ENC_CS1_ROW_V3(row, reg2, reg3, ch) \ 408*4882a593Smuzhiyun SYS_REG_ENC_CS1_ROW(row, reg2, reg3, ch) 409*4882a593Smuzhiyun #define SYS_REG_DEC_CS1_ROW_V3(reg2, reg3, ch) \ 410*4882a593Smuzhiyun SYS_REG_DEC_CS1_ROW(reg2, reg3, ch) 411*4882a593Smuzhiyun #define SYS_REG_ENC_CS2_DELTA_ROW_V3(row_del) ((row_del) << 15) 412*4882a593Smuzhiyun #define SYS_REG_DEC_CS2_DELTA_ROW_V3(reg3) (((reg3) >> 15) & 1) 413*4882a593Smuzhiyun #define SYS_REG_ENC_CS3_DELTA_ROW_V3(row_del) ((row_del) << 16) 414*4882a593Smuzhiyun #define SYS_REG_DEC_CS3_DELTA_ROW_V3(reg3) (((reg3) >> 16) & 1) 415*4882a593Smuzhiyun 416*4882a593Smuzhiyun #define SYS_REG_ENC_CS1_COL_V3(col, ch) SYS_REG_ENC_CS1_COL(col, ch) 417*4882a593Smuzhiyun #define SYS_REG_DEC_CS1_COL_V3(reg3, ch) SYS_REG_DEC_CS1_COL(reg3, ch) 418*4882a593Smuzhiyun 419*4882a593Smuzhiyun void sdram_org_config(struct sdram_cap_info *cap_info, 420*4882a593Smuzhiyun struct sdram_base_params *base, 421*4882a593Smuzhiyun u32 *p_os_reg2, u32 *p_os_reg3, u32 channel); 422*4882a593Smuzhiyun void sdram_org_config_v3(struct sdram_cap_info *cap_info, 423*4882a593Smuzhiyun struct sdram_base_params *base, 424*4882a593Smuzhiyun u32 *p_os_reg2, u32 *p_os_reg3, u32 channel); 425*4882a593Smuzhiyun int sdram_detect_bw(struct sdram_cap_info *cap_info); 426*4882a593Smuzhiyun int sdram_detect_cs(struct sdram_cap_info *cap_info); 427*4882a593Smuzhiyun int sdram_detect_col(struct sdram_cap_info *cap_info, 428*4882a593Smuzhiyun u32 coltmp); 429*4882a593Smuzhiyun int sdram_detect_bank(struct sdram_cap_info *cap_info, 430*4882a593Smuzhiyun u32 coltmp, u32 bktmp); 431*4882a593Smuzhiyun int sdram_detect_bg(struct sdram_cap_info *cap_info, 432*4882a593Smuzhiyun u32 coltmp); 433*4882a593Smuzhiyun int sdram_detect_dbw(struct sdram_cap_info *cap_info, u32 dram_type); 434*4882a593Smuzhiyun int sdram_detect_row(struct sdram_cap_info *cap_info, 435*4882a593Smuzhiyun u32 coltmp, u32 bktmp, u32 rowtmp); 436*4882a593Smuzhiyun int sdram_detect_row_3_4(struct sdram_cap_info *cap_info, 437*4882a593Smuzhiyun u32 coltmp, u32 bktmp); 438*4882a593Smuzhiyun int sdram_detect_high_row(struct sdram_cap_info *cap_info, u32 dramtype); 439*4882a593Smuzhiyun int sdram_detect_cs1_row(struct sdram_cap_info *cap_info, u32 dram_type); 440*4882a593Smuzhiyun 441*4882a593Smuzhiyun void sdram_print_dram_type(unsigned char dramtype); 442*4882a593Smuzhiyun void sdram_print_ddr_info(struct sdram_cap_info *cap_info, 443*4882a593Smuzhiyun struct sdram_base_params *base, u32 split); 444*4882a593Smuzhiyun u64 sdram_get_cs_cap(struct sdram_cap_info *cap_info, u32 cs, u32 dram_type); 445*4882a593Smuzhiyun void sdram_copy_to_reg(u32 *dest, const u32 *src, u32 n); 446*4882a593Smuzhiyun 447*4882a593Smuzhiyun #endif 448