Add SPMC (system power management controller) driver as `acpi_spmc`. This is the device which provides the LPI device D-state constraints and allows for OSPM to send S0ix/modern standby entry/exit notifications. This supports the original Intel DSM (https://uefi.org/sites/default/files/resources/Intel_ACPI_Low_Power_S0_Idle.pdf, untested), the AMD DSM (tested), and the Microsoft DSM (partially tested, getting constraints seems to only work for the AMD DSM on my machine).
For entry/exit, all the notifications supported by the platform are called. I'm not sure of which ones are necessary and on which systems exactly, but my system needs at least one of the AMD or Microsoft regular entry notifications and the Microsoft modern standby one. I don't think it's necessarily an issue to do this, and Linux adopts the same strategy.
Before entry, `acpi_spmc_check_constraints` is called to notify of any violated power constraints. This uses `acpi_pwr_get_state` added in D48386 to get current device D-states.
This is a prerequisite to s2idle on AMD, as the EC (which we can't mask out the GPE's of because it notifies us of important wake events, such as the lid opening or the power button being pressed) is very noisy until the entry notifications are called: https://patchwork.kernel.org/project/linux-pm/patch/2279758.LZ0rCGQtcH@aspire.rjw.lan/ It still is very noisy (albeit less so) but hopefully that's something a driver for the AMD PMC will solve.
This is sort of the parallel to @bwidawsk 's D17676 revision, which went with `device_post_suspend/resume` device methods to call SPMC's entry/exit functions. Since we'll probably also need an AMD-specific PMC that run after `device_post_suspend` in the near future, I decided against doing it this way and instead simply added `acpi_spmc_enter/exit` function pointers on the ACPI softc to be called in the future before idling in `acpi_EnterSleepState`, which acpi_spmc sets in probe.
Another solution (what I believe Linux does after a cursory check) is to make acpi_spmc responsible for calling the entry/exit functions for any other PMC's there may be. My concern for doing this is if a system has an AMD PMC but no SPMC, if such a system exists.
Sponsored by: The FreeBSD Foundation