7
7
#include "gem/i915_gem_region.h"
8
8
9
9
#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
+ }
10
29
11
30
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 )
16
34
{
17
- struct drm_i915_gem_object * obj ;
18
- u32 handle ;
19
- u64 size ;
20
35
int ret ;
21
36
22
37
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 );
24
39
if (size == 0 )
25
40
return - EINVAL ;
26
41
27
42
/* For most of the ABI (e.g. mmap) we think in system pages */
28
43
GEM_BUG_ON (!IS_ALIGNED (size , PAGE_SIZE ));
29
44
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 ;
36
47
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 );
40
49
if (ret )
41
50
return ret ;
42
51
43
- * handle_p = handle ;
44
- * size_p = size ;
52
+ GEM_BUG_ON (size != obj -> base .size );
53
+
54
+ trace_i915_gem_object_create (obj );
45
55
return 0 ;
46
56
}
47
57
@@ -50,9 +60,11 @@ i915_gem_dumb_create(struct drm_file *file,
50
60
struct drm_device * dev ,
51
61
struct drm_mode_create_dumb * args )
52
62
{
63
+ struct drm_i915_gem_object * obj ;
53
64
enum intel_memory_type mem_type ;
54
65
int cpp = DIV_ROUND_UP (args -> bpp , 8 );
55
66
u32 format ;
67
+ int ret ;
56
68
57
69
switch (cpp ) {
58
70
case 1 :
@@ -85,10 +97,22 @@ i915_gem_dumb_create(struct drm_file *file,
85
97
if (HAS_LMEM (to_i915 (dev )))
86
98
mem_type = INTEL_MEMORY_LOCAL ;
87
99
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 ;
92
116
}
93
117
94
118
/**
@@ -103,11 +127,25 @@ i915_gem_create_ioctl(struct drm_device *dev, void *data,
103
127
{
104
128
struct drm_i915_private * i915 = to_i915 (dev );
105
129
struct drm_i915_gem_create * args = data ;
130
+ struct drm_i915_gem_object * obj ;
131
+ int ret ;
106
132
107
133
i915_gem_flush_free_objects (i915 );
108
134
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 ;
113
151
}
0 commit comments