On Wed, 12 Apr 2023, 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> > --- > v2: > - Based on review-hans branch > - Add a switch for cpu-id check based on feedback from Mario. > > drivers/platform/x86/amd/pmc.c | 32 +++++++++++++++++++++++++++++++- > 1 file changed, 31 insertions(+), 1 deletion(-) > > diff --git a/drivers/platform/x86/amd/pmc.c b/drivers/platform/x86/amd/pmc.c > index 877b629e5cae..9f8bc6711413 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; > @@ -888,11 +890,34 @@ static const struct pci_device_id pmc_pci_ids[] = { > { } > }; > > +static int amd_pmc_get_dram_size(struct amd_pmc_dev *dev) > +{ > + switch (dev->cpu_id) { > + case AMD_CPU_ID_YC: > + if (!(dev->major > 90 || (dev->major == 90 && dev->minor > 39))) > + goto err_dram_size; > + break; > + default: > + goto err_dram_size; > + } > + > + amd_pmc_send_cmd(dev, S2D_DRAM_SIZE, &dev->dram_size, STB_SPILL_TO_DRAM, 1); Passing true to bool argument, not 1. > + if (!dev->dram_size) > + goto err_dram_size; Don't overwrite the error code from amd_pmc_send_cmd() with -EINVAL on the error path but pass the same errorcode on. It might warrant splitting the error path such that the amd_pmc_send_cmd() errors do not print the error in this function but only return the error code (amd_pmc_send_cmd() already has dev_err() for each of the error return cases). That only leaves what to do on non-error return and zero dram_size, is that expected to happen? -- i. > + > + 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; > @@ -901,6 +926,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); > @@ -910,7 +940,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; > >