• Ville Syrjälä's avatar
    drm/i915: Overcome display engine stride limits via GTT remapping · 54d4d719
    Ville Syrjälä authored
    The display engine stride limits are getting in our way. On SKL+
    we are limited to 8k pixels, which is easily exceeded with three
    4k displays. To overcome this limitation we can remap the pages
    in the GTT to provide the display engine with a view of memory
    with a smaller stride.
    
    The code is mostly already there as We already play tricks with
    the plane surface address and x/y offsets.
    
    A few caveats apply:
    * linear buffers need the fb stride to be page aligned, as
      otherwise the remapped lines wouldn't start at the same
      spot
    * compressed buffers can't be remapped due to the new
      ccs hash mode causing the virtual address of the pages
      to affect the interpretation of the compressed data. IIRC
      the old hash was limited to the low 12 bits so if we were
      using that mode we could remap. As it stands we just refuse
      to remapp with compressed fbs.
    * no remapping gen2/3 as we'd need a fence for the remapped
      vma, which we currently don't have. Need to deal with the
      fence POT requirements, and do something about the gen2
      gtt page size vs tile size difference
    
    v2: Rebase due to is_ccs_modifier()
        Fix up the skl+ stride_mult mess
        memset() the gtt_view because otherwise we could leave
        junk in plane[1] when going from 2 plane to 1 plane format
    v3: intel_check_plane_stride() was split out
    v4: Drop the aligned viewport stuff, it was meant for ccs which
        can't be remapped anyway
    v5: Introduce intel_plane_can_remap()
        Reorder the code so that plane_state->view gets filled
        even for invisible planes, otherwise we'd keep using
        stale values and could explode during remapping. The new
        logic never remaps invisible planes since we don't have
        a viewport, and instead pins the full fb instead
    v6: Fix plane src coord checks after remapping by moving
        plane_state->base.src to the final plane x/y offsets.
        Allow intel_plane_check_stride() to fail even with
        remapping (can happen at least with a linear 64bpp
        fb with a 4k plane and a suitably inconvenient src
        coordinates).
        Improve aux plane FIXME (Daniel)
        Move some code shuffling into a separate patch (Daniel)
    
    Testcase: igt/kms_big_fb
    Cc: Daniel Vetter <daniel@ffwll.ch>
    Signed-off-by: default avatarVille Syrjälä <ville.syrjala@linux.intel.com>
    Link: https://patchwork.freedesktop.org/patch/msgid/20190509122159.24376-6-ville.syrjala@linux.intel.comReviewed-by: default avatarMaarten Lankhorst <maarten.lankhorst@linux.intel.com>
    54d4d719
intel_display.h 12.7 KB