]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
platform/x86/amd/pmf: Move out of BIOS SMN pair for driver probe
authorShyam Sundar S K <Shyam-sundar.S-k@amd.com>
Thu, 6 Apr 2023 16:48:07 +0000 (22:18 +0530)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 11 May 2023 14:11:05 +0000 (23:11 +0900)
[ Upstream commit aec8298c093f052fc8a86f9411b69b23953b0edb ]

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: da5ce22df5fe ("platform/x86/amd/pmf: Add support for PMF core layer")
Co-developed-by: Patil Rajesh Reddy <Patil.Reddy@amd.com>
Signed-off-by: Patil Rajesh Reddy <Patil.Reddy@amd.com>
Signed-off-by: Shyam Sundar S K <Shyam-sundar.S-k@amd.com>
Link: https://lore.kernel.org/r/20230406164807.50969-4-Shyam-sundar.S-k@amd.com
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/platform/x86/amd/pmf/Kconfig
drivers/platform/x86/amd/pmf/core.c

index 6d89528c31779f2ac5710892354a28a8d193334f..d87986adf91e160267921640446c2e04d96f636f 100644 (file)
@@ -7,6 +7,7 @@ config AMD_PMF
        tristate "AMD Platform Management Framework"
        depends on ACPI && PCI
        depends on POWER_SUPPLY
+       depends on AMD_NB
        select ACPI_PLATFORM_PROFILE
        help
          This driver provides support for the AMD Platform Management Framework.
index da23639071d798c4ecfb170bd172771bb32c6375..0acc0b6221290bee8089b703b68d554dee74014b 100644 (file)
@@ -8,6 +8,7 @@
  * Author: Shyam Sundar S K <Shyam-sundar.S-k@amd.com>
  */
 
+#include <asm/amd_nb.h>
 #include <linux/debugfs.h>
 #include <linux/iopoll.h>
 #include <linux/module.h>
@@ -22,8 +23,6 @@
 #define AMD_PMF_REGISTER_ARGUMENT      0xA58
 
 /* Base address of SMU for mapping physical address to virtual address */
-#define AMD_PMF_SMU_INDEX_ADDRESS      0xB8
-#define AMD_PMF_SMU_INDEX_DATA         0xBC
 #define AMD_PMF_MAPPING_SIZE           0x01000
 #define AMD_PMF_BASE_ADDR_OFFSET       0x10000
 #define AMD_PMF_BASE_ADDR_LO           0x13B102E8
@@ -348,30 +347,19 @@ static int amd_pmf_probe(struct platform_device *pdev)
        }
 
        dev->cpu_id = rdev->device;
-       err = pci_write_config_dword(rdev, AMD_PMF_SMU_INDEX_ADDRESS, AMD_PMF_BASE_ADDR_LO);
-       if (err) {
-               dev_err(dev->dev, "error writing to 0x%x\n", AMD_PMF_SMU_INDEX_ADDRESS);
-               pci_dev_put(rdev);
-               return pcibios_err_to_errno(err);
-       }
 
-       err = pci_read_config_dword(rdev, AMD_PMF_SMU_INDEX_DATA, &val);
+       err = amd_smn_read(0, AMD_PMF_BASE_ADDR_LO, &val);
        if (err) {
+               dev_err(dev->dev, "error in reading from 0x%x\n", AMD_PMF_BASE_ADDR_LO);
                pci_dev_put(rdev);
                return pcibios_err_to_errno(err);
        }
 
        base_addr_lo = val & AMD_PMF_BASE_ADDR_HI_MASK;
 
-       err = pci_write_config_dword(rdev, AMD_PMF_SMU_INDEX_ADDRESS, AMD_PMF_BASE_ADDR_HI);
-       if (err) {
-               dev_err(dev->dev, "error writing to 0x%x\n", AMD_PMF_SMU_INDEX_ADDRESS);
-               pci_dev_put(rdev);
-               return pcibios_err_to_errno(err);
-       }
-
-       err = pci_read_config_dword(rdev, AMD_PMF_SMU_INDEX_DATA, &val);
+       err = amd_smn_read(0, AMD_PMF_BASE_ADDR_HI, &val);
        if (err) {
+               dev_err(dev->dev, "error in reading from 0x%x\n", AMD_PMF_BASE_ADDR_HI);
                pci_dev_put(rdev);
                return pcibios_err_to_errno(err);
        }