Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/i915/gem: split gem_create into own file

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

authored by

Matthew Auld and committed by
Chris Wilson
dcaccaf0 9736387a

+112 -102
+1
drivers/gpu/drm/i915/Makefile
··· 136 136 gem/i915_gem_clflush.o \ 137 137 gem/i915_gem_client_blt.o \ 138 138 gem/i915_gem_context.o \ 139 + gem/i915_gem_create.o \ 139 140 gem/i915_gem_dmabuf.o \ 140 141 gem/i915_gem_domain.o \ 141 142 gem/i915_gem_execbuffer.o \
+111
drivers/gpu/drm/i915/gem/i915_gem_create.c
··· 1 + // SPDX-License-Identifier: MIT 2 + /* 3 + * Copyright © 2020 Intel Corporation 4 + */ 5 + 6 + #include "gem/i915_gem_ioctls.h" 7 + #include "gem/i915_gem_region.h" 8 + 9 + #include "i915_drv.h" 10 + 11 + static int 12 + i915_gem_create(struct drm_file *file, 13 + struct intel_memory_region *mr, 14 + u64 *size_p, 15 + u32 *handle_p) 16 + { 17 + struct drm_i915_gem_object *obj; 18 + u32 handle; 19 + u64 size; 20 + int ret; 21 + 22 + GEM_BUG_ON(!is_power_of_2(mr->min_page_size)); 23 + size = round_up(*size_p, mr->min_page_size); 24 + if (size == 0) 25 + return -EINVAL; 26 + 27 + /* For most of the ABI (e.g. mmap) we think in system pages */ 28 + GEM_BUG_ON(!IS_ALIGNED(size, PAGE_SIZE)); 29 + 30 + /* Allocate the new object */ 31 + obj = i915_gem_object_create_region(mr, size, 0); 32 + if (IS_ERR(obj)) 33 + return PTR_ERR(obj); 34 + 35 + ret = drm_gem_handle_create(file, &obj->base, &handle); 36 + /* drop reference from allocate - handle holds it now */ 37 + i915_gem_object_put(obj); 38 + if (ret) 39 + return ret; 40 + 41 + *handle_p = handle; 42 + *size_p = size; 43 + return 0; 44 + } 45 + 46 + int 47 + i915_gem_dumb_create(struct drm_file *file, 48 + struct drm_device *dev, 49 + struct drm_mode_create_dumb *args) 50 + { 51 + enum intel_memory_type mem_type; 52 + int cpp = DIV_ROUND_UP(args->bpp, 8); 53 + u32 format; 54 + 55 + switch (cpp) { 56 + case 1: 57 + format = DRM_FORMAT_C8; 58 + break; 59 + case 2: 60 + format = DRM_FORMAT_RGB565; 61 + break; 62 + case 4: 63 + format = DRM_FORMAT_XRGB8888; 64 + break; 65 + default: 66 + return -EINVAL; 67 + } 68 + 69 + /* have to work out size/pitch and return them */ 70 + args->pitch = ALIGN(args->width * cpp, 64); 71 + 72 + /* align stride to page size so that we can remap */ 73 + if (args->pitch > intel_plane_fb_max_stride(to_i915(dev), format, 74 + DRM_FORMAT_MOD_LINEAR)) 75 + args->pitch = ALIGN(args->pitch, 4096); 76 + 77 + if (args->pitch < args->width) 78 + return -EINVAL; 79 + 80 + args->size = mul_u32_u32(args->pitch, args->height); 81 + 82 + mem_type = INTEL_MEMORY_SYSTEM; 83 + if (HAS_LMEM(to_i915(dev))) 84 + mem_type = INTEL_MEMORY_LOCAL; 85 + 86 + return i915_gem_create(file, 87 + intel_memory_region_by_type(to_i915(dev), 88 + mem_type), 89 + &args->size, &args->handle); 90 + } 91 + 92 + /** 93 + * Creates a new mm object and returns a handle to it. 94 + * @dev: drm device pointer 95 + * @data: ioctl data blob 96 + * @file: drm file pointer 97 + */ 98 + int 99 + i915_gem_create_ioctl(struct drm_device *dev, void *data, 100 + struct drm_file *file) 101 + { 102 + struct drm_i915_private *i915 = to_i915(dev); 103 + struct drm_i915_gem_create *args = data; 104 + 105 + i915_gem_flush_free_objects(i915); 106 + 107 + return i915_gem_create(file, 108 + intel_memory_region_by_type(i915, 109 + INTEL_MEMORY_SYSTEM), 110 + &args->size, &args->handle); 111 + }
-102
drivers/gpu/drm/i915/i915_gem.c
··· 180 180 } 181 181 182 182 static int 183 - i915_gem_create(struct drm_file *file, 184 - struct intel_memory_region *mr, 185 - u64 *size_p, 186 - u32 *handle_p) 187 - { 188 - struct drm_i915_gem_object *obj; 189 - u32 handle; 190 - u64 size; 191 - int ret; 192 - 193 - GEM_BUG_ON(!is_power_of_2(mr->min_page_size)); 194 - size = round_up(*size_p, mr->min_page_size); 195 - if (size == 0) 196 - return -EINVAL; 197 - 198 - /* For most of the ABI (e.g. mmap) we think in system pages */ 199 - GEM_BUG_ON(!IS_ALIGNED(size, PAGE_SIZE)); 200 - 201 - /* Allocate the new object */ 202 - obj = i915_gem_object_create_region(mr, size, 0); 203 - if (IS_ERR(obj)) 204 - return PTR_ERR(obj); 205 - 206 - ret = drm_gem_handle_create(file, &obj->base, &handle); 207 - /* drop reference from allocate - handle holds it now */ 208 - i915_gem_object_put(obj); 209 - if (ret) 210 - return ret; 211 - 212 - *handle_p = handle; 213 - *size_p = size; 214 - return 0; 215 - } 216 - 217 - int 218 - i915_gem_dumb_create(struct drm_file *file, 219 - struct drm_device *dev, 220 - struct drm_mode_create_dumb *args) 221 - { 222 - enum intel_memory_type mem_type; 223 - int cpp = DIV_ROUND_UP(args->bpp, 8); 224 - u32 format; 225 - 226 - switch (cpp) { 227 - case 1: 228 - format = DRM_FORMAT_C8; 229 - break; 230 - case 2: 231 - format = DRM_FORMAT_RGB565; 232 - break; 233 - case 4: 234 - format = DRM_FORMAT_XRGB8888; 235 - break; 236 - default: 237 - return -EINVAL; 238 - } 239 - 240 - /* have to work out size/pitch and return them */ 241 - args->pitch = ALIGN(args->width * cpp, 64); 242 - 243 - /* align stride to page size so that we can remap */ 244 - if (args->pitch > intel_plane_fb_max_stride(to_i915(dev), format, 245 - DRM_FORMAT_MOD_LINEAR)) 246 - args->pitch = ALIGN(args->pitch, 4096); 247 - 248 - if (args->pitch < args->width) 249 - return -EINVAL; 250 - 251 - args->size = mul_u32_u32(args->pitch, args->height); 252 - 253 - mem_type = INTEL_MEMORY_SYSTEM; 254 - if (HAS_LMEM(to_i915(dev))) 255 - mem_type = INTEL_MEMORY_LOCAL; 256 - 257 - return i915_gem_create(file, 258 - intel_memory_region_by_type(to_i915(dev), 259 - mem_type), 260 - &args->size, &args->handle); 261 - } 262 - 263 - /** 264 - * Creates a new mm object and returns a handle to it. 265 - * @dev: drm device pointer 266 - * @data: ioctl data blob 267 - * @file: drm file pointer 268 - */ 269 - int 270 - i915_gem_create_ioctl(struct drm_device *dev, void *data, 271 - struct drm_file *file) 272 - { 273 - struct drm_i915_private *i915 = to_i915(dev); 274 - struct drm_i915_gem_create *args = data; 275 - 276 - i915_gem_flush_free_objects(i915); 277 - 278 - return i915_gem_create(file, 279 - intel_memory_region_by_type(i915, 280 - INTEL_MEMORY_SYSTEM), 281 - &args->size, &args->handle); 282 - } 283 - 284 - static int 285 183 shmem_pread(struct page *page, int offset, int len, char __user *user_data, 286 184 bool needs_clflush) 287 185 {