• Robin Murphy's avatar
    iommu/arm-smmu: Treat all device transactions as unprivileged · d346180e
    Robin Murphy authored
    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: default avatarRobin Murphy <robin.murphy@arm.com>
    Signed-off-by: default avatarWill Deacon <will.deacon@arm.com>
    d346180e
arm-smmu.c 50.1 KB