Re: [PATCH 07/12] of/device: Add input id to of_dma_configure()

2020-06-04 Thread Lorenzo Pieralisi
On Thu, May 21, 2020 at 05:02:20PM -0600, Rob Herring wrote:
> On Thu, May 21, 2020 at 7:00 AM Lorenzo Pieralisi
>  wrote:
> >
> > Devices sitting on proprietary busses have a device ID space that
> > is owned by the respective bus and related firmware bindings. In order
> > to let the generic OF layer handle the input translations to
> > an IOMMU id, for such busses the current of_dma_configure() interface
> > should be extended in order to allow the bus layer to provide the
> > device input id parameter - that is retrieved/assigned in bus
> > specific code and firmware.
> >
> > Augment of_dma_configure() to add an optional input_id parameter,
> > leaving current functionality unchanged.
> >
> > Signed-off-by: Lorenzo Pieralisi 
> > Cc: Rob Herring 
> > Cc: Robin Murphy 
> > Cc: Joerg Roedel 
> > Cc: Laurentiu Tudor 
> > ---
> >  drivers/bus/fsl-mc/fsl-mc-bus.c |  4 ++-
> >  drivers/iommu/of_iommu.c| 53 +
> >  drivers/of/device.c |  8 +++--
> >  include/linux/of_device.h   | 16 --
> >  include/linux/of_iommu.h|  6 ++--
> >  5 files changed, 60 insertions(+), 27 deletions(-)
> >
> > diff --git a/drivers/bus/fsl-mc/fsl-mc-bus.c 
> > b/drivers/bus/fsl-mc/fsl-mc-bus.c
> > index 40526da5c6a6..8ead3f0238f2 100644
> > --- a/drivers/bus/fsl-mc/fsl-mc-bus.c
> > +++ b/drivers/bus/fsl-mc/fsl-mc-bus.c
> > @@ -118,11 +118,13 @@ static int fsl_mc_bus_uevent(struct device *dev, 
> > struct kobj_uevent_env *env)
> >  static int fsl_mc_dma_configure(struct device *dev)
> >  {
> > struct device *dma_dev = dev;
> > +   struct fsl_mc_device *mc_dev = to_fsl_mc_device(dev);
> > +   u32 input_id = mc_dev->icid;
> >
> > while (dev_is_fsl_mc(dma_dev))
> > dma_dev = dma_dev->parent;
> >
> > -   return of_dma_configure(dev, dma_dev->of_node, 0);
> > +   return of_dma_configure_id(dev, dma_dev->of_node, 0, _id);
> >  }
> >
> >  static ssize_t modalias_show(struct device *dev, struct device_attribute 
> > *attr,
> > diff --git a/drivers/iommu/of_iommu.c b/drivers/iommu/of_iommu.c
> > index ad96b87137d6..4516d5bf6cc9 100644
> > --- a/drivers/iommu/of_iommu.c
> > +++ b/drivers/iommu/of_iommu.c
> > @@ -139,25 +139,53 @@ static int of_pci_iommu_init(struct pci_dev *pdev, 
> > u16 alias, void *data)
> > return err;
> >  }
> >
> > -static int of_fsl_mc_iommu_init(struct fsl_mc_device *mc_dev,
> > -   struct device_node *master_np)
> > +static int of_iommu_configure_dev_id(struct device_node *master_np,
> > +struct device *dev,
> > +const u32 *id)
> 
> Should have read this patch before #6. I guess you could still make
> of_pci_iommu_init() call
> of_iommu_configure_dev_id.

Yes that makes sense, I will update it.

Thanks,
Lorenzo
___
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu


Re: [PATCH 07/12] of/device: Add input id to of_dma_configure()

2020-05-21 Thread Rob Herring
On Thu, May 21, 2020 at 7:00 AM Lorenzo Pieralisi
 wrote:
