diff mbox

[U-Boot,6/6] ARM: keystone2: use detected ddr3a size

Message ID 1456415535-22689-7-git-send-email-nm@ti.com
State Accepted
Commit 8efc24374176be3047f1585304fd33d5afca4dcb
Delegated to: Tom Rini
Headers show

Commit Message

Nishanth Menon Feb. 25, 2016, 3:52 p.m. UTC
From: Vitaly Andrianov <vitalya@ti.com>

Because KS2 u-boot works in 32 bit address space the existing ram_size
global data field cannot be used. The maximum, which the get_ram_size()
can detect is 2GB only. The ft_board_setup() needs the actual ddr3 size
to fix up dtb.

This commit introduces the ddr3_get_size() which uses SPD data to
calculate the ddr3 size. This function replaces the "ddr3_size"
environment variable, which was used to get the SODIMM size.

For platforms, which don't have SODIMM with SPD and ddr3 is populated to
a board a simple ddr3_get_size function that returns ddr3 size has to be
implemented. See hardware-k2l.h

Signed-off-by: Vitaly Andrianov <vitalya@ti.com>
Signed-off-by: Nishanth Menon <nm@ti.com>
---
 arch/arm/mach-keystone/ddr3_spd.c                  | 10 ++++++++++
 arch/arm/mach-keystone/include/mach/ddr3.h         |  1 +
 arch/arm/mach-keystone/include/mach/hardware-k2l.h |  7 +++++++
 board/ti/ks2_evm/board.c                           |  4 +---
 4 files changed, 19 insertions(+), 3 deletions(-)

Comments

Tom Rini Feb. 26, 2016, 6:16 p.m. UTC | #1
On Thu, Feb 25, 2016 at 09:52:15AM -0600, Nishanth Menon wrote:

> From: Vitaly Andrianov <vitalya@ti.com>
> 
> Because KS2 u-boot works in 32 bit address space the existing ram_size
> global data field cannot be used. The maximum, which the get_ram_size()
> can detect is 2GB only. The ft_board_setup() needs the actual ddr3 size
> to fix up dtb.
> 
> This commit introduces the ddr3_get_size() which uses SPD data to
> calculate the ddr3 size. This function replaces the "ddr3_size"
> environment variable, which was used to get the SODIMM size.
> 
> For platforms, which don't have SODIMM with SPD and ddr3 is populated to
> a board a simple ddr3_get_size function that returns ddr3 size has to be
> implemented. See hardware-k2l.h
> 
> Signed-off-by: Vitaly Andrianov <vitalya@ti.com>
> Signed-off-by: Nishanth Menon <nm@ti.com>

Reviewed-by: Tom Rini <trini@konsulko.com>
diff mbox

Patch

diff --git a/arch/arm/mach-keystone/ddr3_spd.c b/arch/arm/mach-keystone/ddr3_spd.c
index b0768823f2eb..a99b7728cefb 100644
--- a/arch/arm/mach-keystone/ddr3_spd.c
+++ b/arch/arm/mach-keystone/ddr3_spd.c
@@ -427,6 +427,16 @@  static int ddr3_read_spd(ddr3_spd_eeprom_t *spd_params)
 	return 0;
 }
 
+int ddr3_get_size(void)
+{
+	ddr3_spd_eeprom_t spd_params;
+
+	if (ddr3_read_spd(&spd_params))
+		return 0;
+
+	return ddr3_get_size_in_mb(&spd_params) / 1024;
+}
+
 int ddr3_get_dimm_params_from_spd(struct ddr3_spd_cb *spd_cb)
 {
 	struct ddr3_sodimm spd;
diff --git a/arch/arm/mach-keystone/include/mach/ddr3.h b/arch/arm/mach-keystone/include/mach/ddr3.h
index 68d3cb4245e9..5feffe825b97 100644
--- a/arch/arm/mach-keystone/include/mach/ddr3.h
+++ b/arch/arm/mach-keystone/include/mach/ddr3.h
@@ -66,5 +66,6 @@  void ddr3_err_reset_workaround(void);
 void ddr3_enable_ecc(u32 base, int test);
 void ddr3_init_ddrphy(u32 base, struct ddr3_phy_config *phy_cfg);
 void ddr3_init_ddremif(u32 base, struct ddr3_emif_config *emif_cfg);
+int ddr3_get_size(void);
 
 #endif
diff --git a/arch/arm/mach-keystone/include/mach/hardware-k2l.h b/arch/arm/mach-keystone/include/mach/hardware-k2l.h
index 4f1197ea923d..a59e0713593f 100644
--- a/arch/arm/mach-keystone/include/mach/hardware-k2l.h
+++ b/arch/arm/mach-keystone/include/mach/hardware-k2l.h
@@ -105,4 +105,11 @@ 
 /* NETCP */
 #define KS2_NETCP_BASE			0x26000000
 
+#ifndef __ASSEMBLY__
+static inline int ddr3_get_size(void)
+{
+	return 2;
+}
+#endif
+
 #endif /* __ASM_ARCH_HARDWARE_K2L_H */
diff --git a/board/ti/ks2_evm/board.c b/board/ti/ks2_evm/board.c
index 7d1709c880af..ca668a7c6902 100644
--- a/board/ti/ks2_evm/board.c
+++ b/board/ti/ks2_evm/board.c
@@ -146,9 +146,7 @@  int ft_board_setup(void *blob, bd_t *bd)
 
 	ddr3a_size = 0;
 	if (lpae) {
-		env = getenv("ddr3a_size");
-		if (env)
-			ddr3a_size = simple_strtol(env, NULL, 10);
+		ddr3a_size = ddr3_get_size();
 		if ((ddr3a_size != 8) && (ddr3a_size != 4))
 			ddr3a_size = 0;
 	}