Hi, On 12/2/20 8:57 PM, Rafael J. Wysocki wrote: > On Wed, Dec 2, 2020 at 8:39 PM Hans de Goede <hdegoede@xxxxxxxxxx> wrote: >> >> Hi, >> >> On 12/2/20 2:49 PM, Rafael J. Wysocki wrote: >>> On Sat, Nov 21, 2020 at 9:30 PM Hans de Goede <hdegoede@xxxxxxxxxx> wrote: >>>> >>>> Hi Rafael, >>>> >>>> A while ago (almost 2 years ago) I discussed an issue with you about >>>> some devices, where some of the methods used during device-addition >>>> (such as _HID) may rely on OpRegions of other devices: >>>> >>>> https://www.spinics.net/lists/linux-acpi/msg86303.html >>>> >>>> An example of this is the Acer Switch 10E SW3-016 model. The _HID method >>>> of the ACPI node for the UART attached Bluetooth, reads GPIOs to detect >>>> the installed wifi chip and update the _HID for the Bluetooth's ACPI node >>>> accordingly. The current ACPI scan code calls _HID before the GPIO >>>> controller's OpRegions are available, leading to the wrong _HID being >>>> used and Bluetooth not working. >>>> >>>> Last week I bought a second hand Acer device, not knowing it was this >>>> exact model. Since I now have access to affected hardware I decided to >>>> take a shot at fixing this. >>>> >>>> In the discussion you suggested to split the acpi_bus_scan of the root >>>> into 2 steps, first scan devices with an empty _DEP, putting other >>>> acpi_handle-s on a list of deferred devices and then in step 2 scan the >>>> rest. >>>> >>>> I'm happy to report that, at least on the affected device, this works >>>> nicely. While working on this I came up with a less drastic way to >>>> deal with this. As you will see in patch 4 of this series, I decided >>>> to first add a more KISS method of deciding which devices to defer >>>> to the second scan step by matching by HID. This has the disadvantage >>>> of not being a generic solution. But it has the advantage of being a >>>> solution which does not potentially regress other devices. >>>> >>>> Then in patch 5 I actually do add the option to defer or not based on >>>> _DEP being empty. I've put this behind a kernel commandline option as >>>> I'm not sure we should do this everywhere by default. At least no without >>>> a lot more testing. >>>> >>>> Patch 6 fixes an issue with patch 5 which causes battery devices to stop >>>> working. >>>> >>>> And patch 7 adds some extra HIDs to the list of HIDs which should be >>>> ignored when checking if the _DEP list is empty from Linux' pov, iow >>>> some extra HIDs which Linux does not bind to. >>>> >>>> Please let me know what you think about this patch-set. I would be happy >>>> to see just patches 1-4 merged. >>> >>> I took patches 1 and 2, because IMO they are generally useful (I >>> rewrote the changelogs to avoid mentioning the rest of the series >>> though), >> >> That is fine. Thanks for taking those. >> >>> but I have some reservations regarding the rest. >>> >>> First off, I'm not really sure if failing acpi_add_single_object() for >>> devices with missing dependencies is a good idea. IIRC there is >>> nothing in there that should depend on any opregions supplied by the >>> other devices, so it should be safe to allow it to complete. >> >> Actually acpi_add_single_object() does depend on ACPI methods >> which may depend on opregions, that is the whole reason why >> this series is necessary. Otherwise we could just delay the >> binding of the driver based in dep_unmet which would be easier. >> >> Here are 2 actual examples of acpi_add_single_object() calling >> ACPI methods which may depend on opregions: >> >> 1. acpi_add_single_object() calls acpi_init_device_object() which >> calls acpi_set_pnp_ids() which fills a bunch if fields of >> struct acpi_device with info returned by the acpi_get_object_info() >> call. >> >> Specifically it stores the value returned by the _HID method in >> the acpi_device_pnp array for the device and that _HID method is >> actually the problem in the example device which started this >> series. The _HID method of the bluetooth device reads 2 GPIOs >> to get a hw-id (0-3) and then translates the hwid to a _HID >> string. If the GPIO opregion's handlers have not registered yet >> then the reading of the GPIOs is correctly skipped, and hwid >> 0 is assumed, which is wrong in this case. >> >> 2. I've also seen examples where _STA depends on GPIOs in a similar >> manner; and acpi_add_single_object() calls acpi_bus_get_power_flags() >> which calls acpi_bus_init_power() which calls acpi_device_is_present() >> which depends on _STA results. > > Well, this means that there is a bug in acpi_bus_attach() which > shouldn't call acpi_bus_init_power() which has been called already. I'm afraid we have a bit of a misunderstanding here, the problem is not that acpi_bus_attach() calls acpi_bus_init_power(), the problem is that acpi_bus_init_power() (which is called from acpi_add_single_object()) depends on the value returned by _STA and that in turn may depend on some OpRegions being available. IOW it is the same problem as the _HID problem. > And it all means that either deferring acpi_add_single_object() is > needed and so there need to be 2 passes in acpi_bus_attach() overall, > or acpi_add_single_object() needs to avoid calling methods that may > depend on supplied opregions. I guess the latter is rather > unrealistic, so the only practical choice is the former. I agree. > However, I still don't think that the extra list of "dependent > devices" is needed. I'm not sure what you are trying to say here? Do you mean this list: +/* + * List of HIDs for which we defer adding them to the second step of the + * scanning of the root, because some of their methods used during addition + * depend on OpRegions registered by the drivers for other ACPI devices. + */ +static const char * const acpi_defer_add_hids[] = { + "BCM2E5B", /* Acer SW3-016 bluetooth HID when GPIO OpRegs or not available yet */ + NULL +}; + ? That indeed is not necessary if you take the entire set and always enable the new behavior instead of using the module option. I guess we could go that route for 5.12, and get it into next as soon as 5.11-rc1 is available for maximum testing. Do you want me to do a new version of the series which drops the acpi_defer_add_hids[] thing and the module option and simply always uses the new behavior? Regards, Hans