aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3137-drm-amdgpu-allow-framebuffer-in-GART-memory-as-well.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3137-drm-amdgpu-allow-framebuffer-in-GART-memory-as-well.patch')
-rw-r--r--meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3137-drm-amdgpu-allow-framebuffer-in-GART-memory-as-well.patch164
1 files changed, 164 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3137-drm-amdgpu-allow-framebuffer-in-GART-memory-as-well.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3137-drm-amdgpu-allow-framebuffer-in-GART-memory-as-well.patch
new file mode 100644
index 00000000..47fe7854
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3137-drm-amdgpu-allow-framebuffer-in-GART-memory-as-well.patch
@@ -0,0 +1,164 @@
+From 9e779a5d6a07a3cc7ac7bb9f2c192b2469ab458f Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Christian=20K=C3=B6nig?= <christian.koenig@amd.com>
+Date: Thu, 26 Oct 2017 18:06:23 +0200
+Subject: [PATCH 3137/4131] drm/amdgpu: allow framebuffer in GART memory as
+ well
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+On CZ and newer APUs we can pin the fb into GART as well as VRAM.
+
+v2: Don't enable gpu_vm_support for Raven yet since it leads to
+ a black screen. Need to debug this further before enabling.
+
+Signed-off-by: Christian König <christian.koenig@amd.com>
+Reviewed-by: Andrey Grodzovsky <andrey.grodzovsky@amd.com>
+Acked-by: Alex Deucher <alexander.deucher@amd.com>
+Acked-by: Harry Wentland <harry.wentland@amd.com>
+Signed-off-by: Samuel Li <samuel.li@amd.com>
+---
+ drivers/gpu/drm/amd/amdgpu/amdgpu_display.c | 14 +++++++++++++-
+ drivers/gpu/drm/amd/amdgpu/amdgpu_display.h | 1 +
+ drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c | 10 ++++++----
+ drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 11 +++++++++--
+ 4 files changed, 29 insertions(+), 7 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c
+index 4723df7..c8c145e 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c
+@@ -29,6 +29,7 @@
+ #include "amdgpu_i2c.h"
+ #include "atom.h"
+ #include "amdgpu_connectors.h"
++#include "amdgpu_display.h"
+ #include <asm/div64.h>
+
+ #include <linux/pm_runtime.h>
+@@ -194,7 +195,7 @@ int amdgpu_crtc_page_flip_target(struct drm_crtc *crtc,
+ goto cleanup;
+ }
+
+- r = amdgpu_bo_pin(new_abo, AMDGPU_GEM_DOMAIN_VRAM, &base);
++ r = amdgpu_bo_pin(new_abo, amdgpu_display_framebuffer_domains(adev), &base);
+ if (unlikely(r != 0)) {
+ DRM_ERROR("failed to pin new abo buffer before flip\n");
+ goto unreserve;
+@@ -507,6 +508,17 @@ static const struct drm_framebuffer_funcs amdgpu_fb_funcs = {
+ .create_handle = amdgpu_user_framebuffer_create_handle,
+ };
+
++uint32_t amdgpu_display_framebuffer_domains(struct amdgpu_device *adev)
++{
++ uint32_t domain = AMDGPU_GEM_DOMAIN_VRAM;
++
++ if (adev->asic_type >= CHIP_CARRIZO && adev->asic_type < CHIP_RAVEN &&
++ adev->flags & AMD_IS_APU)
++ domain |= AMDGPU_GEM_DOMAIN_GTT;
++
++ return domain;
++}
++
+ int
+ amdgpu_framebuffer_init(struct drm_device *dev,
+ struct amdgpu_framebuffer *rfb,
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_display.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_display.h
+index 11ae4ab..c42a627 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_display.h
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_display.h
+@@ -23,6 +23,7 @@
+ #ifndef __AMDGPU_DISPLAY_H__
+ #define __AMDGPU_DISPLAY_H__
+
++uint32_t amdgpu_display_framebuffer_domains(struct amdgpu_device *adev);
+ struct drm_framebuffer *
+ amdgpu_user_framebuffer_create(struct drm_device *dev,
+ struct drm_file *file_priv,
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c
+index 8c0bea7..577645d 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c
+@@ -38,6 +38,8 @@
+
+ #include <linux/vga_switcheroo.h>
+
++#include "amdgpu_display.h"
++
+ /* object hierarchy -
+ this contains a helper + a amdgpu fb
+ the helper contains a pointer to amdgpu framebuffer baseclass.
+@@ -124,7 +126,7 @@ static int amdgpufb_create_pinned_object(struct amdgpu_fbdev *rfbdev,
+ struct drm_gem_object *gobj = NULL;
+ struct amdgpu_bo *abo = NULL;
+ bool fb_tiled = false; /* useful for testing */
+- u32 tiling_flags = 0;
++ u32 tiling_flags = 0, domain;
+ int ret;
+ int aligned_size, size;
+ int height = mode_cmd->height;
+@@ -135,12 +137,12 @@ static int amdgpufb_create_pinned_object(struct amdgpu_fbdev *rfbdev,
+ /* need to align pitch with crtc limits */
+ mode_cmd->pitches[0] = amdgpu_align_pitch(adev, mode_cmd->width, cpp,
+ fb_tiled);
++ domain = amdgpu_display_framebuffer_domains(adev);
+
+ height = ALIGN(mode_cmd->height, 8);
+ size = mode_cmd->pitches[0] * height;
+ aligned_size = ALIGN(size, PAGE_SIZE);
+- ret = amdgpu_gem_object_create(adev, aligned_size, 0,
+- AMDGPU_GEM_DOMAIN_VRAM,
++ ret = amdgpu_gem_object_create(adev, aligned_size, 0, domain,
+ AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED |
+ AMDGPU_GEM_CREATE_VRAM_CONTIGUOUS |
+ AMDGPU_GEM_CREATE_VRAM_CLEARED,
+@@ -166,7 +168,7 @@ static int amdgpufb_create_pinned_object(struct amdgpu_fbdev *rfbdev,
+ }
+
+
+- ret = amdgpu_bo_pin(abo, AMDGPU_GEM_DOMAIN_VRAM, NULL);
++ ret = amdgpu_bo_pin(abo, domain, NULL);
+ if (ret) {
+ amdgpu_bo_unreserve(abo);
+ goto out_unref;
+diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+index b5e9d04..f765463 100644
+--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
++++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+@@ -3305,11 +3305,13 @@ static int dm_plane_helper_prepare_fb(struct drm_plane *plane,
+ {
+ struct amdgpu_framebuffer *afb;
+ struct drm_gem_object *obj;
++ struct amdgpu_device *adev;
+ struct amdgpu_bo *rbo;
+ uint64_t chroma_addr = 0;
+- int r;
+ struct dm_plane_state *dm_plane_state_new, *dm_plane_state_old;
+ unsigned int awidth;
++ uint32_t domain;
++ int r;
+
+ dm_plane_state_old = to_dm_plane_state(plane->state);
+ dm_plane_state_new = to_dm_plane_state(new_state);
+@@ -3323,12 +3325,17 @@ static int dm_plane_helper_prepare_fb(struct drm_plane *plane,
+
+ obj = afb->obj;
+ rbo = gem_to_amdgpu_bo(obj);
++ adev = amdgpu_ttm_adev(rbo->tbo.bdev);
+ r = amdgpu_bo_reserve(rbo, false);
+ if (unlikely(r != 0))
+ return r;
+
+- r = amdgpu_bo_pin(rbo, AMDGPU_GEM_DOMAIN_VRAM, &afb->address);
++ if (plane->type != DRM_PLANE_TYPE_CURSOR)
++ domain = amdgpu_display_framebuffer_domains(adev);
++ else
++ domain = AMDGPU_GEM_DOMAIN_VRAM;
+
++ r = amdgpu_bo_pin(rbo, domain, &afb->address);
+
+ amdgpu_bo_unreserve(rbo);
+
+--
+2.7.4
+