On Thu, May 09, 2019 at 03:21:57PM +0300, Ville Syrjala wrote: > From: Ville Syrjälä <ville.syrjala@xxxxxxxxxxxxxxx> > > Align dumb buffer stride to 4k if the fb will be big enough to > require gtt remapping. > > v2: Leave the stride alone for buffers that look to be for the cursor > v3: Make it not a hack (Daniel) > > Cc: Daniel Vetter <daniel.vetter@xxxxxxxx> > Signed-off-by: Ville Syrjälä <ville.syrjala@xxxxxxxxxxxxxxx> Yeah I think this is a reasonable heuristics. Reviewed-by: Daniel Vetter <daniel.vetter@xxxxxxxx> > --- > drivers/gpu/drm/i915/i915_gem.c | 26 +++++++++++++++++++++++++- > drivers/gpu/drm/i915/intel_display.c | 1 - > drivers/gpu/drm/i915/intel_display.h | 2 ++ > 3 files changed, 27 insertions(+), 2 deletions(-) > > diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c > index 4e474bcf4c22..7cafd5612f71 100644 > --- a/drivers/gpu/drm/i915/i915_gem.c > +++ b/drivers/gpu/drm/i915/i915_gem.c > @@ -52,6 +52,7 @@ > #include "i915_trace.h" > #include "i915_vgpu.h" > > +#include "intel_display.h" > #include "intel_drv.h" > #include "intel_frontbuffer.h" > #include "intel_pm.h" > @@ -560,8 +561,31 @@ i915_gem_dumb_create(struct drm_file *file, > struct drm_device *dev, > struct drm_mode_create_dumb *args) > { > + int cpp = DIV_ROUND_UP(args->bpp, 8); > + u32 format; > + > + switch (cpp) { > + case 1: > + format = DRM_FORMAT_C8; > + break; > + case 2: > + format = DRM_FORMAT_RGB565; > + break; > + case 4: > + format = DRM_FORMAT_XRGB8888; > + break; > + default: > + return -EINVAL; > + } > + > /* have to work out size/pitch and return them */ > - args->pitch = ALIGN(args->width * DIV_ROUND_UP(args->bpp, 8), 64); > + args->pitch = ALIGN(args->width * cpp, 64); > + > + /* align stride to page size so that we can remap */ > + if (args->pitch > intel_plane_fb_max_stride(to_i915(dev), format, > + DRM_FORMAT_MOD_LINEAR)) > + args->pitch = ALIGN(args->pitch, 4096); > + > args->size = args->pitch * args->height; > return i915_gem_create(file, to_i915(dev), > &args->size, &args->handle); > diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c > index 94faac9e3666..fa317c40d548 100644 > --- a/drivers/gpu/drm/i915/intel_display.c > +++ b/drivers/gpu/drm/i915/intel_display.c > @@ -2498,7 +2498,6 @@ bool is_ccs_modifier(u64 modifier) > modifier == I915_FORMAT_MOD_Yf_TILED_CCS; > } > > -static > u32 intel_plane_fb_max_stride(struct drm_i915_private *dev_priv, > u32 pixel_format, u64 modifier) > { > diff --git a/drivers/gpu/drm/i915/intel_display.h b/drivers/gpu/drm/i915/intel_display.h > index 500eec90928d..1e6533fbd061 100644 > --- a/drivers/gpu/drm/i915/intel_display.h > +++ b/drivers/gpu/drm/i915/intel_display.h > @@ -436,6 +436,8 @@ void intel_link_compute_m_n(u16 bpp, int nlanes, > bool constant_n); > bool is_ccs_modifier(u64 modifier); > void lpt_disable_clkout_dp(struct drm_i915_private *dev_priv); > +u32 intel_plane_fb_max_stride(struct drm_i915_private *dev_priv, > + u32 pixel_format, u64 modifier); > bool intel_plane_can_remap(const struct intel_plane_state *plane_state); > > #endif > -- > 2.21.0 > -- Daniel Vetter Software Engineer, Intel Corporation http://blog.ffwll.ch _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/intel-gfx