diff mbox

[U-Boot,V2,05/14] ARM: AM43XX: board: add support for reading onboard EEPROM

Message ID 1385014699-7257-6-git-send-email-lokeshvutla@ti.com
State Changes Requested
Delegated to: Tom Rini
Headers show

Commit Message

Lokesh Vutla Nov. 21, 2013, 6:18 a.m. UTC
From: Sekhar Nori <nsekhar@ti.com>

Add support for reading onboard EEPROM to enable
board detection.

Signed-off-by: Sekhar Nori <nsekhar@ti.com>
Signed-off-by: Lokesh Vutla <lokeshvutla@ti.com>
---
 arch/arm/include/asm/arch-am33xx/omap.h |    2 ++
 board/ti/am43xx/board.c                 |   46 +++++++++++++++++++++++++++++++
 board/ti/am43xx/board.h                 |   32 +++++++++++++++++++++
 include/configs/am43xx_evm.h            |    7 +++++
 4 files changed, 87 insertions(+)

Comments

Vaibhav Bedia Nov. 21, 2013, 8:26 p.m. UTC | #1
On Thu, Nov 21, 2013 at 1:18 AM, Lokesh Vutla <lokeshvutla@ti.com> wrote:
[...]
>  #define NON_SECURE_SRAM_START  0x402F0400
>  #define NON_SECURE_SRAM_END    0x40340000
>  #define SRAM_SCRATCH_SPACE_ADDR        0x4033C000
> +#define AM4372_BOARD_NAME_START        SRAM_SCRATCH_SPACE_ADDR
> +#define AM4372_BOARD_NAME_END  SRAM_SCRATCH_SPACE_ADDR + 0xC

Why do you need to keep the struct address hardcoded like this?

[...]
> +static inline int board_is_eposevm(void)
> +{
> +       return !strncmp(am43xx_board_name, "AM43EPOS", HDR_NAME_LEN);
> +}
> +
> +static inline int board_is_gpevm(void)
> +{
> +       return !strncmp(am43xx_board_name, "AM43__GP", HDR_NAME_LEN);
> +}
> +

Looks like you got the EEPROM content updated ;)

Regards,
Vaibhav
Lokesh Vutla Nov. 25, 2013, 4:46 a.m. UTC | #2
On Friday 22 November 2013 01:56 AM, Vaibhav Bedia wrote:
> On Thu, Nov 21, 2013 at 1:18 AM, Lokesh Vutla <lokeshvutla@ti.com> wrote:
> [...]
>>  #define NON_SECURE_SRAM_START  0x402F0400
>>  #define NON_SECURE_SRAM_END    0x40340000
>>  #define SRAM_SCRATCH_SPACE_ADDR        0x4033C000
>> +#define AM4372_BOARD_NAME_START        SRAM_SCRATCH_SPACE_ADDR
>> +#define AM4372_BOARD_NAME_END  SRAM_SCRATCH_SPACE_ADDR + 0xC
> 
> Why do you need to keep the struct address hardcoded like this?
FYI, this is not struct address. This is the place where where I am storing board name.
This helps in detecting the board.
It ll be good to understand the code properly and comment.
> 
> [...]
>> +static inline int board_is_eposevm(void)
>> +{
>> +       return !strncmp(am43xx_board_name, "AM43EPOS", HDR_NAME_LEN);
>> +}
>> +
>> +static inline int board_is_gpevm(void)
>> +{
>> +       return !strncmp(am43xx_board_name, "AM43__GP", HDR_NAME_LEN);
>> +}
>> +
> 
> Looks like you got the EEPROM content updated ;)
There is nothing updated. This is what I have used previously.
Please recollect your comments properly.

Thanks and regards,
Lokesh
> 
> Regards,
> Vaibhav
>
Vaibhav Bedia Nov. 26, 2013, 11:49 p.m. UTC | #3
On Sun, Nov 24, 2013 at 11:46 PM, Lokesh Vutla <lokeshvutla@ti.com> wrote:
> On Friday 22 November 2013 01:56 AM, Vaibhav Bedia wrote:
>> On Thu, Nov 21, 2013 at 1:18 AM, Lokesh Vutla <lokeshvutla@ti.com> wrote:
>> [...]
>>>  #define NON_SECURE_SRAM_START  0x402F0400
>>>  #define NON_SECURE_SRAM_END    0x40340000
>>>  #define SRAM_SCRATCH_SPACE_ADDR        0x4033C000
>>> +#define AM4372_BOARD_NAME_START        SRAM_SCRATCH_SPACE_ADDR
>>> +#define AM4372_BOARD_NAME_END  SRAM_SCRATCH_SPACE_ADDR + 0xC
>>
>> Why do you need to keep the struct address hardcoded like this?
> FYI, this is not struct address. This is the place where where I am storing board name.
> This helps in detecting the board.
> It ll be good to understand the code properly and comment.

My bad. Should have looked closer.

>>
>> [...]
>>> +static inline int board_is_eposevm(void)
>>> +{
>>> +       return !strncmp(am43xx_board_name, "AM43EPOS", HDR_NAME_LEN);
>>> +}
>>> +
>>> +static inline int board_is_gpevm(void)
>>> +{
>>> +       return !strncmp(am43xx_board_name, "AM43__GP", HDR_NAME_LEN);
>>> +}
>>> +
>>
>> Looks like you got the EEPROM content updated ;)
> There is nothing updated. This is what I have used previously.
> Please recollect your comments properly.
>

Well it would help if you added in a more detailed changelog for the different
variants of the patches highlighting what's changed and if some comment is
being ignored the reason for the same.

Regards,
Vaibhav
diff mbox

Patch

