diff mbox series

[V4,04/17] platform/x86/intel/vsec: Add intel_vsec_register

Message ID 20231018231624.1044633-5-david.e.box@linux.intel.com (mailing list archive)
State Changes Requested, archived
Headers show
Series intel_pmc: Add telemetry API to read counters | expand

Commit Message

David E. Box Oct. 18, 2023, 11:16 p.m. UTC
From: Gayatri Kammela <gayatri.kammela@linux.intel.com>

Add and export intel_vsec_register() to allow the registration of Intel
extended capabilities from other drivers. Add check to look for memory
conflicts before registering a new capability. Add a parent field to
intel_vsec_platform_info to allow specifying the parent device for
device managed cleanup.

Signed-off-by: Gayatri Kammela <gayatri.kammela@linux.intel.com>
Signed-off-by: David E. Box <david.e.box@linux.intel.com>
---
V4 - Move res cleanup to previous patch

V3 - Replace kfree on request_mem_region fail with use of cleanup.h helper.

V2 - New patch splitting previous PATCH 1

 drivers/platform/x86/intel/vsec.c | 19 +++++++++++++++++--
 drivers/platform/x86/intel/vsec.h |  4 ++++
 2 files changed, 21 insertions(+), 2 deletions(-)

Comments

Ilpo Järvinen Oct. 23, 2023, 3:21 p.m. UTC | #1
On Wed, 18 Oct 2023, David E. Box wrote:

Use () in the shortlog after the function name.

> From: Gayatri Kammela <gayatri.kammela@linux.intel.com>
> 
> Add and export intel_vsec_register() to allow the registration of Intel
> extended capabilities from other drivers. Add check to look for memory
> conflicts before registering a new capability. Add a parent field to
> intel_vsec_platform_info to allow specifying the parent device for
> device managed cleanup.

While reviewing this patch, I couldn't understand why the parent is never 
assigned with anything?

