On Thu, Jan 4, 2018 at 4:11 PM, Samuel Li <Samuel.Li at amd.com> wrote: > From: Christian König <christian.koenig at 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. > > Change-Id: Id0f8af3110e54a3aabf7a258871867bc121cc1a2 > Signed-off-by: Christian König <christian.koenig at amd.com> > Reviewed-by: Andrey Grodzovsky <andrey.grodzovsky at amd.com> > Acked-by: Alex Deucher <alexander.deucher at amd.com> > Signed-off-by: Samuel Li <samuel.li at 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) Please rename this amdgpu_display_framebuffer_domains() for consistency. > +{ > + 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) Do cursors have to be in vram? It seems like they shouldn't. Alex > + domain = amdgpu_framebuffer_domains(adev); > + else > + domain = AMDGPU_GEM_DOMAIN_VRAM; > > + r = amdgpu_bo_pin(rbo, domain, &afb->address); > > amdgpu_bo_unreserve(rbo); > > -- > 2.7.4 > > _______________________________________________ > amd-gfx mailing list > amd-gfx at lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/amd-gfx