All of lore.kernel.org
 help / color / mirror / Atom feed
* [U-Boot] [PATCHv2 0/6] GE: Move from ext4 to eeprom bootcounter
@ 2018-07-20 15:31 Sebastian Reichel
  2018-07-20 15:31 ` [U-Boot] [PATCHv2 1/6] board: ge: Remove EEPROM bus param from read_vpd() Sebastian Reichel
                   ` (5 more replies)
  0 siblings, 6 replies; 7+ messages in thread
From: Sebastian Reichel @ 2018-07-20 15:31 UTC (permalink / raw)
  To: u-boot

Writing to ext4 from U-Boot is dangerous in case of inconsistent filesystem
state (i.e. due to power-loss). The current U-Boot code can modify the filesystem,
so that it is no longer usable by Linux after fsck. This patchset avoids writing
to the partition on GE devices by moving the boot counter to the last two bytes
of VPD EEPROM (together with some VPD cleanups). It also adds non RTC device support
to the i2c bootcounter driver.

Changes since PATCHv1:
 * add missing Kconfig file
 * rebase to current master (992c1db45591)

-- Sebastian

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        | 50 ++++----------------
 configs/ge_bx50v3_defconfig       | 27 +++++++++--
 configs/mx53ppd_defconfig         | 29 ++++++++++--
 drivers/bootcount/Kconfig         | 21 ++++++++-
 drivers/bootcount/bootcount_i2c.c | 78 ++++++++++++++++++++++++++-----
 include/configs/ge_bx50v3.h       |  6 +--
 include/configs/mx53ppd.h         |  6 +--
 13 files changed, 244 insertions(+), 121 deletions(-)
 create mode 100644 board/ge/common/Kconfig

-- 
2.18.0

^ permalink raw reply	[flat|nested] 7+ messages in thread

* [U-Boot] [PATCHv2 1/6] board: ge: Remove EEPROM bus param from read_vpd()
  2018-07-20 15:31 [U-Boot] [PATCHv2 0/6] GE: Move from ext4 to eeprom bootcounter Sebastian Reichel
@ 2018-07-20 15:31 ` Sebastian Reichel
  2018-07-20 15:31 ` [U-Boot] [PATCHv2 2/6] board: ge: Move VPD EEPROM configuration to the defconfig Sebastian Reichel
                   ` (4 subsequent siblings)
  5 siblings, 0 replies; 7+ messages in thread
From: Sebastian Reichel @ 2018-07-20 15:31 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: Sebastian Reichel <sebastian.reichel@collabora.co.uk>
---
 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 b2d065c1b801..55623d429179 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()
 {
 	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 cf278e8f47c6..850b8d517e82 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()
 {
 	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)
-- 
2.18.0

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [U-Boot] [PATCHv2 2/6] board: ge: Move VPD EEPROM configuration to the defconfig
  2018-07-20 15:31 [U-Boot] [PATCHv2 0/6] GE: Move from ext4 to eeprom bootcounter Sebastian Reichel
  2018-07-20 15:31 ` [U-Boot] [PATCHv2 1/6] board: ge: Remove EEPROM bus param from read_vpd() Sebastian Reichel
@ 2018-07-20 15:31 ` Sebastian Reichel
  2018-07-20 15:31 ` [U-Boot] [PATCHv2 3/6] bootcount: i2c: Add bus switching to the I2C bootcount driver Sebastian Reichel
                   ` (3 subsequent siblings)
  5 siblings, 0 replies; 7+ messages in thread
From: Sebastian Reichel @ 2018-07-20 15:31 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: Sebastian Reichel <sebastian.reichel@collabora.co.uk>
---
 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 993b0559302b..05938560abda 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 55623d429179..594e1265093f 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()
 {
 	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()
 	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 000000000000..637b264954a1
--- /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 6dc3818cb7bb..bebb2fab0173 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 850b8d517e82..13a5263040aa 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()
 {
 	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()
 	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 b312920a2543..0c2d033ad8e1 100644
--- a/configs/ge_bx50v3_defconfig
+++ b/configs/ge_bx50v3_defconfig
@@ -7,6 +7,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 8a0cc5d481ad..4a7e8eee0df1 100644
--- a/configs/mx53ppd_defconfig
+++ b/configs/mx53ppd_defconfig
@@ -8,6 +8,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_HUSH_PARSER=y
 CONFIG_CMD_BOOTZ=y
-- 
2.18.0

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [U-Boot] [PATCHv2 3/6] bootcount: i2c: Add bus switching to the I2C bootcount driver
  2018-07-20 15:31 [U-Boot] [PATCHv2 0/6] GE: Move from ext4 to eeprom bootcounter Sebastian Reichel
  2018-07-20 15:31 ` [U-Boot] [PATCHv2 1/6] board: ge: Remove EEPROM bus param from read_vpd() Sebastian Reichel
  2018-07-20 15:31 ` [U-Boot] [PATCHv2 2/6] board: ge: Move VPD EEPROM configuration to the defconfig Sebastian Reichel
@ 2018-07-20 15:31 ` Sebastian Reichel
  2018-07-20 15:31 ` [U-Boot] [PATCHv2 4/6] bootcount: Configure length limit for I2C bootcount Sebastian Reichel
                   ` (2 subsequent siblings)
  5 siblings, 0 replies; 7+ messages in thread
From: Sebastian Reichel @ 2018-07-20 15:31 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: Sebastian Reichel <sebastian.reichel@collabora.co.uk>
---
 drivers/bootcount/Kconfig         | 15 ++++++-
 drivers/bootcount/bootcount_i2c.c | 70 +++++++++++++++++++++++++++----
 2 files changed, 76 insertions(+), 9 deletions(-)

diff --git a/drivers/bootcount/Kconfig b/drivers/bootcount/Kconfig
index d335ed14b961..a5349a62fdc3 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.
 
@@ -119,4 +121,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 496741d63f78..02c313fc11e1 100644
--- a/drivers/bootcount/bootcount_i2c.c
+++ b/drivers/bootcount/bootcount_i2c.c
@@ -8,36 +8,90 @@
 #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 int bootcount_set_bus(void) { return 0; }
+
+static inline void bootcount_set_bus_back(int prev_bus __attribute__((unused)))
+{
+}
+#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;
 }
-- 
2.18.0

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [U-Boot] [PATCHv2 4/6] bootcount: Configure length limit for I2C bootcount
  2018-07-20 15:31 [U-Boot] [PATCHv2 0/6] GE: Move from ext4 to eeprom bootcounter Sebastian Reichel
                   ` (2 preceding siblings ...)
  2018-07-20 15:31 ` [U-Boot] [PATCHv2 3/6] bootcount: i2c: Add bus switching to the I2C bootcount driver Sebastian Reichel
@ 2018-07-20 15:31 ` Sebastian Reichel
  2018-07-20 15:31 ` [U-Boot] [PATCHv2 5/6] board: ge: Move VPD reading to the vpd_reader Sebastian Reichel
  2018-07-20 15:31 ` [U-Boot] [PATCHv2 6/6] board: ge: Store bootcount in EEPROM on PPD and Bx50v3 Sebastian Reichel
  5 siblings, 0 replies; 7+ messages in thread
From: Sebastian Reichel @ 2018-07-20 15:31 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: Sebastian Reichel <sebastian.reichel@collabora.co.uk>
---
 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 a5349a62fdc3..e7f2e1ef65e0 100644
--- a/drivers/bootcount/Kconfig
+++ b/drivers/bootcount/Kconfig
@@ -132,4 +132,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 02c313fc11e1..ed22389bdc86 100644
--- a/drivers/bootcount/bootcount_i2c.c
+++ b/drivers/bootcount/bootcount_i2c.c
@@ -53,14 +53,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(CONFIG_BOOTCOUNT_I2C_LEN < sizeof(buf));
 	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");
 
@@ -76,12 +77,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(CONFIG_BOOTCOUNT_I2C_LEN < sizeof(buf));
 	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;
-- 
2.18.0

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [U-Boot] [PATCHv2 5/6] board: ge: Move VPD reading to the vpd_reader
  2018-07-20 15:31 [U-Boot] [PATCHv2 0/6] GE: Move from ext4 to eeprom bootcounter Sebastian Reichel
                   ` (3 preceding siblings ...)
  2018-07-20 15:31 ` [U-Boot] [PATCHv2 4/6] bootcount: Configure length limit for I2C bootcount Sebastian Reichel
@ 2018-07-20 15:31 ` Sebastian Reichel
  2018-07-20 15:31 ` [U-Boot] [PATCHv2 6/6] board: ge: Store bootcount in EEPROM on PPD and Bx50v3 Sebastian Reichel
  5 siblings, 0 replies; 7+ messages in thread
From: Sebastian Reichel @ 2018-07-20 15:31 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: Sebastian Reichel <sebastian.reichel@collabora.co.uk>
---
 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   | 44 +++++++--------------------------
 4 files changed, 65 insertions(+), 80 deletions(-)

diff --git a/board/ge/bx50v3/bx50v3.c b/board/ge/bx50v3/bx50v3.c
index 594e1265093f..78e7ee62926f 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()
-{
-	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 c471583be86b..12410d9b715b 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 e60acf3d07d4..3045b7e21e22 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 13a5263040aa..51c5ec9a92cf 100644
--- a/board/ge/mx53ppd/mx53ppd.c
+++ b/board/ge/mx53ppd/mx53ppd.c
@@ -290,11 +290,9 @@ struct vpd_cache {
 /*
  * Extracts MAC and product information from the VPD.
  */
-static int vpd_callback(void *userdata, u8 id, u8 version, u8 type, size_t size,
-			u8 const *data)
+static int vpd_callback(struct vpd_cache *vpd, u8 id, u8 version, u8 type,
+						size_t size, const u8 *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];
@@ -321,36 +319,6 @@ static void process_vpd(struct vpd_cache *vpd)
 		eth_env_set_enetaddr("ethaddr", vpd->mac1);
 }
 
-static int read_vpd()
-{
-	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 +351,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)
-- 
2.18.0

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [U-Boot] [PATCHv2 6/6] board: ge: Store bootcount in EEPROM on PPD and Bx50v3
  2018-07-20 15:31 [U-Boot] [PATCHv2 0/6] GE: Move from ext4 to eeprom bootcounter Sebastian Reichel
                   ` (4 preceding siblings ...)
  2018-07-20 15:31 ` [U-Boot] [PATCHv2 5/6] board: ge: Move VPD reading to the vpd_reader Sebastian Reichel
@ 2018-07-20 15:31 ` Sebastian Reichel
  5 siblings, 0 replies; 7+ messages in thread
