diff mbox series

[v5,1/4] PCI: endpoint: Add D-state change notifier support

Message ID 1690948281-2143-2-git-send-email-quic_krichai@quicinc.com
State New
Headers show
Series [v5,1/4] PCI: endpoint: Add D-state change notifier support | expand

Commit Message

Krishna Chaitanya Chundru Aug. 2, 2023, 3:51 a.m. UTC
Add support to notify the EPF device about the D-state change event
from the EPC device.

Signed-off-by: Krishna chaitanya chundru <quic_krichai@quicinc.com>
---
 Documentation/PCI/endpoint/pci-endpoint.rst |  4 ++++
 drivers/pci/endpoint/pci-epc-core.c         | 27 +++++++++++++++++++++++++++
 include/linux/pci-epc.h                     |  1 +
 include/linux/pci-epf.h                     |  1 +
 4 files changed, 33 insertions(+)

Comments

Bjorn Helgaas Aug. 3, 2023, 5:48 p.m. UTC | #1
On Wed, Aug 02, 2023 at 09:21:18AM +0530, Krishna chaitanya chundru wrote:
> Add support to notify the EPF device about the D-state change event
> from the EPC device.
> 
> Signed-off-by: Krishna chaitanya chundru <quic_krichai@quicinc.com>
> ---
>  Documentation/PCI/endpoint/pci-endpoint.rst |  4 ++++
>  drivers/pci/endpoint/pci-epc-core.c         | 27 +++++++++++++++++++++++++++
>  include/linux/pci-epc.h                     |  1 +
>  include/linux/pci-epf.h                     |  1 +
>  4 files changed, 33 insertions(+)
> 
> diff --git a/Documentation/PCI/endpoint/pci-endpoint.rst b/Documentation/PCI/endpoint/pci-endpoint.rst
> index 4f5622a..66f3191 100644
> --- a/Documentation/PCI/endpoint/pci-endpoint.rst
> +++ b/Documentation/PCI/endpoint/pci-endpoint.rst
> @@ -78,6 +78,10 @@ by the PCI controller driver.
>     Cleanup the pci_epc_mem structure allocated during pci_epc_mem_init().
>  
>  
> +* pci_epc_dstate_notity()

s/notity/notify/ (several instances)

> +
> +   Notify all the function drivers that the EPC device has changed its D-state.
> +
>  EPC APIs for the PCI Endpoint Function Driver
>  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>  
> diff --git a/drivers/pci/endpoint/pci-epc-core.c b/drivers/pci/endpoint/pci-epc-core.c
> index 6c54fa5..4cf9c82 100644
> --- a/drivers/pci/endpoint/pci-epc-core.c
> +++ b/drivers/pci/endpoint/pci-epc-core.c
> @@ -785,6 +785,33 @@ void pci_epc_bme_notify(struct pci_epc *epc)
>  EXPORT_SYMBOL_GPL(pci_epc_bme_notify);
>  
>  /**
> + * pci_epc_dstate_notity() - Notify the EPF driver that EPC device D-state
> + *			has changed
> + * @epc: the EPC device which has change in D-state
> + * @state: the changed D-state
> + *
> + * Invoke to Notify the EPF device that the EPC device has D-state has
> + * changed.

s/device has D-state/device D-state/

> + */
> +void pci_epc_dstate_notity(struct pci_epc *epc, pci_power_t state)
> +{
> +	struct pci_epf *epf;
> +
> +	if (!epc || IS_ERR(epc))
> +		return;

Is this needed?  Looks like a programming error if we return here.  I
don't like silently ignoring errors like this.  I generally prefer
taking the NULL pointer dereference oops so we know the caller is
broken and can fix it.

> +	mutex_lock(&epc->list_lock);
> +	list_for_each_entry(epf, &epc->pci_epf, list) {
> +		mutex_lock(&epf->lock);
> +		if (epf->event_ops && epf->event_ops->dstate_notify)
> +			epf->event_ops->dstate_notify(epf, state);
> +		mutex_unlock(&epf->lock);
> +	}
> +	mutex_unlock(&epc->list_lock);
> +}
> +EXPORT_SYMBOL_GPL(pci_epc_dstate_notity);
> +
> +/**
>   * pci_epc_destroy() - destroy the EPC device
>   * @epc: the EPC device that has to be destroyed
>   *
> diff --git a/include/linux/pci-epc.h b/include/linux/pci-epc.h
> index 5cb6940..26a1108 100644
> --- a/include/linux/pci-epc.h
> +++ b/include/linux/pci-epc.h
> @@ -251,4 +251,5 @@ void __iomem *pci_epc_mem_alloc_addr(struct pci_epc *epc,
>  				     phys_addr_t *phys_addr, size_t size);
>  void pci_epc_mem_free_addr(struct pci_epc *epc, phys_addr_t phys_addr,
>  			   void __iomem *virt_addr, size_t size);
> +void pci_epc_dstate_change(struct pci_epc *epc, pci_power_t state);
>  #endif /* __LINUX_PCI_EPC_H */
> diff --git a/include/linux/pci-epf.h b/include/linux/pci-epf.h
> index 3f44b6a..529075b 100644
> --- a/include/linux/pci-epf.h
> +++ b/include/linux/pci-epf.h
> @@ -79,6 +79,7 @@ struct pci_epc_event_ops {
>  	int (*link_up)(struct pci_epf *epf);
>  	int (*link_down)(struct pci_epf *epf);
>  	int (*bme)(struct pci_epf *epf);
> +	int (*dstate_notify)(struct pci_epf *epf, pci_power_t state);
>  };
>  
>  /**
> -- 
> 2.7.4
>
Manivannan Sadhasivam Aug. 23, 2023, 6:19 a.m. UTC | #2
On Wed, Aug 02, 2023 at 01:14:44PM +0800, kernel test robot wrote:
> Hi Krishna,
> 
> kernel test robot noticed the following build warnings:
> 
> [auto build test WARNING on pci/next]
> [also build test WARNING on pci/for-linus linus/master v6.5-rc4 next-20230801]
> [If your patch is applied to the wrong git tree, kindly drop us a note.
> And when submitting patch, we suggest to use '--base' as documented in
> https://git-scm.com/docs/git-format-patch#_base_tree_information]
> 
> url:    https://github.com/intel-lab-lkp/linux/commits/Krishna-chaitanya-chundru/PCI-endpoint-Add-D-state-change-notifier-support/20230802-115309
> base:   https://git.kernel.org/pub/scm/linux/kernel/git/pci/pci.git next
> patch link:    https://lore.kernel.org/r/1690948281-2143-2-git-send-email-quic_krichai%40quicinc.com
> patch subject: [PATCH v5 1/4] PCI: endpoint: Add D-state change notifier support
> config: loongarch-allyesconfig (https://download.01.org/0day-ci/archive/20230802/202308021312.obgu7FWM-lkp@intel.com/config)
> compiler: loongarch64-linux-gcc (GCC) 12.3.0
> reproduce: (https://download.01.org/0day-ci/archive/20230802/202308021312.obgu7FWM-lkp@intel.com/reproduce)
> 
> If you fix the issue in a separate patch/commit (i.e. not just a new version of
> the same patch/commit), kindly add following tags
> | Reported-by: kernel test robot <lkp@intel.com>
> | Closes: https://lore.kernel.org/oe-kbuild-all/202308021312.obgu7FWM-lkp@intel.com/
> 
> All warnings (new ones prefixed by >>):
> 
> >> drivers/pci/endpoint/pci-epc-core.c:795:6: warning: no previous prototype for 'pci_epc_dstate_notity' [-Wmissing-prototypes]
>      795 | void pci_epc_dstate_notity(struct pci_epc *epc, pci_power_t state)

This tells that you haven't build tested the series before sending. Please
always do both build and functionality testing before sending each iteration.

- Mani

>          |      ^~~~~~~~~~~~~~~~~~~~~
> 
> 
> vim +/pci_epc_dstate_notity +795 drivers/pci/endpoint/pci-epc-core.c
> 
>    785	
>    786	/**
>    787	 * pci_epc_dstate_notity() - Notify the EPF driver that EPC device D-state
>    788	 *			has changed
>    789	 * @epc: the EPC device which has change in D-state
>    790	 * @state: the changed D-state
>    791	 *
>    792	 * Invoke to Notify the EPF device that the EPC device has D-state has
>    793	 * changed.
>    794	 */
>  > 795	void pci_epc_dstate_notity(struct pci_epc *epc, pci_power_t state)
>    796	{
>    797		struct pci_epf *epf;
>    798	
>    799		if (!epc || IS_ERR(epc))
>    800			return;
>    801	
>    802		mutex_lock(&epc->list_lock);
>    803		list_for_each_entry(epf, &epc->pci_epf, list) {
>    804			mutex_lock(&epf->lock);
>    805			if (epf->event_ops && epf->event_ops->dstate_notify)
>    806				epf->event_ops->dstate_notify(epf, state);
>    807			mutex_unlock(&epf->lock);
>    808		}
>    809		mutex_unlock(&epc->list_lock);
>    810	}
>    811	EXPORT_SYMBOL_GPL(pci_epc_dstate_notity);
>    812	
> 
> -- 
> 0-DAY CI Kernel Test Service
> https://github.com/intel/lkp-tests/wiki
Krishna Chaitanya Chundru Sept. 8, 2023, 4:41 a.m. UTC | #3
On 8/3/2023 11:18 PM, Bjorn Helgaas wrote:
> On Wed, Aug 02, 2023 at 09:21:18AM +0530, Krishna chaitanya chundru wrote:
>> Add support to notify the EPF device about the D-state change event
>> from the EPC device.
>>
>> Signed-off-by: Krishna chaitanya chundru <quic_krichai@quicinc.com>
>> ---
>>   Documentation/PCI/endpoint/pci-endpoint.rst |  4 ++++
>>   drivers/pci/endpoint/pci-epc-core.c         | 27 +++++++++++++++++++++++++++
>>   include/linux/pci-epc.h                     |  1 +
>>   include/linux/pci-epf.h                     |  1 +
>>   4 files changed, 33 insertions(+)
>>
>> diff --git a/Documentation/PCI/endpoint/pci-endpoint.rst b/Documentation/PCI/endpoint/pci-endpoint.rst
>> index 4f5622a..66f3191 100644
>> --- a/Documentation/PCI/endpoint/pci-endpoint.rst
>> +++ b/Documentation/PCI/endpoint/pci-endpoint.rst
>> @@ -78,6 +78,10 @@ by the PCI controller driver.
>>      Cleanup the pci_epc_mem structure allocated during pci_epc_mem_init().
>>   
>>   
>> +* pci_epc_dstate_notity()
> s/notity/notify/ (several instances)

