[PATCH 4/4 RFC] fsl/msi: Add interface to reserve/free msi bank
Bharat.Bhushan at freescale.com
Bharat.Bhushan at freescale.com
Fri Mar 13 02:50:58 AEDT 2015
> -----Original Message-----
> From: Wood Scott-B07421
> Sent: Thursday, March 12, 2015 5:48 AM
> To: Bhushan Bharat-R65777
> Cc: linuxppc-dev at ozlabs.org
> Subject: Re: [PATCH 4/4 RFC] fsl/msi: Add interface to reserve/free msi
> bank
>
> On Tue, 2015-03-03 at 10:47 +0530, Bharat Bhushan wrote:
> > This patch allows a context (different from kernel context) to reserve
> > a MSI bank for itself. And then the devices in the context will share
> > the MSI bank.
> >
> > VFIO meta driver is one of typical user of these APIs. It will reserve
> > a MSI bank for MSI interrupt support of direct assignment PCI devices
> > to a Guest. Patches for same will follow this patch.
> >
> > Signed-off-by: Bharat Bhushan <Bharat.Bhushan at freescale.com>
> > ---
> > arch/powerpc/include/asm/device.h | 2 +
> > arch/powerpc/include/asm/fsl_msi.h | 26 ++++++
> > arch/powerpc/sysdev/fsl_msi.c | 169
> +++++++++++++++++++++++++++++++------
> > arch/powerpc/sysdev/fsl_msi.h | 1 +
> > 4 files changed, 173 insertions(+), 25 deletions(-) create mode
> > 100644 arch/powerpc/include/asm/fsl_msi.h
> >
> > diff --git a/arch/powerpc/include/asm/device.h
> > b/arch/powerpc/include/asm/device.h
> > index 38faede..1c2bfd7 100644
> > --- a/arch/powerpc/include/asm/device.h
> > +++ b/arch/powerpc/include/asm/device.h
> > @@ -40,6 +40,8 @@ struct dev_archdata { #ifdef CONFIG_FAIL_IOMMU
> > int fail_iommu;
> > #endif
> > +
> > + void *context;
> > };
>
> This needs a comment and probably a more specific name.
Ok
>
> > @@ -200,6 +185,12 @@ static struct fsl_msi
> > *fsl_msi_get_reserved_msi_bank(struct pci_dev *pdev) {
> > struct fsl_msi *msi_data = NULL;
> > void *context = NULL;
> > + struct device *dev = &pdev->dev;
> > +
> > + /* Device assigned to userspace if there is valid context */
> > + if (dev->archdata.context) {
> > + context = dev->archdata.context;
> > + }
>
> No {}
Ok, leftover of print debugging :)
>
> >
> > list_for_each_entry(msi_data, &msi_head, list) {
> > if ((msi_data->reserved == MSI_RESERVED) && @@ -208,13
> +199,133 @@
> > static struct fsl_msi *fsl_msi_get_reserved_msi_bank(struct pci_dev
> *pdev)
> > }
> >
> > /* If no MSI bank allocated for kernel owned device, allocate one
> */
> > - msi_data = fsl_msi_allocate_msi_bank(NULL);
> > - if (msi_data)
> > - return msi_data;
> > + if (!context) {
> > + msi_data = fsl_msi_allocate_msi_bank(NULL);
> > + if (msi_data)
> > + return msi_data;
> > + }
> >
> > return NULL;
> > }
> >
> > +/* API to set "context" to which the device belongs */ int
> > +fsl_msi_set_msi_bank_in_dev(struct device *dev, void *data) {
> > + dev->archdata.context = data;
> > + return 0;
> > +}
>
> Do we really need "msi" to appear twice in every function name?
No, will remove later "msi".
>
> > +
> > +/* This API Allows a MSI bank to be reserved for a "context".
> > + * All devices in same "context" will share the allocated
> > + * MSI bank.
> > + * Typically this function will be called from meta
> > + * driver like VFIO with a valid "context".
> > + */
> > +struct fsl_msi *fsl_msi_reserve_msi_bank(void *context) {
> > + struct fsl_msi *msi_data;
> > +
> > + if (!context)
> > + return NULL;
> > +
> > + /* Check if msi-bank already allocated for the context */
> > + list_for_each_entry(msi_data, &msi_head, list) {
> > + if (msi_data->reserved == MSI_FREE)
> > + continue;
> > +
> > + if (context == msi_data->context)
> > + return msi_data;
>
> The reserved == MSI_FREE check doesn't add anything because if it's free
> then the context check will fail.
ok
>
> > +static int is_msi_bank_reserved(struct fsl_msi *msi)
>
> s/int/bool/
Ok
>
>
> > +/*
> > + * This function configures PAMU window for MSI page with
> > + * given iova. Also same iova will be used as "msi-address"
> > + * when configuring msi-message in the devices using this
> > + * msi bank.
> > + */
> > +int fsl_msi_set_msi_bank_region(struct iommu_domain *domain,
> > + void *context , int win,
>
> Whitespace
>
> > @@ -225,12 +336,17 @@ static void fsl_compose_msi_msg(struct pci_dev
> *pdev, int hwirq,
> > int len;
> > const __be64 *reg;
> >
> > - /* If the msi-address-64 property exists, then use it */
> > - reg = of_get_property(hose->dn, "msi-address-64", &len);
> > - if (reg && (len == sizeof(u64)))
> > - address = be64_to_cpup(reg);
> > - else
> > - address = msi_data->msiir;
> > + if (pdev->dev.archdata.context) {
> > + address = msi_data->iova;
> > + } else {
> > + /* If the msi-address-64 property exists, then use it */
> > + reg = of_get_property(hose->dn, "msi-address-64", &len);
> > + if (reg && (len == sizeof(u64)))
> > + address = be64_to_cpup(reg);
> > + else
> > + address = fsl_pci_immrbar_base(hose) +
> > + (msi_data->msiir & 0xfffff);
> > + }
>
> You removed the call to fsl_pci_immrbar_base in patch 1/4 and are
> reintroducing it here. If this call is needed, how does it work in
> between those two patches?
Not needed, will use the msi_data->msiir as per patch 1/4;
>
> > @@ -401,6 +517,9 @@ static int fsl_of_msi_remove(struct platform_device
> *ofdev)
> > struct fsl_msi *msi = platform_get_drvdata(ofdev);
> > int virq, i;
> >
> > + if (is_msi_bank_reserved(msi))
> > + return -EBUSY;
>
> As I mentioned in discussion of a prior version of this, the driver core
> ignores error codes in .remove(). Since there's no reason to remove this
> piece of platform infrastructure, and the remove path has probably never
> been tested, I'd just replace the whole thing with BUG().
Ok,
Thanks a lot
-Bharat
>
> -Scott
>
More information about the Linuxppc-dev
mailing list