Hi Robin, Cheers for doing this. Just a few comments (mainly in relation to being consistent with SMMUv3).
On Mon, Jul 27, 2015 at 07:18:09PM +0100, Robin Murphy wrote: > Currently we detect the whether the SMMU has coherent page table walk "we detect the whether"? > capability from the IDR0.CTTW field, and base our cache maintenance > decisions on that. In preparation for fixing the bogus DMA API usage, > however, we need to ensure that the DMA API agrees about this, which > necessitates deferring to the dma-coherent property in the device tree > for the final say. > > As an added bonus, since systems exist where an external CTTW signal > has been tied off incorrectly at integration, allowing DT to override > it offers a neat workaround for coherency issues with such SMMUs. > > Signed-off-by: Robin Murphy <robin.mur...@arm.com> > --- > Documentation/devicetree/bindings/iommu/arm,smmu.txt | 4 ++++ > drivers/iommu/arm-smmu.c | 17 ++++++++++++++--- > 2 files changed, 18 insertions(+), 3 deletions(-) > > diff --git a/Documentation/devicetree/bindings/iommu/arm,smmu.txt > b/Documentation/devicetree/bindings/iommu/arm,smmu.txt > index 0676050..04724fc 100644 > --- a/Documentation/devicetree/bindings/iommu/arm,smmu.txt > +++ b/Documentation/devicetree/bindings/iommu/arm,smmu.txt > @@ -43,6 +43,10 @@ conditions. > > ** System MMU optional properties: > > +- dma-coherent : Presence or absence should correctly reflect whether > + the SMMU translation table walk interface is > + cache-coherent with the CPU. > + Please copy the text from: Documentation/devicetree/bindings/iommu/arm,smmu-v3.txt# and remove the bit about stream table accesses. > - calxeda,smmu-secure-config-access : Enable proper handling of buggy > implementations that always use secure access to > SMMU configuration registers. In this case non-secure > diff --git a/drivers/iommu/arm-smmu.c b/drivers/iommu/arm-smmu.c > index 4cd0c29..9a59bef 100644 > --- a/drivers/iommu/arm-smmu.c > +++ b/drivers/iommu/arm-smmu.c > @@ -1532,6 +1532,7 @@ static int arm_smmu_device_cfg_probe(struct > arm_smmu_device *smmu) > unsigned long size; > void __iomem *gr0_base = ARM_SMMU_GR0(smmu); > u32 id; > + bool cttw_dt, cttw_reg; > > dev_notice(smmu->dev, "probing hardware configuration...\n"); > dev_notice(smmu->dev, "SMMUv%d with:\n", smmu->version); > @@ -1571,10 +1572,20 @@ static int arm_smmu_device_cfg_probe(struct > arm_smmu_device *smmu) > dev_notice(smmu->dev, "\taddress translation ops\n"); > } > > - if (id & ID0_CTTW) { > + /* > + * In order for DMA API calls to work properly, we must defer to what > + * the DT says about coherency, regardless of what the hardware claims. > + * Fortunately, this also opens up a workaround for systems where the > + * ID register value has ended up configured incorrectly. > + */ > + cttw_dt = of_property_read_bool(smmu->dev->of_node, "dma-coherent"); Use of_dma_is_coherent(smmu->dev->of_node) > + if (cttw_dt) > smmu->features |= ARM_SMMU_FEAT_COHERENT_WALK; > - dev_notice(smmu->dev, "\tcoherent table walk\n"); > - } > + cttw_reg = !!(id & ID0_CTTW); > + if (cttw_dt || cttw_reg) > + dev_notice(smmu->dev, "\t%scoherent table walk%s\n", > + cttw_dt ? "" : "no ", > + (cttw_dt == cttw_reg) ? "" : " (overridden by DT)"); Similarly here; I think we should just follow the message printed by the SMMUv3 driver but s/IDR0.COHACC/ID0.CTTW/. Will _______________________________________________ iommu mailing list iommu@lists.linux-foundation.org https://lists.linuxfoundation.org/mailman/listinfo/iommu