public inbox for u-boot@lists.denx.de
 help / color / mirror / Atom feed
* [U-Boot] [PATCH v5 0/8] Add support for GE PPD
@ 2017-11-06 19:14 Martyn Welch
  2017-11-07 10:00 ` Peter Robinson
  0 siblings, 1 reply; 16+ messages in thread
From: Martyn Welch @ 2017-11-06 19:14 UTC (permalink / raw)
  To: u-boot

This series adds support for the GE PPD. The initial patches in this
series resolve issues found during development and testing, extend
existing support and add new support for devices in the PPD. The final
patch in the series adds the board support for the PPD.

Ian Ray (2):
  ext4: recover from filesystem corruption when reading
  bootcount: add support for bootcounter on EXT filesystem

Martyn Welch (3):
  pwm: imx: Enable PWM support on i.MX53
  arm: mx5: Add more register definitions
  board: ge: make VPD code common

Nandor Han (2):
  imx: mxc_i2c: tweak the i2c transfer method
  rtc: add support for s35392a

Peter Senna Tschudin (1):
  mx53: Add Board support for GE PPD

 README                                   |   7 +
 arch/arm/include/asm/arch-mx5/crm_regs.h |   8 +
 arch/arm/include/asm/arch-mx5/imx-regs.h |  50 ++++
 arch/arm/mach-imx/mx5/Kconfig            |   7 +
 board/ge/bx50v3/Makefile                 |   2 +-
 board/ge/bx50v3/bx50v3.c                 |   2 +-
 board/ge/bx50v3/vpd_reader.c             | 228 ---------------
 board/ge/bx50v3/vpd_reader.h             |  25 --
 board/ge/common/Makefile                 |   7 +
 board/ge/common/vpd_reader.c             | 197 +++++++++++++
 board/ge/common/vpd_reader.h             |  17 ++
 board/ge/mx53ppd/Kconfig                 |  17 ++
 board/ge/mx53ppd/MAINTAINERS             |   7 +
 board/ge/mx53ppd/Makefile                |  12 +
 board/ge/mx53ppd/imximage.cfg            |  87 ++++++
 board/ge/mx53ppd/mx53ppd.c               | 457 +++++++++++++++++++++++++++++++
 board/ge/mx53ppd/mx53ppd_video.c         | 135 +++++++++
 board/ge/mx53ppd/ppd_gpio.h              |  96 +++++++
 configs/mx53ppd_defconfig                |  39 +++
 drivers/Kconfig                          |   2 +
 drivers/bootcount/Kconfig                |  58 ++++
 drivers/bootcount/Makefile               |   1 +
 drivers/bootcount/bootcount_ext.c        |  62 +++++
 drivers/i2c/mxc_i2c.c                    |  25 +-
 drivers/pwm/pwm-imx-util.c               |   2 +
 drivers/rtc/Kconfig                      |   6 +
 drivers/rtc/Makefile                     |   1 +
 drivers/rtc/s35392a.c                    | 365 ++++++++++++++++++++++++
 fs/ext4/ext4_common.c                    |  10 +
 fs/ext4/ext4fs.c                         |  10 +-
 include/configs/mx53ppd.h                | 248 +++++++++++++++++
 lib/Kconfig                              |   3 +
 32 files changed, 1927 insertions(+), 266 deletions(-)
 delete mode 100644 board/ge/bx50v3/vpd_reader.c
 delete mode 100644 board/ge/bx50v3/vpd_reader.h
 create mode 100644 board/ge/common/Makefile
 create mode 100644 board/ge/common/vpd_reader.c
 create mode 100644 board/ge/common/vpd_reader.h
 create mode 100644 board/ge/mx53ppd/Kconfig
 create mode 100644 board/ge/mx53ppd/MAINTAINERS
 create mode 100644 board/ge/mx53ppd/Makefile
 create mode 100644 board/ge/mx53ppd/imximage.cfg
 create mode 100644 board/ge/mx53ppd/mx53ppd.c
 create mode 100644 board/ge/mx53ppd/mx53ppd_video.c
 create mode 100644 board/ge/mx53ppd/ppd_gpio.h
 create mode 100644 configs/mx53ppd_defconfig
 create mode 100644 drivers/bootcount/Kconfig
 create mode 100644 drivers/bootcount/bootcount_ext.c
 create mode 100644 drivers/rtc/s35392a.c
 create mode 100644 include/configs/mx53ppd.h

-- 
2.1.4

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

* [U-Boot] [PATCH v5 0/8] Add support for GE PPD
  2017-11-06 19:14 Martyn Welch
@ 2017-11-07 10:00 ` Peter Robinson
  0 siblings, 0 replies; 16+ messages in thread
From: Peter Robinson @ 2017-11-07 10:00 UTC (permalink / raw)
  To: u-boot

On Mon, Nov 6, 2017 at 7:14 PM, Martyn Welch <martyn@welchs.me.uk> wrote:
> This series adds support for the GE PPD. The initial patches in this
> series resolve issues found during development and testing, extend
> existing support and add new support for devices in the PPD. The final
> patch in the series adds the board support for the PPD.
>
> Ian Ray (2):
>   ext4: recover from filesystem corruption when reading
>   bootcount: add support for bootcounter on EXT filesystem

Shouldn't the above two patches be sent separately, they're not really
part of adding a new board.

> Martyn Welch (3):
>   pwm: imx: Enable PWM support on i.MX53
>   arm: mx5: Add more register definitions
>   board: ge: make VPD code common
>
> Nandor Han (2):
>   imx: mxc_i2c: tweak the i2c transfer method
>   rtc: add support for s35392a
>
> Peter Senna Tschudin (1):
>   mx53: Add Board support for GE PPD
>
>  README                                   |   7 +
>  arch/arm/include/asm/arch-mx5/crm_regs.h |   8 +
>  arch/arm/include/asm/arch-mx5/imx-regs.h |  50 ++++
>  arch/arm/mach-imx/mx5/Kconfig            |   7 +
>  board/ge/bx50v3/Makefile                 |   2 +-
>  board/ge/bx50v3/bx50v3.c                 |   2 +-
>  board/ge/bx50v3/vpd_reader.c             | 228 ---------------
>  board/ge/bx50v3/vpd_reader.h             |  25 --
>  board/ge/common/Makefile                 |   7 +
>  board/ge/common/vpd_reader.c             | 197 +++++++++++++
>  board/ge/common/vpd_reader.h             |  17 ++
>  board/ge/mx53ppd/Kconfig                 |  17 ++
>  board/ge/mx53ppd/MAINTAINERS             |   7 +
>  board/ge/mx53ppd/Makefile                |  12 +
>  board/ge/mx53ppd/imximage.cfg            |  87 ++++++
>  board/ge/mx53ppd/mx53ppd.c               | 457 +++++++++++++++++++++++++++++++
>  board/ge/mx53ppd/mx53ppd_video.c         | 135 +++++++++
>  board/ge/mx53ppd/ppd_gpio.h              |  96 +++++++
>  configs/mx53ppd_defconfig                |  39 +++
>  drivers/Kconfig                          |   2 +
>  drivers/bootcount/Kconfig                |  58 ++++
>  drivers/bootcount/Makefile               |   1 +
>  drivers/bootcount/bootcount_ext.c        |  62 +++++
>  drivers/i2c/mxc_i2c.c                    |  25 +-
>  drivers/pwm/pwm-imx-util.c               |   2 +
>  drivers/rtc/Kconfig                      |   6 +
>  drivers/rtc/Makefile                     |   1 +
>  drivers/rtc/s35392a.c                    | 365 ++++++++++++++++++++++++
>  fs/ext4/ext4_common.c                    |  10 +
>  fs/ext4/ext4fs.c                         |  10 +-
>  include/configs/mx53ppd.h                | 248 +++++++++++++++++
>  lib/Kconfig                              |   3 +
>  32 files changed, 1927 insertions(+), 266 deletions(-)
>  delete mode 100644 board/ge/bx50v3/vpd_reader.c
>  delete mode 100644 board/ge/bx50v3/vpd_reader.h
>  create mode 100644 board/ge/common/Makefile
>  create mode 100644 board/ge/common/vpd_reader.c
>  create mode 100644 board/ge/common/vpd_reader.h
>  create mode 100644 board/ge/mx53ppd/Kconfig
>  create mode 100644 board/ge/mx53ppd/MAINTAINERS
>  create mode 100644 board/ge/mx53ppd/Makefile
>  create mode 100644 board/ge/mx53ppd/imximage.cfg
>  create mode 100644 board/ge/mx53ppd/mx53ppd.c
>  create mode 100644 board/ge/mx53ppd/mx53ppd_video.c
>  create mode 100644 board/ge/mx53ppd/ppd_gpio.h
>  create mode 100644 configs/mx53ppd_defconfig
>  create mode 100644 drivers/bootcount/Kconfig
>  create mode 100644 drivers/bootcount/bootcount_ext.c
>  create mode 100644 drivers/rtc/s35392a.c
>  create mode 100644 include/configs/mx53ppd.h
>
> --
> 2.1.4
>
> _______________________________________________
> U-Boot mailing list
> U-Boot at lists.denx.de
> https://lists.denx.de/listinfo/u-boot

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

* [U-Boot] [PATCH v5 0/8] Add support for GE PPD
@ 2017-11-08 15:35 Martyn Welch
  2017-11-08 15:35 ` [U-Boot] [PATCH v5 1/8] imx: mxc_i2c: tweak the i2c transfer method Martyn Welch
                   ` (7 more replies)
  0 siblings, 8 replies; 16+ messages in thread
From: Martyn Welch @ 2017-11-08 15:35 UTC (permalink / raw)
  To: u-boot

*** Resend due to previous use of unsubscribed email address ***

This series adds support for the GE PPD. The initial patches in this
series resolve issues found during development and testing, extend
existing support and add new support for devices in the PPD. The final
patch in the series adds the board support for the PPD.

Ian Ray (2):
  ext4: recover from filesystem corruption when reading
  bootcount: add support for bootcounter on EXT filesystem

Martyn Welch (3):
  pwm: imx: Enable PWM support on i.MX53
  arm: mx5: Add more register definitions
  board: ge: make VPD code common

Nandor Han (2):
  imx: mxc_i2c: tweak the i2c transfer method
  rtc: add support for s35392a

Peter Senna Tschudin (1):
  mx53: Add Board support for GE PPD

 README                                   |   7 +
 arch/arm/include/asm/arch-mx5/crm_regs.h |   8 +
 arch/arm/include/asm/arch-mx5/imx-regs.h |  50 ++++
 arch/arm/mach-imx/mx5/Kconfig            |   7 +
 board/ge/bx50v3/Makefile                 |   2 +-
 board/ge/bx50v3/bx50v3.c                 |   2 +-
 board/ge/bx50v3/vpd_reader.c             | 228 ---------------
 board/ge/bx50v3/vpd_reader.h             |  25 --
 board/ge/common/Makefile                 |   7 +
 board/ge/common/vpd_reader.c             | 197 +++++++++++++
 board/ge/common/vpd_reader.h             |  17 ++
 board/ge/mx53ppd/Kconfig                 |  17 ++
 board/ge/mx53ppd/MAINTAINERS             |   7 +
 board/ge/mx53ppd/Makefile                |  12 +
 board/ge/mx53ppd/imximage.cfg            |  87 ++++++
 board/ge/mx53ppd/mx53ppd.c               | 457 +++++++++++++++++++++++++++++++
 board/ge/mx53ppd/mx53ppd_video.c         | 135 +++++++++
 board/ge/mx53ppd/ppd_gpio.h              |  96 +++++++
 configs/mx53ppd_defconfig                |  39 +++
 drivers/Kconfig                          |   2 +
 drivers/bootcount/Kconfig                |  58 ++++
 drivers/bootcount/Makefile               |   1 +
 drivers/bootcount/bootcount_ext.c        |  62 +++++
 drivers/i2c/mxc_i2c.c                    |  25 +-
 drivers/pwm/pwm-imx-util.c               |   2 +
 drivers/rtc/Kconfig                      |   6 +
 drivers/rtc/Makefile                     |   1 +
 drivers/rtc/s35392a.c                    | 365 ++++++++++++++++++++++++
 fs/ext4/ext4_common.c                    |  10 +
 fs/ext4/ext4fs.c                         |  10 +-
 include/configs/mx53ppd.h                | 248 +++++++++++++++++
 lib/Kconfig                              |   3 +
 32 files changed, 1927 insertions(+), 266 deletions(-)
 delete mode 100644 board/ge/bx50v3/vpd_reader.c
 delete mode 100644 board/ge/bx50v3/vpd_reader.h
 create mode 100644 board/ge/common/Makefile
 create mode 100644 board/ge/common/vpd_reader.c
 create mode 100644 board/ge/common/vpd_reader.h
 create mode 100644 board/ge/mx53ppd/Kconfig
 create mode 100644 board/ge/mx53ppd/MAINTAINERS
 create mode 100644 board/ge/mx53ppd/Makefile
 create mode 100644 board/ge/mx53ppd/imximage.cfg
 create mode 100644 board/ge/mx53ppd/mx53ppd.c
 create mode 100644 board/ge/mx53ppd/mx53ppd_video.c
 create mode 100644 board/ge/mx53ppd/ppd_gpio.h
 create mode 100644 configs/mx53ppd_defconfig
 create mode 100644 drivers/bootcount/Kconfig
 create mode 100644 drivers/bootcount/bootcount_ext.c
 create mode 100644 drivers/rtc/s35392a.c
 create mode 100644 include/configs/mx53ppd.h

-- 
2.1.4

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

* [U-Boot] [PATCH v5 1/8] imx: mxc_i2c: tweak the i2c transfer method
  2017-11-08 15:35 [U-Boot] [PATCH v5 0/8] Add support for GE PPD Martyn Welch
