aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4212-drm-amdgpu-reserve-vram-for-memory-training-v4.patch
diff options
context:
space:
mode:
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.patch135
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
+