Rev 1179 | Rev 1963 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 1179 | Rev 1404 | ||
---|---|---|---|
Line 28... | Line 28... | ||
28 | #include "drmP.h" |
28 | #include "drmP.h" |
29 | #include "drm.h" |
29 | #include "drm.h" |
30 | #include "radeon_drm.h" |
30 | #include "radeon_drm.h" |
31 | #include "radeon.h" |
31 | #include "radeon.h" |
Line 32... | Line -... | ||
32 | - | ||
33 | - | ||
34 | #define TTM_PL_SYSTEM 0 |
- | |
35 | #define TTM_PL_TT 1 |
- | |
36 | #define TTM_PL_VRAM 2 |
- | |
37 | #define TTM_PL_PRIV0 3 |
- | |
38 | #define TTM_PL_PRIV1 4 |
- | |
39 | #define TTM_PL_PRIV2 5 |
- | |
40 | #define TTM_PL_PRIV3 6 |
- | |
41 | #define TTM_PL_PRIV4 7 |
- | |
42 | #define TTM_PL_PRIV5 8 |
- | |
43 | #define TTM_PL_SWAPPED 15 |
- | |
44 | - | ||
45 | #define TTM_PL_FLAG_SYSTEM (1 << TTM_PL_SYSTEM) |
- | |
46 | #define TTM_PL_FLAG_TT (1 << TTM_PL_TT) |
- | |
47 | #define TTM_PL_FLAG_VRAM (1 << TTM_PL_VRAM) |
- | |
48 | #define TTM_PL_FLAG_PRIV0 (1 << TTM_PL_PRIV0) |
- | |
49 | #define TTM_PL_FLAG_PRIV1 (1 << TTM_PL_PRIV1) |
- | |
50 | #define TTM_PL_FLAG_PRIV2 (1 << TTM_PL_PRIV2) |
- | |
51 | #define TTM_PL_FLAG_PRIV3 (1 << TTM_PL_PRIV3) |
- | |
52 | #define TTM_PL_FLAG_PRIV4 (1 << TTM_PL_PRIV4) |
- | |
53 | #define TTM_PL_FLAG_PRIV5 (1 << TTM_PL_PRIV5) |
- | |
54 | #define TTM_PL_FLAG_SWAPPED (1 << TTM_PL_SWAPPED) |
- | |
55 | #define TTM_PL_MASK_MEM 0x0000FFFF |
- | |
56 | - | ||
57 | 32 | ||
58 | int radeon_gem_object_init(struct drm_gem_object *obj) |
33 | int radeon_gem_object_init(struct drm_gem_object *obj) |
59 | { |
34 | { |
60 | /* we do nothings here */ |
35 | /* we do nothings here */ |
61 | return 0; |
36 | return 0; |
Line 62... | Line 37... | ||
62 | } |
37 | } |
63 | 38 | ||
64 | void radeon_gem_object_free(struct drm_gem_object *gobj) |
39 | void radeon_gem_object_free(struct drm_gem_object *gobj) |
Line 65... | Line 40... | ||
65 | { |
40 | { |
66 | struct radeon_object *robj = gobj->driver_private; |
41 | struct radeon_bo *robj = gobj->driver_private; |
67 | 42 | ||
68 | gobj->driver_private = NULL; |
43 | gobj->driver_private = NULL; |
69 | if (robj) { |
44 | if (robj) { |
Line 70... | Line 45... | ||
70 | // radeon_object_unref(&robj); |
45 | radeon_bo_unref(&robj); |
71 | } |
46 | } |
72 | } |
47 | } |
73 | - | ||
74 | int radeon_gem_object_create(struct radeon_device *rdev, int size, |
48 | |
75 | int alignment, int initial_domain, |
49 | int radeon_gem_object_create(struct radeon_device *rdev, int size, |
76 | bool discardable, bool kernel, |
50 | int alignment, int initial_domain, |
77 | bool interruptible, |
51 | bool discardable, bool kernel, |
78 | struct drm_gem_object **obj) |
52 | struct drm_gem_object **obj) |
Line 79... | Line 53... | ||
79 | { |
53 | { |
80 | struct drm_gem_object *gobj; |
54 | struct drm_gem_object *gobj; |
81 | struct radeon_object *robj; |
55 | struct radeon_bo *robj; |
Line 88... | Line 62... | ||
88 | } |
62 | } |
89 | /* At least align on page size */ |
63 | /* At least align on page size */ |
90 | if (alignment < PAGE_SIZE) { |
64 | if (alignment < PAGE_SIZE) { |
91 | alignment = PAGE_SIZE; |
65 | alignment = PAGE_SIZE; |
92 | } |
66 | } |
93 | r = radeon_object_create(rdev, gobj, size, kernel, initial_domain, |
67 | r = radeon_fb_bo_create(rdev, gobj, size, kernel, initial_domain, &robj); |
94 | interruptible, &robj); |
- | |
95 | if (r) { |
68 | if (r) { |
96 | DRM_ERROR("Failed to allocate GEM object (%d, %d, %u)\n", |
69 | DRM_ERROR("Failed to allocate GEM object (%d, %d, %u)\n", |
97 | size, initial_domain, alignment); |
70 | size, initial_domain, alignment); |
98 | // mutex_lock(&rdev->ddev->struct_mutex); |
- | |
99 | // drm_gem_object_unreference(gobj); |
- | |
100 | // mutex_unlock(&rdev->ddev->struct_mutex); |
- | |
101 | return r; |
71 | return r; |
102 | } |
72 | } |
103 | gobj->driver_private = robj; |
73 | gobj->driver_private = robj; |
104 | *obj = gobj; |
74 | *obj = gobj; |
105 | return 0; |
75 | return 0; |
106 | } |
76 | } |
Line 107... | Line 77... | ||
107 | 77 | ||
108 | int radeon_gem_object_pin(struct drm_gem_object *obj, uint32_t pin_domain, |
78 | int radeon_gem_object_pin(struct drm_gem_object *obj, uint32_t pin_domain, |
109 | uint64_t *gpu_addr) |
79 | uint64_t *gpu_addr) |
110 | { |
80 | { |
111 | struct radeon_object *robj = obj->driver_private; |
81 | struct radeon_bo *robj = obj->driver_private; |
Line 112... | Line -... | ||
112 | uint32_t flags; |
- | |
113 | 82 | int r; |
|
114 | switch (pin_domain) { |
83 | |
115 | case RADEON_GEM_DOMAIN_VRAM: |
84 | r = radeon_bo_reserve(robj, false); |
116 | flags = TTM_PL_FLAG_VRAM; |
85 | if (unlikely(r != 0)) |
117 | break; |
- | |
118 | case RADEON_GEM_DOMAIN_GTT: |
- | |
119 | flags = TTM_PL_FLAG_TT; |
- | |
120 | break; |
86 | return r; |
121 | default: |
87 | r = radeon_bo_pin(robj, pin_domain, gpu_addr); |
122 | flags = TTM_PL_FLAG_SYSTEM; |
- | |
123 | break; |
- | |
124 | } |
88 | radeon_bo_unreserve(robj); |
Line 125... | Line 89... | ||
125 | return radeon_object_pin(robj, flags, gpu_addr); |
89 | return r; |
126 | } |
90 | } |
127 | 91 | ||
- | 92 | void radeon_gem_object_unpin(struct drm_gem_object *obj) |
|
- | 93 | { |
|
- | 94 | struct radeon_bo *robj = obj->driver_private; |
|
- | 95 | int r; |
|
128 | void radeon_gem_object_unpin(struct drm_gem_object *obj) |
96 | |
- | 97 | r = radeon_bo_reserve(robj, false); |
|
- | 98 | if (likely(r == 0)) { |
|
129 | { |
99 | radeon_bo_unpin(robj); |
Line 130... | Line 100... | ||
130 | struct radeon_object *robj = obj->driver_private; |
100 | radeon_bo_unreserve(robj); |
131 | // radeon_object_unpin(robj); |
101 | } |
132 | } |
102 | } |
133 | 103 | ||
134 | int radeon_gem_set_domain(struct drm_gem_object *gobj, |
104 | int radeon_gem_set_domain(struct drm_gem_object *gobj, |
135 | uint32_t rdomain, uint32_t wdomain) |
105 | uint32_t rdomain, uint32_t wdomain) |
Line 136... | Line 106... | ||
136 | { |
106 | { |
137 | struct radeon_object *robj; |
107 | struct radeon_bo *robj; |
Line 150... | Line 120... | ||
150 | printk(KERN_WARNING "Set domain withou domain !\n"); |
120 | printk(KERN_WARNING "Set domain withou domain !\n"); |
151 | return 0; |
121 | return 0; |
152 | } |
122 | } |
153 | if (domain == RADEON_GEM_DOMAIN_CPU) { |
123 | if (domain == RADEON_GEM_DOMAIN_CPU) { |
154 | /* Asking for cpu access wait for object idle */ |
124 | /* Asking for cpu access wait for object idle */ |
155 | // r = radeon_object_wait(robj); |
125 | // r = radeon_bo_wait(robj, NULL, false); |
156 | if (r) { |
126 | // if (r) { |
157 | printk(KERN_ERR "Failed to wait for object !\n"); |
127 | // printk(KERN_ERR "Failed to wait for object !\n"); |
158 | return r; |
128 | // return r; |
159 | } |
129 | // } |
160 | } |
130 | } |
161 | return 0; |
131 | return 0; |
162 | } |
132 | } |
Line 163... | Line 133... | ||
163 | 133 | ||
Line 216... | Line 186... | ||
216 | 186 | ||
217 | /* create a gem object to contain this object in */ |
187 | /* create a gem object to contain this object in */ |
218 | args->size = roundup(args->size, PAGE_SIZE); |
188 | args->size = roundup(args->size, PAGE_SIZE); |
219 | r = radeon_gem_object_create(rdev, args->size, args->alignment, |
189 | r = radeon_gem_object_create(rdev, args->size, args->alignment, |
220 | args->initial_domain, false, |
190 | args->initial_domain, false, |
221 | false, true, &gobj); |
191 | false, &gobj); |
222 | if (r) { |
192 | if (r) { |
223 | return r; |
193 | return r; |
224 | } |
194 | } |
225 | r = drm_gem_handle_create(filp, gobj, &handle); |
195 | r = drm_gem_handle_create(filp, gobj, &handle); |
Line 241... | Line 211... | ||
241 | { |
211 | { |
242 | /* transition the BO to a domain - |
212 | /* transition the BO to a domain - |
243 | * just validate the BO into a certain domain */ |
213 | * just validate the BO into a certain domain */ |
244 | struct drm_radeon_gem_set_domain *args = data; |
214 | struct drm_radeon_gem_set_domain *args = data; |
245 | struct drm_gem_object *gobj; |
215 | struct drm_gem_object *gobj; |
246 | struct radeon_object *robj; |
216 | struct radeon_bo *robj; |
247 | int r; |
217 | int r; |
Line 248... | Line 218... | ||
248 | 218 | ||
249 | /* for now if someone requests domain CPU - |
219 | /* for now if someone requests domain CPU - |
Line 267... | Line 237... | ||
267 | int radeon_gem_mmap_ioctl(struct drm_device *dev, void *data, |
237 | int radeon_gem_mmap_ioctl(struct drm_device *dev, void *data, |
268 | struct drm_file *filp) |
238 | struct drm_file *filp) |
269 | { |
239 | { |
270 | struct drm_radeon_gem_mmap *args = data; |
240 | struct drm_radeon_gem_mmap *args = data; |
271 | struct drm_gem_object *gobj; |
241 | struct drm_gem_object *gobj; |
272 | struct radeon_object *robj; |
242 | struct radeon_bo *robj; |
273 | int r; |
- | |
Line 274... | Line 243... | ||
274 | 243 | ||
275 | gobj = drm_gem_object_lookup(dev, filp, args->handle); |
244 | gobj = drm_gem_object_lookup(dev, filp, args->handle); |
276 | if (gobj == NULL) { |
245 | if (gobj == NULL) { |
277 | return -EINVAL; |
246 | return -EINVAL; |
278 | } |
247 | } |
279 | robj = gobj->driver_private; |
248 | robj = gobj->driver_private; |
280 | r = radeon_object_mmap(robj, &args->addr_ptr); |
249 | args->addr_ptr = radeon_bo_mmap_offset(robj); |
281 | mutex_lock(&dev->struct_mutex); |
250 | mutex_lock(&dev->struct_mutex); |
282 | drm_gem_object_unreference(gobj); |
251 | drm_gem_object_unreference(gobj); |
283 | mutex_unlock(&dev->struct_mutex); |
252 | mutex_unlock(&dev->struct_mutex); |
284 | return r; |
253 | return 0; |
Line 285... | Line 254... | ||
285 | } |
254 | } |
286 | 255 | ||
287 | int radeon_gem_busy_ioctl(struct drm_device *dev, void *data, |
256 | int radeon_gem_busy_ioctl(struct drm_device *dev, void *data, |
- | 257 | struct drm_file *filp) |
|
- | 258 | { |
|
- | 259 | struct drm_radeon_gem_busy *args = data; |
|
- | 260 | struct drm_gem_object *gobj; |
|
- | 261 | struct radeon_bo *robj; |
|
- | 262 | int r; |
|
- | 263 | uint32_t cur_placement = 0; |
|
- | 264 | ||
- | 265 | gobj = drm_gem_object_lookup(dev, filp, args->handle); |
|
- | 266 | if (gobj == NULL) { |
|
- | 267 | return -EINVAL; |
|
- | 268 | } |
|
288 | struct drm_file *filp) |
269 | robj = gobj->driver_private; |
- | 270 | r = radeon_bo_wait(robj, &cur_placement, true); |
|
- | 271 | switch (cur_placement) { |
|
- | 272 | case TTM_PL_VRAM: |
|
- | 273 | args->domain = RADEON_GEM_DOMAIN_VRAM; |
|
- | 274 | break; |
|
- | 275 | case TTM_PL_TT: |
|
- | 276 | args->domain = RADEON_GEM_DOMAIN_GTT; |
|
- | 277 | break; |
|
- | 278 | case TTM_PL_SYSTEM: |
|
- | 279 | args->domain = RADEON_GEM_DOMAIN_CPU; |
|
- | 280 | default: |
|
- | 281 | break; |
|
- | 282 | } |
|
- | 283 | mutex_lock(&dev->struct_mutex); |
|
289 | { |
284 | drm_gem_object_unreference(gobj); |
290 | /* FIXME: implement */ |
285 | mutex_unlock(&dev->struct_mutex); |
Line 291... | Line 286... | ||
291 | return 0; |
286 | return r; |
292 | } |
287 | } |
293 | 288 | ||
294 | int radeon_gem_wait_idle_ioctl(struct drm_device *dev, void *data, |
289 | int radeon_gem_wait_idle_ioctl(struct drm_device *dev, void *data, |
295 | struct drm_file *filp) |
290 | struct drm_file *filp) |
296 | { |
291 | { |
297 | struct drm_radeon_gem_wait_idle *args = data; |
292 | struct drm_radeon_gem_wait_idle *args = data; |
Line 298... | Line 293... | ||
298 | struct drm_gem_object *gobj; |
293 | struct drm_gem_object *gobj; |
299 | struct radeon_object *robj; |
294 | struct radeon_bo *robj; |
300 | int r; |
295 | int r; |
301 | 296 | ||
302 | gobj = drm_gem_object_lookup(dev, filp, args->handle); |
297 | gobj = drm_gem_object_lookup(dev, filp, args->handle); |
303 | if (gobj == NULL) { |
298 | if (gobj == NULL) { |
- | 299 | return -EINVAL; |
|
- | 300 | } |
|
- | 301 | robj = gobj->driver_private; |
|
- | 302 | r = radeon_bo_wait(robj, NULL, false); |
|
- | 303 | /* callback hw specific functions if any */ |
|
- | 304 | if (robj->rdev->asic->ioctl_wait_idle) |
|
- | 305 | robj->rdev->asic->ioctl_wait_idle(robj->rdev, robj); |
|
- | 306 | mutex_lock(&dev->struct_mutex); |
|
- | 307 | drm_gem_object_unreference(gobj); |
|
- | 308 | mutex_unlock(&dev->struct_mutex); |
|
- | 309 | return r; |
|
- | 310 | } |
|
- | 311 | ||
- | 312 | int radeon_gem_set_tiling_ioctl(struct drm_device *dev, void *data, |
|
- | 313 | struct drm_file *filp) |
|
- | 314 | { |
|
- | 315 | struct drm_radeon_gem_set_tiling *args = data; |
|
- | 316 | struct drm_gem_object *gobj; |
|
- | 317 | struct radeon_bo *robj; |
|
- | 318 | int r = 0; |
|
- | 319 | ||
- | 320 | DRM_DEBUG("%d \n", args->handle); |
|
- | 321 | gobj = drm_gem_object_lookup(dev, filp, args->handle); |
|
304 | return -EINVAL; |
322 | if (gobj == NULL) |
305 | } |
323 | return -EINVAL; |
306 | robj = gobj->driver_private; |
324 | robj = gobj->driver_private; |
307 | r = radeon_object_wait(robj); |
325 | r = radeon_bo_set_tiling_flags(robj, args->tiling_flags, args->pitch); |
308 | mutex_lock(&dev->struct_mutex); |
326 | mutex_lock(&dev->struct_mutex); |