• Ville Syrjälä's avatar
    drm/i915: Reorder hpd init vs. display resume · 4c8d4651
    Ville Syrjälä authored
    Currently we call .hpd_irq_setup() directly just before display
    resume, and follow it with another call via intel_hpd_init()
    just afterwards. Assuming the hpd pins are marked as enabled
    during the open-coded call these two things do exactly the
    same thing (ie. enable HPD interrupts). Which even makes sense
    since we definitely need working HPD interrupts for MST sideband
    during the display resume.
    
    So let's nuke the open-coded call and move the intel_hpd_init()
    call earlier. However we need to leave the poll_init_work stuff
    behind after the display resume as that will trigger display
    detection while we're resuming. We don't want that trampling over
    the display resume process. To make this a bit more symmetric
    we turn this into a intel_hpd_poll_{enable,disable}() pair.
    So we end up with the following transformation:
    intel_hpd_poll_init() -> intel_hpd_poll_enable()
    lone intel_hpd_init() -> intel_hpd_init()+intel_hpd_poll_disable()
    .hpd_irq_setup()+resume+intel_hpd_init() -> intel_hpd_init()+resume+intel_hpd_poll_disable()
    
    If we really would like to prevent all *long* HPD processing during
    display resume we'd need some kind of software mechanism to simply
    ignore all long HPDs. Currently we appear to have that just for
    fbdev via ifbdev->hpd_suspended. Since we aren't exploding left and
    right all the time I guess that's mostly sufficient.
    
    For a bit of history on this, we first got a mechanism to block
    hotplug processing during suspend in commit 15239099 ("drm/i915:
    enable irqs earlier when resuming") on account of moving the irq enable
    earlier. This then got removed in commit 50c3dc97 ("drm/fb-helper:
    Fix hpd vs. initial config races") because the fdev initial config
    got pushed to a later point. The second ad-hoc hpd_irq_setup() for
    resume was added in commit 0e32b39c ("drm/i915: add DP 1.2 MST
    support (v0.7)") to be able to do MST sideband during the resume.
    And finally we got a partial resurrection of the hpd blocking
    mechanism in commit e8a8fedd ("drm/i915: Block fbdev HPD
    processing during suspend"), but this time it only prevent fbdev
    from handling hpd while resuming.
    
    v2: Leave the poll_init_work behind
    v3: Remove the extra intel_hpd_poll_disable() from display reset (Lyude)
        Add the missing intel_hpd_poll_disable() to display init (Imre)
    
    Cc: Lyude Paul <lyude@redhat.com>
    Cc: Imre Deak <imre.deak@intel.com>
    Signed-off-by: default avatarVille Syrjälä <ville.syrjala@linux.intel.com>
    Link: https://patchwork.freedesktop.org/patch/msgid/20201013181137.30560-1-ville.syrjala@linux.intel.comReviewed-by: default avatarImre Deak <imre.deak@intel.com>
    Reviewed-by: default avatarLyude Paul <lyude@redhat.com>
    4c8d4651
intel_display_power.c 166 KB