@ 2017-11-08 15:35 ` Martyn Welch
  2017-11-08 15:35 ` [U-Boot] [PATCH v5 2/8] ext4: recover from filesystem corruption when reading Martyn Welch
                   ` (6 subsequent siblings)
  7 siblings, 0 replies; 16+ messages in thread
From: Martyn Welch @ 2017-11-08 15:35 UTC (permalink / raw)
  To: u-boot

From: Nandor Han <nandor.han@ge.com>

Tweak the i2c transfer to work for devices that want to read data
without addressing a register.

Signed-off-by: Nandor Han <nandor.han@ge.com>
Signed-off-by: Martyn Welch <martyn.welch@collabora.co.uk>
Acked-by: Heiko Schocher <hs@denx.de>
Cc: Heiko Schocher <hs@denx.de>
Cc: Stefano Babic <sbabic@denx.de>
---
Changes for v2:
   - Replacing '!= -1' with '>= 0'.

 drivers/i2c/mxc_i2c.c | 25 +++++++++++++++----------
 1 file changed, 15 insertions(+), 10 deletions(-)

diff --git a/drivers/i2c/mxc_i2c.c b/drivers/i2c/mxc_i2c.c
index abf1da2..205274e 100644
--- a/drivers/i2c/mxc_i2c.c
+++ b/drivers/i2c/mxc_i2c.c
@@ -317,16 +317,19 @@ static int i2c_init_transfer_(struct mxc_i2c_bus *i2c_bus, u8 chip,
 	temp |= I2CR_MTX | I2CR_TX_NO_AK;
 	writeb(temp, base + (I2CR << reg_shift));
 
-	/* write slave address */
-	ret = tx_byte(i2c_bus, chip << 1);
-	if (ret < 0)
-		return ret;
-
-	while (alen--) {
-		ret = tx_byte(i2c_bus, (addr >> (alen * 8)) & 0xff);
+	if (alen >= 0)	{
+		/* write slave address */
+		ret = tx_byte(i2c_bus, chip << 1);
 		if (ret < 0)
 			return ret;
+
+		while (alen--) {
+			ret = tx_byte(i2c_bus, (addr >> (alen * 8)) & 0xff);
+			if (ret < 0)
+				return ret;
+		}
 	}
+
 	return 0;
 }
 
@@ -537,9 +540,11 @@ static int bus_i2c_read(struct mxc_i2c_bus *i2c_bus, u8 chip, u32 addr,
 	if (ret < 0)
 		return ret;
 
-	temp = readb(base + (I2CR << reg_shift));
-	temp |= I2CR_RSTA;
-	writeb(temp, base + (I2CR << reg_shift));
+	if (alen >= 0) {
+		temp = readb(base + (I2CR << reg_shift));
+		temp |= I2CR_RSTA;
+		writeb(temp, base + (I2CR << reg_shift));
+	}
 
 	ret = tx_byte(i2c_bus, (chip << 1) | 1);
 	if (ret < 0) {
-- 
2.1.4

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

* [U-Boot] [PATCH v5 2/8] ext4: recover from filesystem corruption when reading
  2017-11-08 15:35 [U-Boot] [PATCH v5 0/8] Add support for GE PPD Martyn Welch
  2017-11-08 15:35 ` [U-Boot] [PATCH v5 1/8] imx: mxc_i2c: tweak the i2c transfer method Martyn Welch
@ 2017-11-08 15:35 ` Martyn Welch
  2017-11-09  9:25   ` Stefano Babic
  2017-11-08 15:35 ` [U-Boot] [PATCH v5 3/8] pwm: imx: Enable PWM support on i.MX53 Martyn Welch
                   ` (5 subsequent siblings)
  7 siblings, 1 reply; 16+ messages in thread
From: Martyn Welch @ 2017-11-08 15:35 UTC (permalink / raw)
  To: u-boot

From: Ian Ray <ian.ray@ge.com>

Some fixes when reading EXT files and directory entries were identified
after using e2fuzz to corrupt an EXT3 filesystem:

 - Stop reading directory entries if the offset becomes badly aligned.

 - Avoid overwriting memory by clamping the length used to zero the buffer
   in ext4fs_read_file.  Also sanity check blocksize.

Signed-off-by: Ian Ray <ian.ray@ge.com>
Signed-off-by: Martyn Welch <martyn.welch@collabora.co.uk>
---
 fs/ext4/ext4_common.c | 10 ++++++++++
 fs/ext4/ext4fs.c      | 10 +++++++++-
 2 files changed, 19 insertions(+), 1 deletion(-)

