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

Reply via email to