Commit 4d6a9536 authored by Sonny Jiang's avatar Sonny Jiang Committed by Alex Deucher

drm/amdgpu: fix SI UVD firmware validate resume fail

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: default avatarSonny Jiang <sonny.jiang@amd.com>
Reviewed-by: default avatarLeo Liu <leo.liu@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
Cc: stable@vger.kernel.org
parent 7acc79eb
...@@ -67,6 +67,7 @@ struct amdgpu_uvd { ...@@ -67,6 +67,7 @@ struct amdgpu_uvd {
unsigned harvest_config; unsigned harvest_config;
/* store image width to adjust nb memory state */ /* store image width to adjust nb memory state */
unsigned decode_image_width; unsigned decode_image_width;
uint32_t keyselect;
}; };
int amdgpu_uvd_sw_init(struct amdgpu_device *adev); int amdgpu_uvd_sw_init(struct amdgpu_device *adev);
......
...@@ -277,15 +277,8 @@ static void uvd_v3_1_mc_resume(struct amdgpu_device *adev) ...@@ -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) static int uvd_v3_1_fw_validate(struct amdgpu_device *adev)
{ {
void *ptr; int i;
uint32_t ucode_len, i; uint32_t keysel = adev->uvd.keyselect;
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);
WREG32(mmUVD_FW_START, keysel); WREG32(mmUVD_FW_START, keysel);
...@@ -550,6 +543,8 @@ static int uvd_v3_1_sw_init(void *handle) ...@@ -550,6 +543,8 @@ static int uvd_v3_1_sw_init(void *handle)
struct amdgpu_ring *ring; struct amdgpu_ring *ring;
struct amdgpu_device *adev = (struct amdgpu_device *)handle; struct amdgpu_device *adev = (struct amdgpu_device *)handle;
int r; int r;
void *ptr;
uint32_t ucode_len;
/* UVD TRAP */ /* UVD TRAP */
r = amdgpu_irq_add_id(adev, AMDGPU_IRQ_CLIENTID_LEGACY, 124, &adev->uvd.inst->irq); 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) ...@@ -560,6 +555,13 @@ static int uvd_v3_1_sw_init(void *handle)
if (r) if (r)
return 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; ring = &adev->uvd.inst->ring;
sprintf(ring->name, "uvd"); sprintf(ring->name, "uvd");
r = amdgpu_ring_init(adev, ring, 512, &adev->uvd.inst->irq, 0, r = amdgpu_ring_init(adev, ring, 512, &adev->uvd.inst->irq, 0,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment