From: Ray Wu <[email protected]>

[Why]
VSDB parsing loop only searched within the first extension block.
If the VSDB was located in a subsequent extension block,
it would not be found.

[How]
Calculate the total length of all extension blocks (EDID_LENGTH *
edid->extensions) and use that as the loop boundary, allowing the
parser to search through all available extension blocks.

Reviewed-by: Tom Chung <[email protected]>
Signed-off-by: Ray Wu <[email protected]>
Signed-off-by: Tom Chung <[email protected]>
---
 drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c 
b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
index b9e8ea4396b5..7af538adac46 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
@@ -13135,6 +13135,7 @@ static int parse_amd_vsdb(struct amdgpu_dm_connector 
*aconnector,
        u8 *edid_ext = NULL;
        int i;
        int j = 0;
+       int total_ext_block_len;
 
        if (edid == NULL || edid->extensions == 0)
                return -ENODEV;
@@ -13146,7 +13147,8 @@ static int parse_amd_vsdb(struct amdgpu_dm_connector 
*aconnector,
                        break;
        }
 
-       while (j < EDID_LENGTH - sizeof(struct amd_vsdb_block)) {
+       total_ext_block_len = EDID_LENGTH * edid->extensions;
+       while (j < total_ext_block_len - sizeof(struct amd_vsdb_block)) {
                struct amd_vsdb_block *amd_vsdb = (struct amd_vsdb_block 
*)&edid_ext[j];
                unsigned int ieeeId = (amd_vsdb->ieee_id[2] << 16) | 
(amd_vsdb->ieee_id[1] << 8) | (amd_vsdb->ieee_id[0]);
 
-- 
2.43.0

Reply via email to