From: Sebastian Reichel @ 2018-07-20 15:31 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: Sebastian Reichel <sebastian.reichel@collabora.co.uk>
---
 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 12410d9b715b..14507b45e485 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 0c2d033ad8e1..952e87d62d84 100644
--- a/configs/ge_bx50v3_defconfig
+++ b/configs/ge_bx50v3_defconfig
@@ -16,6 +16,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
@@ -35,10 +49,6 @@ 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_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 4a7e8eee0df1..43672d88e202 100644
--- a/configs/mx53ppd_defconfig
+++ b/configs/mx53ppd_defconfig
@@ -18,6 +18,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_HUSH_PARSER=y
 CONFIG_CMD_BOOTZ=y
@@ -33,10 +48,6 @@ 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_SYS_BOOTCOUNT_EXT_DEVPART="0:5"
-CONFIG_SYS_BOOTCOUNT_ADDR=0x7000A000
 CONFIG_FSL_ESDHC=y
 CONFIG_NETDEVICES=y
 CONFIG_RTC_S35392A=y
diff --git a/include/configs/ge_bx50v3.h b/include/configs/ge_bx50v3.h
index fef41a8a1887..a6e31f7e91a9 100644
--- a/include/configs/ge_bx50v3.h
+++ b/include/configs/ge_bx50v3.h
@@ -116,9 +116,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 e08e83151fbf..0e353e270f91 100644
--- a/include/configs/mx53ppd.h
+++ b/include/configs/mx53ppd.h
@@ -129,9 +129,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; " \
-- 
2.18.0

^ permalink raw reply related	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2018-07-20 15:31 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-07-20 15:31 [U-Boot] [PATCHv2 0/6] GE: Move from ext4 to eeprom bootcounter Sebastian Reichel
2018-07-20 15:31 ` [U-Boot] [PATCHv2 1/6] board: ge: Remove EEPROM bus param from read_vpd() Sebastian Reichel
2018-07-20 15:31 ` [U-Boot] [PATCHv2 2/6] board: ge: Move VPD EEPROM configuration to the defconfig Sebastian Reichel
2018-07-20 15:31 ` [U-Boot] [PATCHv2 3/6] bootcount: i2c: Add bus switching to the I2C bootcount driver Sebastian Reichel
2018-07-20 15:31 ` [U-Boot] [PATCHv2 4/6] bootcount: Configure length limit for I2C bootcount Sebastian Reichel
2018-07-20 15:31 ` [U-Boot] [PATCHv2 5/6] board: ge: Move VPD reading to the vpd_reader Sebastian Reichel
2018-07-20 15:31 ` [U-Boot] [PATCHv2 6/6] board: ge: Store bootcount in EEPROM on PPD and Bx50v3 Sebastian Reichel

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.