[PATCH v2 1/2] rockchip: sdram: add basic support for sdram reg info version 3
Kever Yang
kever.yang at rock-chips.com
Wed Feb 8 15:52:23 CET 2023
On 2023/2/8 01:27, Jonas Karlman wrote:
> Newer DRAM initialization blobs from vendor can encode sdram info in a
> new version 3 format. The new format makes use of more bits in sys_reg3
> compared to the version 2 format.
>
> Add basic support for detecting the version 3 format and decoding the
> high bits used for ddrtype.
>
> This fixes decode of sdram size on my RK3568 boards that have LPDDR4X.
>
> Details on the new format was deciphered from vendor u-boot commit [1].
>
> [1] https://github.com/rockchip-linux/u-boot/commit/c69667e0e2bf4290ab1f408fcde58b8806ac266b
>
> Signed-off-by: Jonas Karlman <jonas at kwiboo.se>
Reviewed-by: Kever Yang <kever.yang at rock-chips.com>
Thanks,
- Kever
> ---
> v2:
> - No change
>
> arch/arm/include/asm/arch-rockchip/sdram.h | 28 +++++++++++++++-------
> arch/arm/mach-rockchip/sdram.c | 9 +++++--
> 2 files changed, 26 insertions(+), 11 deletions(-)
>
> diff --git a/arch/arm/include/asm/arch-rockchip/sdram.h b/arch/arm/include/asm/arch-rockchip/sdram.h
> index cf2a7b7d105f..4fb45ac5c76e 100644
> --- a/arch/arm/include/asm/arch-rockchip/sdram.h
> +++ b/arch/arm/include/asm/arch-rockchip/sdram.h
> @@ -8,10 +8,13 @@
>
> enum {
> DDR4 = 0,
> - DDR3 = 0x3,
> - LPDDR2 = 0x5,
> - LPDDR3 = 0x6,
> - LPDDR4 = 0x7,
> + DDR3 = 3,
> + LPDDR2 = 5,
> + LPDDR3 = 6,
> + LPDDR4 = 7,
> + LPDDR4X = 8,
> + LPDDR5 = 9,
> + DDR5 = 10,
> UNUSED = 0xFF
> };
>
> @@ -21,16 +24,16 @@ enum {
> * [30] row_3_4_ch0
> * [29:28] chinfo
> * [27] rank_ch1
> - * [26:25] col_ch1
> + * [26:25] cs0_col_ch1
> * [24] bk_ch1
> * [23:22] low bits of cs0_row_ch1
> * [21:20] low bits of cs1_row_ch1
> * [19:18] bw_ch1
> - * [17:16] dbw_ch1;
> - * [15:13] ddrtype
> + * [17:16] dbw_ch1
> + * [15:13] low bits of ddrtype
> * [12] channelnum
> - * [11] rank_ch0
> - * [10:9] col_ch0,
> + * [11] low bit of rank_ch0
> + * [10:9] cs0_col_ch0
> * [8] bk_ch0
> * [7:6] low bits of cs0_row_ch0
> * [5:4] low bits of cs1_row_ch0
> @@ -61,6 +64,11 @@ enum {
>
> /*
> * sys_reg3 bitfield struct
> + * [31:28] version
> + * [16] cs3_delta_row
> + * [15] cs2_delta_row
> + * [14] high bit of rank_ch0
> + * [13:12] high bits of ddrtype
> * [7] high bit of cs0_row_ch1
> * [6] high bit of cs1_row_ch1
> * [5] high bit of cs0_row_ch0
> @@ -70,6 +78,8 @@ enum {
> */
> #define SYS_REG_VERSION_SHIFT 28
> #define SYS_REG_VERSION_MASK 0xf
> +#define SYS_REG_EXTEND_DDRTYPE_SHIFT 12
> +#define SYS_REG_EXTEND_DDRTYPE_MASK 3
> #define SYS_REG_EXTEND_CS0_ROW_SHIFT(ch) (5 + (ch) * 2)
> #define SYS_REG_EXTEND_CS0_ROW_MASK 1
> #define SYS_REG_EXTEND_CS1_ROW_SHIFT(ch) (4 + (ch) * 2)
> diff --git a/arch/arm/mach-rockchip/sdram.c b/arch/arm/mach-rockchip/sdram.c
> index e086c47f3c00..91951e4b8ccf 100644
> --- a/arch/arm/mach-rockchip/sdram.c
> +++ b/arch/arm/mach-rockchip/sdram.c
> @@ -88,9 +88,15 @@ size_t rockchip_sdram_size(phys_addr_t reg)
> u32 sys_reg3 = readl(reg + 4);
> u32 ch_num = 1 + ((sys_reg2 >> SYS_REG_NUM_CH_SHIFT)
> & SYS_REG_NUM_CH_MASK);
> + u32 version = (sys_reg3 >> SYS_REG_VERSION_SHIFT) &
> + SYS_REG_VERSION_MASK;
>
> dram_type = (sys_reg2 >> SYS_REG_DDRTYPE_SHIFT) & SYS_REG_DDRTYPE_MASK;
> + if (version >= 3)
> + dram_type |= ((sys_reg3 >> SYS_REG_EXTEND_DDRTYPE_SHIFT) &
> + SYS_REG_EXTEND_DDRTYPE_MASK) << 3;
> debug("%s %x %x\n", __func__, (u32)reg, sys_reg2);
> + debug("%s %x %x\n", __func__, (u32)reg + 4, sys_reg3);
> for (ch = 0; ch < ch_num; ch++) {
> rank = 1 + (sys_reg2 >> SYS_REG_RANK_SHIFT(ch) &
> SYS_REG_RANK_MASK);
> @@ -98,8 +104,7 @@ size_t rockchip_sdram_size(phys_addr_t reg)
> SYS_REG_COL_MASK);
> cs1_col = cs0_col;
> bk = 3 - ((sys_reg2 >> SYS_REG_BK_SHIFT(ch)) & SYS_REG_BK_MASK);
> - if ((sys_reg3 >> SYS_REG_VERSION_SHIFT &
> - SYS_REG_VERSION_MASK) == 0x2) {
> + if (version >= 2) {
> cs1_col = 9 + (sys_reg3 >> SYS_REG_CS1_COL_SHIFT(ch) &
> SYS_REG_CS1_COL_MASK);
> if (((sys_reg3 >> SYS_REG_EXTEND_CS0_ROW_SHIFT(ch) &
More information about the U-Boot
mailing list