[PATCH] DRAM_SUN50I_H616_TRIM_SIZE
dazen at 189.cn
dazen at 189.cn
Sat Apr 13 15:43:52 CEST 2024
From: lalakii <dazen at 189.cn>
Add "DRAM_SUN50I_H616_TRIM_SIZE" option for 1.5gb board.
Signed-off-by: lalakii <dazen at 189.cn>
---
arch/arm/include/asm/arch-sunxi/dram_sun50i_h616.h | 1 +
arch/arm/mach-sunxi/Kconfig | 7 +++++++
arch/arm/mach-sunxi/dram_sun50i_h616.c | 11 ++++++++++-
3 files changed, 18 insertions(+), 1 deletion(-)
diff --git a/arch/arm/include/asm/arch-sunxi/dram_sun50i_h616.h b/arch/arm/include/asm/arch-sunxi/dram_sun50i_h616.h
index a8fdda124a..2d2526fead 100644
--- a/arch/arm/include/asm/arch-sunxi/dram_sun50i_h616.h
+++ b/arch/arm/include/asm/arch-sunxi/dram_sun50i_h616.h
@@ -166,6 +166,7 @@ struct dram_config {
u8 rows;
u8 ranks;
u8 bus_full_width;
+ bool trim_size;
};
static inline int ns_to_t(int nanoseconds)
diff --git a/arch/arm/mach-sunxi/Kconfig b/arch/arm/mach-sunxi/Kconfig
index fe89aec6b9..255a498557 100644
--- a/arch/arm/mach-sunxi/Kconfig
+++ b/arch/arm/mach-sunxi/Kconfig
@@ -108,6 +108,13 @@ config DRAM_SUN50I_H616_TPR12
default 0x0
help
TPR12 value from vendor DRAM settings.
+
+config DRAM_SUN50I_H616_TRIM_SIZE
+ bool "H616 DRAM trim size"
+ help
+ Due to unknown issue, some H616 based boards may need to trim
+ size a bit.
+
endif
config SUN6I_PRCM
diff --git a/arch/arm/mach-sunxi/dram_sun50i_h616.c b/arch/arm/mach-sunxi/dram_sun50i_h616.c
index 37c139e0ee..4598d60a57 100644
--- a/arch/arm/mach-sunxi/dram_sun50i_h616.c
+++ b/arch/arm/mach-sunxi/dram_sun50i_h616.c
@@ -1349,8 +1349,15 @@ static unsigned long mctl_calc_size(const struct dram_config *config)
{
u8 width = config->bus_full_width ? 4 : 2;
+ unsigned long size;
+
+ size = (1ULL << (config->cols + config->rows + 3)) * width * config->ranks;
+
+ if (config->trim_size)
+ size = (size * 3) / (width == 4 ? 4 : 8);
+
/* 8 banks */
- return (1ULL << (config->cols + config->rows + 3)) * width * config->ranks;
+ return size;
}
static const struct dram_para para = {
@@ -1379,6 +1386,8 @@ unsigned long sunxi_dram_init(void)
struct sunxi_prcm_reg *const prcm =
(struct sunxi_prcm_reg *)SUNXI_PRCM_BASE;
struct dram_config config;
+ if (IS_ENABLED(CONFIG_DRAM_SUN50I_H616_TRIM_SIZE))
+ config.trim_size = true;
unsigned long size;
setbits_le32(&prcm->res_cal_ctrl, BIT(8));
--
2.44.0
More information about the U-Boot
mailing list