RE: [PATCH 4/6] ACPI: Execute platform _OSC also with query bit clear

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

 



> I would put that information into the changelog.

Thanks, @Mika Westerberg can you collapse that in when you re-spin the
series?

> 
> Moreover, have you looked at acpi_pci_osc_control_set()?
> 
> What it does is analogous to what you are proposing, but a bit
> different, and I would like to preserve consistency between _OSC use
> cases.
> 
> So would it be possible to adjust the _SB _OSC evaluation flow to
> follow the PCI _OSC one?  That is, if any control bits are there, pass
> them along with the last evaluation of _OSC with the query flag clear.
> Or is the latter defective and if so then why?

Basically the only difference is another line cloning OSC_CONTROL_DWORD from
capbuf_ret to capbuf?

Yes, this actually sounds like it better adheres to the spec to me.

Quoting spec:
" If the OS is granted control of a feature in the Control Field in one call to
_OSC, then it must preserve the set state of that bit (requesting that feature)
in all subsequent calls."


> 
> >
> > >
> > > > and this is going to cause problems with the USB4 CM (Connection
> > > > Manager) switch that is going to commit the switch only when the OS
> > > > requests control over the feature.
> > > >
> > > > For this reason modify the _OSC support so that we first execute it with
> > > > query bit set, then use the returned valu as base of the features we
> > >
> > > s/valu/value/
> > >
> > > > want to control and run the _OSC again with query bit clear.
> > > >
> > > > Also rename the function to better match what it does.
> > > >
> > > > Cc: Rafael J. Wysocki <rafael.j.wysocki@xxxxxxxxx>
> > > > Signed-off-by: Mario Limonciello <mario.limonciello@xxxxxxxx>
> > > > Signed-off-by: Mika Westerberg <mika.westerberg@xxxxxxxxxxxxxxx>
> > > >
> > > > ---
> > > >  drivers/acpi/bus.c | 43 +++++++++++++++++++++++++++++++------------
> > > >  1 file changed, 31 insertions(+), 12 deletions(-)
> > > >
> > > > diff --git a/drivers/acpi/bus.c b/drivers/acpi/bus.c
> > > > index 1682f8b454a2..ca7c7b2bf56e 100644
> > > > --- a/drivers/acpi/bus.c
> > > > +++ b/drivers/acpi/bus.c
> > > > @@ -282,9 +282,9 @@ bool osc_pc_lpi_support_confirmed;
> > > >  EXPORT_SYMBOL_GPL(osc_pc_lpi_support_confirmed);
> > > >
> > > >  static u8 sb_uuid_str[] = "0811B06E-4A27-44F9-8D60-3CBBC22E7B48";
> > > > -static void acpi_bus_osc_support(void)
> > > > +static void acpi_bus_osc_negotiate_platform_control(void)
> > > >  {
> > > > -       u32 capbuf[2];
> > > > +       u32 capbuf[2], *capbuf_ret;
> > > >         struct acpi_osc_context context = {
> > > >                 .uuid_str = sb_uuid_str,
> > > >                 .rev = 1,
> > > > @@ -321,17 +321,36 @@ static void acpi_bus_osc_support(void)
> > > >                 capbuf[OSC_SUPPORT_DWORD] |= OSC_SB_APEI_SUPPORT;
> > > >         if (ACPI_FAILURE(acpi_get_handle(NULL, "\\_SB", &handle)))
> > > >                 return;
> > > > -       if (ACPI_SUCCESS(acpi_run_osc(handle, &context))) {
> > > > -               u32 *capbuf_ret = context.ret.pointer;
> > > > -               if (context.ret.length > OSC_SUPPORT_DWORD) {
> > > > -                       osc_sb_apei_support_acked =
> > > > -                               capbuf_ret[OSC_SUPPORT_DWORD] &
> > > OSC_SB_APEI_SUPPORT;
> > > > -                       osc_pc_lpi_support_confirmed =
> > > > -                               capbuf_ret[OSC_SUPPORT_DWORD] &
> > > OSC_SB_PCLPI_SUPPORT;
> > > > -               }
> > > > +
> > > > +       if (ACPI_FAILURE(acpi_run_osc(handle, &context)))
> > > > +               return;
> > > > +
> > > > +       capbuf_ret = context.ret.pointer;
> > > > +       if (context.ret.length <= OSC_SUPPORT_DWORD) {
> > > >                 kfree(context.ret.pointer);
> > > > +               return;
> > > >         }
> > > > -       /* do we need to check other returned cap? Sounds no */
> > > > +
> > > > +       /*
> > > > +        * Now run _OSC again with query flag clean and with the caps
> > >
> > > s/clean/clear/
> > >
> > > > +        * both platform and OS supports.
> > >
> > > s/both platform and OS supports/supported by both the OS and the platform/
> > >
> > > > +        */
> > > > +       capbuf[OSC_QUERY_DWORD] = 0;
> > > > +       capbuf[OSC_SUPPORT_DWORD] = capbuf_ret[OSC_SUPPORT_DWORD];
> > > > +       kfree(context.ret.pointer);
> > > > +
> > > > +       if (ACPI_FAILURE(acpi_run_osc(handle, &context)))
> > > > +               return;
> > > > +
> > > > +       capbuf_ret = context.ret.pointer;
> > > > +       if (context.ret.length > OSC_SUPPORT_DWORD) {
> > > > +               osc_sb_apei_support_acked =
> > > > +                       capbuf_ret[OSC_SUPPORT_DWORD] &
> OSC_SB_APEI_SUPPORT;
> > > > +               osc_pc_lpi_support_confirmed =
> > > > +                       capbuf_ret[OSC_SUPPORT_DWORD] &
> > > OSC_SB_PCLPI_SUPPORT;
> > > > +       }
> > > > +
> > > > +       kfree(context.ret.pointer);
> > > >  }
> > > >
> > > >  /* --------------------------------------------------------------------
> ----
> > > --
> > > > @@ -1168,7 +1187,7 @@ static int __init acpi_bus_init(void)
> > > >          * _OSC method may exist in module level code,
> > > >          * so it must be run after ACPI_FULL_INITIALIZATION
> > > >          */
> > > > -       acpi_bus_osc_support();
> > > > +       acpi_bus_osc_negotiate_platform_control();
> > > >
> > > >         /*
> > > >          * _PDC control method may load dynamic SSDT tables,
> > > > --
> > > > 2.29.2
> > > >




[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux