[PATCH] aspeed-bmc-opp-palmetto: Add GPIO hogs to devicetree

Cédric Le Goater clg at kaod.org
Wed Nov 23 03:45:01 AEDT 2016


On 11/18/2016 09:12 AM, Andrew Jeffery wrote:
> This is a work-around 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:

The palmetto I use runs v1.99.0-275 and I could not boot the system. Unfortunately,
pdbg does not see the P8 chip so I really don't know what it is up to. Here 
are the GPIO status :

GPIO	DIR	VALUE	PIN	NAME
----------------------------------------------------
326	out	0	A6	CRONUS_SEL
432	-	-	O0	MEZZ0_PRESENT
433	-	-	O1	MEZZ1_PRESENT
324	out	0	A4	FSI_CLK
334	out	0	B6	USB_RESET
428	-	-	N4	SLOT1_PRESENT
352	in	1	E0	POWER_BUTTON
333	out	0	B5	PCIE_RESET
455	out	0	Q7	IDBTN
325	out	1	A5	FSI_DATA
343	in	1	C7	PGOOD
426	-	-	N2	SLOT2_RISER_PRESENT
425	-	-	N1	SLOT1_RISER_PRESENT
424	-	-	N0	SLOT0_RISER_PRESENT
353	out	0	E1	POWER_PIN
427	-	-	N3	SLOT0_PRESENT
445	-	-	P5	CHECKSTOP
395	out	1	J3	BMC_THROTTLE
344	out	1	D0	FSI_ENABLE
429	-	-	N5	SLOT2_PRESENT

Cheers,

C.


> * 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 at aj.id.au>
> ---
> 
> Including this in the OpenBMC repository is increasingly looks like the idea of
> a troll and not something that's practical. Lets stop wasting people's time and
> include it in our kernel tree; anyone testing custom kernels can feel free to
> comment out the hogs in the devicetree.
> 
>  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 {
> 



More information about the openbmc mailing list