diff --git a/fs/ext4/ext4_common.c b/fs/ext4/ext4_common.c
index 31952f4..dac9545 100644
--- a/fs/ext4/ext4_common.c
+++ b/fs/ext4/ext4_common.c
@@ -660,6 +660,11 @@ static int search_dir(struct ext2_inode *parent_inode, char *dirname)
 
 		offset = 0;
 		do {
+			if (offset & 3) {
+				printf("Badly aligned ext2_dirent\n");
+				break;
+			}
+
 			dir = (struct ext2_dirent *)(block_buffer + offset);
 			direntname = (char*)(dir) + sizeof(struct ext2_dirent);
 
@@ -880,6 +885,11 @@ static int unlink_filename(char *filename, unsigned int blknr)
 
 	offset = 0;
 	do {
+		if (offset & 3) {
+			printf("Badly aligned ext2_dirent\n");
+			break;
+		}
+
 		previous_dir = dir;
 		dir = (struct ext2_dirent *)(block_buffer + offset);
 		direntname = (char *)(dir) + sizeof(struct ext2_dirent);
diff --git a/fs/ext4/ext4fs.c b/fs/ext4/ext4fs.c
index b0c7303..9ee2caf 100644
--- a/fs/ext4/ext4fs.c
+++ b/fs/ext4/ext4fs.c
@@ -64,6 +64,9 @@ int ext4fs_read_file(struct ext2fs_node *node, loff_t pos,
 	char *delayed_buf = NULL;
 	short status;
 
+	if (blocksize <= 0)
+		return -1;
+
 	/* Adjust len so it we can't read past the end of the file. */
 	if (len + pos > filesize)
 		len = (filesize - pos);
@@ -127,6 +130,7 @@ int ext4fs_read_file(struct ext2fs_node *node, loff_t pos,
 					(blockend >> log2blksz);
 			}
 		} else {
+			int n;
 			if (previous_block_number != -1) {
 				/* spill */
 				status = ext4fs_devread(delayed_start,
@@ -137,7 +141,11 @@ int ext4fs_read_file(struct ext2fs_node *node, loff_t pos,
 					return -1;
 				previous_block_number = -1;
 			}
-			memset(buf, 0, blocksize - skipfirst);
+			/* Zero no more than `len' bytes. */
+			n = blocksize - skipfirst;
+			if (n > len)
+				n = len;
+			memset(buf, 0, n);
 		}
 		buf += blocksize - skipfirst;
 	}
-- 
2.1.4

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

* [U-Boot] [PATCH v5 3/8] pwm: imx: Enable PWM support on i.MX53
  2017-11-08 15:35 [U-Boot] [PATCH v5 0/8] Add support for GE PPD Martyn Welch
  2017-11-08 15:35 ` [U-Boot] [PATCH v5 1/8] imx: mxc_i2c: tweak the i2c transfer method Martyn Welch
  2017-11-08 15:35 ` [U-Boot] [PATCH v5 2/8] ext4: recover from filesystem corruption when reading Martyn Welch
@ 2017-11-08 15:35 ` Martyn Welch
  2017-11-09  9:28   ` Stefano Babic
  2017-11-08 15:35 ` [U-Boot] [PATCH v5 4/8] arm: mx5: Add more register definitions Martyn Welch
                   ` (4 subsequent siblings)
  7 siblings, 1 reply; 16+ messages in thread
From: Martyn Welch @ 2017-11-08 15:35 UTC (permalink / raw)
  To: u-boot

Add missing parts for i.MX53 PWM support

Acked-by: Nandor Han <nandor.han@ge.com>
Signed-off-by: Martyn Welch <martyn.welch@collabora.co.uk>
Cc: Stefano Babic <sbabic@denx.de>
---
Changes for v4:
   - Removed ifdef.

 arch/arm/include/asm/arch-mx5/imx-regs.h | 17 +++++++++++++++++
 drivers/pwm/pwm-imx-util.c               |  2 ++
 2 files changed, 19 insertions(+)

diff --git a/arch/arm/include/asm/arch-mx5/imx-regs.h b/arch/arm/include/asm/arch-mx5/imx-regs.h
index 3e79fa3..2b0dc1e 100644
--- a/arch/arm/include/asm/arch-mx5/imx-regs.h
+++ b/arch/arm/include/asm/arch-mx5/imx-regs.h
@@ -508,6 +508,23 @@ struct fuse_bank4_regs {
 };
 #endif
 
+#define PWMCR_PRESCALER(x)	(((x - 1) & 0xFFF) << 4)
+#define PWMCR_DOZEEN		(1 << 24)
+#define PWMCR_WAITEN		(1 << 23)
+#define PWMCR_DBGEN		(1 << 22)
+#define PWMCR_CLKSRC_IPG_HIGH	(2 << 16)
+#define PWMCR_CLKSRC_IPG	(1 << 16)
+#define PWMCR_EN		(1 << 0)
+
+struct pwm_regs {
+	u32	cr;
+	u32	sr;
+	u32	ir;
+	u32	sar;
+	u32	pr;
+	u32	cnr;
+};
+
 #endif /* __ASSEMBLER__*/
 
 #endif				/* __ASM_ARCH_MX5_IMX_REGS_H__ */
diff --git a/drivers/pwm/pwm-imx-util.c b/drivers/pwm/pwm-imx-util.c
index 534dd8e..97ac0c8 100644
--- a/drivers/pwm/pwm-imx-util.c
+++ b/drivers/pwm/pwm-imx-util.c
@@ -23,10 +23,12 @@ struct pwm_regs *pwm_id_to_reg(int pwm_id)
 		return (struct pwm_regs *)PWM1_BASE_ADDR;
 	case 1:
 		return (struct pwm_regs *)PWM2_BASE_ADDR;
+#ifdef CONFIG_MX6
 	case 2:
 		return (struct pwm_regs *)PWM3_BASE_ADDR;
 	case 3:
 		return (struct pwm_regs *)PWM4_BASE_ADDR;
+#endif
 #ifdef CONFIG_MX6SX
 	case 4:
 		return (struct pwm_regs *)PWM5_BASE_ADDR;
-- 
2.1.4

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

* [U-Boot] [PATCH v5 4/8] arm: mx5: Add more register definitions
  2017-11-08 15:35 [U-Boot] [PATCH v5 0/8] Add support for GE PPD Martyn Welch
                   ` (2 preceding siblings ...)
  2017-11-08 15:35 ` [U-Boot] [PATCH v5 3/8] pwm: imx: Enable PWM support on i.MX53 Martyn Welch
@ 2017-11-08 15:35 ` Martyn Welch
  2017-11-09  9:29   ` Stefano Babic
  2017-11-08 15:35 ` [U-Boot] [PATCH v5 5/8] bootcount: add support for bootcounter on EXT filesystem Martyn Welch
                   ` (3 subsequent siblings)
  7 siblings, 1 reply; 16+ messages in thread
From: Martyn Welch @ 2017-11-08 15:35 UTC (permalink / raw)
  To: u-boot

Add register definitions require for video configuration.

Signed-off-by: Nandor Han <nandor.han@ge.com>
Signed-off-by: Martyn Welch <martyn.welch@collabora.co.uk>
Reviewed-by: Stefano Babic <sbabic@denx.de>
Cc: Stefano Babic <sbabic@denx.de>
---
Changes in v5:
  - Reduced checkpatch warnings.

 arch/arm/include/asm/arch-mx5/crm_regs.h |  8 ++++++++
 arch/arm/include/asm/arch-mx5/imx-regs.h | 33 ++++++++++++++++++++++++++++++++
 2 files changed, 41 insertions(+)

diff --git a/arch/arm/include/asm/arch-mx5/crm_regs.h b/arch/arm/include/asm/arch-mx5/crm_regs.h
index b61c7b9..7fea569 100644
--- a/arch/arm/include/asm/arch-mx5/crm_regs.h
+++ b/arch/arm/include/asm/arch-mx5/crm_regs.h
@@ -210,6 +210,14 @@ struct mxc_ccm_reg {
 #define MXC_CCM_CSCMR1_SSI_EXT2_COM_CLK_SEL		(0x1 << 1)
 #define MXC_CCM_CSCMR1_SSI_EXT1_COM_CLK_SEL		0x1
 
+/* Define the bits in register CSCMR2 */
+#define MXC_CCM_CSCMR2_DI0_CLK_SEL_OFFSET		26
+#define MXC_CCM_CSCMR2_DI0_CLK_SEL_MASK		(0x7 << 26)
+#define MXC_CCM_CSCMR2_DI0_CLK_SEL(v)		(((v) & 0x7) << 26)
+#define MXC_CCM_CSCMR2_DI0_CLK_SEL_RD(r)	(((r) >> 26) & 0x7)
+
+#define MXC_CCM_CSCMR2_DI0_CLK_SEL_LDB_DI0_CLK 5
+
 /* Define the bits in register CSCDR2 */
 #define MXC_CCM_CSCDR2_CSPI_CLK_PRED_OFFSET		25
 #define MXC_CCM_CSCDR2_CSPI_CLK_PRED_MASK		(0x7 << 25)
diff --git a/arch/arm/include/asm/arch-mx5/imx-regs.h b/arch/arm/include/asm/arch-mx5/imx-regs.h
index 2b0dc1e..61c8d44 100644
--- a/arch/arm/include/asm/arch-mx5/imx-regs.h
+++ b/arch/arm/include/asm/arch-mx5/imx-regs.h
@@ -416,6 +416,39 @@ struct iomuxc {
 };
 #endif
 
+#define IOMUXC_GPR2_BITMAP_SPWG	0
+#define IOMUXC_GPR2_BITMAP_JEIDA	1
+
+#define IOMUXC_GPR2_BIT_MAPPING_CH0_OFFSET	6
+#define IOMUXC_GPR2_BIT_MAPPING_CH0_MASK	(1 << IOMUXC_GPR2_BIT_MAPPING_CH0_OFFSET)
+#define IOMUXC_GPR2_BIT_MAPPING_CH0_JEIDA	(IOMUXC_GPR2_BITMAP_JEIDA << \
+						 IOMUXC_GPR2_BIT_MAPPING_CH0_OFFSET)
+#define IOMUXC_GPR2_BIT_MAPPING_CH0_SPWG	(IOMUXC_GPR2_BITMAP_SPWG << \
+						 IOMUXC_GPR2_BIT_MAPPING_CH0_OFFSET)
+
+#define IOMUXC_GPR2_DATA_WIDTH_18	0
+#define IOMUXC_GPR2_DATA_WIDTH_24	1
+
+#define IOMUXC_GPR2_DATA_WIDTH_CH0_OFFSET	5
+#define IOMUXC_GPR2_DATA_WIDTH_CH0_MASK		(1 << IOMUXC_GPR2_DATA_WIDTH_CH0_OFFSET)
+#define IOMUXC_GPR2_DATA_WIDTH_CH0_18BIT	(IOMUXC_GPR2_DATA_WIDTH_18 << \
+						 IOMUXC_GPR2_DATA_WIDTH_CH0_OFFSET)
+#define IOMUXC_GPR2_DATA_WIDTH_CH0_24BIT	(IOMUXC_GPR2_DATA_WIDTH_24 << \
+						 IOMUXC_GPR2_DATA_WIDTH_CH0_OFFSET)
+
+#define IOMUXC_GPR2_MODE_DISABLED	0
+#define IOMUXC_GPR2_MODE_ENABLED_DI0	1
+#define IOMUXC_GPR2_MODE_ENABLED_DI1	3
+
+#define IOMUXC_GPR2_LVDS_CH0_MODE_OFFSET	0
+#define IOMUXC_GPR2_LVDS_CH0_MODE_MASK		(3 << IOMUXC_GPR2_LVDS_CH0_MODE_OFFSET)
+#define IOMUXC_GPR2_LVDS_CH0_MODE_DISABLED	(IOMUXC_GPR2_MODE_DISABLED << \
+						 IOMUXC_GPR2_LVDS_CH0_MODE_OFFSET)
+#define IOMUXC_GPR2_LVDS_CH0_MODE_ENABLED_DI0	(IOMUXC_GPR2_MODE_ENABLED_DI0 << \
+						 IOMUXC_GPR2_LVDS_CH0_MODE_OFFSET)
+#define IOMUXC_GPR2_LVDS_CH0_MODE_ENABLED_DI1	(IOMUXC_GPR2_MODE_ENABLED_DI1 << \
+						 IOMUXC_GPR2_LVDS_CH0_MODE_OFFSET)
+
 /* System Reset Controller (SRC) */
 struct src {
 	u32	scr;
-- 
2.1.4

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

* [U-Boot] [PATCH v5 5/8] bootcount: add support for bootcounter on EXT filesystem
  2017-11-08 15:35 [U-Boot] [PATCH v5 0/8] Add support for GE PPD Martyn Welch
                   ` (3 preceding siblings ...)
  2017-11-08 15:35 ` [U-Boot] [PATCH v5 4/8] arm: mx5: Add more register definitions Martyn Welch
@ 2017-11-08 15:35 ` Martyn Welch
  2017-11-08 15:35 ` [U-Boot] [PATCH v5 6/8] rtc: add support for s35392a Martyn Welch
                   ` (2 subsequent siblings)
  7 siblings, 0 replies; 16+ messages in thread
From: Martyn Welch @ 2017-11-08 15:35 UTC (permalink / raw)
  To: u-boot

From: Ian Ray <ian.ray@ge.com>

Add support for bootcounter on an EXT filesystem.
Sync configuration whitelist.

Signed-off-by: Ian Ray <ian.ray@ge.com>
Signed-off-by: Martyn Welch <martyn.welch@collabora.co.uk>
---
Changes for v2:
   - Adding Kconfig for EXT bootcount.

Changes for v3:
   - Add over-arching BOOTCOUNT Kconfig entry.

Changes for v5:
  - Improved BOOTCOUNT_EXT description.
  - Fixed checkpatch issues.


 README                            |  7 +++++
 drivers/Kconfig                   |  2 ++
 drivers/bootcount/Kconfig         | 58 ++++++++++++++++++++++++++++++++++++
 drivers/bootcount/Makefile        |  1 +
 drivers/bootcount/bootcount_ext.c | 62 +++++++++++++++++++++++++++++++++++++++
 5 files changed, 130 insertions(+)
 create mode 100644 drivers/bootcount/Kconfig
 create mode 100644 drivers/bootcount/bootcount_ext.c

diff --git a/README b/README
index f288176..6336c5c 100644
--- a/README
+++ b/README
@@ -2362,6 +2362,13 @@ The following options need to be configured:
 			CONFIG_SYS_BOOTCOUNT_ADDR = i2c addr which is used for
 						    the bootcounter.
 			CONFIG_BOOTCOUNT_ALEN = address len
+		CONFIG_BOOTCOUNT_EXT
+		enable support for the bootcounter in EXT filesystem
+			CONFIG_SYS_BOOTCOUNT_ADDR = RAM address used for read
+                                                    and write.
+			CONFIG_SYS_BOOTCOUNT_EXT_INTERFACE = interface
+			CONFIG_SYS_BOOTCOUNT_EXT_DEVPART = device and part
+			CONFIG_SYS_BOOTCOUNT_EXT_NAME = filename
 
 - Show boot progress:
 		CONFIG_SHOW_BOOT_PROGRESS
diff --git a/drivers/Kconfig b/drivers/Kconfig
index 613e602..c2e813f 100644
--- a/drivers/Kconfig
+++ b/drivers/Kconfig
@@ -10,6 +10,8 @@ source "drivers/ata/Kconfig"
 
 source "drivers/block/Kconfig"
 
+source "drivers/bootcount/Kconfig"
+
 source "drivers/clk/Kconfig"
 
 source "drivers/cpu/Kconfig"
diff --git a/drivers/bootcount/Kconfig b/drivers/bootcount/Kconfig
new file mode 100644
index 0000000..c9d627c
--- /dev/null
+++ b/drivers/bootcount/Kconfig
@@ -0,0 +1,58 @@
+#
+# Boot count configuration
+#
+
+menu "Boot count support"
+
+config BOOTCOUNT
+	bool "Enable Boot count support"
+	help
+	  Enable boot count support, which provides the ability to store the
+	  number of times the board has booted on a number of different
+	  persistent storage mediums.
+
+if BOOTCOUNT
+
+config BOOTCOUNT_EXT
+	bool "Boot counter on EXT filesystem"
+	help
+	  Add support for maintaining boot count in a file on an EXT
+	  filesystem.
+
+if BOOTCOUNT_EXT
+
+config SYS_BOOTCOUNT_EXT_INTERFACE
+	string "Interface on which to find boot counter EXT filesystem"
+	default "mmc"
+	depends on BOOTCOUNT_EXT
+	help
+	  Set the interface to use when locating the filesystem to use for the
+	  boot counter.
+
+config SYS_BOOTCOUNT_EXT_DEVPART
+	string "Partition of the boot counter EXT filesystem"
+	default "0:1"
+	depends on BOOTCOUNT_EXT
+	help
+	  Set the partition to use when locating the filesystem to use for the
+	  boot counter.
+
+config SYS_BOOTCOUNT_EXT_NAME
+	string "Path and filename of the EXT filesystem based boot counter"
+	default "/boot/failures"
+	depends on BOOTCOUNT_EXT
+	help
+	  Set the filename and path of the file used to store the boot counter.
+
+config SYS_BOOTCOUNT_ADDR
+	hex "RAM address used for reading and writing the boot counter"
+	default 0x7000A000
+	depends on BOOTCOUNT_EXT
+	help
+	  Set the address used for reading and writing the boot counter.
+
+endif
+
+endif
+
+endmenu
diff --git a/drivers/bootcount/Makefile b/drivers/bootcount/Makefile
index ed9659a..45445d2 100644
--- a/drivers/bootcount/Makefile
+++ b/drivers/bootcount/Makefile
@@ -9,3 +9,4 @@ obj-$(CONFIG_BOOTCOUNT_AM33XX)	+= bootcount_davinci.o
 obj-$(CONFIG_BOOTCOUNT_RAM)	+= bootcount_ram.o
 obj-$(CONFIG_BOOTCOUNT_ENV)	+= bootcount_env.o
 obj-$(CONFIG_BOOTCOUNT_I2C)	+= bootcount_i2c.o
+obj-$(CONFIG_BOOTCOUNT_EXT)	+= bootcount_ext.o
diff --git a/drivers/bootcount/bootcount_ext.c b/drivers/bootcount/bootcount_ext.c
new file mode 100644
index 0000000..e0dd21b
--- /dev/null
+++ b/drivers/bootcount/bootcount_ext.c
@@ -0,0 +1,62 @@
+/*
+ * Copyright (c) 2017 General Electric Company. All rights reserved.
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+
+#include <bootcount.h>
+#include <fs.h>
+#include <mapmem.h>
+
+#define BC_MAGIC	0xbc
+
+void bootcount_store(ulong a)
+{
+	u8 *buf;
+	loff_t len;
+	int ret;
+
+	if (fs_set_blk_dev(CONFIG_SYS_BOOTCOUNT_EXT_INTERFACE,
+			   CONFIG_SYS_BOOTCOUNT_EXT_DEVPART, FS_TYPE_EXT)) {
+		puts("Error selecting device\n");
+		return;
+	}
+
+	buf = map_sysmem(CONFIG_SYS_BOOTCOUNT_ADDR, 2);
+	buf[0] = BC_MAGIC;
+	buf[1] = (a & 0xff);
+	unmap_sysmem(buf);
+
+	ret = fs_write(CONFIG_SYS_BOOTCOUNT_EXT_NAME,
+		       CONFIG_SYS_BOOTCOUNT_ADDR, 0, 2, &len);
+	if (ret != 0)
+		puts("Error storing bootcount\n");
+}
+
+ulong bootcount_load(void)
+{
+	u8 *buf;
+	loff_t len_read;
+	int ret;
+
+	if (fs_set_blk_dev(CONFIG_SYS_BOOTCOUNT_EXT_INTERFACE,
+			   CONFIG_SYS_BOOTCOUNT_EXT_DEVPART, FS_TYPE_EXT)) {
+		puts("Error selecting device\n");
+		return 0;
+	}
+
+	ret = fs_read(CONFIG_SYS_BOOTCOUNT_EXT_NAME, CONFIG_SYS_BOOTCOUNT_ADDR,
+		      0, 2, &len_read);
+	if (ret != 0 || len_read != 2) {
+		puts("Error loading bootcount\n");
+		return 0;
+	}
+
+	buf = map_sysmem(CONFIG_SYS_BOOTCOUNT_ADDR, 2);
+	if (buf[0] == BC_MAGIC)
+		ret = buf[1];
+
+	unmap_sysmem(buf);
+
+	return ret;
+}
-- 
2.1.4

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

* [U-Boot] [PATCH v5 6/8] rtc: add support for s35392a
  2017-11-08 15:35 [U-Boot] [PATCH v5 0/8] Add support for GE PPD Martyn Welch
                   ` (4 preceding siblings ...)
  2017-11-08 15:35 ` [U-Boot] [PATCH v5 5/8] bootcount: add support for bootcounter on EXT filesystem Martyn Welch
@ 2017-11-08 15:35 ` Martyn Welch
  2017-11-08 15:35 ` [U-Boot] [PATCH v5 7/8] board: ge: make VPD code common Martyn Welch
  2017-11-09 10:19 ` [U-Boot] [PATCH v5 0/8] Add support for GE PPD Lukasz Majewski
  7 siblings, 0 replies; 16+ messages in thread
From: Martyn Welch @ 2017-11-08 15:35 UTC (permalink / raw)
  To: u-boot

From: Nandor Han <nandor.han@ge.com>

Add support for S35392A RTC. The driver supports both U-Boot driver
models.

Signed-off-by: Nandor Han <nandor.han@ge.com>
Signed-off-by: Martyn Welch <martyn.welch@collabora.co.uk>
Cc: Heiko Schocher <hs@denx.de>
---

Changes for v5:
   - Fixed checkpatch issues.

 drivers/rtc/Kconfig   |   6 +
 drivers/rtc/Makefile  |   1 +
 drivers/rtc/s35392a.c | 365 ++++++++++++++++++++++++++++++++++++++++++++++++++
 lib/Kconfig           |   3 +
 4 files changed, 375 insertions(+)
 create mode 100644 drivers/rtc/s35392a.c

diff --git a/drivers/rtc/Kconfig b/drivers/rtc/Kconfig
index d06130c7..2964bb2 100644
--- a/drivers/rtc/Kconfig
+++ b/drivers/rtc/Kconfig
@@ -30,4 +30,10 @@ config RTC_DS1307
 	  Support for Dallas Semiconductor (now Maxim) DS1307 and DS1338/9 and
 	  compatible Real Time Clock devices.
 
+config RTC_S35392A
+	bool "Enable S35392A driver"
+	select BITREVERSE
+	help
+	  Enable s35392a driver which provides rtc get and set function.
+
 endmenu
diff --git a/drivers/rtc/Makefile b/drivers/rtc/Makefile
index 003e31a..7a8f97a 100644
--- a/drivers/rtc/Makefile
+++ b/drivers/rtc/Makefile
@@ -49,5 +49,6 @@ obj-$(CONFIG_RTC_RS5C372A) += rs5c372.o
 obj-$(CONFIG_RTC_RV3029) += rv3029.o
 obj-$(CONFIG_RTC_RX8025) += rx8025.o
 obj-$(CONFIG_RTC_S3C24X0) += s3c24x0_rtc.o
+obj-$(CONFIG_RTC_S35392A) += s35392a.o
 obj-$(CONFIG_SANDBOX) += sandbox_rtc.o
 obj-$(CONFIG_RTC_X1205) += x1205.o
diff --git a/drivers/rtc/s35392a.c b/drivers/rtc/s35392a.c
new file mode 100644
index 0000000..9adcefc
--- /dev/null
+++ b/drivers/rtc/s35392a.c
@@ -0,0 +1,365 @@
+/*
+ * SII Semiconductor Corporation S35392A RTC driver.
+ *
+ * Copyright (c) 2017, General Electric Company
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * SPDX-License-Identifier:	GPL-2.0
+ */
+
+#include <command.h>
+#include <common.h>
+#include <dm.h>
+#include <i2c.h>
+#include <linux/bitrev.h>
+#include <rtc.h>
+
+#define S35390A_CMD_STATUS1		0x30
+#define S35390A_CMD_STATUS2		0x31
+#define S35390A_CMD_TIME1		0x32
+#define S35390A_CMD_TIME2		0x33
+#define S35390A_CMD_INT2_REG1	0x35
+
+#define S35390A_BYTE_YEAR	0
+#define S35390A_BYTE_MONTH	1
+#define S35390A_BYTE_DAY	2
+#define S35390A_BYTE_WDAY	3
+#define S35390A_BYTE_HOURS	4
+#define S35390A_BYTE_MINS	5
+#define S35390A_BYTE_SECS	6
+
+/* flags for STATUS1 */
+#define S35390A_FLAG_POC	0x01
+#define S35390A_FLAG_BLD	0x02
+#define S35390A_FLAG_INT2	0x04
+#define S35390A_FLAG_24H	0x40
+#define S35390A_FLAG_RESET	0x80
+
+/*
+ * If either BLD or POC is set, then the chip has lost power long enough for
+ * the time value to become invalid.
+ */
+#define S35390A_LOW_VOLTAGE (S35390A_FLAG_POC | S35390A_FLAG_BLD)
+
+/*---------------------------------------------------------------------*/
+#undef DEBUG_RTC
+
+#ifdef DEBUG_RTC
+#define DEBUGR(fmt, args...) printf(fmt, ##args)
+#else
+#define DEBUGR(fmt, args...)
+#endif
+/*---------------------------------------------------------------------*/
+
+#ifdef CONFIG_DM_RTC
+#define DEV_TYPE struct udevice
+#else
+/* Local udevice */
+struct ludevice {
+	u8 chip;
+};
+
+#define DEV_TYPE struct ludevice
+struct ludevice dev;
+
+#endif
+
+#define msleep(a) udelay(a * 1000)
+
+int lowvoltage;
+
+static int s35392a_rtc_reset(DEV_TYPE *dev);
+
+static int s35392a_rtc_read(DEV_TYPE *dev, u8 reg, u8 *buf, int len)
+{
+	int ret;
+
+#ifdef CONFIG_DM_RTC
+	/* TODO: we need to tweak the chip address to reg */
+	ret = dm_i2c_read(dev, 0, buf, len);
+#else
+	(void)dev;
+	ret = i2c_read(reg, 0, -1, buf, len);
+#endif
+
+	return ret;
+}
+
+static int s35392a_rtc_write(DEV_TYPE *dev, u8 reg, u8 *buf, int len)
+{
+	int ret;
+
+#ifdef CONFIG_DM_RTC
+	/* TODO: we need to tweak the chip address to reg */
+	ret = dm_i2c_write(dev, 0, buf, 1);
+#else
+	(void)dev;
+	ret = i2c_write(reg, 0, 0, buf, len);
+#endif
+
+	return ret;
+}
+
+static int s35392a_rtc_read8(DEV_TYPE *dev, unsigned int reg)
+{
+	u8 val;
+	int ret;
+
+	ret = s35392a_rtc_read(dev, reg, &val, sizeof(val));
+	return ret < 0 ? ret : val;
+}
+
+static int s35392a_rtc_write8(DEV_TYPE *dev, unsigned int reg, int val)
+{
+	int ret;
+	u8 lval = val;
+
+	ret = s35392a_rtc_write(dev, reg, &lval, sizeof(lval));
+	return ret < 0 ? ret : 0;
+}
+
+static int validate_time(const struct rtc_time *tm)
+{
+	if ((tm->tm_year < 2000) || (tm->tm_year > 2099))
+		return -EINVAL;
+
+	if ((tm->tm_mon < 1) || (tm->tm_mon > 12))
+		return -EINVAL;
+
+	if ((tm->tm_mday < 1) || (tm->tm_mday > 31))
+		return -EINVAL;
+
+	if ((tm->tm_wday < 0) || (tm->tm_wday > 6))
+		return -EINVAL;
+
+	if ((tm->tm_hour < 0) || (tm->tm_hour > 23))
+		return -EINVAL;
+
+	if ((tm->tm_min < 0) || (tm->tm_min > 59))
+		return -EINVAL;
+
+	if ((tm->tm_sec < 0) || (tm->tm_sec > 59))
+		return -EINVAL;
+
+	return 0;
+}
+
+void s35392a_rtc_init(DEV_TYPE *dev)
+{
+	int status;
+
+	status = s35392a_rtc_read8(dev, S35390A_CMD_STATUS1);
+	if (status < 0)
+		goto error;
+
+	DEBUGR("init: S35390A_CMD_STATUS1: 0x%x\n", status);
+
+	lowvoltage = status & S35390A_LOW_VOLTAGE ? 1 : 0;
+
+	if (status & S35390A_FLAG_POC)
+		/*
+		 * Do not communicate for 0.5 seconds since the power-on
+		 * detection circuit is in operation.
+		 */
+		msleep(500);
+
+	else if (!lowvoltage)
+		/*
+		 * If both POC and BLD are unset everything is fine.
+		 */
+		return;
+
+	if (lowvoltage)
+		printf("RTC low voltage detected\n");
+
+	if (!s35392a_rtc_reset(dev))
+		return;
+
+error:
+	printf("Error RTC init.\n");
+}
+
+/* Get the current time from the RTC */
+static int s35392a_rtc_get(DEV_TYPE *dev, struct rtc_time *tm)
+{
+	u8 date[7];
+	int ret, i;
+
+	if (lowvoltage) {
+		DEBUGR("RTC low voltage detected\n");
+		return -EINVAL;
+	}
+
+	ret = s35392a_rtc_read(dev, S35390A_CMD_TIME1, date, sizeof(date));
+	if (ret < 0) {
+		DEBUGR("Error reading date from RTC\n");
+		return -EIO;
+	}
+
+	/* This chip returns the bits of each byte in reverse order */
+	for (i = 0; i < 7; ++i)
+		date[i] = bitrev8(date[i]);
+
+	tm->tm_sec  = bcd2bin(date[S35390A_BYTE_SECS]);
+	tm->tm_min  = bcd2bin(date[S35390A_BYTE_MINS]);
+	tm->tm_hour = bcd2bin(date[S35390A_BYTE_HOURS] & ~S35390A_FLAG_24H);
+	tm->tm_wday = bcd2bin(date[S35390A_BYTE_WDAY]);
+	tm->tm_mday = bcd2bin(date[S35390A_BYTE_DAY]);
+	tm->tm_mon  = bcd2bin(date[S35390A_BYTE_MONTH]);
+	tm->tm_year = bcd2bin(date[S35390A_BYTE_YEAR]) + 2000;
+
+	DEBUGR("Get DATE: %4d-%02d-%02d (wday=%d)  TIME: %2d:%02d:%02d\n",
+	       tm->tm_year, tm->tm_mon, tm->tm_mday, tm->tm_wday,
+	       tm->tm_hour, tm->tm_min, tm->tm_sec);
+
+	return 0;
+}
+
+/* Set the RTC */
+static int s35392a_rtc_set(DEV_TYPE *dev, const struct rtc_time *tm)
+{
+	int i, ret;
+	int status;
+	u8 date[7];
+
+	DEBUGR("Set DATE: %4d-%02d-%02d (wday=%d)  TIME: %2d:%02d:%02d\n",
+	       tm->tm_year, tm->tm_mon, tm->tm_mday, tm->tm_wday,
+	       tm->tm_hour, tm->tm_min, tm->tm_sec);
+
+	ret = validate_time(tm);
+	if (ret < 0)
+		return -EINVAL;
+
+	/* We support only 24h mode */
+	ret = s35392a_rtc_read8(dev, S35390A_CMD_STATUS1);
+	if (ret < 0)
+		return -EIO;
+	status = ret;
+
+	ret = s35392a_rtc_write8(dev, S35390A_CMD_STATUS1,
+				 status | S35390A_FLAG_24H);
+	if (ret < 0)
+		return -EIO;
+
+	date[S35390A_BYTE_YEAR]  = bin2bcd(tm->tm_year - 2000);
+	date[S35390A_BYTE_MONTH] = bin2bcd(tm->tm_mon);
+	date[S35390A_BYTE_DAY]   = bin2bcd(tm->tm_mday);
+	date[S35390A_BYTE_WDAY]  = bin2bcd(tm->tm_wday);
+	date[S35390A_BYTE_HOURS] = bin2bcd(tm->tm_hour);
+	date[S35390A_BYTE_MINS]  = bin2bcd(tm->tm_min);
+	date[S35390A_BYTE_SECS]  = bin2bcd(tm->tm_sec);
+
+	/* This chip expects the bits of each byte to be in reverse order */
+	for (i = 0; i < 7; ++i)
+		date[i] = bitrev8(date[i]);
+
+	ret = s35392a_rtc_write(dev, S35390A_CMD_TIME1, date, sizeof(date));
+	if (ret < 0) {
+		DEBUGR("Error writing date to RTC\n");
+		return -EIO;
+	}
+
+	/* Now we have time. Reset the low voltage status */
+	lowvoltage = 0;
+
+	return 0;
+}
+
+/* Reset the RTC. */
+static int s35392a_rtc_reset(DEV_TYPE *dev)
+{
+	int buf;
+	int ret;
+	unsigned int initcount = 0;
+
+	buf = S35390A_FLAG_RESET;
+
+initialize:
+	ret = s35392a_rtc_write8(dev, S35390A_CMD_STATUS1, buf);
+	if (ret < 0)
+		return -EIO;
+
+	ret = s35392a_rtc_read8(dev, S35390A_CMD_STATUS1);
+	if (ret < 0)
+		return -EIO;
+	buf = ret;
+
+	if (!lowvoltage)
+		lowvoltage = buf & S35390A_LOW_VOLTAGE ? 1 : 0;
+
+	if (buf & S35390A_LOW_VOLTAGE) {
+		/* Try up to five times to reset the chip */
+		if (initcount < 5) {
+			++initcount;
+			goto initialize;
+		} else {
+			return -EIO;
+		}
+	}
+
+	return 0;
+}
+
+#ifndef CONFIG_DM_RTC
+
+int rtc_get(struct rtc_time *tm)
+{
+	return s35392a_rtc_get(&dev, tm);
+}
+
+int rtc_set(struct rtc_time *tm)
+{
+	return s35392a_rtc_set(&dev, tm);
+}
+
+void rtc_reset(void)
+{
+	s35392a_rtc_reset(&dev);
+}
+
+void rtc_init(void)
+{
+	s35392a_rtc_init(&dev);
+}
+
+#else
+
+static int s35392a_probe(struct udevice *dev)
+{
+	s35392a_rtc_init(dev);
+	return 0;
+}
+
+static const struct rtc_ops s35392a_rtc_ops = {
+	.get = s35392a_rtc_get,
+	.set = s35392a_rtc_set,
+	.read8 = s35392a_rtc_read8,
+	.write8 = s35392a_rtc_write8,
+	.reset = s35392a_rtc_reset,
+};
+
+static const struct udevice_id s35392a_rtc_ids[] = {
+	{ .compatible = "sii,s35392a-rtc" },
+	{ }
+};
+
+U_BOOT_DRIVER(s35392a_rtc) = {
+	.name	  = "s35392a_rtc",
+	.id	      = UCLASS_RTC,
+	.probe    = s35392a_probe,
+	.of_match = s35392a_rtc_ids,
+	.ops	  = &s35392a_rtc_ops,
+};
+
+#endif
diff --git a/lib/Kconfig b/lib/Kconfig
index 18663ba..f447c53 100644
--- a/lib/Kconfig
+++ b/lib/Kconfig
@@ -80,6 +80,9 @@ config TPL_TINY_MEMSET
 config RBTREE
 	bool
 
+config BITREVERSE
+	bool "Bit reverse library from Linux"
+
 source lib/dhry/Kconfig
 
 menu "Security support"
-- 
2.1.4

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

* [U-Boot] [PATCH v5 7/8] board: ge: make VPD code common
  2017-11-08 15:35 [U-Boot] [PATCH v5 0/8] Add support for GE PPD Martyn Welch
                   ` (5 preceding siblings ...)
  2017-11-08 15:35 ` [U-Boot] [PATCH v5 6/8] rtc: add support for s35392a Martyn Welch
@ 2017-11-08 15:35 ` Martyn Welch
  2017-11-09  9:27   ` Stefano Babic
  2017-11-09 10:19 ` [U-Boot] [PATCH v5 0/8] Add support for GE PPD Lukasz Majewski
  7 siblings, 1 reply; 16+ messages in thread
From: Martyn Welch @ 2017-11-08 15:35 UTC (permalink / raw)
  To: u-boot

The VPD data is used on a number of GE products. Move the parsing code to
a common location so that we can share this code.

Signed-off-by: Martyn Welch <martyn.welch@collabora.co.uk>
---
Changes in v4:
   - New patch.

Changes in v5:
   - Fixed checkpatch issues.

board/ge/bx50v3/Makefile     |   2 +-
 board/ge/bx50v3/bx50v3.c     |   2 +-
 board/ge/bx50v3/vpd_reader.c | 228 -------------------------------------------
 board/ge/bx50v3/vpd_reader.h |  25 -----
 board/ge/common/Makefile     |   7 ++
 board/ge/common/vpd_reader.c | 197 +++++++++++++++++++++++++++++++++++++
 board/ge/common/vpd_reader.h |  17 ++++
 7 files changed, 223 insertions(+), 255 deletions(-)
 delete mode 100644 board/ge/bx50v3/vpd_reader.c
 delete mode 100644 board/ge/bx50v3/vpd_reader.h
 create mode 100644 board/ge/common/Makefile
 create mode 100644 board/ge/common/vpd_reader.c
 create mode 100644 board/ge/common/vpd_reader.h

diff --git a/board/ge/bx50v3/Makefile b/board/ge/bx50v3/Makefile
index 2fff27b..bcd149f 100644
--- a/board/ge/bx50v3/Makefile
+++ b/board/ge/bx50v3/Makefile
@@ -5,4 +5,4 @@
 # SPDX-License-Identifier:	GPL-2.0+
 #
 
-obj-y  := bx50v3.o vpd_reader.o
+obj-y  := bx50v3.o
diff --git a/board/ge/bx50v3/bx50v3.c b/board/ge/bx50v3/bx50v3.c
index 2e8f394..37de990 100644
--- a/board/ge/bx50v3/bx50v3.c
+++ b/board/ge/bx50v3/bx50v3.c
@@ -28,7 +28,7 @@
 #include <input.h>
 #include <pwm.h>
 #include <stdlib.h>
-#include "vpd_reader.h"
+#include "../common/vpd_reader.h"
 DECLARE_GLOBAL_DATA_PTR;
 
 #ifndef CONFIG_SYS_I2C_EEPROM_ADDR
diff --git a/board/ge/bx50v3/vpd_reader.c b/board/ge/bx50v3/vpd_reader.c
deleted file mode 100644
index 98da893..0000000
--- a/board/ge/bx50v3/vpd_reader.c
+++ /dev/null
@@ -1,228 +0,0 @@
-/*
- * Copyright 2016 General Electric Company
- *
- * SPDX-License-Identifier:	GPL-2.0+
- */
-
-#include "vpd_reader.h"
-
-#include <linux/bch.h>
-#include <stdlib.h>
-
-
-/* BCH configuration */
-
-const struct {
-	int header_ecc_capability_bits;
-	int data_ecc_capability_bits;
-	unsigned int prim_poly;
-	struct {
-		int min;
-		int max;
-	} galois_field_order;
-} bch_configuration = {
-	.header_ecc_capability_bits = 4,
-	.data_ecc_capability_bits = 16,
-	.prim_poly = 0,
-	.galois_field_order = {
-		.min = 5,
-		.max = 15,
-	},
-};
-
-static int calculate_galois_field_order(size_t source_length)
-{
-	int gfo = bch_configuration.galois_field_order.min;
-
-	for (; gfo < bch_configuration.galois_field_order.max &&
-	     ((((1 << gfo) - 1) - ((int)source_length * 8)) < 0);
-	     gfo++) {
-	}
-
-	if (gfo == bch_configuration.galois_field_order.max) {
-		return -1;
-	}
-
-	return gfo + 1;
-}
-
-static int verify_bch(int ecc_bits, unsigned int prim_poly,
-	uint8_t * data, size_t data_length,
-	const uint8_t * ecc, size_t ecc_length)
-{
-	int gfo = calculate_galois_field_order(data_length);
-	if (gfo < 0) {
-		return -1;
-	}
-
-	struct bch_control * bch = init_bch(gfo, ecc_bits, prim_poly);
-	if (!bch) {
-		return -1;
-	}
-
-	if (bch->ecc_bytes != ecc_length) {
-		free_bch(bch);
-		return -1;
-	}
-
-	unsigned * errloc = (unsigned *)calloc(data_length, sizeof(unsigned));
-	int errors = decode_bch(
-			bch, data, data_length, ecc, NULL, NULL, errloc);
-	free_bch(bch);
-	if (errors < 0) {
-		free(errloc);
-		return -1;
-	}
-
-	if (errors > 0) {
-		for (int n = 0; n < errors; n++) {
-			if (errloc[n] >= 8 * data_length) {
-				/* n-th error located in ecc (no need for data correction) */
-			} else {
-				/* n-th error located in data */
-				data[errloc[n] / 8] ^= 1 << (errloc[n] % 8);
-			}
-		}
-	}
-
-	free(errloc);
-	return 0;
-}
-
-
-static const int ID = 0;
-static const int LEN = 1;
-static const int VER = 2;
-static const int TYP = 3;
-static const int BLOCK_SIZE = 4;
-
-static const uint8_t HEADER_BLOCK_ID = 0x00;
-static const uint8_t HEADER_BLOCK_LEN = 18;
-static const uint32_t HEADER_BLOCK_MAGIC = 0xca53ca53;
-static const size_t HEADER_BLOCK_VERIFY_LEN = 14;
-static const size_t HEADER_BLOCK_ECC_OFF = 14;
-static const size_t HEADER_BLOCK_ECC_LEN = 4;
-
-static const uint8_t ECC_BLOCK_ID = 0xFF;
-
-int vpd_reader(
-	size_t size,
-	uint8_t * data,
-	void * userdata,
-	int (*fn)(
-	    void * userdata,
-	    uint8_t id,
-	    uint8_t version,
-	    uint8_t type,
-	    size_t size,
-	    uint8_t const * data))
-{
-	if (   size < HEADER_BLOCK_LEN
-	    || data == NULL
-	    || fn == NULL) {
-		return -EINVAL;
-	}
-
-	/*
-	 * +--------------------+--------------------+--//--+--------------------+
-	 * | header block       | data block         | ...  | ecc block          |
-	 * +--------------------+--------------------+--//--+--------------------+
-	 * :                    :                           :
-	 * +------+-------+-----+                           +------+-------------+
-	 * | id   | magic | ecc |                           | ...  | ecc         |
-	 * | len  | off   |     |                           +------+-------------+
-	 * | ver  | size  |     |                           :
-	 * | type |       |     |                           :
-	 * +------+-------+-----+                           :
-	 * :              :     :                           :
-	 * <----- [1] ---->     <----------- [2] ----------->
-	 *
-	 * Repair (if necessary) the contents of header block [1] by using a
-	 * 4 byte ECC located at the end of the header block.  A successful
-	 * return value means that we can trust the header.
-	 */
-	int ret = verify_bch(
-		bch_configuration.header_ecc_capability_bits,
-		bch_configuration.prim_poly,
-		data,
-		HEADER_BLOCK_VERIFY_LEN,
-		&data[HEADER_BLOCK_ECC_OFF],
-		HEADER_BLOCK_ECC_LEN);
-	if (ret < 0) {
-		return ret;
-	}
-
-	/* Validate header block { id, length, version, type }. */
-	if (   data[ID] != HEADER_BLOCK_ID
-	    || data[LEN] != HEADER_BLOCK_LEN
-	    || data[VER] != 0
-	    || data[TYP] != 0
-	    || ntohl(*(uint32_t *)(&data[4])) != HEADER_BLOCK_MAGIC) {
-		return -EINVAL;
-	}
-
-	uint32_t offset = ntohl(*(uint32_t *)(&data[8]));
-	uint16_t size_bits = ntohs(*(uint16_t *)(&data[12]));
-
-	/* Check that ECC header fits. */
-	if (offset + 3 >= size) {
-		return -EINVAL;
-	}
-
-	/* Validate ECC block. */
-	uint8_t * ecc = &data[offset];
-	if (   ecc[ID] != ECC_BLOCK_ID
-	    || ecc[LEN] < BLOCK_SIZE
-	    || ecc[LEN] + offset > size
-	    || ecc[LEN] - BLOCK_SIZE != size_bits / 8
-	    || ecc[VER] != 1
-	    || ecc[TYP] != 1) {
-		return -EINVAL;
-	}
-
-	/*
-	 * Use the header block to locate the ECC block and verify the data
-	 * blocks [2] against the ecc block ECC.
-	 */
-	ret = verify_bch(
-		bch_configuration.data_ecc_capability_bits,
-		bch_configuration.prim_poly,
-		&data[data[LEN]],
-		offset - data[LEN],
-		&data[offset + BLOCK_SIZE],
-		ecc[LEN] - BLOCK_SIZE);
-	if (ret < 0) {
-		return ret;
-	}
-
-	/* Stop after ECC.  Ignore possible zero padding. */
-	size = offset;
-
-	for (;;) {
-		/* Move to next block. */
-		size -= data[LEN];
-		data += data[LEN];
-
-		if (size == 0) {
-			/* Finished iterating through blocks. */
-			return 0;
-		}
-
-		if (   size < BLOCK_SIZE
-		    || data[LEN] < BLOCK_SIZE) {
-			/* Not enough data for a header, or short header. */
-			return -EINVAL;
-		}
-
-		ret = fn(
-			userdata,
-			data[ID],
-			data[VER],
-			data[TYP],
-			data[LEN] - BLOCK_SIZE,
-			&data[BLOCK_SIZE]);
-		if (ret) {
-			return ret;
-		}
-	}
-}
diff --git a/board/ge/bx50v3/vpd_reader.h b/board/ge/bx50v3/vpd_reader.h
deleted file mode 100644
index efa172a..0000000
--- a/board/ge/bx50v3/vpd_reader.h
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright 2016 General Electric Company
- *
- * SPDX-License-Identifier:	GPL-2.0+
- */
-
-#include "common.h"
-
-/*
- * Read VPD from given data, verify content, and call callback
- * for each vital product data block.
- *
- * Returns Non-zero on error.  Negative numbers encode errno.
- */
-int vpd_reader(
-	size_t size,
-	uint8_t * data,
-	void * userdata,
-	int (*fn)(
-	    void * userdata,
-	    uint8_t id,
-	    uint8_t version,
-	    uint8_t type,
-	    size_t size,
-	    uint8_t const * data));
diff --git a/board/ge/common/Makefile b/board/ge/common/Makefile
new file mode 100644
index 0000000..93e6c01
--- /dev/null
+++ b/board/ge/common/Makefile
@@ -0,0 +1,7 @@
+#
+# Copyright 2017 General Electric Company
+#
+# SPDX-License-Identifier:	GPL-2.0+
+#
+
+obj-y  := vpd_reader.o
diff --git a/board/ge/common/vpd_reader.c b/board/ge/common/vpd_reader.c
new file mode 100644
index 0000000..7367427
--- /dev/null
+++ b/board/ge/common/vpd_reader.c
@@ -0,0 +1,197 @@
+/*
+ * Copyright 2016 General Electric Company
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+
+#include "vpd_reader.h"
+
+#include <linux/bch.h>
+#include <stdlib.h>
+
+/* BCH configuration */
+
+const struct {
+	int header_ecc_capability_bits;
+	int data_ecc_capability_bits;
+	unsigned int prim_poly;
+	struct {
+		int min;
+		int max;
+	} galois_field_order;
+} bch_configuration = {
+	.header_ecc_capability_bits = 4,
+	.data_ecc_capability_bits = 16,
+	.prim_poly = 0,
+	.galois_field_order = {
+		.min = 5,
+		.max = 15,
+	},
+};
+
+static int calculate_galois_field_order(size_t source_length)
+{
+	int gfo = bch_configuration.galois_field_order.min;
+
+	for (; gfo < bch_configuration.galois_field_order.max &&
+	     ((((1 << gfo) - 1) - ((int)source_length * 8)) < 0);
+	     gfo++) {
+	}
+
+	if (gfo == bch_configuration.galois_field_order.max)
+		return -1;
+
+	return gfo + 1;
+}
+
+static int verify_bch(int ecc_bits, unsigned int prim_poly, u8 *data,
+		      size_t data_length, const u8 *ecc, size_t ecc_length)
+{
+	int gfo = calculate_galois_field_order(data_length);
+
+	if (gfo < 0)
+		return -1;
+
+	struct bch_control *bch = init_bch(gfo, ecc_bits, prim_poly);
+
+	if (!bch)
+		return -1;
+
+	if (bch->ecc_bytes != ecc_length) {
+		free_bch(bch);
+		return -1;
+	}
+
+	unsigned int *errloc = (unsigned int *)calloc(data_length,
+						      sizeof(unsigned int));
+	int errors = decode_bch(bch, data, data_length, ecc, NULL, NULL,
+				errloc);
+
+	free_bch(bch);
+	if (errors < 0) {
+		free(errloc);
+		return -1;
+	}
+
+	if (errors > 0) {
+		for (int n = 0; n < errors; n++) {
+			if (errloc[n] >= 8 * data_length) {
+				/*
+				 * n-th error located in ecc (no need for data
+				 * correction)
+				 */
+			} else {
+				/* n-th error located in data */
+				data[errloc[n] / 8] ^= 1 << (errloc[n] % 8);
+			}
+		}
+	}
+
+	free(errloc);
+	return 0;
+}
+
+static const int ID;
+static const int LEN = 1;
+static const int VER = 2;
+static const int TYP = 3;
+static const int BLOCK_SIZE = 4;
+
+static const u8 HEADER_BLOCK_ID;
+static const u8 HEADER_BLOCK_LEN = 18;
+static const u32 HEADER_BLOCK_MAGIC = 0xca53ca53;
+static const size_t HEADER_BLOCK_VERIFY_LEN = 14;
+static const size_t HEADER_BLOCK_ECC_OFF = 14;
+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))
+{
+	if (size < HEADER_BLOCK_LEN || !data || !fn)
+		return -EINVAL;
+
+	/*
+	 * +--------------------+----------------+--//--+--------------------+
+	 * | header block       | data block     | ...  | ecc block          |
+	 * +--------------------+----------------+--//--+--------------------+
+	 * :                    :                       :
+	 * +------+-------+-----+                       +------+-------------+
+	 * | id   | magic | ecc |                       | ...  | ecc         |
+	 * | len  | off   |     |                       +------+-------------+
+	 * | ver  | size  |     |                       :
+	 * | type |       |     |                       :
+	 * +------+-------+-----+                       :
+	 * :              :     :                       :
+	 * <----- [1] ---->     <--------- [2] --------->
+	 *
+	 * Repair (if necessary) the contents of header block [1] by using a
+	 * 4 byte ECC located at the end of the header block.  A successful
+	 * return value means that we can trust the header.
+	 */
+	int ret = verify_bch(bch_configuration.header_ecc_capability_bits,
+			     bch_configuration.prim_poly, data,
+			     HEADER_BLOCK_VERIFY_LEN,
+			     &data[HEADER_BLOCK_ECC_OFF], HEADER_BLOCK_ECC_LEN);
+	if (ret < 0)
+		return ret;
+
+	/* Validate header block { id, length, version, type }. */
+	if (data[ID] != HEADER_BLOCK_ID || data[LEN] != HEADER_BLOCK_LEN ||
+	    data[VER] != 0 || data[TYP] != 0 ||
+	    ntohl(*(u32 *)(&data[4])) != HEADER_BLOCK_MAGIC)
+		return -EINVAL;
+
+	u32 offset = ntohl(*(u32 *)(&data[8]));
+	u16 size_bits = ntohs(*(u16 *)(&data[12]));
+
+	/* Check that ECC header fits. */
+	if (offset + 3 >= size)
+		return -EINVAL;
+
+	/* Validate ECC block. */
+	u8 *ecc = &data[offset];
+
+	if (ecc[ID] != ECC_BLOCK_ID || ecc[LEN] < BLOCK_SIZE ||
+	    ecc[LEN] + offset > size ||
+	    ecc[LEN] - BLOCK_SIZE != size_bits / 8 || ecc[VER] != 1 ||
+	    ecc[TYP] != 1)
+		return -EINVAL;
+
+	/*
+	 * Use the header block to locate the ECC block and verify the data
+	 * blocks [2] against the ecc block ECC.
+	 */
+	ret = verify_bch(bch_configuration.data_ecc_capability_bits,
+			 bch_configuration.prim_poly, &data[data[LEN]],
+			 offset - data[LEN], &data[offset + BLOCK_SIZE],
+			 ecc[LEN] - BLOCK_SIZE);
+	if (ret < 0)
+		return ret;
+
+	/* Stop after ECC.  Ignore possible zero padding. */
+	size = offset;
+
+	for (;;) {
+		/* Move to next block. */
+		size -= data[LEN];
+		data += data[LEN];
+
+		if (size == 0) {
+			/* Finished iterating through blocks. */
+			return 0;
+		}
+
+		if (size < BLOCK_SIZE || data[LEN] < BLOCK_SIZE) {
+			/* Not enough data for a header, or short header. */
+			return -EINVAL;
+		}
+
+		ret = fn(userdata, data[ID], data[VER], data[TYP],
+			 data[LEN] - BLOCK_SIZE, &data[BLOCK_SIZE]);
+		if (ret)
+			return ret;
+	}
+}
diff --git a/board/ge/common/vpd_reader.h b/board/ge/common/vpd_reader.h
new file mode 100644
index 0000000..4abba8f
--- /dev/null
+++ b/board/ge/common/vpd_reader.h
@@ -0,0 +1,17 @@
+/*
+ * Copyright 2016 General Electric Company
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+
+#include "common.h"
+
+/*
+ * Read VPD from given data, verify content, and call callback
+ * for each vital product 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));
-- 
2.1.4

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

* [U-Boot] [PATCH v5 2/8] ext4: recover from filesystem corruption when reading
  2017-11-08 15:35 ` [U-Boot] [PATCH v5 2/8] ext4: recover from filesystem corruption when reading Martyn Welch
@ 2017-11-09  9:25   ` Stefano Babic
  0 siblings, 0 replies; 16+ messages in thread
From: Stefano Babic @ 2017-11-09  9:25 UTC (permalink / raw)
  To: u-boot

On 08/11/2017 16:35, Martyn Welch wrote:
> From: Ian Ray <ian.ray@ge.com>
> 
> Some fixes when reading EXT files and directory entries were identified
> after using e2fuzz to corrupt an EXT3 filesystem:
> 
>  - Stop reading directory entries if the offset becomes badly aligned.
> 
>  - Avoid overwriting memory by clamping the length used to zero the buffer
>    in ext4fs_read_file.  Also sanity check blocksize.
> 
> Signed-off-by: Ian Ray <ian.ray@ge.com>
> Signed-off-by: Martyn Welch <martyn.welch@collabora.co.uk>
> ---
>  fs/ext4/ext4_common.c | 10 ++++++++++
>  fs/ext4/ext4fs.c      | 10 +++++++++-
>  2 files changed, 19 insertions(+), 1 deletion(-)
> 
> diff --git a/fs/ext4/ext4_common.c b/fs/ext4/ext4_common.c
> index 31952f4..dac9545 100644
> --- a/fs/ext4/ext4_common.c
> +++ b/fs/ext4/ext4_common.c
> @@ -660,6 +660,11 @@ static int search_dir(struct ext2_inode *parent_inode, char *dirname)
>  
>  		offset = 0;
>  		do {
> +			if (offset & 3) {
> +				printf("Badly aligned ext2_dirent\n");
> +				break;
> +			}
> +
>  			dir = (struct ext2_dirent *)(block_buffer + offset);
>  			direntname = (char*)(dir) + sizeof(struct ext2_dirent);
>  
> @@ -880,6 +885,11 @@ static int unlink_filename(char *filename, unsigned int blknr)
>  
>  	offset = 0;
>  	do {
> +		if (offset & 3) {
> +			printf("Badly aligned ext2_dirent\n");
> +			break;
> +		}
> +
>  		previous_dir = dir;
>  		dir = (struct ext2_dirent *)(block_buffer + offset);
>  		direntname = (char *)(dir) + sizeof(struct ext2_dirent);
> diff --git a/fs/ext4/ext4fs.c b/fs/ext4/ext4fs.c
> index b0c7303..9ee2caf 100644
> --- a/fs/ext4/ext4fs.c
> +++ b/fs/ext4/ext4fs.c
> @@ -64,6 +64,9 @@ int ext4fs_read_file(struct ext2fs_node *node, loff_t pos,
>  	char *delayed_buf = NULL;
>  	short status;
>  
> +	if (blocksize <= 0)
> +		return -1;
> +
>  	/* Adjust len so it we can't read past the end of the file. */
>  	if (len + pos > filesize)
>  		len = (filesize - pos);
> @@ -127,6 +130,7 @@ int ext4fs_read_file(struct ext2fs_node *node, loff_t pos,
>  					(blockend >> log2blksz);
>  			}
>  		} else {
> +			int n;
>  			if (previous_block_number != -1) {
>  				/* spill */
>  				status = ext4fs_devread(delayed_start,
> @@ -137,7 +141,11 @@ int ext4fs_read_file(struct ext2fs_node *node, loff_t pos,
>  					return -1;
>  				previous_block_number = -1;
>  			}
> -			memset(buf, 0, blocksize - skipfirst);
> +			/* Zero no more than `len' bytes. */
> +			n = blocksize - skipfirst;
> +			if (n > len)
> +				n = len;
> +			memset(buf, 0, n);
>  		}
>  		buf += blocksize - skipfirst;
>  	}
> 

