595 lines · c
1// SPDX-License-Identifier: GPL-2.0-only2/*3 * X86 ACPI Utility Functions4 *5 * Copyright (C) 2017 Hans de Goede <hdegoede@redhat.com>6 *7 * Based on various non upstream patches to support the CHT Whiskey Cove PMIC:8 * Copyright (C) 2013-2015 Intel Corporation. All rights reserved.9 */10 11#define pr_fmt(fmt) "ACPI: " fmt12 13#include <linux/acpi.h>14#include <linux/dmi.h>15#include <linux/platform_device.h>16#include <asm/cpu_device_id.h>17#include <asm/intel-family.h>18#include "../internal.h"19 20/*21 * Some ACPI devices are hidden (status == 0x0) in recent BIOS-es because22 * some recent Windows drivers bind to one device but poke at multiple23 * devices at the same time, so the others get hidden.24 *25 * Some BIOS-es (temporarily) hide specific APCI devices to work around Windows26 * driver bugs. We use DMI matching to match known cases of this.27 *28 * Likewise sometimes some not-actually present devices are sometimes29 * reported as present, which may cause issues.30 *31 * We work around this by using the below quirk list to override the status32 * reported by the _STA method with a fixed value (ACPI_STA_DEFAULT or 0).33 * Note this MUST only be done for devices where this is safe.34 *35 * This status overriding is limited to specific CPU (SoC) models both to36 * avoid potentially causing trouble on other models and because some HIDs37 * are re-used on different SoCs for completely different devices.38 */39struct override_status_id {40 struct acpi_device_id hid[2];41 struct x86_cpu_id cpu_ids[2];42 struct dmi_system_id dmi_ids[2]; /* Optional */43 const char *uid;44 const char *path;45 unsigned long long status;46};47 48#define ENTRY(status, hid, uid, path, cpu_vfm, dmi...) { \49 { { hid, }, {} }, \50 { X86_MATCH_VFM(cpu_vfm, NULL), {} }, \51 { { .matches = dmi }, {} }, \52 uid, \53 path, \54 status, \55}56 57#define PRESENT_ENTRY_HID(hid, uid, cpu_vfm, dmi...) \58 ENTRY(ACPI_STA_DEFAULT, hid, uid, NULL, cpu_vfm, dmi)59 60#define NOT_PRESENT_ENTRY_HID(hid, uid, cpu_vfm, dmi...) \61 ENTRY(0, hid, uid, NULL, cpu_vfm, dmi)62 63#define PRESENT_ENTRY_PATH(path, cpu_vfm, dmi...) \64 ENTRY(ACPI_STA_DEFAULT, "", NULL, path, cpu_vfm, dmi)65 66#define NOT_PRESENT_ENTRY_PATH(path, cpu_vfm, dmi...) \67 ENTRY(0, "", NULL, path, cpu_vfm, dmi)68 69static const struct override_status_id override_status_ids[] = {70 /*71 * Bay / Cherry Trail PWM directly poked by GPU driver in win10,72 * but Linux uses a separate PWM driver, harmless if not used.73 */74 PRESENT_ENTRY_HID("80860F09", "1", INTEL_ATOM_SILVERMONT, {}),75 PRESENT_ENTRY_HID("80862288", "1", INTEL_ATOM_AIRMONT, {}),76 77 /* The Xiaomi Mi Pad 2 uses PWM2 for touchkeys backlight control */78 PRESENT_ENTRY_HID("80862289", "2", INTEL_ATOM_AIRMONT, {79 DMI_MATCH(DMI_SYS_VENDOR, "Xiaomi Inc"),80 DMI_MATCH(DMI_PRODUCT_NAME, "Mipad2"),81 }),82 83 /*84 * The INT0002 device is necessary to clear wakeup interrupt sources85 * on Cherry Trail devices, without it we get nobody cared IRQ msgs.86 */87 PRESENT_ENTRY_HID("INT0002", "1", INTEL_ATOM_AIRMONT, {}),88 /*89 * On the Dell Venue 11 Pro 7130 and 7139, the DSDT hides90 * the touchscreen ACPI device until a certain time91 * after _SB.PCI0.GFX0.LCD.LCD1._ON gets called has passed92 * *and* _STA has been called at least 3 times since.93 */94 PRESENT_ENTRY_HID("SYNA7500", "1", INTEL_HASWELL_L, {95 DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),96 DMI_MATCH(DMI_PRODUCT_NAME, "Venue 11 Pro 7130"),97 }),98 PRESENT_ENTRY_HID("SYNA7500", "1", INTEL_HASWELL_L, {99 DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),100 DMI_MATCH(DMI_PRODUCT_NAME, "Venue 11 Pro 7139"),101 }),102 103 /*104 * The Dell XPS 15 9550 has a SMO8110 accelerometer /105 * HDD freefall sensor which is wrongly marked as not present.106 */107 PRESENT_ENTRY_HID("SMO8810", "1", INTEL_SKYLAKE, {108 DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),109 DMI_MATCH(DMI_PRODUCT_NAME, "XPS 15 9550"),110 }),111 112 /*113 * The GPD win BIOS dated 20170221 has disabled the accelerometer, the114 * drivers sometimes cause crashes under Windows and this is how the115 * manufacturer has solved this :| The DMI match may not seem unique,116 * but it is. In the 67000+ DMI decode dumps from linux-hardware.org117 * only 116 have board_vendor set to "AMI Corporation" and of those 116118 * only the GPD win and pocket entries' board_name is "Default string".119 *120 * Unfortunately the GPD pocket also uses these strings and its BIOS121 * was copy-pasted from the GPD win, so it has a disabled KIOX000A122 * node which we should not enable, thus we also check the BIOS date.123 */124 PRESENT_ENTRY_HID("KIOX000A", "1", INTEL_ATOM_AIRMONT, {125 DMI_MATCH(DMI_BOARD_VENDOR, "AMI Corporation"),126 DMI_MATCH(DMI_BOARD_NAME, "Default string"),127 DMI_MATCH(DMI_PRODUCT_NAME, "Default string"),128 DMI_MATCH(DMI_BIOS_DATE, "02/21/2017")129 }),130 PRESENT_ENTRY_HID("KIOX000A", "1", INTEL_ATOM_AIRMONT, {131 DMI_MATCH(DMI_BOARD_VENDOR, "AMI Corporation"),132 DMI_MATCH(DMI_BOARD_NAME, "Default string"),133 DMI_MATCH(DMI_PRODUCT_NAME, "Default string"),134 DMI_MATCH(DMI_BIOS_DATE, "03/20/2017")135 }),136 PRESENT_ENTRY_HID("KIOX000A", "1", INTEL_ATOM_AIRMONT, {137 DMI_MATCH(DMI_BOARD_VENDOR, "AMI Corporation"),138 DMI_MATCH(DMI_BOARD_NAME, "Default string"),139 DMI_MATCH(DMI_PRODUCT_NAME, "Default string"),140 DMI_MATCH(DMI_BIOS_DATE, "05/25/2017")141 }),142 143 /*144 * The GPD win/pocket have a PCI wifi card, but its DSDT has the SDIO145 * mmc controller enabled and that has a child-device which _PS3146 * method sets a GPIO causing the PCI wifi card to turn off.147 * See above remark about uniqueness of the DMI match.148 */149 NOT_PRESENT_ENTRY_PATH("\\_SB_.PCI0.SDHB.BRC1", INTEL_ATOM_AIRMONT, {150 DMI_EXACT_MATCH(DMI_BOARD_VENDOR, "AMI Corporation"),151 DMI_EXACT_MATCH(DMI_BOARD_NAME, "Default string"),152 DMI_EXACT_MATCH(DMI_BOARD_SERIAL, "Default string"),153 DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "Default string"),154 }),155 156 /*157 * The LSM303D on the Lenovo Yoga Tablet 2 series is present158 * as both ACCL0001 and MAGN0001. As we can only ever register an159 * i2c client for one of them, ignore MAGN0001.160 */161 NOT_PRESENT_ENTRY_HID("MAGN0001", "1", INTEL_ATOM_SILVERMONT, {162 DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),163 DMI_MATCH(DMI_PRODUCT_FAMILY, "YOGATablet2"),164 }),165};166 167bool acpi_device_override_status(struct acpi_device *adev, unsigned long long *status)168{169 bool ret = false;170 unsigned int i;171 172 for (i = 0; i < ARRAY_SIZE(override_status_ids); i++) {173 if (!x86_match_cpu(override_status_ids[i].cpu_ids))174 continue;175 176 if (override_status_ids[i].dmi_ids[0].matches[0].slot &&177 !dmi_check_system(override_status_ids[i].dmi_ids))178 continue;179 180 if (override_status_ids[i].path) {181 struct acpi_buffer path = { ACPI_ALLOCATE_BUFFER, NULL };182 bool match;183 184 if (acpi_get_name(adev->handle, ACPI_FULL_PATHNAME, &path))185 continue;186 187 match = strcmp((char *)path.pointer, override_status_ids[i].path) == 0;188 kfree(path.pointer);189 190 if (!match)191 continue;192 } else {193 if (acpi_match_device_ids(adev, override_status_ids[i].hid))194 continue;195 196 if (!acpi_dev_uid_match(adev, override_status_ids[i].uid))197 continue;198 }199 200 *status = override_status_ids[i].status;201 ret = true;202 break;203 }204 205 return ret;206}207 208/*209 * AMD systems from Renoir onwards *require* that the NVME controller210 * is put into D3 over a Modern Standby / suspend-to-idle cycle.211 *212 * This is "typically" accomplished using the `StorageD3Enable`213 * property in the _DSD that is checked via the `acpi_storage_d3` function214 * but some OEM systems still don't have it in their BIOS.215 *216 * The Microsoft documentation for StorageD3Enable mentioned that Windows has217 * a hardcoded allowlist for D3 support as well as a registry key to override218 * the BIOS, which has been used for these cases.219 *220 * This allows quirking on Linux in a similar fashion.221 *222 * Cezanne systems shouldn't *normally* need this as the BIOS includes223 * StorageD3Enable. But for two reasons we have added it.224 * 1) The BIOS on a number of Dell systems have ambiguity225 * between the same value used for _ADR on ACPI nodes GPP1.DEV0 and GPP1.NVME.226 * GPP1.NVME is needed to get StorageD3Enable node set properly.227 * https://bugzilla.kernel.org/show_bug.cgi?id=216440228 * https://bugzilla.kernel.org/show_bug.cgi?id=216773229 * https://bugzilla.kernel.org/show_bug.cgi?id=217003230 * 2) On at least one HP system StorageD3Enable is missing on the second NVME231 * disk in the system.232 * 3) On at least one HP Rembrandt system StorageD3Enable is missing on the only233 * NVME device.234 */235bool force_storage_d3(void)236{237 if (!cpu_feature_enabled(X86_FEATURE_ZEN))238 return false;239 return acpi_gbl_FADT.flags & ACPI_FADT_LOW_POWER_S0;240}241 242/*243 * x86 ACPI boards which ship with only Android as their factory image usually244 * declare a whole bunch of bogus I2C devices in their ACPI tables and sometimes245 * there are issues with serdev devices on these boards too, e.g. the resource246 * points to the wrong serdev_controller.247 *248 * Instantiating I2C / serdev devs for these bogus devs causes various issues,249 * e.g. GPIO/IRQ resource conflicts because sometimes drivers do bind to them.250 * The Android x86 kernel fork shipped on these devices has some special code251 * to remove the bogus I2C clients (and AFAICT serdevs are ignored completely).252 *253 * The acpi_quirk_skip_*_enumeration() functions below are used by the I2C or254 * serdev code to skip instantiating any I2C or serdev devs on broken boards.255 *256 * In case of I2C an exception is made for HIDs on the i2c_acpi_known_good_ids257 * list. These are known to always be correct (and in case of the audio-codecs258 * the drivers heavily rely on the codec being enumerated through ACPI).259 *260 * Note these boards typically do actually have I2C and serdev devices,261 * just different ones then the ones described in their DSDT. The devices262 * which are actually present are manually instantiated by the263 * drivers/platform/x86/x86-android-tablets.c kernel module.264 */265#define ACPI_QUIRK_SKIP_I2C_CLIENTS BIT(0)266#define ACPI_QUIRK_UART1_SKIP BIT(1)267#define ACPI_QUIRK_UART1_TTY_UART2_SKIP BIT(2)268#define ACPI_QUIRK_PNP_UART1_SKIP BIT(3)269#define ACPI_QUIRK_SKIP_ACPI_AC_AND_BATTERY BIT(4)270#define ACPI_QUIRK_USE_ACPI_AC_AND_BATTERY BIT(5)271#define ACPI_QUIRK_SKIP_GPIO_EVENT_HANDLERS BIT(6)272 273static const struct dmi_system_id acpi_quirk_skip_dmi_ids[] = {274 /*275 * 1. Devices with only the skip / don't-skip AC and battery quirks,276 * sorted alphabetically.277 */278 {279 /* ECS EF20EA, AXP288 PMIC but uses separate fuel-gauge */280 .matches = {281 DMI_MATCH(DMI_PRODUCT_NAME, "EF20EA"),282 },283 .driver_data = (void *)ACPI_QUIRK_USE_ACPI_AC_AND_BATTERY284 },285 {286 /* Lenovo Ideapad Miix 320, AXP288 PMIC, separate fuel-gauge */287 .matches = {288 DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),289 DMI_MATCH(DMI_PRODUCT_NAME, "80XF"),290 DMI_MATCH(DMI_PRODUCT_VERSION, "Lenovo MIIX 320-10ICR"),291 },292 .driver_data = (void *)ACPI_QUIRK_USE_ACPI_AC_AND_BATTERY293 },294 295 /*296 * 2. Devices which also have the skip i2c/serdev quirks and which297 * need the x86-android-tablets module to properly work.298 */299#if IS_ENABLED(CONFIG_X86_ANDROID_TABLETS)300 {301 /* Acer Iconia One 7 B1-750 */302 .matches = {303 DMI_MATCH(DMI_SYS_VENDOR, "Insyde"),304 DMI_MATCH(DMI_PRODUCT_NAME, "VESPA2"),305 },306 .driver_data = (void *)(ACPI_QUIRK_SKIP_I2C_CLIENTS |307 ACPI_QUIRK_SKIP_ACPI_AC_AND_BATTERY |308 ACPI_QUIRK_SKIP_GPIO_EVENT_HANDLERS),309 },310 {311 .matches = {312 DMI_EXACT_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),313 DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "ME176C"),314 },315 .driver_data = (void *)(ACPI_QUIRK_SKIP_I2C_CLIENTS |316 ACPI_QUIRK_UART1_TTY_UART2_SKIP |317 ACPI_QUIRK_SKIP_ACPI_AC_AND_BATTERY |318 ACPI_QUIRK_SKIP_GPIO_EVENT_HANDLERS),319 },320 {321 /* Lenovo Yoga Book X90F/L */322 .matches = {323 DMI_EXACT_MATCH(DMI_SYS_VENDOR, "Intel Corporation"),324 DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "CHERRYVIEW D1 PLATFORM"),325 DMI_EXACT_MATCH(DMI_PRODUCT_VERSION, "YETI-11"),326 },327 .driver_data = (void *)(ACPI_QUIRK_SKIP_I2C_CLIENTS |328 ACPI_QUIRK_UART1_SKIP |329 ACPI_QUIRK_SKIP_ACPI_AC_AND_BATTERY |330 ACPI_QUIRK_SKIP_GPIO_EVENT_HANDLERS),331 },332 {333 .matches = {334 DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),335 DMI_MATCH(DMI_PRODUCT_NAME, "TF103C"),336 },337 .driver_data = (void *)(ACPI_QUIRK_SKIP_I2C_CLIENTS |338 ACPI_QUIRK_SKIP_ACPI_AC_AND_BATTERY |339 ACPI_QUIRK_SKIP_GPIO_EVENT_HANDLERS),340 },341 {342 /* Lenovo Yoga Tablet 2 1050F/L */343 .matches = {344 DMI_MATCH(DMI_SYS_VENDOR, "Intel Corp."),345 DMI_MATCH(DMI_PRODUCT_NAME, "VALLEYVIEW C0 PLATFORM"),346 DMI_MATCH(DMI_BOARD_NAME, "BYT-T FFD8"),347 /* Partial match on beginning of BIOS version */348 DMI_MATCH(DMI_BIOS_VERSION, "BLADE_21"),349 },350 .driver_data = (void *)(ACPI_QUIRK_SKIP_I2C_CLIENTS |351 ACPI_QUIRK_PNP_UART1_SKIP |352 ACPI_QUIRK_SKIP_ACPI_AC_AND_BATTERY),353 },354 {355 /* Lenovo Yoga Tab 3 Pro X90F */356 .matches = {357 DMI_MATCH(DMI_SYS_VENDOR, "Intel Corporation"),358 DMI_MATCH(DMI_PRODUCT_VERSION, "Blade3-10A-001"),359 },360 .driver_data = (void *)(ACPI_QUIRK_SKIP_I2C_CLIENTS |361 ACPI_QUIRK_SKIP_ACPI_AC_AND_BATTERY),362 },363 {364 /* Medion Lifetab S10346 */365 .matches = {366 DMI_MATCH(DMI_BOARD_VENDOR, "AMI Corporation"),367 DMI_MATCH(DMI_BOARD_NAME, "Aptio CRB"),368 /* Way too generic, also match on BIOS data */369 DMI_MATCH(DMI_BIOS_DATE, "10/22/2015"),370 },371 .driver_data = (void *)(ACPI_QUIRK_SKIP_I2C_CLIENTS |372 ACPI_QUIRK_SKIP_ACPI_AC_AND_BATTERY),373 },374 {375 /* Nextbook Ares 8 (BYT version)*/376 .matches = {377 DMI_MATCH(DMI_SYS_VENDOR, "Insyde"),378 DMI_MATCH(DMI_PRODUCT_NAME, "M890BAP"),379 },380 .driver_data = (void *)(ACPI_QUIRK_SKIP_I2C_CLIENTS |381 ACPI_QUIRK_SKIP_ACPI_AC_AND_BATTERY |382 ACPI_QUIRK_SKIP_GPIO_EVENT_HANDLERS),383 },384 {385 /* Nextbook Ares 8A (CHT version)*/386 .matches = {387 DMI_MATCH(DMI_SYS_VENDOR, "Insyde"),388 DMI_MATCH(DMI_PRODUCT_NAME, "CherryTrail"),389 DMI_MATCH(DMI_BIOS_VERSION, "M882"),390 },391 .driver_data = (void *)(ACPI_QUIRK_SKIP_I2C_CLIENTS |392 ACPI_QUIRK_SKIP_ACPI_AC_AND_BATTERY),393 },394 {395 /* Whitelabel (sold as various brands) TM800A550L */396 .matches = {397 DMI_MATCH(DMI_BOARD_VENDOR, "AMI Corporation"),398 DMI_MATCH(DMI_BOARD_NAME, "Aptio CRB"),399 /* Above strings are too generic, also match on BIOS version */400 DMI_MATCH(DMI_BIOS_VERSION, "ZY-8-BI-PX4S70VTR400-X423B-005-D"),401 },402 .driver_data = (void *)(ACPI_QUIRK_SKIP_I2C_CLIENTS |403 ACPI_QUIRK_SKIP_ACPI_AC_AND_BATTERY),404 },405#endif406 {}407};408 409#if IS_ENABLED(CONFIG_X86_ANDROID_TABLETS)410static const struct acpi_device_id i2c_acpi_known_good_ids[] = {411 { "10EC5640", 0 }, /* RealTek ALC5640 audio codec */412 { "10EC5651", 0 }, /* RealTek ALC5651 audio codec */413 { "INT33F4", 0 }, /* X-Powers AXP288 PMIC */414 { "INT33FD", 0 }, /* Intel Crystal Cove PMIC */415 { "INT34D3", 0 }, /* Intel Whiskey Cove PMIC */416 { "NPCE69A", 0 }, /* Asus Transformer keyboard dock */417 {}418};419 420bool acpi_quirk_skip_i2c_client_enumeration(struct acpi_device *adev)421{422 const struct dmi_system_id *dmi_id;423 long quirks;424 425 dmi_id = dmi_first_match(acpi_quirk_skip_dmi_ids);426 if (!dmi_id)427 return false;428 429 quirks = (unsigned long)dmi_id->driver_data;430 if (!(quirks & ACPI_QUIRK_SKIP_I2C_CLIENTS))431 return false;432 433 return acpi_match_device_ids(adev, i2c_acpi_known_good_ids);434}435EXPORT_SYMBOL_GPL(acpi_quirk_skip_i2c_client_enumeration);436 437static int acpi_dmi_skip_serdev_enumeration(struct device *controller_parent, bool *skip)438{439 struct acpi_device *adev = ACPI_COMPANION(controller_parent);440 const struct dmi_system_id *dmi_id;441 long quirks = 0;442 u64 uid;443 int ret;444 445 ret = acpi_dev_uid_to_integer(adev, &uid);446 if (ret)447 return 0;448 449 dmi_id = dmi_first_match(acpi_quirk_skip_dmi_ids);450 if (dmi_id)451 quirks = (unsigned long)dmi_id->driver_data;452 453 if (!dev_is_platform(controller_parent)) {454 /* PNP enumerated UARTs */455 if ((quirks & ACPI_QUIRK_PNP_UART1_SKIP) && uid == 1)456 *skip = true;457 458 return 0;459 }460 461 if ((quirks & ACPI_QUIRK_UART1_SKIP) && uid == 1)462 *skip = true;463 464 if (quirks & ACPI_QUIRK_UART1_TTY_UART2_SKIP) {465 if (uid == 1)466 return -ENODEV; /* Create tty cdev instead of serdev */467 468 if (uid == 2)469 *skip = true;470 }471 472 return 0;473}474 475bool acpi_quirk_skip_gpio_event_handlers(void)476{477 const struct dmi_system_id *dmi_id;478 long quirks;479 480 dmi_id = dmi_first_match(acpi_quirk_skip_dmi_ids);481 if (!dmi_id)482 return false;483 484 quirks = (unsigned long)dmi_id->driver_data;485 return (quirks & ACPI_QUIRK_SKIP_GPIO_EVENT_HANDLERS);486}487EXPORT_SYMBOL_GPL(acpi_quirk_skip_gpio_event_handlers);488#else489static int acpi_dmi_skip_serdev_enumeration(struct device *controller_parent, bool *skip)490{491 return 0;492}493#endif494 495int acpi_quirk_skip_serdev_enumeration(struct device *controller_parent, bool *skip)496{497 struct acpi_device *adev = ACPI_COMPANION(controller_parent);498 499 *skip = false;500 501 /*502 * The DELL0501 ACPI HID represents an UART (CID is set to PNP0501) with503 * a backlight-controller attached. There is no separate ACPI device with504 * an UartSerialBusV2() resource to model the backlight-controller.505 * Set skip to true so that the tty core creates a serdev ctrl device.506 * The backlight driver will manually create the serdev client device.507 */508 if (acpi_dev_hid_match(adev, "DELL0501")) {509 *skip = true;510 /*511 * Create a platform dev for dell-uart-backlight to bind to.512 * This is a static device, so no need to store the result.513 */514 platform_device_register_simple("dell-uart-backlight", PLATFORM_DEVID_NONE,515 NULL, 0);516 return 0;517 }518 519 return acpi_dmi_skip_serdev_enumeration(controller_parent, skip);520}521EXPORT_SYMBOL_GPL(acpi_quirk_skip_serdev_enumeration);522 523/* Lists of PMIC ACPI HIDs with an (often better) native charger driver */524static const struct {525 const char *hid;526 int hrv;527} acpi_skip_ac_and_battery_pmic_ids[] = {528 { "INT33F4", -1 }, /* X-Powers AXP288 PMIC */529 { "INT34D3", 3 }, /* Intel Cherrytrail Whiskey Cove PMIC */530};531 532bool acpi_quirk_skip_acpi_ac_and_battery(void)533{534 const struct dmi_system_id *dmi_id;535 long quirks = 0;536 int i;537 538 dmi_id = dmi_first_match(acpi_quirk_skip_dmi_ids);539 if (dmi_id)540 quirks = (unsigned long)dmi_id->driver_data;541 542 if (quirks & ACPI_QUIRK_SKIP_ACPI_AC_AND_BATTERY)543 return true;544 545 if (quirks & ACPI_QUIRK_USE_ACPI_AC_AND_BATTERY)546 return false;547 548 for (i = 0; i < ARRAY_SIZE(acpi_skip_ac_and_battery_pmic_ids); i++) {549 if (acpi_dev_present(acpi_skip_ac_and_battery_pmic_ids[i].hid, "1",550 acpi_skip_ac_and_battery_pmic_ids[i].hrv)) {551 pr_info_once("found native %s PMIC, skipping ACPI AC and battery devices\n",552 acpi_skip_ac_and_battery_pmic_ids[i].hid);553 return true;554 }555 }556 557 return false;558}559EXPORT_SYMBOL_GPL(acpi_quirk_skip_acpi_ac_and_battery);560 561/* This section provides a workaround for a specific x86 system562 * which requires disabling of mwait to work correctly.563 */564static int __init acpi_proc_quirk_set_no_mwait(const struct dmi_system_id *id)565{566 pr_notice("%s detected - disabling mwait for CPU C-states\n",567 id->ident);568 boot_option_idle_override = IDLE_NOMWAIT;569 return 0;570}571 572static const struct dmi_system_id acpi_proc_quirk_mwait_dmi_table[] __initconst = {573 {574 .callback = acpi_proc_quirk_set_no_mwait,575 .ident = "Extensa 5220",576 .matches = {577 DMI_MATCH(DMI_BIOS_VENDOR, "Phoenix Technologies LTD"),578 DMI_MATCH(DMI_SYS_VENDOR, "Acer"),579 DMI_MATCH(DMI_PRODUCT_VERSION, "0100"),580 DMI_MATCH(DMI_BOARD_NAME, "Columbia"),581 },582 .driver_data = NULL,583 },584 {}585};586 587void __init acpi_proc_quirk_mwait_check(void)588{589 /*590 * Check whether the system is DMI table. If yes, OSPM591 * should not use mwait for CPU-states.592 */593 dmi_check_system(acpi_proc_quirk_mwait_dmi_table);594}595