• Ben Widawsky's avatar
    drm/i915: Create page table allocators · 06fda602
    Ben Widawsky authored
    As we move toward dynamic page table allocation, it becomes much easier
    to manage our data structures if break do things less coarsely by
    breaking up all of our actions into individual tasks.  This makes the
    code easier to write, read, and verify.
    
    Aside from the dissection of the allocation functions, the patch
    statically allocates the page table structures without a page directory.
    This remains the same for all platforms,
    
    The patch itself should not have much functional difference. The primary
    noticeable difference is the fact that page tables are no longer
    allocated, but rather statically declared as part of the page directory.
    This has non-zero overhead, but things gain additional complexity as a
    result.
    
    This patch exists for a few reasons:
    1. Splitting out the functions allows easily combining GEN6 and GEN8
    code. Page tables have no difference based on GEN8. As we'll see in a
    future patch when we add the DMA mappings to the allocations, it
    requires only one small change to make work, and error handling should
    just fall into place.
    
    2. Unless we always want to allocate all page tables under a given PDE,
    we'll have to eventually break this up into an array of pointers (or
    pointer to pointer).
    
    3. Having the discrete functions is easier to review, and understand.
    All allocations and frees now take place in just a couple of locations.
    Reviewing, and catching leaks should be easy.
    
    4. Less important: the GFP flags are confined to one location, which
    makes playing around with such things trivial.
    
    v2: Updated commit message to explain why this patch exists
    
    v3: For lrc, s/pdp.page_directory[i].daddr/pdp.page_directory[i]->daddr/
    
    v4: Renamed free_pt/pd_single functions to unmap_and_free_pt/pd (Daniel)
    
    v5: Added additional safety checks in gen8 clear/free/unmap.
    
    v6: Use WARN_ON and return -EINVAL in alloc_pt_range (Mika).
    
    v7: Make err_out loop symmetrical to the way we allocate in
    alloc_pt_range. Also s/page_tables/page_table and correct commit
    message (Mika)
    
    Cc: Mika Kuoppala <mika.kuoppala@linux.intel.com>
    Signed-off-by: default avatarBen Widawsky <ben@bwidawsk.net>
    Signed-off-by: Michel Thierry <michel.thierry@intel.com> (v3+)
    Reviewed-by: default avatarMika Kuoppala <mika.kuoppala@intel.com>
    Signed-off-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
    06fda602
i915_gem_gtt.c 63.4 KB