> Signed-off-by: Gayatri Kammela <gayatri.kammela@linux.intel.com>
> Signed-off-by: David E. Box <david.e.box@linux.intel.com>
> ---
> V4 - Move res cleanup to previous patch
> 
> V3 - Replace kfree on request_mem_region fail with use of cleanup.h helper.
> 
> V2 - New patch splitting previous PATCH 1
> 
>  drivers/platform/x86/intel/vsec.c | 19 +++++++++++++++++--
>  drivers/platform/x86/intel/vsec.h |  4 ++++
>  2 files changed, 21 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/platform/x86/intel/vsec.c b/drivers/platform/x86/intel/vsec.c
> index 28191313d515..638dfde6a9e2 100644
> --- a/drivers/platform/x86/intel/vsec.c
> +++ b/drivers/platform/x86/intel/vsec.c
> @@ -188,6 +188,12 @@ static int intel_vsec_add_dev(struct pci_dev *pdev, struct intel_vsec_header *he
>  			     header->offset + i * (header->entry_size * sizeof(u32));
>  		tmp->end = tmp->start + (header->entry_size * sizeof(u32)) - 1;
>  		tmp->flags = IORESOURCE_MEM;
> +
> +		/* Check resource is not in use */
> +		if (!request_mem_region(tmp->start, resource_size(tmp), ""))
> +			return -EBUSY;
> +
> +		release_mem_region(tmp->start, resource_size(tmp));
>  	}
>  
>  	intel_vsec_dev->pcidev = pdev;
> @@ -205,9 +211,8 @@ static int intel_vsec_add_dev(struct pci_dev *pdev, struct intel_vsec_header *he
>  	 * intel_vsec_add_aux()
>  	 */
>  	no_free_ptr(res);
> -	ret = intel_vsec_add_aux(pdev, NULL, no_free_ptr(intel_vsec_dev),
> +	ret = intel_vsec_add_aux(pdev, info->parent, no_free_ptr(intel_vsec_dev),
>  				 intel_vsec_name(header->id));
> -

Extra newline change.
David E. Box Oct. 24, 2023, 11:25 p.m. UTC | #2
On Mon, 2023-10-23 at 18:21 +0300, Ilpo Järvinen wrote:
> On Wed, 18 Oct 2023, David E. Box wrote:
> 
> Use () in the shortlog after the function name.
> 
> > From: Gayatri Kammela <gayatri.kammela@linux.intel.com>
> > 
> > Add and export intel_vsec_register() to allow the registration of Intel
> > extended capabilities from other drivers. Add check to look for memory
> > conflicts before registering a new capability. Add a parent field to
> > intel_vsec_platform_info to allow specifying the parent device for
> > device managed cleanup.
> 
> While reviewing this patch, I couldn't understand why the parent is never 
> assigned with anything?

That's because ...

> 
> > Signed-off-by: Gayatri Kammela <gayatri.kammela@linux.intel.com>
> > Signed-off-by: David E. Box <david.e.box@linux.intel.com>
> > ---
> > V4 - Move res cleanup to previous patch
> > 
> > V3 - Replace kfree on request_mem_region fail with use of cleanup.h helper.
> > 
> > V2 - New patch splitting previous PATCH 1
> > 
> >  drivers/platform/x86/intel/vsec.c | 19 +++++++++++++++++--
> >  drivers/platform/x86/intel/vsec.h |  4 ++++
> >  2 files changed, 21 insertions(+), 2 deletions(-)
> > 
> > diff --git a/drivers/platform/x86/intel/vsec.c
> > b/drivers/platform/x86/intel/vsec.c
> > index 28191313d515..638dfde6a9e2 100644
> > --- a/drivers/platform/x86/intel/vsec.c
> > +++ b/drivers/platform/x86/intel/vsec.c
> > @@ -188,6 +188,12 @@ static int intel_vsec_add_dev(struct pci_dev *pdev,
> > struct intel_vsec_header *he
> >                              header->offset + i * (header->entry_size *
> > sizeof(u32));
> >                 tmp->end = tmp->start + (header->entry_size * sizeof(u32)) -
> > 1;
> >                 tmp->flags = IORESOURCE_MEM;
> > +
> > +               /* Check resource is not in use */
> > +               if (!request_mem_region(tmp->start, resource_size(tmp), ""))
> > +                       return -EBUSY;
> > +
> > +               release_mem_region(tmp->start, resource_size(tmp));
> >         }
> >  
> >         intel_vsec_dev->pcidev = pdev;
> > @@ -205,9 +211,8 @@ static int intel_vsec_add_dev(struct pci_dev *pdev,
> > struct intel_vsec_header *he
> >          * intel_vsec_add_aux()
> >          */
> >         no_free_ptr(res);
> > -       ret = intel_vsec_add_aux(pdev, NULL, no_free_ptr(intel_vsec_dev),
> > +       ret = intel_vsec_add_aux(pdev, info->parent,
> > no_free_ptr(intel_vsec_dev),
> >                                  intel_vsec_name(header->id));

... for devices probed by this driver, intel_vsec_add_aux() will assign the
probe device as the parent if the argument is NULL. Originally this function
didn't have an argument for parent. It was added when this function was exported
for use by the tpmi driver which needed to specify its own parent. Users of
intel_vsec_register() need to do the same. I suppose for clarity this driver
could set it as well and we can remove the NULL check.

David

> > -
> 
> Extra newline change.
>
diff mbox series

Patch

diff --git a/drivers/platform/x86/intel/vsec.c b/drivers/platform/x86/intel/vsec.c
index 28191313d515..638dfde6a9e2 100644
--- a/drivers/platform/x86/intel/vsec.c
+++ b/drivers/platform/x86/intel/vsec.c
@@ -188,6 +188,12 @@  static int intel_vsec_add_dev(struct pci_dev *pdev, struct intel_vsec_header *he
 			     header->offset + i * (header->entry_size * sizeof(u32));
 		tmp->end = tmp->start + (header->entry_size * sizeof(u32)) - 1;
 		tmp->flags = IORESOURCE_MEM;
+
+		/* Check resource is not in use */
+		if (!request_mem_region(tmp->start, resource_size(tmp), ""))
+			return -EBUSY;
+
+		release_mem_region(tmp->start, resource_size(tmp));
 	}
 
 	intel_vsec_dev->pcidev = pdev;
@@ -205,9 +211,8 @@  static int intel_vsec_add_dev(struct pci_dev *pdev, struct intel_vsec_header *he
 	 * intel_vsec_add_aux()
 	 */
 	no_free_ptr(res);
-	ret = intel_vsec_add_aux(pdev, NULL, no_free_ptr(intel_vsec_dev),
+	ret = intel_vsec_add_aux(pdev, info->parent, no_free_ptr(intel_vsec_dev),
 				 intel_vsec_name(header->id));
-
 	return ret;
 }
 
@@ -325,6 +330,16 @@  static bool intel_vsec_walk_vsec(struct pci_dev *pdev,
 	return have_devices;
 }
 
+void intel_vsec_register(struct pci_dev *pdev,
+			 struct intel_vsec_platform_info *info)
+{
+	if (!pdev || !info)
+		return;
+
+	intel_vsec_walk_header(pdev, info);
+}
+EXPORT_SYMBOL_NS_GPL(intel_vsec_register, INTEL_VSEC);
+
 static int intel_vsec_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)
 {
 	struct intel_vsec_platform_info *info;
diff --git a/drivers/platform/x86/intel/vsec.h b/drivers/platform/x86/intel/vsec.h
index d3fefba3e623..a15fda2fcd28 100644
--- a/drivers/platform/x86/intel/vsec.h
+++ b/drivers/platform/x86/intel/vsec.h
@@ -69,6 +69,7 @@  enum intel_vsec_quirks {
 
 /* Platform specific data */
 struct intel_vsec_platform_info {
+	struct device *parent;
 	struct intel_vsec_header **headers;
 	unsigned long caps;
 	unsigned long quirks;
@@ -98,4 +99,7 @@  static inline struct intel_vsec_device *auxdev_to_ivdev(struct auxiliary_device
 {
 	return container_of(auxdev, struct intel_vsec_device, auxdev);
 }
+
+void intel_vsec_register(struct pci_dev *pdev,
+			 struct intel_vsec_platform_info *info);
 #endif