From: lalakii <[email protected]>

Add "DRAM_SUN50I_H616_TRIM_SIZE" option for 1.5gb board.

Signed-off-by: lalakii <[email protected]>
---
 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

Reply via email to