OSDN Git Service

drm/amdgpu: fix SI UVD firmware validate resume fail
authorSonny Jiang <sonny.jiang@amd.com>
Fri, 6 Nov 2020 21:42:47 +0000 (16:42 -0500)
committerAlex Deucher <alexander.deucher@amd.com>
Tue, 24 Nov 2020 17:02:38 +0000 (12:02 -0500)
The SI UVD firmware validate key is stored at the end of firmware,
which is changed during resume while playing video. So get the key
at sw_init and store it for fw validate using.

Signed-off-by: Sonny Jiang <sonny.jiang@amd.com>
Reviewed-by: Leo Liu <leo.liu@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.h
drivers/gpu/drm/amd/amdgpu/uvd_v3_1.c

index 5eb6328..edbb819 100644 (file)
@@ -67,6 +67,7 @@ struct amdgpu_uvd {
        unsigned                harvest_config;
        /* store image width to adjust nb memory state */
        unsigned                decode_image_width;
+       uint32_t                keyselect;
 };
 
 int amdgpu_uvd_sw_init(struct amdgpu_device *adev);
index 7cf4b11..3a5dce6 100644 (file)
@@ -277,15 +277,8 @@ static void uvd_v3_1_mc_resume(struct amdgpu_device *adev)
  */
 static int uvd_v3_1_fw_validate(struct amdgpu_device *adev)
 {
-       void *ptr;
-       uint32_t ucode_len, i;
-       uint32_t keysel;
-
-       ptr = adev->uvd.inst[0].cpu_addr;
-       ptr += 192 + 16;
-       memcpy(&ucode_len, ptr, 4);
-       ptr += ucode_len;
-       memcpy(&keysel, ptr, 4);
+       int i;
+       uint32_t keysel = adev->uvd.keyselect;
 
        WREG32(mmUVD_FW_START, keysel);
 
@@ -550,6 +543,8 @@ static int uvd_v3_1_sw_init(void *handle)
        struct amdgpu_ring *ring;
        struct amdgpu_device *adev = (struct amdgpu_device *)handle;
        int r;
+       void *ptr;
+       uint32_t ucode_len;
 
        /* UVD TRAP */
        r = amdgpu_irq_add_id(adev, AMDGPU_IRQ_CLIENTID_LEGACY, 124, &adev->uvd.inst->irq);
@@ -560,6 +555,13 @@ static int uvd_v3_1_sw_init(void *handle)
        if (r)
                return r;
 
+       /* Retrieval firmware validate key */
+       ptr = adev->uvd.inst[0].cpu_addr;
+       ptr += 192 + 16;
+       memcpy(&ucode_len, ptr, 4);
+       ptr += ucode_len;
+       memcpy(&adev->uvd.keyselect, ptr, 4);
+
        ring = &adev->uvd.inst->ring;
        sprintf(ring->name, "uvd");
        r = amdgpu_ring_init(adev, ring, 512, &adev->uvd.inst->irq, 0,