drm/i915/gem: split gem_create into own file
authorMatthew Auld <matthew.auld@intel.com>
Thu, 14 Jan 2021 18:24:00 +0000 (18:24 +0000)
committerChris Wilson <chris@chris-wilson.co.uk>
Fri, 15 Jan 2021 08:00:03 +0000 (08:00 +0000)
In preparation for gem_create_ext break out the gem_create uAPI, so that
we don't clutter i915_gem.c once we start adding various extensions

Signed-off-by: Matthew Auld <matthew.auld@intel.com>
Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Link: https://patchwork.freedesktop.org/patch/msgid/20210114182402.840247-1-matthew.auld@intel.com
drivers/gpu/drm/i915/Makefile
drivers/gpu/drm/i915/gem/i915_gem_create.c [new file with mode: 0644]
drivers/gpu/drm/i915/i915_gem.c

index d6ac946..6673362 100644 (file)
@@ -136,6 +136,7 @@ gem-y += \
        gem/i915_gem_clflush.o \
        gem/i915_gem_client_blt.o \
        gem/i915_gem_context.o \
+       gem/i915_gem_create.o \
        gem/i915_gem_dmabuf.o \
        gem/i915_gem_domain.o \
        gem/i915_gem_execbuffer.o \
diff --git a/drivers/gpu/drm/i915/gem/i915_gem_create.c b/drivers/gpu/drm/i915/gem/i915_gem_create.c
new file mode 100644 (file)
index 0000000..ce923ed
--- /dev/null
@@ -0,0 +1,111 @@
+// SPDX-License-Identifier: MIT
+/*
+ * Copyright © 2020 Intel Corporation
+ */
+
+#include "gem/i915_gem_ioctls.h"
+#include "gem/i915_gem_region.h"
+
+#include "i915_drv.h"
+
+static int
+i915_gem_create(struct drm_file *file,
+               struct intel_memory_region *mr,
+               u64 *size_p,
+               u32 *handle_p)
+{
+       struct drm_i915_gem_object *obj;
+       u32 handle;
+       u64 size;
+       int ret;
+
+       GEM_BUG_ON(!is_power_of_2(mr->min_page_size));
+       size = round_up(*size_p, mr->min_page_size);
+       if (size == 0)
+               return -EINVAL;
+
+       /* For most of the ABI (e.g. mmap) we think in system pages */
+       GEM_BUG_ON(!IS_ALIGNED(size, PAGE_SIZE));
+
+       /* Allocate the new object */
+       obj = i915_gem_object_create_region(mr, size, 0);
+       if (IS_ERR(obj))
+               return PTR_ERR(obj);
+
+       ret = drm_gem_handle_create(file, &obj->base, &handle);
+       /* drop reference from allocate - handle holds it now */
+       i915_gem_object_put(obj);
+       if (ret)
+               return ret;
+
+       *handle_p = handle;
+       *size_p = size;
+       return 0;
+}
+
+int
+i915_gem_dumb_create(struct drm_file *file,
+                    struct drm_device *dev,
+                    struct drm_mode_create_dumb *args)
+{
+       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;
+       }
+
+       /* 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(to_i915(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;
+
+       return i915_gem_create(file,
+                              intel_memory_region_by_type(to_i915(dev),
+                                                          mem_type),
+                              &args->size, &args->handle);
+}
+
+/**
+ * Creates a new mm object and returns a handle to it.
+ * @dev: drm device pointer
+ * @data: ioctl data blob
+ * @file: drm file pointer
+ */
+int
+i915_gem_create_ioctl(struct drm_device *dev, void *data,
+                     struct drm_file *file)
+{
+       struct drm_i915_private *i915 = to_i915(dev);
+       struct drm_i915_gem_create *args = data;
+
+       i915_gem_flush_free_objects(i915);
+
+       return i915_gem_create(file,
+                              intel_memory_region_by_type(i915,
+                                                          INTEL_MEMORY_SYSTEM),
+                              &args->size, &args->handle);
+}
index 17a4636..c013148 100644 (file)
@@ -179,108 +179,6 @@ try_again:
        return ret;
 }
 
-static int
-i915_gem_create(struct drm_file *file,
-               struct intel_memory_region *mr,
-               u64 *size_p,
-               u32 *handle_p)
-{
-       struct drm_i915_gem_object *obj;
-       u32 handle;
-       u64 size;
-       int ret;
-
-       GEM_BUG_ON(!is_power_of_2(mr->min_page_size));
-       size = round_up(*size_p, mr->min_page_size);
-       if (size == 0)
-               return -EINVAL;
-
-       /* For most of the ABI (e.g. mmap) we think in system pages */
-       GEM_BUG_ON(!IS_ALIGNED(size, PAGE_SIZE));
-
-       /* Allocate the new object */
-       obj = i915_gem_object_create_region(mr, size, 0);
-       if (IS_ERR(obj))
-               return PTR_ERR(obj);
-
-       ret = drm_gem_handle_create(file, &obj->base, &handle);
-       /* drop reference from allocate - handle holds it now */
-       i915_gem_object_put(obj);
-       if (ret)
-               return ret;
-
-       *handle_p = handle;
-       *size_p = size;
-       return 0;
-}
-
-int
-i915_gem_dumb_create(struct drm_file *file,
-                    struct drm_device *dev,
-                    struct drm_mode_create_dumb *args)
-{
-       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;
-       }
-
-       /* 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(to_i915(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;
-
-       return i915_gem_create(file,
-                              intel_memory_region_by_type(to_i915(dev),
-                                                          mem_type),
-                              &args->size, &args->handle);
-}
-
-/**
- * Creates a new mm object and returns a handle to it.
- * @dev: drm device pointer
- * @data: ioctl data blob
- * @file: drm file pointer
- */
-int
-i915_gem_create_ioctl(struct drm_device *dev, void *data,
-                     struct drm_file *file)
-{
-       struct drm_i915_private *i915 = to_i915(dev);
-       struct drm_i915_gem_create *args = data;
-
-       i915_gem_flush_free_objects(i915);
-
-       return i915_gem_create(file,
-                              intel_memory_region_by_type(i915,
-                                                          INTEL_MEMORY_SYSTEM),
-                              &args->size, &args->handle);
-}
-
 static int
 shmem_pread(struct page *page, int offset, int len, char __user *user_data,
            bool needs_clflush)