1. 11 7月, 2014 4 次提交
  2. 10 7月, 2014 4 次提交
  3. 09 7月, 2014 1 次提交
    • M
      drm/i915: Make use of intel_fb_obj() (v2) · 2ff8fde1
      Matt Roper 提交于
      This should hopefully simplify the display code slightly and also
      solves at least one mistake in intel_pipe_set_base() where
      to_intel_framebuffer(fb)->obj is referenced during local variable
      initialization, before 'if (!fb)' gets checked.
      
      Potential uses of this macro were identified via the following
      Coccinelle patch:
      
              @@
              expression E;
              @@
              * to_intel_framebuffer(E)->obj
      
              @@
              expression E;
              identifier I;
              @@
                I = to_intel_framebuffer(E);
                ...
              * I->obj
      
      v2: Rewrite some NULL tests in terms of the obj rather than the fb.
          Also add a WARN() if trying to pageflip with a disabled primary
          plane.  [Suggested by Chris Wilson]
      Signed-off-by: NMatt Roper <matthew.d.roper@intel.com>
      Reviewed-by: NChris Wilson <chris@chris-wilson.co.uk>
      Signed-off-by: NDaniel Vetter <daniel.vetter@ffwll.ch>
      2ff8fde1
  4. 08 7月, 2014 4 次提交
  5. 07 7月, 2014 10 次提交
  6. 02 7月, 2014 1 次提交
  7. 30 6月, 2014 1 次提交
  8. 27 6月, 2014 1 次提交
    • V
      drm/i915: Wait for vblank after enabling the primary plane on BDW · 33c3b0d1
      Ville Syrjälä 提交于
      BDW signals the flip done interrupt immediately after the DSPSURF write
      when the plane is disabled. This is true even if we've already armed
      DSPCNTR to enable the plane at the next vblank. This causes major
      problems for our page flip code which relies on the flip done interrupts
      happening at vblank time.
      
      So what happens is that we enable the plane, and immediately allow
      userspace to submit a page flip. If the plane is still in the process
      of being enabled when the page flip is issued, the flip done gets
      signalled immediately. Our DSPSURFLIVE check catches this to prevent
      premature flip completion, but it also means that we don't get a flip
      done interrupt when the plane actually gets enabled, and so the page
      flip is never completed.
      
      Work around this by re-introducing blocking vblank waits on BDW
      whenever we enable the primary plane.
      
      I removed some of the vblank waits here:
       commit 6304cd91
       Author: Ville Syrjälä <ville.syrjala@linux.intel.com>
       Date:   Fri Apr 25 13:30:12 2014 +0300
      
          drm/i915: Drop the excessive vblank waits from modeset codepaths
      
      To avoid these blocking vblank waits we should start using the vblank
      interrupt instead of the flip done interrupt to complete page flips.
      But that's material for another patch.
      
      Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=79354Tested-by: NGuo Jinxian <jinxianx.guo@intel.com>
      Signed-off-by: NVille Syrjälä <ville.syrjala@linux.intel.com>
      Reviewed-by: NRodrigo Vivi <rodrigo.vivi@intel.com>
      Signed-off-by: NJani Nikula <jani.nikula@intel.com>
      33c3b0d1
  9. 25 6月, 2014 2 次提交
  10. 23 6月, 2014 1 次提交
  11. 20 6月, 2014 2 次提交
    • D
      drm/i915: Track frontbuffer invalidation/flushing · f99d7069
      Daniel Vetter 提交于
      So these are the guts of the new beast. This tracks when a frontbuffer
      gets invalidated (due to frontbuffer rendering) and hence should be
      constantly scaned out, and when it's flushed again and can be
      compressed/one-shot-upload.
      
      Rules for flushing are simple: The frontbuffer needs one more full
      upload starting from the next vblank. Which means that the flushing
      can _only_ be called once the frontbuffer update has been latched.
      
      But this poses a problem for pageflips: We can't just delay the
      flushing until the pageflip is latched, since that would pose the risk
      that we override frontbuffer rendering that has been scheduled
      in-between the pageflip ioctl and the actual latching.
      
      To handle this track asynchronous invalidations (and also pageflip)
      state per-ring and delay any in-between flushing until the rendering
      has completed. And also cancel any delayed flushing if we get a new
      invalidation request (whether delayed or not).
      
      Also call intel_mark_fb_busy in both cases in all cases to make sure
      that we keep the screen at the highest refresh rate both on flips,
      synchronous plane updates and for frontbuffer rendering.
      
      v2: Lots of improvements
      
      Suggestions from Chris:
      - Move invalidate/flush in flush_*_domain and set_to_*_domain.
      - Drop the flush in busy_ioctl since it's redundant. Was a leftover
        from an earlier concept to track flips/delayed flushes.
      - Don't forget about the initial modeset enable/final disable.
        Suggested by Chris.
      
      Track flips accurately, too. Since flips complete independently of
      rendering we need to track pending flips in a separate mask. Again if
      an invalidate happens we need to cancel the evenutal flush to avoid
      races.
      
      v3:
      Provide correct header declarations for flip functions. Currently not
      needed outside of intel_display.c, but part of the proper interface.
      
      v4: Add proper domain management to fbcon so that the fbcon buffer is
      also tracked correctly.
      
      v5: Fixup locking around the fbcon set_to_gtt_domain call.
      
      v6: More comments from Chris:
      - Split out fbcon changes.
      - Drop superflous checks for potential scanout before calling intel_fb
        functions - we can micro-optimize this later.
      - s/intel_fb_/intel_fb_obj_/ to make it clear that this deals in gem
        object. We already have precedence for fb_obj in the pin_and_fence
        functions.
      
      v7: Clarify the semantics of the flip flush handling by renaming
      things a bit:
      - Don't go through a gem object but take the relevant frontbuffer bits
        directly. These functions center on the plane, the actual object is
        irrelevant - even a flip to the same object as already active should
        cause a flush.
      - Add a new intel_frontbuffer_flip for synchronous plane updates. It
        currently just calls intel_frontbuffer_flush since the implemenation
        differs.
      
      This way we achieve a clear split between one-shot update events on
      one side and frontbuffer rendering with potentially a very long delay
      between the invalidate and flush.
      
      Chris and I also had some discussions about mark_busy and whether it
      is appropriate to call from flush. But mark busy is a state which
      should be derived from the 3 events (invalidate, flush, flip) we now
      have by the users, like psr does by tracking relevant information in
      psr.busy_frontbuffer_bits. DRRS (the only real use of mark_busy for
      frontbuffer) needs to have similar logic. With that the overall
      mark_busy in the core could be removed.
      
      v8: Only when retiring gpu buffers only flush frontbuffer bits we
      actually invalidated in a batch. Just for safety since before any
      additional usage/invalidate we should always retire current rendering.
      Suggested by Chris Wilson.
      
      v9: Actually use intel_frontbuffer_flip in all appropriate places.
      Spotted by Chris.
      
      v10: Address more comments from Chris:
      - Don't call _flip in set_base when the crtc is inactive, avoids redunancy
        in the modeset case with the initial enabling of all planes.
      - Add comments explaining that the initial/final plane enable/disable
        still has work left to do before it's fully generic.
      
      v11: Only invalidate for gtt/cpu access when writing. Spotted by Chris.
      
      v12: s/_flush/_flip/ in intel_overlay.c per Chris' comment.
      
      Cc: Rodrigo Vivi <rodrigo.vivi@intel.com>
      Cc: Chris Wilson <chris@chris-wilson.co.uk>
      Reviewed-by: NChris Wilson <chris@chris-wilson.co.uk>
      Signed-off-by: NDaniel Vetter <daniel.vetter@ffwll.ch>
      f99d7069
    • D
      drm/i915: Use new frontbuffer bits to increase pll clock · cc36513c
      Daniel Vetter 提交于
      The downclocking checks a few more things, so not that simple to
      convert. Also, this should get unified with the drrs handling and also
      use the locking of that. Otoh the drrs locking is about as hapzardous
      as no locking, at least on first sight.
      
      For easier conversion ditch the upclocking on unload - we'll turn off
      everything anyway.
      Reviewed-by: NChris Wilson <chris@chris-wilson.co.uk>
      Signed-off-by: NDaniel Vetter <daniel.vetter@ffwll.ch>
      cc36513c
  12. 19 6月, 2014 3 次提交
    • D
      drm/i915: Introduce accurate frontbuffer tracking · a071fa00
      Daniel Vetter 提交于
      So from just a quick look we seem to have enough information to
      accurately figure out whether a given gem bo is used as a frontbuffer
      and where exactly: We have obj->pin_count as a first check with no
      false negatives and only negligible false positives. And then we can
      just walk the modeset objects and figure out where exactly a buffer is
      used as scanout.
      
      Except that we can't due to locking order: If we already hold
      dev->struct_mutex we can't acquire any modeset locks, so could
      potential chase freed pointers and other evil stuff.
      
      So we need something else. For that introduce a new set of bits
      obj->frontbuffer_bits to track where a buffer object is used. That we
      can then chase without grabbing any modeset locks.
      
      Of course the consumers of this (DRRS, PSR, FBC, ...) still need to be
      able to do their magic both when called from modeset and from gem
      code. But that can be easily achieved by adding locks for these
      specific subsystems which always nest within either kms or gem
      locking.
      
      This patch just adds the relevant update code to all places.
      
      Note that if we ever support multi-planar scanout targets then we need
      one frontbuffer tracking bit per attachment point that we expose to
      userspace.
      
      v2:
      - Fix more oopsen. Oops.
      - WARN if we leak obj->frontbuffer_bits when freeing a gem buffer. Fix
        the bugs this brought to light.
      - s/update_frontbuffer_bits/update_fb_bits/. More consistent with the
        fb tracking functions (fb for gem object, frontbuffer for raw bits).
        And the function name was way too long.
      
      v3: Size obj->frontbuffer_bits correctly so that all pipes fit in.
      
      v4: Don't update fb bits in set_base on failure. Noticed by Chris.
      
      v5: s/i915_gem_update_fb_bits/i915_gem_track_fb/ Also remove a few
      local enum pipe variables which are now no longer needed to make the
      function arguments no drop over the 80 char limit.
      
      Cc: Rodrigo Vivi <rodrigo.vivi@intel.com>
      Cc: Chris Wilson <chris@chris-wilson.co.uk>
      Reviewed-by: NChris Wilson <chris@chris-wilson.co.uk>
      Signed-off-by: NDaniel Vetter <daniel.vetter@ffwll.ch>
      a071fa00
    • D
      drm/i915: Drop schedule_back from psr_exit · 3108e99e
      Daniel Vetter 提交于
      It doesn't make sense to never again schedule the work, since by the
      time we might want to re-enable psr the world might have changed and
      we can do it again.
      
      The only exception is when we shut down the pipe, but that's an
      entirely different thing and needs to be handled in psr_disable.
      
      Note that later patch will again split psr_exit into psr_invalidate
      and psr_flush. But the split is different and this simplification
      helps with the transition.
      
      v2: Improve the commit message a bit.
      
      Cc: Rodrigo Vivi <rodrigo.vivi@intel.com>
      Reviewed-by: NRodrigo Vivi <rodrigo.vivi@intel.com>
      Signed-off-by: NDaniel Vetter <daniel.vetter@ffwll.ch>
      3108e99e
    • D
      drm/i915: Ditch intel_edp_psr_update · e6e559d4
      Daniel Vetter 提交于
      We have _enable/_disable interfaces now for the modeset sequence and
      intel_edp_psr_exit for workarounds.
      
      The callsites in intel_display.c are all redundant with the modeset
      sequence enable/disable calls in intel_ddi.c. The one in
      intel_sprite.c is real and needs to be switched to psr_exit.
      
      If this breaks anything then we need to augment the enable/disable
      functions accordingly.
      
      Cc: Rodrigo Vivi <rodrigo.vivi@intel.com>
      Reviewed-by: NRodrigo Vivi <rodrigo.vivi@intel.com>
      Signed-off-by: NDaniel Vetter <daniel.vetter@ffwll.ch>
      e6e559d4
  13. 17 6月, 2014 2 次提交
    • S
      drm/i915: Replaced Blitter ring based flips with MMIO flips · 84c33a64
      Sourab Gupta 提交于
      This patch enables the framework for using MMIO based flip calls,
      in contrast with the CS based flip calls which are being used currently.
      
      MMIO based flip calls can be enabled on architectures where
      Render and Blitter engines reside in different power wells. The
      decision to use MMIO flips can be made based on workloads to give
      100% residency for Media power well.
      
      v2: The MMIO flips now use the interrupt driven mechanism for issuing the
      flips when target seqno is reached. (Incorporating Ville's idea)
      
      v3: Rebasing on latest code. Code restructuring after incorporating
      Damien's comments
      
      v4: Addressing Ville's review comments
          -general cleanup
          -updating only base addr instead of calling update_primary_plane
          -extending patch for gen5+ platforms
      
      v5: Addressed Ville's review comments
          -Making mmio flip vs cs flip selection based on module parameter
          -Adding check for DRIVER_MODESET feature in notify_ring before calling
           notify mmio flip.
          -Other changes mostly in function arguments
      
      v6: -Having a seperate function to check condition for using mmio flips (Ville)
          -propogating error code from i915_gem_check_olr (Ville)
      
      v7: -Adding __must_check with i915_gem_check_olr (Chris)
          -Renaming mmio_flip_data to mmio_flip (Chris)
          -Rebasing on latest nightly
      
      v8: -Rebasing on latest code
          -squash 3rd patch in series(mmio setbase vs page flip race) with this patch
          -Added new tiling mode update in intel_do_mmio_flip (Chris)
      
      v9: -check for obj->last_write_seqno being 0 instead of obj->ring being NULL in
      intel_postpone_flip, as this is a more restrictive condition (Chris)
      
      v10: -Applied Chris's suggestions for squashing patches 2,3 into this patch.
      These patches make the selection of CS vs MMIO flip at the page flip time, and
      make the module parameter for using mmio flips as tristate, the states being
      'force CS flips', 'force mmio flips', 'driver discretion'.
      Changed the logic for driver discretion (Chris)
      
      v11: Minor code cleanup(better readability, fixing whitespace errors, using
      lockdep to check mutex locked status in postpone_flip, removal of __must_check
      in function definition) (Chris)
      Reviewed-by: NChris Wilson <chris@chris-wilson.co.uk>
      Signed-off-by: NSourab Gupta <sourab.gupta@intel.com>
      Signed-off-by: NAkash Goel <akash.goel@intel.com>
      Tested-by: Chris Wilson <chris@chris-wilson.co.uk> # snb, ivb
      [danvet: Fix up parameter alignement checkpatch spotted.]
      Signed-off-by: NDaniel Vetter <daniel.vetter@ffwll.ch>
      84c33a64
    • D
      drm/i915: Fix comment about our plane remapping on gen2/3 · 8c0f92e1
      Daniel Vetter 提交于
      Spotted while crawling around in the area.
      Reviewed-by: NVille Syrjälä <ville.syrjala@linux.intel.com>
      Signed-off-by: NDaniel Vetter <daniel.vetter@ffwll.ch>
      8c0f92e1
  14. 14 6月, 2014 1 次提交
    • R
      drm/i915: Force PSR exit by inactivating it. · 7c8f8a70
      Rodrigo Vivi 提交于
      The perfect solution for psr_exit is the hardware tracking the changes and
      doing the psr exit by itself. This scenario works for HSW and BDW with some
      environments like Gnome and Wayland.
      
      However there are many other scenarios that this isn't true. Mainly one right
      now is KDE users on HSW and BDW with PSR on. User would miss many screen
      updates. For instances any key typed could be seen only when mouse cursor is
      moved. So this patch introduces the ability of trigger PSR exit on kernel side
      on some common cases that.
      
      Most of the cases are coverred by psr_exit at set_domain. The remaining cases
      are coverred by triggering it at set_domain, busy_ioctl, sw_finish and
      mark_busy.
      
      The downside here might be reducing the residency time on the cases this
      already work very wall like Gnome environment. But so far let's get focused
      on fixinge issues sio PSR couild be used for everybody and we could even
      get it enabled by default. Later we can add some alternatives to choose the
      level of PSR efficiency over boot flag of even over crtc property.
      
      v2: remove exit from connector_dpms. Daniel pointed this is the wrong way and
      also this isn't needed for BDW and HSW anyway.
      
      Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
      Reviewed-by: NVijay Purushothaman <vijay.a.purushothaman@intel.com>
      Signed-off-by: NRodrigo Vivi <rodrigo.vivi@intel.com>
      Signed-off-by: NDaniel Vetter <daniel.vetter@ffwll.ch>
      7c8f8a70
  15. 13 6月, 2014 3 次提交
    • V
      drm/i915: Add locking around framebuffer_references-- · 60a5ca01
      Ville Syrjälä 提交于
      obj->framebuffer_references isn't an atomic_t so the decrement needs to
      be protected by some lock. struct_mutex seems like the appropriate lock
      here, and we may already take it for the obj unref anyway.
      Signed-off-by: NVille Syrjälä <ville.syrjala@linux.intel.com>
      Signed-off-by: NDaniel Vetter <daniel.vetter@ffwll.ch>
      60a5ca01
    • M
      drm/i915: Switch to unified plane cursor handling (v4) · 3d7d6510
      Matt Roper 提交于
      The DRM core will translate calls to legacy cursor ioctls into universal
      cursor calls automatically, so there's no need to maintain the legacy
      cursor support.  This greatly simplifies the transition since we don't
      have to handle reference counting differently depending on which cursor
      interface was called.
      
      The aim here is to transition to the universal plane interface with
      minimal code change.  There's a lot of cleanup that can be done (e.g.,
      using state stored in crtc->cursor->fb rather than intel_crtc) that is
      left to future patches.
      
      v4:
       - Drop drm_gem_object_unreference() that is no longer needed now that
         we receive the GEM obj directly rather than looking up the ID.
      v3:
       - Pass cursor obj to intel_crtc_cursor_set_obj() if cursor fb changes,
         even if 'visible' is false.  intel_crtc_cursor_set_obj() will notice
         that the cursor isn't visible and disable it properly, but we still
         need to get intel_crtc->cursor_addr set properly so that we behave
         properly if the cursor becomes visible again in the future without
         changing the cursor buffer (noted by Chris Wilson and verified
         via i-g-t kms_cursor_crc).
       - s/drm_plane_init/drm_universal_plane_init/.  Due to type
         compatibility between enum and bool, everything actually works
         correctly with the wrong init call, except for the type of plane that
         gets exposed to userspace (it shows up as type 'primary' rather than
         type 'cursor').
      v2:
       - Remove duplicate dimension checks on cursor
       - Drop explicit cursor disable from crtc destroy (fb & plane
         destruction will take care of that now)
       - Use DRM plane helper to check update parameters
      
      Cc: intel-gfx@lists.freedesktop.org
      Signed-off-by: NMatt Roper <matthew.d.roper@intel.com>
      Reviewed-by: Pallavi G<pallavi.g@intel.com>
      Signed-off-by: NDaniel Vetter <daniel.vetter@ffwll.ch>
      3d7d6510
    • M
      drm/i915: Add intel_crtc_cursor_set_obj() to set cursor buffer (v2) · e3287951
      Matt Roper 提交于
      Refactor cursor buffer setting such that the code to actually update the
      cursor lives in a new function, intel_crtc_cursor_set_obj(), and takes
      a GEM object as a parameter.  The existing legacy cursor ioctl handler,
      intel_crtc_cursor_set() will now perform the userspace handle lookup and
      then call this new function.
      
      This refactoring is in preparation for the universal plane cursor
      support where we'll want to update the cursor with an actual GEM buffer
      object (obtained via drm_framebuffer) rather than a userspace handle.
      
      v2:  Drop obvious kerneldoc and replace with note about function's
           reference consumption
      Reviewed-by: NDaniel Vetter <daniel.vetter@ffwll.ch>
      Signed-off-by: NMatt Roper <matthew.d.roper@intel.com>
      Reviewed-by: Pallavi G<pallavi.g@intel.com>
      Signed-off-by: NDaniel Vetter <daniel.vetter@ffwll.ch>
      e3287951