RE: [PATCH v2] platform/x86: amd-pmc: Set QOS during suspend on CZN w/ timer wakeup

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

 



[Public]

> > Changes from v1->v2:
> >   * Update for Rafael's suggested changes:
> >     - fix resume comment
> >     - undo QoS at end of resume instead
> >     - Use smaller number for QoS to allow C1 entry
> >
> >   drivers/platform/x86/amd-pmc.c | 39 ++++++++++++++++++++++++++--
> ------
> >   1 file changed, 30 insertions(+), 9 deletions(-)
> >
> > diff --git a/drivers/platform/x86/amd-pmc.c b/drivers/platform/x86/amd-
> pmc.c
> > index 4c72ba68b315..248dc6735f5a 100644
> > --- a/drivers/platform/x86/amd-pmc.c
> > +++ b/drivers/platform/x86/amd-pmc.c
> > @@ -21,6 +21,7 @@
> >   #include <linux/module.h>
> >   #include <linux/pci.h>
> >   #include <linux/platform_device.h>
> > +#include <linux/pm_qos.h>
> >   #include <linux/rtc.h>
> >   #include <linux/suspend.h>
> >   #include <linux/seq_file.h>
> > @@ -131,6 +132,7 @@ struct amd_pmc_dev {
> >   	struct device *dev;
> >   	struct pci_dev *rdev;
> >   	struct mutex lock; /* generic mutex lock */
> > +	struct pm_qos_request amd_pmc_pm_qos_req;
> >   #if IS_ENABLED(CONFIG_DEBUG_FS)
> >   	struct dentry *dbgfs_dir;
> >   #endif /* CONFIG_DEBUG_FS */
> > @@ -521,6 +523,14 @@ static int amd_pmc_verify_czn_rtc(struct
> amd_pmc_dev *pdev, u32 *arg)
> >   	rc = rtc_alarm_irq_enable(rtc_device, 0);
> >   	dev_dbg(pdev->dev, "wakeup timer programmed for %lld
> seconds\n", duration);
> >
> > +	/*
> > +	 * Prevent CPUs from getting into idle states while running the code
> 
> This should be "into deep idle states" now.
> 
> 
> > +	 * below which is generally safe to run when none of the CPUs are in
> > +	 * idle states.
> > +	 */
> > +	cpu_latency_qos_update_request(&pdev-
> >amd_pmc_pm_qos_req, 3);
> 
> And I would define a symbol for the 3, possibly with a comment
> documenting it.  Something like
> AMD_PMC_SUSPEND_MAX_IDLE_STATE_LATENCY
> or similar.
> 
> With the above addressed, please feel free to add
> 
> Reviewed-by: Rafael J. Wysocki <rafael.j.wysocki@xxxxxxxxx>
> 
> to this patch.
> 
> And thanks for taking care of this!

Sure thing, will make those minor modifications and send up a v3 with your tag.
Really appreciate your help and suggestions here too.

> 
> 
> > +	wake_up_all_idle_cpus();
> > +
> >   	return rc;
> >   }
> >
> > @@ -538,24 +548,31 @@ static int __maybe_unused
> amd_pmc_suspend(struct device *dev)
> >   	/* Activate CZN specific RTC functionality */
> >   	if (pdev->cpu_id == AMD_CPU_ID_CZN) {
> >   		rc = amd_pmc_verify_czn_rtc(pdev, &arg);
> > -		if (rc < 0)
> > -			return rc;
> > +		if (rc)
> > +			goto fail;
> >   	}
> >
> >   	/* Dump the IdleMask before we send hint to SMU */
> >   	amd_pmc_idlemask_read(pdev, dev, NULL);
> >   	msg = amd_pmc_get_os_hint(pdev);
> >   	rc = amd_pmc_send_cmd(pdev, arg, NULL, msg, 0);
> > -	if (rc)
> > +	if (rc) {
> >   		dev_err(pdev->dev, "suspend failed\n");
> > +		goto fail;
> > +	}
> >
> >   	if (enable_stb)
> >   		rc = amd_pmc_write_stb(pdev, AMD_PMC_STB_PREDEF);
> > -	if (rc)	{
> > +	if (rc) {
> >   		dev_err(pdev->dev, "error writing to STB\n");
> > -		return rc;
> > +		goto fail;
> >   	}
> >
> > +	return 0;
> > +fail:
> > +	if (pdev->cpu_id == AMD_CPU_ID_CZN)
> > +		cpu_latency_qos_update_request(&pdev-
> >amd_pmc_pm_qos_req,
> > +						PM_QOS_DEFAULT_VALUE);
> >   	return rc;
> >   }
> >
> > @@ -579,12 +596,15 @@ static int __maybe_unused
> amd_pmc_resume(struct device *dev)
> >   	/* Write data incremented by 1 to distinguish in stb_read */
> >   	if (enable_stb)
> >   		rc = amd_pmc_write_stb(pdev, AMD_PMC_STB_PREDEF +
> 1);
> > -	if (rc)	{
> > +	if (rc)
> >   		dev_err(pdev->dev, "error writing to STB\n");
> > -		return rc;
> > -	}
> >
> > -	return 0;
> > +	/* Restore the QoS request back to defaults if it was set */
> > +	if (pdev->cpu_id == AMD_CPU_ID_CZN)
> > +		cpu_latency_qos_update_request(&pdev-
> >amd_pmc_pm_qos_req,
> > +						PM_QOS_DEFAULT_VALUE);
> > +
> > +	return rc;
> >   }
> >
> >   static const struct dev_pm_ops amd_pmc_pm_ops = {
> > @@ -722,6 +742,7 @@ static int amd_pmc_probe(struct platform_device
> *pdev)
> >   	amd_pmc_get_smu_version(dev);
> >   	platform_set_drvdata(pdev, dev);
> >   	amd_pmc_dbgfs_register(dev);
> > +	cpu_latency_qos_add_request(&dev->amd_pmc_pm_qos_req,
> PM_QOS_DEFAULT_VALUE);
> >   	return 0;
> >
> >   err_pci_dev_put:
> 




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

  Powered by Linux