1. 24 2月, 2015 1 次提交
    • I
      drm/i915: avoid processing spurious/shared interrupts in low-power states · 2dd2a883
      Imre Deak 提交于
      Atm, it's possible that the interrupt handler is called when the device
      is in D3 or some other low-power state. It can be due to another device
      that is still in D0 state and shares the interrupt line with i915, or on
      some platforms there could be spurious interrupts even without sharing
      the interrupt line. The latter case was reported by Klaus Ethgen using a
      Lenovo x61p machine (gen 4). He noticed this issue via a system
      suspend/resume hang and bisected it to the following commit:
      
      commit e11aa362
      Author: Jesse Barnes <jbarnes@virtuousgeek.org>
      Date:   Wed Jun 18 09:52:55 2014 -0700
      
          drm/i915: use runtime irq suspend/resume in freeze/thaw
      
      This is a problem, since in low-power states IIR will always read
      0xffffffff resulting in an endless IRQ servicing loop.
      
      Fix this by handling interrupts only when the driver explicitly enables
      them and so it's guaranteed that the interrupt registers return a valid
      value.
      
      Note that this issue existed even before the above commit, since during
      runtime suspend/resume we never unregistered the handler.
      
      v2:
      - clarify the purpose of smp_mb() vs. synchronize_irq() in the
        code comment (Chris)
      
      v3:
      - no need for an explicit smp_mb(), we can assume that synchronize_irq()
        and the mmio read/writes in the install hooks provide for this (Daniel)
      - remove code comment as the remaining synchronize_irq() is self
        explanatory (Daniel)
      
      v4:
      - drm_irq_uninstall() implies synchronize_irq(), so no need to call it
        explicitly (Daniel)
      
      Reference: https://lkml.org/lkml/2015/2/11/205Reported-and-bisected-by: NKlaus Ethgen <Klaus@Ethgen.ch>
      Cc: stable@vger.kernel.org
      Signed-off-by: NImre Deak <imre.deak@intel.com>
      Reviewed-by: NDaniel Vetter <daniel.vetter@ffwll.ch>
      Signed-off-by: NJani Nikula <jani.nikula@intel.com>
      2dd2a883
  2. 04 2月, 2015 1 次提交
    • D
      drm/i915: Remove bogus locking check in the hangcheck code · b838cbee
      Daniel Vetter 提交于
      You can _never_ assert that a lock is not held, except in some very
      restricted corner cases where it's guranteed that your code is running
      single-threade (e.g. driver load before you've published any pointers
      leading to that lock).
      
      In addition the early return breaks a bunch of testcases since with
      highly concurrent hangcheck stress tests the reset fails to work and
      the test doesn't recover and time out.
      
      This regression has been introduced in
      
      commit b8d24a06
      Author: Mika Kuoppala <mika.kuoppala@linux.intel.com>
      Date:   Wed Jan 28 17:03:14 2015 +0200
      
          drm/i915: Remove nested work in gpu error handling
      
      Aside: It is possible to check whether a given task doesn't hold a
      lock, but only when lockdep is enabled, using the lockdep_assert_held
      stuff.
      
      Cc: Chris Wilson <chris@chris-wilson.co.uk>
      Cc: Mika Kuoppala <mika.kuoppala@intel.com>
      Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=88908Reviewed-by: NMika Kuoppala <mika.kuoppala@intel.com>
      Signed-off-by: NDaniel Vetter <daniel.vetter@intel.com>
      b838cbee
  3. 30 1月, 2015 1 次提交
    • M
      drm/i915: Remove nested work in gpu error handling · b8d24a06
      Mika Kuoppala 提交于
      Now when we declare gpu errors only through our own dedicated
      hangcheck workqueue there is no need to have a separate workqueue
      for handling the resetting and waking up the clients as the deadlock
      concerns are no more.
      
      The only exception is i915_debugfs::i915_set_wedged, which triggers
      error handling through process context. However as this is only used through
      test harness it is responsibility for test harness not to introduce hangs
      through both debug interface and through hangcheck mechanism at the same time.
      
      Remove gpu_error.work and let the hangcheck work do the tasks it used to.
      
      v2: Add a big warning sign into i915_debugfs::i915_set_wedged (Chris)
      
      Cc: Chris Wilson <chris@chris-wilson.co.uk>
      Signed-off-by: NMika Kuoppala <mika.kuoppala@intel.com>
      Reviewed-by: NChris Wilson <chris@chris-wilson.co.uk>
      Signed-off-by: NDaniel Vetter <daniel.vetter@ffwll.ch>
      b8d24a06
  4. 29 1月, 2015 1 次提交
    • C
      drm/i915: Convert hangcheck from a timer into a delayed work item · 737b1506
      Chris Wilson 提交于
      When run as a timer, i915_hangcheck_elapsed() must adhere to all the
      rules of running in a softirq context. This is advantageous to us as we
      want to minimise the risk that a driver bug will prevent us from
      detecting a hung GPU. However, that is irrelevant if the driver bug
      prevents us from resetting and recovering. Still it is prudent not to
      rely on mutexes inside the checker, but given the coarseness of
      dev->struct_mutex doing so is extremely hard.
      
      Give in and run from a work queue, i.e. outside of softirq.
      
      v2: Use own workqueue to avoid deadlocks (Daniel)
          Cleanup commit msg and add comment to i915_queue_hangcheck() (Chris)
      
      Cc: Jani Nikula <jani.nikula@intel.com>
      Cc: Daniel Vetter <dnaiel.vetter@ffwll.chm>
      Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> (v1)
      Signed-off-by: NMika Kuoppala <mika.kuoppala@intel.com>
      [danvet: Remove accidental kerneldoc comment starter, to appease the 0
      day builder.]
      Signed-off-by: NDaniel Vetter <daniel.vetter@ffwll.ch>
      737b1506
  5. 27 1月, 2015 3 次提交
    • D
      drm/i915: Use symbolic irqreturn for ->hpd_pulse · b2c5c181
      Daniel Vetter 提交于
      Self-explanatory code is better code.
      
      Cc: Dave Airlie <airlied@redhat.com>
      Signed-off-by: NDaniel Vetter <daniel.vetter@intel.com>
      Reviewed-by: NJani Nikula <jani.nikula@intel.com>
      Signed-off-by: NDaniel Vetter <daniel.vetter@ffwll.ch>
      b2c5c181
    • A
      drm/i915: Make intel_crtc->config a pointer · 6e3c9717
      Ander Conselvan de Oliveira 提交于
      To match the semantics of drm_crtc->state, which this will eventually
      become. The allocation of the memory for config will be fixed in a
      followup patch. By adding the extra _config field to intel_crtc it was
      possible to generate this entire patch with the cocci script below.
      
      @@ @@
      struct intel_crtc {
      ...
      -struct intel_crtc_state config;
      +struct intel_crtc_state _config;
      +struct intel_crtc_state *config;
      ...
      }
      @@ struct intel_crtc *crtc; @@
      -memset(&crtc->config, 0, sizeof(crtc->config));
      +memset(crtc->config, 0, sizeof(*crtc->config));
      @@ @@
      __intel_set_mode(...) {
      <...
      -to_intel_crtc(crtc)->config = *pipe_config;
      +(*(to_intel_crtc(crtc)->config)) = *pipe_config;
      ...>
      }
      @@ @@
      intel_crtc_init(...) {
      ...
      WARN_ON(drm_crtc_index(&intel_crtc->base) != intel_crtc->pipe);
      +intel_crtc->config = &intel_crtc->_config;
      return;
      ...
      }
      @@ struct intel_crtc *crtc; @@
      -&crtc->config
      +crtc->config
      @@ struct intel_crtc *crtc; identifier member; @@
      -crtc->config.member
      +crtc->config->member
      @@ expression E; @@
      -&(to_intel_crtc(E)->config)
      +to_intel_crtc(E)->config
      @@ expression E; identifier member; @@
      -to_intel_crtc(E)->config.member
      +to_intel_crtc(E)->config->member
      
      v2: Clarify manual changes by splitting them into another patch. (Matt)
          Improve cocci script to generate even more of the changes. (Ander)
      Signed-off-by: NAnder Conselvan de Oliveira <ander.conselvan.de.oliveira@intel.com>
      Reviewed-by: NMatt Roper <matthew.d.roper@intel.com>
      Signed-off-by: NDaniel Vetter <daniel.vetter@ffwll.ch>
      6e3c9717
    • A
      drm/i915: Embedded struct drm_crtc_state in intel_crtc_state · 2d112de7
      Ander Conselvan de Oliveira 提交于
      And get rid of the duplicate mode structures. This patch was generated
      with the following semantic patch:
      
      @@ @@
      struct intel_crtc_state {
      +struct drm_crtc_state base;
      +
      ...
      -struct drm_display_mode requested_mode;
      -struct drm_display_mode adjusted_mode;
      ...
      }
      @@ struct intel_crtc_state *state; @@
      -state->adjusted_mode
      +state->base.adjusted_mode
      @@ struct intel_crtc_state *state; @@
      -state->requested_mode
      +state->base.mode
      @@ struct intel_crtc_state state; @@
      -state.adjusted_mode
      +state.base.adjusted_mode
      @@ struct intel_crtc_state state; @@
      -state.requested_mode
      +state.base.mode
      @@ struct drm_crtc *crtc; @@
      -to_intel_crtc(crtc)->config.adjusted_mode
      +to_intel_crtc(crtc)->config.base.adjusted_mode
      @@ identifier member; expression E; @@
      -PIPE_CONF_CHECK_FLAGS(adjusted_mode.member, E);
      +PIPE_CONF_CHECK_FLAGS(base.adjusted_mode.member, E);
      @@ identifier member; @@
      -PIPE_CONF_CHECK_I(adjusted_mode.member);
      +PIPE_CONF_CHECK_I(base.adjusted_mode.member);
      @@ identifier member; @@
      -PIPE_CONF_CHECK_CLOCK_FUZZY(adjusted_mode.member);
      +PIPE_CONF_CHECK_CLOCK_FUZZY(base.adjusted_mode.member);
      
      v2: Completely generate the patch with cocci. (Ander)
      Signed-off-by: NAnder Conselvan de Oliveira <ander.conselvan.de.oliveira@intel.com>
      Reviewed-by: NMatt Roper <matthew.d.roper@intel.com>
      Signed-off-by: NDaniel Vetter <daniel.vetter@ffwll.ch>
      2d112de7
  6. 13 1月, 2015 2 次提交
  7. 12 1月, 2015 2 次提交
  8. 18 12月, 2014 1 次提交
    • V
      drm/i915: Don't call intel_prepare_page_flip() multiple times on gen2-4 · 7d47559e
      Ville Syrjälä 提交于
      The flip stall detector kicks in when pending>=INTEL_FLIP_COMPLETE. That
      means if we first call intel_prepare_page_flip() but don't call
      intel_finish_page_flip(), the next stall check will erroneosly think
      the page flip was somehow stuck.
      
      With enough debug spew emitted from the interrupt handler my 830 hangs
      when this happens. My theory is that the previous vblank interrupt gets
      sufficiently delayed that the handler will see the pending bit set in
      IIR, but ISR still has the bit set as well (ie. the flip was processed
      by CS but didn't complete yet). In this case the handler will proceed
      to call intel_check_page_flip() immediately after
      intel_prepare_page_flip(). It then tries to print a backtrace for the
      stuck flip WARN, which apparetly results in way too much debug spew
      delaying interrupt processing further. That then seems to cause an
      endless loop in the interrupt handler, and the machine is dead until
      the watchdog kicks in and reboots. At least limiting the number of
      iterations of the loop in the interrupt handler also prevented the
      hang.
      
      So it seems better to not call intel_prepare_page_flip() without
      immediately calling intel_finish_page_flip(). The IIR/ISR trickery
      avoids races here so this is a perfectly safe thing to do.
      
      v2: Fix typo in commit message (checkpatch)
      
      Cc: stable@vger.kernel.org
      Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=88381
      Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=85888Reviewed-by: NChris Wilson <chris@chris-wilson.co.uk>
      Signed-off-by: NVille Syrjälä <ville.syrjala@linux.intel.com>
      Signed-off-by: NJani Nikula <jani.nikula@intel.com>
      7d47559e
  9. 16 12月, 2014 1 次提交
    • I
      drm/i915: move RPS PM_IER enabling to gen6_enable_rps_interrupts · 78e68d36
      Imre Deak 提交于
      Paulo noticed that we don't enable RPS interrupts via PM_IER in
      gen6_enable_rps_interrupts(). This wasn't a problem so far, since the
      only place we disabled RPS interrupts was during system/runtime suspend
      and after that we reenable all interrupts in the IRQ pre/postinstall
      hooks.
      
      In the next patch we'll disable/reenable RPS interrupts during GPU reset
      too, but not call IRQ uninstall, pre/postinstall hooks, so there the
      above wouldn't work. The logical place for programming PM_IER is
      gen6_enable_rps_interrupts() and this also makes the function more
      symmetric with gen6_disable_rps_interrupts(), so move the programming
      there from the postinstall hooks.
      
      Note that these changes don't affect the ILK RPS interrupt code, which
      could be sanitized in a similar way. But that can be done as a
      follow-up.
      
      Credits-to: Paulo Zanoni <paulo.r.zanoni@intel.com>
      Signed-off-by: NImre Deak <imre.deak@intel.com>
      Reviewed-by: NPaulo Zanoni <paulo.r.zanoni@intel.com>
      Signed-off-by: NJani Nikula <jani.nikula@intel.com>
      78e68d36
  10. 15 12月, 2014 1 次提交
  11. 11 12月, 2014 1 次提交
    • I
      drm/i915: vlv: fix IRQ masking when uninstalling interrupts · c352d1ba
      Imre Deak 提交于
      irq_mask should include all IRQ bits that we want to mask, but atm we
      set it incorrectly to the inverse of this. If the mask is used
      subsequently to enable/disable some IRQ bits, we may unintentionally
      unmask unrelated IRQs. I can't see any way that this can lead to a real
      problem in the current -nightly code, since the first place the mask
      will be used next (after a suspend/resume cycle) is in
      valleyview_irq_postinstall(), but the mask is reset there to its proper
      value.
      
      This causes a problem in the upstream kernel though, where - due to another
      issue - the mask is used in the above way to disable only the display IRQs.
      This other issue is fixed by:
      
      commit 950eabaf
      Author: Imre Deak <imre.deak@intel.com>
      Date:   Mon Sep 8 15:21:09 2014 +0300
      
          drm/i915: vlv: fix display IRQ enable/disable
      
      Interestingly, even with the above two bugs, we shouldn't in theory have
      any real problems (arguably a famous last sentence:). That's because
      even if we unmask something unintentionally via the VLV_IMR/VLV_IER
      register the master IRQ masking bit in VLV_MASTER_IER is still set and
      should prevent all i915 interrupts. According to my testing on an ASUS
      T100 with DSI output this isn't the case at least with the
      MIPIA_INTERRUPT. Leaving this one unmasked in IMR/IER, while having
      VLV_MASTER_IER set to 0 may lead to a lockup during system suspend as
      shown in the bugzilla ticket below. This fix should get rid of the
      problem reported there in upstream and older kernels.
      
      Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=85920
      Cc: stable@vger.kernel.org (v3.15+)
      Signed-off-by: NImre Deak <imre.deak@intel.com>
      Reviewed-by: NVille Syrjälä <ville.syrjala@linux.intel.com>
      Signed-off-by: NJani Nikula <jani.nikula@intel.com>
      c352d1ba
  12. 08 12月, 2014 1 次提交
    • D
      drm/i915: Check mask/bit helper functions · 15a17aae
      Daniel Vetter 提交于
      After a bit of irc discussion we've concluded that it would be prudent
      to check that callers use the mask/enable paramters correctly. So add
      a WARN_ON.
      
      Spurred by Damien's bugfix which added _MASKED_FIELD.
      
      v2: We use WARN_ON(1) a lot to catch default cases in switch blocks
      which should always be extended. So this doesn't work really. Dunno
      why gcc only started complaining when I've moved the WARN out of the
      static inline helper to address a feedback from Jani.
      
      Cc: Damien Lespiau <damien.lespiau@intel.com>
      Cc: Chris Wilson <chris@chris-wilson.co.uk>
      Cc: Jani Nikula <jani.nikula@linux.intel.com>
      Signed-off-by: NDaniel Vetter <daniel.vetter@intel.com>
      15a17aae
  13. 06 12月, 2014 1 次提交
    • J
      drm/i915: Additional request structure tracing · bcfcc8ba
      John Harrison 提交于
      Added the request structure's 'uniq' identifier to the trace information. Also
      renamed the '_complete' trace event to '_notify' as it actually happens in the
      IRQ 'notify_ring()' function. The intention is to add a new '_complete' trace
      event which occurs when a request structure is actually marked as complete.
      However, at the moment the completion status is re-tested every time the query
      is made so there isn't a completion event as such.
      
      v2: New patch added to series.
      
      v3: Rebased to remove completion caching as that is apparently contentious.
      
      Change-Id: Ic9bcde67d175c6c03b96217cdcb6e4cc4aa45d67
      For: VIZ-4377
      Signed-off-by: NJohn Harrison <John.C.Harrison@Intel.com>
      Reviewed-by: NThomas Daniel <Thomas.Daniel@intel.com>
      Signed-off-by: NDaniel Vetter <daniel.vetter@ffwll.ch>
      bcfcc8ba
  14. 03 12月, 2014 6 次提交
    • J
      drm/i915: Convert 'i915_seqno_passed' calls into 'i915_gem_request_completed' · 1b5a433a
      John Harrison 提交于
      Almost everywhere that caled i915_seqno_passed() was really asking 'has the
      given seqno popped out of the hardware yet?'. Thus it had to query the current
      hardware seqno and then do a signed delta comparison (which copes with wrapping
      around zero but not with seqno values more than 2GB apart, although the latter
      is unlikely!).
      
      Now that the majority of seqno instances have been replaced with request
      structures, it is possible to convert this test to be request based as well.
      There is now a 'i915_gem_request_completed()' function which takes a request and
      returns true or false as appropriate. Note that this currently just wraps up the
      original _passed() test but a later patch in the series will reduce this to
      simply returning a cached internal value, i.e.:
        _completed(req) { return req->completed; }'
      
      This checkin converts almost all _seqno_passed() calls. The only one left is in
      the semaphore code which still requires seqnos not request structures.
      
      For: VIZ-4377
      Signed-off-by: NJohn Harrison <John.C.Harrison@Intel.com>
      Reviewed-by: NThomas Daniel <Thomas.Daniel@intel.com>
      [danvet: Drop hunk touching the trace_irq code since I've dropped the
      patch which converts that, and resolve resulting conflict.]
      Signed-off-by: NDaniel Vetter <daniel.vetter@ffwll.ch>
      1b5a433a
    • J
      drm/i915: Convert 'ring_idle()' to use requests not seqnos · 44cdd6d2
      John Harrison 提交于
      More seqno value to request structure conversions. Note, this change temporarily
      moves the 'get_seqno()' call inside ring_idle() but this will disappear again in
      a later patch when i915_seqno_passed() itself is converted.
      
      For: VIZ-4377
      Signed-off-by: NJohn Harrison <John.C.Harrison@Intel.com>
      Reviewed-by: NThomas Daniel <Thomas.Daniel@intel.com>
      Signed-off-by: NDaniel Vetter <daniel.vetter@ffwll.ch>
      44cdd6d2
    • I
      drm/i915: mask RPS IRQs properly when disabling RPS · 9939fba2
      Imre Deak 提交于
      Atm, igt/gem_reset_stats can trigger the recently added WARN on
      left-over PM_IIR bits in gen6_enable_rps_interrupts(). There are two
      reasons for this:
      1. we call intel_enable_gt_powersave() without a preceeding
         intel_disable_gt_powersave()
      2. gen6_disable_rps_interrupts() doesn't mask interrupts in PM_IMR
      
      1. means RPS interrupts will remain enabled and can be serviced during
      the HW initialization after a GPU reset. 2. means even if we called
      gen6_disable_rps_interrupts() any new RPS interrupt during RPS
      initialization would still propagate to PM_IIR too early (though
      wouldn't be serviced).
      
      This patch solves the 2. issue by also masking interrupts in PM_IMR, the
      following patch fixes 1. getting rid of the WARN. This also makes
      intel_enable_gt_powersave() and intel_disable_gt_powersave() more
      symmetric.
      
      Since gen6_disable_rps_interrupts() is called during driver loading with
      i915 interrupts disabled add a new version of gen6_disable_pm_irq() that
      doesn't WARN for this.
      
      Also while at it, get the irq_lock around the whole PM_IMR/IER/IIR
      programming sequence and make sure that any queued PM_IIR bit is also
      cleared.
      
      The WARN was caught by PRTS after I sent my previous RPS sanitizing
      patchset and I could easily reproduce it on HSW. To actually fix it we
      also need the next patch.
      Reported-by: NHe, Shuang <shuang.he@intel.com>
      Signed-off-by: NImre Deak <imre.deak@intel.com>
      Reviewed-by: NPaulo Zanoni <paulo.r.zanoni@intel.com>
      Signed-off-by: NDaniel Vetter <daniel.vetter@ffwll.ch>
      9939fba2
    • D
      drm/i915: Tune down spurious CRC interrupt warning · 34273620
      Daniel Vetter 提交于
      We don't really synchronously turn them off from debugfs. We try to
      avoid hitting them too badly by waiting one vblank, but apparently the
      irq handler can still race through that gap.
      
      Since this isn't really all that important for testcases, only for
      debugging CRC issues let's tune it down to a debug message.
      
      Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=82602
      Cc: Damien Lespiau <damien.lespiau@intel.com>
      Acked-by: NDamien Lespiau <damien.lespiau@intel.com>
      Signed-off-by: NDaniel Vetter <daniel.vetter@intel.com>
      34273620
    • V
      drm/i915: Grab modeset locks for GPU rest on pre-ctg · 7514747d
      Ville Syrjälä 提交于
      On gen4 and earlier the GPU reset also resets the display, so we should
      protect against concurrent modeset operations. Grab all the modeset locks
      around the entire GPU reset dance, remebering first ti dislogde any
      pending page flip to make sure we don't deadlock. Any pageflip coming
      in between these two steps should fail anyway due to reset_in_progress,
      so this should be safe.
      
      This fixes a lot of failed asserts in the modeset code when there's a
      modeset racing with the reset. Naturally the asserts aren't happy when
      the expected state has disappeared.
      
      v2: Drop UMS checks, complete pending flips after the reset (Daniel)
      
      Cc: Daniel Vetter <daniel@ffwll.ch>
      Signed-off-by: NVille Syrjälä <ville.syrjala@linux.intel.com>
      Signed-off-by: NDaniel Vetter <daniel.vetter@ffwll.ch>
      7514747d
    • D
      drm/i915: Stop gathering error states for CS error interrupts · aaecdf61
      Daniel Vetter 提交于
      There's quite a few bug reports with error states where the error
      reasons makes just about no sense at all. Like dying on tlbs for a
      display plane that's not even there. Also users don't really report a
      lot of bad side effects generally, just the error states.
      
      Furthermore we don't even enable these interrupts any more on gen5+
      (though the handling code is still there). So this mostly concerns old
      platforms.
      
      Given all that lets make our lives a bit easier and stop capturing
      error states, in the hopes that we can just ignore them. In case
      that's not true and the gpu indeed dies the hangcheck should
      eventually kick in. And I've left some debug log in to make this case
      noticeble. Referenced bug is just an example.
      
      v2: Fix missing \n Jani spotted.
      
      References: https://bugs.freedesktop.org/show_bug.cgi?id=82095
      References: https://bugs.freedesktop.org/show_bug.cgi?id=85944Signed-off-by: NDaniel Vetter <daniel.vetter@intel.com>
      Signed-off-by: NDaniel Vetter <daniel.vetter@ffwll.ch>
      aaecdf61
  15. 21 11月, 2014 1 次提交
  16. 20 11月, 2014 1 次提交
  17. 19 11月, 2014 4 次提交
    • I
      drm/i915: sanitize rps irq disabling · d4d70aa5
      Imre Deak 提交于
      When disabling the RPS interrupts there is a tricky dependency between
      the thread disabling the interrupts, the RPS interrupt handler and the
      corresponding RPS work. The RPS work can reenable the interrupts, so
      there is no straightforward order in the disabling thread to (1) make
      sure that any RPS work is flushed and to (2) disable all RPS
      interrupts. Currently this is solved by masking the interrupts using two
      separate mask registers (first level display IMR and PM IMR) and doing
      the disabling when all first level interrupts are disabled.
      
      This works, but the requirement to run with all first level interrupts
      disabled is unnecessary making the suspend / unload time ordering of RPS
      disabling wrt. other unitialization steps difficult and error prone.
      Removing this restriction allows us to disable RPS early during suspend
      / unload and forget about it for the rest of the sequence. By adding a
      more explicit method for avoiding the above race, it also becomes easier
      to prove its correctness. Finally currently we can hit the WARN in
      snb_update_pm_irq(), when a final RPS work runs with the first level
      interrupts already disabled. This won't lead to any problem (due to the
      separate interrupt masks), but with the change in this and the next
      patch we can get rid of the WARN, while leaving it in place for other
      scenarios.
      
      To address the above points, add a new RPS interrupts_enabled flag and
      use this during RPS disabling to avoid requeuing the RPS work and
      reenabling of the RPS interrupts. Since the interrupt disabling happens
      now in intel_suspend_gt_powersave(), we will disable RPS interrupts
      explicitly during suspend (and not just through the first level mask),
      but there is no problem doing so, it's also more consistent and allows
      us to unify more of the RPS disabling during suspend and unload time in
      the next patch.
      
      v2/v3:
      - rebase on patch "drm/i915: move rps irq disable one level up" in the
        patchset
      Signed-off-by: NImre Deak <imre.deak@intel.com>
      Reviewed-by: NPaulo Zanoni <paulo.r.zanoni@intel.com>
      Signed-off-by: NDaniel Vetter <daniel.vetter@ffwll.ch>
      d4d70aa5
    • I
      drm/i915: sanitize rps irq enabling · 3cc134e3
      Imre Deak 提交于
      Atm we first enable the RPS interrupts then we clear any pending ones.
      By this we could lose an interrupt arriving after we unmasked it. This
      may not be a problem as the caller should handle such a race, but logic
      still calls for the opposite order. Also we can delay enabling the
      interrupts until after all the RPS initialization is ready with the
      following order:
      
      1. disable left-over RPS (earlier via intel_uncore_sanitize)
      2. clear any pending RPS interrupts
      3. initialize RPS
      4. enable RPS interrupts
      
      This also allows us to do the 2. and 4. step the same way for all
      platforms, so let's follow this order to simplifying things.
      
      Also make sure any queued interrupts are also cleared.
      
      v2:
      - rebase on the GEN9 patches where we don't support RPS yet, so we
        musn't enable RPS interrupts on it (Paulo)
      v3:
      - avoid enabling RPS interrupts on GEN>9 too (Paulo)
      - clarify the RPS init sequence in the log message (Chris)
      - add POSTING_READ to gen6_reset_rps_interrupts() (Paulo)
      - WARN if any PM_IIR bits are set in gen6_enable_rps_interrupts()
        (Paulo)
      Signed-off-by: NImre Deak <imre.deak@intel.com>
      Reviewed-by: NPaulo Zanoni <paulo.r.zanoni@intel.com>
      Signed-off-by: NDaniel Vetter <daniel.vetter@ffwll.ch>
      3cc134e3
    • I
      drm/i915: WARN if we receive any rps interrupts on gen>9 · 4a74de82
      Imre Deak 提交于
      This extends
      
      commit 132f3f17
      Author: Imre Deak <imre.deak@intel.com>
      Date:   Mon Nov 10 15:34:33 2014 +0200
      
          drm/i915: WARN if we receive any gen9 rps interrupts
      
      to GEN>9 platforms as suggested by Paulo.
      Signed-off-by: NImre Deak <imre.deak@intel.com>
      Reviewed-by: NPaulo Zanoni <paulo.r.zanoni@intel.com>
      Signed-off-by: NDaniel Vetter <daniel.vetter@ffwll.ch>
      4a74de82
    • C
      drm/i915: Don't continually defer the hangcheck · 672e7b7c
      Chris Wilson 提交于
      With multiple rings, we may continue to render on the blitter whilst
      executing an infinite shader on the render ring. As we currently, rearm
      the timer with each execbuf, in this scenario the hangcheck will never
      fire and we will never detect the lockup on the render ring. Instead,
      only arm the timer once per hangcheck, so that hangcheck runs more
      frequently.
      
      v2: Rearrange code to avoid triggering a BUG_ON in add_timer from
      softirq context.
      
      Testcase: igt/gem_reset_stats/defer-hangcheck*
      Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=86225Signed-off-by: NChris Wilson <chris@chris-wilson.co.uk>
      Cc: Mika Kuoppala <mika.kuoppala@intel.com>
      Reviewed-by: NMika Kuoppala <mika.kuoppala@intel.com>
      Signed-off-by: NDaniel Vetter <daniel.vetter@ffwll.ch>
      672e7b7c
  18. 15 11月, 2014 2 次提交
  19. 14 11月, 2014 5 次提交
  20. 08 11月, 2014 4 次提交