• Ville Syrjälä's avatar
    drm/i915: Add render decompression support · 2e2adb05
    Ville Syrjälä authored
    SKL+ display engine can scan out certain kinds of compressed surfaces
    produced by the render engine. This involved telling the display engine
    the location of the color control surfae (CCS) which describes
    which parts of the main surface are compressed and which are not. The
    location of CCS is provided by userspace as just another plane with its
    own offset.
    
    Add the required stuff to validate the user provided AUX plane metadata
    and convert the user provided linear offset into something the hardware
    can consume.
    
    Due to hardware limitations we require that the main surface and
    the AUX surface (CCS) be part of the same bo. The hardware also
    makes life hard by not allowing you to provide separate x/y offsets
    for the main and AUX surfaces (excpet with NV12), so finding suitable
    offsets for both requires a bit of work. Assuming we still want keep
    playing tricks with the offsets. I've just gone with a dumb "search
    backward for suitable offsets" approach, which is far from optimal,
    but it works.
    
    Also not all planes will be capable of scanning out compressed surfaces,
    and eg. 90/270 degree rotation is not supported in combination with
    decompression either.
    
    This patch may contain work from at least the following people:
    * Vandana Kannan <vandana.kannan@intel.com>
    * Daniel Vetter <daniel@ffwll.ch>
    * Ben Widawsky <ben@bwidawsk.net>
    
    v2: Deal with display workarounds 0390, 0531, 1125 (Paulo)
    v3: Pretend CCS tiles are regular 128 byte wide Y tiles (Jason)
        Put the AUX register defines to the correct place
        Fix up the slightly bogus rotation check
    v4: Use I915_WRITE_FW() due to plane update locking changes
        s/return -EINVAL/goto err/ in intel_framebuffer_init()
        Eliminate a bunch hardcoded numbers in CCS code
    
    v5: (By Ben)
    conflict resolution +
    -               res_blocks += fixed_16_16_to_u32_round_up(y_tile_minimum);
    +               res_blocks += fixed16_to_u32_round_up(y_tile_minimum);
    
    v6: (daniels) Fix botched commit message.
    
    Cc: Paulo Zanoni <paulo.r.zanoni@intel.com>
    Cc: Daniel Vetter <daniel@ffwll.ch>
    Cc: Ben Widawsky <ben@bwidawsk.net>
    Cc: Jason Ekstrand <jason@jlekstrand.net>
    Signed-off-by: default avatarVille Syrjä <ville.syrjala@linux.intel.com>
    Reviewed-by: Ben Widawsky <ben@bwidawsk.net> (v1)
    Reviewed-by: default avatarDaniel Stone <daniels@collabora.com>
    Signed-off-by: default avatarBen Widawsky <ben@bwidawsk.net>
    Signed-off-by: default avatarDaniel Stone <daniels@collabora.com>
    Link: http://patchwork.freedesktop.org/patch/msgid/20170801165817.7063-1-ben@bwidawsk.net
    2e2adb05
intel_display.c 431 KB