lkml.org 
[lkml]   [2022]   [Jan]   [17]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL 5.16 086/217] ACPI / x86: Allow specifying acpi_device_override_status() quirks by path
    Date
    From: Hans de Goede <hdegoede@redhat.com>

    [ Upstream commit ba46e42e925b5d09b4e441f8de3db119cc7df58f ]

    Not all ACPI-devices have a HID + UID, allow specifying quirks for
    acpi_device_override_status() by path too.

    Note this moves the path/HID+UID check to after the CPU + DMI checks
    since the path lookup is somewhat costly.

    This way this lookup is only done on devices where the other checks
    match.

    Signed-off-by: Hans de Goede <hdegoede@redhat.com>
    Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/acpi/x86/utils.c | 42 ++++++++++++++++++++++++++++++----------
    1 file changed, 32 insertions(+), 10 deletions(-)

    diff --git a/drivers/acpi/x86/utils.c b/drivers/acpi/x86/utils.c
    index edb4f3fd93dc3..190bfc2ab3f26 100644
    --- a/drivers/acpi/x86/utils.c
    +++ b/drivers/acpi/x86/utils.c
    @@ -38,22 +38,30 @@ struct override_status_id {
    struct x86_cpu_id cpu_ids[2];
    struct dmi_system_id dmi_ids[2]; /* Optional */
    const char *uid;
    + const char *path;
    unsigned long long status;
    };

    -#define ENTRY(status, hid, uid, cpu_model, dmi...) { \
    +#define ENTRY(status, hid, uid, path, cpu_model, dmi...) { \
    { { hid, }, {} }, \
    { X86_MATCH_INTEL_FAM6_MODEL(cpu_model, NULL), {} }, \
    { { .matches = dmi }, {} }, \
    uid, \
    + path, \
    status, \
    }

    #define PRESENT_ENTRY_HID(hid, uid, cpu_model, dmi...) \
    - ENTRY(ACPI_STA_DEFAULT, hid, uid, cpu_model, dmi)
    + ENTRY(ACPI_STA_DEFAULT, hid, uid, NULL, cpu_model, dmi)

    #define NOT_PRESENT_ENTRY_HID(hid, uid, cpu_model, dmi...) \
    - ENTRY(0, hid, uid, cpu_model, dmi)
    + ENTRY(0, hid, uid, NULL, cpu_model, dmi)
    +
    +#define PRESENT_ENTRY_PATH(path, cpu_model, dmi...) \
    + ENTRY(ACPI_STA_DEFAULT, "", NULL, path, cpu_model, dmi)
    +
    +#define NOT_PRESENT_ENTRY_PATH(path, cpu_model, dmi...) \
    + ENTRY(0, "", NULL, path, cpu_model, dmi)

    static const struct override_status_id override_status_ids[] = {
    /*
    @@ -120,13 +128,6 @@ bool acpi_device_override_status(struct acpi_device *adev, unsigned long long *s
    unsigned int i;

    for (i = 0; i < ARRAY_SIZE(override_status_ids); i++) {
    - if (acpi_match_device_ids(adev, override_status_ids[i].hid))
    - continue;
    -
    - if (!adev->pnp.unique_id ||
    - strcmp(adev->pnp.unique_id, override_status_ids[i].uid))
    - continue;
    -
    if (!x86_match_cpu(override_status_ids[i].cpu_ids))
    continue;

    @@ -134,6 +135,27 @@ bool acpi_device_override_status(struct acpi_device *adev, unsigned long long *s
    !dmi_check_system(override_status_ids[i].dmi_ids))
    continue;

    + if (override_status_ids[i].path) {
    + struct acpi_buffer path = { ACPI_ALLOCATE_BUFFER, NULL };
    + bool match;
    +
    + if (acpi_get_name(adev->handle, ACPI_FULL_PATHNAME, &path))
    + continue;
    +
    + match = strcmp((char *)path.pointer, override_status_ids[i].path) == 0;
    + kfree(path.pointer);
    +
    + if (!match)
    + continue;
    + } else {
    + if (acpi_match_device_ids(adev, override_status_ids[i].hid))
    + continue;
    +
    + if (!adev->pnp.unique_id ||
    + strcmp(adev->pnp.unique_id, override_status_ids[i].uid))
    + continue;
    + }
    +
    *status = override_status_ids[i].status;
    ret = true;
    break;
    --
    2.34.1
    \
     
     \ /
      Last update: 2022-01-18 03:33    [W:4.416 / U:0.764 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site