platform/x86/amd: pmc: Move out of BIOS SMN pair for STB init
authorShyam Sundar S K <Shyam-sundar.S-k@amd.com>
Sun, 9 Apr 2023 18:53:46 +0000 (00:23 +0530)
committerHans de Goede <hdegoede@redhat.com>
Tue, 11 Apr 2023 08:37:30 +0000 (10:37 +0200)
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_6, 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: 426c0ff27b83 ("platform/x86: amd-pmc: Add support for AMD Smart Trace Buffer")
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-7-Shyam-sundar.S-k@amd.com
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
drivers/platform/x86/amd/pmc.c

index 256bd10f277e66f90de61cf08f8bea453736e671..b921d37ed706f0d977c16fdd40be25ece06f3634 100644 (file)
@@ -38,8 +38,6 @@
 #define AMD_PMC_SCRATCH_REG_YC         0xD14
 
 /* STB Registers */
-#define AMD_PMC_STB_INDEX_ADDRESS      0xF8
-#define AMD_PMC_STB_INDEX_DATA         0xFC
 #define AMD_PMC_STB_PMI_0              0x03E30600
 #define AMD_PMC_STB_S2IDLE_PREPARE     0xC6000001
 #define AMD_PMC_STB_S2IDLE_RESTORE     0xC6000002
@@ -923,17 +921,9 @@ static int amd_pmc_write_stb(struct amd_pmc_dev *dev, u32 data)
 {
        int err;
 
-       err = pci_write_config_dword(dev->rdev, AMD_PMC_STB_INDEX_ADDRESS, AMD_PMC_STB_PMI_0);
+       err = amd_smn_write(0, AMD_PMC_STB_PMI_0, data);
        if (err) {
-               dev_err(dev->dev, "failed to write addr in stb: 0x%X\n",
-                       AMD_PMC_STB_INDEX_ADDRESS);
-               return pcibios_err_to_errno(err);
-       }
-
-       err = pci_write_config_dword(dev->rdev, AMD_PMC_STB_INDEX_DATA, data);
-       if (err) {
-               dev_err(dev->dev, "failed to write data in stb: 0x%X\n",
-                       AMD_PMC_STB_INDEX_DATA);
+               dev_err(dev->dev, "failed to write data in stb: 0x%X\n", AMD_PMC_STB_PMI_0);
                return pcibios_err_to_errno(err);
        }
 
@@ -944,18 +934,10 @@ static int amd_pmc_read_stb(struct amd_pmc_dev *dev, u32 *buf)
 {
        int i, err;
 
-       err = pci_write_config_dword(dev->rdev, AMD_PMC_STB_INDEX_ADDRESS, AMD_PMC_STB_PMI_0);
-       if (err) {
-               dev_err(dev->dev, "error writing addr to stb: 0x%X\n",
-                       AMD_PMC_STB_INDEX_ADDRESS);
-               return pcibios_err_to_errno(err);
-       }
-
        for (i = 0; i < FIFO_SIZE; i++) {
-               err = pci_read_config_dword(dev->rdev, AMD_PMC_STB_INDEX_DATA, buf++);
+               err = amd_smn_read(0, AMD_PMC_STB_PMI_0, buf++);
                if (err) {
-                       dev_err(dev->dev, "error reading data from stb: 0x%X\n",
-                               AMD_PMC_STB_INDEX_DATA);
+                       dev_err(dev->dev, "error reading data from stb: 0x%X\n", AMD_PMC_STB_PMI_0);
                        return pcibios_err_to_errno(err);
                }
        }