All of lore.kernel.org
 help / color / mirror / Atom feed
From: Bjorn Helgaas <helgaas@kernel.org>
To: Yishai Hadas <yishaih@nvidia.com>
Cc: bhelgaas@google.com, corbet@lwn.net, alex.williamson@redhat.com,
	diana.craciun@oss.nxp.com, kwankhede@nvidia.com,
	eric.auger@redhat.com, masahiroy@kernel.org,
	michal.lkml@markovi.net, linux-pci@vger.kernel.org,
	linux-doc@vger.kernel.org, kvm@vger.kernel.org,
	linux-s390@vger.kernel.org, linux-kbuild@vger.kernel.org,
	mgurtovoy@nvidia.com, jgg@nvidia.com, maorg@nvidia.com,
	leonro@nvidia.com
Subject: Re: [PATCH V4 09/13] PCI: Add 'override_only' field to struct pci_device_id
Date: Wed, 25 Aug 2021 10:54:46 -0500	[thread overview]
Message-ID: <20210825155446.GA3575423@bjorn-Precision-5520> (raw)
In-Reply-To: <20210825135139.79034-10-yishaih@nvidia.com>

On Wed, Aug 25, 2021 at 04:51:35PM +0300, Yishai Hadas wrote:
> From: Max Gurtovoy <mgurtovoy@nvidia.com>
> 
> Add 'override_only' field to struct pci_device_id to be used as part of
> pci_match_device().
> 
> When set, it means that matching is true only when dev->driver_override
> is this driver.

Maybe:

  When set, a driver only matches the entry when dev->driver_override
  is set to that driver.

> In addition, add a helper macro named 'PCI_DEVICE_DRIVER_OVERRIDE' to
> enable setting some data on it.
> 
> Next patch from this series will use the above functionality.
> 
> Signed-off-by: Max Gurtovoy <mgurtovoy@nvidia.com>
> Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
> Signed-off-by: Yishai Hadas <yishaih@nvidia.com>

Acked-by: Bjorn Helgaas <bhelgaas@google.com>

> ---