>
> Devices sitting on proprietary busses have a device ID space that
> is owned by the respective bus and related firmware bindings. In order
> to let the generic OF layer handle the input translations to
> an IOMMU id, for such busses the current of_dma_configure() interface
> should be extended in order to allow the bus layer to provide the
> device input id parameter - that is retrieved/assigned in bus
> specific code and firmware.
>
> Augment of_dma_configure() to add an optional input_id parameter,
> leaving current functionality unchanged.
>
> Signed-off-by: Lorenzo Pieralisi 
> Cc: Rob Herring 
> Cc: Robin Murphy 
> Cc: Joerg Roedel 
> Cc: Laurentiu Tudor 
> ---
>  drivers/bus/fsl-mc/fsl-mc-bus.c |  4 ++-
>  drivers/iommu/of_iommu.c| 53 +
>  drivers/of/device.c |  8 +++--
>  include/linux/of_device.h   | 16 --
>  include/linux/of_iommu.h|  6 ++--
>  5 files changed, 60 insertions(+), 27 deletions(-)
>
> diff --git a/drivers/bus/fsl-mc/fsl-mc-bus.c b/drivers/bus/fsl-mc/fsl-mc-bus.c
> index 40526da5c6a6..8ead3f0238f2 100644
> --- a/drivers/bus/fsl-mc/fsl-mc-bus.c
> +++ b/drivers/bus/fsl-mc/fsl-mc-bus.c
> @@ -118,11 +118,13 @@ static int fsl_mc_bus_uevent(struct device *dev, struct 
> kobj_uevent_env *env)
>  static int fsl_mc_dma_configure(struct device *dev)
>  {
> struct device *dma_dev = dev;
> +   struct fsl_mc_device *mc_dev = to_fsl_mc_device(dev);
> +   u32 input_id = mc_dev->icid;
>
> while (dev_is_fsl_mc(dma_dev))
> dma_dev = dma_dev->parent;
>
> -   return of_dma_configure(dev, dma_dev->of_node, 0);
> +   return of_dma_configure_id(dev, dma_dev->of_node, 0, _id);
>  }
>
>  static ssize_t modalias_show(struct device *dev, struct device_attribute 
> *attr,
> diff --git a/drivers/iommu/of_iommu.c b/drivers/iommu/of_iommu.c
> index ad96b87137d6..4516d5bf6cc9 100644
> --- a/drivers/iommu/of_iommu.c
> +++ b/drivers/iommu/of_iommu.c
> @@ -139,25 +139,53 @@ static int of_pci_iommu_init(struct pci_dev *pdev, u16 
> alias, void *data)
> return err;
>  }
>
> -static int of_fsl_mc_iommu_init(struct fsl_mc_device *mc_dev,
> -   struct device_node *master_np)
> +static int of_iommu_configure_dev_id(struct device_node *master_np,
> +struct device *dev,
> +const u32 *id)

Should have read this patch before #6. I guess you could still make
of_pci_iommu_init() call
of_iommu_configure_dev_id.

Rob
___
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu


[PATCH 07/12] of/device: Add input id to of_dma_configure()

2020-05-21 Thread Lorenzo Pieralisi
Devices sitting on proprietary busses have a device ID space that
is owned by the respective bus and related firmware bindings. In order
to let the generic OF layer handle the input translations to
an IOMMU id, for such busses the current of_dma_configure() interface
should be extended in order to allow the bus layer to provide the
device input id parameter - that is retrieved/assigned in bus
specific code and firmware.

Augment of_dma_configure() to add an optional input_id parameter,
leaving current functionality unchanged.

Signed-off-by: Lorenzo Pieralisi 
Cc: Rob Herring 
Cc: Robin Murphy 
Cc: Joerg Roedel 
Cc: Laurentiu Tudor 
---
 drivers/bus/fsl-mc/fsl-mc-bus.c |  4 ++-
 drivers/iommu/of_iommu.c| 53 +
 drivers/of/device.c |  8 +++--
 include/linux/of_device.h   | 16 --
 include/linux/of_iommu.h|  6 ++--
 5 files changed, 60 insertions(+), 27 deletions(-)

