Re: [PATCH v2] platform/x86: amd-pmc: Validate entry into the deepest state on resume

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

 



Hi,

On 3/10/22 16:09, Mario Limonciello wrote:
> Currently the only way to discover if a system went into the deepest sleep
> state is to read from sysfs after you finished suspend.
> 
> To better illustrate to users that problems have occurred, check as part
> of resume and display a warning.
> 
> Signed-off-by: Mario Limonciello <mario.limonciello@xxxxxxx>

Thank you for your patch, I've applied this patch to my review-hans 
branch:
https://git.kernel.org/pub/scm/linux/kernel/git/pdx86/platform-drivers-x86.git/log/?h=review-hans

Note it will show up in my review-hans branch once I've pushed my
local branch there, which might take a while.

Once I've run some tests on this branch the patches there will be
added to the platform-drivers-x86/for-next branch and eventually
will be included in the pdx86 pull-request to Linus for the next
merge-window.

Regards,

Hans



> ---
> changes from v1->v2
>  * rebase on platform-x86.git/review-hans
>  drivers/platform/x86/amd-pmc.c | 29 ++++++++++++++++++++++++++---
>  1 file changed, 26 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/platform/x86/amd-pmc.c b/drivers/platform/x86/amd-pmc.c
> index fc0b4d628dec..971aaabaa9c8 100644
> --- a/drivers/platform/x86/amd-pmc.c
> +++ b/drivers/platform/x86/amd-pmc.c
> @@ -322,6 +322,28 @@ static int amd_pmc_idlemask_read(struct amd_pmc_dev *pdev, struct device *dev,
>  	return 0;
>  }
>  
> +static int get_metrics_table(struct amd_pmc_dev *pdev, struct smu_metrics *table)
> +{
> +	if (pdev->cpu_id == AMD_CPU_ID_PCO)
> +		return -ENODEV;
> +	memcpy_fromio(table, pdev->smu_virt_addr, sizeof(struct smu_metrics));
> +	return 0;
> +}
> +
> +static void amd_pmc_validate_deepest(struct amd_pmc_dev *pdev)
> +{
> +	struct smu_metrics table;
> +
> +	if (get_metrics_table(pdev, &table))
> +		return;
> +
> +	if (!table.s0i3_last_entry_status)
> +		dev_warn(pdev->dev, "Last suspend didn't reach deepest state\n");
> +	else
> +		dev_dbg(pdev->dev, "Last suspend in deepest state for %lluus\n",
> +			 table.timein_s0i3_lastcapture);
> +}
> +
>  #ifdef CONFIG_DEBUG_FS
>  static int smu_fw_info_show(struct seq_file *s, void *unused)
>  {
> @@ -329,11 +351,9 @@ static int smu_fw_info_show(struct seq_file *s, void *unused)
>  	struct smu_metrics table;
>  	int idx;
>  
> -	if (dev->cpu_id == AMD_CPU_ID_PCO)
> +	if (get_metrics_table(dev, &table))
>  		return -EINVAL;
>  
> -	memcpy_fromio(&table, dev->smu_virt_addr, sizeof(struct smu_metrics));
> -
>  	seq_puts(s, "\n=== SMU Statistics ===\n");
>  	seq_printf(s, "Table Version: %d\n", table.table_version);
>  	seq_printf(s, "Hint Count: %d\n", table.hint_count);
> @@ -689,6 +709,9 @@ static int __maybe_unused amd_pmc_resume(struct device *dev)
>  		cpu_latency_qos_update_request(&pdev->amd_pmc_pm_qos_req,
>  						PM_QOS_DEFAULT_VALUE);
>  
> +	/* Notify on failed entry */
> +	amd_pmc_validate_deepest(pdev);
> +
>  	return rc;
>  }
>  




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

  Powered by Linux