[PATCH v2 05/28] ram: rockchip: Update high row detection for full bw
Kever Yang
kever.yang at rock-chips.com
Wed Sep 28 14:16:55 CEST 2022
On 2022/8/18 22:52, Jagan Teki wrote:
> High row detection for non-8bit bw requires axi split.
>
> So, update the existing high row detection code in order
> to support full bw chips.
>
> Signed-off-by: YouMin Chen <cym at rock-chips.com>
> Signed-off-by: Jagan Teki <jagan at edgeble.ai>
Reviewed-by: Kever Yang <kever.yang at rock-chips.com>
Thanks,
- Kever
> ---
> Changes for v2:
> - none
>
> .../include/asm/arch-rockchip/sdram_common.h | 2 +-
> drivers/ram/rockchip/sdram_common.c | 56 ++++++++++++++++++-
> drivers/ram/rockchip/sdram_px30.c | 2 +-
> 3 files changed, 55 insertions(+), 5 deletions(-)
>
> diff --git a/arch/arm/include/asm/arch-rockchip/sdram_common.h b/arch/arm/include/asm/arch-rockchip/sdram_common.h
> index a14b37cbc5..dd316f771a 100644
> --- a/arch/arm/include/asm/arch-rockchip/sdram_common.h
> +++ b/arch/arm/include/asm/arch-rockchip/sdram_common.h
> @@ -136,7 +136,7 @@ int sdram_detect_row(struct sdram_cap_info *cap_info,
> u32 coltmp, u32 bktmp, u32 rowtmp);
> int sdram_detect_row_3_4(struct sdram_cap_info *cap_info,
> u32 coltmp, u32 bktmp);
> -int sdram_detect_high_row(struct sdram_cap_info *cap_info);
> +int sdram_detect_high_row(struct sdram_cap_info *cap_info, u32 dramtype);
> int sdram_detect_cs1_row(struct sdram_cap_info *cap_info, u32 dram_type);
> u64 sdram_get_cs_cap(struct sdram_cap_info *cap_info, u32 cs, u32 dram_type);
> void sdram_copy_to_reg(u32 *dest, const u32 *src, u32 n);
> diff --git a/drivers/ram/rockchip/sdram_common.c b/drivers/ram/rockchip/sdram_common.c
> index 1c3236746a..17d0096dfd 100644
> --- a/drivers/ram/rockchip/sdram_common.c
> +++ b/drivers/ram/rockchip/sdram_common.c
> @@ -381,10 +381,60 @@ int sdram_detect_row_3_4(struct sdram_cap_info *cap_info,
> return 0;
> }
>
> -int sdram_detect_high_row(struct sdram_cap_info *cap_info)
> +int sdram_detect_high_row(struct sdram_cap_info *cap_info, u32 dramtype)
> {
> - cap_info->cs0_high16bit_row = cap_info->cs0_row;
> - cap_info->cs1_high16bit_row = cap_info->cs1_row;
> + unsigned long base_addr;
> + u32 cs0_high_row, cs1_high_row, cs;
> + u64 cap = 0, cs0_cap = 0;
> + u32 i;
> + void __iomem *test_addr, *test_addr1;
> +
> + cs = cap_info->rank;
> + /* 8bit bandwidth no enable axi split*/
> + if (!cap_info->bw) {
> + cs0_high_row = cap_info->cs0_row;
> + cs1_high_row = cap_info->cs1_row;
> + goto out;
> + }
> +
> + cs0_cap = sdram_get_cs_cap(cap_info, 0, dramtype);
> + if (cs == 2) {
> + base_addr = CONFIG_SYS_SDRAM_BASE + cs0_cap;
> + cap = sdram_get_cs_cap(cap_info, 1, dramtype);
> + } else {
> + base_addr = CONFIG_SYS_SDRAM_BASE;
> + cap = cs0_cap;
> + }
> + /* detect full bandwidth size */
> + for (i = 0; i < 4; i++) {
> + test_addr = (void __iomem *)base_addr;
> + test_addr1 = (void __iomem *)(base_addr +
> + (unsigned long)(cap / (1ul << (i + 1))));
> + writel(0x0, test_addr);
> + writel(PATTERN, test_addr1);
> + if ((readl(test_addr) == 0x0) &&
> + (readl(test_addr1) == PATTERN))
> + break;
> + }
> + if (i == 4 && cs == 1) {
> + printascii("can't support this cap\n");
> + return -1;
> + }
> +
> + if (cs == 2) {
> + cs0_high_row = cap_info->cs0_row;
> + if (i == 4)
> + cs1_high_row = 0;
> + else
> + cs1_high_row = cap_info->cs1_row - i;
> + } else {
> + cs0_high_row = cap_info->cs0_row - i;
> + cs1_high_row = 0;
> + }
> +
> +out:
> + cap_info->cs0_high16bit_row = cs0_high_row;
> + cap_info->cs1_high16bit_row = cs1_high_row;
>
> return 0;
> }
> diff --git a/drivers/ram/rockchip/sdram_px30.c b/drivers/ram/rockchip/sdram_px30.c
> index a003893538..6b700f5ce5 100644
> --- a/drivers/ram/rockchip/sdram_px30.c
> +++ b/drivers/ram/rockchip/sdram_px30.c
> @@ -677,7 +677,7 @@ static int sdram_init_detect(struct dram_info *dram,
> writel(sys_reg3, &dram->pmugrf->os_reg[3]);
> }
>
> - ret = sdram_detect_high_row(cap_info);
> + ret = sdram_detect_high_row(cap_info, sdram_params->base.dramtype);
>
> out:
> return ret;
More information about the U-Boot
mailing list