platform/x86/amd/pmc: Add PMFW command id to support S2D force flush
authorShyam Sundar S K <Shyam-sundar.S-k@amd.com>
Sun, 10 Sep 2023 14:20:33 +0000 (19:50 +0530)
committerIlpo Järvinen <ilpo.jarvinen@linux.intel.com>
Fri, 6 Oct 2023 09:57:22 +0000 (12:57 +0300)
Recent PMFW have the capability that can force flush the FIFO
contents to DRAM on sending a command id via the mailbox. Add this support
to the driver.

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/20230910142034.2967110-1-Shyam-sundar.S-k@amd.com
[ij: Corrected whitespace in dev_dbg_once()]
Reviewed-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
drivers/platform/x86/amd/pmc/pmc.c

index c1e788b67a74831fa6ae3bb88b203932b08c3512..922932a712335a77994f65c5615b96e19d127f0e 100644 (file)
@@ -55,6 +55,9 @@
 #define S2D_TELEMETRY_BYTES_MAX                0x100000
 #define S2D_TELEMETRY_DRAMBYTES_MAX    0x1000000
 
+/* STB Spill to DRAM Message Definition */
+#define STB_FORCE_FLUSH_DATA           0xCF
+
 /* Base address of SMU for mapping physical address to virtual address */
 #define AMD_PMC_MAPPING_SIZE           0x01000
 #define AMD_PMC_BASE_ADDR_OFFSET       0x10000
@@ -236,7 +239,7 @@ static const struct file_operations amd_pmc_stb_debugfs_fops = {
 static int amd_pmc_stb_debugfs_open_v2(struct inode *inode, struct file *filp)
 {
        struct amd_pmc_dev *dev = filp->f_inode->i_private;
-       u32 *buf, fsize, num_samples, stb_rdptr_offset = 0;
+       u32 *buf, fsize, num_samples, val, stb_rdptr_offset = 0;
        int ret;
 
        /* Write dummy postcode while reading the STB buffer */
@@ -251,6 +254,10 @@ static int amd_pmc_stb_debugfs_open_v2(struct inode *inode, struct file *filp)
        /* Spill to DRAM num_samples uses separate SMU message port */
        dev->msg_port = 1;
 
+       ret = amd_pmc_send_cmd(dev, 0, &val, STB_FORCE_FLUSH_DATA, 1);
+       if (ret)
+               dev_dbg_once(dev->dev, "S2D force flush not supported: %d\n", ret);
+
        /* Get the num_samples to calculate the last push location */
        ret = amd_pmc_send_cmd(dev, S2D_NUM_SAMPLES, &num_samples, dev->s2d_msg_id, true);
        /* Clear msg_port for other SMU operation */