Reviewed-by: Stefano Babic <sbabic@denx.de>

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] 16+ messages in thread

* [U-Boot] [PATCH v5 7/8] board: ge: make VPD code common
  2017-11-08 15:35 ` [U-Boot] [PATCH v5 7/8] board: ge: make VPD code common Martyn Welch
@ 2017-11-09  9:27   ` Stefano Babic
  0 siblings, 0 replies; 16+ messages in thread
From: Stefano Babic @ 2017-11-09  9:27 UTC (permalink / raw)
  To: u-boot

On 08/11/2017 16:35, Martyn Welch wrote:
> The VPD data is used on a number of GE products. Move the parsing code to
> a common location so that we can share this code.
> 
> Signed-off-by: Martyn Welch <martyn.welch@collabora.co.uk>
> ---
> Changes in v4:
>    - New patch.
> 
> Changes in v5:
>    - Fixed checkpatch issues.
> 
> board/ge/bx50v3/Makefile     |   2 +-
>  board/ge/bx50v3/bx50v3.c     |   2 +-
>  board/ge/bx50v3/vpd_reader.c | 228 -------------------------------------------
>  board/ge/bx50v3/vpd_reader.h |  25 -----
>  board/ge/common/Makefile     |   7 ++
>  board/ge/common/vpd_reader.c | 197 +++++++++++++++++++++++++++++++++++++
>  board/ge/common/vpd_reader.h |  17 ++++
>  7 files changed, 223 insertions(+), 255 deletions(-)
>  delete mode 100644 board/ge/bx50v3/vpd_reader.c
>  delete mode 100644 board/ge/bx50v3/vpd_reader.h
>  create mode 100644 board/ge/common/Makefile
>  create mode 100644 board/ge/common/vpd_reader.c
>  create mode 100644 board/ge/common/vpd_reader.h
> 
> diff --git a/board/ge/bx50v3/Makefile b/board/ge/bx50v3/Makefile
> index 2fff27b..bcd149f 100644
> --- a/board/ge/bx50v3/Makefile
> +++ b/board/ge/bx50v3/Makefile
> @@ -5,4 +5,4 @@
>  # SPDX-License-Identifier:	GPL-2.0+
>  #
>  
> -obj-y  := bx50v3.o vpd_reader.o
> +obj-y  := bx50v3.o
> diff --git a/board/ge/bx50v3/bx50v3.c b/board/ge/bx50v3/bx50v3.c
> index 2e8f394..37de990 100644
> --- a/board/ge/bx50v3/bx50v3.c
> +++ b/board/ge/bx50v3/bx50v3.c
> @@ -28,7 +28,7 @@
>  #include <input.h>
>  #include <pwm.h>
>  #include <stdlib.h>
> -#include "vpd_reader.h"
> +#include "../common/vpd_reader.h"
>  DECLARE_GLOBAL_DATA_PTR;
>  
>  #ifndef CONFIG_SYS_I2C_EEPROM_ADDR
> diff --git a/board/ge/bx50v3/vpd_reader.c b/board/ge/bx50v3/vpd_reader.c
> deleted file mode 100644
> index 98da893..0000000
> --- a/board/ge/bx50v3/vpd_reader.c
> +++ /dev/null
> @@ -1,228 +0,0 @@
> -/*
> - * Copyright 2016 General Electric Company
> - *
> - * SPDX-License-Identifier:	GPL-2.0+
> - */
> -
> -#include "vpd_reader.h"
> -
> -#include <linux/bch.h>
> -#include <stdlib.h>
> -
> -
> -/* BCH configuration */
> -
> -const struct {
> -	int header_ecc_capability_bits;
> -	int data_ecc_capability_bits;
> -	unsigned int prim_poly;
> -	struct {
> -		int min;
> -		int max;
> -	} galois_field_order;
> -} bch_configuration = {
> -	.header_ecc_capability_bits = 4,
> -	.data_ecc_capability_bits = 16,
> -	.prim_poly = 0,
> -	.galois_field_order = {
> -		.min = 5,
> -		.max = 15,
> -	},
> -};
> -
> -static int calculate_galois_field_order(size_t source_length)
> -{
> -	int gfo = bch_configuration.galois_field_order.min;
> -
> -	for (; gfo < bch_configuration.galois_field_order.max &&
> -	     ((((1 << gfo) - 1) - ((int)source_length * 8)) < 0);
> -	     gfo++) {
> -	}
> -
> -	if (gfo == bch_configuration.galois_field_order.max) {
> -		return -1;
> -	}
> -
> -	return gfo + 1;
> -}
> -
> -static int verify_bch(int ecc_bits, unsigned int prim_poly,
> -	uint8_t * data, size_t data_length,
> -	const uint8_t * ecc, size_t ecc_length)
> -{
> -	int gfo = calculate_galois_field_order(data_length);
> -	if (gfo < 0) {
> -		return -1;
> -	}
> -
> -	struct bch_control * bch = init_bch(gfo, ecc_bits, prim_poly);
> -	if (!bch) {
> -		return -1;
> -	}
> -
> -	if (bch->ecc_bytes != ecc_length) {
> -		free_bch(bch);
> -		return -1;
> -	}
> -
> -	unsigned * errloc = (unsigned *)calloc(data_length, sizeof(unsigned));
> -	int errors = decode_bch(
> -			bch, data, data_length, ecc, NULL, NULL, errloc);
> -	free_bch(bch);
> -	if (errors < 0) {
> -		free(errloc);
> -		return -1;
> -	}
> -
> -	if (errors > 0) {
> -		for (int n = 0; n < errors; n++) {
> -			if (errloc[n] >= 8 * data_length) {
> -				/* n-th error located in ecc (no need for data correction) */
> -			} else {
> -				/* n-th error located in data */
> -				data[errloc[n] / 8] ^= 1 << (errloc[n] % 8);
> -			}
> -		}
> -	}
> -
> -	free(errloc);
> -	return 0;
> -}
> -
> -
> -static const int ID = 0;
> -static const int LEN = 1;
> -static const int VER = 2;
> -static const int TYP = 3;
> -static const int BLOCK_SIZE = 4;
> -
> -static const uint8_t HEADER_BLOCK_ID = 0x00;
> -static const uint8_t HEADER_BLOCK_LEN = 18;
> -static const uint32_t HEADER_BLOCK_MAGIC = 0xca53ca53;
> -static const size_t HEADER_BLOCK_VERIFY_LEN = 14;
> -static const size_t HEADER_BLOCK_ECC_OFF = 14;
> -static const size_t HEADER_BLOCK_ECC_LEN = 4;
> -
> -static const uint8_t ECC_BLOCK_ID = 0xFF;
> -
> -int vpd_reader(
> -	size_t size,
> -	uint8_t * data,
> -	void * userdata,
> -	int (*fn)(
> -	    void * userdata,
> -	    uint8_t id,
> -	    uint8_t version,
> -	    uint8_t type,
> -	    size_t size,
> -	    uint8_t const * data))
> -{
> -	if (   size < HEADER_BLOCK_LEN
> -	    || data == NULL
> -	    || fn == NULL) {
> -		return -EINVAL;
> -	}
> -
> -	/*
> -	 * +--------------------+--------------------+--//--+--------------------+
> -	 * | header block       | data block         | ...  | ecc block          |
> -	 * +--------------------+--------------------+--//--+--------------------+
> -	 * :                    :                           :
> -	 * +------+-------+-----+                           +------+-------------+
> -	 * | id   | magic | ecc |                           | ...  | ecc         |
> -	 * | len  | off   |     |                           +------+-------------+
> -	 * | ver  | size  |     |                           :
> -	 * | type |       |     |                           :
> -	 * +------+-------+-----+                           :
> -	 * :              :     :                           :
> -	 * <----- [1] ---->     <----------- [2] ----------->
> -	 *
> -	 * Repair (if necessary) the contents of header block [1] by using a
> -	 * 4 byte ECC located at the end of the header block.  A successful
> -	 * return value means that we can trust the header.
> -	 */
> -	int ret = verify_bch(
> -		bch_configuration.header_ecc_capability_bits,
> -		bch_configuration.prim_poly,
> -		data,
> -		HEADER_BLOCK_VERIFY_LEN,
> -		&data[HEADER_BLOCK_ECC_OFF],
> -		HEADER_BLOCK_ECC_LEN);
> -	if (ret < 0) {
> -		return ret;
> -	}
> -
> -	/* Validate header block { id, length, version, type }. */
> -	if (   data[ID] != HEADER_BLOCK_ID
> -	    || data[LEN] != HEADER_BLOCK_LEN
> -	    || data[VER] != 0
> -	    || data[TYP] != 0
> -	    || ntohl(*(uint32_t *)(&data[4])) != HEADER_BLOCK_MAGIC) {
> -		return -EINVAL;
> -	}
> -
> -	uint32_t offset = ntohl(*(uint32_t *)(&data[8]));
> -	uint16_t size_bits = ntohs(*(uint16_t *)(&data[12]));
> -
> -	/* Check that ECC header fits. */
> -	if (offset + 3 >= size) {
> -		return -EINVAL;
> -	}
> -
> -	/* Validate ECC block. */
> -	uint8_t * ecc = &data[offset];
> -	if (   ecc[ID] != ECC_BLOCK_ID
> -	    || ecc[LEN] < BLOCK_SIZE
> -	    || ecc[LEN] + offset > size
> -	    || ecc[LEN] - BLOCK_SIZE != size_bits / 8
> -	    || ecc[VER] != 1
> -	    || ecc[TYP] != 1) {
> -		return -EINVAL;
> -	}
> -
> -	/*
> -	 * Use the header block to locate the ECC block and verify the data
> -	 * blocks [2] against the ecc block ECC.
> -	 */
> -	ret = verify_bch(
> -		bch_configuration.data_ecc_capability_bits,
> -		bch_configuration.prim_poly,
> -		&data[data[LEN]],
> -		offset - data[LEN],
> -		&data[offset + BLOCK_SIZE],
> -		ecc[LEN] - BLOCK_SIZE);
> -	if (ret < 0) {
> -		return ret;
> -	}
> -
> -	/* Stop after ECC.  Ignore possible zero padding. */
> -	size = offset;
> -
> -	for (;;) {
> -		/* Move to next block. */
> -		size -= data[LEN];
> -		data += data[LEN];
> -
> -		if (size == 0) {
> -			/* Finished iterating through blocks. */
> -			return 0;
> -		}
> -
> -		if (   size < BLOCK_SIZE
> -		    || data[LEN] < BLOCK_SIZE) {
> -			/* Not enough data for a header, or short header. */
> -			return -EINVAL;
> -		}
> -
> -		ret = fn(
> -			userdata,
> -			data[ID],
> -			data[VER],
> -			data[TYP],
> -			data[LEN] - BLOCK_SIZE,
> -			&data[BLOCK_SIZE]);
> -		if (ret) {
> -			return ret;
> -		}
> -	}
> -}
> diff --git a/board/ge/bx50v3/vpd_reader.h b/board/ge/bx50v3/vpd_reader.h
> deleted file mode 100644
> index efa172a..0000000
> --- a/board/ge/bx50v3/vpd_reader.h
> +++ /dev/null
> @@ -1,25 +0,0 @@
> -/*
> - * Copyright 2016 General Electric Company
> - *
> - * SPDX-License-Identifier:	GPL-2.0+
> - */
> -
> -#include "common.h"
> -
> -/*
> - * Read VPD from given data, verify content, and call callback
> - * for each vital product data block.
> - *
> - * Returns Non-zero on error.  Negative numbers encode errno.
> - */
> -int vpd_reader(
> -	size_t size,
> -	uint8_t * data,
> -	void * userdata,
> -	int (*fn)(
> -	    void * userdata,
> -	    uint8_t id,
> -	    uint8_t version,
> -	    uint8_t type,
> -	    size_t size,
> -	    uint8_t const * data));
> diff --git a/board/ge/common/Makefile b/board/ge/common/Makefile
> new file mode 100644
> index 0000000..93e6c01
> --- /dev/null
> +++ b/board/ge/common/Makefile
> @@ -0,0 +1,7 @@
> +#
> +# Copyright 2017 General Electric Company
> +#
> +# SPDX-License-Identifier:	GPL-2.0+
> +#
> +
> +obj-y  := vpd_reader.o
> diff --git a/board/ge/common/vpd_reader.c b/board/ge/common/vpd_reader.c
> new file mode 100644
> index 0000000..7367427
> --- /dev/null
> +++ b/board/ge/common/vpd_reader.c
> @@ -0,0 +1,197 @@
> +/*
> + * Copyright 2016 General Electric Company
> + *
> + * SPDX-License-Identifier:	GPL-2.0+
> + */
> +
> +#include "vpd_reader.h"
> +
> +#include <linux/bch.h>
> +#include <stdlib.h>
> +
> +/* BCH configuration */
> +
> +const struct {
> +	int header_ecc_capability_bits;
> +	int data_ecc_capability_bits;
> +	unsigned int prim_poly;
> +	struct {
> +		int min;
> +		int max;
> +	} galois_field_order;
> +} bch_configuration = {
> +	.header_ecc_capability_bits = 4,
> +	.data_ecc_capability_bits = 16,
> +	.prim_poly = 0,
> +	.galois_field_order = {
> +		.min = 5,
> +		.max = 15,
> +	},
> +};
> +
> +static int calculate_galois_field_order(size_t source_length)
> +{
> +	int gfo = bch_configuration.galois_field_order.min;
> +
> +	for (; gfo < bch_configuration.galois_field_order.max &&
> +	     ((((1 << gfo) - 1) - ((int)source_length * 8)) < 0);
> +	     gfo++) {
> +	}
> +
> +	if (gfo == bch_configuration.galois_field_order.max)
> +		return -1;
> +
> +	return gfo + 1;
> +}
> +
> +static int verify_bch(int ecc_bits, unsigned int prim_poly, u8 *data,
> +		      size_t data_length, const u8 *ecc, size_t ecc_length)
> +{
> +	int gfo = calculate_galois_field_order(data_length);
> +
> +	if (gfo < 0)
> +		return -1;
> +
> +	struct bch_control *bch = init_bch(gfo, ecc_bits, prim_poly);
> +
> +	if (!bch)
> +		return -1;
> +
> +	if (bch->ecc_bytes != ecc_length) {
> +		free_bch(bch);
> +		return -1;
> +	}
> +
> +	unsigned int *errloc = (unsigned int *)calloc(data_length,
> +						      sizeof(unsigned int));
> +	int errors = decode_bch(bch, data, data_length, ecc, NULL, NULL,
> +				errloc);
> +
> +	free_bch(bch);
> +	if (errors < 0) {
> +		free(errloc);
> +		return -1;
> +	}
> +
> +	if (errors > 0) {
> +		for (int n = 0; n < errors; n++) {
> +			if (errloc[n] >= 8 * data_length) {
> +				/*
> +				 * n-th error located in ecc (no need for data
> +				 * correction)
> +				 */
> +			} else {
> +				/* n-th error located in data */
> +				data[errloc[n] / 8] ^= 1 << (errloc[n] % 8);
> +			}
> +		}
> +	}
> +
> +	free(errloc);
> +	return 0;
> +}
> +
> +static const int ID;
> +static const int LEN = 1;
> +static const int VER = 2;
> +static const int TYP = 3;
> +static const int BLOCK_SIZE = 4;
> +
> +static const u8 HEADER_BLOCK_ID;
> +static const u8 HEADER_BLOCK_LEN = 18;
> +static const u32 HEADER_BLOCK_MAGIC = 0xca53ca53;
> +static const size_t HEADER_BLOCK_VERIFY_LEN = 14;
> +static const size_t HEADER_BLOCK_ECC_OFF = 14;
> +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))
> +{
> +	if (size < HEADER_BLOCK_LEN || !data || !fn)
> +		return -EINVAL;
> +
> +	/*
> +	 * +--------------------+----------------+--//--+--------------------+
> +	 * | header block       | data block     | ...  | ecc block          |
> +	 * +--------------------+----------------+--//--+--------------------+
> +	 * :                    :                       :
> +	 * +------+-------+-----+                       +------+-------------+
> +	 * | id   | magic | ecc |                       | ...  | ecc         |
> +	 * | len  | off   |     |                       +------+-------------+
> +	 * | ver  | size  |     |                       :
> +	 * | type |       |     |                       :
> +	 * +------+-------+-----+                       :
> +	 * :              :     :                       :
> +	 * <----- [1] ---->     <--------- [2] --------->
> +	 *
> +	 * Repair (if necessary) the contents of header block [1] by using a
> +	 * 4 byte ECC located at the end of the header block.  A successful
> +	 * return value means that we can trust the header.
> +	 */
> +	int ret = verify_bch(bch_configuration.header_ecc_capability_bits,
> +			     bch_configuration.prim_poly, data,
> +			     HEADER_BLOCK_VERIFY_LEN,
> +			     &data[HEADER_BLOCK_ECC_OFF], HEADER_BLOCK_ECC_LEN);
> +	if (ret < 0)
> +		return ret;
> +
> +	/* Validate header block { id, length, version, type }. */
> +	if (data[ID] != HEADER_BLOCK_ID || data[LEN] != HEADER_BLOCK_LEN ||
> +	    data[VER] != 0 || data[TYP] != 0 ||
> +	    ntohl(*(u32 *)(&data[4])) != HEADER_BLOCK_MAGIC)
> +		return -EINVAL;
> +
> +	u32 offset = ntohl(*(u32 *)(&data[8]));
> +	u16 size_bits = ntohs(*(u16 *)(&data[12]));
> +
> +	/* Check that ECC header fits. */
> +	if (offset + 3 >= size)
> +		return -EINVAL;
> +
> +	/* Validate ECC block. */
> +	u8 *ecc = &data[offset];
> +
> +	if (ecc[ID] != ECC_BLOCK_ID || ecc[LEN] < BLOCK_SIZE ||
> +	    ecc[LEN] + offset > size ||
> +	    ecc[LEN] - BLOCK_SIZE != size_bits / 8 || ecc[VER] != 1 ||
> +	    ecc[TYP] != 1)
> +		return -EINVAL;
> +
> +	/*
> +	 * Use the header block to locate the ECC block and verify the data
> +	 * blocks [2] against the ecc block ECC.
> +	 */
> +	ret = verify_bch(bch_configuration.data_ecc_capability_bits,
> +			 bch_configuration.prim_poly, &data[data[LEN]],
> +			 offset - data[LEN], &data[offset + BLOCK_SIZE],
> +			 ecc[LEN] - BLOCK_SIZE);
> +	if (ret < 0)
> +		return ret;
> +
> +	/* Stop after ECC.  Ignore possible zero padding. */
> +	size = offset;
> +
> +	for (;;) {
> +		/* Move to next block. */
> +		size -= data[LEN];
> +		data += data[LEN];
> +
> +		if (size == 0) {
> +			/* Finished iterating through blocks. */
> +			return 0;
> +		}
> +
> +		if (size < BLOCK_SIZE || data[LEN] < BLOCK_SIZE) {
> +			/* Not enough data for a header, or short header. */
> +			return -EINVAL;
> +		}
> +
> +		ret = fn(userdata, data[ID], data[VER], data[TYP],
> +			 data[LEN] - BLOCK_SIZE, &data[BLOCK_SIZE]);
> +		if (ret)
> +			return ret;
> +	}
> +}
> diff --git a/board/ge/common/vpd_reader.h b/board/ge/common/vpd_reader.h
> new file mode 100644
> index 0000000..4abba8f
> --- /dev/null
> +++ b/board/ge/common/vpd_reader.h
> @@ -0,0 +1,17 @@
> +/*
> + * Copyright 2016 General Electric Company
> + *
> + * SPDX-License-Identifier:	GPL-2.0+
> + */
> +
> +#include "common.h"
> +
> +/*
> + * Read VPD from given data, verify content, and call callback
> + * for each vital product 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));
> 

Acked-by: Stefano Babic <sbabic@denx.de>

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] 16+ messages in thread

* [U-Boot] [PATCH v5 3/8] pwm: imx: Enable PWM support on i.MX53
  2017-11-08 15:35 ` [U-Boot] [PATCH v5 3/8] pwm: imx: Enable PWM support on i.MX53 Martyn Welch
@ 2017-11-09  9:28   ` Stefano Babic
  0 siblings, 0 replies; 16+ messages in thread
From: Stefano Babic @ 2017-11-09  9:28 UTC (permalink / raw)
  To: u-boot

On 08/11/2017 16:35, Martyn Welch wrote:
> Add missing parts for i.MX53 PWM support
> 
> Acked-by: Nandor Han <nandor.han@ge.com>
> Signed-off-by: Martyn Welch <martyn.welch@collabora.co.uk>
> Cc: Stefano Babic <sbabic@denx.de>
> ---
> Changes for v4:
>    - Removed ifdef.
> 
>  arch/arm/include/asm/arch-mx5/imx-regs.h | 17 +++++++++++++++++
>  drivers/pwm/pwm-imx-util.c               |  2 ++
>  2 files changed, 19 insertions(+)
> 
> diff --git a/arch/arm/include/asm/arch-mx5/imx-regs.h b/arch/arm/include/asm/arch-mx5/imx-regs.h
> index 3e79fa3..2b0dc1e 100644
> --- a/arch/arm/include/asm/arch-mx5/imx-regs.h
> +++ b/arch/arm/include/asm/arch-mx5/imx-regs.h
> @@ -508,6 +508,23 @@ struct fuse_bank4_regs {
>  };
>  #endif
>  
> +#define PWMCR_PRESCALER(x)	(((x - 1) & 0xFFF) << 4)
> +#define PWMCR_DOZEEN		(1 << 24)
> +#define PWMCR_WAITEN		(1 << 23)
> +#define PWMCR_DBGEN		(1 << 22)
> +#define PWMCR_CLKSRC_IPG_HIGH	(2 << 16)
> +#define PWMCR_CLKSRC_IPG	(1 << 16)
> +#define PWMCR_EN		(1 << 0)
> +
> +struct pwm_regs {
> +	u32	cr;
> +	u32	sr;
> +	u32	ir;
> +	u32	sar;
> +	u32	pr;
> +	u32	cnr;
> +};
> +
>  #endif /* __ASSEMBLER__*/
>  
>  #endif				/* __ASM_ARCH_MX5_IMX_REGS_H__ */
> diff --git a/drivers/pwm/pwm-imx-util.c b/drivers/pwm/pwm-imx-util.c
> index 534dd8e..97ac0c8 100644
> --- a/drivers/pwm/pwm-imx-util.c
> +++ b/drivers/pwm/pwm-imx-util.c
> @@ -23,10 +23,12 @@ struct pwm_regs *pwm_id_to_reg(int pwm_id)
>  		return (struct pwm_regs *)PWM1_BASE_ADDR;
>  	case 1:
>  		return (struct pwm_regs *)PWM2_BASE_ADDR;
> +#ifdef CONFIG_MX6
>  	case 2:
>  		return (struct pwm_regs *)PWM3_BASE_ADDR;
>  	case 3:
>  		return (struct pwm_regs *)PWM4_BASE_ADDR;
> +#endif
>  #ifdef CONFIG_MX6SX
>  	case 4:
>  		return (struct pwm_regs *)PWM5_BASE_ADDR;
> 

