forked from torvalds/linux
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge tag 'platform-drivers-x86-v6.5-2' of git://git.kernel.org/pub/s…
…cm/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
- Loading branch information
Showing
12 changed files
with
276 additions
and
190 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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 <[email protected]> | ||
*/ | ||
|
||
#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); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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 <[email protected]> | ||
*/ | ||
|
||
#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 */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.