* [U-Boot] [PATCH V3 0/6] board: ge: Move bootcount to EEPROM @ 2018-10-17 8:33 Fabien Lahoudere 2018-10-17 8:33 ` [U-Boot] [PATCH V3 1/6] board: ge: Remove EEPROM bus param from read_vpd() Fabien Lahoudere ` (5 more replies) 0 siblings, 6 replies; 13+ messages in thread From: Fabien Lahoudere @ 2018-10-17 8:33 UTC (permalink / raw) To: u-boot GE boards need bootcount set in EEPROM instead of file to avoid some issues. This series replace v2 sent by Sebastian Reichel on 2018-07-20. Changes since v2: - Patches have been rebased to apply correctly on master. - Remove a build time warning - Remove checkpatch.pl warning Denis Zalevskiy (6): board: ge: Remove EEPROM bus param from read_vpd() board: ge: Move VPD EEPROM configuration to the defconfig bootcount: i2c: Add bus switching to the I2C bootcount driver bootcount: Configure length limit for I2C bootcount board: ge: Move VPD reading to the vpd_reader board: ge: Store bootcount in EEPROM on PPD and Bx50v3 board/ge/bx50v3/Kconfig | 2 + board/ge/bx50v3/bx50v3.c | 57 ++++++---------------------- board/ge/common/Kconfig | 14 +++++++ board/ge/common/vpd_reader.c | 57 ++++++++++++++++++++++++++-- board/ge/common/vpd_reader.h | 16 +++++--- board/ge/mx53ppd/Kconfig | 2 + board/ge/mx53ppd/mx53ppd.c | 44 ++++------------------ configs/ge_bx50v3_defconfig | 27 +++++++++++-- configs/mx53ppd_defconfig | 29 ++++++++++++-- drivers/bootcount/Kconfig | 21 ++++++++++- drivers/bootcount/bootcount_i2c.c | 79 +++++++++++++++++++++++++++++++++------ include/configs/ge_bx50v3.h | 6 +-- include/configs/mx53ppd.h | 6 +-- 13 files changed, 243 insertions(+), 117 deletions(-) create mode 100644 board/ge/common/Kconfig -- 1.8.3.1 ^ permalink raw reply [flat|nested] 13+ messages in thread
* [U-Boot] [PATCH V3 1/6] board: ge: Remove EEPROM bus param from read_vpd() 2018-10-17 8:33 [U-Boot] [PATCH V3 0/6] board: ge: Move bootcount to EEPROM Fabien Lahoudere @ 2018-10-17 8:33 ` Fabien Lahoudere 2018-12-08 17:27 ` Stefano Babic 2018-10-17 8:33 ` [U-Boot] [PATCH V3 2/6] board: ge: Move VPD EEPROM configuration to the defconfig Fabien Lahoudere ` (4 subsequent siblings) 5 siblings, 1 reply; 13+ messages in thread From: Fabien Lahoudere @ 2018-10-17 8:33 UTC (permalink / raw) To: u-boot From: Denis Zalevskiy <denis.zalevskiy@ge.com> The bus is statically defined, so remove redundant parameters from read_vpd() for PPD and Bx50v3. Signed-off-by: Denis Zalevskiy <denis.zalevskiy@ge.com> Signed-off-by: Fabien Lahoudere <fabien.lahoudere@collabora.com> --- board/ge/bx50v3/bx50v3.c | 6 +++--- board/ge/mx53ppd/mx53ppd.c | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/board/ge/bx50v3/bx50v3.c b/board/ge/bx50v3/bx50v3.c index b2d065c..c3c6ded 100644 --- a/board/ge/bx50v3/bx50v3.c +++ b/board/ge/bx50v3/bx50v3.c @@ -623,14 +623,14 @@ static void process_vpd(struct vpd_cache *vpd) eth_env_set_enetaddr_by_index("eth", i210_index, vpd->mac2); } -static int read_vpd(uint eeprom_bus) +static int read_vpd(void) { int res; int size = 1024; uint8_t *data; unsigned int current_i2c_bus = i2c_get_bus_num(); - res = i2c_set_bus_num(eeprom_bus); + res = i2c_set_bus_num(CONFIG_SYS_I2C_EEPROM_BUS); if (res < 0) return res; @@ -714,7 +714,7 @@ int board_init(void) setup_i2c(2, CONFIG_SYS_I2C_SPEED, 0x7f, &i2c_pad_info2); setup_i2c(3, CONFIG_SYS_I2C_SPEED, 0x7f, &i2c_pad_info3); - read_vpd(CONFIG_SYS_I2C_EEPROM_BUS); + read_vpd(); set_confidx(&vpd); diff --git a/board/ge/mx53ppd/mx53ppd.c b/board/ge/mx53ppd/mx53ppd.c index cf278e8..62137f6 100644 --- a/board/ge/mx53ppd/mx53ppd.c +++ b/board/ge/mx53ppd/mx53ppd.c @@ -328,7 +328,7 @@ static void process_vpd(struct vpd_cache *vpd) eth_env_set_enetaddr("ethaddr", vpd->mac1); } -static int read_vpd(uint eeprom_bus) +static int read_vpd(void) { struct vpd_cache vpd; int res; @@ -336,7 +336,7 @@ static int read_vpd(uint eeprom_bus) u8 *data; unsigned int current_i2c_bus = i2c_get_bus_num(); - res = i2c_set_bus_num(eeprom_bus); + res = i2c_set_bus_num(VPD_EEPROM_BUS); if (res < 0) return res; @@ -390,7 +390,7 @@ int board_late_init(void) { int res; - read_vpd(VPD_EEPROM_BUS); + read_vpd(); res = clock_1GHz(); if (res != 0) -- 1.8.3.1 ^ permalink raw reply related [flat|nested] 13+ messages in thread
* [U-Boot] [PATCH V3 1/6] board: ge: Remove EEPROM bus param from read_vpd() 2018-10-17 8:33 ` [U-Boot] [PATCH V3 1/6] board: ge: Remove EEPROM bus param from read_vpd() Fabien Lahoudere @ 2018-12-08 17:27 ` Stefano Babic 0 siblings, 0 replies; 13+ messages in thread From: Stefano Babic @ 2018-12-08 17:27 UTC (permalink / raw) To: u-boot Hi Fabien, On 17/10/18 10:33, Fabien Lahoudere wrote: > From: Denis Zalevskiy <denis.zalevskiy@ge.com> > > The bus is statically defined, so remove redundant parameters > from read_vpd() for PPD and Bx50v3. > > Signed-off-by: Denis Zalevskiy <denis.zalevskiy@ge.com> > Signed-off-by: Fabien Lahoudere <fabien.lahoudere@collabora.com> > --- Applied to u-boot-imx, master, thanks ! Best regards, Stefano Babic -- ===================================================================== DENX Software Engineering GmbH, Managing Director: Wolfgang Denk HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany Phone: +49-8142-66989-53 Fax: +49-8142-66989-80 Email: sbabic at denx.de ===================================================================== ^ permalink raw reply [flat|nested] 13+ messages in thread
* [U-Boot] [PATCH V3 2/6] board: ge: Move VPD EEPROM configuration to the defconfig 2018-10-17 8:33 [U-Boot] [PATCH V3 0/6] board: ge: Move bootcount to EEPROM Fabien Lahoudere 2018-10-17 8:33 ` [U-Boot] [PATCH V3 1/6] board: ge: Remove EEPROM bus param from read_vpd() Fabien Lahoudere @ 2018-10-17 8:33 ` Fabien Lahoudere 2018-12-08 17:28 ` Stefano Babic 2018-10-17 8:33 ` [U-Boot] [PATCH V3 3/6] bootcount: i2c: Add bus switching to the I2C bootcount driver Fabien Lahoudere ` (3 subsequent siblings) 5 siblings, 1 reply; 13+ messages in thread From: Fabien Lahoudere @ 2018-10-17 8:33 UTC (permalink / raw) To: u-boot From: Denis Zalevskiy <denis.zalevskiy@ge.com> Use standard configuration logic to define EEPROM constants. Names are based on VPD_EEPROM_ prefix because EEPROM_ is already used by i2c_eeprom driver. Signed-off-by: Denis Zalevskiy <denis.zalevskiy@ge.com> Signed-off-by: Fabien Lahoudere <fabien.lahoudere@collabora.com> --- board/ge/bx50v3/Kconfig | 2 ++ board/ge/bx50v3/bx50v3.c | 17 ++++------------- board/ge/common/Kconfig | 14 ++++++++++++++ board/ge/mx53ppd/Kconfig | 2 ++ board/ge/mx53ppd/mx53ppd.c | 14 ++++---------- configs/ge_bx50v3_defconfig | 9 +++++++++ configs/mx53ppd_defconfig | 10 ++++++++++ 7 files changed, 45 insertions(+), 23 deletions(-) create mode 100644 board/ge/common/Kconfig diff --git a/board/ge/bx50v3/Kconfig b/board/ge/bx50v3/Kconfig index 993b055..0593856 100644 --- a/board/ge/bx50v3/Kconfig +++ b/board/ge/bx50v3/Kconfig @@ -15,4 +15,6 @@ config SYS_SOC config SYS_CONFIG_NAME default "ge_bx50v3" +source "board/ge/common/Kconfig" + endif diff --git a/board/ge/bx50v3/bx50v3.c b/board/ge/bx50v3/bx50v3.c index c3c6ded..ca500f5 100644 --- a/board/ge/bx50v3/bx50v3.c +++ b/board/ge/bx50v3/bx50v3.c @@ -38,15 +38,6 @@ struct vpd_cache; static int confidx = 3; /* Default to b850v3. */ static struct vpd_cache vpd; -#ifndef CONFIG_SYS_I2C_EEPROM_ADDR -# define CONFIG_SYS_I2C_EEPROM_ADDR 0x50 -# define CONFIG_SYS_I2C_EEPROM_ADDR_LEN 1 -#endif - -#ifndef CONFIG_SYS_I2C_EEPROM_BUS -#define CONFIG_SYS_I2C_EEPROM_BUS 4 -#endif - #define NC_PAD_CTRL (PAD_CTL_PUS_100K_UP | \ PAD_CTL_SPEED_MED | PAD_CTL_DSE_40ohm | \ PAD_CTL_HYS) @@ -626,11 +617,11 @@ static void process_vpd(struct vpd_cache *vpd) static int read_vpd(void) { int res; - int size = 1024; + static const int size = CONFIG_SYS_VPD_EEPROM_SIZE; uint8_t *data; unsigned int current_i2c_bus = i2c_get_bus_num(); - res = i2c_set_bus_num(CONFIG_SYS_I2C_EEPROM_BUS); + res = i2c_set_bus_num(CONFIG_SYS_VPD_EEPROM_I2C_BUS); if (res < 0) return res; @@ -638,8 +629,8 @@ static int read_vpd(void) if (!data) return -ENOMEM; - res = i2c_read(CONFIG_SYS_I2C_EEPROM_ADDR, 0, - CONFIG_SYS_I2C_EEPROM_ADDR_LEN, data, size); + res = i2c_read(CONFIG_SYS_VPD_EEPROM_I2C_ADDR, 0, + CONFIG_SYS_VPD_EEPROM_I2C_ADDR_LEN, data, size); if (res == 0) { memset(&vpd, 0, sizeof(vpd)); diff --git a/board/ge/common/Kconfig b/board/ge/common/Kconfig new file mode 100644 index 0000000..637b264 --- /dev/null +++ b/board/ge/common/Kconfig @@ -0,0 +1,14 @@ +config SYS_VPD_EEPROM_I2C_ADDR + hex "I2C address of the EEPROM device used for VPD" + help + VPD = Vital Product Data + +config SYS_VPD_EEPROM_I2C_BUS + int "I2C bus of the EEPROM device used for VPD." + +config SYS_VPD_EEPROM_SIZE + int "Size in bytes of the EEPROM device used for VPD" + +config SYS_VPD_EEPROM_I2C_ADDR_LEN + int "Number of bytes to use for VPD EEPROM address" + default 1 diff --git a/board/ge/mx53ppd/Kconfig b/board/ge/mx53ppd/Kconfig index 6dc3818..bebb2fa 100644 --- a/board/ge/mx53ppd/Kconfig +++ b/board/ge/mx53ppd/Kconfig @@ -13,4 +13,6 @@ config SYS_SOC config SYS_CONFIG_NAME default "mx53ppd" +source "board/ge/common/Kconfig" + endif diff --git a/board/ge/mx53ppd/mx53ppd.c b/board/ge/mx53ppd/mx53ppd.c index 62137f6..3fa53ff 100644 --- a/board/ge/mx53ppd/mx53ppd.c +++ b/board/ge/mx53ppd/mx53ppd.c @@ -40,13 +40,6 @@ DECLARE_GLOBAL_DATA_PTR; -/* Index of I2C1, SEGMENT 1 (see CONFIG_SYS_I2C_BUSES). */ -#define VPD_EEPROM_BUS 2 - -/* Address of 24C08 EEPROM. */ -#define VPD_EEPROM_ADDR 0x50 -#define VPD_EEPROM_ADDR_LEN 1 - static u32 mx53_dram_size[2]; phys_size_t get_effective_memsize(void) @@ -332,11 +325,11 @@ static int read_vpd(void) { struct vpd_cache vpd; int res; - int size = 1024; + static const int size = CONFIG_SYS_VPD_EEPROM_SIZE; u8 *data; unsigned int current_i2c_bus = i2c_get_bus_num(); - res = i2c_set_bus_num(VPD_EEPROM_BUS); + res = i2c_set_bus_num(CONFIG_SYS_VPD_EEPROM_I2C_BUS); if (res < 0) return res; @@ -344,7 +337,8 @@ static int read_vpd(void) if (!data) return -ENOMEM; - res = i2c_read(VPD_EEPROM_ADDR, 0, VPD_EEPROM_ADDR_LEN, data, size); + res = i2c_read(CONFIG_SYS_VPD_EEPROM_I2C_ADDR, 0, + CONFIG_SYS_VPD_EEPROM_I2C_ADDR_LEN, data, size); if (res == 0) { memset(&vpd, 0, sizeof(vpd)); vpd_reader(size, data, &vpd, vpd_callback); diff --git a/configs/ge_bx50v3_defconfig b/configs/ge_bx50v3_defconfig index 729377d..8426279 100644 --- a/configs/ge_bx50v3_defconfig +++ b/configs/ge_bx50v3_defconfig @@ -8,6 +8,15 @@ CONFIG_FIT=y CONFIG_BOOTDELAY=1 CONFIG_SYS_CONSOLE_IS_IN_ENV=y CONFIG_SYS_CONSOLE_OVERWRITE_ROUTINE=y + +# monitor's EEPROM is connected to the bus through the mux channel 1 +# (the number is the offset in CONFIG_SYS_I2C_BUSES) +CONFIG_SYS_VPD_EEPROM_I2C_BUS=4 +# Address of Atmel 24C08 EEPROM +CONFIG_SYS_VPD_EEPROM_I2C_ADDR=0x50 +CONFIG_SYS_VPD_EEPROM_I2C_ADDR_LEN=1 +CONFIG_SYS_VPD_EEPROM_SIZE=1024 + CONFIG_SUPPORT_RAW_INITRD=y CONFIG_BOARD_EARLY_INIT_F=y CONFIG_LAST_STAGE_INIT=y diff --git a/configs/mx53ppd_defconfig b/configs/mx53ppd_defconfig index 7be5c04..2953e01 100644 --- a/configs/mx53ppd_defconfig +++ b/configs/mx53ppd_defconfig @@ -9,6 +9,16 @@ CONFIG_BOOTDELAY=1 # CONFIG_CONSOLE_MUX is not set CONFIG_SYS_CONSOLE_IS_IN_ENV=y CONFIG_SYS_CONSOLE_OVERWRITE_ROUTINE=y + +# monitor's EEPROM is connected to the bus through the mux channel 1 +# (the number is the offset in CONFIG_SYS_I2C_BUSES) +# (there is also Frame EEPROM connected to the channel 4 (bus 4)) +CONFIG_SYS_VPD_EEPROM_I2C_BUS=2 +# Address of Atmel 24C08 EEPROM +CONFIG_SYS_VPD_EEPROM_I2C_ADDR=0x50 +CONFIG_SYS_VPD_EEPROM_I2C_ADDR_LEN=1 +CONFIG_SYS_VPD_EEPROM_SIZE=1024 + CONFIG_SUPPORT_RAW_INITRD=y CONFIG_MISC_INIT_R=y CONFIG_HUSH_PARSER=y -- 1.8.3.1 ^ permalink raw reply related [flat|nested] 13+ messages in thread
* [U-Boot] [PATCH V3 2/6] board: ge: Move VPD EEPROM configuration to the defconfig 2018-10-17 8:33 ` [U-Boot] [PATCH V3 2/6] board: ge: Move VPD EEPROM configuration to the defconfig Fabien Lahoudere @ 2018-12-08 17:28 ` Stefano Babic 0 siblings, 0 replies; 13+ messages in thread From: Stefano Babic @ 2018-12-08 17:28 UTC (permalink / raw) To: u-boot On 17/10/18 10:33, Fabien Lahoudere wrote: > From: Denis Zalevskiy <denis.zalevskiy@ge.com> > > Use standard configuration logic to define EEPROM constants. > Names are based on VPD_EEPROM_ prefix because EEPROM_ is already > used by i2c_eeprom driver. > > Signed-off-by: Denis Zalevskiy <denis.zalevskiy@ge.com> > Signed-off-by: Fabien Lahoudere <fabien.lahoudere@collabora.com> > --- Applied to u-boot-imx, master, thanks ! Best regards, Stefano Babic -- ===================================================================== DENX Software Engineering GmbH, Managing Director: Wolfgang Denk HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany Phone: +49-8142-66989-53 Fax: +49-8142-66989-80 Email: sbabic at denx.de ===================================================================== ^ permalink raw reply [flat|nested] 13+ messages in thread
* [U-Boot] [PATCH V3 3/6] bootcount: i2c: Add bus switching to the I2C bootcount driver 2018-10-17 8:33 [U-Boot] [PATCH V3 0/6] board: ge: Move bootcount to EEPROM Fabien Lahoudere 2018-10-17 8:33 ` [U-Boot] [PATCH V3 1/6] board: ge: Remove EEPROM bus param from read_vpd() Fabien Lahoudere 2018-10-17 8:33 ` [U-Boot] [PATCH V3 2/6] board: ge: Move VPD EEPROM configuration to the defconfig Fabien Lahoudere @ 2018-10-17 8:33 ` Fabien Lahoudere 2018-12-08 17:28 ` Stefano Babic 2018-10-17 8:33 ` [U-Boot] [PATCH V3 4/6] bootcount: Configure length limit for I2C bootcount Fabien Lahoudere ` (2 subsequent siblings) 5 siblings, 1 reply; 13+ messages in thread From: Fabien Lahoudere @ 2018-10-17 8:33 UTC (permalink / raw) To: u-boot From: Denis Zalevskiy <denis.zalevskiy@ge.com> If there is an I2C mux, current bus should be switched before manipulating with I2C. Signed-off-by: Denis Zalevskiy <denis.zalevskiy@ge.com> Signed-off-by: Fabien Lahoudere <fabien.lahoudere@collabora.com> --- drivers/bootcount/Kconfig | 15 ++++++++- drivers/bootcount/bootcount_i2c.c | 71 ++++++++++++++++++++++++++++++++++----- 2 files changed, 77 insertions(+), 9 deletions(-) diff --git a/drivers/bootcount/Kconfig b/drivers/bootcount/Kconfig index 9a0bd51..f67f518 100644 --- a/drivers/bootcount/Kconfig +++ b/drivers/bootcount/Kconfig @@ -62,7 +62,9 @@ config BOOTCOUNT_I2C bool "Boot counter on I2C device" help Enable support for the bootcounter on an i2c (like RTC) device. - CONFIG_SYS_I2C_RTC_ADDR = i2c chip address + CONFIG_SYS_BOOTCOUNT_I2C_BUS = bus of the target I2C device, + CONFIG_SYS_I2C_RTC_ADDR is used as fallback + CONFIG_SYS_BOOTCOUNT_I2C_ADDR = target I2C device address CONFIG_SYS_BOOTCOUNT_ADDR = i2c addr which is used for the bootcounter. @@ -127,4 +129,15 @@ config SYS_BOOTCOUNT_ADDR help Set the address used for reading and writing the boot counter. +config SYS_BOOTCOUNT_I2C_BUS + int "I2C bootcounter device bus" + depends on BOOTCOUNT_I2C + help + I2C bus of the device used to store bootcounter + +config SYS_BOOTCOUNT_I2C_ADDR + hex "I2C bootcounter device address" + depends on BOOTCOUNT_I2C + help + I2C address of the device used to store bootcounter endif diff --git a/drivers/bootcount/bootcount_i2c.c b/drivers/bootcount/bootcount_i2c.c index 496741d..a1fc219 100644 --- a/drivers/bootcount/bootcount_i2c.c +++ b/drivers/bootcount/bootcount_i2c.c @@ -8,36 +8,91 @@ #include <linux/compiler.h> #include <i2c.h> +#ifndef CONFIG_SYS_BOOTCOUNT_I2C_ADDR +/* compatibility with the previous logic: + * previous version of driver used RTC device to store bootcount + */ +#define CONFIG_SYS_BOOTCOUNT_I2C_ADDR CONFIG_SYS_I2C_RTC_ADDR +#endif + #define BC_MAGIC 0xbc +#ifdef CONFIG_SYS_BOOTCOUNT_I2C_BUS +static int bootcount_set_bus(void) +{ + unsigned int current_bus = i2c_get_bus_num(); + + assert(current_bus <= INT_MAX); + + int res = i2c_set_bus_num(CONFIG_SYS_BOOTCOUNT_I2C_BUS); + + if (res < 0) { + puts("Error switching I2C bus\n"); + return res; + } + return (int)current_bus; +} + +static void bootcount_set_bus_back(int prev_bus) +{ + if (i2c_set_bus_num(prev_bus) < 0) + puts("Can't switch I2C bus back\n"); +} +#else +static inline void bootcount_set_bus(void) { return ; } + +static inline int bootcount_set_bus_back(int prev_bus __attribute__((unused))) +{ + return 0; +} +#endif + void bootcount_store(ulong a) { + int prev_i2c_bus = bootcount_set_bus(); + + if (prev_i2c_bus < 0) + return; + unsigned char buf[3]; int ret; buf[0] = BC_MAGIC; buf[1] = (a & 0xff); - ret = i2c_write(CONFIG_SYS_I2C_RTC_ADDR, CONFIG_SYS_BOOTCOUNT_ADDR, - CONFIG_BOOTCOUNT_ALEN, buf, 2); + ret = i2c_write(CONFIG_SYS_BOOTCOUNT_I2C_ADDR, + CONFIG_SYS_BOOTCOUNT_ADDR, + CONFIG_BOOTCOUNT_ALEN, buf, 2); if (ret != 0) puts("Error writing bootcount\n"); + + bootcount_set_bus_back(prev_i2c_bus); } ulong bootcount_load(void) { + ulong count = 0; + + int prev_i2c_bus = bootcount_set_bus(); + + if (prev_i2c_bus < 0) + return count; + unsigned char buf[3]; int ret; - ret = i2c_read(CONFIG_SYS_I2C_RTC_ADDR, CONFIG_SYS_BOOTCOUNT_ADDR, + ret = i2c_read(CONFIG_SYS_BOOTCOUNT_I2C_ADDR, + CONFIG_SYS_BOOTCOUNT_ADDR, CONFIG_BOOTCOUNT_ALEN, buf, 2); if (ret != 0) { puts("Error loading bootcount\n"); - return 0; + goto out; } if (buf[0] == BC_MAGIC) - return buf[1]; - - bootcount_store(0); + count = buf[1]; + else + bootcount_store(count); - return 0; +out: + bootcount_set_bus_back(prev_i2c_bus); + return count; } -- 1.8.3.1 ^ permalink raw reply related [flat|nested] 13+ messages in thread
* [U-Boot] [PATCH V3 3/6] bootcount: i2c: Add bus switching to the I2C bootcount driver 2018-10-17 8:33 ` [U-Boot] [PATCH V3 3/6] bootcount: i2c: Add bus switching to the I2C bootcount driver Fabien Lahoudere @ 2018-12-08 17:28 ` Stefano Babic 0 siblings, 0 replies; 13+ messages in thread From: Stefano Babic @ 2018-12-08 17:28 UTC (permalink / raw) To: u-boot On 17/10/18 10:33, Fabien Lahoudere wrote: > From: Denis Zalevskiy <denis.zalevskiy@ge.com> > > If there is an I2C mux, current bus should be switched before > manipulating with I2C. > > Signed-off-by: Denis Zalevskiy <denis.zalevskiy@ge.com> > Signed-off-by: Fabien Lahoudere <fabien.lahoudere@collabora.com> > --- Applied to u-boot-imx, master, thanks ! Best regards, Stefano Babic -- ===================================================================== DENX Software Engineering GmbH, Managing Director: Wolfgang Denk HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany Phone: +49-8142-66989-53 Fax: +49-8142-66989-80 Email: sbabic at denx.de ===================================================================== ^ permalink raw reply [flat|nested] 13+ messages in thread
* [U-Boot] [PATCH V3 4/6] bootcount: Configure length limit for I2C bootcount 2018-10-17 8:33 [U-Boot] [PATCH V3 0/6] board: ge: Move bootcount to EEPROM Fabien Lahoudere ` (2 preceding siblings ...) 2018-10-17 8:33 ` [U-Boot] [PATCH V3 3/6] bootcount: i2c: Add bus switching to the I2C bootcount driver Fabien Lahoudere @ 2018-10-17 8:33 ` Fabien Lahoudere 2018-12-08 17:28 ` Stefano Babic 2018-10-17 8:33 ` [U-Boot] [PATCH V3 5/6] board: ge: Move VPD reading to the vpd_reader Fabien Lahoudere 2018-10-17 8:33 ` [U-Boot] [PATCH V3 6/6] board: ge: Store bootcount in EEPROM on PPD and Bx50v3 Fabien Lahoudere 5 siblings, 1 reply; 13+ messages in thread From: Fabien Lahoudere @ 2018-10-17 8:33 UTC (permalink / raw) To: u-boot From: Denis Zalevskiy <denis.zalevskiy@ge.com> Bootcount driver should verify size against the maximum available space. New configuration parameter adds this capability and keeps backward compatibility by providing default value. Signed-off-by: Denis Zalevskiy <denis.zalevskiy@ge.com> Signed-off-by: Fabien Lahoudere <fabien.lahoudere@collabora.com> --- drivers/bootcount/Kconfig | 6 ++++++ drivers/bootcount/bootcount_i2c.c | 10 ++++++---- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/drivers/bootcount/Kconfig b/drivers/bootcount/Kconfig index f67f518..3eccd5b 100644 --- a/drivers/bootcount/Kconfig +++ b/drivers/bootcount/Kconfig @@ -140,4 +140,10 @@ config SYS_BOOTCOUNT_I2C_ADDR depends on BOOTCOUNT_I2C help I2C address of the device used to store bootcounter + +config BOOTCOUNT_I2C_LEN + int "Maximum length of bootcounter in bytes" + default 2 + depends on BOOTCOUNT_I2C + endif diff --git a/drivers/bootcount/bootcount_i2c.c b/drivers/bootcount/bootcount_i2c.c index a1fc219..73c920a 100644 --- a/drivers/bootcount/bootcount_i2c.c +++ b/drivers/bootcount/bootcount_i2c.c @@ -54,14 +54,15 @@ void bootcount_store(ulong a) if (prev_i2c_bus < 0) return; - unsigned char buf[3]; + unsigned char buf[2]; int ret; + BUILD_BUG_ON(sizeof(buf) > CONFIG_BOOTCOUNT_I2C_LEN); buf[0] = BC_MAGIC; buf[1] = (a & 0xff); ret = i2c_write(CONFIG_SYS_BOOTCOUNT_I2C_ADDR, CONFIG_SYS_BOOTCOUNT_ADDR, - CONFIG_BOOTCOUNT_ALEN, buf, 2); + CONFIG_BOOTCOUNT_ALEN, buf, sizeof(buf)); if (ret != 0) puts("Error writing bootcount\n"); @@ -77,12 +78,13 @@ ulong bootcount_load(void) if (prev_i2c_bus < 0) return count; - unsigned char buf[3]; + unsigned char buf[2]; int ret; + BUILD_BUG_ON(sizeof(buf) > CONFIG_BOOTCOUNT_I2C_LEN); ret = i2c_read(CONFIG_SYS_BOOTCOUNT_I2C_ADDR, CONFIG_SYS_BOOTCOUNT_ADDR, - CONFIG_BOOTCOUNT_ALEN, buf, 2); + CONFIG_BOOTCOUNT_ALEN, buf, sizeof(buf)); if (ret != 0) { puts("Error loading bootcount\n"); goto out; -- 1.8.3.1 ^ permalink raw reply related [flat|nested] 13+ messages in thread
* [U-Boot] [PATCH V3 4/6] bootcount: Configure length limit for I2C bootcount 2018-10-17 8:33 ` [U-Boot] [PATCH V3 4/6] bootcount: Configure length limit for I2C bootcount Fabien Lahoudere @ 2018-12-08 17:28 ` Stefano Babic 0 siblings, 0 replies; 13+ messages in thread From: Stefano Babic @ 2018-12-08 17:28 UTC (permalink / raw) To: u-boot On 17/10/18 10:33, Fabien Lahoudere wrote: > From: Denis Zalevskiy <denis.zalevskiy@ge.com> > > Bootcount driver should verify size against the maximum available space. > New configuration parameter adds this capability and keeps backward > compatibility by providing default value. > > Signed-off-by: Denis Zalevskiy <denis.zalevskiy@ge.com> > Signed-off-by: Fabien Lahoudere <fabien.lahoudere@collabora.com> > --- Applied to u-boot-imx, master, thanks ! Best regards, Stefano Babic -- ===================================================================== DENX Software Engineering GmbH, Managing Director: Wolfgang Denk HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany Phone: +49-8142-66989-53 Fax: +49-8142-66989-80 Email: sbabic at denx.de ===================================================================== ^ permalink raw reply [flat|nested] 13+ messages in thread
* [U-Boot] [PATCH V3 5/6] board: ge: Move VPD reading to the vpd_reader 2018-10-17 8:33 [U-Boot] [PATCH V3 0/6] board: ge: Move bootcount to EEPROM Fabien Lahoudere ` (3 preceding siblings ...) 2018-10-17 8:33 ` [U-Boot] [PATCH V3 4/6] bootcount: Configure length limit for I2C bootcount Fabien Lahoudere @ 2018-10-17 8:33 ` Fabien Lahoudere 2018-12-08 17:30 ` Stefano Babic 2018-10-17 8:33 ` [U-Boot] [PATCH V3 6/6] board: ge: Store bootcount in EEPROM on PPD and Bx50v3 Fabien Lahoudere 5 siblings, 1 reply; 13+ messages in thread From: Fabien Lahoudere @ 2018-10-17 8:33 UTC (permalink / raw) To: u-boot From: Denis Zalevskiy <denis.zalevskiy@ge.com> Merge functionality duplicated in bx50v3 and mx53ppd: the logic is the same except that process_vpd is called at different phases. Also read_vpd could end up in error, so there is no VPD data in this case - it shouldn't be processed. Signed-off-by: Denis Zalevskiy <denis.zalevskiy@ge.com> Signed-off-by: Fabien Lahoudere <fabien.lahoudere@collabora.com> --- board/ge/bx50v3/bx50v3.c | 48 ++++++++++---------------------------------- board/ge/common/vpd_reader.c | 37 +++++++++++++++++++++++++++++++--- board/ge/common/vpd_reader.h | 16 ++++++++++----- board/ge/mx53ppd/mx53ppd.c | 38 +++++++---------------------------- 4 files changed, 63 insertions(+), 76 deletions(-) diff --git a/board/ge/bx50v3/bx50v3.c b/board/ge/bx50v3/bx50v3.c index ca500f5..78e7ee6 100644 --- a/board/ge/bx50v3/bx50v3.c +++ b/board/ge/bx50v3/bx50v3.c @@ -33,8 +33,6 @@ #include "../../../drivers/net/e1000.h" DECLARE_GLOBAL_DATA_PTR; -struct vpd_cache; - static int confidx = 3; /* Default to b850v3. */ static struct vpd_cache vpd; @@ -552,6 +550,7 @@ int overwrite_console(void) #define VPD_MAC_ADDRESS_LENGTH 6 struct vpd_cache { + bool is_read; u8 product_id; u8 has; unsigned char mac1[VPD_MAC_ADDRESS_LENGTH]; @@ -561,11 +560,9 @@ struct vpd_cache { /* * Extracts MAC and product information from the VPD. */ -static int vpd_callback(void *userdata, u8 id, u8 version, u8 type, +static int vpd_callback(struct vpd_cache *vpd, u8 id, u8 version, u8 type, size_t size, u8 const *data) { - struct vpd_cache *vpd = (struct vpd_cache *)userdata; - if (id == VPD_BLOCK_HWID && version == 1 && type != VPD_TYPE_INVALID && size >= 1) { vpd->product_id = data[0]; @@ -589,6 +586,11 @@ static void process_vpd(struct vpd_cache *vpd) int fec_index = -1; int i210_index = -1; + if (!vpd->is_read) { + printf("VPD wasn't read"); + return; + } + switch (vpd->product_id) { case VPD_PRODUCT_B450: env_set("confidx", "1"); @@ -614,35 +616,6 @@ static void process_vpd(struct vpd_cache *vpd) eth_env_set_enetaddr_by_index("eth", i210_index, vpd->mac2); } -static int read_vpd(void) -{ - int res; - static const int size = CONFIG_SYS_VPD_EEPROM_SIZE; - uint8_t *data; - unsigned int current_i2c_bus = i2c_get_bus_num(); - - res = i2c_set_bus_num(CONFIG_SYS_VPD_EEPROM_I2C_BUS); - if (res < 0) - return res; - - data = (uint8_t *)malloc(size); - if (!data) - return -ENOMEM; - - res = i2c_read(CONFIG_SYS_VPD_EEPROM_I2C_ADDR, 0, - CONFIG_SYS_VPD_EEPROM_I2C_ADDR_LEN, data, size); - - if (res == 0) { - memset(&vpd, 0, sizeof(vpd)); - vpd_reader(size, data, &vpd, vpd_callback); - } - - free(data); - - i2c_set_bus_num(current_i2c_bus); - return res; -} - int board_eth_init(bd_t *bis) { setup_iomux_enet(); @@ -705,9 +678,10 @@ int board_init(void) setup_i2c(2, CONFIG_SYS_I2C_SPEED, 0x7f, &i2c_pad_info2); setup_i2c(3, CONFIG_SYS_I2C_SPEED, 0x7f, &i2c_pad_info3); - read_vpd(); - - set_confidx(&vpd); + if (!read_vpd(&vpd, vpd_callback)) { + vpd.is_read = true; + set_confidx(&vpd); + } gpio_direction_output(SUS_S3_OUT, 1); gpio_direction_output(WIFI_EN, 1); diff --git a/board/ge/common/vpd_reader.c b/board/ge/common/vpd_reader.c index c471583..12410d9 100644 --- a/board/ge/common/vpd_reader.c +++ b/board/ge/common/vpd_reader.c @@ -5,6 +5,7 @@ #include "vpd_reader.h" +#include <i2c.h> #include <linux/bch.h> #include <stdlib.h> @@ -105,9 +106,9 @@ static const size_t HEADER_BLOCK_ECC_LEN = 4; static const u8 ECC_BLOCK_ID = 0xFF; -int vpd_reader(size_t size, u8 *data, void *userdata, - int (*fn)(void *userdata, u8 id, u8 version, u8 type, - size_t size, u8 const *data)) +static int vpd_reader(size_t size, u8 *data, struct vpd_cache *userdata, + int (*fn)(struct vpd_cache *, u8 id, u8 version, u8 type, + size_t size, u8 const *data)) { if (size < HEADER_BLOCK_LEN || !data || !fn) return -EINVAL; @@ -194,3 +195,33 @@ int vpd_reader(size_t size, u8 *data, void *userdata, return ret; } } + +int read_vpd(struct vpd_cache *cache, + int (*process_block)(struct vpd_cache *, u8 id, u8 version, + u8 type, size_t size, u8 const *data)) +{ + static const size_t size = CONFIG_SYS_VPD_EEPROM_SIZE; + + int res; + u8 *data; + unsigned int current_i2c_bus = i2c_get_bus_num(); + + res = i2c_set_bus_num(CONFIG_SYS_VPD_EEPROM_I2C_BUS); + if (res < 0) + return res; + + data = malloc(size); + if (!data) + return -ENOMEM; + + res = i2c_read(CONFIG_SYS_VPD_EEPROM_I2C_ADDR, 0, + CONFIG_SYS_VPD_EEPROM_I2C_ADDR_LEN, + data, size); + if (res == 0) + res = vpd_reader(size, data, cache, process_block); + + free(data); + + i2c_set_bus_num(current_i2c_bus); + return res; +} diff --git a/board/ge/common/vpd_reader.h b/board/ge/common/vpd_reader.h index e60acf3..3045b7e 100644 --- a/board/ge/common/vpd_reader.h +++ b/board/ge/common/vpd_reader.h @@ -5,12 +5,18 @@ #include "common.h" +struct vpd_cache; + /* - * Read VPD from given data, verify content, and call callback - * for each vital product data block. + * Read VPD from given data, verify content, call callback for each vital + * product data block. + * + * cache: structure used by process block to store VPD information + * process_block: callback called for each VPD data block * * Returns Non-zero on error. Negative numbers encode errno. */ -int vpd_reader(size_t size, u8 *data, void *userdata, - int (*fn)(void *userdata, u8 id, u8 version, u8 type, - size_t size, u8 const *data)); +int read_vpd(struct vpd_cache *cache, + int (*process_block)(struct vpd_cache *, + u8 id, u8 version, u8 type, + size_t size, u8 const *data)); diff --git a/board/ge/mx53ppd/mx53ppd.c b/board/ge/mx53ppd/mx53ppd.c index 3fa53ff..f0c8abf 100644 --- a/board/ge/mx53ppd/mx53ppd.c +++ b/board/ge/mx53ppd/mx53ppd.c @@ -321,36 +321,6 @@ static void process_vpd(struct vpd_cache *vpd) eth_env_set_enetaddr("ethaddr", vpd->mac1); } -static int read_vpd(void) -{ - struct vpd_cache vpd; - int res; - static const int size = CONFIG_SYS_VPD_EEPROM_SIZE; - u8 *data; - unsigned int current_i2c_bus = i2c_get_bus_num(); - - res = i2c_set_bus_num(CONFIG_SYS_VPD_EEPROM_I2C_BUS); - if (res < 0) - return res; - - data = malloc(size); - if (!data) - return -ENOMEM; - - res = i2c_read(CONFIG_SYS_VPD_EEPROM_I2C_ADDR, 0, - CONFIG_SYS_VPD_EEPROM_I2C_ADDR_LEN, data, size); - if (res == 0) { - memset(&vpd, 0, sizeof(vpd)); - vpd_reader(size, data, &vpd, vpd_callback); - process_vpd(&vpd); - } - - free(data); - - i2c_set_bus_num(current_i2c_bus); - return res; -} - int board_init(void) { gd->bd->bi_boot_params = PHYS_SDRAM_1 + 0x100; @@ -383,8 +353,14 @@ int misc_init_r(void) int board_late_init(void) { int res; + struct vpd_cache vpd; - read_vpd(); + memset(&vpd, 0, sizeof(vpd)); + res = read_vpd(&vpd, vpd_callback); + if (!res) + process_vpd(&vpd); + else + printf("Can't read VPD"); res = clock_1GHz(); if (res != 0) -- 1.8.3.1 ^ permalink raw reply related [flat|nested] 13+ messages in thread
* [U-Boot] [PATCH V3 5/6] board: ge: Move VPD reading to the vpd_reader 2018-10-17 8:33 ` [U-Boot] [PATCH V3 5/6] board: ge: Move VPD reading to the vpd_reader Fabien Lahoudere @ 2018-12-08 17:30 ` Stefano Babic 0 siblings, 0 replies; 13+ messages in thread From: Stefano Babic @ 2018-12-08 17:30 UTC (permalink / raw) To: u-boot On 17/10/18 10:33, Fabien Lahoudere wrote: > From: Denis Zalevskiy <denis.zalevskiy@ge.com> > > Merge functionality duplicated in bx50v3 and mx53ppd: the logic > is the same except that process_vpd is called at different phases. > Also read_vpd could end up in error, so there is no VPD data in this > case - it shouldn't be processed. > > Signed-off-by: Denis Zalevskiy <denis.zalevskiy@ge.com> > Signed-off-by: Fabien Lahoudere <fabien.lahoudere@collabora.com> > --- > board/ge/bx50v3/bx50v3.c | 48 ++++++++++---------------------------------- > board/ge/common/vpd_reader.c | 37 +++++++++++++++++++++++++++++++--- > board/ge/common/vpd_reader.h | 16 ++++++++++----- > board/ge/mx53ppd/mx53ppd.c | 38 +++++++---------------------------- > 4 files changed, 63 insertions(+), 76 deletions(-) > > diff --git a/board/ge/bx50v3/bx50v3.c b/board/ge/bx50v3/bx50v3.c > index ca500f5..78e7ee6 100644 > --- a/board/ge/bx50v3/bx50v3.c > +++ b/board/ge/bx50v3/bx50v3.c > @@ -33,8 +33,6 @@ > #include "../../../drivers/net/e1000.h" > DECLARE_GLOBAL_DATA_PTR; > > -struct vpd_cache; > - > static int confidx = 3; /* Default to b850v3. */ > static struct vpd_cache vpd; > > @@ -552,6 +550,7 @@ int overwrite_console(void) > #define VPD_MAC_ADDRESS_LENGTH 6 > > struct vpd_cache { > + bool is_read; > u8 product_id; > u8 has; > unsigned char mac1[VPD_MAC_ADDRESS_LENGTH]; > @@ -561,11 +560,9 @@ struct vpd_cache { > /* > * Extracts MAC and product information from the VPD. > */ > -static int vpd_callback(void *userdata, u8 id, u8 version, u8 type, > +static int vpd_callback(struct vpd_cache *vpd, u8 id, u8 version, u8 type, > size_t size, u8 const *data) > { > - struct vpd_cache *vpd = (struct vpd_cache *)userdata; > - > if (id == VPD_BLOCK_HWID && version == 1 && type != VPD_TYPE_INVALID && > size >= 1) { > vpd->product_id = data[0]; > @@ -589,6 +586,11 @@ static void process_vpd(struct vpd_cache *vpd) > int fec_index = -1; > int i210_index = -1; > > + if (!vpd->is_read) { > + printf("VPD wasn't read"); > + return; > + } > + > switch (vpd->product_id) { > case VPD_PRODUCT_B450: > env_set("confidx", "1"); > @@ -614,35 +616,6 @@ static void process_vpd(struct vpd_cache *vpd) > eth_env_set_enetaddr_by_index("eth", i210_index, vpd->mac2); > } > > -static int read_vpd(void) > -{ > - int res; > - static const int size = CONFIG_SYS_VPD_EEPROM_SIZE; > - uint8_t *data; > - unsigned int current_i2c_bus = i2c_get_bus_num(); > - > - res = i2c_set_bus_num(CONFIG_SYS_VPD_EEPROM_I2C_BUS); > - if (res < 0) > - return res; > - > - data = (uint8_t *)malloc(size); > - if (!data) > - return -ENOMEM; > - > - res = i2c_read(CONFIG_SYS_VPD_EEPROM_I2C_ADDR, 0, > - CONFIG_SYS_VPD_EEPROM_I2C_ADDR_LEN, data, size); > - > - if (res == 0) { > - memset(&vpd, 0, sizeof(vpd)); > - vpd_reader(size, data, &vpd, vpd_callback); > - } > - > - free(data); > - > - i2c_set_bus_num(current_i2c_bus); > - return res; > -} > - > int board_eth_init(bd_t *bis) > { > setup_iomux_enet(); > @@ -705,9 +678,10 @@ int board_init(void) > setup_i2c(2, CONFIG_SYS_I2C_SPEED, 0x7f, &i2c_pad_info2); > setup_i2c(3, CONFIG_SYS_I2C_SPEED, 0x7f, &i2c_pad_info3); > > - read_vpd(); > - > - set_confidx(&vpd); > + if (!read_vpd(&vpd, vpd_callback)) { > + vpd.is_read = true; > + set_confidx(&vpd); > + } > > gpio_direction_output(SUS_S3_OUT, 1); > gpio_direction_output(WIFI_EN, 1); > diff --git a/board/ge/common/vpd_reader.c b/board/ge/common/vpd_reader.c > index c471583..12410d9 100644 > --- a/board/ge/common/vpd_reader.c > +++ b/board/ge/common/vpd_reader.c > @@ -5,6 +5,7 @@ > > #include "vpd_reader.h" > > +#include <i2c.h> > #include <linux/bch.h> > #include <stdlib.h> > > @@ -105,9 +106,9 @@ static const size_t HEADER_BLOCK_ECC_LEN = 4; > > static const u8 ECC_BLOCK_ID = 0xFF; > > -int vpd_reader(size_t size, u8 *data, void *userdata, > - int (*fn)(void *userdata, u8 id, u8 version, u8 type, > - size_t size, u8 const *data)) > +static int vpd_reader(size_t size, u8 *data, struct vpd_cache *userdata, > + int (*fn)(struct vpd_cache *, u8 id, u8 version, u8 type, > + size_t size, u8 const *data)) > { > if (size < HEADER_BLOCK_LEN || !data || !fn) > return -EINVAL; > @@ -194,3 +195,33 @@ int vpd_reader(size_t size, u8 *data, void *userdata, > return ret; > } > } > + > +int read_vpd(struct vpd_cache *cache, > + int (*process_block)(struct vpd_cache *, u8 id, u8 version, > + u8 type, size_t size, u8 const *data)) > +{ > + static const size_t size = CONFIG_SYS_VPD_EEPROM_SIZE; > + > + int res; > + u8 *data; > + unsigned int current_i2c_bus = i2c_get_bus_num(); > + > + res = i2c_set_bus_num(CONFIG_SYS_VPD_EEPROM_I2C_BUS); > + if (res < 0) > + return res; > + > + data = malloc(size); > + if (!data) > + return -ENOMEM; > + > + res = i2c_read(CONFIG_SYS_VPD_EEPROM_I2C_ADDR, 0, > + CONFIG_SYS_VPD_EEPROM_I2C_ADDR_LEN, > + data, size); > + if (res == 0) > + res = vpd_reader(size, data, cache, process_block); > + > + free(data); > + > + i2c_set_bus_num(current_i2c_bus); > + return res; > +} > diff --git a/board/ge/common/vpd_reader.h b/board/ge/common/vpd_reader.h > index e60acf3..3045b7e 100644 > --- a/board/ge/common/vpd_reader.h > +++ b/board/ge/common/vpd_reader.h > @@ -5,12 +5,18 @@ > > #include "common.h" > > +struct vpd_cache; > + > /* > - * Read VPD from given data, verify content, and call callback > - * for each vital product data block. > + * Read VPD from given data, verify content, call callback for each vital > + * product data block. > + * > + * cache: structure used by process block to store VPD information > + * process_block: callback called for each VPD data block > * > * Returns Non-zero on error. Negative numbers encode errno. > */ > -int vpd_reader(size_t size, u8 *data, void *userdata, > - int (*fn)(void *userdata, u8 id, u8 version, u8 type, > - size_t size, u8 const *data)); > +int read_vpd(struct vpd_cache *cache, > + int (*process_block)(struct vpd_cache *, > + u8 id, u8 version, u8 type, > + size_t size, u8 const *data)); > diff --git a/board/ge/mx53ppd/mx53ppd.c b/board/ge/mx53ppd/mx53ppd.c > index 3fa53ff..f0c8abf 100644 > --- a/board/ge/mx53ppd/mx53ppd.c > +++ b/board/ge/mx53ppd/mx53ppd.c > @@ -321,36 +321,6 @@ static void process_vpd(struct vpd_cache *vpd) > eth_env_set_enetaddr("ethaddr", vpd->mac1); > } > > -static int read_vpd(void) > -{ > - struct vpd_cache vpd; > - int res; > - static const int size = CONFIG_SYS_VPD_EEPROM_SIZE; > - u8 *data; > - unsigned int current_i2c_bus = i2c_get_bus_num(); > - > - res = i2c_set_bus_num(CONFIG_SYS_VPD_EEPROM_I2C_BUS); > - if (res < 0) > - return res; > - > - data = malloc(size); > - if (!data) > - return -ENOMEM; > - > - res = i2c_read(CONFIG_SYS_VPD_EEPROM_I2C_ADDR, 0, > - CONFIG_SYS_VPD_EEPROM_I2C_ADDR_LEN, data, size); > - if (res == 0) { > - memset(&vpd, 0, sizeof(vpd)); > - vpd_reader(size, data, &vpd, vpd_callback); > - process_vpd(&vpd); > - } > - > - free(data); > - > - i2c_set_bus_num(current_i2c_bus); > - return res; > -} > - > int board_init(void) > { > gd->bd->bi_boot_params = PHYS_SDRAM_1 + 0x100; > @@ -383,8 +353,14 @@ int misc_init_r(void) > int board_late_init(void) > { > int res; > + struct vpd_cache vpd; > > - read_vpd(); > + memset(&vpd, 0, sizeof(vpd)); > + res = read_vpd(&vpd, vpd_callback); I applied your patch, but this generates a warning. Please send a follow up patch to fix it. + res = read_vpd(&vpd, vpd_callback); + ^~~~~~~~~~~~ +In file included from board/ge/mx53ppd/mx53ppd.c:37:0: +board/ge/mx53ppd/../../ge/common/vpd_reader.h:19:5: note: expected ?int (*)(struct vpd_cache *, u8, u8, u8, size_t, const u8 *) {aka int (*)(struct vpd_cache *, unsigned char, unsigned char, unsigned char, unsigned int, const unsigned char *)}? but argument is of type ?int (*)(void *, u8, u8, u8, size_t, const u8 *) {aka int (*)(void *, unsigned char, unsigned char, unsigned char, unsigned int, const unsigned char *)}? + int read_vpd(struct vpd_cache *cache, Best regards, Stefano Babic -- ===================================================================== DENX Software Engineering GmbH, Managing Director: Wolfgang Denk HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany Phone: +49-8142-66989-53 Fax: +49-8142-66989-80 Email: sbabic at denx.de ===================================================================== ^ permalink raw reply [flat|nested] 13+ messages in thread
* [U-Boot] [PATCH V3 6/6] board: ge: Store bootcount in EEPROM on PPD and Bx50v3 2018-10-17 8:33 [U-Boot] [PATCH V3 0/6] board: ge: Move bootcount to EEPROM Fabien Lahoudere ` (4 preceding siblings ...) 2018-10-17 8:33 ` [U-Boot] [PATCH V3 5/6] board: ge: Move VPD reading to the vpd_reader Fabien Lahoudere @ 2018-10-17 8:33 ` Fabien Lahoudere 2018-12-08 17:30 ` Stefano Babic 5 siblings, 1 reply; 13+ messages in thread From: Fabien Lahoudere @ 2018-10-17 8:33 UTC (permalink / raw) To: u-boot From: Denis Zalevskiy <denis.zalevskiy@ge.com> u-boot's ext3/4 write/modify functionality sometimes corrupts filesystem in the case if it requires recovery (e.g. after unexpected shutdown) and we want to avoid the only filesystem modification we have - bootcounter writing. So, bootcounter will be stored in the EEPROM where VPD is stored. Signed-off-by: Denis Zalevskiy <denis.zalevskiy@ge.com> Signed-off-by: Fabien Lahoudere <fabien.lahoudere@collabora.com> --- board/ge/common/vpd_reader.c | 20 ++++++++++++++++++++ configs/ge_bx50v3_defconfig | 18 ++++++++++++++---- configs/mx53ppd_defconfig | 19 +++++++++++++++---- include/configs/ge_bx50v3.h | 6 +++--- include/configs/mx53ppd.h | 6 +++--- 5 files changed, 55 insertions(+), 14 deletions(-) diff --git a/board/ge/common/vpd_reader.c b/board/ge/common/vpd_reader.c index 12410d9..14507b4 100644 --- a/board/ge/common/vpd_reader.c +++ b/board/ge/common/vpd_reader.c @@ -5,6 +5,7 @@ #include "vpd_reader.h" +#include <linux/bug.h> #include <i2c.h> #include <linux/bch.h> #include <stdlib.h> @@ -200,7 +201,26 @@ int read_vpd(struct vpd_cache *cache, int (*process_block)(struct vpd_cache *, u8 id, u8 version, u8 type, size_t size, u8 const *data)) { +#if defined(CONFIG_BOOTCOUNT_I2C) && \ + (CONFIG_SYS_BOOTCOUNT_I2C_BUS == CONFIG_SYS_VPD_EEPROM_I2C_BUS) && \ + ((CONFIG_SYS_BOOTCOUNT_I2C_ADDR & 0xf0) == CONFIG_SYS_VPD_EEPROM_I2C_ADDR) + /* + * bootcount is expected to reside at the end of EEPROM + * + * check is hard-wired to the logic of the 24C08 EEPROM 256-bytes + * page-wise (4 pages) i2c_address/bootcount_address structure combined + * with raw I2C access, so the I2C address and offset are combined into: + * + * i2c_addr = (device_i2c_addr | page), + * offset = (offset - (page * 256))) + */ + BUILD_BUG_ON((CONFIG_SYS_BOOTCOUNT_I2C_ADDR & 0x0f) * 256 + + CONFIG_SYS_BOOTCOUNT_ADDR + CONFIG_BOOTCOUNT_I2C_LEN != + CONFIG_SYS_VPD_EEPROM_SIZE); + static const size_t size = CONFIG_SYS_BOOTCOUNT_ADDR; +#else static const size_t size = CONFIG_SYS_VPD_EEPROM_SIZE; +#endif int res; u8 *data; diff --git a/configs/ge_bx50v3_defconfig b/configs/ge_bx50v3_defconfig index 8426279..6a052e0 100644 --- a/configs/ge_bx50v3_defconfig +++ b/configs/ge_bx50v3_defconfig @@ -17,6 +17,20 @@ CONFIG_SYS_VPD_EEPROM_I2C_ADDR=0x50 CONFIG_SYS_VPD_EEPROM_I2C_ADDR_LEN=1 CONFIG_SYS_VPD_EEPROM_SIZE=1024 +CONFIG_BOOTCOUNT_I2C=y +CONFIG_BOOTCOUNT_LIMIT=y +CONFIG_SYS_BOOTCOUNT_I2C_BUS=4 +# bootcount is stored in VPD EEPROM +# we are using generic driver instead of EEPROM one (while should use it) +# at the end of VPD EEPROM: (SYS_VPD_EEPROM_SIZE - CONFIG_BOOTCOUNT_I2C_LEN) +# so, the address is 0x3FE: +# ("VPD EEPROM chip address" | "3rd 256-byte page"): +CONFIG_SYS_BOOTCOUNT_I2C_ADDR=0x53 +# (+ "offset in the page"): +CONFIG_SYS_BOOTCOUNT_ADDR=0xfe +CONFIG_BOOTCOUNT_I2C_LEN=2 +CONFIG_BOOTCOUNT_ALEN=1 + CONFIG_SUPPORT_RAW_INITRD=y CONFIG_BOARD_EARLY_INIT_F=y CONFIG_LAST_STAGE_INIT=y @@ -36,11 +50,7 @@ CONFIG_CMD_EXT4_WRITE=y CONFIG_CMD_FS_GENERIC=y CONFIG_DOS_PARTITION=y CONFIG_ENV_IS_IN_SPI_FLASH=y -CONFIG_BOOTCOUNT_LIMIT=y -CONFIG_BOOTCOUNT_EXT=y CONFIG_BOOTCOUNT_BOOTLIMIT=10 -CONFIG_SYS_BOOTCOUNT_EXT_DEVPART="1:5" -CONFIG_SYS_BOOTCOUNT_ADDR=0x7000A000 CONFIG_FSL_ESDHC=y CONFIG_SPI_FLASH=y CONFIG_SPI_FLASH_STMICRO=y diff --git a/configs/mx53ppd_defconfig b/configs/mx53ppd_defconfig index 2953e01..3470faa 100644 --- a/configs/mx53ppd_defconfig +++ b/configs/mx53ppd_defconfig @@ -19,6 +19,21 @@ CONFIG_SYS_VPD_EEPROM_I2C_ADDR=0x50 CONFIG_SYS_VPD_EEPROM_I2C_ADDR_LEN=1 CONFIG_SYS_VPD_EEPROM_SIZE=1024 +CONFIG_BOOTCOUNT_LIMIT=y +CONFIG_BOOTCOUNT_I2C=y +# using bus where monitor's EEPROM is connected to +CONFIG_SYS_BOOTCOUNT_I2C_BUS=2 +# bootcount is stored in Monitor's VPD EEPROM +# we are using generic driver instead of EEPROM one (while should use it) +# at the end of VPD EEPROM: (SYS_VPD_EEPROM_SIZE - CONFIG_BOOTCOUNT_I2C_LEN) +# so, the address is 0x3FE: +# ("VPD EEPROM chip address" | "3rd 256-byte page"): +CONFIG_SYS_BOOTCOUNT_I2C_ADDR=0x53 +# (+ "offset in the page"): +CONFIG_SYS_BOOTCOUNT_ADDR=0xfe +CONFIG_BOOTCOUNT_I2C_LEN=2 +CONFIG_BOOTCOUNT_ALEN=1 + CONFIG_SUPPORT_RAW_INITRD=y CONFIG_MISC_INIT_R=y CONFIG_HUSH_PARSER=y @@ -35,11 +50,7 @@ CONFIG_CMD_EXT4_WRITE=y CONFIG_CMD_FAT=y CONFIG_CMD_FS_GENERIC=y CONFIG_ENV_IS_IN_MMC=y -CONFIG_BOOTCOUNT_LIMIT=y -CONFIG_BOOTCOUNT_EXT=y CONFIG_BOOTCOUNT_BOOTLIMIT=10 -CONFIG_SYS_BOOTCOUNT_EXT_DEVPART="0:5" -CONFIG_SYS_BOOTCOUNT_ADDR=0x7000A000 CONFIG_FSL_ESDHC=y CONFIG_MII=y CONFIG_RTC_S35392A=y diff --git a/include/configs/ge_bx50v3.h b/include/configs/ge_bx50v3.h index fad840b..7212e7c 100644 --- a/include/configs/ge_bx50v3.h +++ b/include/configs/ge_bx50v3.h @@ -114,9 +114,9 @@ "setenv stdout vga; " \ "echo \"\n\n\n\n \" $msg; " \ "setenv stdout serial; " \ - "mw.b 0x7000A000 0xbc; " \ - "mw.b 0x7000A001 0x00; " \ - "ext4write ${dev} ${devnum}:5 0x7000A000 /boot/failures 2\0" \ + "i2c dev 4; " \ + "i2c mw.b 53 fe bc; " \ + "i2c mw.b 53 ff 00; \0" \ "altbootcmd=" \ "run doquiet; " \ "setenv partnum 1; run hasfirstboot || setenv partnum 2; " \ diff --git a/include/configs/mx53ppd.h b/include/configs/mx53ppd.h index bbd4cd7..1ecf604 100644 --- a/include/configs/mx53ppd.h +++ b/include/configs/mx53ppd.h @@ -126,9 +126,9 @@ "setenv stdout vga; " \ "echo \"\n\n\n\n \" $msg; " \ "setenv stdout serial; " \ - "mw.b 0x7000A000 0xbc; " \ - "mw.b 0x7000A001 0x00; " \ - "ext4write ${dev} ${devnum}:5 0x7000A000 /boot/failures 2\0" \ + "i2c dev 2; " \ + "i2c mw.b 53 fe bc; " \ + "i2c mw.b 53 ff 00; \0" \ "altbootcmd=" \ "run doquiet; " \ "setenv partnum 1; run hasfirstboot || setenv partnum 2; " \ -- 1.8.3.1 ^ permalink raw reply related [flat|nested] 13+ messages in thread
* [U-Boot] [PATCH V3 6/6] board: ge: Store bootcount in EEPROM on PPD and Bx50v3 2018-10-17 8:33 ` [U-Boot] [PATCH V3 6/6] board: ge: Store bootcount in EEPROM on PPD and Bx50v3 Fabien Lahoudere @ 2018-12-08 17:30 ` Stefano Babic 0 siblings, 0 replies; 13+ messages in thread From: Stefano Babic @ 2018-12-08 17:30 UTC (permalink / raw) To: u-boot On 17/10/18 10:33, Fabien Lahoudere wrote: > From: Denis Zalevskiy <denis.zalevskiy@ge.com> > > u-boot's ext3/4 write/modify functionality sometimes corrupts > filesystem in the case if it requires recovery (e.g. after unexpected > shutdown) and we want to avoid the only filesystem modification we > have - bootcounter writing. So, bootcounter will be stored in the EEPROM > where VPD is stored. > > Signed-off-by: Denis Zalevskiy <denis.zalevskiy@ge.com> > > Signed-off-by: Fabien Lahoudere <fabien.lahoudere@collabora.com> > --- Applied to u-boot-imx, master, thanks ! Best regards, Stefano Babic -- ===================================================================== DENX Software Engineering GmbH, Managing Director: Wolfgang Denk HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany Phone: +49-8142-66989-53 Fax: +49-8142-66989-80 Email: sbabic at denx.de ===================================================================== ^ permalink raw reply [flat|nested] 13+ messages in thread
end of thread, other threads:[~2018-12-08 17:30 UTC | newest] Thread overview: 13+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2018-10-17 8:33 [U-Boot] [PATCH V3 0/6] board: ge: Move bootcount to EEPROM Fabien Lahoudere 2018-10-17 8:33 ` [U-Boot] [PATCH V3 1/6] board: ge: Remove EEPROM bus param from read_vpd() Fabien Lahoudere 2018-12-08 17:27 ` Stefano Babic 2018-10-17 8:33 ` [U-Boot] [PATCH V3 2/6] board: ge: Move VPD EEPROM configuration to the defconfig Fabien Lahoudere 2018-12-08 17:28 ` Stefano Babic 2018-10-17 8:33 ` [U-Boot] [PATCH V3 3/6] bootcount: i2c: Add bus switching to the I2C bootcount driver Fabien Lahoudere 2018-12-08 17:28 ` Stefano Babic 2018-10-17 8:33 ` [U-Boot] [PATCH V3 4/6] bootcount: Configure length limit for I2C bootcount Fabien Lahoudere 2018-12-08 17:28 ` Stefano Babic 2018-10-17 8:33 ` [U-Boot] [PATCH V3 5/6] board: ge: Move VPD reading to the vpd_reader Fabien Lahoudere 2018-12-08 17:30 ` Stefano Babic 2018-10-17 8:33 ` [U-Boot] [PATCH V3 6/6] board: ge: Store bootcount in EEPROM on PPD and Bx50v3 Fabien Lahoudere 2018-12-08 17:30 ` Stefano Babic
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.