iommu/arm-smmu: Treat all device transactions as unprivileged
authorRobin Murphy <robin.murphy@arm.com>
Tue, 26 Jan 2016 18:06:34 +0000 (18:06 +0000)
committerWill Deacon <will.deacon@arm.com>
Thu, 18 Feb 2016 15:02:42 +0000 (15:02 +0000)
commitd346180e70b91b3d5a1ae7e5603e65593d4622bc
treeecbca73d56b0a53111a0a672fb0423aa14c7a332
parent18558cae0272f8fd9647e69d3fec1565a7949865
iommu/arm-smmu: Treat all device transactions as unprivileged

The IOMMU API has no concept of privilege so assumes all devices and
mappings are equal, and indeed most non-CPU master devices on an AMBA
interconnect make little use of the attribute bits on the bus thus by
default perform unprivileged data accesses.

Some devices, however, believe themselves more equal than others, such
as programmable DMA controllers whose 'master' thread issues bus
transactions marked as privileged instruction fetches, while the data
accesses of its channel threads (under the control of Linux, at least)
are marked as unprivileged. This poses a problem for implementing the
DMA API on an IOMMU conforming to ARM VMSAv8, under which a page that is
unprivileged-writeable is also implicitly privileged-execute-never.
Given that, there is no one set of attributes with which iommu_map() can
implement, say, dma_alloc_coherent() that will allow every possible type
of access without something running into unexecepted permission faults.

Fortunately the SMMU architecture provides a means to mitigate such
issues by overriding the incoming attributes of a transaction; make use
of that to strip the privileged/unprivileged status off incoming
transactions, leaving just the instruction/data dichotomy which the
IOMMU API does at least understand; Four states good, two states better.

Signed-off-by: Robin Murphy <robin.murphy@arm.com>
Signed-off-by: Will Deacon <will.deacon@arm.com>
drivers/iommu/arm-smmu.c