sorry for late reply, till now I was using a different branch which has 
some out of tree patches for testing and rebasing the patch on 
linux-next to send them because of that few things are getting missed.

Now I took time to completely move to the linux next so that testing and 
sending patches will be on same code base.

>> +
>> +   Notify all the function drivers that the EPC device has changed its D-state.
>> +
>>   EPC APIs for the PCI Endpoint Function Driver
>>   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>>   
>> diff --git a/drivers/pci/endpoint/pci-epc-core.c b/drivers/pci/endpoint/pci-epc-core.c
>> index 6c54fa5..4cf9c82 100644
>> --- a/drivers/pci/endpoint/pci-epc-core.c
>> +++ b/drivers/pci/endpoint/pci-epc-core.c
>> @@ -785,6 +785,33 @@ void pci_epc_bme_notify(struct pci_epc *epc)
>>   EXPORT_SYMBOL_GPL(pci_epc_bme_notify);
>>   
>>   /**
>> + * pci_epc_dstate_notity() - Notify the EPF driver that EPC device D-state
>> + *			has changed
>> + * @epc: the EPC device which has change in D-state
>> + * @state: the changed D-state
>> + *
>> + * Invoke to Notify the EPF device that the EPC device has D-state has
>> + * changed.
> s/device has D-state/device D-state/
>
>> + */
>> +void pci_epc_dstate_notity(struct pci_epc *epc, pci_power_t state)
>> +{
>> +	struct pci_epf *epf;
>> +
>> +	if (!epc || IS_ERR(epc))
>> +		return;
> Is this needed?  Looks like a programming error if we return here.  I
> don't like silently ignoring errors like this.  I generally prefer
> taking the NULL pointer dereference oops so we know the caller is
> broken and can fix it.
sure I will remove this check in the next patch series.
>
>> +	mutex_lock(&epc->list_lock);
>> +	list_for_each_entry(epf, &epc->pci_epf, list) {
>> +		mutex_lock(&epf->lock);
>> +		if (epf->event_ops && epf->event_ops->dstate_notify)
>> +			epf->event_ops->dstate_notify(epf, state);
>> +		mutex_unlock(&epf->lock);
>> +	}
>> +	mutex_unlock(&epc->list_lock);
>> +}
>> +EXPORT_SYMBOL_GPL(pci_epc_dstate_notity);
>> +
>> +/**
>>    * pci_epc_destroy() - destroy the EPC device
>>    * @epc: the EPC device that has to be destroyed
>>    *
>> diff --git a/include/linux/pci-epc.h b/include/linux/pci-epc.h
>> index 5cb6940..26a1108 100644
>> --- a/include/linux/pci-epc.h
>> +++ b/include/linux/pci-epc.h
>> @@ -251,4 +251,5 @@ void __iomem *pci_epc_mem_alloc_addr(struct pci_epc *epc,
>>   				     phys_addr_t *phys_addr, size_t size);
>>   void pci_epc_mem_free_addr(struct pci_epc *epc, phys_addr_t phys_addr,
>>   			   void __iomem *virt_addr, size_t size);
>> +void pci_epc_dstate_change(struct pci_epc *epc, pci_power_t state);
>>   #endif /* __LINUX_PCI_EPC_H */
>> diff --git a/include/linux/pci-epf.h b/include/linux/pci-epf.h
>> index 3f44b6a..529075b 100644
>> --- a/include/linux/pci-epf.h
>> +++ b/include/linux/pci-epf.h
>> @@ -79,6 +79,7 @@ struct pci_epc_event_ops {
>>   	int (*link_up)(struct pci_epf *epf);
>>   	int (*link_down)(struct pci_epf *epf);
>>   	int (*bme)(struct pci_epf *epf);
>> +	int (*dstate_notify)(struct pci_epf *epf, pci_power_t state);
>>   };
>>   
>>   /**
>> -- 
>> 2.7.4
>>
Krishna Chaitanya Chundru Sept. 8, 2023, 4:44 a.m. UTC | #4
On 8/23/2023 11:49 AM, Manivannan Sadhasivam wrote:
> On Wed, Aug 02, 2023 at 01:14:44PM +0800, kernel test robot wrote:
>> Hi Krishna,
>>
>> kernel test robot noticed the following build warnings:
>>
>> [auto build test WARNING on pci/next]
>> [also build test WARNING on pci/for-linus linus/master v6.5-rc4 next-20230801]
>> [If your patch is applied to the wrong git tree, kindly drop us a note.
>> And when submitting patch, we suggest to use '--base' as documented in
>> https://git-scm.com/docs/git-format-patch#_base_tree_information]
>>
>> url:    https://github.com/intel-lab-lkp/linux/commits/Krishna-chaitanya-chundru/PCI-endpoint-Add-D-state-change-notifier-support/20230802-115309
>> base:   https://git.kernel.org/pub/scm/linux/kernel/git/pci/pci.git next
>> patch link:    https://lore.kernel.org/r/1690948281-2143-2-git-send-email-quic_krichai%40quicinc.com
>> patch subject: [PATCH v5 1/4] PCI: endpoint: Add D-state change notifier support
>> config: loongarch-allyesconfig (https://download.01.org/0day-ci/archive/20230802/202308021312.obgu7FWM-lkp@intel.com/config)
>> compiler: loongarch64-linux-gcc (GCC) 12.3.0
>> reproduce: (https://download.01.org/0day-ci/archive/20230802/202308021312.obgu7FWM-lkp@intel.com/reproduce)
>>
>> If you fix the issue in a separate patch/commit (i.e. not just a new version of
>> the same patch/commit), kindly add following tags
>> | Reported-by: kernel test robot <lkp@intel.com>
>> | Closes: https://lore.kernel.org/oe-kbuild-all/202308021312.obgu7FWM-lkp@intel.com/
>>
>> All warnings (new ones prefixed by >>):
>>
>>>> drivers/pci/endpoint/pci-epc-core.c:795:6: warning: no previous prototype for 'pci_epc_dstate_notity' [-Wmissing-prototypes]
>>       795 | void pci_epc_dstate_notity(struct pci_epc *epc, pci_power_t state)
> This tells that you haven't build tested the series before sending. Please
> always do both build and functionality testing before sending each iteration.
>
> - Mani

sorry for late reply, till now I was using a different branch which has 
some out of tree patches for testing and rebasing the patch on 
linux-next to send them because of that few things are getting missed.

Now I took time to completely move to the linux next so that testing and 
sending patches will be on same code base.

I will correct this in next patch series.

- KC

>>           |      ^~~~~~~~~~~~~~~~~~~~~
>>
>>
>> vim +/pci_epc_dstate_notity +795 drivers/pci/endpoint/pci-epc-core.c
>>
>>     785	
>>     786	/**
>>     787	 * pci_epc_dstate_notity() - Notify the EPF driver that EPC device D-state
>>     788	 *			has changed
>>     789	 * @epc: the EPC device which has change in D-state
>>     790	 * @state: the changed D-state
>>     791	 *
>>     792	 * Invoke to Notify the EPF device that the EPC device has D-state has
>>     793	 * changed.
>>     794	 */
>>   > 795	void pci_epc_dstate_notity(struct pci_epc *epc, pci_power_t state)
>>     796	{
>>     797		struct pci_epf *epf;
>>     798	
>>     799		if (!epc || IS_ERR(epc))
>>     800			return;
>>     801	
>>     802		mutex_lock(&epc->list_lock);
>>     803		list_for_each_entry(epf, &epc->pci_epf, list) {
>>     804			mutex_lock(&epf->lock);
>>     805			if (epf->event_ops && epf->event_ops->dstate_notify)
>>     806				epf->event_ops->dstate_notify(epf, state);
>>     807			mutex_unlock(&epf->lock);
>>     808		}
>>     809		mutex_unlock(&epc->list_lock);
>>     810	}
>>     811	EXPORT_SYMBOL_GPL(pci_epc_dstate_notity);
>>     812	
>>
>> -- 
>> 0-DAY CI Kernel Test Service
>> https://github.com/intel/lkp-tests/wiki
diff mbox series

