OSDN Git Service

drm/amdgpu: read and authenticate ip discovery binary
authorHawking Zhang <Hawking.Zhang@amd.com>
Mon, 22 Nov 2021 13:32:48 +0000 (21:32 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Mon, 13 Dec 2021 21:33:16 +0000 (16:33 -0500)
read and authenticate ip discovery binary getting from
vram first, if it is not valid, read and authenticate
the one getting from file

Signed-off-by: Hawking Zhang <Hawking.Zhang@amd.com>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c

index 2ff502a..65e1f6c 100644 (file)
@@ -249,7 +249,6 @@ static int amdgpu_discovery_init(struct amdgpu_device *adev)
        struct binary_header *bhdr;
        struct ip_discovery_header *ihdr;
        struct gpu_info_header *ghdr;
-       const struct firmware *fw;
        uint16_t offset;
        uint16_t size;
        uint16_t checksum;
@@ -260,31 +259,32 @@ static int amdgpu_discovery_init(struct amdgpu_device *adev)
        if (!adev->mman.discovery_bin)
                return -ENOMEM;
 
-       if (amdgpu_discovery == 2) {
-               r = request_firmware(&fw, "amdgpu/ip_discovery.bin", adev->dev);
-               if (r)
-                       goto get_from_vram;
-               dev_info(adev->dev, "Using IP discovery from file\n");
-               memcpy((u8 *)adev->mman.discovery_bin, (u8 *)fw->data,
-                      adev->mman.discovery_tmr_size);
-               release_firmware(fw);
-       } else {
-get_from_vram:
-               r = amdgpu_discovery_read_binary_from_vram(adev, adev->mman.discovery_bin);
+       r = amdgpu_discovery_read_binary_from_vram(adev, adev->mman.discovery_bin);
+       if (r) {
+               dev_err(adev->dev, "failed to read ip discovery binary from vram\n");
+               r = -EINVAL;
+               goto out;
+       }
+
+       if(!amdgpu_discovery_verify_binary_signature(adev->mman.discovery_bin)) {
+               dev_warn(adev->dev, "get invalid ip discovery binary signature from vram\n");
+               /* retry read ip discovery binary from file */
+               r = amdgpu_discovery_read_binary_from_file(adev, adev->mman.discovery_bin);
                if (r) {
-                       DRM_ERROR("failed to read ip discovery binary\n");
+                       dev_err(adev->dev, "failed to read ip discovery binary from file\n");
+                       r = -EINVAL;
+                       goto out;
+               }
+               /* check the ip discovery binary signature */
+               if(!amdgpu_discovery_verify_binary_signature(adev->mman.discovery_bin)) {
+                       dev_warn(adev->dev, "get invalid ip discovery binary signature from file\n");
+                       r = -EINVAL;
                        goto out;
                }
        }
 
        bhdr = (struct binary_header *)adev->mman.discovery_bin;
 
-       if (le32_to_cpu(bhdr->binary_signature) != BINARY_SIGNATURE) {
-               DRM_ERROR("invalid ip discovery binary signature\n");
-               r = -EINVAL;
-               goto out;
-       }
-
        offset = offsetof(struct binary_header, binary_checksum) +
                sizeof(bhdr->binary_checksum);
        size = le16_to_cpu(bhdr->binary_size) - offset;
@@ -292,7 +292,7 @@ get_from_vram:
 
        if (!amdgpu_discovery_verify_checksum(adev->mman.discovery_bin + offset,
                                              size, checksum)) {
-               DRM_ERROR("invalid ip discovery binary checksum\n");
+               dev_err(adev->dev, "invalid ip discovery binary checksum\n");
                r = -EINVAL;
                goto out;
        }
@@ -303,14 +303,14 @@ get_from_vram:
        ihdr = (struct ip_discovery_header *)(adev->mman.discovery_bin + offset);
 
        if (le32_to_cpu(ihdr->signature) != DISCOVERY_TABLE_SIGNATURE) {
-               DRM_ERROR("invalid ip discovery data table signature\n");
+               dev_err(adev->dev, "invalid ip discovery data table signature\n");
                r = -EINVAL;
                goto out;
        }
 
        if (!amdgpu_discovery_verify_checksum(adev->mman.discovery_bin + offset,
                                              le16_to_cpu(ihdr->size), checksum)) {
-               DRM_ERROR("invalid ip discovery data table checksum\n");
+               dev_err(adev->dev, "invalid ip discovery data table checksum\n");
                r = -EINVAL;
                goto out;
        }
@@ -322,7 +322,7 @@ get_from_vram:
 
        if (!amdgpu_discovery_verify_checksum(adev->mman.discovery_bin + offset,
                                              le32_to_cpu(ghdr->size), checksum)) {
-               DRM_ERROR("invalid gc data table checksum\n");
+               dev_err(adev->dev, "invalid gc data table checksum\n");
                r = -EINVAL;
                goto out;
        }