/** * intel_gvt_check_vblank_emulation - check if vblank emulation timer should * be turned on/off when a virtual pipe is enabled/disabled. * @gvt: a GVT device * * This function is used to turn on/off vblank timer according to currently * enabled/disabled virtual pipes. * */ void intel_gvt_check_vblank_emulation(struct intel_gvt *gvt) { struct intel_gvt_irq *irq = &gvt->irq; struct intel_vgpu *vgpu; bool have_enabled_pipe = false; int pipe, id; if (WARN_ON(!mutex_is_locked(&gvt->lock))) return; hrtimer_cancel(&irq->vblank_timer.timer); for_each_active_vgpu(gvt, vgpu, id) { for (pipe = 0; pipe < I915_MAX_PIPES; pipe++) { have_enabled_pipe = pipe_is_enabled(vgpu, pipe); if (have_enabled_pipe) break; } } if (have_enabled_pipe) hrtimer_start(&irq->vblank_timer.timer, ktime_add_ns(ktime_get(), irq->vblank_timer.period), HRTIMER_MODE_ABS); }
/** * intel_gvt_check_vblank_emulation - check if vblank emulation timer should * be turned on/off when a virtual pipe is enabled/disabled. * @gvt: a GVT device * * This function is used to turn on/off vblank timer according to currently * enabled/disabled virtual pipes. * */ void intel_gvt_check_vblank_emulation(struct intel_gvt *gvt) { struct intel_gvt_irq *irq = &gvt->irq; struct intel_vgpu *vgpu; int pipe, id; if (WARN_ON(!mutex_is_locked(&gvt->lock))) return; for_each_active_vgpu(gvt, vgpu, id) { for (pipe = 0; pipe < I915_MAX_PIPES; pipe++) { if (pipe_is_enabled(vgpu, pipe)) goto out; } } /* all the pipes are disabled */ hrtimer_cancel(&irq->vblank_timer.timer); return; out: hrtimer_start(&irq->vblank_timer.timer, ktime_add_ns(ktime_get(), irq->vblank_timer.period), HRTIMER_MODE_ABS); }
static int get_active_pipe(struct intel_vgpu *vgpu) { int i; for (i = 0; i < I915_MAX_PIPES; i++) if (pipe_is_enabled(vgpu, i)) break; return i; }