1. 14 2月, 2015 7 次提交
    • D
      drm/i915: Don't try to reference the fb in get_initial_plane_config() · f55548b5
      Damien Lespiau 提交于
      Tvrtko noticed a new warning on boot:
      
        WARNING: CPU: 1 PID: 353 at include/linux/kref.h:47 drm_framebuffer_reference+0x6c/0x80 [drm]()
        Call Trace:
        [<ffffffff8161f10c>] dump_stack+0x4f/0x7b
        [<ffffffff81052caa>] warn_slowpath_common+0xaa/0xd0
        [<ffffffff81052d8a>] warn_slowpath_null+0x1a/0x20
        [<ffffffffa00d035c>] drm_framebuffer_reference+0x6c/0x80 [drm]
        [<ffffffffa01c0df7>] update_state_fb.isra.54+0x47/0x50 [i915]
        [<ffffffffa01ccd5c>] skylake_get_initial_plane_config+0x93c/0x950 [i915]
        [<ffffffffa01e8721>] intel_modeset_init+0x1551/0x17c0 [i915]
        [<ffffffffa02476e0>] i915_driver_load+0xed0/0x11e0 [i915]
        [<ffffffff81627aa1>] ? _raw_spin_unlock_irqrestore+0x51/0x70
        [<ffffffffa00ca8b7>] drm_dev_register+0x77/0x110 [drm]
        [<ffffffffa00cda3b>] drm_get_pci_dev+0x11b/0x1f0 [drm]
        [<ffffffff81098e3d>] ? trace_hardirqs_on+0xd/0x10
        [<ffffffff81627aa1>] ? _raw_spin_unlock_irqrestore+0x51/0x70
        [<ffffffffa0145276>] i915_pci_probe+0x56/0x60 [i915]
        [<ffffffff813ad59c>] pci_device_probe+0x7c/0x100
        [<ffffffff81466aad>] driver_probe_device+0x16d/0x380
      
      We cannot take a reference at this point, not before
      intel_framebuffer_init() and the underlying drm_framebuffer_init().
      
      Introduced in:
      
        commit 706dc7b549175e47f23e913b7f1e52874a7d0f56
        Author: Matt Roper <matthew.d.roper@intel.com>
        Date:   Tue Feb 3 13:10:04 2015 -0800
      
            drm/i915: Ensure plane->state->fb stays in sync with plane->fb
      
      v2: Don't move update_state_fb(). It was moved around because I
          originally put update_state_fb() in intel_alloc_plane_obj() before
          finding a better place. (Matt)
      Reviewed-by: NMatt Roper <matthew.d.roper@intel.com>
      Reported-by: NTvrtko Ursulin <tvrtko.ursulin@intel.com>
      Cc: Matt Roper <matthew.d.roper@intel.com>
      Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
      Signed-off-by: NDamien Lespiau <damien.lespiau@intel.com>
      Signed-off-by: NDaniel Vetter <daniel.vetter@ffwll.ch>
      f55548b5
    • D
      drm/i915: Use an intermediate variable to avoid repeating ourselves · 6bf129df
      Damien Lespiau 提交于
      The code look slightly better this way and will ease the next commit,
      changing where we take the fb pointer from.
      Signed-off-by: NDamien Lespiau <damien.lespiau@intel.com>
      Reviewed-by: NMatt Roper <matthew.d.roper@intel.com>
      Signed-off-by: NDaniel Vetter <daniel.vetter@ffwll.ch>
      6bf129df
    • D
      drm/i915: Put update_state_fb() next to the fb update · 5ba76c41
      Damien Lespiau 提交于
      update_state_fb() at the end of intel_find_plane_obj() is misleading as
      it leads us to believe the update is done for all code path.
      
      A successful call to intel_alloc_plane_obj() will return and
      update_state_fb() is then only needed when we share a fb from another
      CRTC. Put the update() function there then.
      Signed-off-by: NDamien Lespiau <damien.lespiau@intel.com>
      Reviewed-by: NMatt Roper <matthew.d.roper@intel.com>
      Signed-off-by: NDaniel Vetter <daniel.vetter@ffwll.ch>
      5ba76c41
    • M
      drm/i915: Ensure plane->state->fb stays in sync with plane->fb · afd65eb4
      Matt Roper 提交于
      plane->state->fb and plane->fb should always reference the same FB so
      that atomic and legacy codepaths have the same view of display state.
      In commit
      
              commit db068420560511de80ac59222644f2bdf278c3d5
              Author: Matt Roper <matthew.d.roper@intel.com>
              Date:   Fri Jan 30 16:22:36 2015 -0800
      
                  drm/i915: Keep plane->state updated on pageflip
      
      we already fixed one case where these two pointers could get out of
      sync.  However it turns out there are a few other places (mainly dealing
      with initial FB setup at boot) that directly set plane->fb and neglect
      to update plane->state->fb.  If we never do a successful update through
      the atomic pipeline, the RmFB cleanup code will look at the
      plane->state->fb pointer, which has never actually been set to a
      legitimate value, and try to clean it up, leading to BUG's.
      
      Add a quick helper function to synchronize plane->state->fb with
      plane->fb (and update reference counts accordingly) and call it
      everywhere the driver tries to manually set plane->fb outside of the
      atomic pipeline.
      
      Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=88909Signed-off-by: NMatt Roper <matthew.d.roper@intel.com>
      Signed-off-by: NDaniel Vetter <daniel.vetter@ffwll.ch>
      afd65eb4
    • T
      drm/i915: Track old framebuffer instead of object · ab8d6675
      Tvrtko Ursulin 提交于
      Daniel Vetter spotted a bug while reviewing some of my refactoring in this
      are of the code. I'll quote:
      
      """
      > @@ -9764,6 +9768,7 @@ static int intel_crtc_page_flip(struct drm_crtc *crtc,
      >  	work->event = event;
      >  	work->crtc = crtc;
      >  	work->old_fb_obj = intel_fb_obj(old_fb);
      > +	work->old_tiling_mode = to_intel_framebuffer(old_fb)->tiling_mode;
      
      Hm, that's actually an interesting bugfix - currently userspace could be
      sneaky and destroy the old fb immediately after the flip completes and the
      change the tiling of the underlying object before the unpin work had a
      chance to run (needs some fudgin with rt prios to starve workers to make
      this work though).
      
      Imo the right fix is to hold a reference onto the fb and not the
      underlying gem object. With that tiling is guaranteed not to change.
      """
      
      This patch tries to implement the above proposed change.
      Signed-off-by: NTvrtko Ursulin <tvrtko.ursulin@intel.com>
      Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
      Signed-off-by: NDaniel Vetter <daniel.vetter@ffwll.ch>
      ab8d6675
    • M
      drm/i915: Switch planes from transitional helpers to full atomic helpers · 3f678c96
      Matt Roper 提交于
      There are two sets of helper functions provided by the DRM core that can
      implement the .update_plane() and .disable_plane() hooks in terms of a
      driver's atomic entrypoints.  The transitional helpers (which we have
      been using so far) create a plane state and then use the plane's atomic
      entrypoints to perform the atomic begin/check/prepare/commit/finish
      sequence on that single plane only.  The full atomic helpers create a
      top-level atomic state (which is capable of holding multiple object
      states for planes, crtc's, and/or connectors) and then passes the
      top-level atomic state through the full "atomic modeset" pipeline.
      
      Switching from the transitional to full helpers here shouldn't result in
      any functional change, but will enable us to exercise/test more of the
      internal atomic pipeline with the legacy API's used by existing
      applications.
      Signed-off-by: NMatt Roper <matthew.d.roper@intel.com>
      Signed-off-by: NDaniel Vetter <daniel.vetter@ffwll.ch>
      3f678c96
    • M
      drm/i915: Keep plane->state updated on pageflip · 1ed1f968
      Matt Roper 提交于
      Until all drivers have transitioned to atomic, the framebuffer
      associated with a plane is tracked in both plane->fb (for legacy) and
      plane->state->fb (for all the new atomic codeflow).  All of our modeset
      and plane updates use drm_plane->update_plane(), so in theory plane->fb
      and plane->state->fb should always stay in sync and point at the same
      thing for i915.  However we forgot about the pageflip ioctl case, which
      currently only updates plane->fb and leaves plane->state->fb at a stale
      value.
      
      Surprisingly, this doesn't cause any real problems at the moment since
      internally we use the plane->fb pointer in most of the places that
      matter, and on the next .update_plane() call, we use plane->fb to figure
      out which framebuffer to cleanup.  However when we switch to the full
      atomic helpers for update_plane()/disable_plane(), those helpers use
      plane->state->fb to figure out which framebuffer to cleanup, so not
      having updated the plane->state->fb pointer causes things to blow up
      following a pageflip ioctl.
      
      The fix here is to just make sure we update plane->state->fb at the same
      time we update plane->fb in the pageflip ioctl.
      Signed-off-by: NMatt Roper <matthew.d.roper@intel.com>
      Signed-off-by: NDaniel Vetter <daniel.vetter@ffwll.ch>
      1ed1f968
  2. 31 1月, 2015 1 次提交
  3. 27 1月, 2015 28 次提交
  4. 13 1月, 2015 4 次提交
    • V
      drm/i915: Don't register HDMI connectors for eDP ports on VLV/CHV · d2182a66
      Ville Syrjälä 提交于
      If we determine that a specific port is eDP, don't register the HDMI
      connector/encoder for it. The reason being that we want to disable
      HPD interrupts for eDP ports when the display is off, but the presence
      of the extra HDMI connector would demand the HPD interrupt to remain
      enabled all the time.
      Signed-off-by: NVille Syrjälä <ville.syrjala@linux.intel.com>
      Reviewed-by: NJani Nikula <jani.nikula@intel.com>
      Signed-off-by: NDaniel Vetter <daniel.vetter@ffwll.ch>
      d2182a66
    • M
      drm/i915: Drop unused position fields (v2) · 53a366b9
      Matt Roper 提交于
      The userspace-requested plane coordinates are now always available via
      plane->state.base (and the i915-adjusted values are stored in
      plane->state), so we no longer use the coordinate fields in intel_plane
      and can drop them.
      
      Also, note that the error case for pageflip calls update_plane() to
      program the values from plane->state; it's simpler to just call
      intel_plane_restore() which does the same thing.
      
      v2: Replace manual update_plane() with intel_plane_restore() in pageflip
          error handler.
      
      Reviewed-by(v1): Bob Paauwe <bob.j.paauwe@intel.com>
      Signed-off-by: NMatt Roper <matthew.d.roper@intel.com>
      Reviewed-by: NAnder Conselvan de Oliveira <ander.conselvan.de.oliveira@intel.com>
      Signed-off-by: NDaniel Vetter <daniel.vetter@ffwll.ch>
      53a366b9
    • M
      drm/i915: Move to atomic plane helpers (v9) · ea2c67bb
      Matt Roper 提交于
      Switch plane handling to use the atomic plane helpers.  This means that
      rather than provide our own implementations of .update_plane() and
      .disable_plane(), we expose the lower-level check/prepare/commit/cleanup
      entrypoints and let the DRM core implement update/disable for us using
      those entrypoints.
      
      The other main change that falls out of this patch is that our
      drm_plane's will now always have a valid plane->state that contains the
      relevant plane state (initial state is allocated at plane creation).
      The base drm_plane_state pointed to holds the requested source/dest
      coordinates, and the subclassed intel_plane_state holds the adjusted
      values that our driver actually uses.
      
      v2:
       - Renamed file from intel_atomic.c to intel_atomic_plane.c (Daniel)
       - Fix a copy/paste comment mistake (Bob)
      
      v3:
       - Use prepare/cleanup functions that we've already factored out
       - Use newly refactored pre_commit/commit/post_commit to avoid sleeping
         during vblank evasion
      
      v4:
       - Rebase to latest di-nightly requires adding an 'old_state' parameter
         to atomic_update;
      
      v5:
       - Must have botched a rebase somewhere and lost some work.  Restore
         state 'dirty' flag to let begin/end code know which planes to
         run the pre_commit/post_commit hooks for.  This would have actually
         shown up as broken in the next commit rather than this one.
      
      v6:
       - Squash kerneldoc patch into this one.
       - Previous patches have now already taken care of most of the
         infrastructure that used to be in this patch.  All we're adding here
         now is some thin wrappers.
      
      v7:
       - Check return of intel_plane_duplicate_state() for allocation
         failures.
      
      v8:
       - Drop unused drm_plane_state -> intel_plane_state cast.  (Ander)
       - Squash in actual transition to plane helpers.  Significant
         refactoring earlier in the patchset has made the combined
         prep+transition much easier to swallow than it was in earlier
         iterations. (Ander)
      
      v9:
       - s/track_fbs/disabled_planes/ in the atomic crtc flags.  The only fb's
         we need to update frontbuffer tracking for are those on a plane about
         to be disabled (since the atomic helpers never call prepare_fb() when
         disabling a plane), so the new name more accurately describes what
         we're actually tracking.
      
      Testcase: igt/kms_plane
      Testcase: igt/kms_universal_plane
      Testcase: igt/kms_cursor_crc
      Signed-off-by: NMatt Roper <matthew.d.roper@intel.com>
      Reviewed-by: NAnder Conselvan de Oliveira <conselvan2@gmail.com>
      Signed-off-by: NDaniel Vetter <daniel.vetter@ffwll.ch>
      ea2c67bb
    • M
      drm/i915: Clarify sprite plane function names (v4) · 4a3b8769
      Matt Roper 提交于
      A few of the sprite-related function names in i915 are very similar
      (e.g., intel_enable_planes() vs intel_crtc_enable_planes()) and don't
      make it clear whether they only operate on sprite planes, or whether
      they also apply to all universal plane types.  Rename a few functions to
      be more consistent with our function naming for primary/cursor planes or
      to clarify that they apply specifically to sprite planes:
      
       - s/intel_disable_planes/intel_disable_sprite_planes/
       - s/intel_enable_planes/intel_enable_sprite_planes/
      
      Also, drop the sprite-specific intel_destroy_plane() and just use
      the type-agnostic intel_plane_destroy() function.  The extra 'disable'
      call that intel_destroy_plane() did is unnecessary since the plane will
      already be disabled due to framebuffer destruction by the point it gets
      called.
      
      v2: Earlier consolidation patches have reduced the number of functions
          we need to rename here.
      
      v3: Also rename intel_plane_funcs vtable to intel_sprite_plane_funcs
          for consistency with primary/cursor.  (Ander)
      
      v4: Convert comment for intel_plane_destroy() to kerneldoc now that it
          is no longer a static function.  (Ander)
      
      Reviewed-by(v1): Bob Paauwe <bob.j.paauwe@intel.com>
      Signed-off-by: NMatt Roper <matthew.d.roper@intel.com>
      Reviewed-by: NAnder Conselvan de Oliveira <conselvan2@gmail.com>
      Signed-off-by: NDaniel Vetter <daniel.vetter@ffwll.ch>
      4a3b8769