mirror of
https://github.com/torvalds/linux.git
synced 2026-05-27 00:22:00 +02:00
drm/xe/display: align framebuffers according to hw requirements
Align framebuffers in memory according to hw requirements instead of default page size alignment. Signed-off-by: Juha-Pekka Heikkila <juhapekka.heikkila@gmail.com> Reviewed-by: Jonathan Cavitt <jonathan.cavitt@intel.com> Signed-off-by: Mika Kahola <mika.kahola@intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/20241009151947.2240099-3-juhapekka.heikkila@gmail.com
This commit is contained in:
parent
3ad86ae1da
commit
b0228a337d
|
|
@ -79,7 +79,8 @@ write_dpt_remapped(struct xe_bo *bo, struct iosys_map *map, u32 *dpt_ofs,
|
||||||
|
|
||||||
static int __xe_pin_fb_vma_dpt(const struct intel_framebuffer *fb,
|
static int __xe_pin_fb_vma_dpt(const struct intel_framebuffer *fb,
|
||||||
const struct i915_gtt_view *view,
|
const struct i915_gtt_view *view,
|
||||||
struct i915_vma *vma)
|
struct i915_vma *vma,
|
||||||
|
u64 physical_alignment)
|
||||||
{
|
{
|
||||||
struct xe_device *xe = to_xe_device(fb->base.dev);
|
struct xe_device *xe = to_xe_device(fb->base.dev);
|
||||||
struct xe_tile *tile0 = xe_device_get_root_tile(xe);
|
struct xe_tile *tile0 = xe_device_get_root_tile(xe);
|
||||||
|
|
@ -98,23 +99,29 @@ static int __xe_pin_fb_vma_dpt(const struct intel_framebuffer *fb,
|
||||||
XE_PAGE_SIZE);
|
XE_PAGE_SIZE);
|
||||||
|
|
||||||
if (IS_DGFX(xe))
|
if (IS_DGFX(xe))
|
||||||
dpt = xe_bo_create_pin_map(xe, tile0, NULL, dpt_size,
|
dpt = xe_bo_create_pin_map_at_aligned(xe, tile0, NULL,
|
||||||
ttm_bo_type_kernel,
|
dpt_size, ~0ull,
|
||||||
XE_BO_FLAG_VRAM0 |
|
ttm_bo_type_kernel,
|
||||||
XE_BO_FLAG_GGTT |
|
XE_BO_FLAG_VRAM0 |
|
||||||
XE_BO_FLAG_PAGETABLE);
|
XE_BO_FLAG_GGTT |
|
||||||
|
XE_BO_FLAG_PAGETABLE,
|
||||||
|
physical_alignment);
|
||||||
else
|
else
|
||||||
dpt = xe_bo_create_pin_map(xe, tile0, NULL, dpt_size,
|
dpt = xe_bo_create_pin_map_at_aligned(xe, tile0, NULL,
|
||||||
ttm_bo_type_kernel,
|
dpt_size, ~0ull,
|
||||||
XE_BO_FLAG_STOLEN |
|
ttm_bo_type_kernel,
|
||||||
XE_BO_FLAG_GGTT |
|
XE_BO_FLAG_STOLEN |
|
||||||
XE_BO_FLAG_PAGETABLE);
|
XE_BO_FLAG_GGTT |
|
||||||
|
XE_BO_FLAG_PAGETABLE,
|
||||||
|
physical_alignment);
|
||||||
if (IS_ERR(dpt))
|
if (IS_ERR(dpt))
|
||||||
dpt = xe_bo_create_pin_map(xe, tile0, NULL, dpt_size,
|
dpt = xe_bo_create_pin_map_at_aligned(xe, tile0, NULL,
|
||||||
ttm_bo_type_kernel,
|
dpt_size, ~0ull,
|
||||||
XE_BO_FLAG_SYSTEM |
|
ttm_bo_type_kernel,
|
||||||
XE_BO_FLAG_GGTT |
|
XE_BO_FLAG_SYSTEM |
|
||||||
XE_BO_FLAG_PAGETABLE);
|
XE_BO_FLAG_GGTT |
|
||||||
|
XE_BO_FLAG_PAGETABLE,
|
||||||
|
physical_alignment);
|
||||||
if (IS_ERR(dpt))
|
if (IS_ERR(dpt))
|
||||||
return PTR_ERR(dpt);
|
return PTR_ERR(dpt);
|
||||||
|
|
||||||
|
|
@ -183,7 +190,8 @@ write_ggtt_rotated(struct xe_bo *bo, struct xe_ggtt *ggtt, u32 *ggtt_ofs, u32 bo
|
||||||
|
|
||||||
static int __xe_pin_fb_vma_ggtt(const struct intel_framebuffer *fb,
|
static int __xe_pin_fb_vma_ggtt(const struct intel_framebuffer *fb,
|
||||||
const struct i915_gtt_view *view,
|
const struct i915_gtt_view *view,
|
||||||
struct i915_vma *vma)
|
struct i915_vma *vma,
|
||||||
|
u64 physical_alignment)
|
||||||
{
|
{
|
||||||
struct xe_bo *bo = intel_fb_obj(&fb->base);
|
struct xe_bo *bo = intel_fb_obj(&fb->base);
|
||||||
struct xe_device *xe = to_xe_device(fb->base.dev);
|
struct xe_device *xe = to_xe_device(fb->base.dev);
|
||||||
|
|
@ -264,7 +272,8 @@ static int __xe_pin_fb_vma_ggtt(const struct intel_framebuffer *fb,
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct i915_vma *__xe_pin_fb_vma(const struct intel_framebuffer *fb,
|
static struct i915_vma *__xe_pin_fb_vma(const struct intel_framebuffer *fb,
|
||||||
const struct i915_gtt_view *view)
|
const struct i915_gtt_view *view,
|
||||||
|
u64 physical_alignment)
|
||||||
{
|
{
|
||||||
struct drm_device *dev = fb->base.dev;
|
struct drm_device *dev = fb->base.dev;
|
||||||
struct xe_device *xe = to_xe_device(dev);
|
struct xe_device *xe = to_xe_device(dev);
|
||||||
|
|
@ -312,9 +321,9 @@ static struct i915_vma *__xe_pin_fb_vma(const struct intel_framebuffer *fb,
|
||||||
|
|
||||||
vma->bo = bo;
|
vma->bo = bo;
|
||||||
if (intel_fb_uses_dpt(&fb->base))
|
if (intel_fb_uses_dpt(&fb->base))
|
||||||
ret = __xe_pin_fb_vma_dpt(fb, view, vma);
|
ret = __xe_pin_fb_vma_dpt(fb, view, vma, physical_alignment);
|
||||||
else
|
else
|
||||||
ret = __xe_pin_fb_vma_ggtt(fb, view, vma);
|
ret = __xe_pin_fb_vma_ggtt(fb, view, vma, physical_alignment);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto err_unpin;
|
goto err_unpin;
|
||||||
|
|
||||||
|
|
@ -355,7 +364,7 @@ intel_fb_pin_to_ggtt(const struct drm_framebuffer *fb,
|
||||||
{
|
{
|
||||||
*out_flags = 0;
|
*out_flags = 0;
|
||||||
|
|
||||||
return __xe_pin_fb_vma(to_intel_framebuffer(fb), view);
|
return __xe_pin_fb_vma(to_intel_framebuffer(fb), view, phys_alignment);
|
||||||
}
|
}
|
||||||
|
|
||||||
void intel_fb_unpin_vma(struct i915_vma *vma, unsigned long flags)
|
void intel_fb_unpin_vma(struct i915_vma *vma, unsigned long flags)
|
||||||
|
|
@ -368,11 +377,15 @@ int intel_plane_pin_fb(struct intel_plane_state *plane_state)
|
||||||
struct drm_framebuffer *fb = plane_state->hw.fb;
|
struct drm_framebuffer *fb = plane_state->hw.fb;
|
||||||
struct xe_bo *bo = intel_fb_obj(fb);
|
struct xe_bo *bo = intel_fb_obj(fb);
|
||||||
struct i915_vma *vma;
|
struct i915_vma *vma;
|
||||||
|
struct intel_framebuffer *intel_fb = to_intel_framebuffer(fb);
|
||||||
|
struct intel_plane *plane = to_intel_plane(plane_state->uapi.plane);
|
||||||
|
u64 phys_alignment = plane->min_alignment(plane, fb, 0);
|
||||||
|
|
||||||
/* We reject creating !SCANOUT fb's, so this is weird.. */
|
/* We reject creating !SCANOUT fb's, so this is weird.. */
|
||||||
drm_WARN_ON(bo->ttm.base.dev, !(bo->flags & XE_BO_FLAG_SCANOUT));
|
drm_WARN_ON(bo->ttm.base.dev, !(bo->flags & XE_BO_FLAG_SCANOUT));
|
||||||
|
|
||||||
vma = __xe_pin_fb_vma(to_intel_framebuffer(fb), &plane_state->view.gtt);
|
vma = __xe_pin_fb_vma(intel_fb, &plane_state->view.gtt, phys_alignment);
|
||||||
|
|
||||||
if (IS_ERR(vma))
|
if (IS_ERR(vma))
|
||||||
return PTR_ERR(vma);
|
return PTR_ERR(vma);
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user