• Ville Syrjälä's avatar
    drm/i915: Use unlocked register accesses for LUT loads · 115e0f68
    Ville Syrjälä authored
    We have to bash in a lot of registers to load the higher
    precision LUT modes. The locking overhead is significant, especially
    as we have to get this done as quickly as possible during vblank.
    So let's switch to unlocked accesses for these. Fortunately the LUT
    registers are mostly spread around such that two pipes do not have
    any registers on the same cacheline. So as long as commits on the
    same pipe are serialized (which they are) we should get away with
    this without angering the hardware.
    
    The only exceptions are the PREC_PIPEGCMAX registers on ilk/snb which
    we don't use atm as they are only used in the 12bit gamma mode. If/when
    we add support for that we may need to remember to still serialize
    those registers, though I'm not sure ilk/snb are actually affected
    by the same cacheline issue. I think ivb/hsw at least were, but they
    use a different set of registers for the precision LUT.
    
    I have a test case which is updating the LUTs on two pipes from a
    single atomic commit. Running that in a loop for a minute I get the
    following worst case with the locks in place:
     intel_crtc_vblank_work_start: pipe B, frame=10037, scanline=1081
     intel_crtc_vblank_work_start: pipe A, frame=12274, scanline=769
     intel_crtc_vblank_work_end: pipe A, frame=12274, scanline=58
     intel_crtc_vblank_work_end: pipe B, frame=10037, scanline=74
    
    And here's the worst case with the locks removed:
     intel_crtc_vblank_work_start: pipe B, frame=5869, scanline=1081
     intel_crtc_vblank_work_start: pipe A, frame=7616, scanline=769
     intel_crtc_vblank_work_end: pipe B, frame=5869, scanline=1096
     intel_crtc_vblank_work_end: pipe A, frame=7616, scanline=777
    
    The test was done on a snb using the 10bit 1024 entry LUT mode.
    The vtotals for the two displays are 793 and 1125. So we can
    see that with the locks ripped out the LUT updates are pretty
    nicely confined within the vblank, whereas with the locks in
    place we're routinely blasting past the vblank end which causes
    visual artifacts near the top of the screen.
    Signed-off-by: default avatarVille Syrjälä <ville.syrjala@linux.intel.com>
    Link: https://patchwork.freedesktop.org/patch/msgid/20211020223339.669-5-ville.syrjala@linux.intel.comReviewed-by: default avatarUma Shankar <uma.shankar@intel.com>
    115e0f68
intel_dsb.c 9.21 KB