From: Ville Syrjälä <[email protected]> In preparation for handling the DRM_MODE_DUMB_CURSOR flag, move the current display specific (mainly remapping) dumb buffer handling to the display code.
We'll still need to provide some kind of non-display codepath as well since at least some igts use dumb buffers even on devices without display support. Cc: Daniel Stone <[email protected]> Signed-off-by: Ville Syrjälä <[email protected]> --- drivers/gpu/drm/i915/display/intel_display.c | 8 +++ drivers/gpu/drm/i915/display/intel_display.h | 3 ++ drivers/gpu/drm/i915/display/intel_plane.c | 32 ++++++++++++ drivers/gpu/drm/i915/display/intel_plane.h | 4 ++ drivers/gpu/drm/i915/gem/i915_gem_create.c | 55 ++++++++++---------- 5 files changed, 74 insertions(+), 28 deletions(-) diff --git a/drivers/gpu/drm/i915/display/intel_display.c b/drivers/gpu/drm/i915/display/intel_display.c index a8b4619de347..bd4317291ba5 100644 --- a/drivers/gpu/drm/i915/display/intel_display.c +++ b/drivers/gpu/drm/i915/display/intel_display.c @@ -569,6 +569,14 @@ u32 intel_plane_fb_max_stride(struct drm_device *drm, DRM_MODE_ROTATE_0); } +int intel_display_dumb_create(struct drm_device *drm, + struct drm_mode_create_dumb *args) +{ + struct intel_display *display = to_intel_display(drm); + + return intel_plane_dumb_create(display, args); +} + void intel_set_plane_visible(struct intel_crtc_state *crtc_state, struct intel_plane_state *plane_state, bool visible) diff --git a/drivers/gpu/drm/i915/display/intel_display.h b/drivers/gpu/drm/i915/display/intel_display.h index fc2ef92ccf68..1d978f441b47 100644 --- a/drivers/gpu/drm/i915/display/intel_display.h +++ b/drivers/gpu/drm/i915/display/intel_display.h @@ -34,6 +34,7 @@ struct drm_atomic_state; struct drm_device; struct drm_display_mode; struct drm_encoder; +struct drm_mode_create_dumb; struct drm_modeset_acquire_ctx; struct intel_atomic_state; struct intel_crtc; @@ -404,6 +405,8 @@ void intel_link_compute_m_n(u16 bpp, int nlanes, struct intel_link_m_n *m_n); u32 intel_plane_fb_max_stride(struct drm_device *drm, u32 pixel_format, u64 modifier); +int intel_display_dumb_create(struct drm_device *drm, + struct drm_mode_create_dumb *args); enum drm_mode_status intel_mode_valid_max_plane_size(struct intel_display *display, const struct drm_display_mode *mode, diff --git a/drivers/gpu/drm/i915/display/intel_plane.c b/drivers/gpu/drm/i915/display/intel_plane.c index 78329deb395a..f12f8300a7c4 100644 --- a/drivers/gpu/drm/i915/display/intel_plane.c +++ b/drivers/gpu/drm/i915/display/intel_plane.c @@ -1705,3 +1705,35 @@ int intel_plane_atomic_check(struct intel_atomic_state *state) return 0; } + +int intel_plane_dumb_create(struct intel_display *display, + 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; + } + + 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(display->drm, format, + DRM_FORMAT_MOD_LINEAR)) + args->pitch = ALIGN(args->pitch, 4096); + + args->size = mul_u32_u32(args->pitch, args->height); + + return 0; +} diff --git a/drivers/gpu/drm/i915/display/intel_plane.h b/drivers/gpu/drm/i915/display/intel_plane.h index 4e99df9de3e8..d27991acd97f 100644 --- a/drivers/gpu/drm/i915/display/intel_plane.h +++ b/drivers/gpu/drm/i915/display/intel_plane.h @@ -8,12 +8,14 @@ #include <linux/types.h> +struct drm_mode_create_dumb; struct drm_plane; struct drm_property; struct drm_rect; struct intel_atomic_state; struct intel_crtc; struct intel_crtc_state; +struct intel_display; struct intel_dsb; struct intel_plane; struct intel_plane_state; @@ -87,5 +89,7 @@ int intel_plane_atomic_check(struct intel_atomic_state *state); bool intel_plane_format_mod_supported_async(struct drm_plane *plane, u32 format, u64 modifier); +int intel_plane_dumb_create(struct intel_display *display, + struct drm_mode_create_dumb *args); #endif /* __INTEL_PLANE_H__ */ diff --git a/drivers/gpu/drm/i915/gem/i915_gem_create.c b/drivers/gpu/drm/i915/gem/i915_gem_create.c index c3e6a325872d..6ce46b0f7eec 100644 --- a/drivers/gpu/drm/i915/gem/i915_gem_create.c +++ b/drivers/gpu/drm/i915/gem/i915_gem_create.c @@ -169,39 +169,38 @@ i915_gem_dumb_create(struct drm_file *file, struct drm_device *dev, struct drm_mode_create_dumb *args) { + struct drm_i915_private *i915 = to_i915(dev); struct drm_i915_gem_object *obj; struct intel_memory_region *mr; enum intel_memory_type mem_type; - 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; + + if (i915->display) { + int ret; + + ret = intel_display_dumb_create(dev, args); + if (ret) + return ret; + } else { + int cpp = DIV_ROUND_UP(args->bpp, 8); + + switch (cpp) { + case 1: + case 2: + case 4: + break; + default: + return -EINVAL; + } + + /* have to work out size/pitch and return them */ + args->pitch = ALIGN(args->width * cpp, 64); + + if (args->pitch < args->width) + return -EINVAL; + + args->size = mul_u32_u32(args->pitch, args->height); } - /* have to work out size/pitch and return them */ - 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(dev, format, - DRM_FORMAT_MOD_LINEAR)) - args->pitch = ALIGN(args->pitch, 4096); - - if (args->pitch < args->width) - return -EINVAL; - - args->size = mul_u32_u32(args->pitch, args->height); - mem_type = INTEL_MEMORY_SYSTEM; if (HAS_LMEM(to_i915(dev))) mem_type = INTEL_MEMORY_LOCAL; -- 2.49.1
