Skip to content

Commit 310e782

Browse files
Shyam Sundar S Kjwrdegoede
authored andcommitted
platform/x86/amd: pmc: Utilize SMN index 0 for driver probe
The current SMN index used for the driver probe seems to be meant for the BIOS pair and there are potential concurrency problems that can occur with an inopportune SMI. It is been advised to use SMN_INDEX_0 instead of SMN_INDEX_2, which is what amd_nb.c provides and this function has protections to ensure that only one caller can use it at a time. Fixes: 156ec47 ("platform/x86: amd-pmc: Add AMD platform support for S2Idle") Co-developed-by: Sanket Goswami <Sanket.Goswami@amd.com> Signed-off-by: Sanket Goswami <Sanket.Goswami@amd.com> Signed-off-by: Shyam Sundar S K <Shyam-sundar.S-k@amd.com> Link: https://lore.kernel.org/r/20230409185348.556161-6-Shyam-sundar.S-k@amd.com Reviewed-by: Hans de Goede <hdegoede@redhat.com> Signed-off-by: Hans de Goede <hdegoede@redhat.com>
1 parent 9217bd1 commit 310e782

2 files changed

Lines changed: 6 additions & 19 deletions

File tree

drivers/platform/x86/amd/Kconfig

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ source "drivers/platform/x86/amd/pmf/Kconfig"
77

88
config AMD_PMC
99
tristate "AMD SoC PMC driver"
10-
depends on ACPI && PCI && RTC_CLASS
10+
depends on ACPI && PCI && RTC_CLASS && AMD_NB
1111
select SERIO
1212
help
1313
The driver provides support for AMD Power Management Controller

drivers/platform/x86/amd/pmc.c

Lines changed: 5 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
1212

13+
#include <asm/amd_nb.h>
1314
#include <linux/acpi.h>
1415
#include <linux/bitfield.h>
1516
#include <linux/bits.h>
@@ -56,8 +57,6 @@
5657
#define S2D_TELEMETRY_DRAMBYTES_MAX 0x1000000
5758

5859
/* Base address of SMU for mapping physical address to virtual address */
59-
#define AMD_PMC_SMU_INDEX_ADDRESS 0xB8
60-
#define AMD_PMC_SMU_INDEX_DATA 0xBC
6160
#define AMD_PMC_MAPPING_SIZE 0x01000
6261
#define AMD_PMC_BASE_ADDR_OFFSET 0x10000
6362
#define AMD_PMC_BASE_ADDR_LO 0x13B102E8
@@ -983,30 +982,18 @@ static int amd_pmc_probe(struct platform_device *pdev)
983982

984983
dev->cpu_id = rdev->device;
985984
dev->rdev = rdev;
986-
err = pci_write_config_dword(rdev, AMD_PMC_SMU_INDEX_ADDRESS, AMD_PMC_BASE_ADDR_LO);
987-
if (err) {
988-
dev_err(dev->dev, "error writing to 0x%x\n", AMD_PMC_SMU_INDEX_ADDRESS);
989-
err = pcibios_err_to_errno(err);
990-
goto err_pci_dev_put;
991-
}
992-
993-
err = pci_read_config_dword(rdev, AMD_PMC_SMU_INDEX_DATA, &val);
985+
err = amd_smn_read(0, AMD_PMC_BASE_ADDR_LO, &val);
994986
if (err) {
987+
dev_err(dev->dev, "error reading 0x%x\n", AMD_PMC_BASE_ADDR_LO);
995988
err = pcibios_err_to_errno(err);
996989
goto err_pci_dev_put;
997990
}
998991

999992
base_addr_lo = val & AMD_PMC_BASE_ADDR_HI_MASK;
1000993

1001-
err = pci_write_config_dword(rdev, AMD_PMC_SMU_INDEX_ADDRESS, AMD_PMC_BASE_ADDR_HI);
1002-
if (err) {
1003-
dev_err(dev->dev, "error writing to 0x%x\n", AMD_PMC_SMU_INDEX_ADDRESS);
1004-
err = pcibios_err_to_errno(err);
1005-
goto err_pci_dev_put;
1006-
}
1007-
1008-
err = pci_read_config_dword(rdev, AMD_PMC_SMU_INDEX_DATA, &val);
994+
err = amd_smn_read(0, AMD_PMC_BASE_ADDR_HI, &val);
1009995
if (err) {
996+
dev_err(dev->dev, "error reading 0x%x\n", AMD_PMC_BASE_ADDR_HI);
1010997
err = pcibios_err_to_errno(err);
1011998
goto err_pci_dev_put;
1012999
}

0 commit comments

Comments
 (0)