[AMD Official Use Only]

Please ignore this one (patch #4). Will send out a new one based on latest code.

Regards,
Hawking

-----Original Message-----
From: Zhang, Hawking <hawking.zh...@amd.com> 
Sent: Saturday, December 4, 2021 18:21
To: amd-gfx@lists.freedesktop.org
Cc: Zhang, Hawking <hawking.zh...@amd.com>
Subject: [PATCH 4/4] drm/amdgpu: read and authenticate ip discovery binary

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.zh...@amd.com>
Reviewed-by: Alex Deucher <alexander.deuc...@amd.com>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c | 44 +++++++++----------
 1 file changed, 20 insertions(+), 24 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c
index f507cd70ab86..45f38ae6e53c 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c
@@ -247,7 +247,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;
@@ -258,31 +257,28 @@ 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");
+               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");
+                       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");
                        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 = bhdr->binary_size - offset;
@@ -290,7 +286,7 @@ static int amdgpu_discovery_init(struct amdgpu_device *adev)
 
        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;
        }
@@ -301,14 +297,14 @@ static int amdgpu_discovery_init(struct amdgpu_device 
*adev)
        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,
                                              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;
        }
@@ -320,7 +316,7 @@ static int amdgpu_discovery_init(struct amdgpu_device *adev)
 
        if (!amdgpu_discovery_verify_checksum(adev->mman.discovery_bin + offset,
                                              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;
        }
--
2.17.1

Reply via email to