platform-drivers-x86 for v6.5-2
Misc. small fixes and hw-id additions. The following is an automated git shortlog grouped by driver: Move s2idle quirk from thinkpad-acpi to amd-pmc: - Move s2idle quirk from thinkpad-acpi to amd-pmc dell-ddv: - Fix mangled list in documentation - Improve error handling int3472/discrete: - set variable skl_int3472_regulator_second_sensor storage-class-specifier to static platform/x86/amd: - pmf: Add new ACPI ID AMDI0103 - pmc: Add new ACPI ID AMDI000A - pmc: Apply nvme quirk to HP 15s-eq2xxx platform/x86/intel/tpmi: - Prevent overflow for cap_offset touchscreen_dmi: - Add info for the Archos 101 Cesium Educ tablet wmi: - Replace open coded guid_parse_and_compare() - Break possible infinite loop when parsing GUID -----BEGIN PGP SIGNATURE----- iQFIBAABCAAyFiEEuvA7XScYQRpenhd+kuxHeUQDJ9wFAmSufa8UHGhkZWdvZWRl QHJlZGhhdC5jb20ACgkQkuxHeUQDJ9xNAAf/Z2LnAAGSq6oKO7x9dLxQeuub/Fbn cMkPlk56gNYJCI0mIuW+cIBf5HOJhgu3oxCvDgbFS+3m2pziB+0nkA5ZdVxeR4na yRfPzMLg4PuZKbcBzeboNLGlawdHM09J69brfQTao1PLr1iO8qztEk8qGOgyb4Yc IWtyw5b3ZVQ+sZrdln2ouDMgAMvFYPyJWgZOZOSWfnR6d5AZK3Zvnevqa606NPsA +ueor3AegQjwJ/uSXw6fpmjnru5XZWEiu08cZifqZbsNS9ExyWNeG51zbF9WjCMi R8qYkcp6odbWdFzLDW8DELxGctfttlTs5fiTQ/DEn2nyLLNAnLDpEMwZuw== =f0+L -----END PGP SIGNATURE----- Merge tag 'platform-drivers-x86-v6.5-2' of git://git.kernel.org/pub/scm/linux/kernel/git/pdx86/platform-drivers-x86 Pull x86 platform driver fixes from Hans de Goede: "Misc small fixes and hw-id additions" * tag 'platform-drivers-x86-v6.5-2' of git://git.kernel.org/pub/scm/linux/kernel/git/pdx86/platform-drivers-x86: platform/x86: touchscreen_dmi: Add info for the Archos 101 Cesium Educ tablet platform/x86: dell-ddv: Fix mangled list in documentation platform/x86: dell-ddv: Improve error handling platform/x86/amd: pmf: Add new ACPI ID AMDI0103 platform/x86/amd: pmc: Add new ACPI ID AMDI000A platform/x86/amd: pmc: Apply nvme quirk to HP 15s-eq2xxx platform/x86: Move s2idle quirk from thinkpad-acpi to amd-pmc platform/x86: int3472/discrete: set variable skl_int3472_regulator_second_sensor storage-class-specifier to static platform/x86/intel/tpmi: Prevent overflow for cap_offset platform/x86: wmi: Replace open coded guid_parse_and_compare() platform/x86: wmi: Break possible infinite loop when parsing GUID
This commit is contained in:
commit
eb26cbb1a7
@ -187,7 +187,8 @@ WMI method BatteryeRawAnalytics()
|
||||
|
||||
Returns a buffer usually containg 12 blocks of analytics data.
|
||||
Those blocks contain:
|
||||
- block number starting with 0 (u8)
|
||||
|
||||
- a block number starting with 0 (u8)
|
||||
- 31 bytes of unknown data
|
||||
|
||||
.. note::
|
||||
|
@ -4,7 +4,7 @@
|
||||
# AMD x86 Platform-Specific Drivers
|
||||
#
|
||||
|
||||
amd-pmc-y := pmc.o
|
||||
amd-pmc-y := pmc.o pmc-quirks.o
|
||||
obj-$(CONFIG_AMD_PMC) += amd-pmc.o
|
||||
amd_hsmp-y := hsmp.o
|
||||
obj-$(CONFIG_AMD_HSMP) += amd_hsmp.o
|
||||
|
176
drivers/platform/x86/amd/pmc-quirks.c
Normal file
176
drivers/platform/x86/amd/pmc-quirks.c
Normal file
@ -0,0 +1,176 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
/*
|
||||
* AMD SoC Power Management Controller Driver Quirks
|
||||
*
|
||||
* Copyright (c) 2023, Advanced Micro Devices, Inc.
|
||||
* All Rights Reserved.
|
||||
*
|
||||
* Author: Mario Limonciello <mario.limonciello@amd.com>
|
||||
*/
|
||||
|
||||
#include <linux/dmi.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/ioport.h>
|
||||
#include <linux/slab.h>
|
||||
|
||||
#include "pmc.h"
|
||||
|
||||
struct quirk_entry {
|
||||
u32 s2idle_bug_mmio;
|
||||
};
|
||||
|
||||
static struct quirk_entry quirk_s2idle_bug = {
|
||||
.s2idle_bug_mmio = 0xfed80380,
|
||||
};
|
||||
|
||||
static const struct dmi_system_id fwbug_list[] = {
|
||||
{
|
||||
.ident = "L14 Gen2 AMD",
|
||||
.driver_data = &quirk_s2idle_bug,
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "20X5"),
|
||||
}
|
||||
},
|
||||
{
|
||||
.ident = "T14s Gen2 AMD",
|
||||
.driver_data = &quirk_s2idle_bug,
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "20XF"),
|
||||
}
|
||||
},
|
||||
{
|
||||
.ident = "X13 Gen2 AMD",
|
||||
.driver_data = &quirk_s2idle_bug,
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "20XH"),
|
||||
}
|
||||
},
|
||||
{
|
||||
.ident = "T14 Gen2 AMD",
|
||||
.driver_data = &quirk_s2idle_bug,
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "20XK"),
|
||||
}
|
||||
},
|
||||
{
|
||||
.ident = "T14 Gen1 AMD",
|
||||
.driver_data = &quirk_s2idle_bug,
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "20UD"),
|
||||
}
|
||||
},
|
||||
{
|
||||
.ident = "T14 Gen1 AMD",
|
||||
.driver_data = &quirk_s2idle_bug,
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "20UE"),
|
||||
}
|
||||
},
|
||||
{
|
||||
.ident = "T14s Gen1 AMD",
|
||||
.driver_data = &quirk_s2idle_bug,
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "20UH"),
|
||||
}
|
||||
},
|
||||
{
|
||||
.ident = "T14s Gen1 AMD",
|
||||
.driver_data = &quirk_s2idle_bug,
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "20UJ"),
|
||||
}
|
||||
},
|
||||
{
|
||||
.ident = "P14s Gen1 AMD",
|
||||
.driver_data = &quirk_s2idle_bug,
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "20Y1"),
|
||||
}
|
||||
},
|
||||
{
|
||||
.ident = "P14s Gen2 AMD",
|
||||
.driver_data = &quirk_s2idle_bug,
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "21A0"),
|
||||
}
|
||||
},
|
||||
{
|
||||
.ident = "P14s Gen2 AMD",
|
||||
.driver_data = &quirk_s2idle_bug,
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "21A1"),
|
||||
}
|
||||
},
|
||||
/* https://gitlab.freedesktop.org/drm/amd/-/issues/2684 */
|
||||
{
|
||||
.ident = "HP Laptop 15s-eq2xxx",
|
||||
.driver_data = &quirk_s2idle_bug,
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "HP"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "HP Laptop 15s-eq2xxx"),
|
||||
}
|
||||
},
|
||||
{}
|
||||
};
|
||||
|
||||
/*
|
||||
* Laptops that run a SMI handler during the D3->D0 transition that occurs
|
||||
* specifically when exiting suspend to idle which can cause
|
||||
* large delays during resume when the IOMMU translation layer is enabled (the default
|
||||
* behavior) for NVME devices:
|
||||
*
|
||||
* To avoid this firmware problem, skip the SMI handler on these machines before the
|
||||
* D0 transition occurs.
|
||||
*/
|
||||
static void amd_pmc_skip_nvme_smi_handler(u32 s2idle_bug_mmio)
|
||||
{
|
||||
struct resource *res;
|
||||
void __iomem *addr;
|
||||
u8 val;
|
||||
|
||||
res = request_mem_region_muxed(s2idle_bug_mmio, 1, "amd_pmc_pm80");
|
||||
if (!res)
|
||||
return;
|
||||
|
||||
addr = ioremap(s2idle_bug_mmio, 1);
|
||||
if (!addr)
|
||||
goto cleanup_resource;
|
||||
|
||||
val = ioread8(addr);
|
||||
iowrite8(val & ~BIT(0), addr);
|
||||
|
||||
iounmap(addr);
|
||||
cleanup_resource:
|
||||
release_resource(res);
|
||||
kfree(res);
|
||||
}
|
||||
|
||||
void amd_pmc_process_restore_quirks(struct amd_pmc_dev *dev)
|
||||
{
|
||||
if (dev->quirks && dev->quirks->s2idle_bug_mmio)
|
||||
amd_pmc_skip_nvme_smi_handler(dev->quirks->s2idle_bug_mmio);
|
||||
}
|
||||
|
||||
void amd_pmc_quirks_init(struct amd_pmc_dev *dev)
|
||||
{
|
||||
const struct dmi_system_id *dmi_id;
|
||||
|
||||
dmi_id = dmi_first_match(fwbug_list);
|
||||
if (!dmi_id)
|
||||
return;
|
||||
dev->quirks = dmi_id->driver_data;
|
||||
if (dev->quirks->s2idle_bug_mmio)
|
||||
pr_info("Using s2idle quirk to avoid %s platform firmware bug\n",
|
||||
dmi_id->ident);
|
||||
}
|
@ -28,6 +28,8 @@
|
||||
#include <linux/seq_file.h>
|
||||
#include <linux/uaccess.h>
|
||||
|
||||
#include "pmc.h"
|
||||
|
||||
/* SMU communication registers */
|
||||
#define AMD_PMC_REGISTER_MESSAGE 0x538
|
||||
#define AMD_PMC_REGISTER_RESPONSE 0x980
|
||||
@ -94,6 +96,7 @@
|
||||
#define AMD_CPU_ID_CB 0x14D8
|
||||
#define AMD_CPU_ID_PS 0x14E8
|
||||
#define AMD_CPU_ID_SP 0x14A4
|
||||
#define PCI_DEVICE_ID_AMD_1AH_M20H_ROOT 0x1507
|
||||
|
||||
#define PMC_MSG_DELAY_MIN_US 50
|
||||
#define RESPONSE_REGISTER_LOOP_MAX 20000
|
||||
@ -146,29 +149,6 @@ static const struct amd_pmc_bit_map soc15_ip_blk[] = {
|
||||
{}
|
||||
};
|
||||
|
||||
struct amd_pmc_dev {
|
||||
void __iomem *regbase;
|
||||
void __iomem *smu_virt_addr;
|
||||
void __iomem *stb_virt_addr;
|
||||
void __iomem *fch_virt_addr;
|
||||
bool msg_port;
|
||||
u32 base_addr;
|
||||
u32 cpu_id;
|
||||
u32 active_ips;
|
||||
u32 dram_size;
|
||||
u32 num_ips;
|
||||
u32 s2d_msg_id;
|
||||
/* SMU version information */
|
||||
u8 smu_program;
|
||||
u8 major;
|
||||
u8 minor;
|
||||
u8 rev;
|
||||
struct device *dev;
|
||||
struct pci_dev *rdev;
|
||||
struct mutex lock; /* generic mutex lock */
|
||||
struct dentry *dbgfs_dir;
|
||||
};
|
||||
|
||||
static bool enable_stb;
|
||||
module_param(enable_stb, bool, 0644);
|
||||
MODULE_PARM_DESC(enable_stb, "Enable the STB debug mechanism");
|
||||
@ -891,6 +871,8 @@ static void amd_pmc_s2idle_restore(void)
|
||||
|
||||
/* Notify on failed entry */
|
||||
amd_pmc_validate_deepest(pdev);
|
||||
|
||||
amd_pmc_process_restore_quirks(pdev);
|
||||
}
|
||||
|
||||
static struct acpi_s2idle_dev_ops amd_pmc_s2idle_dev_ops = {
|
||||
@ -926,6 +908,7 @@ static const struct pci_device_id pmc_pci_ids[] = {
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_AMD, AMD_CPU_ID_PCO) },
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_AMD, AMD_CPU_ID_RV) },
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_AMD, AMD_CPU_ID_SP) },
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_1AH_M20H_ROOT) },
|
||||
{ }
|
||||
};
|
||||
|
||||
@ -1087,6 +1070,8 @@ static int amd_pmc_probe(struct platform_device *pdev)
|
||||
err = acpi_register_lps0_dev(&amd_pmc_s2idle_dev_ops);
|
||||
if (err)
|
||||
dev_warn(dev->dev, "failed to register LPS0 sleep handler, expect increased power consumption\n");
|
||||
if (!disable_workarounds)
|
||||
amd_pmc_quirks_init(dev);
|
||||
}
|
||||
|
||||
amd_pmc_dbgfs_register(dev);
|
||||
@ -1115,6 +1100,7 @@ static const struct acpi_device_id amd_pmc_acpi_ids[] = {
|
||||
{"AMDI0007", 0},
|
||||
{"AMDI0008", 0},
|
||||
{"AMDI0009", 0},
|
||||
{"AMDI000A", 0},
|
||||
{"AMD0004", 0},
|
||||
{"AMD0005", 0},
|
||||
{ }
|
||||
|
44
drivers/platform/x86/amd/pmc.h
Normal file
44
drivers/platform/x86/amd/pmc.h
Normal file
@ -0,0 +1,44 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-or-later */
|
||||
/*
|
||||
* AMD SoC Power Management Controller Driver
|
||||
*
|
||||
* Copyright (c) 2023, Advanced Micro Devices, Inc.
|
||||
* All Rights Reserved.
|
||||
*
|
||||
* Author: Mario Limonciello <mario.limonciello@amd.com>
|
||||
*/
|
||||
|
||||
#ifndef PMC_H
|
||||
#define PMC_H
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <linux/mutex.h>
|
||||
|
||||
struct amd_pmc_dev {
|
||||
void __iomem *regbase;
|
||||
void __iomem *smu_virt_addr;
|
||||
void __iomem *stb_virt_addr;
|
||||
void __iomem *fch_virt_addr;
|
||||
bool msg_port;
|
||||
u32 base_addr;
|
||||
u32 cpu_id;
|
||||
u32 active_ips;
|
||||
u32 dram_size;
|
||||
u32 num_ips;
|
||||
u32 s2d_msg_id;
|
||||
/* SMU version information */
|
||||
u8 smu_program;
|
||||
u8 major;
|
||||
u8 minor;
|
||||
u8 rev;
|
||||
struct device *dev;
|
||||
struct pci_dev *rdev;
|
||||
struct mutex lock; /* generic mutex lock */
|
||||
struct dentry *dbgfs_dir;
|
||||
struct quirk_entry *quirks;
|
||||
};
|
||||
|
||||
void amd_pmc_process_restore_quirks(struct amd_pmc_dev *dev);
|
||||
void amd_pmc_quirks_init(struct amd_pmc_dev *dev);
|
||||
|
||||
#endif /* PMC_H */
|
@ -40,6 +40,7 @@
|
||||
/* List of supported CPU ids */
|
||||
#define AMD_CPU_ID_RMB 0x14b5
|
||||
#define AMD_CPU_ID_PS 0x14e8
|
||||
#define PCI_DEVICE_ID_AMD_1AH_M20H_ROOT 0x1507
|
||||
|
||||
#define PMF_MSG_DELAY_MIN_US 50
|
||||
#define RESPONSE_REGISTER_LOOP_MAX 20000
|
||||
@ -242,6 +243,7 @@ out_unlock:
|
||||
static const struct pci_device_id pmf_pci_ids[] = {
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_AMD, AMD_CPU_ID_RMB) },
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_AMD, AMD_CPU_ID_PS) },
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_1AH_M20H_ROOT) },
|
||||
{ }
|
||||
};
|
||||
|
||||
@ -333,6 +335,7 @@ static void amd_pmf_deinit_features(struct amd_pmf_dev *dev)
|
||||
static const struct acpi_device_id amd_pmf_acpi_ids[] = {
|
||||
{"AMDI0100", 0x100},
|
||||
{"AMDI0102", 0},
|
||||
{"AMDI0103", 0},
|
||||
{ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(acpi, amd_pmf_acpi_ids);
|
||||
|
@ -616,7 +616,8 @@ static int dell_wmi_ddv_hwmon_add(struct dell_wmi_ddv_data *data)
|
||||
}
|
||||
|
||||
if (index < 2) {
|
||||
ret = -ENODEV;
|
||||
/* Finding no available sensors is not an error */
|
||||
ret = 0;
|
||||
|
||||
goto err_release;
|
||||
}
|
||||
@ -841,13 +842,13 @@ static int dell_wmi_ddv_probe(struct wmi_device *wdev, const void *context)
|
||||
|
||||
if (IS_REACHABLE(CONFIG_ACPI_BATTERY)) {
|
||||
ret = dell_wmi_ddv_battery_add(data);
|
||||
if (ret < 0 && ret != -ENODEV)
|
||||
if (ret < 0)
|
||||
dev_warn(&wdev->dev, "Unable to register ACPI battery hook: %d\n", ret);
|
||||
}
|
||||
|
||||
if (IS_REACHABLE(CONFIG_HWMON)) {
|
||||
ret = dell_wmi_ddv_hwmon_add(data);
|
||||
if (ret < 0 && ret != -ENODEV)
|
||||
if (ret < 0)
|
||||
dev_warn(&wdev->dev, "Unable to register hwmon interface: %d\n", ret);
|
||||
}
|
||||
|
||||
|
@ -260,7 +260,7 @@ static_assert(ARRAY_SIZE(skl_int3472_regulator_map_supplies) ==
|
||||
* This DMI table contains the name of the second sensor. This is used to add
|
||||
* entries for the second sensor to the supply_map.
|
||||
*/
|
||||
const struct dmi_system_id skl_int3472_regulator_second_sensor[] = {
|
||||
static const struct dmi_system_id skl_int3472_regulator_second_sensor[] = {
|
||||
{
|
||||
/* Lenovo Miix 510-12IKB */
|
||||
.matches = {
|
||||
|
@ -356,9 +356,7 @@ static int intel_vsec_tpmi_init(struct auxiliary_device *auxdev)
|
||||
if (!pfs_start)
|
||||
pfs_start = res_start;
|
||||
|
||||
pfs->pfs_header.cap_offset *= TPMI_CAP_OFFSET_UNIT;
|
||||
|
||||
pfs->vsec_offset = pfs_start + pfs->pfs_header.cap_offset;
|
||||
pfs->vsec_offset = pfs_start + pfs->pfs_header.cap_offset * TPMI_CAP_OFFSET_UNIT;
|
||||
|
||||
/*
|
||||
* Process TPMI_INFO to get PCI device to CPU package ID.
|
||||
|
@ -315,17 +315,12 @@ struct ibm_init_struct {
|
||||
/* DMI Quirks */
|
||||
struct quirk_entry {
|
||||
bool btusb_bug;
|
||||
u32 s2idle_bug_mmio;
|
||||
};
|
||||
|
||||
static struct quirk_entry quirk_btusb_bug = {
|
||||
.btusb_bug = true,
|
||||
};
|
||||
|
||||
static struct quirk_entry quirk_s2idle_bug = {
|
||||
.s2idle_bug_mmio = 0xfed80380,
|
||||
};
|
||||
|
||||
static struct {
|
||||
u32 bluetooth:1;
|
||||
u32 hotkey:1;
|
||||
@ -4422,136 +4417,9 @@ static const struct dmi_system_id fwbug_list[] __initconst = {
|
||||
DMI_MATCH(DMI_BOARD_NAME, "20MV"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.ident = "L14 Gen2 AMD",
|
||||
.driver_data = &quirk_s2idle_bug,
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "20X5"),
|
||||
}
|
||||
},
|
||||
{
|
||||
.ident = "T14s Gen2 AMD",
|
||||
.driver_data = &quirk_s2idle_bug,
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "20XF"),
|
||||
}
|
||||
},
|
||||
{
|
||||
.ident = "X13 Gen2 AMD",
|
||||
.driver_data = &quirk_s2idle_bug,
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "20XH"),
|
||||
}
|
||||
},
|
||||
{
|
||||
.ident = "T14 Gen2 AMD",
|
||||
.driver_data = &quirk_s2idle_bug,
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "20XK"),
|
||||
}
|
||||
},
|
||||
{
|
||||
.ident = "T14 Gen1 AMD",
|
||||
.driver_data = &quirk_s2idle_bug,
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "20UD"),
|
||||
}
|
||||
},
|
||||
{
|
||||
.ident = "T14 Gen1 AMD",
|
||||
.driver_data = &quirk_s2idle_bug,
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "20UE"),
|
||||
}
|
||||
},
|
||||
{
|
||||
.ident = "T14s Gen1 AMD",
|
||||
.driver_data = &quirk_s2idle_bug,
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "20UH"),
|
||||
}
|
||||
},
|
||||
{
|
||||
.ident = "T14s Gen1 AMD",
|
||||
.driver_data = &quirk_s2idle_bug,
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "20UJ"),
|
||||
}
|
||||
},
|
||||
{
|
||||
.ident = "P14s Gen1 AMD",
|
||||
.driver_data = &quirk_s2idle_bug,
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "20Y1"),
|
||||
}
|
||||
},
|
||||
{
|
||||
.ident = "P14s Gen2 AMD",
|
||||
.driver_data = &quirk_s2idle_bug,
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "21A0"),
|
||||
}
|
||||
},
|
||||
{
|
||||
.ident = "P14s Gen2 AMD",
|
||||
.driver_data = &quirk_s2idle_bug,
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "21A1"),
|
||||
}
|
||||
},
|
||||
{}
|
||||
};
|
||||
|
||||
#ifdef CONFIG_SUSPEND
|
||||
/*
|
||||
* Lenovo laptops from a variety of generations run a SMI handler during the D3->D0
|
||||
* transition that occurs specifically when exiting suspend to idle which can cause
|
||||
* large delays during resume when the IOMMU translation layer is enabled (the default
|
||||
* behavior) for NVME devices:
|
||||
*
|
||||
* To avoid this firmware problem, skip the SMI handler on these machines before the
|
||||
* D0 transition occurs.
|
||||
*/
|
||||
static void thinkpad_acpi_amd_s2idle_restore(void)
|
||||
{
|
||||
struct resource *res;
|
||||
void __iomem *addr;
|
||||
u8 val;
|
||||
|
||||
res = request_mem_region_muxed(tp_features.quirks->s2idle_bug_mmio, 1,
|
||||
"thinkpad_acpi_pm80");
|
||||
if (!res)
|
||||
return;
|
||||
|
||||
addr = ioremap(tp_features.quirks->s2idle_bug_mmio, 1);
|
||||
if (!addr)
|
||||
goto cleanup_resource;
|
||||
|
||||
val = ioread8(addr);
|
||||
iowrite8(val & ~BIT(0), addr);
|
||||
|
||||
iounmap(addr);
|
||||
cleanup_resource:
|
||||
release_resource(res);
|
||||
kfree(res);
|
||||
}
|
||||
|
||||
static struct acpi_s2idle_dev_ops thinkpad_acpi_s2idle_dev_ops = {
|
||||
.restore = thinkpad_acpi_amd_s2idle_restore,
|
||||
};
|
||||
#endif
|
||||
|
||||
static const struct pci_device_id fwbug_cards_ids[] __initconst = {
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x24F3) },
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x24FD) },
|
||||
@ -11668,10 +11536,6 @@ static void thinkpad_acpi_module_exit(void)
|
||||
|
||||
tpacpi_lifecycle = TPACPI_LIFE_EXITING;
|
||||
|
||||
#ifdef CONFIG_SUSPEND
|
||||
if (tp_features.quirks && tp_features.quirks->s2idle_bug_mmio)
|
||||
acpi_unregister_lps0_dev(&thinkpad_acpi_s2idle_dev_ops);
|
||||
#endif
|
||||
if (tpacpi_hwmon)
|
||||
hwmon_device_unregister(tpacpi_hwmon);
|
||||
if (tp_features.sensors_pdrv_registered)
|
||||
@ -11861,13 +11725,6 @@ static int __init thinkpad_acpi_module_init(void)
|
||||
tp_features.input_device_registered = 1;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_SUSPEND
|
||||
if (tp_features.quirks && tp_features.quirks->s2idle_bug_mmio) {
|
||||
if (!acpi_register_lps0_dev(&thinkpad_acpi_s2idle_dev_ops))
|
||||
pr_info("Using s2idle quirk to avoid %s platform firmware bug\n",
|
||||
(dmi_id && dmi_id->ident) ? dmi_id->ident : "");
|
||||
}
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -26,6 +26,21 @@ struct ts_dmi_data {
|
||||
|
||||
/* NOTE: Please keep all entries sorted alphabetically */
|
||||
|
||||
static const struct property_entry archos_101_cesium_educ_props[] = {
|
||||
PROPERTY_ENTRY_U32("touchscreen-size-x", 1280),
|
||||
PROPERTY_ENTRY_U32("touchscreen-size-y", 1850),
|
||||
PROPERTY_ENTRY_BOOL("touchscreen-inverted-x"),
|
||||
PROPERTY_ENTRY_BOOL("touchscreen-swapped-x-y"),
|
||||
PROPERTY_ENTRY_U32("silead,max-fingers", 10),
|
||||
PROPERTY_ENTRY_STRING("firmware-name", "gsl1680-archos-101-cesium-educ.fw"),
|
||||
{ }
|
||||
};
|
||||
|
||||
static const struct ts_dmi_data archos_101_cesium_educ_data = {
|
||||
.acpi_name = "MSSL1680:00",
|
||||
.properties = archos_101_cesium_educ_props,
|
||||
};
|
||||
|
||||
static const struct property_entry chuwi_hi8_props[] = {
|
||||
PROPERTY_ENTRY_U32("touchscreen-size-x", 1665),
|
||||
PROPERTY_ENTRY_U32("touchscreen-size-y", 1140),
|
||||
@ -1047,6 +1062,13 @@ static const struct ts_dmi_data vinga_twizzle_j116_data = {
|
||||
|
||||
/* NOTE: Please keep this table sorted alphabetically */
|
||||
const struct dmi_system_id touchscreen_dmi_table[] = {
|
||||
{
|
||||
/* Archos 101 Cesium Educ */
|
||||
.driver_data = (void *)&archos_101_cesium_educ_data,
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "ARCHOS 101 Cesium Educ"),
|
||||
},
|
||||
},
|
||||
{
|
||||
/* Chuwi Hi8 */
|
||||
.driver_data = (void *)&chuwi_hi8_data,
|
||||
|
@ -136,6 +136,16 @@ static acpi_status find_guid(const char *guid_string, struct wmi_block **out)
|
||||
return AE_NOT_FOUND;
|
||||
}
|
||||
|
||||
static bool guid_parse_and_compare(const char *string, const guid_t *guid)
|
||||
{
|
||||
guid_t guid_input;
|
||||
|
||||
if (guid_parse(string, &guid_input))
|
||||
return false;
|
||||
|
||||
return guid_equal(&guid_input, guid);
|
||||
}
|
||||
|
||||
static const void *find_guid_context(struct wmi_block *wblock,
|
||||
struct wmi_driver *wdriver)
|
||||
{
|
||||
@ -146,11 +156,7 @@ static const void *find_guid_context(struct wmi_block *wblock,
|
||||
return NULL;
|
||||
|
||||
while (*id->guid_string) {
|
||||
guid_t guid_input;
|
||||
|
||||
if (guid_parse(id->guid_string, &guid_input))
|
||||
continue;
|
||||
if (guid_equal(&wblock->gblock.guid, &guid_input))
|
||||
if (guid_parse_and_compare(id->guid_string, &wblock->gblock.guid))
|
||||
return id->context;
|
||||
id++;
|
||||
}
|
||||
@ -895,11 +901,7 @@ static int wmi_dev_match(struct device *dev, struct device_driver *driver)
|
||||
return 0;
|
||||
|
||||
while (*id->guid_string) {
|
||||
guid_t driver_guid;
|
||||
|
||||
if (WARN_ON(guid_parse(id->guid_string, &driver_guid)))
|
||||
continue;
|
||||
if (guid_equal(&driver_guid, &wblock->gblock.guid))
|
||||
if (guid_parse_and_compare(id->guid_string, &wblock->gblock.guid))
|
||||
return 1;
|
||||
|
||||
id++;
|
||||
@ -1239,11 +1241,7 @@ static bool guid_already_parsed_for_legacy(struct acpi_device *device, const gui
|
||||
list_for_each_entry(wblock, &wmi_block_list, list) {
|
||||
/* skip warning and register if we know the driver will use struct wmi_driver */
|
||||
for (int i = 0; allow_duplicates[i] != NULL; i++) {
|
||||
guid_t tmp;
|
||||
|
||||
if (guid_parse(allow_duplicates[i], &tmp))
|
||||
continue;
|
||||
if (guid_equal(&tmp, guid))
|
||||
if (guid_parse_and_compare(allow_duplicates[i], guid))
|
||||
return false;
|
||||
}
|
||||
if (guid_equal(&wblock->gblock.guid, guid)) {
|
||||
|
Loading…
Reference in New Issue
Block a user