• Robin Murphy's avatar
    iommu/io-pgtable-arm: Don't use dma_to_phys() · ffcb6d16
    Robin Murphy authored
    In checking whether DMA addresses differ from physical addresses, using
    dma_to_phys() is actually the wrong thing to do, since it may hide any
    DMA offset, which is precisely one of the things we are checking for.
    Simply casting between the two address types, whilst ugly, is in fact
    the appropriate course of action. Further care (and ugliness) is also
    necessary in the comparison to avoid truncation if phys_addr_t and
    dma_addr_t differ in size.
    
    We can also reject any device with a fixed DMA offset up-front at page
    table creation, leaving the allocation-time check for the more subtle
    cases like bounce buffering due to an incorrect DMA mask.
    
    Furthermore, we can then fix the hackish KConfig dependency so that
    architectures without a dma_to_phys() implementation may still
    COMPILE_TEST (or even use!) the code. The true dependency is on the
    DMA API, so use the appropriate symbol for that.
    Signed-off-by: default avatarRobin Murphy <robin.murphy@arm.com>
    [will: folded in selftest fix from Yong Wu]
    Signed-off-by: default avatarWill Deacon <will.deacon@arm.com>
    ffcb6d16
io-pgtable-arm.c 27.7 KB