diff options
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.14.71/5535-drm-amdgpu-Split-amdgpu_ucode_init-fini_bo-into-two-.patch')
-rw-r--r-- | common/recipes-kernel/linux/linux-yocto-4.14.71/5535-drm-amdgpu-Split-amdgpu_ucode_init-fini_bo-into-two-.patch | 155 |
1 files changed, 155 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.14.71/5535-drm-amdgpu-Split-amdgpu_ucode_init-fini_bo-into-two-.patch b/common/recipes-kernel/linux/linux-yocto-4.14.71/5535-drm-amdgpu-Split-amdgpu_ucode_init-fini_bo-into-two-.patch new file mode 100644 index 00000000..944aa75a --- /dev/null +++ b/common/recipes-kernel/linux/linux-yocto-4.14.71/5535-drm-amdgpu-Split-amdgpu_ucode_init-fini_bo-into-two-.patch @@ -0,0 +1,155 @@ +From 856c717f3a3c0d982d8a8bdfc41527b1cefca8bf Mon Sep 17 00:00:00 2001 +From: Rex Zhu <Rex.Zhu@amd.com> +Date: Tue, 9 Oct 2018 13:55:49 +0800 +Subject: [PATCH 5535/5725] drm/amdgpu: Split amdgpu_ucode_init/fini_bo into + two functions + +1. one is for create/free bo when init/fini +2. one is for fill the bo before fw loading + +the ucode bo only need to be created when load driver +and free when driver unload. + +when resume/reset, driver only need to re-fill the bo +if the bo is allocated in vram. + +Suggested by Christian. + +v2: Return error when bo create failed. + +Reviewed-by: Alex Deucher <alexander.deucher@amd.com> +Signed-off-by: Rex Zhu <Rex.Zhu@amd.com> +--- + drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 4 +++ + drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.c | 58 +++++++++++++++--------------- + drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.h | 3 ++ + 3 files changed, 36 insertions(+), 29 deletions(-) + +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c +index 0cce3fa..0aa2ca1 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c +@@ -1631,6 +1631,9 @@ static int amdgpu_device_ip_init(struct amdgpu_device *adev) + } + } + ++ r = amdgpu_ucode_create_bo(adev); /* create ucode bo when sw_init complete*/ ++ if (r) ++ return r; + for (i = 0; i < adev->num_ip_blocks; i++) { + if (!adev->ip_blocks[i].status.sw) + continue; +@@ -1852,6 +1855,7 @@ static int amdgpu_device_ip_fini(struct amdgpu_device *adev) + continue; + + if (adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_GMC) { ++ amdgpu_ucode_free_bo(adev); + amdgpu_free_static_csa(adev); + amdgpu_device_wb_fini(adev); + amdgpu_device_vram_scratch_fini(adev); +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.c +index ce4044a..e15dfa6 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.c +@@ -422,32 +422,42 @@ static int amdgpu_ucode_patch_jt(struct amdgpu_firmware_info *ucode, + return 0; + } + ++int amdgpu_ucode_create_bo(struct amdgpu_device *adev) ++{ ++ if (adev->firmware.load_type != AMDGPU_FW_LOAD_DIRECT) { ++ amdgpu_bo_create_kernel(adev, adev->firmware.fw_size, PAGE_SIZE, ++ amdgpu_sriov_vf(adev) ? AMDGPU_GEM_DOMAIN_VRAM : AMDGPU_GEM_DOMAIN_GTT, ++ &adev->firmware.fw_buf, ++ &adev->firmware.fw_buf_mc, ++ &adev->firmware.fw_buf_ptr); ++ if (!adev->firmware.fw_buf) { ++ dev_err(adev->dev, "failed to create kernel buffer for firmware.fw_buf\n"); ++ return -ENOMEM; ++ } else if (amdgpu_sriov_vf(adev)) { ++ memset(adev->firmware.fw_buf_ptr, 0, adev->firmware.fw_size); ++ } ++ } ++ return 0; ++} ++ ++void amdgpu_ucode_free_bo(struct amdgpu_device *adev) ++{ ++ if (adev->firmware.load_type != AMDGPU_FW_LOAD_DIRECT) ++ amdgpu_bo_free_kernel(&adev->firmware.fw_buf, ++ &adev->firmware.fw_buf_mc, ++ &adev->firmware.fw_buf_ptr); ++} ++ + int amdgpu_ucode_init_bo(struct amdgpu_device *adev) + { + uint64_t fw_offset = 0; +- int i, err; ++ int i; + struct amdgpu_firmware_info *ucode = NULL; + const struct common_firmware_header *header = NULL; + +- if (!adev->firmware.fw_size) { +- dev_warn(adev->dev, "No ip firmware need to load\n"); ++ /* for baremetal, the ucode is allocated in gtt, so don't need to fill the bo when reset/suspend */ ++ if (!amdgpu_sriov_vf(adev) && (adev->in_gpu_reset || adev->in_suspend)) + return 0; +- } +- +- if (!adev->in_gpu_reset && !adev->in_suspend) { +- err = amdgpu_bo_create_kernel(adev, adev->firmware.fw_size, PAGE_SIZE, +- amdgpu_sriov_vf(adev) ? AMDGPU_GEM_DOMAIN_VRAM : AMDGPU_GEM_DOMAIN_GTT, +- &adev->firmware.fw_buf, +- &adev->firmware.fw_buf_mc, +- &adev->firmware.fw_buf_ptr); +- if (err) { +- dev_err(adev->dev, "failed to create kernel buffer for firmware.fw_buf\n"); +- goto failed; +- } +- } +- +- memset(adev->firmware.fw_buf_ptr, 0, adev->firmware.fw_size); +- + /* + * if SMU loaded firmware, it needn't add SMC, UVD, and VCE + * ucode info here +@@ -479,12 +489,6 @@ int amdgpu_ucode_init_bo(struct amdgpu_device *adev) + } + } + return 0; +- +-failed: +- if (err) +- adev->firmware.load_type = AMDGPU_FW_LOAD_DIRECT; +- +- return err; + } + + int amdgpu_ucode_fini_bo(struct amdgpu_device *adev) +@@ -503,9 +507,5 @@ int amdgpu_ucode_fini_bo(struct amdgpu_device *adev) + } + } + +- amdgpu_bo_free_kernel(&adev->firmware.fw_buf, +- &adev->firmware.fw_buf_mc, +- &adev->firmware.fw_buf_ptr); +- + return 0; + } +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.h +index 15791af..cbd69fe 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.h ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.h +@@ -280,6 +280,9 @@ bool amdgpu_ucode_hdr_version(union amdgpu_firmware_header *hdr, + int amdgpu_ucode_init_bo(struct amdgpu_device *adev); + int amdgpu_ucode_fini_bo(struct amdgpu_device *adev); + ++int amdgpu_ucode_create_bo(struct amdgpu_device *adev); ++void amdgpu_ucode_free_bo(struct amdgpu_device *adev); ++ + enum amdgpu_firmware_load_type + amdgpu_ucode_get_load_type(struct amdgpu_device *adev, int load_type); + +-- +2.7.4 + |