Report from 2013 ARM kernel summit
Hiroshi Doyu
hdoyu at nvidia.com
Thu Nov 21 03:49:47 EST 2013
On Wed, 20 Nov 2013 21:22:39 +0100
Stephen Warren <swarren at wwwdotorg.org> wrote:
...
> >> In PATCHv5[2], we took the following DT binding where multiple cell
> >> properties seem to work ok.
> >>
> >> smmu_a: iommu at xxxxxxxx {
> >> #iommu-cells = <2>;
> >> ....
> >> };
> >>
> >> smmu_b: iommu at xxxxxxxx {
> >> #iommu-cells = <3>;
> >> ....
> >> };
> >>
> >> device_a {
> >> iommus = <&smmu_a param1 param2>,
> >> <&smmu_b param1 param2 param3>;
> >> };
> >>
> >> This can describe the relation between a device and an iommu
> >> independently. The number of params needed for each IOMMU can be
> >> sepcified by #iommu-cells in its iommu entry.
> >>
> >> device_a <-> smmu_a, needs 2 params for a device
> >> device_a <-> smmu_b, needs 3 params for a device
> >>
> >> For example, "smmu_a" can be an bus level global IOMMU where all child
> >> devices can be an master of "smmu_a", and "smmu_b" is a local IOMMU
> >> only for "device_a".
> >>
> >> "memory controller"---"smmu_a"---bus--+--"smmu_b"--"device_a"
> >> |
> >> |
> >> +--"device_b"
> >
> > I think the above binding would be the correct way to describe things
> > if you have 1 device connected to 2 IOMMUs (directly rather than
> > chained). IIUC, that is something you have on tegra?
>
> I'm not sure that we do, but perhaps; Hiroshi will have to answer.
> Certainly whenever I personally mentioned chained IOMMUs it was simply
> in the context of making sure the bindings allowed for any potential
> arbitrary HW configuration, not because I had specific knowledge of one
> that actually exists.
In tegra, IOMMUs are chained in a way that:
- "device_a" run in "smmu_b"'s virtual address space.
- "device_a"'s requesting address is transted into "smmu_a"'s virtual
address via "smmu_b".
- This "smmu_a"'s virtual address is translated into physical address
via "smmu_a".
"smmu_a" and "smmu_b" are different driver although we haven't
converted "smmu_b" as the standard IOMMU API yet.
> > For the topology above where you are chaining iommu's, I think
> > something like this is more accurately describing the hierarchy:
> >
> > smmu_b: iommu at xxxxxxxx {
> > #iommu-cells = <3>;
> > iommus = <&smmu_a param1 param2>;
> > ....
> > };
> > device_a {
> > iommus = <&smmu_b param1 param2 param3>;
> > };
This describes the dependency between IOMMUs in Tegra. We can populate
"smmu_a" always earlier than "smmu_b". Those dependency/hierarchy can
be stored in IOMMU class(global IOMMU list), which Thierry suggested.
More information about the linux-arm-kernel
mailing list