mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-01-18 02:46:06 +00:00
platform/x86/amd: pmf: Add infrastructure for quirking supported funcs
In the event of a BIOS bug add infrastructure that will be utilized to override the return value for supported_funcs to avoid enabling features. Signed-off-by: Mario Limonciello <mario.limonciello@amd.com> Link: https://lore.kernel.org/r/20240410140956.385-2-mario.limonciello@amd.com Reviewed-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com> Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
This commit is contained in:
parent
03cea821b8
commit
ed13f622bc
@ -7,4 +7,4 @@
|
|||||||
obj-$(CONFIG_AMD_PMF) += amd-pmf.o
|
obj-$(CONFIG_AMD_PMF) += amd-pmf.o
|
||||||
amd-pmf-objs := core.o acpi.o sps.o \
|
amd-pmf-objs := core.o acpi.o sps.o \
|
||||||
auto-mode.o cnqf.o \
|
auto-mode.o cnqf.o \
|
||||||
tee-if.o spc.o
|
tee-if.o spc.o pmf-quirks.o
|
||||||
|
@ -343,7 +343,10 @@ static int apmf_if_verify_interface(struct amd_pmf_dev *pdev)
|
|||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
|
/* only set if not already set by a quirk */
|
||||||
|
if (!pdev->supported_func)
|
||||||
pdev->supported_func = output.supported_functions;
|
pdev->supported_func = output.supported_functions;
|
||||||
|
|
||||||
dev_dbg(pdev->dev, "supported functions:0x%x notifications:0x%x version:%u\n",
|
dev_dbg(pdev->dev, "supported functions:0x%x notifications:0x%x version:%u\n",
|
||||||
output.supported_functions, output.notification_mask, output.version);
|
output.supported_functions, output.notification_mask, output.version);
|
||||||
|
|
||||||
|
@ -445,6 +445,7 @@ static int amd_pmf_probe(struct platform_device *pdev)
|
|||||||
mutex_init(&dev->lock);
|
mutex_init(&dev->lock);
|
||||||
mutex_init(&dev->update_mutex);
|
mutex_init(&dev->update_mutex);
|
||||||
|
|
||||||
|
amd_pmf_quirks_init(dev);
|
||||||
apmf_acpi_init(dev);
|
apmf_acpi_init(dev);
|
||||||
platform_set_drvdata(pdev, dev);
|
platform_set_drvdata(pdev, dev);
|
||||||
amd_pmf_dbgfs_register(dev);
|
amd_pmf_dbgfs_register(dev);
|
||||||
|
43
drivers/platform/x86/amd/pmf/pmf-quirks.c
Normal file
43
drivers/platform/x86/amd/pmf/pmf-quirks.c
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
/*
|
||||||
|
* AMD Platform Management Framework Driver Quirks
|
||||||
|
*
|
||||||
|
* Copyright (c) 2024, Advanced Micro Devices, Inc.
|
||||||
|
* All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Author: Mario Limonciello <mario.limonciello@amd.com>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <linux/dmi.h>
|
||||||
|
|
||||||
|
#include "pmf.h"
|
||||||
|
|
||||||
|
struct quirk_entry {
|
||||||
|
u32 supported_func;
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct quirk_entry quirk_no_sps_bug = {
|
||||||
|
.supported_func = 0x4003,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct dmi_system_id fwbug_list[] = {
|
||||||
|
{}
|
||||||
|
};
|
||||||
|
|
||||||
|
void amd_pmf_quirks_init(struct amd_pmf_dev *dev)
|
||||||
|
{
|
||||||
|
const struct dmi_system_id *dmi_id;
|
||||||
|
struct quirk_entry *quirks;
|
||||||
|
|
||||||
|
dmi_id = dmi_first_match(fwbug_list);
|
||||||
|
if (!dmi_id)
|
||||||
|
return;
|
||||||
|
|
||||||
|
quirks = dmi_id->driver_data;
|
||||||
|
if (quirks->supported_func) {
|
||||||
|
dev->supported_func = quirks->supported_func;
|
||||||
|
pr_info("Using supported funcs quirk to avoid %s platform firmware bug\n",
|
||||||
|
dmi_id->ident);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -720,4 +720,7 @@ int apmf_check_smart_pc(struct amd_pmf_dev *pmf_dev);
|
|||||||
void amd_pmf_populate_ta_inputs(struct amd_pmf_dev *dev, struct ta_pmf_enact_table *in);
|
void amd_pmf_populate_ta_inputs(struct amd_pmf_dev *dev, struct ta_pmf_enact_table *in);
|
||||||
void amd_pmf_dump_ta_inputs(struct amd_pmf_dev *dev, struct ta_pmf_enact_table *in);
|
void amd_pmf_dump_ta_inputs(struct amd_pmf_dev *dev, struct ta_pmf_enact_table *in);
|
||||||
|
|
||||||
|
/* Quirk infrastructure */
|
||||||
|
void amd_pmf_quirks_init(struct amd_pmf_dev *dev);
|
||||||
|
|
||||||
#endif /* PMF_H */
|
#endif /* PMF_H */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user