Acked-by: Stefano Babic <sbabic@denx.de>

Best regards,
Stefano

-- 
=====================================================================
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] 16+ messages in thread

* [U-Boot] [PATCH v5 4/8] arm: mx5: Add more register definitions
  2017-11-08 15:35 ` [U-Boot] [PATCH v5 4/8] arm: mx5: Add more register definitions Martyn Welch
@ 2017-11-09  9:29   ` Stefano Babic
  0 siblings, 0 replies; 16+ messages in thread
From: Stefano Babic @ 2017-11-09  9:29 UTC (permalink / raw)
  To: u-boot

On 08/11/2017 16:35, Martyn Welch wrote:
> Add register definitions require for video configuration.
> 
> Signed-off-by: Nandor Han <nandor.han@ge.com>
> Signed-off-by: Martyn Welch <martyn.welch@collabora.co.uk>
> Reviewed-by: Stefano Babic <sbabic@denx.de>
> Cc: Stefano Babic <sbabic@denx.de>
> ---
> Changes in v5:
>   - Reduced checkpatch warnings.
> 
>  arch/arm/include/asm/arch-mx5/crm_regs.h |  8 ++++++++
>  arch/arm/include/asm/arch-mx5/imx-regs.h | 33 ++++++++++++++++++++++++++++++++
>  2 files changed, 41 insertions(+)
> 
> diff --git a/arch/arm/include/asm/arch-mx5/crm_regs.h b/arch/arm/include/asm/arch-mx5/crm_regs.h
> index b61c7b9..7fea569 100644
> --- a/arch/arm/include/asm/arch-mx5/crm_regs.h
> +++ b/arch/arm/include/asm/arch-mx5/crm_regs.h
> @@ -210,6 +210,14 @@ struct mxc_ccm_reg {
>  #define MXC_CCM_CSCMR1_SSI_EXT2_COM_CLK_SEL		(0x1 << 1)
>  #define MXC_CCM_CSCMR1_SSI_EXT1_COM_CLK_SEL		0x1
>  
> +/* Define the bits in register CSCMR2 */
> +#define MXC_CCM_CSCMR2_DI0_CLK_SEL_OFFSET		26
> +#define MXC_CCM_CSCMR2_DI0_CLK_SEL_MASK		(0x7 << 26)
> +#define MXC_CCM_CSCMR2_DI0_CLK_SEL(v)		(((v) & 0x7) << 26)
> +#define MXC_CCM_CSCMR2_DI0_CLK_SEL_RD(r)	(((r) >> 26) & 0x7)
> +
> +#define MXC_CCM_CSCMR2_DI0_CLK_SEL_LDB_DI0_CLK 5
> +
>  /* Define the bits in register CSCDR2 */
>  #define MXC_CCM_CSCDR2_CSPI_CLK_PRED_OFFSET		25
>  #define MXC_CCM_CSCDR2_CSPI_CLK_PRED_MASK		(0x7 << 25)
> diff --git a/arch/arm/include/asm/arch-mx5/imx-regs.h b/arch/arm/include/asm/arch-mx5/imx-regs.h
> index 2b0dc1e..61c8d44 100644
> --- a/arch/arm/include/asm/arch-mx5/imx-regs.h
> +++ b/arch/arm/include/asm/arch-mx5/imx-regs.h
> @@ -416,6 +416,39 @@ struct iomuxc {
>  };
>  #endif
>  
> +#define IOMUXC_GPR2_BITMAP_SPWG	0
> +#define IOMUXC_GPR2_BITMAP_JEIDA	1
> +
> +#define IOMUXC_GPR2_BIT_MAPPING_CH0_OFFSET	6
> +#define IOMUXC_GPR2_BIT_MAPPING_CH0_MASK	(1 << IOMUXC_GPR2_BIT_MAPPING_CH0_OFFSET)
> +#define IOMUXC_GPR2_BIT_MAPPING_CH0_JEIDA	(IOMUXC_GPR2_BITMAP_JEIDA << \
> +						 IOMUXC_GPR2_BIT_MAPPING_CH0_OFFSET)
> +#define IOMUXC_GPR2_BIT_MAPPING_CH0_SPWG	(IOMUXC_GPR2_BITMAP_SPWG << \
> +						 IOMUXC_GPR2_BIT_MAPPING_CH0_OFFSET)
> +
> +#define IOMUXC_GPR2_DATA_WIDTH_18	0
> +#define IOMUXC_GPR2_DATA_WIDTH_24	1
> +
> +#define IOMUXC_GPR2_DATA_WIDTH_CH0_OFFSET	5
> +#define IOMUXC_GPR2_DATA_WIDTH_CH0_MASK		(1 << IOMUXC_GPR2_DATA_WIDTH_CH0_OFFSET)
> +#define IOMUXC_GPR2_DATA_WIDTH_CH0_18BIT	(IOMUXC_GPR2_DATA_WIDTH_18 << \
> +						 IOMUXC_GPR2_DATA_WIDTH_CH0_OFFSET)
> +#define IOMUXC_GPR2_DATA_WIDTH_CH0_24BIT	(IOMUXC_GPR2_DATA_WIDTH_24 << \
> +						 IOMUXC_GPR2_DATA_WIDTH_CH0_OFFSET)
> +
> +#define IOMUXC_GPR2_MODE_DISABLED	0
> +#define IOMUXC_GPR2_MODE_ENABLED_DI0	1
> +#define IOMUXC_GPR2_MODE_ENABLED_DI1	3
> +
> +#define IOMUXC_GPR2_LVDS_CH0_MODE_OFFSET	0
> +#define IOMUXC_GPR2_LVDS_CH0_MODE_MASK		(3 << IOMUXC_GPR2_LVDS_CH0_MODE_OFFSET)
> +#define IOMUXC_GPR2_LVDS_CH0_MODE_DISABLED	(IOMUXC_GPR2_MODE_DISABLED << \
> +						 IOMUXC_GPR2_LVDS_CH0_MODE_OFFSET)
> +#define IOMUXC_GPR2_LVDS_CH0_MODE_ENABLED_DI0	(IOMUXC_GPR2_MODE_ENABLED_DI0 << \
> +						 IOMUXC_GPR2_LVDS_CH0_MODE_OFFSET)
> +#define IOMUXC_GPR2_LVDS_CH0_MODE_ENABLED_DI1	(IOMUXC_GPR2_MODE_ENABLED_DI1 << \
> +						 IOMUXC_GPR2_LVDS_CH0_MODE_OFFSET)
> +
>  /* System Reset Controller (SRC) */
>  struct src {
>  	u32	scr;
> 

Reviewed-by: Stefano Babic <sbabic@denx.de>

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] 16+ messages in thread