>  Documentation/PCI/pci.rst       |  1 +
>  drivers/pci/pci-driver.c        | 28 +++++++++++++++++++++-------
>  include/linux/mod_devicetable.h |  2 ++
>  include/linux/pci.h             | 15 +++++++++++++++
>  4 files changed, 39 insertions(+), 7 deletions(-)
> 
> diff --git a/Documentation/PCI/pci.rst b/Documentation/PCI/pci.rst
> index fa651e25d98c..87c6f4a6ca32 100644
> --- a/Documentation/PCI/pci.rst
> +++ b/Documentation/PCI/pci.rst
> @@ -103,6 +103,7 @@ need pass only as many optional fields as necessary:
>    - subvendor and subdevice fields default to PCI_ANY_ID (FFFFFFFF)
>    - class and classmask fields default to 0
>    - driver_data defaults to 0UL.
> +  - override_only field defaults to 0.
>  
>  Note that driver_data must match the value used by any of the pci_device_id
>  entries defined in the driver. This makes the driver_data field mandatory
> diff --git a/drivers/pci/pci-driver.c b/drivers/pci/pci-driver.c
> index 3a72352aa5cf..123c590ebe1d 100644
> --- a/drivers/pci/pci-driver.c
> +++ b/drivers/pci/pci-driver.c
> @@ -136,7 +136,7 @@ static const struct pci_device_id *pci_match_device(struct pci_driver *drv,
>  						    struct pci_dev *dev)
>  {
>  	struct pci_dynid *dynid;
> -	const struct pci_device_id *found_id = NULL;
> +	const struct pci_device_id *found_id = NULL, *ids;
>  
>  	/* When driver_override is set, only bind to the matching driver */
>  	if (dev->driver_override && strcmp(dev->driver_override, drv->name))
> @@ -152,14 +152,28 @@ static const struct pci_device_id *pci_match_device(struct pci_driver *drv,
>  	}
>  	spin_unlock(&drv->dynids.lock);
>  
> -	if (!found_id)
> -		found_id = pci_match_id(drv->id_table, dev);
> +	if (found_id)
> +		return found_id;
>  
> -	/* driver_override will always match, send a dummy id */
> -	if (!found_id && dev->driver_override)
> -		found_id = &pci_device_id_any;
> +	for (ids = drv->id_table; (found_id = pci_match_id(ids, dev));
> +	     ids = found_id + 1) {
> +		/*
> +		 * The match table is split based on driver_override.
> +		 * In case override_only was set, enforce driver_override
> +		 * matching.
> +		 */
> +		if (found_id->override_only) {
> +			if (dev->driver_override)
> +				return found_id;
> +		} else {
> +			return found_id;
> +		}
> +	}
>  
> -	return found_id;
> +	/* driver_override will always match, send a dummy id */
> +	if (dev->driver_override)
> +		return &pci_device_id_any;
> +	return NULL;
>  }
>  
>  /**
> diff --git a/include/linux/mod_devicetable.h b/include/linux/mod_devicetable.h
> index 8e291cfdaf06..2e3ba6d9ece0 100644
> --- a/include/linux/mod_devicetable.h
> +++ b/include/linux/mod_devicetable.h
> @@ -34,12 +34,14 @@ typedef unsigned long kernel_ulong_t;
>   *			Best practice is to use driver_data as an index
>   *			into a static list of equivalent device types,
>   *			instead of using it as a pointer.
> + * @override_only:	Match only when dev->driver_override is this driver.
>   */
>  struct pci_device_id {
>  	__u32 vendor, device;		/* Vendor and device ID or PCI_ANY_ID*/
>  	__u32 subvendor, subdevice;	/* Subsystem ID's or PCI_ANY_ID */
>  	__u32 class, class_mask;	/* (class,subclass,prog-if) triplet */
>  	kernel_ulong_t driver_data;	/* Data private to the driver */
> +	__u32 override_only;
>  };
>  
>  
> diff --git a/include/linux/pci.h b/include/linux/pci.h
> index 540b377ca8f6..0506b1a8c921 100644
> --- a/include/linux/pci.h
> +++ b/include/linux/pci.h
> @@ -901,6 +901,21 @@ struct pci_driver {
>  	.vendor = (vend), .device = (dev), \
>  	.subvendor = PCI_ANY_ID, .subdevice = PCI_ANY_ID
>  
> +/**
> + * PCI_DEVICE_DRIVER_OVERRIDE - macro used to describe a PCI device with
> + *                              override_only flags.
> + * @vend: the 16 bit PCI Vendor ID
> + * @dev: the 16 bit PCI Device ID
> + * @driver_override: the 32 bit PCI Device override_only
> + *
> + * This macro is used to create a struct pci_device_id that matches only a
> + * driver_override device. The subvendor and subdevice fields will be set to
> + * PCI_ANY_ID.
> + */
> +#define PCI_DEVICE_DRIVER_OVERRIDE(vend, dev, driver_override) \
> +	.vendor = (vend), .device = (dev), .subvendor = PCI_ANY_ID, \
> +	.subdevice = PCI_ANY_ID, .override_only = (driver_override)
> +
>  /**
>   * PCI_DEVICE_SUB - macro used to describe a specific PCI device with subsystem
>   * @vend: the 16 bit PCI Vendor ID
> -- 
> 2.18.1
> 

  reply	other threads:[~2021-08-25 15:54 UTC|newest]

Thread overview: 31+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-08-25 13:51 [PATCH V4 00/13] Introduce vfio_pci_core subsystem Yishai Hadas
2021-08-25 13:51 ` [PATCH V4 01/13] vfio/pci: Rename vfio_pci.c to vfio_pci_core.c Yishai Hadas
2021-08-26  9:15   ` Christoph Hellwig
2021-08-25 13:51 ` [PATCH V4 02/13] vfio/pci: Rename vfio_pci_private.h to vfio_pci_core.h Yishai Hadas
2021-08-26  9:17   ` Christoph Hellwig
2021-08-25 13:51 ` [PATCH V4 03/13] vfio/pci: Rename vfio_pci_device to vfio_pci_core_device Yishai Hadas
2021-08-26  9:22   ` Christoph Hellwig
2021-08-25 13:51 ` [PATCH V4 04/13] vfio/pci: Rename ops functions to fit core namings Yishai Hadas
2021-08-26  9:25   ` Christoph Hellwig
2021-08-25 13:51 ` [PATCH V4 05/13] vfio/pci: Include vfio header in vfio_pci_core.h Yishai Hadas
2021-08-26  9:27   ` Christoph Hellwig
2021-08-25 13:51 ` [PATCH V4 06/13] vfio/pci: Split the pci_driver code out of vfio_pci_core.c Yishai Hadas
2021-08-26  9:31   ` Christoph Hellwig
2021-08-25 13:51 ` [PATCH V4 07/13] vfio/pci: Move igd initialization to vfio_pci.c Yishai Hadas
2021-08-26  9:34   ` Christoph Hellwig
2021-08-25 13:51 ` [PATCH V4 08/13] vfio/pci: Move module parameters " Yishai Hadas
2021-08-26  9:36   ` Christoph Hellwig
2021-08-25 13:51 ` [PATCH V4 09/13] PCI: Add 'override_only' field to struct pci_device_id Yishai Hadas
2021-08-25 15:54   ` Bjorn Helgaas [this message]
2021-08-25 21:25     ` Alex Williamson
2021-08-25 13:51 ` [PATCH V4 10/13] PCI / VFIO: Add 'override_only' support for VFIO PCI sub system Yishai Hadas
2021-08-25 15:55   ` Bjorn Helgaas
2021-08-25 22:05   ` Alex Williamson
2021-08-25 22:24     ` Jason Gunthorpe
2021-08-25 22:33       ` Alex Williamson
2021-08-25 13:51 ` [PATCH V4 11/13] vfio: Use select for eventfd Yishai Hadas
2021-08-26  9:06   ` Christoph Hellwig
2021-08-25 13:51 ` [PATCH V4 12/13] vfio: Use kconfig if XX/endif blocks instead of repeating 'depends on' Yishai Hadas
2021-08-26  9:09   ` Christoph Hellwig
2021-08-25 13:51 ` [PATCH V4 13/13] vfio/pci: Introduce vfio_pci_core.ko Yishai Hadas
2021-08-26  9:12   ` Christoph Hellwig

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20210825155446.GA3575423@bjorn-Precision-5520 \
    --to=helgaas@kernel.org \
    --cc=alex.williamson@redhat.com \
    --cc=bhelgaas@google.com \
    --cc=corbet@lwn.net \
    --cc=diana.craciun@oss.nxp.com \
    --cc=eric.auger@redhat.com \
    --cc=jgg@nvidia.com \
    --cc=kvm@vger.kernel.org \
    --cc=kwankhede@nvidia.com \
    --cc=leonro@nvidia.com \
    --cc=linux-doc@vger.kernel.org \
    --cc=linux-kbuild@vger.kernel.org \
    --cc=linux-pci@vger.kernel.org \
    --cc=linux-s390@vger.kernel.org \
    --cc=maorg@nvidia.com \
    --cc=masahiroy@kernel.org \
    --cc=mgurtovoy@nvidia.com \
    --cc=michal.lkml@markovi.net \
    --cc=yishaih@nvidia.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.