I think Andrey approved your patch last December? If you mean the driver actually set up fb in gart memory, that is not included in this series. I can do that in another patch.
Regards, Samuel Li
-----Original Message----- From: Wentland, Harry Sent: Friday, January 05, 2018 10:50 AM To: Li, Samuel Samuel.Li@amd.com; dri-devel@lists.freedesktop.org; amd-gfx@lists.freedesktop.org Cc: Koenig, Christian Christian.Koenig@amd.com Subject: Re: [PATCH 1/3] drm/amdgpu: allow framebuffer in GART memory as well
On 2018-01-04 04:11 PM, Samuel Li wrote:
From: Christian König christian.koenig@amd.com
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.
I can't find the part to enable gpu_vm_support for CZ/ST. Is that in another patch?
Harry
Change-Id: Id0f8af3110e54a3aabf7a258871867bc121cc1a2 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 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 d704a45..d9fdc19 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> @@ -188,7 +189,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_framebuffer_domains(adev), &base);
if (unlikely(r != 0)) { DRM_ERROR("failed to pin new abo buffer before flip\n"); goto unreserve; @@ -501,6 +502,17 @@ static const struct drm_framebuffer_funcs
amdgpu_fb_funcs = {
.create_handle = amdgpu_user_framebuffer_create_handle, };
+uint32_t amdgpu_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..f241949 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_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 90fa8e8..9be3228 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_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 a3bf021..9b05abd 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c @@ -2982,11 +2982,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); @@ -
3000,12
+3002,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_framebuffer_domains(adev);
else
domain = AMDGPU_GEM_DOMAIN_VRAM;
r = amdgpu_bo_pin(rbo, domain, &afb->address);
amdgpu_bo_unreserve(rbo);