* [U-Boot] [PATCH v5 0/8] Add support for GE PPD
  2017-11-08 15:35 [U-Boot] [PATCH v5 0/8] Add support for GE PPD Martyn Welch
                   ` (6 preceding siblings ...)
  2017-11-08 15:35 ` [U-Boot] [PATCH v5 7/8] board: ge: make VPD code common Martyn Welch
@ 2017-11-09 10:19 ` Lukasz Majewski
  2017-11-09 11:50   ` Martyn Welch
  7 siblings, 1 reply; 16+ messages in thread
From: Lukasz Majewski @ 2017-11-09 10:19 UTC (permalink / raw)
  To: u-boot

Hi Martyn,

> *** Resend due to previous use of unsubscribed email address ***

Just a small remark.

You may consider using patman to get the list of u-boot community peers
to be CC'ed for your patch. Or at least look for a custodian (in
MAINTAINERS) responsible to IMX (NXP) SoC part of u-boot (in this case
Stefano Babic or Fabio Estevam).

The problem with sending code only to u-boot ML is that it may be
overlooked by people, who are the best candidates to review it.

> 
> This series adds support for the GE PPD. The initial patches in this
> series resolve issues found during development and testing, extend
> existing support and add new support for devices in the PPD. The final
> patch in the series adds the board support for the PPD.
> 
> Ian Ray (2):
>   ext4: recover from filesystem corruption when reading
>   bootcount: add support for bootcounter on EXT filesystem
> 
> Martyn Welch (3):
>   pwm: imx: Enable PWM support on i.MX53
>   arm: mx5: Add more register definitions
>   board: ge: make VPD code common
> 
> Nandor Han (2):
>   imx: mxc_i2c: tweak the i2c transfer method
>   rtc: add support for s35392a
> 
> Peter Senna Tschudin (1):
>   mx53: Add Board support for GE PPD
> 
>  README                                   |   7 +
>  arch/arm/include/asm/arch-mx5/crm_regs.h |   8 +
>  arch/arm/include/asm/arch-mx5/imx-regs.h |  50 ++++
>  arch/arm/mach-imx/mx5/Kconfig            |   7 +
>  board/ge/bx50v3/Makefile                 |   2 +-
>  board/ge/bx50v3/bx50v3.c                 |   2 +-
>  board/ge/bx50v3/vpd_reader.c             | 228 ---------------
>  board/ge/bx50v3/vpd_reader.h             |  25 --
>  board/ge/common/Makefile                 |   7 +
>  board/ge/common/vpd_reader.c             | 197 +++++++++++++
>  board/ge/common/vpd_reader.h             |  17 ++
>  board/ge/mx53ppd/Kconfig                 |  17 ++
>  board/ge/mx53ppd/MAINTAINERS             |   7 +
>  board/ge/mx53ppd/Makefile                |  12 +
>  board/ge/mx53ppd/imximage.cfg            |  87 ++++++
>  board/ge/mx53ppd/mx53ppd.c               | 457
> +++++++++++++++++++++++++++++++
> board/ge/mx53ppd/mx53ppd_video.c         | 135 +++++++++
> board/ge/mx53ppd/ppd_gpio.h              |  96 +++++++
> configs/mx53ppd_defconfig                |  39 +++
> drivers/Kconfig                          |   2 +
> drivers/bootcount/Kconfig                |  58 ++++
> drivers/bootcount/Makefile               |   1 +
> drivers/bootcount/bootcount_ext.c        |  62 +++++
> drivers/i2c/mxc_i2c.c                    |  25 +-
> drivers/pwm/pwm-imx-util.c               |   2 +
> drivers/rtc/Kconfig                      |   6 +
> drivers/rtc/Makefile                     |   1 +
> drivers/rtc/s35392a.c                    | 365
> ++++++++++++++++++++++++ fs/ext4/ext4_common.c                    |
> 10 + fs/ext4/ext4fs.c                         |  10 +-
> include/configs/mx53ppd.h                | 248 +++++++++++++++++
> lib/Kconfig                              |   3 + 32 files changed,
> 1927 insertions(+), 266 deletions(-) delete mode 100644
> board/ge/bx50v3/vpd_reader.c delete mode 100644
> board/ge/bx50v3/vpd_reader.h create mode 100644
> board/ge/common/Makefile create mode 100644
> board/ge/common/vpd_reader.c create mode 100644
> board/ge/common/vpd_reader.h create mode 100644
> board/ge/mx53ppd/Kconfig create mode 100644
> board/ge/mx53ppd/MAINTAINERS create mode 100644
> board/ge/mx53ppd/Makefile create mode 100644
> board/ge/mx53ppd/imximage.cfg create mode 100644
> board/ge/mx53ppd/mx53ppd.c create mode 100644
> board/ge/mx53ppd/mx53ppd_video.c create mode 100644
> board/ge/mx53ppd/ppd_gpio.h create mode 100644
> configs/mx53ppd_defconfig create mode 100644 drivers/bootcount/Kconfig
>  create mode 100644 drivers/bootcount/bootcount_ext.c
>  create mode 100644 drivers/rtc/s35392a.c
>  create mode 100644 include/configs/mx53ppd.h
> 



