diff mbox series

[U-Boot,069/126] sandbox: pci: Remember the device being emulated

Message ID 20190925145750.200592-70-sjg@chromium.org
State Accepted
Delegated to: Bin Meng
Headers show
Series x86: Add initial support for apollolake | expand

Commit Message

Simon Glass Sept. 25, 2019, 2:56 p.m. UTC
Add a field to the PCI emulator per-device data which records which device
is being emulated. This is useful when the emulator needs to check the
device for something.

Signed-off-by: Simon Glass <sjg@chromium.org>
---

 drivers/pci/pci-emul-uclass.c | 32 +++++++++++++++++++++++++-------
 include/pci.h                 | 20 ++++++++++++++++++++
 2 files changed, 45 insertions(+), 7 deletions(-)

Comments

Bin Meng Oct. 9, 2019, 2:27 p.m. UTC | #1
On Wed, Sep 25, 2019 at 10:58 PM Simon Glass <sjg@chromium.org> wrote:
>
> Add a field to the PCI emulator per-device data which records which device
> is being emulated. This is useful when the emulator needs to check the
> device for something.
>
> Signed-off-by: Simon Glass <sjg@chromium.org>
> ---
>
>  drivers/pci/pci-emul-uclass.c | 32 +++++++++++++++++++++++++-------
>  include/pci.h                 | 20 ++++++++++++++++++++
>  2 files changed, 45 insertions(+), 7 deletions(-)
>
> diff --git a/drivers/pci/pci-emul-uclass.c b/drivers/pci/pci-emul-uclass.c
> index 6e6172836a4..589fb539031 100644
> --- a/drivers/pci/pci-emul-uclass.c
> +++ b/drivers/pci/pci-emul-uclass.c
> @@ -18,6 +18,7 @@ struct sandbox_pci_emul_priv {
>  int sandbox_pci_get_emul(struct udevice *bus, pci_dev_t find_devfn,
>                          struct udevice **containerp, struct udevice **emulp)
>  {
> +       struct pci_emul_uc_priv *upriv;
>         struct udevice *dev;
>         int ret;
>
> @@ -30,17 +31,33 @@ int sandbox_pci_get_emul(struct udevice *bus, pci_dev_t find_devfn,
>         }
>         *containerp = dev;
>
> -       /*
> -        * TODO(sjg@chromium.org): This code needs a comment as I'm not sure
> -        * why UCLASS_PCI_GENERIC devices end up being their own emulators. I
> -        * left this code as is.
> -        */
>         ret = uclass_get_device_by_phandle(UCLASS_PCI_EMUL, dev, "sandbox,emul",
>                                            emulp);
> -       if (ret && device_get_uclass_id(dev) != UCLASS_PCI_GENERIC)
> +       if (!ret) {
> +               upriv = dev_get_uclass_priv(*emulp);
> +
> +               upriv->client = dev;
> +       } else if (device_get_uclass_id(dev) != UCLASS_PCI_GENERIC) {
> +               /*
> +                * TODO(sjg@chromium.org): This code needs a comment as I'm not
> +                * sure why non-UCLASS_PCI_GENERIC devices end up being their
> +                * own emulators. I left this code as is.
> +                */

This part will not apply to current u-boot/master. Need rebase.

>                 *emulp = dev;
> +       }
> +
> +       return 0;
> +}
>
> -       return *emulp ? 0 : -ENODEV;
> +int sandbox_pci_get_client(struct udevice *emul, struct udevice **devp)
> +{
> +       struct pci_emul_uc_priv *upriv = dev_get_uclass_priv(emul);
> +
> +       if (!upriv->client)
> +               return -ENOENT;
> +       *devp = upriv->client;
> +
> +       return 0;
>  }
>
>  uint sandbox_pci_read_bar(u32 barval, int type, uint size)
> @@ -89,6 +106,7 @@ UCLASS_DRIVER(pci_emul) = {
>         .post_probe     = sandbox_pci_emul_post_probe,
>         .pre_remove     = sandbox_pci_emul_pre_remove,
>         .priv_auto_alloc_size   = sizeof(struct sandbox_pci_emul_priv),
> +       .per_device_auto_alloc_size     = sizeof(struct pci_emul_uc_priv),
>  };
>
>  /*
> diff --git a/include/pci.h b/include/pci.h
> index 8aa6636cfbf..ff59ac0e695 100644
> --- a/include/pci.h
> +++ b/include/pci.h
> @@ -1490,6 +1490,17 @@ int dm_pci_find_device(unsigned int vendor, unsigned int device, int index,
>   */
>  int dm_pci_find_class(uint find_class, int index, struct udevice **devp);
>
> +/**
> + * struct pci_emul_uc_priv - holds info about an emulator device
> + *
> + * There is always at most one emulator per client
> + *
> + * @client: Client device if any, else NULL
> + */
> +struct pci_emul_uc_priv {
> +       struct udevice *client;
> +};
> +
>  /**
>   * struct dm_pci_emul_ops - PCI device emulator operations
>   */
> @@ -1592,6 +1603,15 @@ struct dm_pci_emul_ops {
>  int sandbox_pci_get_emul(struct udevice *bus, pci_dev_t find_devfn,
>                          struct udevice **containerp, struct udevice **emulp);
>
> +/**
> + * sandbox_pci_get_client() - Find the client for an emulation device
> + *
> + * @emul:      Emulation device to check
> + * @devp:      Returns the client device emulated by this device
> + * @return 0 if OK, -ENOENT if the device has no client yet
> + */
> +int sandbox_pci_get_client(struct udevice *emul, struct udevice **devp);
> +
>  /**
>   * pci_get_devfn() - Extract the devfn from fdt_pci_addr of the device
>   *
> --

The changes look good to me.
Reviewed-by: Bin Meng <bmeng.cn@gmail.com>

Regards,
Bin
Bin Meng Oct. 11, 2019, 8:26 a.m. UTC | #2
On Wed, Oct 9, 2019 at 10:27 PM Bin Meng <bmeng.cn@gmail.com> wrote:
>
> On Wed, Sep 25, 2019 at 10:58 PM Simon Glass <sjg@chromium.org> wrote:
> >
> > Add a field to the PCI emulator per-device data which records which device
> > is being emulated. This is useful when the emulator needs to check the
> > device for something.
> >
> > Signed-off-by: Simon Glass <sjg@chromium.org>
> > ---
> >
> >  drivers/pci/pci-emul-uclass.c | 32 +++++++++++++++++++++++++-------
> >  include/pci.h                 | 20 ++++++++++++++++++++
> >  2 files changed, 45 insertions(+), 7 deletions(-)
> >
> > diff --git a/drivers/pci/pci-emul-uclass.c b/drivers/pci/pci-emul-uclass.c
> > index 6e6172836a4..589fb539031 100644
> > --- a/drivers/pci/pci-emul-uclass.c
> > +++ b/drivers/pci/pci-emul-uclass.c
> > @@ -18,6 +18,7 @@ struct sandbox_pci_emul_priv {
> >  int sandbox_pci_get_emul(struct udevice *bus, pci_dev_t find_devfn,
> >                          struct udevice **containerp, struct udevice **emulp)
> >  {
> > +       struct pci_emul_uc_priv *upriv;
> >         struct udevice *dev;
> >         int ret;
> >
> > @@ -30,17 +31,33 @@ int sandbox_pci_get_emul(struct udevice *bus, pci_dev_t find_devfn,
> >         }
> >         *containerp = dev;
> >
> > -       /*
> > -        * TODO(sjg@chromium.org): This code needs a comment as I'm not sure
> > -        * why UCLASS_PCI_GENERIC devices end up being their own emulators. I
> > -        * left this code as is.
> > -        */
> >         ret = uclass_get_device_by_phandle(UCLASS_PCI_EMUL, dev, "sandbox,emul",
> >                                            emulp);
> > -       if (ret && device_get_uclass_id(dev) != UCLASS_PCI_GENERIC)
> > +       if (!ret) {
> > +               upriv = dev_get_uclass_priv(*emulp);
> > +
> > +               upriv->client = dev;
> > +       } else if (device_get_uclass_id(dev) != UCLASS_PCI_GENERIC) {
> > +               /*
> > +                * TODO(sjg@chromium.org): This code needs a comment as I'm not
> > +                * sure why non-UCLASS_PCI_GENERIC devices end up being their
> > +                * own emulators. I left this code as is.
> > +                */
>
> This part will not apply to current u-boot/master. Need rebase.

Rebased the patch against u-boot-x86/master to get it applied cleanly, and

>
> >                 *emulp = dev;
> > +       }
> > +
> > +       return 0;
> > +}
> >
> > -       return *emulp ? 0 : -ENODEV;
> > +int sandbox_pci_get_client(struct udevice *emul, struct udevice **devp)
> > +{
> > +       struct pci_emul_uc_priv *upriv = dev_get_uclass_priv(emul);
> > +
> > +       if (!upriv->client)
> > +               return -ENOENT;
> > +       *devp = upriv->client;
> > +
> > +       return 0;
> >  }
> >
> >  uint sandbox_pci_read_bar(u32 barval, int type, uint size)
> > @@ -89,6 +106,7 @@ UCLASS_DRIVER(pci_emul) = {
> >         .post_probe     = sandbox_pci_emul_post_probe,
> >         .pre_remove     = sandbox_pci_emul_pre_remove,
> >         .priv_auto_alloc_size   = sizeof(struct sandbox_pci_emul_priv),
> > +       .per_device_auto_alloc_size     = sizeof(struct pci_emul_uc_priv),
> >  };
> >
> >  /*
> > diff --git a/include/pci.h b/include/pci.h
> > index 8aa6636cfbf..ff59ac0e695 100644
> > --- a/include/pci.h
> > +++ b/include/pci.h
> > @@ -1490,6 +1490,17 @@ int dm_pci_find_device(unsigned int vendor, unsigned int device, int index,
> >   */
> >  int dm_pci_find_class(uint find_class, int index, struct udevice **devp);
> >
> > +/**
> > + * struct pci_emul_uc_priv - holds info about an emulator device
> > + *
> > + * There is always at most one emulator per client
> > + *
> > + * @client: Client device if any, else NULL
> > + */
> > +struct pci_emul_uc_priv {
> > +       struct udevice *client;
> > +};
> > +
> >  /**
> >   * struct dm_pci_emul_ops - PCI device emulator operations
> >   */
> > @@ -1592,6 +1603,15 @@ struct dm_pci_emul_ops {
> >  int sandbox_pci_get_emul(struct udevice *bus, pci_dev_t find_devfn,
> >                          struct udevice **containerp, struct udevice **emulp);
> >
> > +/**
> > + * sandbox_pci_get_client() - Find the client for an emulation device
> > + *
> > + * @emul:      Emulation device to check
> > + * @devp:      Returns the client device emulated by this device
> > + * @return 0 if OK, -ENOENT if the device has no client yet
> > + */
> > +int sandbox_pci_get_client(struct udevice *emul, struct udevice **devp);
> > +
> >  /**
> >   * pci_get_devfn() - Extract the devfn from fdt_pci_addr of the device
> >   *
> > --
>
> The changes look good to me.
> Reviewed-by: Bin Meng <bmeng.cn@gmail.com>

applied to u-boot-x86, thanks!
diff mbox series

Patch

diff --git a/drivers/pci/pci-emul-uclass.c b/drivers/pci/pci-emul-uclass.c
index 6e6172836a4..589fb539031 100644
--- a/drivers/pci/pci-emul-uclass.c
+++ b/drivers/pci/pci-emul-uclass.c
@@ -18,6 +18,7 @@  struct sandbox_pci_emul_priv {
 int sandbox_pci_get_emul(struct udevice *bus, pci_dev_t find_devfn,
 			 struct udevice **containerp, struct udevice **emulp)
 {
+	struct pci_emul_uc_priv *upriv;
 	struct udevice *dev;
 	int ret;
 
@@ -30,17 +31,33 @@  int sandbox_pci_get_emul(struct udevice *bus, pci_dev_t find_devfn,
 	}
 	*containerp = dev;
 
-	/*
-	 * TODO(sjg@chromium.org): This code needs a comment as I'm not sure
-	 * why UCLASS_PCI_GENERIC devices end up being their own emulators. I
-	 * left this code as is.
-	 */
 	ret = uclass_get_device_by_phandle(UCLASS_PCI_EMUL, dev, "sandbox,emul",
 					   emulp);
-	if (ret && device_get_uclass_id(dev) != UCLASS_PCI_GENERIC)
+	if (!ret) {
+		upriv = dev_get_uclass_priv(*emulp);
+
+		upriv->client = dev;
+	} else if (device_get_uclass_id(dev) != UCLASS_PCI_GENERIC) {
+		/*
+		 * TODO(sjg@chromium.org): This code needs a comment as I'm not
+		 * sure why non-UCLASS_PCI_GENERIC devices end up being their
+		 * own emulators. I left this code as is.
+		 */
 		*emulp = dev;
+	}
+
+	return 0;
+}
 
-	return *emulp ? 0 : -ENODEV;
+int sandbox_pci_get_client(struct udevice *emul, struct udevice **devp)
+{
+	struct pci_emul_uc_priv *upriv = dev_get_uclass_priv(emul);
+
+	if (!upriv->client)
+		return -ENOENT;
+	*devp = upriv->client;
+
+	return 0;
 }
 
 uint sandbox_pci_read_bar(u32 barval, int type, uint size)
@@ -89,6 +106,7 @@  UCLASS_DRIVER(pci_emul) = {
 	.post_probe	= sandbox_pci_emul_post_probe,
 	.pre_remove	= sandbox_pci_emul_pre_remove,
 	.priv_auto_alloc_size	= sizeof(struct sandbox_pci_emul_priv),
+	.per_device_auto_alloc_size	= sizeof(struct pci_emul_uc_priv),
 };
 
 /*
diff --git a/include/pci.h b/include/pci.h
index 8aa6636cfbf..ff59ac0e695 100644
--- a/include/pci.h
+++ b/include/pci.h
@@ -1490,6 +1490,17 @@  int dm_pci_find_device(unsigned int vendor, unsigned int device, int index,
  */
 int dm_pci_find_class(uint find_class, int index, struct udevice **devp);
 
+/**
+ * struct pci_emul_uc_priv - holds info about an emulator device
+ *
+ * There is always at most one emulator per client
+ *
+ * @client: Client device if any, else NULL
+ */
+struct pci_emul_uc_priv {
+	struct udevice *client;
+};
+
 /**
  * struct dm_pci_emul_ops - PCI device emulator operations
  */
@@ -1592,6 +1603,15 @@  struct dm_pci_emul_ops {
 int sandbox_pci_get_emul(struct udevice *bus, pci_dev_t find_devfn,
 			 struct udevice **containerp, struct udevice **emulp);
 
+/**
+ * sandbox_pci_get_client() - Find the client for an emulation device
+ *
+ * @emul:	Emulation device to check
+ * @devp:	Returns the client device emulated by this device
+ * @return 0 if OK, -ENOENT if the device has no client yet
+ */
+int sandbox_pci_get_client(struct udevice *emul, struct udevice **devp);
+
 /**
  * pci_get_devfn() - Extract the devfn from fdt_pci_addr of the device
  *