Re: [PATCH v3 2/2] platform/x86/amd/pmc: Add dump_custom_stb module parameter

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

 



On Tue, 29 Aug 2023, Shyam Sundar S K wrote:

> 
> 
> On 8/29/2023 3:09 PM, Ilpo Järvinen wrote:
> > On Tue, 29 Aug 2023, Shyam Sundar S K wrote:
> > 
> >> There have been instances when the default size (1M) of the STB is not
> >> sufficient to get the complete traces of the failure. In such scenarios
> >> we can use a module_param to enable full trace that shall contain more
> >> debugging data. This is not a regular case and hence not enabling this
> >> capability by default.
> >>
> >> Co-developed-by: Harsh Jain <Harsh.Jain@xxxxxxx>
> >> Signed-off-by: Harsh Jain <Harsh.Jain@xxxxxxx>
> >> Signed-off-by: Sanket Goswami <Sanket.Goswami@xxxxxxx>
> >> Signed-off-by: Shyam Sundar S K <Shyam-sundar.S-k@xxxxxxx>
> >> ---
> >> v2->v3:
> >>  - no change
> >>
> >> v1->v2:
> >>  - rebase to 'review-hans' branch
> >>  - drop 2/4 of v1
> >>    (https://patchwork.kernel.org/project/platform-driver-x86/list/?series=775324&state=%2A&archive=both)
> >>
> >>  drivers/platform/x86/amd/pmc/pmc.c | 34 +++++++++++++++++++-----------
> >>  drivers/platform/x86/amd/pmc/pmc.h |  1 +
> >>  2 files changed, 23 insertions(+), 12 deletions(-)
> >>
> >> diff --git a/drivers/platform/x86/amd/pmc/pmc.c b/drivers/platform/x86/amd/pmc/pmc.c
> >> index 443bb78ea5f4..0e61ae74f1a9 100644
> >> --- a/drivers/platform/x86/amd/pmc/pmc.c
> >> +++ b/drivers/platform/x86/amd/pmc/pmc.c
> >> @@ -53,6 +53,7 @@
> >>  
> >>  /* STB Spill to DRAM Parameters */
> >>  #define S2D_TELEMETRY_BYTES_MAX		0x100000
> >> +#define S2D_TELEMETRY_FSIZE_MAX		0x200000
> >>  #define S2D_TELEMETRY_DRAMBYTES_MAX	0x1000000
> >>  
> >>  /* STB Spill to DRAM Message Definition */
> >> @@ -160,6 +161,10 @@ static bool disable_workarounds;
> >>  module_param(disable_workarounds, bool, 0644);
> >>  MODULE_PARM_DESC(disable_workarounds, "Disable workarounds for platform bugs");
> >>  
> >> +static bool dump_custom_stb;
> >> +module_param(dump_custom_stb, bool, 0644);
> >> +MODULE_PARM_DESC(dump_custom_stb, "Enable to dump full STB buffer");
> >> +
> >>  static struct amd_pmc_dev pmc;
> >>  static int amd_pmc_send_cmd(struct amd_pmc_dev *dev, u32 arg, u32 *data, u8 msg, bool ret);
> >>  static int amd_pmc_read_stb(struct amd_pmc_dev *dev, u32 *buf);
> >> @@ -239,7 +244,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, val, stb_rdptr_offset = 0;
> >> +	u32 *buf, num_samples, val, stb_rdptr_offset = 0;
> >>  	int ret;
> >>  
> >>  	/* Write dummy postcode while reading the STB buffer */
> >> @@ -247,10 +252,6 @@ static int amd_pmc_stb_debugfs_open_v2(struct inode *inode, struct file *filp)
> >>  	if (ret)
> >>  		dev_err(dev->dev, "error writing to STB: %d\n", ret);
> >>  
> >> -	buf = kzalloc(S2D_TELEMETRY_BYTES_MAX, GFP_KERNEL);
> >> -	if (!buf)
> >> -		return -ENOMEM;
> >> -
> >>  	/* Spill to DRAM num_samples uses separate SMU message port */
> >>  	dev->msg_port = 1;
> >>  
> >> @@ -264,20 +265,27 @@ static int amd_pmc_stb_debugfs_open_v2(struct inode *inode, struct file *filp)
> >>  	dev->msg_port = 0;
> >>  	if (ret) {
> >>  		dev_err(dev->dev, "error: S2D_NUM_SAMPLES not supported : %d\n", ret);
> >> -		kfree(buf);
> >>  		return ret;
> >>  	}
> >>  
> >>  	/* Start capturing data from the last push location */
> >> -	if (num_samples > S2D_TELEMETRY_BYTES_MAX) {
> >> -		fsize  = S2D_TELEMETRY_BYTES_MAX;
> >> -		stb_rdptr_offset = num_samples - fsize;
> >> +	if (dump_custom_stb &&
> >> +	    (dev->dram_size - S2D_TELEMETRY_BYTES_MAX <= S2D_TELEMETRY_FSIZE_MAX)) {
> >> +		dev->fsize = dev->dram_size - S2D_TELEMETRY_BYTES_MAX;
> >> +		stb_rdptr_offset = 0;
> >> +	} else if (num_samples > S2D_TELEMETRY_BYTES_MAX) {
> > 
> > I find the logic here somewhat suspicious in the first if check (I fail 
> > to follow the reasoning here despite spending considerable amount of time 
> > staring at it).
> > 
> > Lets assume dump_custom_stb is set. If dev->dram_size is large, the first 
> > if condition will be false because LHS of <= is large. Thus, we go to the 
> > second branch and dump exactly as many samples as before this patch. 
> > ...And that is opposite of what this patch claims to do?
> > 
> 
> Let me explain:
> 
> We have cases where the S2D (Spill to DRAM) STB (Smart Trace Buffer -
> which is meant to have debug data that gives information about the
> system conditions, be it success or failure.) may not fit in the current
> stb buffer size of 1M (i.e. S2D_TELEMETRY_BYTES_MAX). The stb buffer
> size of 1M is sufficient for most of the platforms, but there could be
> exceptions.
> 
> In those cases, the dram_size would be updated by the PMFW (Power
> Management Firmware) coupled with "dump_custom_stb" to fit into a custom
> requirement.
> 
> As an example (with this proposed change):
> 
> when dump_custom_stb is SET and dev->dram_size is 3M (received from
> PMFW) the first if() will be successful and it takes the corresponding
> code path.

Heh, I can see the numbers work in that case, however, the above still 
doesn't really explain why only S2D_TELEMETRY_BYTES_MAX is copied if 
dram_size - S2D_TELEMETRY_BYTES_MAX > S2D_TELEMETRY_FSIZE_MAX and not
S2D_TELEMETRY_FSIZE_MAX as I would expect?

-- 
 i.

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

  Powered by Linux