Best regards,

Lukasz Majewski

--

DENX Software Engineering GmbH,      Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 488 bytes
Desc: OpenPGP digital signature
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20171109/e2321c45/attachment.sig>

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

* [U-Boot] [PATCH v5 0/8] Add support for GE PPD
  2017-11-09 10:19 ` [U-Boot] [PATCH v5 0/8] Add support for GE PPD Lukasz Majewski
@ 2017-11-09 11:50   ` Martyn Welch
  0 siblings, 0 replies; 16+ messages in thread
From: Martyn Welch @ 2017-11-09 11:50 UTC (permalink / raw)
  To: u-boot

On Thu, 2017-11-09 at 11:19 +0100, Lukasz Majewski wrote:
> Hi Martyn,
> 
> > *** Resend due to previous use of unsubscribed email address ***
> 
> Just a small remark.
> 
> You may consider using patman to get the list of u-boot community peers
> to be CC'ed for your patch. Or at least look for a custodian (in
> MAINTAINERS) responsible to IMX (NXP) SoC part of u-boot (in this case
> Stefano Babic or Fabio Estevam).
> 

Ah, OK, I ran get_maintainers and CCed anyone specifically flagged as a
maintainer (which is what I understood to be good practice from the
U-Boot wiki).

I'll bear this in mind and CC those that have made significant
contributions next time.

