• Thomas Daniel's avatar
    drm/i915/bdw: Handle context switch events · e981e7b1
    Thomas Daniel authored
    Handle all context status events in the context status buffer on every
    context switch interrupt. We only remove work from the execlist queue
    after a context status buffer reports that it has completed and we only
    attempt to schedule new contexts on interrupt when a previously submitted
    context completes (unless no contexts are queued, which means the GPU is
    free).
    
    We canot call intel_runtime_pm_get() in an interrupt (or with a spinlock
    grabbed, FWIW), because it might sleep, which is not a nice thing to do.
    Instead, do the runtime_pm get/put together with the create/destroy request,
    and handle the forcewake get/put directly.
    Signed-off-by: default avatarThomas Daniel <thomas.daniel@intel.com>
    
    v2: Unreferencing the context when we are freeing the request might free
    the backing bo, which requires the struct_mutex to be grabbed, so defer
    unreferencing and freeing to a bottom half.
    
    v3:
    - Ack the interrupt inmediately, before trying to handle it (fix for
    missing interrupts by Bob Beckett <robert.beckett@intel.com>).
    - Update the Context Status Buffer Read Pointer, just in case (spotted
    by Damien Lespiau).
    
    v4: New namespace and multiple rebase changes.
    
    v5: Squash with "drm/i915/bdw: Do not call intel_runtime_pm_get() in an
    interrupt", as suggested by Daniel.
    Signed-off-by: default avatarOscar Mateo <oscar.mateo@intel.com>
    Reviewed-by: default avatarDamien Lespiau <damien.lespiau@intel.com>
    [danvet: Checkpatch ...]
    Signed-off-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
    e981e7b1
intel_ringbuffer.h 14.5 KB