Skip to content

Commit

Permalink
drm/i915/mst: only ack the ESI we actually handled
Browse files Browse the repository at this point in the history
Seems odd that we clear all event status indicators if we've only
handled some. Only clear the ones we've handled.

v2: ack DOWN_REP and UP_REQ only if they were set in esi (Ville)

Signed-off-by: Jani Nikula <jani.nikula@intel.com>
Reviewed-by: Uma Shankar <uma.shankar@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20220120110102.3116218-1-jani.nikula@intel.com
  • Loading branch information
Jani Nikula committed Jan 21, 2022
1 parent b4a1c67 commit 784a2ec
Showing 1 changed file with 12 additions and 8 deletions.
20 changes: 12 additions & 8 deletions drivers/gpu/drm/i915/display/intel_dp.c
Original file line number Diff line number Diff line change
Expand Up @@ -3625,13 +3625,17 @@ static void intel_dp_handle_test_request(struct intel_dp *intel_dp)
}

static void
intel_dp_mst_hpd_irq(struct intel_dp *intel_dp, u8 *esi, bool *handled)
intel_dp_mst_hpd_irq(struct intel_dp *intel_dp, u8 *esi, u8 *ack)
{
drm_dp_mst_hpd_irq(&intel_dp->mst_mgr, esi, handled);
bool handled = false;

drm_dp_mst_hpd_irq(&intel_dp->mst_mgr, esi, &handled);
if (handled)
ack[1] |= esi[1] & (DP_DOWN_REP_MSG_RDY | DP_UP_REQ_MSG_RDY);

if (esi[1] & DP_CP_IRQ) {
intel_hdcp_handle_cp_irq(intel_dp->attached_connector);
*handled = true;
ack[1] |= DP_CP_IRQ;
}
}

Expand Down Expand Up @@ -3683,7 +3687,7 @@ intel_dp_check_mst_status(struct intel_dp *intel_dp)

for (;;) {
u8 esi[4] = {};
bool handled;
u8 ack[4] = {};

if (!intel_dp_get_sink_irq_esi(intel_dp, esi)) {
drm_dbg_kms(&i915->drm,
Expand All @@ -3699,15 +3703,15 @@ intel_dp_check_mst_status(struct intel_dp *intel_dp)
esi[3] & LINK_STATUS_CHANGED) {
if (!intel_dp_mst_link_status(intel_dp))
link_ok = false;
handled = true;
ack[3] |= LINK_STATUS_CHANGED;
}

intel_dp_mst_hpd_irq(intel_dp, esi, &handled);
intel_dp_mst_hpd_irq(intel_dp, esi, ack);

if (!handled)
if (!memchr_inv(ack, 0, sizeof(ack)))
break;

if (!intel_dp_ack_sink_irq_esi(intel_dp, esi))
if (!intel_dp_ack_sink_irq_esi(intel_dp, ack))
drm_dbg_kms(&i915->drm, "Failed to ack ESI\n");
}

Expand Down

0 comments on commit 784a2ec

Please sign in to comment.