Re: [PATCH 7/8] platform/x86/amd: pmc: Get STB DRAM size from PMFW

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 




On 4/9/23 13:53, Shyam Sundar S K wrote:
Recent PMFW's have support for querying the STB DRAM size. Add this
support to the driver.

Co-developed-by: Sanket Goswami <Sanket.Goswami@xxxxxxx>
Signed-off-by: Sanket Goswami <Sanket.Goswami@xxxxxxx>
Signed-off-by: Shyam Sundar S K <Shyam-sundar.S-k@xxxxxxx>
---
  drivers/platform/x86/amd/pmc.c | 29 ++++++++++++++++++++++++++++-
  1 file changed, 28 insertions(+), 1 deletion(-)

diff --git a/drivers/platform/x86/amd/pmc.c b/drivers/platform/x86/amd/pmc.c
index b14d068a6474..86f32b01e3ff 100644
--- a/drivers/platform/x86/amd/pmc.c
+++ b/drivers/platform/x86/amd/pmc.c
@@ -114,6 +114,7 @@ enum s2d_arg {
  	S2D_PHYS_ADDR_LOW,
  	S2D_PHYS_ADDR_HIGH,
  	S2D_NUM_SAMPLES,
+	S2D_DRAM_SIZE,
  };
struct amd_pmc_bit_map {
@@ -146,6 +147,7 @@ struct amd_pmc_dev {
  	u32 base_addr;
  	u32 cpu_id;
  	u32 active_ips;
+	u32 dram_size;
  /* SMU version information */
  	u8 smu_program;
  	u8 major;
@@ -895,11 +897,31 @@ static const struct pci_device_id pmc_pci_ids[] = {
  	{ }
  };
+static int amd_pmc_get_dram_size(struct amd_pmc_dev *dev)
+{
+	if (dev->cpu_id != AMD_CPU_ID_YC)
+		goto err_dram_size;
+
+	if (dev->major > 90 || (dev->major == 90 && dev->minor > 39))
+		goto err_dram_size;

Is this only for YC and not for PS?

The version check I think you should make it clear it's only intended for this program.

switch(dev->cpu_id) {
case AMD_CPU_ID_YC:
    if (version_check)
        goto err_dram_size;
    break;

default:
    goto err_dram_size;

}

Then when it comes time to add another system it either will need a localized version check or it will just be supported and no check needed. Either way it
is cleaner in the code.

+
+	amd_pmc_send_cmd(dev, S2D_DRAM_SIZE, &dev->dram_size, STB_SPILL_TO_DRAM, 1);
+	if (!dev->dram_size)
+		goto err_dram_size;
+
+	return 0;
+
+err_dram_size:
+	dev_err(dev->dev, "DRAM size command not supported for this platform\n");
+	return -EINVAL;
+}
+
  static int amd_pmc_s2d_init(struct amd_pmc_dev *dev)
  {
  	u32 phys_addr_low, phys_addr_hi;
  	u64 stb_phys_addr;
  	u32 size = 0;
+	int ret;
/* Spill to DRAM feature uses separate SMU message port */
  	dev->msg_port = 1;
@@ -908,6 +930,11 @@ static int amd_pmc_s2d_init(struct amd_pmc_dev *dev)
  	if (size != S2D_TELEMETRY_BYTES_MAX)
  		return -EIO;
+ /* Get DRAM size */
+	ret = amd_pmc_get_dram_size(dev);
+	if (ret)
+		dev->dram_size = S2D_TELEMETRY_DRAMBYTES_MAX;
+
  	/* Get STB DRAM address */
  	amd_pmc_send_cmd(dev, S2D_PHYS_ADDR_LOW, &phys_addr_low, STB_SPILL_TO_DRAM, 1);
  	amd_pmc_send_cmd(dev, S2D_PHYS_ADDR_HIGH, &phys_addr_hi, STB_SPILL_TO_DRAM, 1);
@@ -917,7 +944,7 @@ static int amd_pmc_s2d_init(struct amd_pmc_dev *dev)
  	/* Clear msg_port for other SMU operation */
  	dev->msg_port = 0;
- dev->stb_virt_addr = devm_ioremap(dev->dev, stb_phys_addr, S2D_TELEMETRY_DRAMBYTES_MAX);
+	dev->stb_virt_addr = devm_ioremap(dev->dev, stb_phys_addr, dev->dram_size);
  	if (!dev->stb_virt_addr)
  		return -ENOMEM;



[Index of Archives]     [Linux Kernel Development]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux