[Linux-kernel-mentees] [PATCH v1] crypto: ccp: sp-pci: use generic power management

Tom Lendacky thomas.lendacky at amd.com
Tue Jul 21 17:15:13 UTC 2020


On 7/21/20 11:30 AM, Vaibhav Gupta wrote:
> On Tue, Jul 21, 2020 at 10:19:33AM -0500, Tom Lendacky wrote:
>> On 7/21/20 7:31 AM, Vaibhav Gupta wrote:
>>> Drivers using legacy power management .suspen()/.resume() callbacks
>>> have to manage PCI states and device's PM states themselves. They also
>>> need to take care of standard configuration registers.
>>>
>>> Switch to generic power management framework using a single
>>> "struct dev_pm_ops" variable to take the unnecessary load from the driver.
>>> This also avoids the need for the driver to directly call most of the PCI
>>> helper functions and device power state control functions as through
>>> the generic framework, PCI Core takes care of the necessary operations,
>>> and drivers are required to do only device-specific jobs.
>>>
>>> Signed-off-by: Vaibhav Gupta <vaibhavgupta40 at gmail.com>
>>> ---
>>>  drivers/crypto/ccp/ccp-dev.c     |  8 +++-----
>>>  drivers/crypto/ccp/sp-dev.c      |  6 ++----
>>>  drivers/crypto/ccp/sp-dev.h      |  6 +++---
>>>  drivers/crypto/ccp/sp-pci.c      | 17 ++++++-----------
>>>  drivers/crypto/ccp/sp-platform.c |  2 +-
>>>  5 files changed, 15 insertions(+), 24 deletions(-)
>>>
>>> diff --git a/drivers/crypto/ccp/ccp-dev.c b/drivers/crypto/ccp/ccp-dev.c
>>> index 19ac509ed76e..8ae26d3cffff 100644
>>> --- a/drivers/crypto/ccp/ccp-dev.c
>>> +++ b/drivers/crypto/ccp/ccp-dev.c
>>> @@ -531,8 +531,7 @@ int ccp_trng_read(struct hwrng *rng, void *data, size_t max, bool wait)
>>>  	return len;
>>>  }
>>>  
>>> -#ifdef CONFIG_PM
>>> -bool ccp_queues_suspended(struct ccp_device *ccp)
>>> +bool __maybe_unused ccp_queues_suspended(struct ccp_device *ccp)
>>
>> These aren't static functions, so is the __maybe_unused necessary?
>>
>> (Same comment on the other non-static functions changed below)
>>
>>>  {
>>>  	unsigned int suspended = 0;
>>>  	unsigned long flags;
>>> @@ -549,7 +548,7 @@ bool ccp_queues_suspended(struct ccp_device *ccp)
>>>  	return ccp->cmd_q_count == suspended;
>>>  }
>>>  
>>> -int ccp_dev_suspend(struct sp_device *sp, pm_message_t state)
>>> +int __maybe_unused ccp_dev_suspend(struct sp_device *sp)
>>>  {
>>>  	struct ccp_device *ccp = sp->ccp_data;
>>>  	unsigned long flags;
>>> @@ -577,7 +576,7 @@ int ccp_dev_suspend(struct sp_device *sp, pm_message_t state)
>>>  	return 0;
>>>  }
>>>  
>>> -int ccp_dev_resume(struct sp_device *sp)
>>> +int __maybe_unused ccp_dev_resume(struct sp_device *sp)
>>>  {
>>>  	struct ccp_device *ccp = sp->ccp_data;
>>>  	unsigned long flags;
>>> @@ -601,7 +600,6 @@ int ccp_dev_resume(struct sp_device *sp)
>>>  
>>>  	return 0;
>>>  }
>>> -#endif
>>>  
>>>  int ccp_dev_init(struct sp_device *sp)
>>>  {
>>> diff --git a/drivers/crypto/ccp/sp-dev.c b/drivers/crypto/ccp/sp-dev.c
>>> index ce42675d3274..6284a15e5047 100644
>>> --- a/drivers/crypto/ccp/sp-dev.c
>>> +++ b/drivers/crypto/ccp/sp-dev.c
>>> @@ -211,13 +211,12 @@ void sp_destroy(struct sp_device *sp)
>>>  	sp_del_device(sp);
>>>  }
>>>  
>>> -#ifdef CONFIG_PM
>>> -int sp_suspend(struct sp_device *sp, pm_message_t state)
>>> +int sp_suspend(struct sp_device *sp)
>>>  {
>>>  	int ret;
>>>  
>>>  	if (sp->dev_vdata->ccp_vdata) {
>>> -		ret = ccp_dev_suspend(sp, state);
>>> +		ret = ccp_dev_suspend(sp);
>>>  		if (ret)
>>>  			return ret;
>>>  	}
>>> @@ -237,7 +236,6 @@ int sp_resume(struct sp_device *sp)
>>>  
>>>  	return 0;
>>>  }
>>> -#endif
>>>  
>>>  struct sp_device *sp_get_psp_master_device(void)
>>>  {
>>> diff --git a/drivers/crypto/ccp/sp-dev.h b/drivers/crypto/ccp/sp-dev.h
>>> index f913f1494af9..0218d0670eee 100644
>>> --- a/drivers/crypto/ccp/sp-dev.h
>>> +++ b/drivers/crypto/ccp/sp-dev.h
>>> @@ -119,7 +119,7 @@ int sp_init(struct sp_device *sp);
>>>  void sp_destroy(struct sp_device *sp);
>>>  struct sp_device *sp_get_master(void);
>>>  
>>> -int sp_suspend(struct sp_device *sp, pm_message_t state);
>>> +int sp_suspend(struct sp_device *sp);
>>>  int sp_resume(struct sp_device *sp);
>>>  int sp_request_ccp_irq(struct sp_device *sp, irq_handler_t handler,
>>>  		       const char *name, void *data);
>>> @@ -134,7 +134,7 @@ struct sp_device *sp_get_psp_master_device(void);
>>>  int ccp_dev_init(struct sp_device *sp);
>>>  void ccp_dev_destroy(struct sp_device *sp);
>>>  
>>> -int ccp_dev_suspend(struct sp_device *sp, pm_message_t state);
>>> +int ccp_dev_suspend(struct sp_device *sp);
>>>  int ccp_dev_resume(struct sp_device *sp);
>>>  
>>>  #else	/* !CONFIG_CRYPTO_DEV_SP_CCP */
>>> @@ -145,7 +145,7 @@ static inline int ccp_dev_init(struct sp_device *sp)
>>>  }
>>>  static inline void ccp_dev_destroy(struct sp_device *sp) { }
>>>  
>>> -static inline int ccp_dev_suspend(struct sp_device *sp, pm_message_t state)
>>> +static inline int ccp_dev_suspend(struct sp_device *sp)
>>>  {
>>>  	return 0;
>>>  }
>>> diff --git a/drivers/crypto/ccp/sp-pci.c b/drivers/crypto/ccp/sp-pci.c
>>> index cb6cb47053f4..f471dbaef1fb 100644
>>> --- a/drivers/crypto/ccp/sp-pci.c
>>> +++ b/drivers/crypto/ccp/sp-pci.c
>>> @@ -252,23 +252,19 @@ static void sp_pci_remove(struct pci_dev *pdev)
>>>  	sp_free_irqs(sp);
>>>  }
>>>  
>>> -#ifdef CONFIG_PM
>>> -static int sp_pci_suspend(struct pci_dev *pdev, pm_message_t state)
>>> +static int __maybe_unused sp_pci_suspend(struct device *dev)
>>>  {
>>> -	struct device *dev = &pdev->dev;
>>>  	struct sp_device *sp = dev_get_drvdata(dev);
>>>  
>>> -	return sp_suspend(sp, state);
>>> +	return sp_suspend(sp);
>>>  }
>>>  
>>> -static int sp_pci_resume(struct pci_dev *pdev)
>>> +static int __maybe_unused sp_pci_resume(struct device *dev)
>>>  {
>>> -	struct device *dev = &pdev->dev;
>>>  	struct sp_device *sp = dev_get_drvdata(dev);
>>>  
>>>  	return sp_resume(sp);
>>>  }
>>> -#endif
>>>  
>>>  #ifdef CONFIG_CRYPTO_DEV_SP_PSP
>>>  static const struct sev_vdata sevv1 = {
>>> @@ -365,15 +361,14 @@ static const struct pci_device_id sp_pci_table[] = {
>>>  };
>>>  MODULE_DEVICE_TABLE(pci, sp_pci_table);
>>>  
>>> +static SIMPLE_DEV_PM_OPS(sp_pci_pm_ops, sp_pci_suspend, sp_pci_resume);
>>> +
>>>  static struct pci_driver sp_pci_driver = {
>>>  	.name = "ccp",
>>>  	.id_table = sp_pci_table,
>>>  	.probe = sp_pci_probe,
>>>  	.remove = sp_pci_remove,
>>> -#ifdef CONFIG_PM
>>> -	.suspend = sp_pci_suspend,
>>> -	.resume = sp_pci_resume,
>>> -#endif
>>> +	.driver.pm = &sp_pci_pm_ops,
>>>  };
>>>  
>>>  int sp_pci_init(void)
>>> diff --git a/drivers/crypto/ccp/sp-platform.c b/drivers/crypto/ccp/sp-platform.c
>>> index 831aac1393a2..9dba52fbee99 100644
>>> --- a/drivers/crypto/ccp/sp-platform.c
>>> +++ b/drivers/crypto/ccp/sp-platform.c
>>
>> This file use the same "#ifdef CONFIG_PM" to define the suspend and resume
>> functions (see sp_platform_driver variable). Doesn't that need to be
>> updated similar to sp-pci.c? Not sure how this compile tested successfully
>> unless your kernel config didn't have CONFIG_PM defined?
> I am not sure but my .config file has "CONFIG_PM=y"

Ok, my miss on that, you didn't update the sp_platform_suspend signature,
so no issue there.

> 
> The motive is update PM of sp-pci. Months ago, we decided to remove
> "#ifdef CONFIG_PM" container and mark the callbacks as __maybe_unused.

Is this being done only for struct pci_driver structures then? Or will
there be a follow on effort for struct platform_driver structures?

I can see the need for the __maybe_unused on the sp_pci_suspend() and
sp_pci_resume() functions since those are static functions that may cause
warnings depending on whether CONFIG_PM_SLEEP is defined or not.

The ccp_dev_suspend() and ccp_dev_resume() functions, though, are external
functions that I would think shouldn't require the __may_unused attribute
because the compiler wouldn't know if they are invoked or not within that
file (similar to how the sp_suspend() and sp_resume() weren't modified to
include the __maybe_unused attribute).  Can you try a compile test without
changing those functions and without CONFIG_PM=y and see if you run into
issues?

Thanks,
Tom

> Hence, I did similar changes to all files on which sp-pci is dependent.
> 
> This caused change in function defintion and declaration of sp_suspend().
> 
> sp-pci is not depended upon sp-platform. sp-platform was modified only because
> it also invoked sp_suspend() which got modified.
> 
> Thus, I didn't made any other changes to sp-platofrm.
> 
> Thanks
> Vaibhav Gupta
>>
>> Thanks,
>> Tom
>>
>>> @@ -207,7 +207,7 @@ static int sp_platform_suspend(struct platform_device *pdev,
>>>  	struct device *dev = &pdev->dev;
>>>  	struct sp_device *sp = dev_get_drvdata(dev);
>>>  
>>> -	return sp_suspend(sp, state);
>>> +	return sp_suspend(sp);
>>>  }
>>>  
>>>  static int sp_platform_resume(struct platform_device *pdev)
>>>


More information about the Linux-kernel-mentees mailing list