Re: [PATCH] PCI/ACPI: Add support for `AE_SUPPORT` in _OSC queries

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Tue, Mar 8, 2022 at 11:44 PM Mario Limonciello
<mario.limonciello@xxxxxxx> wrote:
>
> commit a412caea5a2d ("ACPI: bus: Allow negotiating _OSC capabilities")
> added support for `acpi_run_osc` to return `AE_SUPPORT` when negotiating
> an _OSC.
>
> This was fixed in other kernel consumers, but `acpi_pci_run_osc` was
> missed.  Update the function to detect when called with `OSC_QUERY_ENABLE`
> set and attempt to negotiate up to 5 times.

This is not how it is designed to work, though.

acpi_pci_query_osc() is for that.

>
> Reported-by: Qian Cai <quic_qiancai@xxxxxxxxxxx>
> Fixes: a412caea5a2d ("ACPI: bus: Allow negotiating _OSC capabilities")

So I'm seriously thinking about dropping that whole lot at this point.

> Signed-off-by: Mario Limonciello <mario.limonciello@xxxxxxx>
> ---
>  drivers/acpi/pci_root.c | 21 ++++++++++++++++++++-
>  1 file changed, 20 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/acpi/pci_root.c b/drivers/acpi/pci_root.c
> index 6f9e75d14808..2eda355fde57 100644
> --- a/drivers/acpi/pci_root.c
> +++ b/drivers/acpi/pci_root.c
> @@ -171,7 +171,7 @@ static void decode_osc_control(struct acpi_pci_root *root, char *msg, u32 word)
>  static u8 pci_osc_uuid_str[] = "33DB4D5B-1FF7-401C-9657-7441C03DD766";
>
>  static acpi_status acpi_pci_run_osc(acpi_handle handle,
> -                                   const u32 *capbuf, u32 *retval)
> +                                   u32 *capbuf, u32 *retval)
>  {
>         struct acpi_osc_context context = {
>                 .uuid_str = pci_osc_uuid_str,
> @@ -180,7 +180,26 @@ static acpi_status acpi_pci_run_osc(acpi_handle handle,
>                 .cap.pointer = (void *)capbuf,
>         };
>         acpi_status status;
> +       u32 *capbuf_ret;
> +       int i;
> +
> +       if (!(capbuf[OSC_QUERY_DWORD] & OSC_QUERY_ENABLE))
> +               goto skip_negotiate;
> +       for (i = 0; i < 5; i++) {
> +               status = acpi_run_osc(handle, &context);
> +               if (status == AE_OK || status == AE_SUPPORT) {
> +                       capbuf_ret = context.ret.pointer;
> +                       capbuf[OSC_SUPPORT_DWORD] = capbuf_ret[OSC_SUPPORT_DWORD];
> +                       kfree(context.ret.pointer);
> +               }
> +               if (status != AE_SUPPORT)
> +                       break;
> +       }
> +       if (ACPI_FAILURE(status))
> +               return status;
>
> +skip_negotiate:
> +       capbuf[OSC_QUERY_DWORD] = 0;
>         status = acpi_run_osc(handle, &context);
>         if (ACPI_SUCCESS(status)) {
>                 *retval = *((u32 *)(context.ret.pointer + 8));
> --
> 2.34.1
>



[Index of Archives]     [Linux IBM ACPI]     [Linux Power Management]     [Linux Kernel]     [Linux Laptop]     [Kernel Newbies]     [Share Photos]     [Security]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Samba]     [Video 4 Linux]     [Device Mapper]     [Linux Resources]

  Powered by Linux