> -----Original Message-----
> From: Wood Scott-B07421
> Sent: Thursday, March 12, 2015 5:48 AM
> To: Bhushan Bharat-R65777
> Cc: linuxppc-...@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.bhus...@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
> 

_______________________________________________
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev

Reply via email to