]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
drm/amd/display: Fix DCE LVDS handling
authorAlex Deucher <alexander.deucher@amd.com>
Thu, 26 Feb 2026 22:12:08 +0000 (17:12 -0500)
committerAlex Deucher <alexander.deucher@amd.com>
Tue, 24 Mar 2026 17:55:47 +0000 (13:55 -0400)
LVDS does not use an HPD pin so it may be invalid.  Handle
this case correctly in link encoder creation.

Fixes: 7c8fb3b8e9ba ("drm/amd/display: Add hpd_source index check for DCE60/80/100/110/112/120 link encoders")
Closes: https://gitlab.freedesktop.org/drm/amd/-/issues/5012
Cc: Srinivasan Shanmugam <srinivasan.shanmugam@amd.com>
Cc: Roman Li <roman.li@amd.com>
Reviewed-by: Roman Li <roman.li@amd.com>
Reviewed-by: Srinivasan Shanmugam <srinivasan.shanmugam@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
(cherry picked from commit 3b5620f7ee688177fcf65cf61588c5435bce1872)
Cc: stable@vger.kernel.org
drivers/gpu/drm/amd/display/dc/resource/dce100/dce100_resource.c
drivers/gpu/drm/amd/display/dc/resource/dce110/dce110_resource.c
drivers/gpu/drm/amd/display/dc/resource/dce112/dce112_resource.c
drivers/gpu/drm/amd/display/dc/resource/dce120/dce120_resource.c
drivers/gpu/drm/amd/display/dc/resource/dce60/dce60_resource.c
drivers/gpu/drm/amd/display/dc/resource/dce80/dce80_resource.c

index 92c123aca0c90a1e824f5e4e152a5dff813dd53d..fdcf8db6be50d7d7cd8d56da58a3a3a9d4e023fa 100644 (file)
@@ -650,9 +650,6 @@ static struct link_encoder *dce100_link_encoder_create(
                return &enc110->base;
        }
 
-       if (enc_init_data->hpd_source >= ARRAY_SIZE(link_enc_hpd_regs))
-               return NULL;
-
        link_regs_id =
                map_transmitter_id_to_phy_instance(enc_init_data->transmitter);
 
@@ -661,7 +658,8 @@ static struct link_encoder *dce100_link_encoder_create(
                                      &link_enc_feature,
                                      &link_enc_regs[link_regs_id],
                                      &link_enc_aux_regs[enc_init_data->channel - 1],
-                                     &link_enc_hpd_regs[enc_init_data->hpd_source]);
+                                     enc_init_data->hpd_source >= ARRAY_SIZE(link_enc_hpd_regs) ?
+                                     NULL : &link_enc_hpd_regs[enc_init_data->hpd_source]);
        return &enc110->base;
 }
 
index 95852d277c226f28fa237c9e228e698ca3e961b2..ab71f645c90e3dbb52a9c4a51434f6bf4f6f2c4f 100644 (file)
@@ -671,7 +671,7 @@ static struct link_encoder *dce110_link_encoder_create(
                kzalloc_obj(struct dce110_link_encoder);
        int link_regs_id;
 
-       if (!enc110 || enc_init_data->hpd_source >= ARRAY_SIZE(link_enc_hpd_regs))
+       if (!enc110)
                return NULL;
 
        link_regs_id =
@@ -682,7 +682,8 @@ static struct link_encoder *dce110_link_encoder_create(
                                      &link_enc_feature,
                                      &link_enc_regs[link_regs_id],
                                      &link_enc_aux_regs[enc_init_data->channel - 1],
-                                     &link_enc_hpd_regs[enc_init_data->hpd_source]);
+                                     enc_init_data->hpd_source >= ARRAY_SIZE(link_enc_hpd_regs) ?
+                                     NULL : &link_enc_hpd_regs[enc_init_data->hpd_source]);
        return &enc110->base;
 }
 