diff --git a/arch/arm/include/asm/arch-am33xx/omap.h b/arch/arm/include/asm/arch-am33xx/omap.h
index 2250721..10f05c9 100644
--- a/arch/arm/include/asm/arch-am33xx/omap.h
+++ b/arch/arm/include/asm/arch-am33xx/omap.h
@@ -27,5 +27,7 @@ 
 #define NON_SECURE_SRAM_START	0x402F0400
 #define NON_SECURE_SRAM_END	0x40340000
 #define SRAM_SCRATCH_SPACE_ADDR	0x4033C000
+#define AM4372_BOARD_NAME_START	SRAM_SCRATCH_SPACE_ADDR
+#define AM4372_BOARD_NAME_END	SRAM_SCRATCH_SPACE_ADDR + 0xC
 #endif
 #endif
diff --git a/board/ti/am43xx/board.c b/board/ti/am43xx/board.c
index dcd8cbb..4fc1a40 100644
--- a/board/ti/am43xx/board.c
+++ b/board/ti/am43xx/board.c
@@ -9,6 +9,8 @@ 
  */
 
 #include <common.h>
+#include <i2c.h>
+#include <asm/errno.h>
 #include <spl.h>
 #include <asm/arch/clock.h>
 #include <asm/arch/sys_proto.h>
@@ -17,6 +19,50 @@ 
 
 DECLARE_GLOBAL_DATA_PTR;
 
+/*
+ * Read header information from EEPROM into global structure.
+ */
+static int read_eeprom(struct am43xx_board_id *header)
+{
+	/* Check if baseboard eeprom is available */
+	if (i2c_probe(CONFIG_SYS_I2C_EEPROM_ADDR)) {
+		printf("Could not probe the EEPROM at 0x%x\n",
+		       CONFIG_SYS_I2C_EEPROM_ADDR);
+		return -ENODEV;
+	}
+
+	/* read the eeprom using i2c */
+	if (i2c_read(CONFIG_SYS_I2C_EEPROM_ADDR, 0, 2, (uchar *)header,
+		     sizeof(struct am43xx_board_id))) {
+		printf("Could not read the EEPROM\n");
+		return -EIO;
+	}
+
+	if (header->magic != 0xEE3355AA) {
+		/*
+		 * read the eeprom using i2c again,
+		 * but use only a 1 byte address
+		 */
+		if (i2c_read(CONFIG_SYS_I2C_EEPROM_ADDR, 0, 1, (uchar *)header,
+			     sizeof(struct am43xx_board_id))) {
+			printf("Could not read the EEPROM at 0x%x\n",
+			       CONFIG_SYS_I2C_EEPROM_ADDR);
+			return -EIO;
+		}
+
+		if (header->magic != 0xEE3355AA) {
+			printf("Incorrect magic number (0x%x) in EEPROM\n",
+			       header->magic);
+			return -EINVAL;
+		}
+	}
+
+	strncpy(am43xx_board_name, (char *)header->name, sizeof(header->name));
+	am43xx_board_name[sizeof(header->name)] = 0;
+
+	return 0;
+}
+
 #ifdef CONFIG_SPL_BUILD
 
 const struct dpll_params dpll_ddr = {
diff --git a/board/ti/am43xx/board.h b/board/ti/am43xx/board.h
index 8ca098b..9268895 100644
--- a/board/ti/am43xx/board.h
+++ b/board/ti/am43xx/board.h
@@ -12,6 +12,38 @@ 
 #ifndef _BOARD_H_
 #define _BOARD_H_
 
+#include <asm/arch/omap.h>
+
+static char *const am43xx_board_name = (char *)AM4372_BOARD_NAME_START;
+
+/*
+ * TI AM437x EVMs define a system EEPROM that defines certain sub-fields.
+ * We use these fields to in turn see what board we are on, and what
+ * that might require us to set or not set.
+ */
+#define HDR_NO_OF_MAC_ADDR	3
+#define HDR_ETH_ALEN		6
+#define HDR_NAME_LEN		8
+
+struct am43xx_board_id {
+	unsigned int  magic;
+	char name[HDR_NAME_LEN];
+	char version[4];
+	char serial[12];
+	char config[32];
+	char mac_addr[HDR_NO_OF_MAC_ADDR][HDR_ETH_ALEN];
+};
+
+static inline int board_is_eposevm(void)
+{
+	return !strncmp(am43xx_board_name, "AM43EPOS", HDR_NAME_LEN);
+}
+
+static inline int board_is_gpevm(void)
+{
+	return !strncmp(am43xx_board_name, "AM43__GP", HDR_NAME_LEN);
+}
+
 void enable_uart0_pin_mux(void);
 void enable_board_pin_mux(void);
 #endif
diff --git a/include/configs/am43xx_evm.h b/include/configs/am43xx_evm.h
index 6693321..7810c59 100644
--- a/include/configs/am43xx_evm.h
+++ b/include/configs/am43xx_evm.h
@@ -25,6 +25,13 @@ 
 #define CONFIG_SYS_NS16550_REG_SIZE	(-4)
 #define CONFIG_SYS_NS16550_CLK		48000000
 
+/* I2C Configuration */
+#define CONFIG_CMD_EEPROM
+#define CONFIG_ENV_EEPROM_IS_ON_I2C
+#define CONFIG_SYS_I2C_EEPROM_ADDR	0x50	/* Main EEPROM */
+#define CONFIG_SYS_I2C_EEPROM_ADDR_LEN	2
+#define CONFIG_SYS_I2C_MULTI_EEPROMS
+
 /* SPL defines. */
 #define CONFIG_SPL_TEXT_BASE		0x40300350
 #define CONFIG_SPL_MAX_SIZE		(0x4030C000 - CONFIG_SPL_TEXT_BASE)