diff options
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4212-drm-amdgpu-reserve-vram-for-memory-training-v4.patch')
-rw-r--r-- | meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4212-drm-amdgpu-reserve-vram-for-memory-training-v4.patch | 135 |
1 files changed, 135 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4212-drm-amdgpu-reserve-vram-for-memory-training-v4.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4212-drm-amdgpu-reserve-vram-for-memory-training-v4.patch new file mode 100644 index 00000000..4c224e55 --- /dev/null +++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4212-drm-amdgpu-reserve-vram-for-memory-training-v4.patch @@ -0,0 +1,135 @@ +From eafe58cb56a6d67ea90e24de16257fdfab5a7e76 Mon Sep 17 00:00:00 2001 +From: "Tianci.Yin" <tianci.yin@amd.com> +Date: Mon, 30 Sep 2019 14:28:17 +0800 +Subject: [PATCH 4212/4736] drm/amdgpu: reserve vram for memory training(v4) + +memory training using specific fixed vram segment, reserve these +segments before anyone may allocate it. + +Change-Id: I9a37cd4f61b04ba1ca041a752bc16901488ac341 +Reviewed-by: Alex Deucher <alexander.deucher@amd.com> +Reviewed-by: Luben Tuikov <luben.tuikov@amd.com> +Signed-off-by: Tianci.Yin <tianci.yin@amd.com> +--- + drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c | 91 +++++++++++++++++++++++++ + 1 file changed, 91 insertions(+) + +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c +index 0c1af24f8bc0..968595138b32 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c +@@ -1975,6 +1975,88 @@ static void amdgpu_ssg_fini(struct amdgpu_device *adev) + } + #endif + ++/* ++ * Memoy training reservation functions ++ */ ++ ++/** ++ * amdgpu_ttm_training_reserve_vram_fini - free memory training reserved vram ++ * ++ * @adev: amdgpu_device pointer ++ * ++ * free memory training reserved vram if it has been reserved. ++ */ ++static int amdgpu_ttm_training_reserve_vram_fini(struct amdgpu_device *adev) ++{ ++ struct psp_memory_training_context *ctx = &adev->psp.mem_train_ctx; ++ ++ ctx->init = PSP_MEM_TRAIN_NOT_SUPPORT; ++ amdgpu_bo_free_kernel(&ctx->c2p_bo, NULL, NULL); ++ ctx->c2p_bo = NULL; ++ ++ amdgpu_bo_free_kernel(&ctx->p2c_bo, NULL, NULL); ++ ctx->p2c_bo = NULL; ++ ++ return 0; ++} ++ ++/** ++ * amdgpu_ttm_training_reserve_vram_init - create bo vram reservation from memory training ++ * ++ * @adev: amdgpu_device pointer ++ * ++ * create bo vram reservation from memory training. ++ */ ++static int amdgpu_ttm_training_reserve_vram_init(struct amdgpu_device *adev) ++{ ++ int ret; ++ struct psp_memory_training_context *ctx = &adev->psp.mem_train_ctx; ++ ++ memset(ctx, 0, sizeof(*ctx)); ++ if (!adev->fw_vram_usage.mem_train_support) { ++ DRM_DEBUG("memory training does not support!\n"); ++ return 0; ++ } ++ ++ ctx->c2p_train_data_offset = adev->fw_vram_usage.mem_train_fb_loc; ++ ctx->p2c_train_data_offset = (adev->gmc.mc_vram_size - GDDR6_MEM_TRAINING_OFFSET); ++ ctx->train_data_size = GDDR6_MEM_TRAINING_DATA_SIZE_IN_BYTES; ++ ++ DRM_DEBUG("train_data_size:%llx,p2c_train_data_offset:%llx,c2p_train_data_offset:%llx.\n", ++ ctx->train_data_size, ++ ctx->p2c_train_data_offset, ++ ctx->c2p_train_data_offset); ++ ++ ret = amdgpu_bo_create_kernel_at(adev, ++ ctx->p2c_train_data_offset, ++ ctx->train_data_size, ++ AMDGPU_GEM_DOMAIN_VRAM, ++ &ctx->p2c_bo, ++ NULL); ++ if (ret) { ++ DRM_ERROR("alloc p2c_bo failed(%d)!\n", ret); ++ goto Err_out; ++ } ++ ++ ret = amdgpu_bo_create_kernel_at(adev, ++ ctx->c2p_train_data_offset, ++ ctx->train_data_size, ++ AMDGPU_GEM_DOMAIN_VRAM, ++ &ctx->c2p_bo, ++ NULL); ++ if (ret) { ++ DRM_ERROR("alloc c2p_bo failed(%d)!\n", ret); ++ goto Err_out; ++ } ++ ++ ctx->init = PSP_MEM_TRAIN_RESERVE_SUCCESS; ++ return 0; ++ ++Err_out: ++ amdgpu_ttm_training_reserve_vram_fini(adev); ++ return ret; ++} ++ + /** + * amdgpu_ttm_init - Init the memory management (ttm) as well as various + * gtt/vram related fields. +@@ -2053,6 +2135,14 @@ int amdgpu_ttm_init(struct amdgpu_device *adev) + return r; + } + ++ /* ++ *The reserved vram for memory training must be pinned to the specified ++ *place on the VRAM, so reserve it early. ++ */ ++ r = amdgpu_ttm_training_reserve_vram_init(adev); ++ if (r) ++ return r; ++ + /* allocate memory as required for VGA + * This is used for VGA emulation and pre-OS scanout buffers to + * avoid display artifacts while transitioning between pre-OS +@@ -2160,6 +2250,7 @@ void amdgpu_ttm_fini(struct amdgpu_device *adev) + return; + + amdgpu_ttm_debugfs_fini(adev); ++ amdgpu_ttm_training_reserve_vram_fini(adev); + amdgpu_ttm_fw_reserve_vram_fini(adev); + if (adev->mman.aper_base_kaddr) + iounmap(adev->mman.aper_base_kaddr); +-- +2.17.1 + |