05 Apr, 2016

1 commit

  • In MT8173, Normally the first 1GB PA is for the HW SRAM and Regs,
    so the PA will be 33bits if the dram size is 4GB. We have a
    "DRAM 4GB mode" toggle bit for this. If it's enabled, from CPU's
    point of view, the dram PA will be from 0x1_00000000~0x1_ffffffff.

    In short descriptor, the pagetable descriptor is always 32bit.
    Mediatek extend bit9 in the lvl1 and lvl2 pgtable descriptor
    as the 4GB mode.

    In the 4GB mode, the bit9 must be set, then M4U help add 0x1_00000000
    based on the PA in pagetable. Thus the M4U output address to EMI is
    always 33bits(the input address is still 32bits).

    We add a special quirk for this MTK-4GB mode. And in the standard
    spec, Bit9 in the lvl1 is "IMPLEMENTATION DEFINED", while it's AP[2]
    in the lvl2, therefore if this quirk is enabled, NO_PERMS is also
    expected.

    Signed-off-by: Yong Wu
    Reviewed-by: Robin Murphy
    Signed-off-by: Joerg Roedel

    Yong Wu
     

17 Feb, 2016

4 commits

  • As the number of io-pgtable implementations grows beyond 1, it's time
    to rationalise the quirks mechanism before things have a chance to
    start getting really ugly and out-of-hand.

    To that end:
    - Indicate exactly which quirks each format can/does support.
    - Fail creating a table if a caller wants unsupported quirks.
    - Properly document where each quirk applies and why.

    Reviewed-by: Laurent Pinchart
    Signed-off-by: Robin Murphy
    Signed-off-by: Will Deacon

    Robin Murphy
     
  • In certain unmapping situations it is quite possible to end up issuing
    back-to-back TLB synchronisations, which at best is a waste of time and
    effort, and at worst causes some hardware to get rather confused. Whilst
    the pagetable implementations, or the IOMMU drivers, or both, could keep
    track of things to avoid this happening, it seems to make the most sense
    to prevent code duplication and add some simple state tracking in the
    common interface between the two.

    Reviewed-by: Laurent Pinchart
    Signed-off-by: Robin Murphy
    Signed-off-by: Will Deacon

    Robin Murphy
     
  • Add some simple wrappers to avoid having the guts of the TLB operations
    spilled all over the page table implementations, and to provide a point
    to implement extra common functionality.

    Acked-by: Will Deacon
    Acked-by: Laurent Pinchart
    Signed-off-by: Robin Murphy
    Signed-off-by: Will Deacon

    Robin Murphy
     
  • Add a nearly-complete ARMv7 short descriptor implementation, omitting
    only a few legacy and CPU-centric aspects which shouldn't be necessary
    for IOMMU API use anyway.

    Reviewed-by: Yong Wu
    Tested-by: Yong Wu
    Signed-off-by: Yong Wu
    Signed-off-by: Robin Murphy
    Signed-off-by: Will Deacon

    Robin Murphy
     

17 Dec, 2015

2 commits

  • There is no need to keep a useful accessor for a public structure hidden
    away in a private implementation. Move it out alongside the structure
    definition so that other implementations may reuse it.

    Acked-by: Laurent Pinchart
    Signed-off-by: Robin Murphy
    Signed-off-by: Will Deacon

    Robin Murphy
     
  • IOMMU hardware with range-based TLB maintenance commands can work
    happily with the iova and size arguments passed via the tlb_add_flush
    callback, but for IOMMUs which require separate commands per entry in
    the range, it is not straightforward to infer the necessary granularity
    when it comes to issuing the actual commands.

    Add an additional argument indicating the granularity for the benefit
    of drivers needing to know, and update the ARM LPAE code appropriately
    (for non-leaf invalidations we currently just assume the worst-case
    page granularity rather than walking the table to check).

    Signed-off-by: Robin Murphy
    Signed-off-by: Will Deacon

    Robin Murphy
     

14 Aug, 2015

1 commit


06 Aug, 2015

3 commits

  • With the users fully converted to DMA API operations, it's dead, Jim.

    Signed-off-by: Robin Murphy
    Signed-off-by: Will Deacon

    Robin Murphy
     
  • With all current users now opted in to DMA API operations, make the
    iommu_dev pointer mandatory, rendering the flush_pgtable callback
    redundant for cache maintenance. However, since the DMA calls could be
    nops in the case of a coherent IOMMU, we still need to ensure the page
    table updates are fully synchronised against a subsequent page table
    walk. In the unmap path, the TLB sync will usually need to do this
    anyway, so just cement that requirement; in the map path which may
    consist solely of cacheable memory writes (in the coherent case),
    insert an appropriate barrier at the end of the operation, and obviate
    the need to call flush_pgtable on every individual update for
    synchronisation.

    Signed-off-by: Robin Murphy
    [will: slight clarification to tlb_sync comment]
    Signed-off-by: Will Deacon

    Robin Murphy
     
  • Currently, users of the LPAE page table code are (ab)using dma_map_page()
    as a means to flush page table updates for non-coherent IOMMUs. Since
    from the CPU's point of view, creating IOMMU page tables *is* passing
    DMA buffers to a device (the IOMMU's page table walker), there's little
    reason not to use the DMA API correctly.

    Allow IOMMU drivers to opt into DMA API operations for page table
    allocation and updates by providing their appropriate device pointer.
    The expectation is that an LPAE IOMMU should have a full view of system
    memory, so use streaming mappings to avoid unnecessary pressure on
    ZONE_DMA, and treat any DMA translation as a warning sign.

    Signed-off-by: Robin Murphy
    Signed-off-by: Will Deacon

    Robin Murphy
     

19 Jan, 2015

3 commits

  • The quirk causes the Non-Secure bit to be set in all page table entries.

    Signed-off-by: Laurent Pinchart
    Signed-off-by: Will Deacon

    Laurent Pinchart
     
  • A number of IOMMUs found in ARM SoCs can walk architecture-compatible
    page tables.

    This patch adds a generic allocator for Stage-1 and Stage-2 v7/v8
    long-descriptor page tables. 4k, 16k and 64k pages are supported, with
    up to 4-levels of walk to cover a 48-bit address space.

    Tested-by: Laurent Pinchart
    Signed-off-by: Will Deacon

    Will Deacon
     
  • This patch introduces a generic framework for allocating page tables for
    an IOMMU. There are a number of reasons we want to do this:

    - It avoids duplication of complex table management code in IOMMU
    drivers that use the same page table format

    - It removes any coupling with the CPU table format (and even the
    architecture!)

    - It defines an API for IOMMU TLB maintenance

    Tested-by: Laurent Pinchart
    Signed-off-by: Will Deacon

    Will Deacon