• M
    drm/intel: Push get_scanout_position() timestamping into kms driver. · ad3543ed
    Mario Kleiner 提交于
    Move the ktime_get() clock readouts and potential preempt_disable()
    calls from drm core into kms driver to make it compatible with the
    api changes in the drm core.
    
    The intel-kms driver needs to take the uncore.lock inside
    i915_get_crtc_scanoutpos() and intel_pipe_in_vblank().
    This is incompatible with the preempt_disable() on a
    PREEMPT_RT patched kernel, as regular spin locks must not
    be taken within a preempt_disable'd section. Lock contention
    on the uncore.lock also introduced too much uncertainty in vblank
    timestamps.
    
    Push the ktime_get() timestamping for scanoutpos queries and
    potential preempt_disable_rt() into i915_get_crtc_scanoutpos(),
    so these problems can be avoided:
    
    1. First lock the uncore.lock (might sleep on a PREEMPT_RT kernel).
    2. preempt_disable_rt() (will be added by the rt-linux folks).
    3. ktime_get() a timestamp before scanout pos query.
    4. Do all mmio reads as fast as possible without grabbing any new locks!
    5. ktime_get() a post-query timestamp.
    6. preempt_enable_rt()
    7. Unlock the uncore.lock.
    
    This reduces timestamp uncertainty on a low-end HP Atom Mini netbook
    with Intel GMA-950 nicely:
    
    Before: 3-8 usecs with spikes > 20 usecs, triggering query retries.
    After : Typically 1 usec (98% of all samples), occassionally 2 usecs
            (2% of all samples), with maximum of 3 usecs (a handful).
    
    v2: Fix formatting of new multi-line code comments.
    Signed-off-by: NMario Kleiner <mario.kleiner.de@gmail.com>
    Reviewed-by: NVille Syrjälä <ville.syrjala@linux.intel.com>
    Reviewed-by: NAlex Deucher <alexander.deucher@amd.com>
    Signed-off-by: NDave Airlie <airlied@redhat.com>
    ad3543ed
i915_irq.c 100.4 KB