]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
drm/i915/edp: Check supported link rates DPCD read
authorNikita Zhandarovich <n.zhandarovich@fintech.ru>
Fri, 29 May 2026 14:57:58 +0000 (17:57 +0300)
committerTvrtko Ursulin <tursulin@ursulin.net>
Tue, 9 Jun 2026 06:55:19 +0000 (07:55 +0100)
intel_edp_set_sink_rates() reads DP_SUPPORTED_LINK_RATES into a local
stack array and then parses the array unconditionally. If the read
fails, the array contents are not valid and may result in bogus sink
link rates being used.

Use drm_dp_dpcd_read_data() and clear the sink rate array on failure,
so the existing parser falls back to the default sink rate handling.

Found by Linux Verification Center (linuxtesting.org) with static
analysis tool SVACE.

Fixes: 68f357cb7347 ("drm/i915/dp: generate and cache sink rate array for all DP, not just eDP 1.4")
Signed-off-by: Nikita Zhandarovich <n.zhandarovich@fintech.ru>
Reviewed-by: Jani Nikula <jani.nikula@intel.com>
Link: https://patch.msgid.link/20260529145759.1640646-1-n.zhandarovich@fintech.ru
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
(cherry picked from commit bd61c7756b34157e093028225a69383b4b1203cc)
Signed-off-by: Tvrtko Ursulin <tursulin@ursulin.net>
drivers/gpu/drm/i915/display/intel_dp.c

index 6ef2a0043cdafa3c0767506fb94c5d7b3ce55ced..5c3e816b01352d122805c0eec0b59fa503f4a338 100644 (file)
@@ -4678,10 +4678,17 @@ intel_edp_set_sink_rates(struct intel_dp *intel_dp)
 
        if (intel_dp->edp_dpcd[0] >= DP_EDP_14) {
                __le16 sink_rates[DP_MAX_SUPPORTED_RATES];
+               int ret;
                int i;
 
-               drm_dp_dpcd_read(&intel_dp->aux, DP_SUPPORTED_LINK_RATES,
-                                sink_rates, sizeof(sink_rates));
+               ret = drm_dp_dpcd_read_data(&intel_dp->aux,
+                                           DP_SUPPORTED_LINK_RATES,
+                                           sink_rates, sizeof(sink_rates));
+               if (ret < 0) {
+                       drm_dbg_kms(display->drm,
+                                   "Unable to read eDP supported link rates, using default rates\n");
+                       memset(sink_rates, 0, sizeof(sink_rates));
+               }
 
                for (i = 0; i < ARRAY_SIZE(sink_rates); i++) {
                        int rate;