Re: [PATCH v2] ACPI: PCI: Avoid misleading _OSC messages for non-PCIe host bridges without _OSC

"Rafael J. Wysocki (Intel)" <[email protected]> Fri, 7 Aug 2026 17:12:40 +0200
Newsgroups gmane.linux.kernel,gmane.linux.acpi.devel,gmane.linux.kernel.pci
Message-ID <CAJZ5v0g0MeLGgzHGihBXH3YBnDt4KGdq2uR8-F3H9b4Fszpx2Q@mail.gmail.com>
On Thu, Aug 6, 2026 at 1:21 PM KONDO KAZUMA(近藤 和真) <[email protected]> wrote:
>
> After commit 7d703df7f4f5 ("ACPI: bus: Split _OSC evaluation out of
> acpi_run_osc()"), the _OSC evaluation path now returns AE_ERROR to
> negotiate_os_control() instead of propagating AE_NOT_FOUND from
> acpi_evaluate_object().
>
> This has not caused any functional issues so far, but it produces
> additional misleading messages for non-PCIe host bridges without _OSC on
> some Intel servers:
>
>     kernel: ACPI: Enabled 2 GPEs in block 00 to 7F
>     kernel: ACPI: PCI Root Bridge [UNC0] (domain 0000 [bus fe])
>     kernel: acpi PNP0A03:00: _OSC: OS supports [ExtendedConfig ASPM ClockPM Segments MSI EDR HPX-Type3]
>   + kernel: acpi PNP0A03:00: _OSC: OS requested [PCIeHotplug SHPCHotplug PME AER PCIeCapability LTR DPC]
>   + kernel: acpi PNP0A03:00: _OSC: platform willing to grant [PCIeHotplug SHPCHotplug PME AER PCIeCapability LTR DPC]
>   + kernel: acpi PNP0A03:00: _OSC: platform retains control of PCIe features (AE_ERROR)
>     kernel: PCI host bridge to bus 0000:fe
>
> Previously, negotiate_os_control() silently ignored AE_NOT_FOUND for
> non-PCIe host bridges without _OSC, but after the above change, it no
> longer does so.
>
> As a result, negotiate_os_control() logs messages as if the OS had
> negotiated with the platform via _OSC, even though the non-PCIe host
> bridge has no _OSC method and no such negotiation actually occurs.
>
> Skip _OSC negotiation for non-PCIe host bridges that do not define an
> _OSC method before attempting to evaluate it.
>
> Fixes: 7d703df7f4f5 ("ACPI: bus: Split _OSC evaluation out of acpi_run_osc()")
> Link: https://lore.kernel.org/linux-acpi/[email protected]/
> Suggested-by: Rafael J. Wysocki <[email protected]>
> Signed-off-by: Kazuma Kondo <[email protected]>
> ---
> Changes in v2:
> - Set *no_aspm to 1 when skipping _OSC negotiation.
> - Updated the debug message and the comment.
> - Link to v1: https://lore.kernel.org/linux-acpi/[email protected]/
>
>  drivers/acpi/pci_root.c | 15 +++++++++++----
>  1 file changed, 11 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/acpi/pci_root.c b/drivers/acpi/pci_root.c
> index 4c06c3ffd0cb..cab29a75a276 100644
> --- a/drivers/acpi/pci_root.c
> +++ b/drivers/acpi/pci_root.c
> @@ -574,6 +574,17 @@ static void negotiate_os_control(struct acpi_pci_root *root, int *no_aspm)
>                 return;
>         }
>
> +       if (!is_pcie(root) && !is_cxl(root) &&
> +           !acpi_has_method(handle, "_OSC")) {
> +               dev_dbg(&device->dev, "_OSC: Skipping a non-PCIe host bridge without _OSC\n");
> +
> +               /*
> +                * No ASPM for non-PCIe host bridges
> +                */
> +               *no_aspm = 1;
> +               return;
> +       }
> +
>         support = calculate_support();
>
>         decode_osc_support(root, "OS supports", support);
> @@ -615,10 +626,6 @@ static void negotiate_os_control(struct acpi_pci_root *root, int *no_aspm)
>                  */
>                 *no_aspm = 1;
>
> -               /* _OSC is optional for PCI host bridges */
> -               if (status == AE_NOT_FOUND && !is_pcie(root))
> -                       return;
> -
>                 if (control) {
>                         decode_osc_control(root, "OS requested", requested);
>                         decode_osc_control(root, "platform willing to grant", control);
> --

Applied as 7.3 material with some minor modifications, thanks!