summaryrefslogtreecommitdiffstats
path: root/meta-openbmc-bsp/meta-aspeed
diff options
context:
space:
mode:
Diffstat (limited to 'meta-openbmc-bsp/meta-aspeed')
-rw-r--r--meta-openbmc-bsp/meta-aspeed/meta-ast2400/recipes-kernel/linux/linux-obmc/0001-work-around-aspeed-bmc-opp-palmetto-Add-GPIO-hogs-to.patch251
-rw-r--r--meta-openbmc-bsp/meta-aspeed/meta-ast2400/recipes-kernel/linux/linux-obmc_%.bbappend1
2 files changed, 252 insertions, 0 deletions
diff --git a/meta-openbmc-bsp/meta-aspeed/meta-ast2400/recipes-kernel/linux/linux-obmc/0001-work-around-aspeed-bmc-opp-palmetto-Add-GPIO-hogs-to.patch b/meta-openbmc-bsp/meta-aspeed/meta-ast2400/recipes-kernel/linux/linux-obmc/0001-work-around-aspeed-bmc-opp-palmetto-Add-GPIO-hogs-to.patch
new file mode 100644
index 000000000..038797b19
--- /dev/null
+++ b/meta-openbmc-bsp/meta-aspeed/meta-ast2400/recipes-kernel/linux/linux-obmc/0001-work-around-aspeed-bmc-opp-palmetto-Add-GPIO-hogs-to.patch
@@ -0,0 +1,251 @@
+From 5362492a7546230866dc4a45269bb3dae65306cb Mon Sep 17 00:00:00 2001
+From: Andrew Jeffery <andrew@aj.id.au>
+Date: Fri, 2 Sep 2016 12:22:41 +0930
+Subject: [PATCH] work-around: aspeed-bmc-opp-palmetto: Add GPIO hogs to
+ devicetree
+
+This is a work-in-progress patch that attempts to emulate the GPIO
+state originally written by the mach-aspeed board file.
+
+It isn't entirely analogous: Whilst values might be set in the GPIO
+data/direction registers, this doesn't mean the GPIO IP was in control
+of the pins affected by the bits in question. However, the content of
+the patch is derived directly from the data and direction values that
+Steve Faure reported[1] from a Palmetto running the OpenBMC stable branch.
+
+Secondly, the patch pays no regard to the prescribed active state of the lines
+and assumes active high for all pins. This is not a reflection of the
+description in the schematic, and neither do the configured GPIO values
+necessarily reflect the prescribed initial values from the schematic.
+
+A starting point for the patch was generated from the following Python script:
+
+ #!/usr/bin/python3
+ import sys
+
+ from collections import namedtuple
+
+ GpioRegsetConfig = namedtuple("GpioRegsetConfig", "banks value direction")
+ banks = ( "ABCD", "EFGH" )
+
+ broken = (
+ GpioRegsetConfig(banks[0], 0x130F8CE3, 0x01706074),
+ GpioRegsetConfig(banks[1], 0x9F48F7FF, 0x00004002)
+ )
+
+ working = (
+ GpioRegsetConfig(banks[0], 0x130F8CE3, 0x0370E677),
+ GpioRegsetConfig(banks[1], 0x0370E677, 0xC738F202)
+ )
+
+ GpioConfig = namedtuple("GpioConfig", "bank index direction state active")
+
+ def gpio_dt(name, config):
+ fmt = "pin_gpio_{} {{\n\tgpio-hog;\n\tgpios = <ASPEED_GPIO({}, {}) {}>;\n\t{};\n\tline-name = \"{}\";\n}};"
+ if "output" == config.direction:
+ state = "{}-{}".format(config.direction, config.state)
+ else:
+ state = config.direction
+ return fmt.format(
+ name.lower(),
+ config.bank,
+ config.index,
+ "GPIO_ACTIVE_HIGH",
+ state,
+ name)
+
+ def tell_gpios(config, change):
+ for i, bank in enumerate(config.banks):
+ for j in range(0, 8):
+ bi = i * 8 + j;
+ if ((1 << bi) & change) > 0:
+ gpio = "{}{}".format(bank, j)
+ if (bi & config.direction) > 0:
+ sd = "output"
+ value = "high" if (bi & config.value) > 0 else "low"
+ else:
+ sd = "input"
+ value = None
+ dtconfig = GpioConfig(bank, j, sd, value, "GPIO_ACTIVE_HIGH")
+ print(gpio_dt(gpio, dtconfig))
+ print()
+
+ def main():
+ for b, w in zip(broken, working):
+ cd = b.direction ^ w.direction
+ tell_gpios(w, cd)
+
+ if __name__ == "__main__":
+ main()
+
+The generated patch was tested on a Pass 2 Palmetto. It was found that with the
+patch and an OpenBMC userspace generated at v1.99.0-60-g2b717d8489c1, the host
+could:
+
+* Boot to Petitboot
+* Reboot to Petitboot
+* Survive a reboot of the BMC (remain functional at the Petitboot shell)
+* Be powered off by the BMC after reboot
+
+Reports from Andrew Geissler[2] and Cédric Le Goater[3] suggest mixed results
+across the Palmetto fleet, but this patch at least represents a step forwards.
+
+For the above reasons and those below, this patch is a temporary work-around:
+
+* GPIOs configured as hogs cannot have their line state changed once initialised
+* GPIOs configured as hogs will not be exposed to userspace even if requested
+
+These two issues combined deny capabilities such as Cronus. The ultimate
+solution is userspace daemon(s) requesting and controlling the GPIOs as
+desired.
+
+[1] https://github.com/openbmc/openbmc/issues/527#issuecomment-244239595
+[2] https://github.com/openbmc/openbmc/issues/513#issuecomment-244454018
+[3] https://github.com/openbmc/openbmc/issues/513#issuecomment-244414523
+
+Signed-off-by: Andrew Jeffery <andrew@aj.id.au>
+---
+ arch/arm/boot/dts/aspeed-bmc-opp-palmetto.dts | 127 ++++++++++++++++++++++++++
+ 1 file changed, 127 insertions(+)
+
+diff --git a/arch/arm/boot/dts/aspeed-bmc-opp-palmetto.dts b/arch/arm/boot/dts/aspeed-bmc-opp-palmetto.dts
+index 21619fd8cd8d..5c689613e5bd 100644
+--- a/arch/arm/boot/dts/aspeed-bmc-opp-palmetto.dts
++++ b/arch/arm/boot/dts/aspeed-bmc-opp-palmetto.dts
+@@ -167,6 +167,133 @@
+ output-low;
+ line-name = "func_mode2";
+ };
++
++ pin_gpio_a0 {
++ gpio-hog;
++ gpios = <ASPEED_GPIO(A, 0) GPIO_ACTIVE_HIGH>;
++ input;
++ line-name = "A0";
++ };
++
++ pin_gpio_a1 {
++ gpio-hog;
++ gpios = <ASPEED_GPIO(A, 1) GPIO_ACTIVE_HIGH>;
++ output-high;
++ line-name = "A1";
++ };
++
++ pin_gpio_b1 {
++ gpio-hog;
++ gpios = <ASPEED_GPIO(B, 1) GPIO_ACTIVE_HIGH>;
++ output-high;
++ line-name = "B1";
++ };
++
++ pin_gpio_b2 {
++ gpio-hog;
++ gpios = <ASPEED_GPIO(B, 2) GPIO_ACTIVE_HIGH>;
++ output-high;
++ line-name = "B2";
++ };
++
++ pin_gpio_b7 {
++ gpio-hog;
++ gpios = <ASPEED_GPIO(B, 7) GPIO_ACTIVE_HIGH>;
++ output-high;
++ line-name = "B7";
++ };
++
++ pin_gpio_d1 {
++ gpio-hog;
++ gpios = <ASPEED_GPIO(D, 1) GPIO_ACTIVE_HIGH>;
++ output-high;
++ line-name = "D1";
++ };
++
++ pin_gpio_f1 {
++ gpio-hog;
++ gpios = <ASPEED_GPIO(F, 1) GPIO_ACTIVE_HIGH>;
++ input;
++ line-name = "F1";
++ };
++
++ pin_gpio_f4 {
++ gpio-hog;
++ gpios = <ASPEED_GPIO(F, 4) GPIO_ACTIVE_HIGH>;
++ input;
++ line-name = "F4";
++ };
++
++ pin_gpio_f5 {
++ gpio-hog;
++ gpios = <ASPEED_GPIO(F, 5) GPIO_ACTIVE_HIGH>;
++ input;
++ line-name = "F5";
++ };
++
++ pin_gpio_f7 {
++ gpio-hog;
++ gpios = <ASPEED_GPIO(F, 7) GPIO_ACTIVE_HIGH>;
++ output-high;
++ line-name = "F7";
++ };
++
++ pin_gpio_g3 {
++ gpio-hog;
++ gpios = <ASPEED_GPIO(G, 3) GPIO_ACTIVE_HIGH>;
++ output-high;
++ line-name = "G3";
++ };
++
++ pin_gpio_g4 {
++ gpio-hog;
++ gpios = <ASPEED_GPIO(G, 4) GPIO_ACTIVE_HIGH>;
++ input;
++ line-name = "G4";
++ };
++
++ pin_gpio_g5 {
++ gpio-hog;
++ gpios = <ASPEED_GPIO(G, 5) GPIO_ACTIVE_HIGH>;
++ input;
++ line-name = "G5";
++ };
++
++ pin_gpio_h0 {
++ gpio-hog;
++ gpios = <ASPEED_GPIO(H, 0) GPIO_ACTIVE_HIGH>;
++ input;
++ line-name = "H0";
++ };
++
++ pin_gpio_h1 {
++ gpio-hog;
++ gpios = <ASPEED_GPIO(H, 1) GPIO_ACTIVE_HIGH>;
++ input;
++ line-name = "H1";
++ };
++
++ pin_gpio_h2 {
++ gpio-hog;
++ gpios = <ASPEED_GPIO(H, 2) GPIO_ACTIVE_HIGH>;
++ output-high;
++ line-name = "H2";
++ };
++
++ pin_gpio_h6 {
++ gpio-hog;
++ gpios = <ASPEED_GPIO(H, 6) GPIO_ACTIVE_HIGH>;
++ output-high;
++ line-name = "H6";
++ };
++
++ pin_gpio_h7 {
++ gpio-hog;
++ gpios = <ASPEED_GPIO(H, 7) GPIO_ACTIVE_HIGH>;
++ output-high;
++ line-name = "H7";
++ };
++
+ };
+
+ &vuart {
+--
+2.7.4
+
diff --git a/meta-openbmc-bsp/meta-aspeed/meta-ast2400/recipes-kernel/linux/linux-obmc_%.bbappend b/meta-openbmc-bsp/meta-aspeed/meta-ast2400/recipes-kernel/linux/linux-obmc_%.bbappend
index 6d7ae271e..6034b891b 100644
--- a/meta-openbmc-bsp/meta-aspeed/meta-ast2400/recipes-kernel/linux/linux-obmc_%.bbappend
+++ b/meta-openbmc-bsp/meta-aspeed/meta-ast2400/recipes-kernel/linux/linux-obmc_%.bbappend
@@ -1,2 +1,3 @@
FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:"
SRC_URI += "file://defconfig"
+SRC_URI += "file://0001-work-around-aspeed-bmc-opp-palmetto-Add-GPIO-hogs-to.patch"
OpenPOWER on IntegriCloud