Re: [PATCH] ACPI: utils: Ignore leading root scope prefix in string _UID match
"Rafael J. Wysocki (Intel)" <[email protected]>
| Newsgroups | org.kernel.vger.linux-acpi,dev.linux.lists.acpica-devel |
|---|---|
| Message-ID | <CAJZ5v0hgn+_L_yvEg0yo0vPk9_brbxsywyu_77tEyww4nV+eUg@mail.gmail.com> |
On Mon, Aug 31, 2026 at 8:02 PM Mario Limonciello <[email protected]> wrote: > > Firmware may express an ACPI namespace path used as a _UID with or > without the leading root scope character ('\'). For example, an AMD > IVRS IVHD ACPI HID device entry may carry a character UID of > "\_SB.MHSP" while the corresponding device's _UID evaluates to > "_SB.MHSP" (or vice versa). This semantic difference is due to how > Windows PnP enumerates and uses devices. Can you please elaborate a bit more? I would expect _UID to return the string without the leading backslash, so where does the other one come from, exactly? > acpi_str_uid_match() compared the two strings verbatim, so such > entries failed to match on the UID even though they refer to the same > object. In the AMD IOMMU case (get_acpihid_device_id()) this caused > the exact HID+UID match to be missed and the code to fall through to > the HID-only path, spuriously raising a FW_BUG. > > Skip a single leading '\' on either string before comparing so that > paths that differ only by the root scope prefix are treated as a > match. The integer _UID path is unaffected. But this sort of assumes that the string returned by _UID will always be a namespace path, but is that the case really? > Signed-off-by: Mario Limonciello <[email protected]> > --- > include/acpi/acpi_bus.h | 10 +++++++++- > 1 file changed, 9 insertions(+), 1 deletion(-) > > diff --git a/include/acpi/acpi_bus.h b/include/acpi/acpi_bus.h > index 1a45e0d521d8e..e0bec35953ef1 100644 > --- a/include/acpi/acpi_bus.h > +++ b/include/acpi/acpi_bus.h > @@ -835,7 +835,15 @@ static inline bool acpi_str_uid_match(struct acpi_device *adev, const char *uid2 > { > const char *uid1 = acpi_device_uid(adev); > > - return uid1 && uid2 && !strcmp(uid1, uid2); > + if (!uid1 || !uid2) > + return false; > + > + if (*uid1 == '\\') > + uid1++; > + if (*uid2 == '\\') > + uid2++; > + > + return !strcmp(uid1, uid2); > } > > static inline bool acpi_int_uid_match(struct acpi_device *adev, u64 uid2) > -- > 2.43.0 >