drm/i915/edp: Check supported link rates DPCD read

JIRA: https://issues.redhat.com/browse/RHEL-180329

commit 914b780ecf31aa85daa1aabfbfb9bf5a9e308d5f
Author: Nikita Zhandarovich <n.zhandarovich@fintech.ru>
Date:   Fri May 29 17:57:58 2026 +0300

    drm/i915/edp: Check supported link rates DPCD read

    [ Upstream commit 2673cefa99ca918e7ac5b0388ff578a83656c896 ]

    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: 68f357cb73 ("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>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

Signed-off-by: Anusha Srivatsa <asrivats@redhat.com>
This commit is contained in:
Anusha Srivatsa
2026-08-03 14:53:55 -05:00
parent ab2afcb969
commit 254924bd55
+9 -2
View File
@@ -4533,10 +4533,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;