diff --git a/drivers/bus/fsl-mc/fsl-mc-bus.c b/drivers/bus/fsl-mc/fsl-mc-bus.c
index 40526da5c6a6..8ead3f0238f2 100644
--- a/drivers/bus/fsl-mc/fsl-mc-bus.c
+++ b/drivers/bus/fsl-mc/fsl-mc-bus.c
@@ -118,11 +118,13 @@ static int fsl_mc_bus_uevent(struct device *dev, struct 
kobj_uevent_env *env)
 static int fsl_mc_dma_configure(struct device *dev)
 {
struct device *dma_dev = dev;
+   struct fsl_mc_device *mc_dev = to_fsl_mc_device(dev);
+   u32 input_id = mc_dev->icid;
 
while (dev_is_fsl_mc(dma_dev))
dma_dev = dma_dev->parent;
 
-   return of_dma_configure(dev, dma_dev->of_node, 0);
+   return of_dma_configure_id(dev, dma_dev->of_node, 0, _id);
 }
 
 static ssize_t modalias_show(struct device *dev, struct device_attribute *attr,
diff --git a/drivers/iommu/of_iommu.c b/drivers/iommu/of_iommu.c
index ad96b87137d6..4516d5bf6cc9 100644
--- a/drivers/iommu/of_iommu.c
+++ b/drivers/iommu/of_iommu.c
@@ -139,25 +139,53 @@ static int of_pci_iommu_init(struct pci_dev *pdev, u16 
alias, void *data)
return err;
 }
 
-static int of_fsl_mc_iommu_init(struct fsl_mc_device *mc_dev,
-   struct device_node *master_np)
+static int of_iommu_configure_dev_id(struct device_node *master_np,
+struct device *dev,
+const u32 *id)
 {
struct of_phandle_args iommu_spec = { .args_count = 1 };
int err;
 
-   err = of_map_id(master_np, mc_dev->icid, "iommu-map",
+   err = of_map_id(master_np, *id, "iommu-map",
 "iommu-map-mask", _spec.np,
 iommu_spec.args);
if (err)
return err == -ENODEV ? NO_IOMMU : err;
 
-   err = of_iommu_xlate(_dev->dev, _spec);
+   err = of_iommu_xlate(dev, _spec);
of_node_put(iommu_spec.np);
return err;
 }
 
+static int of_iommu_configure_dev(struct device_node *master_np,
+ struct device *dev)
+{
+   struct of_phandle_args iommu_spec;
+   int err = NO_IOMMU, idx = 0;
+
+   while (!of_parse_phandle_with_args(master_np, "iommus",
+  "#iommu-cells",
+  idx, _spec)) {
+   err = of_iommu_xlate(dev, _spec);
+   of_node_put(iommu_spec.np);
+   idx++;
+   if (err)
+   break;
+   }
+
+   return err;
+}
+
+static int of_iommu_configure_device(struct device_node *master_np,
+struct device *dev, const u32 *id)
+{
+   return (id) ? of_iommu_configure_dev_id(master_np, dev, id) :
+ of_iommu_configure_dev(master_np, dev);
+}
+
 const struct iommu_ops *of_iommu_configure(struct device *dev,
-  struct device_node *master_np)
+  struct device_node *master_np,
+  const u32 *id)
 {
const struct iommu_ops *ops = NULL;
struct iommu_fwspec *fwspec = dev_iommu_fwspec_get(dev);
@@ -188,21 +216,8 @@ const struct iommu_ops *of_iommu_configure(struct device 
*dev,
pci_request_acs();
err = pci_for_each_dma_alias(to_pci_dev(dev),
 of_pci_iommu_init, );
-   } else if (dev_is_fsl_mc(dev)) {
-   err = of_fsl_mc_iommu_init(to_fsl_mc_device(dev), master_np);
} else {
-   struct of_phandle_args iommu_spec;
-   int idx = 0;
-
-   while (!of_parse_phandle_with_args(master_np, "iommus",
-  "#iommu-cells",
-  idx, _spec)) {
-   err = of_iommu_xlate(dev, _spec);
-   of_node_put(iommu_spec.np);
-   idx++;
-   if (err)
-   break;
-