> -----Original Message----- > From: amd-gfx [mailto:amd-gfx-bounces at lists.freedesktop.org] On Behalf > Of Christian König > Sent: Thursday, October 26, 2017 12:06 PM > To: amd-gfx at lists.freedesktop.org > Subject: [PATCH 8/8] drm/amdgpu: allow framebuffer in GART memory as > well > > 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. > > Signed-off-by: Christian König <christian.koenig at amd.com> Reviewed-by: Alex Deucher <alexander.deucher at amd.com> > --- > drivers/gpu/drm/amd/amdgpu/amdgpu_display.c | 13 ++++++++++++- > 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 | 13 > ++++++++++--- > 4 files changed, 29 insertions(+), 8 deletions(-) > > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c > b/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c > index 6744e0c..71823f7 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,16 @@ 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->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 ed4351a..f42804a 100644 > --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c > +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c > @@ -2934,10 +2934,12 @@ 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; > - 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); > @@ -2951,17 +2953,22 @@ 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); > > if (unlikely(r != 0)) { > - DRM_ERROR("Failed to pin framebuffer\n"); > + DRM_ERROR("Failed to pin framebuffer (%d)\n", r); > return r; > } > > -- > 2.7.4 > > _______________________________________________ > amd-gfx mailing list > amd-gfx at lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/amd-gfx