> The problem with sending code only to u-boot ML is that it may be
> overlooked by people, who are the best candidates to review it.
> 
> > 
> > This series adds support for the GE PPD. The initial patches in this
> > series resolve issues found during development and testing, extend
> > existing support and add new support for devices in the PPD. The final
> > patch in the series adds the board support for the PPD.
> > 
> > Ian Ray (2):
> >   ext4: recover from filesystem corruption when reading
> >   bootcount: add support for bootcounter on EXT filesystem
> > 
> > Martyn Welch (3):
> >   pwm: imx: Enable PWM support on i.MX53
> >   arm: mx5: Add more register definitions
> >   board: ge: make VPD code common
> > 
> > Nandor Han (2):
> >   imx: mxc_i2c: tweak the i2c transfer method
> >   rtc: add support for s35392a
> > 
> > Peter Senna Tschudin (1):
> >   mx53: Add Board support for GE PPD
> > 
> >  README                                   |   7 +
> >  arch/arm/include/asm/arch-mx5/crm_regs.h |   8 +
> >  arch/arm/include/asm/arch-mx5/imx-regs.h |  50 ++++
> >  arch/arm/mach-imx/mx5/Kconfig            |   7 +
> >  board/ge/bx50v3/Makefile                 |   2 +-
> >  board/ge/bx50v3/bx50v3.c                 |   2 +-
> >  board/ge/bx50v3/vpd_reader.c             | 228 ---------------
> >  board/ge/bx50v3/vpd_reader.h             |  25 --
> >  board/ge/common/Makefile                 |   7 +
> >  board/ge/common/vpd_reader.c             | 197 +++++++++++++
> >  board/ge/common/vpd_reader.h             |  17 ++
> >  board/ge/mx53ppd/Kconfig                 |  17 ++
> >  board/ge/mx53ppd/MAINTAINERS             |   7 +
> >  board/ge/mx53ppd/Makefile                |  12 +
> >  board/ge/mx53ppd/imximage.cfg            |  87 ++++++
> >  board/ge/mx53ppd/mx53ppd.c               | 457
> > +++++++++++++++++++++++++++++++
> > board/ge/mx53ppd/mx53ppd_video.c         | 135 +++++++++
> > board/ge/mx53ppd/ppd_gpio.h              |  96 +++++++
> > configs/mx53ppd_defconfig                |  39 +++
> > drivers/Kconfig                          |   2 +
> > drivers/bootcount/Kconfig                |  58 ++++
> > drivers/bootcount/Makefile               |   1 +
> > drivers/bootcount/bootcount_ext.c        |  62 +++++
> > drivers/i2c/mxc_i2c.c                    |  25 +-
> > drivers/pwm/pwm-imx-util.c               |   2 +
> > drivers/rtc/Kconfig                      |   6 +
> > drivers/rtc/Makefile                     |   1 +
> > drivers/rtc/s35392a.c                    | 365
> > ++++++++++++++++++++++++ fs/ext4/ext4_common.c                    |
> > 10 + fs/ext4/ext4fs.c                         |  10 +-
> > include/configs/mx53ppd.h                | 248 +++++++++++++++++
> > lib/Kconfig                              |   3 + 32 files changed,
> > 1927 insertions(+), 266 deletions(-) delete mode 100644
> > board/ge/bx50v3/vpd_reader.c delete mode 100644
> > board/ge/bx50v3/vpd_reader.h create mode 100644
> > board/ge/common/Makefile create mode 100644
> > board/ge/common/vpd_reader.c create mode 100644
> > board/ge/common/vpd_reader.h create mode 100644
> > board/ge/mx53ppd/Kconfig create mode 100644
> > board/ge/mx53ppd/MAINTAINERS create mode 100644
> > board/ge/mx53ppd/Makefile create mode 100644
> > board/ge/mx53ppd/imximage.cfg create mode 100644
> > board/ge/mx53ppd/mx53ppd.c create mode 100644
> > board/ge/mx53ppd/mx53ppd_video.c create mode 100644
> > board/ge/mx53ppd/ppd_gpio.h create mode 100644
> > configs/mx53ppd_defconfig create mode 100644 drivers/bootcount/Kconfig
> >  create mode 100644 drivers/bootcount/bootcount_ext.c
> >  create mode 100644 drivers/rtc/s35392a.c
> >  create mode 100644 include/configs/mx53ppd.h
> > 
> 
> 
> 
> Best regards,
> 
> Lukasz Majewski
> 
> --
> 
> DENX Software Engineering GmbH,      Managing Director: Wolfgang Denk
> HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
> Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de

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

end of thread, other threads:[~2017-11-09 11:50 UTC | newest]

Thread overview: 16+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2017-11-08 15:35 [U-Boot] [PATCH v5 0/8] Add support for GE PPD Martyn Welch
2017-11-08 15:35 ` [U-Boot] [PATCH v5 1/8] imx: mxc_i2c: tweak the i2c transfer method Martyn Welch
2017-11-08 15:35 ` [U-Boot] [PATCH v5 2/8] ext4: recover from filesystem corruption when reading Martyn Welch
2017-11-09  9:25   ` Stefano Babic
2017-11-08 15:35 ` [U-Boot] [PATCH v5 3/8] pwm: imx: Enable PWM support on i.MX53 Martyn Welch
2017-11-09  9:28   ` Stefano Babic
2017-11-08 15:35 ` [U-Boot] [PATCH v5 4/8] arm: mx5: Add more register definitions Martyn Welch
2017-11-09  9:29   ` Stefano Babic
2017-11-08 15:35 ` [U-Boot] [PATCH v5 5/8] bootcount: add support for bootcounter on EXT filesystem Martyn Welch
2017-11-08 15:35 ` [U-Boot] [PATCH v5 6/8] rtc: add support for s35392a Martyn Welch
2017-11-08 15:35 ` [U-Boot] [PATCH v5 7/8] board: ge: make VPD code common Martyn Welch
2017-11-09  9:27   ` Stefano Babic
2017-11-09 10:19 ` [U-Boot] [PATCH v5 0/8] Add support for GE PPD Lukasz Majewski
2017-11-09 11:50   ` Martyn Welch
  -- strict thread matches above, loose matches on Subject: below --
2017-11-06 19:14 Martyn Welch
2017-11-07 10:00 ` Peter Robinson

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox