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 <[email protected]>
Cc: Roman Li <[email protected]>
Signed-off-by: Alex Deucher <[email protected]>
---
 .../display/dc/resource/dce100/dce100_resource.c   |  6 ++----
 .../display/dc/resource/dce110/dce110_resource.c   |  5 +++--
 .../display/dc/resource/dce112/dce112_resource.c   |  5 +++--
 .../display/dc/resource/dce120/dce120_resource.c   |  5 +++--
 .../amd/display/dc/resource/dce60/dce60_resource.c | 14 ++++++--------
 .../amd/display/dc/resource/dce80/dce80_resource.c |  6 ++----
 6 files changed, 19 insertions(+), 22 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/dc/resource/dce100/dce100_resource.c 
b/drivers/gpu/drm/amd/display/dc/resource/dce100/dce100_resource.c
index 05f7ff60f8f5a..2b884e28727ba 100644
--- a/drivers/gpu/drm/amd/display/dc/resource/dce100/dce100_resource.c
+++ b/drivers/gpu/drm/amd/display/dc/resource/dce100/dce100_resource.c
@@ -651,9 +651,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);
 
@@ -662,7 +659,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;
 }
 
diff --git a/drivers/gpu/drm/amd/display/dc/resource/dce110/dce110_resource.c 
b/drivers/gpu/drm/amd/display/dc/resource/dce110/dce110_resource.c
index 7c09825cd9bd3..d957598911cbc 100644
--- a/drivers/gpu/drm/amd/display/dc/resource/dce110/dce110_resource.c
+++ b/drivers/gpu/drm/amd/display/dc/resource/dce110/dce110_resource.c
@@ -672,7 +672,7 @@ static struct link_encoder *dce110_link_encoder_create(
                kzalloc(sizeof(struct dce110_link_encoder), GFP_KERNEL);
        int link_regs_id;
 
-       if (!enc110 || enc_init_data->hpd_source >= 
ARRAY_SIZE(link_enc_hpd_regs))
+       if (!enc110)
                return NULL;
 
        link_regs_id =
@@ -683,7 +683,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;
 }
 
diff --git a/drivers/gpu/drm/amd/display/dc/resource/dce112/dce112_resource.c 
b/drivers/gpu/drm/amd/display/dc/resource/dce112/dce112_resource.c
index 3f0a6bc4dcc23..1cce903d477aa 100644
--- a/drivers/gpu/drm/amd/display/dc/resource/dce112/dce112_resource.c
+++ b/drivers/gpu/drm/amd/display/dc/resource/dce112/dce112_resource.c
@@ -633,7 +633,7 @@ static struct link_encoder *dce112_link_encoder_create(
                kzalloc(sizeof(struct dce110_link_encoder), GFP_KERNEL);
        int link_regs_id;
 
-       if (!enc110 || enc_init_data->hpd_source >= 
ARRAY_SIZE(link_enc_hpd_regs))
+       if (!enc110)
                return NULL;
 
        link_regs_id =
@@ -644,7 +644,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;
 }
 
diff --git a/drivers/gpu/drm/amd/display/dc/resource/dce120/dce120_resource.c 
b/drivers/gpu/drm/amd/display/dc/resource/dce120/dce120_resource.c
index 92890784caa6e..8b568be20a77b 100644
--- a/drivers/gpu/drm/amd/display/dc/resource/dce120/dce120_resource.c
+++ b/drivers/gpu/drm/amd/display/dc/resource/dce120/dce120_resource.c
@@ -717,7 +717,7 @@ static struct link_encoder *dce120_link_encoder_create(
                kzalloc(sizeof(struct dce110_link_encoder), GFP_KERNEL);
        int link_regs_id;
 
-       if (!enc110 || enc_init_data->hpd_source >= 
ARRAY_SIZE(link_enc_hpd_regs))
+       if (!enc110)
                return NULL;
 
        link_regs_id =
@@ -728,7 +728,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;
 }
diff --git a/drivers/gpu/drm/amd/display/dc/resource/dce60/dce60_resource.c 
b/drivers/gpu/drm/amd/display/dc/resource/dce60/dce60_resource.c
index d41d24b76c11f..2f5ee9d8536af 100644
--- a/drivers/gpu/drm/amd/display/dc/resource/dce60/dce60_resource.c
+++ b/drivers/gpu/drm/amd/display/dc/resource/dce60/dce60_resource.c
@@ -747,18 +747,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;
 }
 
diff --git a/drivers/gpu/drm/amd/display/dc/resource/dce80/dce80_resource.c 
b/drivers/gpu/drm/amd/display/dc/resource/dce80/dce80_resource.c
index a68e799d58854..406705fac7d64 100644
--- a/drivers/gpu/drm/amd/display/dc/resource/dce80/dce80_resource.c
+++ b/drivers/gpu/drm/amd/display/dc/resource/dce80/dce80_resource.c
@@ -753,9 +753,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);
 
@@ -764,7 +761,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;
 }
 
-- 
2.53.0

Reply via email to