• Daniel Vetter's avatar
    drm/i915: irq-drive the dp aux communication · 9ee32fea
    Daniel Vetter authored
    At least on the platforms that have a dp aux irq and also have it
    enabled - vlvhsw should have one, too. But I don't have a machine to
    test this on. Judging from docs there's no dp aux interrupt for gm45.
    
    Also, I only have an ivb cpu edp machine, so the dp aux A code for
    snb/ilk is untested.
    
    For dpcd probing when nothing is connected it slashes about 5ms of cpu
    time (cpu time is now negligible), which agrees with 3 * 5 400 usec
    timeouts.
    
    A previous version of this patch increases the time required to go
    through the dp_detect cycle (which includes reading the edid) from
    around 33 ms to around 40 ms. Experiments indicated that this is
    purely due to the irq latency - the hw doesn't allow us to queue up
    dp aux transactions and hence irq latency directly affects throughput.
    gmbus is much better, there we have a 8 byte buffer, and we get the
    irq once another 4 bytes can be queued up.
    
    But by using the pm_qos interface to request the lowest possible cpu
    wake-up latency this slowdown completely disappeared.
    
    Since all our output detection logic is single-threaded with the
    mode_config mutex right now anyway, I've decide not ot play fancy and
    to just reuse the gmbus wait queue. But this would definitely prep the
    way to run dp detection on different ports in parallel
    
    v2: Add a timeout for dp aux transfers when using interrupts - the hw
    _does_  prevent this with the hw-based 400 usec timeout, but if the
    irq somehow doesn't arrive we're screwed. Lesson learned while
    developing this ;-)
    
    v3: While at it also convert the busy-loop to wait_for_atomic, so that
    we don't run the risk of an infinite loop any more.
    
    v4: Ensure we have the smallest possible irq latency by using the
    pm_qos interface.
    
    v5: Add a comment to the code to explain why we frob pm_qos. Suggested
    by Chris Wilson.
    
    v6: Disable dp irq for vlv, that's easier than trying to get at docs
    and hw.
    
    v7: Squash in a fix for Haswell that Paulo Zanoni tracked down - the
    dp aux registers aren't at a fixed offset any more, but can be on the
    PCH while the DP port is on the cpu die.
    
    Reviewed-by: Imre Deak <imre.deak@intel.com> (v6)
    Signed-off-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
    9ee32fea
intel_dp.c 80.9 KB