index 58c6a00397cf17def877d5e43c18b5b788204ca1..b7051bfd432608e84e5415697e7be362ecb9e9f2 100644 (file)
@@ -632,7 +632,7 @@ static struct link_encoder *dce112_link_encoder_create(
                kzalloc_obj(struct dce110_link_encoder);
        int link_regs_id;
 
-       if (!enc110 || enc_init_data->hpd_source >= ARRAY_SIZE(link_enc_hpd_regs))
+       if (!enc110)
                return NULL;
 
        link_regs_id =
@@ -643,7 +643,8 @@ static struct link_encoder *dce112_link_encoder_create(
                                      &link_enc_feature,
                                      &link_enc_regs[link_regs_id],
                                      &link_enc_aux_regs[enc_init_data->channel - 1],
-                                     &link_enc_hpd_regs[enc_init_data->hpd_source]);
+                                     enc_init_data->hpd_source >= ARRAY_SIZE(link_enc_hpd_regs) ?
+                                     NULL : &link_enc_hpd_regs[enc_init_data->hpd_source]);
        return &enc110->base;
 }
 
index 71d76b021375db6a618141d6a852b43b61832f9c..7ee70f7b3aa7c6773ff757c112be04dea1f5947f 100644 (file)
@@ -716,7 +716,7 @@ static struct link_encoder *dce120_link_encoder_create(
                kzalloc_obj(struct dce110_link_encoder);
        int link_regs_id;
 
-       if (!enc110 || enc_init_data->hpd_source >= ARRAY_SIZE(link_enc_hpd_regs))
+       if (!enc110)
                return NULL;
 
        link_regs_id =
@@ -727,7 +727,8 @@ static struct link_encoder *dce120_link_encoder_create(
                                      &link_enc_feature,
                                      &link_enc_regs[link_regs_id],
                                      &link_enc_aux_regs[enc_init_data->channel - 1],
-                                     &link_enc_hpd_regs[enc_init_data->hpd_source]);
+                                     enc_init_data->hpd_source >= ARRAY_SIZE(link_enc_hpd_regs) ?
+                                     NULL : &link_enc_hpd_regs[enc_init_data->hpd_source]);
 
        return &enc110->base;
 }
index c27645708286aba3d8fd5278fc5600523dee4760..3d52973dd7f20dcc9d0ea947a18159d207ebe381 100644 (file)
@@ -746,18 +746,16 @@ static struct link_encoder *dce60_link_encoder_create(
                return &enc110->base;
        }
 
-       if (enc_init_data->hpd_source >= ARRAY_SIZE(link_enc_hpd_regs))
-               return NULL;
-
        link_regs_id =
                map_transmitter_id_to_phy_instance(enc_init_data->transmitter);
 
        dce60_link_encoder_construct(enc110,
-                                     enc_init_data,
-                                     &link_enc_feature,
-                                     &link_enc_regs[link_regs_id],
-                                     &link_enc_aux_regs[enc_init_data->channel - 1],
-                                     &link_enc_hpd_regs[enc_init_data->hpd_source]);
+                                    enc_init_data,
+                                    &link_enc_feature,
+                                    &link_enc_regs[link_regs_id],
+                                    &link_enc_aux_regs[enc_init_data->channel - 1],
+                                    enc_init_data->hpd_source >= ARRAY_SIZE(link_enc_hpd_regs) ?
+                                    NULL : &link_enc_hpd_regs[enc_init_data->hpd_source]);
        return &enc110->base;
 }
 
index d66d8ac6d897dcccf81339e9eb6c67dea0ca4d76..89927727a0d9e848cdcbef42d61e7446fe50daba 100644 (file)
@@ -752,9 +752,6 @@ static struct link_encoder *dce80_link_encoder_create(
                return &enc110->base;
        }
 
-       if (enc_init_data->hpd_source >= ARRAY_SIZE(link_enc_hpd_regs))
-               return NULL;
-
        link_regs_id =
                map_transmitter_id_to_phy_instance(enc_init_data->transmitter);
 
@@ -763,7 +760,8 @@ static struct link_encoder *dce80_link_encoder_create(
                                      &link_enc_feature,
                                      &link_enc_regs[link_regs_id],
                                      &link_enc_aux_regs[enc_init_data->channel - 1],
-                                     &link_enc_hpd_regs[enc_init_data->hpd_source]);
+                                     enc_init_data->hpd_source >= ARRAY_SIZE(link_enc_hpd_regs) ?
+                                     NULL : &link_enc_hpd_regs[enc_init_data->hpd_source]);
        return &enc110->base;
 }