1. 04 Nov, 2021 9 commits
    • Ville Syrjälä's avatar
      drm/i915: Split vlv/chv sprite plane update into noarm+arm pair · a14fef80
      Ville Syrjälä authored
      Chop vlv_sprite_update() into two halves. Fist half becomes
      the _noarm() variant, second part the _arm() variant.
      
      Fortunately I have already previously grouped the register
      writes into roughtly the correct order, so the split looks
      surprisingly clean.
      
      Looks like most of the hardware logic was copied from the
      pre-ctg sprite C, so SPSTRIDE/POS/SIZE are armed by SPSURF,
      while the rest are self arming. SPCONSTALPHA is the one
      entirely new register that didn't exist in the old sprite C,
      and looks like that one is self arming. The CHV pipe B CSC
      is also self arming, like the rest of the CHV pipe B
      additions.
      
      I didn't have time to capture i915_update_info numbers for
      these, but since all the other platforms generally showed
      improvements, and crucially no regression, I am fairly
      confident this should behave similarly.
      
      Cc: Stanislav Lisovskiy <stanislav.lisovskiy@intel.com>
      Signed-off-by: default avatarVille Syrjälä <ville.syrjala@linux.intel.com>
      Link: https://patchwork.freedesktop.org/patch/msgid/20211018115030.3547-10-ville.syrjala@linux.intel.comReviewed-by: default avatarStanislav Lisovskiy <stanislav.lisovskiy@intel.com>
      a14fef80
    • Ville Syrjälä's avatar
      drm/i915: Split ivb+ sprite plane update into noarm+arm pair · 50105a3a
      Ville Syrjälä authored
      Chop ivb_sprite_update() into two halves. Fist half becomes
      the _noarm() variant, second part the _arm() variant.
      
      Fortunately I have already previously grouped the register
      writes into roughtly the correct order, so the split looks
      surprisingly clean.
      
      Didn't bother with i915_update_info numbers for this one.
      I expect the results to be pretty much identical to the snb
      numbers from the corresponding g4x+ sprite modification.
      
      Cc: Stanislav Lisovskiy <stanislav.lisovskiy@intel.com>
      Signed-off-by: default avatarVille Syrjälä <ville.syrjala@linux.intel.com>
      Link: https://patchwork.freedesktop.org/patch/msgid/20211018115030.3547-9-ville.syrjala@linux.intel.comReviewed-by: default avatarStanislav Lisovskiy <stanislav.lisovskiy@intel.com>
      50105a3a
    • Ville Syrjälä's avatar
      drm/i915: Split g4x+ sprite plane update into noarm+arm pair · 120542e2
      Ville Syrjälä authored
      Chop g4x_sprite_update() into two halves. Fist half becomes
      the _noarm() variant, second part the _arm() variant.
      
      Fortunately I have already previously grouped the register
      writes into roughtly the correct order, so the split looks
      surprisingly clean.
      
      Not much of a change in i915_update_info on these older
      platforms that don't have so many planes or registers to
      begin with. Here are the numbers from snb (totally unpatched
      vs. both primary plane and sprite patched applied) running
      kms_atomic_transition --r plane-all-transition --extended:
      w/o patch                           w/ patch
      Updates: 5404			    Updates: 5405
             |			    	   |
         1us |******			       1us |******
             |*********		    	   |*********
         4us |***********		       4us |***********
             |**********		    	   |**********
        16us |**			      16us |**
             |			    	   |
        66us |			      66us |
             |			    	   |
       262us |			     262us |
             |			    	   |
         1ms |			       1ms |
             |			    	   |
         4ms |			       4ms |
             |			    	   |
        17ms |			      17ms |
             |			    	   |
      Min update: 1400ns		    Min update: 1307ns
      Max update: 19809ns		    Max update: 20194ns
      Average update: 6957ns		    Average update: 6432ns
      Overruns > 100us: 0		    Overruns > 100us: 0
      
      But there seems to be a slight improvement with
      lockdep enabled:
      w/o patch                           w/ patch
      Updates: 17612			    Updates: 16364
             |			    	   |
         1us |			       1us |
             |******			    	   |******
         4us |**********		       4us |**********
             |************		    	   |*************
        16us |*************		      16us |************
             |***			    	   |*
        66us |			      66us |
             |			    	   |
       262us |			     262us |
             |			    	   |
         1ms |			       1ms |
             |			    	   |
         4ms |			       4ms |
             |			    	   |
        17ms |			      17ms |
             |			    	   |
      Min update: 3141ns		    Min update: 3562ns
      Max update: 126450ns		    Max update: 73354ns
      Average update: 16373ns		    Average update: 15153ns
      Overruns > 250us: 0		    Overruns > 250us: 0
      
      Cc: Stanislav Lisovskiy <stanislav.lisovskiy@intel.com>
      Signed-off-by: default avatarVille Syrjälä <ville.syrjala@linux.intel.com>
      Link: https://patchwork.freedesktop.org/patch/msgid/20211018115030.3547-8-ville.syrjala@linux.intel.comReviewed-by: default avatarStanislav Lisovskiy <stanislav.lisovskiy@intel.com>
      120542e2
    • Ville Syrjälä's avatar
      drm/i915: Split pre-skl primary plane update into noarm+arm pair · 4d0d77de
      Ville Syrjälä authored
      Chop i9xx_plane_update() into two halves. Fist half becomes
      the _noarm() variant, second part the _arm() variant.
      
      Fortunately I have already previously grouped the register
      writes into roughtly the correct order, so the split looks
      surprisingly clean.
      
      One slightly surprising fact was that the CHV pipe B PRIMPOS/SIZE
      registers are self arming unlike their pre-ctg DSPPOS/SIZE
      counterparts. In fact all the new CHV pipe B registers are
      self arming.
      
      Also we must remind ourselves that i830/i845 are a bit borked
      in that all of their plane registers are self-arming.
      
      I didn't do any i915_update_info measurements for this one
      alone. I'll get total numbers with the corrsponding sprite
      plane changes.
      
      v2: Don't break my precious i830/i845
      
      Cc: Stanislav Lisovskiy <stanislav.lisovskiy@intel.com>
      Signed-off-by: default avatarVille Syrjälä <ville.syrjala@linux.intel.com>
      Link: https://patchwork.freedesktop.org/patch/msgid/20211020212757.13517-1-ville.syrjala@linux.intel.comReviewed-by: default avatarStanislav Lisovskiy <stanislav.lisovskiy@intel.com>
      4d0d77de
    • Ville Syrjälä's avatar
      drm/i915: Split skl+ plane update into noarm+arm pair · 890b6ec4
      Ville Syrjälä authored
      Chop skl_program_plane() into two halves. Fist half becomes
      the _noarm() variant, second part the _arm() variant.
      
      Fortunately I have already previously grouped the register
      writes into roughtly the correct order, so the split looks
      surprisingly clean.
      
      A few notable oddities I did not realize were self arming
      are AUX_DIST and COLOR_CTL.
      
      i915_update_info doesn't look too terrible on my cfl running
      kms_atomic_transition --r plane-all-transition --extended:
      w/o patch                           w/ patch
      Updates: 2178                       Updates: 2018
             |                                   |
         1us |                               1us |
             |                                   |
         4us |                               4us |*****
             |*********                          |**********
        16us |**********                    16us |*******
             |***                                |
        66us |                              66us |
             |                                   |
       262us |                             262us |
             |                                   |
         1ms |                               1ms |
             |                                   |
         4ms |                               4ms |
             |                                   |
        17ms |                              17ms |
             |                                   |
      Min update: 8332ns                  Min update: 6164ns
      Max update: 48758ns                 Max update: 31808ns
      Average update: 19959ns             Average update: 13159ns
      Overruns > 100us: 0                 Overruns > 100us: 0
      
      And with lockdep enabled:
      w/o patch                           w/ patch
      Updates: 2177			    Updates: 2172
             |			    	   |
         1us |			       1us |
             |			    	   |
         4us |			       4us |
             |*******			    	   |*********
        16us |**********		      16us |**********
             |*******			    	   |*
        66us |			      66us |
             |			    	   |
       262us |			     262us |
             |			    	   |
         1ms |			       1ms |
             |			    	   |
         4ms |			       4ms |
             |			    	   |
        17ms |			      17ms |
             |			    	   |
      Min update: 12645ns		    Min update: 9980ns
      Max update: 50153ns		    Max update: 33533ns
      Average update: 25337ns		    Average update: 18245ns
      Overruns > 250us: 0		    Overruns > 250us: 0
      
      TODO: On icl+ everything seems to be armed by PLANE_SURF, so we
            can optimize this even further on modern platforms. But I
            think there's a bit of refactoring to be done first to
            figure out the best way to go about it (eg. just reusing
            the current skl+ functions, or doing a lower level split).
      
      TODO: Split scaler programming as well, but IIRC the scaler
            has some oddball double buffering behaviour on some
            platforms, so needs proper reverse engineering
      
      Cc: Stanislav Lisovskiy <stanislav.lisovskiy@intel.com>
      Signed-off-by: default avatarVille Syrjälä <ville.syrjala@linux.intel.com>
      Link: https://patchwork.freedesktop.org/patch/msgid/20211018115030.3547-6-ville.syrjala@linux.intel.comReviewed-by: default avatarStanislav Lisovskiy <stanislav.lisovskiy@intel.com>
      890b6ec4
    • Ville Syrjälä's avatar
      drm/i915: Split update_plane() into update_noarm() + update_arm() · 8ac80733
      Ville Syrjälä authored
      The amount of plane registers we have to write has been steadily
      increasing, putting more pressure on the vblank evasion mechanism
      and forcing us to increase its time budget. Let's try to take some
      of the pressure off by splitting plane updates into two parts:
      1) write all non-self arming plane registers, ie. the registers
         where the write actually does nothing until a separate arming
         register is also written which will cause the hardware to latch
         the new register values at the next start of vblank
      2) write all self arming plane registers, ie. registers which always
         just latch at the next start of vblank, and registers which also
         arm other registers to do so
      
      Here we just provide the mechanism, but don't actually implement
      the split on any platform yet. so everything stays now in the _arm()
      hooks. Subsequently we can move a whole bunch of stuff into the
      _noarm() part, especially in more modern platforms where the number
      of registers we have to write is also the greatest. On older
      platforms this is less beneficial probably, but no real reason
      to deviate from a common behaviour.
      
      And let's sprinkle some TODOs around the areas that will need
      adapting.
      
      Cc: Stanislav Lisovskiy <stanislav.lisovskiy@intel.com>
      Signed-off-by: default avatarVille Syrjälä <ville.syrjala@linux.intel.com>
      Link: https://patchwork.freedesktop.org/patch/msgid/20211018115030.3547-5-ville.syrjala@linux.intel.comReviewed-by: default avatarStanislav Lisovskiy <stanislav.lisovskiy@intel.com>
      8ac80733
    • Ville Syrjälä's avatar
      drm/i915: Fix up the sprite namespacing · e56b80d9
      Ville Syrjälä authored
      Give all sprite exclusive functions/etc. a proper namespace.
      
      Cc: Stanislav Lisovskiy <stanislav.lisovskiy@intel.com>
      Signed-off-by: default avatarVille Syrjälä <ville.syrjala@linux.intel.com>
      Link: https://patchwork.freedesktop.org/patch/msgid/20211018115030.3547-4-ville.syrjala@linux.intel.comReviewed-by: default avatarStanislav Lisovskiy <stanislav.lisovskiy@intel.com>
      e56b80d9
    • Ville Syrjälä's avatar
      drm/i915: Fix async flip with decryption and/or DPT · 50faf7a1
      Ville Syrjälä authored
      We're currently forgetting to set the PLANE_SURF_DECRYPT
      flag in the async flip path. So if the hardware were to
      latch that bit despite this being an async flip we'd start
      scanning out garbage. And if it doesn't latch it then I
      guess we'd just end up with a weird register value that
      doesn't actually match the hardware state, which isn't
      great for anyone staring at register dumps.
      
      Similarly the async flip path also forgets to call
      skl_surf_address() which means the DPT address space to
      GGTT address space downshift is not being applied to
      the offset. Which means we are pointing PLANE_SURF
      at some random location in GGTT instead of the correct
      DPT page.
      
      So let's fix two birds with one stone and extract the
      PLANE_SURF calculation from skl_program_plane() into
      a small helper and use it in the async flip path as well.
      
      Cc: Anshuman Gupta <anshuman.gupta@intel.com>
      Cc: Daniele Ceraolo Spurio <daniele.ceraolospurio@intel.com>
      Cc: Juston Li <juston.li@intel.com>
      Cc: Rodrigo Vivi <rodrigo.vivi@intel.com>
      Cc: Uma Shankar <uma.shankar@intel.com>
      Cc: Karthik B S <karthik.b.s@intel.com>
      Signed-off-by: default avatarVille Syrjälä <ville.syrjala@linux.intel.com>
      Link: https://patchwork.freedesktop.org/patch/msgid/20211018115030.3547-3-ville.syrjala@linux.intel.comReviewed-by: default avatarStanislav Lisovskiy <stanislav.lisovskiy@intel.com>
      50faf7a1
    • Ville Syrjälä's avatar
      drm/i915: Reject planar formats when doing async flips · aaec72ee
      Ville Syrjälä authored
      Async flips are only capable of changing PLANE_SURF, hence we
      they can't easily be used with planar formats.
      
      Older platforms could require updating AUX_DIST as well, which
      is not possible. We'd have to make sure AUX_DIST doesn't change
      before allowing the async flip through. If we could get async
      flips with CCS then that might be interesting, but since the hw
      doesn't allow async flips with CCS I don't see much point in
      allowing this for planar formats either. No one renders their
      game content in YUV anyway.
      
      icl+ could in theory do this I suppose since each color plane
      has its own PLANE_SURF register, but I don't know if there is
      some magic to guarantee that both the Y and UV plane would
      async flip synchronously if you will. Ie. beyond just a clean
      tear we'd potentially get some kind of weird tear with some
      random mix of luma and chroma from the old and new frames.
      
      So let's just say no to async flips when scanning out planar
      formats.
      
      Cc: Karthik B S <karthik.b.s@intel.com>
      Signed-off-by: default avatarVille Syrjälä <ville.syrjala@linux.intel.com>
      Link: https://patchwork.freedesktop.org/patch/msgid/20211018115030.3547-2-ville.syrjala@linux.intel.comReviewed-by: default avatarStanislav Lisovskiy <stanislav.lisovskiy@intel.com>
      aaec72ee
  2. 03 Nov, 2021 12 commits
  3. 02 Nov, 2021 8 commits
  4. 01 Nov, 2021 4 commits
  5. 29 Oct, 2021 7 commits