[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