diff options
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3261-drm-amdgpu-add-PSP-KDB-loading-support-for-Arcturus.patch')
-rw-r--r-- | meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3261-drm-amdgpu-add-PSP-KDB-loading-support-for-Arcturus.patch | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3261-drm-amdgpu-add-PSP-KDB-loading-support-for-Arcturus.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3261-drm-amdgpu-add-PSP-KDB-loading-support-for-Arcturus.patch new file mode 100644 index 00000000..227c8816 --- /dev/null +++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3261-drm-amdgpu-add-PSP-KDB-loading-support-for-Arcturus.patch @@ -0,0 +1,98 @@ +From 07530f9e865478bef78a04343d62b18d9732608a Mon Sep 17 00:00:00 2001 +From: John Clements <John.Clements@amd.com> +Date: Mon, 22 Jul 2019 18:06:58 +0800 +Subject: [PATCH 3261/4256] drm/amdgpu: add PSP KDB loading support for + Arcturus + +Add support for the arcturus specific psp metadata to the +amdgpu firmware and properly parse it when loading it. + +Change-Id: I3dc6cfc869db9e6f4e25c8918332edb8d80d4f83 +Signed-off-by: John Clements <John.Clements@amd.com> +Reviewed-by: Hawking Zhang <Hawking.Zhang@amd.com> +Signed-off-by: Alex Deucher <alexander.deucher@amd.com> +--- + drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.c | 10 ++++++++++ + drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.h | 9 +++++++++ + drivers/gpu/drm/amd/amdgpu/psp_v11_0.c | 10 ++++++++++ + 3 files changed, 29 insertions(+) + +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.c +index 1ec696858d78..21fe00eef30e 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.c +@@ -269,6 +269,16 @@ void amdgpu_ucode_print_psp_hdr(const struct common_firmware_header *hdr) + DRM_DEBUG("kdb_size_bytes: %u\n", + le32_to_cpu(psp_hdr_v1_1->kdb_size_bytes)); + } ++ if (version_minor == 2) { ++ const struct psp_firmware_header_v1_2 *psp_hdr_v1_2 = ++ container_of(psp_hdr, struct psp_firmware_header_v1_2, v1_0); ++ DRM_DEBUG("kdb_header_version: %u\n", ++ le32_to_cpu(psp_hdr_v1_2->kdb_header_version)); ++ DRM_DEBUG("kdb_offset_bytes: %u\n", ++ le32_to_cpu(psp_hdr_v1_2->kdb_offset_bytes)); ++ DRM_DEBUG("kdb_size_bytes: %u\n", ++ le32_to_cpu(psp_hdr_v1_2->kdb_size_bytes)); ++ } + } else { + DRM_ERROR("Unknown PSP ucode version: %u.%u\n", + version_major, version_minor); +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.h +index 2be106e81eda..4f1b167a9394 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.h ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.h +@@ -90,6 +90,15 @@ struct psp_firmware_header_v1_1 { + uint32_t kdb_size_bytes; + }; + ++/* version_major=1, version_minor=2 */ ++struct psp_firmware_header_v1_2 { ++ struct psp_firmware_header_v1_0 v1_0; ++ uint32_t reserve[3]; ++ uint32_t kdb_header_version; ++ uint32_t kdb_offset_bytes; ++ uint32_t kdb_size_bytes; ++}; ++ + /* version_major=1, version_minor=0 */ + struct ta_firmware_header_v1_0 { + struct common_firmware_header header; +diff --git a/drivers/gpu/drm/amd/amdgpu/psp_v11_0.c b/drivers/gpu/drm/amd/amdgpu/psp_v11_0.c +index 6e50c7bcf06d..246cb9b75c05 100644 +--- a/drivers/gpu/drm/amd/amdgpu/psp_v11_0.c ++++ b/drivers/gpu/drm/amd/amdgpu/psp_v11_0.c +@@ -65,6 +65,7 @@ static int psp_v11_0_init_microcode(struct psp_context *psp) + int err = 0; + const struct psp_firmware_header_v1_0 *sos_hdr; + const struct psp_firmware_header_v1_1 *sos_hdr_v1_1; ++ const struct psp_firmware_header_v1_2 *sos_hdr_v1_2; + const struct psp_firmware_header_v1_0 *asd_hdr; + const struct ta_firmware_header_v1_0 *ta_hdr; + uint32_t bl_version; +@@ -81,6 +82,9 @@ static int psp_v11_0_init_microcode(struct psp_context *psp) + case CHIP_NAVI14: + chip_name = "navi14"; + break; ++ case CHIP_ARCTURUS: ++ chip_name = "arcturus"; ++ break; + default: + BUG(); + } +@@ -122,6 +126,12 @@ static int psp_v11_0_init_microcode(struct psp_context *psp) + adev->psp.kdb_start_addr = (uint8_t *)adev->psp.sys_start_addr + + le32_to_cpu(sos_hdr_v1_1->kdb_offset_bytes); + } ++ if (sos_hdr->header.header_version_minor == 2) { ++ sos_hdr_v1_2 = (const struct psp_firmware_header_v1_2 *)adev->psp.sos_fw->data; ++ adev->psp.kdb_bin_size = le32_to_cpu(sos_hdr_v1_2->kdb_size_bytes); ++ adev->psp.kdb_start_addr = (uint8_t *)adev->psp.sys_start_addr + ++ le32_to_cpu(sos_hdr_v1_2->kdb_offset_bytes); ++ } + break; + default: + dev_err(adev->dev, +-- +2.17.1 + |