Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

drm/i915/dp: Reprobe connector if getting/acking device IRQs fails

An AUX access failure during HPD IRQ handling should be handled by
falling back to a full connector detection, ensure that if the failure
happens while reading/acking a device service IRQ.

v2: Document intel_dp_check_device_service_irq()'s return value.
(Jani, Luca)

Cc: Jani Nikula <jani.nikula@intel.com>
Cc: Luca Coelho <luciano.coelho@intel.com>
Reviewed-by: Luca Coelho <luciano.coelho@intel.com>
Signed-off-by: Imre Deak <imre.deak@intel.com>
Link: https://patch.msgid.link/20260225164618.1261368-12-imre.deak@intel.com

Imre Deak 288b3c51 fbb003f8

+19 -6
+19 -6
drivers/gpu/drm/i915/display/intel_dp.c
··· 5785 5785 intel_encoder_link_check_queue_work(encoder, 0); 5786 5786 } 5787 5787 5788 - static void intel_dp_check_device_service_irq(struct intel_dp *intel_dp) 5788 + /* 5789 + * Return %true if a full connector reprobe is required due to a failure while 5790 + * reading or acking the device service IRQs. 5791 + */ 5792 + static bool intel_dp_check_device_service_irq(struct intel_dp *intel_dp) 5789 5793 { 5790 5794 struct intel_display *display = to_intel_display(intel_dp); 5791 5795 u8 val; 5792 5796 5793 5797 if (drm_dp_dpcd_readb(&intel_dp->aux, 5794 - DP_DEVICE_SERVICE_IRQ_VECTOR, &val) != 1 || !val) 5795 - return; 5798 + DP_DEVICE_SERVICE_IRQ_VECTOR, &val) != 1) 5799 + return true; 5796 5800 5797 - drm_dp_dpcd_writeb(&intel_dp->aux, DP_DEVICE_SERVICE_IRQ_VECTOR, val); 5801 + if (!val) 5802 + return false; 5803 + 5804 + if (drm_dp_dpcd_writeb(&intel_dp->aux, DP_DEVICE_SERVICE_IRQ_VECTOR, val) != 1) 5805 + return true; 5798 5806 5799 5807 if (val & DP_AUTOMATED_TEST_REQUEST) 5800 5808 intel_dp_test_request(intel_dp); ··· 5812 5804 5813 5805 if (val & DP_SINK_SPECIFIC_IRQ) 5814 5806 drm_dbg_kms(display->drm, "Sink specific irq unhandled\n"); 5807 + 5808 + return false; 5815 5809 } 5816 5810 5817 5811 static bool intel_dp_check_link_service_irq(struct intel_dp *intel_dp) ··· 5878 5868 /* No need to proceed if we are going to do full detect */ 5879 5869 return false; 5880 5870 5881 - intel_dp_check_device_service_irq(intel_dp); 5882 - reprobe_needed = intel_dp_check_link_service_irq(intel_dp); 5871 + if (intel_dp_check_device_service_irq(intel_dp)) 5872 + reprobe_needed = true; 5873 + 5874 + if (intel_dp_check_link_service_irq(intel_dp)) 5875 + reprobe_needed = true; 5883 5876 5884 5877 /* Handle CEC interrupts, if any */ 5885 5878 drm_dp_cec_irq(&intel_dp->aux);