Skip to content

Commit 357814f

Browse files
committed
drm/i915: rework gem_create flow for upcoming extensions
With the upcoming gem_create_ext we want to be able create a "vanilla" object upfront and pass that directly to the extensions, before actually initialising the object. Functionally this should be the same expect we now feed the object into the lower-level region specific init_object. Signed-off-by: Matthew Auld <[email protected]> Cc: Joonas Lahtinen <[email protected]> Cc: Thomas Hellström <[email protected]> Cc: Daniele Ceraolo Spurio <[email protected]> Cc: Lionel Landwerlin <[email protected]> Cc: Jon Bloomfield <[email protected]> Cc: Jordan Justen <[email protected]> Cc: Daniel Vetter <[email protected]> Cc: Kenneth Graunke <[email protected]> Cc: Jason Ekstrand <[email protected]> Cc: Dave Airlie <[email protected]> Cc: [email protected] Cc: [email protected] Reviewed-by: Kenneth Graunke <[email protected]> Link: https://patchwork.freedesktop.org/patch/msgid/[email protected]
1 parent 7102172 commit 357814f

File tree

1 file changed

+65
-27
lines changed

1 file changed

+65
-27
lines changed

drivers/gpu/drm/i915/gem/i915_gem_create.c

Lines changed: 65 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -7,41 +7,51 @@
77
#include "gem/i915_gem_region.h"
88

99
#include "i915_drv.h"
10+
#include "i915_trace.h"
11+
12+
static int i915_gem_publish(struct drm_i915_gem_object *obj,
13+
struct drm_file *file,
14+
u64 *size_p,
15+
u32 *handle_p)
16+
{
17+
u64 size = obj->base.size;
18+
int ret;
19+
20+
ret = drm_gem_handle_create(file, &obj->base, handle_p);
21+
/* drop reference from allocate - handle holds it now */
22+
i915_gem_object_put(obj);
23+
if (ret)
24+
return ret;
25+
26+
*size_p = size;
27+
return 0;
28+
}
1029

1130
static int
12-
i915_gem_create(struct drm_file *file,
13-
struct intel_memory_region *mr,
14-
u64 *size_p,
15-
u32 *handle_p)
31+
i915_gem_setup(struct drm_i915_gem_object *obj,
32+
struct intel_memory_region *mr,
33+
u64 size)
1634
{
17-
struct drm_i915_gem_object *obj;
18-
u32 handle;
19-
u64 size;
2035
int ret;
2136

2237
GEM_BUG_ON(!is_power_of_2(mr->min_page_size));
23-
size = round_up(*size_p, mr->min_page_size);
38+
size = round_up(size, mr->min_page_size);
2439
if (size == 0)
2540
return -EINVAL;
2641

2742
/* For most of the ABI (e.g. mmap) we think in system pages */
2843
GEM_BUG_ON(!IS_ALIGNED(size, PAGE_SIZE));
2944

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-
GEM_BUG_ON(size != obj->base.size);
45+
if (i915_gem_object_size_2big(size))
46+
return -E2BIG;
3647

37-
ret = drm_gem_handle_create(file, &obj->base, &handle);
38-
/* drop reference from allocate - handle holds it now */
39-
i915_gem_object_put(obj);
48+
ret = mr->ops->init_object(mr, obj, size, 0);
4049
if (ret)
4150
return ret;
4251

43-
*handle_p = handle;
44-
*size_p = size;
52+
GEM_BUG_ON(size != obj->base.size);
53+
54+
trace_i915_gem_object_create(obj);
4555
return 0;
4656
}
4757

@@ -50,9 +60,11 @@ i915_gem_dumb_create(struct drm_file *file,
5060
struct drm_device *dev,
5161
struct drm_mode_create_dumb *args)
5262
{
63+
struct drm_i915_gem_object *obj;
5364
enum intel_memory_type mem_type;
5465
int cpp = DIV_ROUND_UP(args->bpp, 8);
5566
u32 format;
67+
int ret;
5668

5769
switch (cpp) {
5870
case 1:
@@ -85,10 +97,22 @@ i915_gem_dumb_create(struct drm_file *file,
8597
if (HAS_LMEM(to_i915(dev)))
8698
mem_type = INTEL_MEMORY_LOCAL;
8799

88-
return i915_gem_create(file,
89-
intel_memory_region_by_type(to_i915(dev),
90-
mem_type),
91-
&args->size, &args->handle);
100+
obj = i915_gem_object_alloc();
101+
if (!obj)
102+
return -ENOMEM;
103+
104+
ret = i915_gem_setup(obj,
105+
intel_memory_region_by_type(to_i915(dev),
106+
mem_type),
107+
args->size);
108+
if (ret)
109+
goto object_free;
110+
111+
return i915_gem_publish(obj, file, &args->size, &args->handle);
112+
113+
object_free:
114+
i915_gem_object_free(obj);
115+
return ret;
92116
}
93117

94118
/**
@@ -103,11 +127,25 @@ i915_gem_create_ioctl(struct drm_device *dev, void *data,
103127
{
104128
struct drm_i915_private *i915 = to_i915(dev);
105129
struct drm_i915_gem_create *args = data;
130+
struct drm_i915_gem_object *obj;
131+
int ret;
106132

107133
i915_gem_flush_free_objects(i915);
108134

109-
return i915_gem_create(file,
110-
intel_memory_region_by_type(i915,
111-
INTEL_MEMORY_SYSTEM),
112-
&args->size, &args->handle);
135+
obj = i915_gem_object_alloc();
136+
if (!obj)
137+
return -ENOMEM;
138+
139+
ret = i915_gem_setup(obj,
140+
intel_memory_region_by_type(i915,
141+
INTEL_MEMORY_SYSTEM),
142+
args->size);
143+
if (ret)
144+
goto object_free;
145+
146+
return i915_gem_publish(obj, file, &args->size, &args->handle);
147+
148+
object_free:
149+
i915_gem_object_free(obj);
150+
return ret;
113151
}

0 commit comments

Comments
 (0)