1de77feb6SAndrew Geissler# OpenBMC Server Power Recovery 2de77feb6SAndrew Geissler 3de77feb6SAndrew GeisslerAuthor: Andrew Geissler (geissonator) 4de77feb6SAndrew Geissler 5de77feb6SAndrew GeisslerOther contributors: 6de77feb6SAndrew Geissler 7de77feb6SAndrew GeisslerCreated: October 11th, 2021 8de77feb6SAndrew Geissler 9de77feb6SAndrew Geissler## Problem Description 10de77feb6SAndrew Geissler 11f4febd00SPatrick WilliamsModern computer systems have a feature, automated power-on recovery, which in 12f4febd00SPatrick Williamsessence is the ability to tell your system what to do when it hits issues with 13f4febd00SPatrick Williamspower to the system. If the system had a black out (i.e. power was completely 14f4febd00SPatrick Williamscut to the system), should it automatically power the system on? Should it leave 15f4febd00SPatrick Williamsit off? Or maybe the user would like the system to go to whichever state it was 16f4febd00SPatrick Williamsat before the power loss. 17f4febd00SPatrick Williams 18f4febd00SPatrick WilliamsThere are also instances where the user may not want automatic power recovery to 19f4febd00SPatrick Williamsoccur. For example, some systems have op-panels, and on these op-panels there 20f4febd00SPatrick Williamscan be a pin hole reset. This is a manual mechanism for the user to force a hard 21f4febd00SPatrick Williamsreset to the BMC in situations where it is hung or not responding. In these 22f4febd00SPatrick Williamssituations, the user may wish for the system to not automatically power on the 23f4febd00SPatrick Williamssystem, because they want to debug the reason for the BMC error. 24f3d60e3dSAndrew Geissler 25cdf04a3eSNodeMan97During blackout scenarios, system owners may have a set of services they need 26cdf04a3eSNodeMan97run once the power is restored. For example, IBM requires all LED's be toggled 27f4febd00SPatrick Williamsto off in a blackout. OpenBMC needs to provide a mechanism for system owners to 28f4febd00SPatrick Williamsrun services in this scenario. 29cdf04a3eSNodeMan97 30e67c779eSAndrew GeisslerA brownout is another scenario that commonly utilizes automated power-on 31e67c779eSAndrew Geisslerrecovery features. A brownout is a scenario where BMC firmware detects (or is 32f4febd00SPatrick Williamstold) that chassis power can no longer be supported, but power to the BMC will 33f4febd00SPatrick Williamsbe retained. On some systems, it's desired to utilize the automated power-on 34f4febd00SPatrick Williamsfeature to turn chassis power back on as soon as the brownout condition ends. 35e67c779eSAndrew Geissler 368ec6cb41SAndrew GeisslerSome system owners may chose to attach an Uninterrupted Power Supply (UPS) to 37f4febd00SPatrick Williamstheir system. A UPS continues to provide power to a system through a blackout or 38f4febd00SPatrick Williamsbrownout scenario. A UPS has a limited amount of power so it's main purpose is 39f4febd00SPatrick Williamsto handle brief power interruptions or to allow for an orderly shutdown of the 40f4febd00SPatrick Williamshost firmware. 418ec6cb41SAndrew Geissler 42f4febd00SPatrick WilliamsThe goal of this design document is to describe how OpenBMC firmware will deal 43f4febd00SPatrick Williamswith these questions. 44de77feb6SAndrew Geissler 45de77feb6SAndrew Geissler## Background and References 46f4febd00SPatrick Williams 47f4febd00SPatrick WilliamsThe BMC already implements a limited subset of function in this area. The 48f4febd00SPatrick Williams[PowerRestorePolicy][pdi-restore] property out in phosphor-dbus-interface 49de77feb6SAndrew Geisslerdefines the function capability. 50de77feb6SAndrew Geissler 51de77feb6SAndrew GeisslerIn smaller servers, this feature is commonly found within the Advanced 52de77feb6SAndrew GeisslerConfiguration and Power Interface (ACPI). 53de77feb6SAndrew Geissler 54f4febd00SPatrick Williams[openbmc/phosphor-state-manager][state-mgr] supports this property as defined in 55f4febd00SPatrick Williamsthe phosphor-dbus-interface. 56de77feb6SAndrew Geissler 57de77feb6SAndrew Geissler## Requirements 58f3d60e3dSAndrew Geissler 59f3d60e3dSAndrew Geissler### Automated Power-On Recovery 60f4febd00SPatrick Williams 61f4febd00SPatrick WilliamsOpenBMC software must ensure it persists the state of power to the chassis so it 62f4febd00SPatrick Williamscan know what to restore it to if necessary 63de77feb6SAndrew Geissler 64de77feb6SAndrew GeisslerOpenBMC software must provide support for the following options: 65f4febd00SPatrick Williams 66f4febd00SPatrick Williams- Do nothing when power is lost to the system (this will be the default) 67de77feb6SAndrew Geissler- Always power the system on and boot the host 68f4febd00SPatrick Williams- Always power the system off (previous power was on, power is now off, run all 69f4febd00SPatrick Williams chassis power off services to ensure a clean state of software and hardware) 70de77feb6SAndrew Geissler- Restore the previous state of the chassis power and host 71de77feb6SAndrew Geissler 72f4febd00SPatrick WilliamsThese options are only checked and enforced in situations where the BMC does not 73f4febd00SPatrick Williamsdetect that chassis power is already on to the system when it comes out of 74f4febd00SPatrick Williamsreboot. 75de77feb6SAndrew Geissler 76de77feb6SAndrew GeisslerOpenBMC software must also support the concept of a one_time power restore 77f4febd00SPatrick Williamspolicy. This is a separate instance of the `PowerRestorePolicy` which will be 78f4febd00SPatrick Williamshosted under a D-Bus object path which ends with "one_time". If this one_time 79f4febd00SPatrick Williamssetting is not the default, `None`, then software will execute the policy 80f4febd00SPatrick Williamsdefined under it, and then reset the one_time property to `None`. This one_time 81f4febd00SPatrick Williamsfeature is a way for software to utilize automated power-on recovery function 82f4febd00SPatrick Williamsfor other areas like firmware update scenarios where a certain power on behavior 83f4febd00SPatrick Williamsis desired once an update has completed. 84de77feb6SAndrew Geissler 85f3d60e3dSAndrew Geissler### BMC and System Recovery Paths 86f4febd00SPatrick Williams 87f4febd00SPatrick WilliamsIn situations where the BMC or the system have gotten into a bad state, and the 88f4febd00SPatrick Williamsuser has initiated some form of manual reset which is detectable by the BMC as 89f4febd00SPatrick Williamsbeing user initiated, the BMC software must: 90f4febd00SPatrick Williams 91f3d60e3dSAndrew Geissler- Fill in appropriate `RebootCause` within the [BMC state interface][bmc-state] 92f3d60e3dSAndrew Geissler - At a minimum, `PinholeReset` will be added. Others can be added as needed 93f3d60e3dSAndrew Geissler- Log an error indicating a user initiated forced reset has occurred 94f3d60e3dSAndrew Geissler- Not log an error indicating a blackout has occurred if chassis power was on 95f3d60e3dSAndrew Geissler prior to the pin hole reset 96f3d60e3dSAndrew Geissler- Not implement any power recovery policy on the system 97f3d60e3dSAndrew Geissler- Turn power recovery back on once BMC has a normal reboot 98f3d60e3dSAndrew Geissler 99cdf04a3eSNodeMan97### Blackout 100f4febd00SPatrick Williams 101cdf04a3eSNodeMan97A blackout occurs when AC power is cut from the system, resulting in a total 102cdf04a3eSNodeMan97loss of power if there is no UPS installed to keep the system on. To identify 103cdf04a3eSNodeMan97this scenario after a BMC reboot, chassis-state-manager will check to see what 104f4febd00SPatrick Williamsthe last power state was before the loss of power and compares it against the 105f4febd00SPatrick Williamspgood pin. Blackouts can be intentionally triggered by a user (i.e a pinhole 106f4febd00SPatrick Williamsreset) or in severe cases occur when there is some sort of an external outage. 107f4febd00SPatrick WilliamsIn either case the BMC must take into account this detrimental state. When this 108f4febd00SPatrick Williamscondition occurs, the BMC may(depending on configuration): 109f4febd00SPatrick Williams 110f4febd00SPatrick Williams- Provide a generic target, `obmc-chassis-blackout@.target` to be called when a 111f4febd00SPatrick Williams blackout is detected 112cdf04a3eSNodeMan97- Adhere to the current power restore policy 113cdf04a3eSNodeMan97 114cdf04a3eSNodeMan97BMC firmware must also be able to: 115f4febd00SPatrick Williams 116f4febd00SPatrick Williams- Discover why the system is in a blackout situation. From either loss of power 117f4febd00SPatrick Williams or user actions. 118cdf04a3eSNodeMan97 119e67c779eSAndrew Geissler### Brownout 120f4febd00SPatrick Williams 121e67c779eSAndrew GeisslerAs noted above, a brownout condition is when AC power can not continue to be 122e67c779eSAndrew Geisslersupplied to the chassis, but the BMC can continue to have power and run. 123e67c779eSAndrew Geissler 124e67c779eSAndrew GeisslerWhen this condition occurs, the BMC must: 125f4febd00SPatrick Williams 126f4febd00SPatrick Williams- Power system off as quickly as situations requires (or gracefully handle the 127f4febd00SPatrick Williams loss of power if it occurred without warning) 128e67c779eSAndrew Geissler- Log an error indicating the brownout event has occurred 129e67c779eSAndrew Geissler- Support the ability for host firmware to indicate a one-time power restore 130e67c779eSAndrew Geissler policy if they wish for when the brownout completes 131e67c779eSAndrew Geissler- Identify when a brownout condition has completed 132e67c779eSAndrew Geissler- Wait for the brownout to complete and implement the one-time power restore 133e67c779eSAndrew Geissler policy. If no one-time policy is defined then run the standard power restore 134e67c779eSAndrew Geissler policy defined for the system 135e67c779eSAndrew Geissler 136e67c779eSAndrew GeisslerBMC firmware must also be able to: 137f4febd00SPatrick Williams 138e67c779eSAndrew Geissler- Discover if system is in a brownout situation 139e67c779eSAndrew Geissler - Run when the BMC first comes up to know if it should implement any automated 140e67c779eSAndrew Geissler power-on recovery 141e67c779eSAndrew Geissler- Not run any power-on recovery logic when a brownout is occurring 142f4febd00SPatrick Williams- Tell the host firmware that it is a automated power-on recovery initiated boot 143f4febd00SPatrick Williams when that firmware is what boots the system 144e67c779eSAndrew Geissler 1458ec6cb41SAndrew Geissler### Uninterruptible Power Supply (UPS) 146f4febd00SPatrick Williams 1478ec6cb41SAndrew GeisslerWhen a UPS is present and a blackout or brownout condition occurs, the BMC must: 148f4febd00SPatrick Williams 1498ec6cb41SAndrew Geissler- Log an error to indicate the condition has occurred 1508ec6cb41SAndrew Geissler- If host firmware is running, notify the host firmware of this utility failure 1518ec6cb41SAndrew Geissler condition (this behavior is build-time configurable) 1528ec6cb41SAndrew Geissler- If the UPS battery power becomes low and if host firmware is running, notify 1538ec6cb41SAndrew Geissler the host firmware of the condition, indicating a quick power off is required 1548ec6cb41SAndrew Geissler (this behavior is build-time configurable) 1558ec6cb41SAndrew Geissler- Log an error if the UPS battery power becomes low and a power loss to the 1568ec6cb41SAndrew Geissler entire system is imminent(i.e. a blackout scenario where BMC will also lose 1578ec6cb41SAndrew Geissler power and UPS is about to run out of power) 1588ec6cb41SAndrew Geissler- Not execute any automated power-on recovery logic to prevent power on/off 1598ec6cb41SAndrew Geissler thrasing (this behavior is build-time configurable) 1608ec6cb41SAndrew Geissler 161de77feb6SAndrew Geissler## Proposed Design 162f3d60e3dSAndrew Geissler 163f3d60e3dSAndrew Geissler### Automated Power-On Recovery 164f4febd00SPatrick Williams 165de77feb6SAndrew GeisslerAn application will be run after the chassis and host states have been 166de77feb6SAndrew Geisslerdetermined which will only run if the chassis power is not on. 167de77feb6SAndrew Geissler 168f4febd00SPatrick WilliamsThis application will look for the one_time setting and use it if its value is 169f4febd00SPatrick Williamsnot `None`. If it does use the one_time setting then it will reset it to `None` 170f4febd00SPatrick Williamsonce it has read it. Otherwise the application will read the persistent value of 171f4febd00SPatrick Williamsthe `PowerRestorePolicy`. The application will then run the logic as defined in 172f4febd00SPatrick Williamsthe Requirements above. 173de77feb6SAndrew Geissler 174de77feb6SAndrew GeisslerThis function will be hosted in phosphor-state-manger and potentially 175de77feb6SAndrew Geisslerx86-power-control. 176de77feb6SAndrew Geissler 177f3d60e3dSAndrew Geissler### BMC and System Recovery Paths 178f3d60e3dSAndrew Geissler 179f4febd00SPatrick WilliamsThe BMC state manager application currently looks at a file in the sysfs to try 180f4febd00SPatrick Williamsand determine the cause of a BMC reboot. It then puts this reason in the 181f4febd00SPatrick Williams`RebootCause` property. 182f4febd00SPatrick Williams 183f4febd00SPatrick WilliamsOne possible cause of a BMC reset is an external reset (EXTRST). There are a 184f4febd00SPatrick Williamsvariety of reasons an external reset can occur. Some systems are adding GPIOs to 185f4febd00SPatrick Williamsprovide additional detail on these types of resets. 186f3d60e3dSAndrew Geissler 187f3d60e3dSAndrew GeisslerA new GPIO name will be added to the [device-tree-gpio-naming.md][dev-tree] 188f3d60e3dSAndrew Geisslerwhich reports whether a pin hole reset has occurred on the previous reboot of 189f3d60e3dSAndrew Geisslerthe BMC. The BMC state manager application will enhance its support of the 190f3d60e3dSAndrew Geissler`RebootCause` to look for this GPIO and if present, read it and set 191f4febd00SPatrick Williams`RebootCause` accordingly when it can either not determine the reason for the 192f4febd00SPatrick Williamsreboot via the sysfs or sysfs reports a EXTRST reason (in which case the GPIO 193f4febd00SPatrick Williamswill be utilized to enhance the reboot reason). 194f3d60e3dSAndrew Geissler 195f3d60e3dSAndrew GeisslerIf the power recovery software sees the `PinholeReset` reason within the 196f4febd00SPatrick Williams`RebootCause` then it will not implement any of its policy. Future BMC reboots 197f4febd00SPatrick Williamswhich are not pin hole reset caused, will cause `RebootCause` to go back to a 198f4febd00SPatrick Williamsdefault and therefore power recovery policy will be re-enabled on that BMC boot. 199f3d60e3dSAndrew Geissler 200f4febd00SPatrick WilliamsThe phosphor-state-manager chassis software will not log a blackout error if it 201f4febd00SPatrick Williamssees the `PinholeReset` reason (or any other reason that indicates a user 202f3d60e3dSAndrew Geisslerinitiated a reset of the system). 203f3d60e3dSAndrew Geissler 204cdf04a3eSNodeMan97### Blackout 205f4febd00SPatrick Williams 206f4febd00SPatrick WilliamsA new systemd target `obmc-chassis-blackout.target` should be added to allow 207f4febd00SPatrick Williamssystem maintainers to call services in this condition. This new target will be 208f4febd00SPatrick Williamscalled when the BMC detects a blackout. The target will allow for system owners 209f4febd00SPatrick Williamsto add their own specific services to this new target. 210cdf04a3eSNodeMan97Phosphor-chassis-state-manager will ensure `obmc-chassis-blackout.target` will 211cdf04a3eSNodeMan97be called after a blackout. 212cdf04a3eSNodeMan97 213e67c779eSAndrew Geissler### Brownout 214f4febd00SPatrick Williams 215e67c779eSAndrew GeisslerThe existing `xyz.openbmc_project.State.Chassis` interface will be enhanced to 216e67c779eSAndrew Geisslersupport a `CurrentPowerStatus` property. The existing 217e67c779eSAndrew Geisslerphosphor-chassis-state-manager, which is instantiated per instance of chassis in 218e67c779eSAndrew Geisslerthe system, will support a read of this property. The following will be the 219e67c779eSAndrew Geisslerpossible returned values for the power status of the target chassis: 220f4febd00SPatrick Williams 221e67c779eSAndrew Geissler- `Undefined` 222e67c779eSAndrew Geissler- `BrownOut` 2238ec6cb41SAndrew Geissler- `UninterruptiblePowerSupply` 224e67c779eSAndrew Geissler- `Good` 225e67c779eSAndrew Geissler 226e67c779eSAndrew GeisslerThe phosphor-psu-monitor application within the phosphor-power repository will 227e67c779eSAndrew Geisslerbe responsible for monitoring for brownout conditions. It will support a 228f4febd00SPatrick Williamsper-chassis interface which represents the status of the power going into the 229f4febd00SPatrick Williamstarget chassis. This interface will be generic in that other applications could 230f4febd00SPatrick Williamshost it to report the status of the power. The state-manager software will 231f4febd00SPatrick Williamsutilize mapper to look for all implementations of the interface for its chassis 232f4febd00SPatrick Williamsand aggregate the status (i.e. if any reports a brownout, then `BrownOut` will 233f4febd00SPatrick Williamsbe returned). This interface will be defined in a later update to this document. 234e67c779eSAndrew Geissler 235e67c779eSAndrew GeisslerThe application(s) responsible for detecting and reporting chassis power will 236e67c779eSAndrew Geisslerrun on startup and discover the correct state for their property. These 237e67c779eSAndrew Geisslerapplications will log an error when a brownout occurs and initiate the fast 238e67c779eSAndrew Geisslerpower off. 239e67c779eSAndrew Geissler 240e67c779eSAndrew GeisslerIf the system design needs it, the existing one-time function provided by 241f4febd00SPatrick Williamsphosphor-state-manager for auto power on policy will be utilized for when the 242f4febd00SPatrick Williamsbrownout completes. 243e67c779eSAndrew Geissler 244e67c779eSAndrew GeisslerWhen the phosphor-power application detects that a brownout condition has 245e67c779eSAndrew Geisslercompleted it will reset its interface representing power status to good and 246e67c779eSAndrew Geisslerstart the state-manager service which executes the automated power-on logic. 247e67c779eSAndrew Geissler 248e67c779eSAndrew Geisslerphosphor-state-manager will ensure automated power-on recovery logic is only run 249e67c779eSAndrew Geisslerwhen the power supply interface reports the power status is good. If there are 250e67c779eSAndrew Geisslermultiple chassis and/or host instances in the system then the host instances 251e67c779eSAndrew Geisslerassociated with the chassis(s) with a bad power status will be the only ones 252e67c779eSAndrew Geisslerprevented from booting. 253e67c779eSAndrew Geissler 2548ec6cb41SAndrew Geissler### Uninterruptible Power Supply (UPS) 255f4febd00SPatrick Williams 2568ec6cb41SAndrew GeisslerA new phosphor-dbus-interface will be defined to represent a UPS. A BMC 257f4febd00SPatrick Williamsapplication will implement one of these per UPS attached to the system. This 258f4febd00SPatrick Williamsapplication will monitor UPS status and monitor for the following: 259f4febd00SPatrick Williams 2608ec6cb41SAndrew Geissler- UPS utility fail (system power has failed and UPS is providing system power) 2618ec6cb41SAndrew Geissler- UPS battery low (UPS is about to run out of power) 2628ec6cb41SAndrew Geissler 263f4febd00SPatrick WilliamsIf the application sees power has been lost and the system is running on UPS 264f4febd00SPatrick Williamsbattery power then it will monitor for the power remaining in the UPS and notify 265f4febd00SPatrick Williamsthe host that a shutdown is required if needed. This application will also be 266f4febd00SPatrick Williamsresponsible for logging an error indicating the UPS backup power has been 267f4febd00SPatrick Williamsswitched to and set the appropriate property in their interface to indicate the 268f4febd00SPatrick Williamsscenario is present when the system can no longer remain on. 2698ec6cb41SAndrew Geisslerphosphor-state-manager will query mapper for implementation of this new UPS 270f4febd00SPatrick Williamsinterface and utilize them in combination with power supply brownout status when 271f4febd00SPatrick Williamsdetermining the value to return for its `CurrentPowerStatus`. 2728ec6cb41SAndrew Geissler 2738ec6cb41SAndrew GeisslerSimilar to the above brownout scenario, phosphor-state-manager will ensure 2748ec6cb41SAndrew Geisslerautomated power-on recovery logic is not run if `PowerStatus` is not set to 2758ec6cb41SAndrew Geissler`Good`. This behavior will be build-time configurable within 2768ec6cb41SAndrew Geisslerphosphor-state-manager. 2778ec6cb41SAndrew Geissler 278de77feb6SAndrew Geissler## Alternatives Considered 279f4febd00SPatrick Williams 280de77feb6SAndrew GeisslerNone, this is a pretty basic feature that does not have a lot of alternatives 281de77feb6SAndrew Geissler(other then just not doing it). 282de77feb6SAndrew Geissler 283de77feb6SAndrew Geissler## Impacts 284f4febd00SPatrick Williams 285de77feb6SAndrew GeisslerNone 286de77feb6SAndrew Geissler 287de77feb6SAndrew Geissler## Testing 288f4febd00SPatrick Williams 289de77feb6SAndrew GeisslerThe control of this policy can already bet set via the Redfish API. 290f4febd00SPatrick Williams 291de77feb6SAndrew Geissler``` 292de77feb6SAndrew Geissler# Power Restore Policy 293*649268a5SGunnar Millscurl -k -H "Content-Type: application/json" -X PATCH -d '{"PowerRestorePolicy":"AlwaysOn"}' https://${bmc}/redfish/v1/Systems/system 294*649268a5SGunnar Millscurl -k -H "Content-Type: application/json" -X PATCH -d '{"PowerRestorePolicy":"AlwaysOff"}' https://${bmc}/redfish/v1/Systems/system 295*649268a5SGunnar Millscurl -k -H "Content-Type: application/json" -X PATCH -d '{"PowerRestorePolicy":"LastState"}' https://${bmc}/redfish/v1/Systems/system 296de77feb6SAndrew Geissler``` 297f4febd00SPatrick Williams 298de77feb6SAndrew GeisslerFor testing, each policy should be set and verified. The one_time aspect should 299de77feb6SAndrew Geissleralso be checked for each possible value and verified to only be used once. 300de77feb6SAndrew Geissler 301f4febd00SPatrick WilliamsValidate that when multiple black outs occur, the firmware continues to try and 302f4febd00SPatrick Williamspower on the system when policy is `AlwaysOn` or `Restore`. 303de77feb6SAndrew Geissler 304f4febd00SPatrick WilliamsOn supported systems, a pin hole reset should be done with a system that has a 305f4febd00SPatrick Williamspolicy set to always power on. Tester should verify system does not 306f3d60e3dSAndrew Geisslerautomatically power on after a pin hole reset. Verify it does automatically 307f3d60e3dSAndrew Geisslerpower on when a normal reboot of the BMC is done. 308f3d60e3dSAndrew Geissler 309e67c779eSAndrew GeisslerA brownout condition should be injected into a system and appropriate paths 310e67c779eSAndrew Geisslershould be verified: 311f4febd00SPatrick Williams 312e67c779eSAndrew Geissler- Error log generated 313e67c779eSAndrew Geissler- Host notified (if running and notification possible) 314e67c779eSAndrew Geissler- System quickly powered off 315e67c779eSAndrew Geissler- Power recovery function is not run while a brownout is present 316e67c779eSAndrew Geissler- System automatically powers back on when brownout condition ends (assuming a 317e67c779eSAndrew Geissler one-time or system auto power-on recovery policy of `AlwaysOn` or `Restore`) 318e67c779eSAndrew Geissler 3198ec6cb41SAndrew GeisslerPlug a UPS into a system and ensure when power is cut to the system that an 3208ec6cb41SAndrew Geisslererror is logged and the host is notified and allowed to power off. 3218ec6cb41SAndrew Geissler 322f4febd00SPatrick Williams[pdi-restore]: 323f4febd00SPatrick Williams https://github.com/openbmc/phosphor-dbus-interfaces/blob/master/yaml/xyz/openbmc_project/Control/Power/RestorePolicy.interface.yaml 324de77feb6SAndrew Geissler[state-mgr]: https://github.com/openbmc/phosphor-state-manager 325f4febd00SPatrick Williams[bmc-state]: 326f4febd00SPatrick Williams https://github.com/openbmc/phosphor-dbus-interfaces/blob/master/yaml/xyz/openbmc_project/State/BMC.interface.yaml 327f4febd00SPatrick Williams[dev-tree]: 328f4febd00SPatrick Williams https://github.com/openbmc/docs/blob/master/designs/device-tree-gpio-naming.md 329