]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
drm/amdgpu: Improve IP discovery checksum failure logging
authorPerry Yuan <perry.yuan@amd.com>
Tue, 13 Jan 2026 07:04:04 +0000 (15:04 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Tue, 20 Jan 2026 22:17:23 +0000 (17:17 -0500)
Enhance the error logging in amdgpu_discovery_verify_checksum() to
print the calculated checksum, the expected checksum, the data size.

This extra context helps quickly identify if the issue is a data
corruption, a partially read binary, or an invalid table header without
requiring additional instrumentation.

Signed-off-by: Perry Yuan <perry.yuan@amd.com>
Reviewed-by: Yifan Zhang <yifan1.zhang@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c

index ee2c08f81051203fff760ae05a909aa5e3bc129e..41e63c28691252f9160b5e8f40cabf1e15b5312c 100644 (file)
@@ -380,10 +380,21 @@ static uint16_t amdgpu_discovery_calculate_checksum(uint8_t *data, uint32_t size
        return checksum;
 }
 
-static inline bool amdgpu_discovery_verify_checksum(uint8_t *data, uint32_t size,
+static inline bool amdgpu_discovery_verify_checksum(struct amdgpu_device *adev,
+                                                       uint8_t *data, uint32_t size,
                                                    uint16_t expected)
 {
-       return !!(amdgpu_discovery_calculate_checksum(data, size) == expected);
+       uint16_t calculated;
+
+       calculated = amdgpu_discovery_calculate_checksum(data, size);
+
+       if (calculated != expected) {
+               dev_err(adev->dev, "Discovery checksum failed: calc 0x%04x != exp 0x%04x, size %u.\n",
+                               calculated, expected, size);
+               return false;
+       }
+
+       return true;
 }
 
 static inline bool amdgpu_discovery_verify_binary_signature(uint8_t *binary)
@@ -439,7 +450,7 @@ static int amdgpu_discovery_verify_npsinfo(struct amdgpu_device *adev,
                return -EINVAL;
        }
 
-       if (!amdgpu_discovery_verify_checksum(discovery_bin + offset,
+       if (!amdgpu_discovery_verify_checksum(adev, discovery_bin + offset,
                                              le32_to_cpu(nhdr->size_bytes),
                                              checksum)) {
                dev_dbg(adev->dev, "invalid nps info data table checksum\n");
@@ -529,7 +540,7 @@ static int amdgpu_discovery_init(struct amdgpu_device *adev)
        size = le16_to_cpu(bhdr->binary_size) - offset;
        checksum = le16_to_cpu(bhdr->binary_checksum);
 
-       if (!amdgpu_discovery_verify_checksum(discovery_bin + offset, size,
+       if (!amdgpu_discovery_verify_checksum(adev, discovery_bin + offset, size,
                                              checksum)) {
                dev_err(adev->dev, "invalid ip discovery binary checksum\n");
                r = -EINVAL;
@@ -549,7 +560,7 @@ static int amdgpu_discovery_init(struct amdgpu_device *adev)
                        goto out;
                }
 
-               if (!amdgpu_discovery_verify_checksum(discovery_bin + offset,
+               if (!amdgpu_discovery_verify_checksum(adev, discovery_bin + offset,
                                                      le16_to_cpu(ihdr->size),
                                                      checksum)) {
                        dev_err(adev->dev, "invalid ip discovery data table checksum\n");
@@ -572,7 +583,7 @@ static int amdgpu_discovery_init(struct amdgpu_device *adev)
                        goto out;
                }
 
-               if (!amdgpu_discovery_verify_checksum(discovery_bin + offset,
+               if (!amdgpu_discovery_verify_checksum(adev, discovery_bin + offset,
                                                      le32_to_cpu(ghdr->size),
                                                      checksum)) {
                        dev_err(adev->dev, "invalid gc data table checksum\n");
@@ -595,7 +606,7 @@ static int amdgpu_discovery_init(struct amdgpu_device *adev)
                        goto out;
                }
 
-               if (!amdgpu_discovery_verify_checksum(
+               if (!amdgpu_discovery_verify_checksum(adev,
                            discovery_bin + offset,
                            sizeof(struct harvest_table), checksum)) {
                        dev_err(adev->dev, "invalid harvest data table checksum\n");
@@ -618,7 +629,7 @@ static int amdgpu_discovery_init(struct amdgpu_device *adev)
                        goto out;
                }
 
-               if (!amdgpu_discovery_verify_checksum(
+               if (!amdgpu_discovery_verify_checksum(adev,
                            discovery_bin + offset,
                            le32_to_cpu(vhdr->size_bytes), checksum)) {
                        dev_err(adev->dev, "invalid vcn data table checksum\n");
@@ -641,7 +652,7 @@ static int amdgpu_discovery_init(struct amdgpu_device *adev)
                        goto out;
                }
 
-               if (!amdgpu_discovery_verify_checksum(
+               if (!amdgpu_discovery_verify_checksum(adev,
                            discovery_bin + offset,
                            le32_to_cpu(mhdr->size_bytes), checksum)) {
                        dev_err(adev->dev, "invalid mall data table checksum\n");
@@ -1867,7 +1878,7 @@ static int amdgpu_discovery_refresh_nps_info(struct amdgpu_device *adev,
                                  sizeof(*nps_data), false);
 
        nhdr = (struct nps_info_header *)(nps_data);
-       if (!amdgpu_discovery_verify_checksum((uint8_t *)nps_data,
+       if (!amdgpu_discovery_verify_checksum(adev, (uint8_t *)nps_data,
                                              le32_to_cpu(nhdr->size_bytes),
                                              checksum)) {
                dev_err(adev->dev, "nps data refresh, checksum mismatch\n");