1. 28 2月, 2017 2 次提交
  2. 21 2月, 2017 1 次提交
  3. 19 1月, 2017 1 次提交
  4. 18 1月, 2017 2 次提交
  5. 13 1月, 2017 1 次提交
  6. 07 1月, 2017 1 次提交
  7. 28 12月, 2016 1 次提交
  8. 19 12月, 2016 1 次提交
    • C
      drm/i915: Unify active context tracking between legacy/execlists/guc · e8a9c58f
      Chris Wilson 提交于
      The requests conversion introduced a nasty bug where we could generate a
      new request in the middle of constructing a request if we needed to idle
      the system in order to evict space for a context. The request to idle
      would be executed (and waited upon) before the current one, creating a
      minor havoc in the seqno accounting, as we will consider the current
      request to already be completed (prior to deferred seqno assignment) but
      ring->last_retired_head would have been updated and still could allow
      us to overwrite the current request before execution.
      
      We also employed two different mechanisms to track the active context
      until it was switched out. The legacy method allowed for waiting upon an
      active context (it could forcibly evict any vma, including context's),
      but the execlists method took a step backwards by pinning the vma for
      the entire active lifespan of the context (the only way to evict was to
      idle the entire GPU, not individual contexts). However, to circumvent
      the tricky issue of locking (i.e. we cannot take struct_mutex at the
      time of i915_gem_request_submit(), where we would want to move the
      previous context onto the active tracker and unpin it), we take the
      execlists approach and keep the contexts pinned until retirement.
      The benefit of the execlists approach, more important for execlists than
      legacy, was the reduction in work in pinning the context for each
      request - as the context was kept pinned until idle, it could short
      circuit the pinning for all active contexts.
      
      We introduce new engine vfuncs to pin and unpin the context
      respectively. The context is pinned at the start of the request, and
      only unpinned when the following request is retired (this ensures that
      the context is idle and coherent in main memory before we unpin it). We
      move the engine->last_context tracking into the retirement itself
      (rather than during request submission) in order to allow the submission
      to be reordered or unwound without undue difficultly.
      
      And finally an ulterior motive for unifying context handling was to
      prepare for mock requests.
      
      v2: Rename to last_retired_context, split out legacy_context tracking
      for MI_SET_CONTEXT.
      Signed-off-by: NChris Wilson <chris@chris-wilson.co.uk>
      Reviewed-by: NTvrtko Ursulin <tvrtko.ursulin@intel.com>
      Link: http://patchwork.freedesktop.org/patch/msgid/20161218153724.8439-3-chris@chris-wilson.co.uk
      e8a9c58f
  9. 16 12月, 2016 1 次提交
  10. 02 12月, 2016 2 次提交
  11. 29 11月, 2016 4 次提交
    • C
      drm/i915/guc: Split hw submission for replay after GPU reset · 34ba5a80
      Chris Wilson 提交于
      Something I missed before sending off the partial series was that the
      non-scheduler guc reset path was broken (in the full series, this is
      pushed to the execlists reset handler). The issue is that after a reset,
      we have to refill the GuC workqueues, which we do by resubmitting the
      requests. However, if we already have submitted them, the fences within
      them have already been used and triggering them again is an error.
      Instead, just repopulate the guc workqueue.
      
      [  115.858560] [IGT] gem_busy: starting subtest hang-render
      [  135.839867] [drm] GPU HANG: ecode 9:0:0xe757fefe, in gem_busy [1716], reason: Hang on render ring, action: reset
      [  135.839902] drm/i915: Resetting chip after gpu hang
      [  135.839957] [drm] RC6 on
      [  135.858351] ------------[ cut here ]------------
      [  135.858357] WARNING: CPU: 2 PID: 45 at drivers/gpu/drm/i915/i915_sw_fence.c:108 i915_sw_fence_complete+0x25/0x30
      [  135.858357] Modules linked in: rfcomm bnep binfmt_misc nls_iso8859_1 input_leds snd_hda_codec_hdmi snd_hda_codec_realtek snd_hda_codec_generic snd_hda_intel snd_hda_codec snd_hda_core btusb btrtl snd_hwdep snd_pcm 8250_dw snd_seq_midi hid_lenovo snd_seq_midi_event snd_rawmidi iwlwifi x86_pkg_temp_thermal coretemp snd_seq crct10dif_pclmul snd_seq_device hci_uart snd_timer crc32_pclmul ghash_clmulni_intel idma64 aesni_intel virt_dma btbcm snd btqca aes_x86_64 btintel lrw cfg80211 bluetooth gf128mul glue_helper ablk_helper cryptd soundcore intel_lpss_pci intel_pch_thermal intel_lpss_acpi intel_lpss acpi_als mfd_core kfifo_buf acpi_pad industrialio autofs4 hid_plantronics usbhid dm_mirror dm_region_hash dm_log sdhci_pci ahci sdhci libahci i2c_hid hid
      [  135.858389] CPU: 2 PID: 45 Comm: kworker/2:1 Tainted: G        W       4.9.0-rc4+ #238
      [  135.858389] Hardware name:                  /NUC6i3SYB, BIOS SYSKLi35.86A.0024.2015.1027.2142 10/27/2015
      [  135.858392] Workqueue: events_long i915_hangcheck_elapsed
      [  135.858394]  ffffc900001bf9b8 ffffffff812bb238 0000000000000000 0000000000000000
      [  135.858396]  ffffc900001bf9f8 ffffffff8104f621 0000006c00000000 ffff8808296137f8
      [  135.858398]  0000000000000a00 ffff8808457a0000 ffff880845764e60 ffff880845760000
      [  135.858399] Call Trace:
      [  135.858403]  [<ffffffff812bb238>] dump_stack+0x4d/0x65
      [  135.858405]  [<ffffffff8104f621>] __warn+0xc1/0xe0
      [  135.858406]  [<ffffffff8104f748>] warn_slowpath_null+0x18/0x20
      [  135.858408]  [<ffffffff813f8c15>] i915_sw_fence_complete+0x25/0x30
      [  135.858410]  [<ffffffff813f8fad>] i915_sw_fence_commit+0xd/0x30
      [  135.858412]  [<ffffffff8142e591>] __i915_gem_request_submit+0xe1/0xf0
      [  135.858413]  [<ffffffff8142e5c8>] i915_gem_request_submit+0x28/0x40
      [  135.858415]  [<ffffffff814433e7>] i915_guc_submit+0x47/0x210
      [  135.858417]  [<ffffffff81443e98>] i915_guc_submission_enable+0x468/0x540
      [  135.858419]  [<ffffffff81442495>] intel_guc_setup+0x715/0x810
      [  135.858421]  [<ffffffff8142b6b4>] i915_gem_init_hw+0x114/0x2a0
      [  135.858423]  [<ffffffff813eeaa8>] i915_reset+0xe8/0x120
      [  135.858424]  [<ffffffff813f3937>] i915_reset_and_wakeup+0x157/0x180
      [  135.858426]  [<ffffffff813f79db>] i915_handle_error+0x1ab/0x230
      [  135.858428]  [<ffffffff812c760d>] ? scnprintf+0x4d/0x90
      [  135.858430]  [<ffffffff81435985>] i915_hangcheck_elapsed+0x275/0x3d0
      [  135.858432]  [<ffffffff810668cf>] process_one_work+0x12f/0x410
      [  135.858433]  [<ffffffff81066bf3>] worker_thread+0x43/0x4d0
      [  135.858435]  [<ffffffff81066bb0>] ? process_one_work+0x410/0x410
      [  135.858436]  [<ffffffff81066bb0>] ? process_one_work+0x410/0x410
      [  135.858438]  [<ffffffff8106bbb4>] kthread+0xd4/0xf0
      [  135.858440]  [<ffffffff8106bae0>] ? kthread_park+0x60/0x60
      
      v2: Only resubmit submitted requests
      v3: Don't forget the pending requests have reserved space.
      
      Fixes: d55ac5bf ("drm/i915: Defer transfer onto execution timeline to actual hw submission")
      Signed-off-by: NChris Wilson <chris@chris-wilson.co.uk>
      Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
      Reviewed-by: NTvrtko Ursulin <tvrtko.ursulin@intel.com>
      Link: http://patchwork.freedesktop.org/patch/msgid/20161129121024.22650-6-chris@chris-wilson.co.uk
      34ba5a80
    • C
      drm/i915/guc: Keep the execbuf client allocated across reset · 4d357af4
      Chris Wilson 提交于
      In order to avoid some complexity in trying to reconstruct the
      workqueues across reset, remember them instead. The issue comes when we
      have to handle a reset between request allocation and submission, the
      request has reserved space in the wq, but is not in any list so we fail
      to restore the reserved space. By keeping the execbuf client intact
      across the reset, we also keep the reservations.
      Signed-off-by: NChris Wilson <chris@chris-wilson.co.uk>
      Reviewed-by: NTvrtko Ursulin <tvrtko.ursulin@intel.com>
      Link: http://patchwork.freedesktop.org/patch/msgid/20161129121024.22650-5-chris@chris-wilson.co.uk
      4d357af4
    • C
    • C
      drm/i915/guc: Rename client->cookie to match use · 357248bf
      Chris Wilson 提交于
      The client->cookie is a shadow of the doorbell->cookie value, so rename
      it to indicate its association with the doorbell, like the doorbell id
      and offset.
      Signed-off-by: NChris Wilson <chris@chris-wilson.co.uk>
      Reviewed-by: NTvrtko Ursulin <tvrtko.ursulin@intel.com>
      Link: http://patchwork.freedesktop.org/patch/msgid/20161129121024.22650-3-chris@chris-wilson.co.uk
      357248bf
  12. 26 11月, 2016 5 次提交
  13. 15 11月, 2016 2 次提交
    • C
      drm/i915/scheduler: Execute requests in order of priorities · 20311bd3
      Chris Wilson 提交于
      Track the priority of each request and use it to determine the order in
      which we submit requests to the hardware via execlists.
      
      The priority of the request is determined by the user (eventually via
      the context) but may be overridden at any time by the driver. When we set
      the priority of the request, we bump the priority of all of its
      dependencies to match - so that a high priority drawing operation is not
      stuck behind a background task.
      
      When the request is ready to execute (i.e. we have signaled the submit
      fence following completion of all its dependencies, including third
      party fences), we put the request into a priority sorted rbtree to be
      submitted to the hardware. If the request is higher priority than all
      pending requests, it will be submitted on the next context-switch
      interrupt as soon as the hardware has completed the current request. We
      do not currently preempt any current execution to immediately run a very
      high priority request, at least not yet.
      
      One more limitation, is that this is first implementation is for
      execlists only so currently limited to gen8/gen9.
      
      v2: Replace recursive priority inheritance bumping with an iterative
      depth-first search list.
      v3: list_next_entry() for walking lists
      v4: Explain how the dfs solves the recursion problem with PI.
      Signed-off-by: NChris Wilson <chris@chris-wilson.co.uk>
      Reviewed-by: NTvrtko Ursulin <tvrtko.ursulin@intel.com>
      Link: http://patchwork.freedesktop.org/patch/msgid/20161114204105.29171-8-chris@chris-wilson.co.uk
      20311bd3
    • C
      drm/i915: Defer transfer onto execution timeline to actual hw submission · d55ac5bf
      Chris Wilson 提交于
      Defer the transfer from the client's timeline onto the execution
      timeline from the point of readiness to the point of actual submission.
      For example, in execlists, a request is finally submitted to hardware
      when the hardware is ready, and only put onto the hardware queue when
      the request is ready. By deferring the transfer, we ensure that the
      timeline is maintained in retirement order if we decide to queue the
      requests onto the hardware in a different order than fifo.
      
      v2: Rebased onto distinct global/user timeline lock classes.
      v3: Play with the position of the spin_lock().
      v4: Nesting finally resolved with distinct sw_fence lock classes.
      Signed-off-by: NChris Wilson <chris@chris-wilson.co.uk>
      Reviewed-by: NTvrtko Ursulin <tvrtko.ursulin@intel.com>
      Link: http://patchwork.freedesktop.org/patch/msgid/20161114204105.29171-4-chris@chris-wilson.co.uk
      d55ac5bf
  14. 04 11月, 2016 1 次提交
  15. 29 10月, 2016 2 次提交
  16. 26 10月, 2016 1 次提交
    • A
      drm/i915/guc: WA to address the Ringbuffer coherency issue · ed4596ea
      Akash Goel 提交于
      Driver accesses the ringbuffer pages, via GMADR BAR, if the pages are
      pinned in mappable aperture portion of GGTT and for ringbuffer pages
      allocated from Stolen memory, access can only be done through GMADR BAR.
      In case of GuC based submission, updates done in ringbuffer via GMADR
      may not get committed to memory by the time the Command streamer starts
      reading them, resulting in fetching of stale data.
      
      For Host based submission, such problem is not there as the write to Ring
      Tail or ELSP register happens from the Host side prior to submission.
      Access to any GFX register from CPU side goes to GTTMMADR BAR and Hw already
      enforces the ordering between outstanding GMADR writes & new GTTMADR access.
      MMIO writes from GuC side do not go to GTTMMADR BAR as GuC communication to
      registers within GT is contained within GT, so ordering is not enforced
      resulting in a race, which can manifest in form of a hang.
      
      To ensure the flush of in-flight GMADR writes, a POSTING READ is done to
      GuC register prior to doorbell ring.
      There is already a similar WA in i915_gem_object_flush_gtt_write_domain(),
      which takes care of GMADR writes from User space to GEM buffers, but not the
      ringbuffer writes from KMD.
      This WA is needed on all recent HW.
      
      v2:
      - Use POSTING_READ_FW instead of POSTING_READ as GuC register do not lie
        in any forcewake domain range and so the overhead of spinlock & search
        in the forcewake table is avoidable. (Chris)
      
      Cc: Chris Wilson <chris@chris-wilson.co.uk>
      Signed-off-by: NSagar Arun Kamble <sagar.a.kamble@intel.com>
      Signed-off-by: NAkash Goel <akash.goel@intel.com>
      Reviewed-by: NChris Wilson <chris@chris-wilson.co.uk>
      Signed-off-by: NChris Wilson <chris@chris-wilson.co.uk>
      Link: http://patchwork.freedesktop.org/patch/msgid/1477413323-1880-1-git-send-email-akash.goel@intel.com
      ed4596ea
  17. 25 10月, 2016 12 次提交
    • A
      drm/i915: Mark the GuC log buffer flush interrupts handling WQ as freezable · 7ef54de7
      Akash Goel 提交于
      The GuC log buffer flush work item has to do a register access to send the
      ack to GuC and this work item, if not synced before suspend, can potentially
      get executed after the GFX device is suspended. This work item function uses
      rpm get/put calls around the Hw access, which covers the rpm suspend case
      but for system suspend a sync would be required as kernel can potentially
      schedule the work items even after some devices, including GFX, have been
      put to suspend. But sync has to be done only for the system suspend case,
      as sync along with rpm get/put can cause a deadlock for rpm suspend path.
      To have the sync, but like a NOOP, for rpm suspend path also this work
      item could have been queued from the irq handler only when the device is
      runtime active & kept active while that work item is pending or getting
      executed but an interrupt can come even after the device is out of use and
      so can potentially lead to missing of this work item.
      
      By marking the workqueue, dedicated for handling GuC log buffer flush
      interrupts, as freezable we don't have to bother about flushing of this
      work item from the suspend hooks, the pending work item if any will be
      either executed before the suspend or scheduled later on resume. This way
      the handling of log buffer flush work item can be kept same between system
      suspend & rpm suspend.
      Suggested-by: NImre Deak <imre.deak@intel.com>
      Cc: Imre Deak <imre.deak@intel.com>
      Signed-off-by: NAkash Goel <akash.goel@intel.com>
      Reviewed-by: NImre Deak <imre.deak@intel.com>
      Signed-off-by: NTvrtko Ursulin <tvrtko.ursulin@intel.com>
      7ef54de7
    • A
      drm/i915: Early creation of relay channel for capturing boot time logs · 1e6b8b0d
      Akash Goel 提交于
      As per the current i915 Driver load sequence, debugfs registration is done
      at the end and so the relay channel debugfs file is also created after that
      but the GuC firmware is loaded much earlier in the sequence.
      As a result Driver could miss capturing the boot-time logs of GuC firmware
      if there are flush interrupts from the GuC side.
      Relay has a provision to support early logging where initially only relay
      channel can be created, to have buffers for storing logs, and later on
      channel can be associated with a debugfs file at appropriate time.
      Have availed that, which allows Driver to capture boot time logs also,
      which can be collected once Userspace comes up.
      
      v2:
      - Remove the couple of FIXMEs, as now the relay channel will be created
        early before enabling the flush interrupts, so no possibility of relay
        channel pointer being modified & read at the same time from 2 different
        execution contexts.
      - Rebase.
      
      v3:
      - Add a comment to justiy setting 'is_global' before the NULL check on the
        parent directory dentry pointer.
      Suggested-by: NChris Wilson <chris@chris-wilson.co.uk>
      Signed-off-by: NAkash Goel <akash.goel@intel.com>
      Reviewed-by: NTvrtko Ursulin <tvrtko.ursulin@intel.com>
      Signed-off-by: NTvrtko Ursulin <tvrtko.ursulin@intel.com>
      1e6b8b0d
    • A
      drm/i915: Use SSE4.1 movntdqa based memcpy for sampling GuC log buffer · 71706590
      Akash Goel 提交于
      To ensure that we always get the up-to-date data from log buffer, its
      better to access the buffer through an uncached CPU mapping. Also the way
      buffer is accessed from GuC & Host side, manually doing cache flush may
      not be effective always if cached CPU mapping is used. In order to avoid
      any performance drop & have fast reads from the GuC log buffer, used SSE4.1
      movntdqa based memcpy function i915_memcpy_from_wc, as copying using
      movntqda from WC type memory is almost as fast as reading from WB memory.
      This way log buffer sampling time will not get increased and so would be
      able to deal with the flush interrupt storm when GuC is generating logs at
      a very high rate.
      Ideally SSE 4.1 should be present on all chipsets supporting GuC based
      submisssions, but if not then logging will not be enabled.
      
      v2: Rebase.
      
      v3: Squash the WC type vmalloc mapping patch with this patch. (Chris)
      Suggested-by: NChris Wilson <chris@chris-wilson.co.uk>
      Signed-off-by: NAkash Goel <akash.goel@intel.com>
      Reviewed-by: NTvrtko Ursulin <tvrtko.ursulin@intel.com>
      Signed-off-by: NTvrtko Ursulin <tvrtko.ursulin@intel.com>
      71706590
    • S
      drm/i915: Debugfs support for GuC logging control · 685534ef
      Sagar Arun Kamble 提交于
      This patch provides debugfs interface i915_guc_output_control for
      on the fly enabling/disabling of logging in GuC firmware and controlling
      the verbosity level of logs.
      The value written to the file, should have bit 0 set to enable logging and
      bits 4-7 should contain the verbosity info.
      
      v2: Add a forceful flush, to collect left over logs, on disabling logging.
          Useful for Validation.
      
      v3: Besides minor cleanup, implement read method for the debugfs file and
          set the guc_log_level to -1 when logging is disabled. (Tvrtko)
      
      v4: Minor cleanup & rebase. (Tvrtko)
      
      v5:
      - Lock struct_mutex after the NULL check for guc log buffer vma. (Chris)
      - Rebase.
      Signed-off-by: NSagar Arun Kamble <sagar.a.kamble@intel.com>
      Signed-off-by: NAkash Goel <akash.goel@intel.com>
      Reviewed-by: NTvrtko Ursulin <tvrtko.ursulin@intel.com>
      Signed-off-by: NTvrtko Ursulin <tvrtko.ursulin@intel.com>
      685534ef
    • S
      drm/i915: Support for forceful flush of GuC log buffer · 896a0cb0
      Sagar Arun Kamble 提交于
      GuC firmware sends a flush interrupt to Host when the log buffer is half
      full and at that time only it updates the log buffer state.
      But in certain cases, as described below, it could be useful to have all
      that even when log buffer is only partially full. For that there is a force
      log buffer flush Host2GuC action supported by GuC firmware.
      
      For Validation requirements, a forceful flush is needed to collect the
      left over logs on disabling logging. The same can be done before proceeding
      with GPU/GuC reset as there could be some data in log buffer which is yet
      to be captured and those logs would be particularly useful to understand
      that why the reset was initiated.
      Signed-off-by: NSagar Arun Kamble <sagar.a.kamble@intel.com>
      Signed-off-by: NAkash Goel <akash.goel@intel.com>
      Reviewed-by: NTvrtko Ursulin <tvrtko.ursulin@intel.com>
      Signed-off-by: NTvrtko Ursulin <tvrtko.ursulin@intel.com>
      896a0cb0
    • A
      drm/i915: Optimization to reduce the sampling time of GuC log buffer · 6941f3c9
      Akash Goel 提交于
      GuC firmware sends an interrupt to flush the log buffer when it becomes
      half full, so Driver doesn't really need to sample the complete buffer
      and can just copy only the newly written data by GuC into the local
      buffer, i.e. as per the read & write pointer values.
      Moreover the flush interrupt would generally come for one type of log
      buffer, when it becomes half full, so at that time the other 2 types of
      log buffer would comparatively have much lesser unread data in them.
      In case of overflow reported by GuC, Driver do need to copy the entire
      buffer as the whole buffer would contain the unread data.
      
      v2: Rebase.
      
      v3: Fix the blooper of doing the copy twice. (Tvrtko)
      
      v4: Add curlies for 'else' case also, matching the 'if'. (Tvrtko)
      Signed-off-by: NAkash Goel <akash.goel@intel.com>
      Reviewed-by: NTvrtko Ursulin <tvrtko.ursulin@intel.com>
      Signed-off-by: NTvrtko Ursulin <tvrtko.ursulin@intel.com>
      6941f3c9
    • A
      drm/i915: Add stats for GuC log buffer flush interrupts · 5aa1ee4b
      Akash Goel 提交于
      GuC firmware sends an interrupt to flush the log buffer when it
      becomes half full. GuC firmware also tracks how many times the
      buffer overflowed.
      It would be useful to maintain a statistics of how many flush
      interrupts were received and for which type of log buffer,
      along with the overflow count of each buffer type.
      Augmented i915_log_info debugfs to report back these statistics.
      
      v2:
      - Update the logic to detect multiple overflows between the 2
        flush interrupts and also log a message for overflow (Tvrtko)
      - Track the number of times there was no free sub buffer to capture
        the GuC log buffer. (Tvrtko)
      
      v3:
      - Fix the printf field width for overflow counter, set it to 10 as per the
        max value of u32, which takes 10 digits in decimal form. (Tvrtko)
      
      v4:
      - Move the log buffer overflow handling to a new function for better
        readability. (Tvrtko)
      Signed-off-by: NAkash Goel <akash.goel@intel.com>
      Reviewed-by: NTvrtko Ursulin <tvrtko.ursulin@intel.com>
      Signed-off-by: NTvrtko Ursulin <tvrtko.ursulin@intel.com>
      5aa1ee4b
    • A
      drm/i915: New lock to serialize the Host2GuC actions · 5dd7989b
      Akash Goel 提交于
      With the addition of new Host2GuC actions related to GuC logging, there
      is a need of a lock to serialize them, as they can execute concurrently
      with each other and also with other existing actions.
      
      v2: Use mutex in place of spinlock to serialize, as sleep can happen
          while waiting for the action's response from GuC. (Tvrtko)
      
      v3: To conform to the general rules, acquire mutex before taking the
          forcewake. (Tvrtko)
      Signed-off-by: NAkash Goel <akash.goel@intel.com>
      Reviewed-by: NTvrtko Ursulin <tvrtko.ursulin@intel.com>
      Signed-off-by: NTvrtko Ursulin <tvrtko.ursulin@intel.com>
      5dd7989b
    • A
      drm/i915: Add a relay backed debugfs interface for capturing GuC logs · f8240835
      Akash Goel 提交于
      Added a new debugfs interface '/sys/kernel/debug/dri/guc_log' for the
      User to capture GuC firmware logs. Availed relay framework to implement
      the interface, where Driver will have to just use a relay API to store
      snapshots of the GuC log buffer in the buffer managed by relay.
      The snapshot will be taken when GuC firmware sends a log buffer flush
      interrupt and up to four snapshots could be stored in the relay buffer.
      The relay buffer will be operated in a mode where it will overwrite the
      data not yet collected by User.
      Besides mmap method, through which User can directly access the relay
      buffer contents, relay also supports the 'poll' method. Through the 'poll'
      call on log file, User can come to know whenever a new snapshot of the
      log buffer is taken by Driver, so can run in tandem with the Driver and
      capture the logs in a sustained/streaming manner, without any loss of data.
      
      v2: Defer the creation of relay channel & associated debugfs file, as
          debugfs setup is now done at the end of i915 Driver load. (Chris)
      
      v3:
      - Switch to no-overwrite mode for relay.
      - Fix the relay sub buffer switching sequence.
      
      v4:
      - Update i915 Kconfig to select RELAY config. (TvrtKo)
      - Log a message when there is no sub buffer available to capture
        the GuC log buffer. (Tvrtko)
      - Increase the number of relay sub buffers to 8 from 4, to have
        sufficient buffering for boot time logs
      
      v5:
      - Fix the alignment, indentation issues and some minor cleanup. (Tvrtko)
      - Update the comment to elaborate on why a relay channel has to be
        associated with the debugfs file. (Tvrtko)
      
      v6:
      - Move the write to 'is_global' after the NULL check on parent directory
        dentry pointer. (Tvrtko)
      
      v7: Add a BUG_ON to validate relay buffer allocation size. (Chris)
      
      Testcase: igt/tools/intel_guc_logger
      Suggested-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>
      Reviewed-by: NTvrtko Ursulin <tvrtko.ursulin@intel.com>
      Signed-off-by: NTvrtko Ursulin <tvrtko.ursulin@intel.com>
      f8240835
    • S
      drm/i915: Handle log buffer flush interrupt event from GuC · 4100b2ab
      Sagar Arun Kamble 提交于
      GuC ukernel sends an interrupt to Host to flush the log buffer
      and expects Host to correspondingly update the read pointer
      information in the state structure, once it has consumed the
      log buffer contents by copying them to a file or buffer.
      Even if Host couldn't copy the contents, it can still update the
      read pointer so that logging state is not disturbed on GuC side.
      
      v2:
      - Use a dedicated workqueue for handling flush interrupt. (Tvrtko)
      - Reduce the overall log buffer copying time by skipping the copy of
        crash buffer area for regular cases and copying only the state
        structure data in first page.
      
      v3:
       - Create a vmalloc mapping of log buffer. (Chris)
       - Cover the flush acknowledgment under rpm get & put.(Chris)
       - Revert the change of skipping the copy of crash dump area, as
         not really needed, will be covered by subsequent patch.
      
      v4:
       - Destroy the wq under the same condition in which it was created,
         pass dev_piv pointer instead of dev to newly added GuC function,
         add more comments & rename variable for clarity. (Tvrtko)
      
      v5:
      - Allocate & destroy the dedicated wq, for handling flush interrupt,
        from the setup/teardown routines of GuC logging. (Chris)
      - Validate the log buffer size value retrieved from state structure
        and do some minor cleanup. (Tvrtko)
      - Fix error/warnings reported by checkpatch. (Tvrtko)
      - Rebase.
      
      v6:
       - Remove the interrupts_enabled check from guc_capture_logs_work, need
         to process that last work item also, queued just before disabling the
         interrupt as log buffer flush interrupt handling is a bit different
         case where GuC is actually expecting an ACK from host, which should be
         provided to keep the logging going.
         Sync against the work will be done by caller disabling the interrupt.
       - Don't sample the log buffer size value from state structure, directly
         use the expected value to move the pointer & do the copy and that cannot
         go wrong (out of bounds) as Driver only allocated the log buffer and the
         relay buffers. Driver should refrain from interpreting the log packet,
         as much possible and let Userspace parser detect the anomaly. (Chris)
      
      v7:
      - Use switch statement instead of 'if else' for retrieving the GuC log
        buffer size. (Tvrtko)
      - Refactored the log buffer copying function and shortended the name of
        couple of variables for better readability. (Tvrtko)
      
      v8:
      - Make the dedicated wq as a high priority one to further reduce the
        turnaround time of handing log buffer flush event from GuC.
      Signed-off-by: NSagar Arun Kamble <sagar.a.kamble@intel.com>
      Signed-off-by: NAkash Goel <akash.goel@intel.com>
      Reviewed-by: NTvrtko Ursulin <tvrtko.ursulin@intel.com>
      Signed-off-by: NTvrtko Ursulin <tvrtko.ursulin@intel.com>
      4100b2ab
    • S
      drm/i915: Support for GuC interrupts · 26705e20
      Sagar Arun Kamble 提交于
      There are certain types of interrupts which Host can receive from GuC.
      GuC ukernel sends an interrupt to Host for certain events, like for
      example retrieve/consume the logs generated by ukernel.
      This patch adds support to receive interrupts from GuC but currently
      enables & partially handles only the interrupt sent by GuC ukernel.
      Future patches will add support for handling other interrupt types.
      
      v2:
      - Use common low level routines for PM IER/IIR programming (Chris)
      - Rename interrupt functions to gen9_xxx from gen8_xxx (Chris)
      - Replace disabling of wake ref asserts with rpm get/put (Chris)
      
      v3:
      - Update comments for more clarity. (Tvrtko)
      - Remove the masking of GuC interrupt, which was kept masked till the
        start of bottom half, its not really needed as there is only a
        single instance of work item & wq is ordered. (Tvrtko)
      
      v4:
      - Rebase.
      - Rename guc_events to pm_guc_events so as to be indicative of the
        register/control block it is associated with. (Chris)
      - Add handling for back to back log buffer flush interrupts.
      
      v5:
      - Move the read & clearing of register, containing Guc2Host message
        bits, outside the irq spinlock. (Tvrtko)
      
      v6:
      - Move the log buffer flush interrupt related stuff to the following
        patch so as to do only generic bits in this patch. (Tvrtko)
      - Rebase.
      
      v7:
      - Remove the interrupts_enabled check from gen9_guc_irq_handler, want to
        process that last interrupt also before disabling the interrupt, sync
        against the work queued by irq handler will be done by caller disabling
        the interrupt.
      Signed-off-by: NSagar Arun Kamble <sagar.a.kamble@intel.com>
      Signed-off-by: NAkash Goel <akash.goel@intel.com>
      Reviewed-by: NTvrtko Ursulin <tvrtko.ursulin@intel.com>
      Signed-off-by: NTvrtko Ursulin <tvrtko.ursulin@intel.com>
      26705e20
    • A
      drm/i915: New structure to contain GuC logging related fields · d6b40b4b
      Akash Goel 提交于
      So far there were 2 fields related to GuC logs in 'intel_guc' structure.
      For the support of capturing GuC logs & storing them in a local buffer,
      multiple new fields would have to be added. This warrants a separate
      structure to contain the fields related to GuC logging state.
      Added a new structure 'intel_guc_log' and instance of it inside
      'intel_guc' structure.
      
      v2: Rebase.
      Signed-off-by: NAkash Goel <akash.goel@intel.com>
      Reviewed-by: NTvrtko Ursulin <tvrtko.ursulin@intel.com>
      Signed-off-by: NTvrtko Ursulin <tvrtko.ursulin@intel.com>
      d6b40b4b