On Sunday, January 01, 2017 09:30:06 PM Hans de Goede wrote: > Hi, > > On 30-12-16 02:27, Rafael J. Wysocki wrote: > > From: Rafael J. Wysocki <rafael.j.wysocki@xxxxxxxxx> > > > > The way acpi_find_child_device() works currently is that, if there > > are two (or more) devices with the same _ADR value in the same > > namespace scope (which is not specifically allowed by the spec and > > the OS behavior in that case is not defined), the first one of them > > found to be present (with the help of _STA) will be returned. > > > > This covers the majority of cases, but is not sufficient if some of > > the devices in question have a _HID (or _CID) returning some valid > > ACPI/PNP device IDs (which is disallowed by the spec) and the > > ASL writers' expectation appears to be that the OS will match > > devices without a valid ACPI/PNP device ID against a given bus > > address first. > > > > To cover this special case as well, modify find_child_checks() > > to prefer devices without ACPI/PNP device IDs over devices that > > have them. > > > > Suggested-by: Mika Westerberg <mika.westerberg@xxxxxxxxxxxxxxx> > > Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@xxxxxxxxx> > > --- > > > > I'm not actually sure if this is sufficient to fix the original 80860F14 uid "2" > > sd-controller problem on CherryTrail. Hans, can you please check? > > Ok, just booted a kernel with this patch replacing my own attempt > at fixing this, and the kernel still sees and initializes the > mmc controller in question correctly with this patch: > > Tested-by: Hans de Goede <hdegoede@xxxxxxxxxx> Unfortunately, this breaks discrete graphics enumeration in https://bugzilla.kernel.org/show_bug.cgi?id=194889 so can you please check if the patch below doesn't break the platform fixed by the above? Thanks, Rafael --- drivers/acpi/glue.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) Index: linux-pm/drivers/acpi/glue.c =================================================================== --- linux-pm.orig/drivers/acpi/glue.c +++ linux-pm/drivers/acpi/glue.c @@ -99,13 +99,13 @@ static int find_child_checks(struct acpi return -ENODEV; /* - * If the device has a _HID (or _CID) returning a valid ACPI/PNP - * device ID, it is better to make it look less attractive here, so that - * the other device with the same _ADR value (that may not have a valid - * device ID) can be matched going forward. [This means a second spec - * violation in a row, so whatever we do here is best effort anyway.] + * If the device has a _HID returning a valid ACPI/PNP device ID, it is + * better to make it look less attractive here, so that the other device + * with the same _ADR value (that may not have a valid device ID) can be + * matched going forward. [This means a second spec violation in a row, + * so whatever we do here is best effort anyway.] */ - return sta_present && list_empty(&adev->pnp.ids) ? + return sta_present && !adev->pnp.type.platform_id ? FIND_CHILD_MAX_SCORE : FIND_CHILD_MIN_SCORE; }