Discussion:
[PATCH] gpiolib: fix: do not access oftree on non-OFDEVICE boards
Alexander Kurz
2017-07-02 20:24:52 UTC
Permalink
Non-OFDEVICE boards may have OFTREE=y set, e.g. by BOOTM_OFTREE.
Attempts to browse the oftree will crash barebox on those boards.

Signed-off-by: Alexander Kurz <***@blala.de>
---
drivers/gpio/gpiolib.c | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c
index a3e17ad..a1ff965 100644
--- a/drivers/gpio/gpiolib.c
+++ b/drivers/gpio/gpiolib.c
@@ -416,7 +416,10 @@ int gpiochip_add(struct gpio_chip *chip)
for (i = chip->base; i < chip->base + chip->ngpio; i++)
gpio_desc[i].chip = chip;

- return of_gpiochip_scan_hogs(chip);
+ if (IS_ENABLED(CONFIG_OFDEVICE))
+ return of_gpiochip_scan_hogs(chip);
+ else
+ return 0;
}

void gpiochip_remove(struct gpio_chip *chip)
--
2.1.4
Lucas Stach
2017-07-03 09:56:00 UTC
Permalink
Post by Alexander Kurz
Non-OFDEVICE boards may have OFTREE=y set, e.g. by BOOTM_OFTREE.
Attempts to browse the oftree will crash barebox on those boards.
---
drivers/gpio/gpiolib.c | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c
index a3e17ad..a1ff965 100644
--- a/drivers/gpio/gpiolib.c
+++ b/drivers/gpio/gpiolib.c
@@ -416,7 +416,10 @@ int gpiochip_add(struct gpio_chip *chip)
for (i = chip->base; i < chip->base + chip->ngpio; i++)
gpio_desc[i].chip = chip;
- return of_gpiochip_scan_hogs(chip);
+ if (IS_ENABLED(CONFIG_OFDEVICE))
+ return of_gpiochip_scan_hogs(chip);
+ else
+ return 0;
This may also crash in mixed oftree/board file based systems (however
unlikely that is). I think an early return from of_gpiochip_scan_hogs ()
if chip->dev->device_node is NULL would be more robust.

Regards,
Lucas
Alexander Kurz
2017-07-04 20:17:39 UTC
Permalink
Hi Lucas,
Post by Lucas Stach
Post by Alexander Kurz
Non-OFDEVICE boards may have OFTREE=y set, e.g. by BOOTM_OFTREE.
Attempts to browse the oftree will crash barebox on those boards.
---
drivers/gpio/gpiolib.c | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c
index a3e17ad..a1ff965 100644
--- a/drivers/gpio/gpiolib.c
+++ b/drivers/gpio/gpiolib.c
@@ -416,7 +416,10 @@ int gpiochip_add(struct gpio_chip *chip)
for (i = chip->base; i < chip->base + chip->ngpio; i++)
gpio_desc[i].chip = chip;
- return of_gpiochip_scan_hogs(chip);
+ if (IS_ENABLED(CONFIG_OFDEVICE))
+ return of_gpiochip_scan_hogs(chip);
+ else
+ return 0;
This may also crash in mixed oftree/board file based systems (however
unlikely that is). I think an early return from of_gpiochip_scan_hogs ()
if chip->dev->device_node is NULL would be more robust.
IS_ENABLED(...) is evaluated at compile time.
Checking CONFIG_OFDEVICE even before calling the OF-function gives the
compiler the chance to omit the integration of the unneeded function.
A quick test on with kindle3_defconfig resulted in half a kilobyte
image size difference.

Sure, a further check on the device node presence might be usefull, e.g.
git grep 'IS_ENABLED(CONFIG_OFDEVICE)' drivers/
but I have not reviewed the code in this direction.
At least, the code does not crash due to this reason.

Regards, Alexander
Post by Lucas Stach
Regards,
Lucas
Sam Ravnborg
2017-07-05 18:22:10 UTC
Permalink
Post by Alexander Kurz
Hi Lucas,
Post by Lucas Stach
Post by Alexander Kurz
Non-OFDEVICE boards may have OFTREE=y set, e.g. by BOOTM_OFTREE.
Attempts to browse the oftree will crash barebox on those boards.
---
drivers/gpio/gpiolib.c | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c
index a3e17ad..a1ff965 100644
--- a/drivers/gpio/gpiolib.c
+++ b/drivers/gpio/gpiolib.c
@@ -416,7 +416,10 @@ int gpiochip_add(struct gpio_chip *chip)
for (i = chip->base; i < chip->base + chip->ngpio; i++)
gpio_desc[i].chip = chip;
- return of_gpiochip_scan_hogs(chip);
+ if (IS_ENABLED(CONFIG_OFDEVICE))
+ return of_gpiochip_scan_hogs(chip);
+ else
+ return 0;
This may also crash in mixed oftree/board file based systems (however
unlikely that is). I think an early return from of_gpiochip_scan_hogs ()
if chip->dev->device_node is NULL would be more robust.
IS_ENABLED(...) is evaluated at compile time.
Checking CONFIG_OFDEVICE even before calling the OF-function gives the
compiler the chance to omit the integration of the unneeded function.
A quick test on with kindle3_defconfig resulted in half a kilobyte
image size difference.
I have incorporat this change in the fix I posted, and added your
Signed-off-by: as you posted this first and my change came on
top of yours.
Will post in a new thread.

Sam

Loading...