From: Frank Min <[email protected]>

Update table info retrieval from discovery binary to align with
discovery table update.

Signed-off-by: Frank Min <[email protected]>
Signed-off-by: Alex Deucher <[email protected]>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c | 47 +++++++++++++------
 1 file changed, 33 insertions(+), 14 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c
index 79a2b1268b23a..351a1e61f525e 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c
@@ -604,18 +604,36 @@ amdgpu_discovery_get_table_info_from_bin(uint8_t 
*discovery_bin,
                                         uint16_t table_id)
 {
        struct binary_header *bhdr = (struct binary_header *)discovery_bin;
-       struct binary_header_v2 *bhdrv2;
-
-       switch (bhdr->version_major) {
-       case 2:
-               bhdrv2 = (struct binary_header_v2 *)discovery_bin;
-               return &bhdrv2->table_list[table_id];
-       case 1:
+       struct binary_header_v2 *bhdrv2 = (struct binary_header_v2 
*)discovery_bin;
+       uint16_t version = le16_to_cpu(bhdr->version_major);
+       uint16_t binary_size = le16_to_cpu(bhdr->binary_size);
+       struct table_info *table_list;
+       uint16_t num_tables, i;
+       size_t table_offset;
+
+       switch (version) {
        case 0:
-               return &bhdr->table_list[table_id];
+       case 1:
+               table_list = bhdr->table_list;
+               num_tables = ARRAY_SIZE(bhdr->table_list);
+               break;
+       case 2:
+               table_list = bhdrv2->table_list;
+               num_tables = le16_to_cpu(bhdrv2->num_tables);
+               break;
        default:
                return NULL;
        }
+
+       table_offset = (uint8_t *)table_list - discovery_bin;
+       if (table_offset + num_tables * sizeof(*table_list) > binary_size)
+               return NULL;
+
+       for (i = 0; i < num_tables; i++)
+               if (le16_to_cpu(table_list[i].table_id) == table_id)
+                       return &table_list[i];
+
+       return NULL;
 }
 
 static int amdgpu_discovery_get_table_info(struct amdgpu_device *adev,
@@ -628,8 +646,8 @@ static int amdgpu_discovery_get_table_info(struct 
amdgpu_device *adev,
        *info = amdgpu_discovery_get_table_info_from_bin(adev->discovery.bin,
                                                         table_id);
        if (!*info) {
-               dev_err(adev->dev, "Invalid ip discovery table version %d\n",
-                       bhdr->version_major);
+               dev_err(adev->dev, "Not found table for header version %d table 
id %d\n",
+                       bhdr->version_major, table_id);
                return -EINVAL;
        }
 
@@ -640,15 +658,16 @@ static int amdgpu_discovery_table_check(struct 
amdgpu_device *adev,
                                        uint8_t *discovery_bin,
                                        uint16_t table_id)
 {
-       int r, act_val, exp_val, table_size;
+       int act_val, exp_val, table_size;
        uint16_t offset, checksum;
        struct table_info *info;
        bool check_table = true;
        char *table_name;
 
-       r = amdgpu_discovery_get_table_info(adev, &info, table_id);
-       if (r)
-               return r;
+       info = amdgpu_discovery_get_table_info_from_bin(discovery_bin, 
table_id);
+       if (!info)
+               return 0;
+
        offset = le16_to_cpu(info->offset);
        checksum = le16_to_cpu(info->checksum);
 
-- 
2.56.0

Reply via email to