Patch

diff --git a/Documentation/PCI/endpoint/pci-endpoint.rst b/Documentation/PCI/endpoint/pci-endpoint.rst
index 4f5622a..66f3191 100644
--- a/Documentation/PCI/endpoint/pci-endpoint.rst
+++ b/Documentation/PCI/endpoint/pci-endpoint.rst
@@ -78,6 +78,10 @@  by the PCI controller driver.
    Cleanup the pci_epc_mem structure allocated during pci_epc_mem_init().
 
 
+* pci_epc_dstate_notity()
+
+   Notify all the function drivers that the EPC device has changed its D-state.
+
 EPC APIs for the PCI Endpoint Function Driver
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
diff --git a/drivers/pci/endpoint/pci-epc-core.c b/drivers/pci/endpoint/pci-epc-core.c
index 6c54fa5..4cf9c82 100644
--- a/drivers/pci/endpoint/pci-epc-core.c
+++ b/drivers/pci/endpoint/pci-epc-core.c
@@ -785,6 +785,33 @@  void pci_epc_bme_notify(struct pci_epc *epc)
 EXPORT_SYMBOL_GPL(pci_epc_bme_notify);
 
 /**
+ * pci_epc_dstate_notity() - Notify the EPF driver that EPC device D-state
+ *			has changed
+ * @epc: the EPC device which has change in D-state
+ * @state: the changed D-state
+ *
+ * Invoke to Notify the EPF device that the EPC device has D-state has
+ * changed.
+ */
+void pci_epc_dstate_notity(struct pci_epc *epc, pci_power_t state)
+{
+	struct pci_epf *epf;
+
+	if (!epc || IS_ERR(epc))
+		return;
+
+	mutex_lock(&epc->list_lock);
+	list_for_each_entry(epf, &epc->pci_epf, list) {
+		mutex_lock(&epf->lock);
+		if (epf->event_ops && epf->event_ops->dstate_notify)
+			epf->event_ops->dstate_notify(epf, state);
+		mutex_unlock(&epf->lock);
+	}
+	mutex_unlock(&epc->list_lock);
+}
+EXPORT_SYMBOL_GPL(pci_epc_dstate_notity);
+
+/**
  * pci_epc_destroy() - destroy the EPC device
  * @epc: the EPC device that has to be destroyed
  *
diff --git a/include/linux/pci-epc.h b/include/linux/pci-epc.h
index 5cb6940..26a1108 100644
--- a/include/linux/pci-epc.h
+++ b/include/linux/pci-epc.h
@@ -251,4 +251,5 @@  void __iomem *pci_epc_mem_alloc_addr(struct pci_epc *epc,
 				     phys_addr_t *phys_addr, size_t size);
 void pci_epc_mem_free_addr(struct pci_epc *epc, phys_addr_t phys_addr,
 			   void __iomem *virt_addr, size_t size);
+void pci_epc_dstate_change(struct pci_epc *epc, pci_power_t state);
 #endif /* __LINUX_PCI_EPC_H */
diff --git a/include/linux/pci-epf.h b/include/linux/pci-epf.h
index 3f44b6a..529075b 100644
--- a/include/linux/pci-epf.h
+++ b/include/linux/pci-epf.h
@@ -79,6 +79,7 @@  struct pci_epc_event_ops {
 	int (*link_up)(struct pci_epf *epf);
 	int (*link_down)(struct pci_epf *epf);
 	int (*bme)(struct pci_epf *epf);
+	int (*dstate_notify)(struct pci_epf *epf, pci_power_t state);
 };
 
 /**