Evan Green has uploaded this change for review. ( https://review.coreboot.org/c/coreboot/+/63790 )
Change subject: soc/intel/common/block/acpi: Fill PEP S0 mask on failure ......................................................................
soc/intel/common/block/acpi: Fill PEP S0 mask on failure
There is a bug floating around where communciation with the PMC fails after transitions through S3/S4/S5. This CL does not address that issue. However in working with error cases presented by a failing PMC, we're forced into an early return in read_pmc_lpm_requirements(), which sets up _DSM buffers in the SSDT for the PEP device.
The function itself returns void, so the error is swallowed regardless. However returning early is not the appropriate action because it causes the size of the buffer written into the _DSM method to change. This causes the SSDT to change size and layout across an S3 or S4 transition, which results in mayhem in the kernel, as the kernel is not expecting these tables to change out from under it.
Instead of returning early, it's better to simply print the error and keep going, attaching a zeroed out buffer for the substate requirements. This results in an empty requirements mask for all states. From what I can see in the kernel this is no more broken than today's behavior, as this buffer seems to only be used for printing a debugfs file.
In fact in this particular case the kernel doesn't even notice, as this buffer is copied out at boot, and not refreshed at resume.
BUG=b:230031158 TEST=hibernate and resume on Primus4ES
Signed-off-by: Evan Green evgreen@chromium.org Change-Id: Ibe35d50b350b1b96dea313dfcbd00745970c16ab --- M src/soc/intel/common/block/acpi/pep.c 1 file changed, 0 insertions(+), 2 deletions(-)
git pull ssh://review.coreboot.org:29418/coreboot refs/changes/90/63790/1
diff --git a/src/soc/intel/common/block/acpi/pep.c b/src/soc/intel/common/block/acpi/pep.c index c7f1270..b83b714 100644 --- a/src/soc/intel/common/block/acpi/pep.c +++ b/src/soc/intel/common/block/acpi/pep.c @@ -56,8 +56,6 @@ if (result != CB_SUCCESS) { printk(BIOS_ERR, "Failed to retrieve LPM substate registers" "from LPM, substate %zu, reg %zu\n", i, j); - free(reg); - return; }
uint32_t *ptr = reg + i * lpm->num_req_regs + j;