Rev 1963 | Rev 2997 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 1963 | Rev 1986 | ||
---|---|---|---|
Line 36... | Line 36... | ||
36 | return 0; |
36 | return 0; |
37 | } |
37 | } |
Line 38... | Line 38... | ||
38 | 38 | ||
39 | void radeon_gem_object_free(struct drm_gem_object *gobj) |
39 | void radeon_gem_object_free(struct drm_gem_object *gobj) |
40 | { |
40 | { |
Line 41... | Line -... | ||
41 | struct radeon_bo *robj = gobj->driver_private; |
- | |
42 | 41 | struct radeon_bo *robj = gem_to_radeon_bo(gobj); |
|
43 | gobj->driver_private = NULL; |
42 | |
44 | if (robj) { |
43 | if (robj) { |
45 | radeon_bo_unref(&robj); |
44 | radeon_bo_unref(&robj); |
Line 46... | Line 45... | ||
46 | } |
45 | } |
47 | } |
46 | } |
48 | 47 | ||
49 | int radeon_gem_object_create(struct radeon_device *rdev, int size, |
48 | int radeon_gem_object_create(struct radeon_device *rdev, int size, |
50 | int alignment, int initial_domain, |
49 | int alignment, int initial_domain, |
51 | bool discardable, bool kernel, |
- | |
52 | struct drm_gem_object **obj) |
50 | bool discardable, bool kernel, |
53 | { |
51 | struct drm_gem_object **obj) |
Line 54... | Line 52... | ||
54 | struct drm_gem_object *gobj; |
52 | { |
55 | struct radeon_bo *robj; |
- | |
56 | int r; |
- | |
57 | - | ||
58 | *obj = NULL; |
- | |
59 | gobj = drm_gem_object_alloc(rdev->ddev, size); |
53 | struct radeon_bo *robj; |
60 | if (!gobj) { |
54 | int r; |
61 | return -ENOMEM; |
55 | |
62 | } |
56 | *obj = NULL; |
63 | /* At least align on page size */ |
57 | /* At least align on page size */ |
64 | if (alignment < PAGE_SIZE) { |
58 | if (alignment < PAGE_SIZE) { |
- | 59 | alignment = PAGE_SIZE; |
|
65 | alignment = PAGE_SIZE; |
60 | } |
66 | } |
61 | r = radeon_bo_create(rdev, size, alignment, kernel, initial_domain, &robj); |
67 | r = radeon_bo_create(rdev, gobj, size, alignment, kernel, initial_domain, &robj); |
62 | if (r) { |
68 | if (r) { |
63 | if (r != -ERESTARTSYS) |
69 | DRM_ERROR("Failed to allocate GEM object (%d, %d, %u)\n", |
64 | DRM_ERROR("Failed to allocate GEM object (%d, %d, %u, %d)\n", |
- | 65 | size, initial_domain, alignment, r); |
|
70 | size, initial_domain, alignment); |
66 | return r; |
- | 67 | } |
|
- | 68 | *obj = &robj->gem_base; |
|
- | 69 | ||
71 | return r; |
70 | mutex_lock(&rdev->gem.mutex); |
72 | } |
71 | list_add_tail(&robj->list, &rdev->gem.objects); |
Line 73... | Line 72... | ||
73 | gobj->driver_private = robj; |
72 | mutex_unlock(&rdev->gem.mutex); |
74 | *obj = gobj; |
73 | |
75 | return 0; |
74 | return 0; |
76 | } |
75 | } |
77 | 76 | ||
Line 78... | Line 77... | ||
78 | int radeon_gem_object_pin(struct drm_gem_object *obj, uint32_t pin_domain, |
77 | int radeon_gem_object_pin(struct drm_gem_object *obj, uint32_t pin_domain, |
79 | uint64_t *gpu_addr) |
78 | uint64_t *gpu_addr) |
80 | { |
79 | { |
Line 89... | Line 88... | ||
89 | return r; |
88 | return r; |
90 | } |
89 | } |
Line 91... | Line 90... | ||
91 | 90 | ||
92 | void radeon_gem_object_unpin(struct drm_gem_object *obj) |
91 | void radeon_gem_object_unpin(struct drm_gem_object *obj) |
93 | { |
92 | { |
94 | struct radeon_bo *robj = obj->driver_private; |
93 | struct radeon_bo *robj = gem_to_radeon_bo(obj); |
Line 95... | Line 94... | ||
95 | int r; |
94 | int r; |
96 | 95 | ||
97 | r = radeon_bo_reserve(robj, false); |
96 | r = radeon_bo_reserve(robj, false); |
Line 107... | Line 106... | ||
107 | struct radeon_bo *robj; |
106 | struct radeon_bo *robj; |
108 | uint32_t domain; |
107 | uint32_t domain; |
109 | int r; |
108 | int r; |
Line 110... | Line 109... | ||
110 | 109 | ||
111 | /* FIXME: reeimplement */ |
110 | /* FIXME: reeimplement */ |
112 | robj = gobj->driver_private; |
111 | robj = gem_to_radeon_bo(gobj); |
113 | /* work out where to validate the buffer to */ |
112 | /* work out where to validate the buffer to */ |
114 | domain = wdomain; |
113 | domain = wdomain; |
115 | if (!domain) { |
114 | if (!domain) { |
116 | domain = rdomain; |
115 | domain = rdomain; |
Line 149... | Line 148... | ||
149 | int radeon_gem_info_ioctl(struct drm_device *dev, void *data, |
148 | int radeon_gem_info_ioctl(struct drm_device *dev, void *data, |
150 | struct drm_file *filp) |
149 | struct drm_file *filp) |
151 | { |
150 | { |
152 | struct radeon_device *rdev = dev->dev_private; |
151 | struct radeon_device *rdev = dev->dev_private; |
153 | struct drm_radeon_gem_info *args = data; |
152 | struct drm_radeon_gem_info *args = data; |
- | 153 | struct ttm_mem_type_manager *man; |
|
- | 154 | ||
- | 155 | man = &rdev->mman.bdev.man[TTM_PL_VRAM]; |
|
Line 154... | Line 156... | ||
154 | 156 | ||
155 | args->vram_size = rdev->mc.real_vram_size; |
157 | args->vram_size = rdev->mc.real_vram_size; |
156 | args->vram_visible = rdev->mc.real_vram_size; |
158 | args->vram_visible = (u64)man->size << PAGE_SHIFT; |
157 | if (rdev->stollen_vga_memory) |
159 | if (rdev->stollen_vga_memory) |
158 | args->vram_visible -= radeon_bo_size(rdev->stollen_vga_memory); |
160 | args->vram_visible -= radeon_bo_size(rdev->stollen_vga_memory); |
159 | args->vram_visible -= radeon_fbdev_total_size(rdev); |
161 | args->vram_visible -= radeon_fbdev_total_size(rdev); |
160 | args->gart_size = rdev->mc.gtt_size - rdev->cp.ring_size - 4096 - |
162 | args->gart_size = rdev->mc.gtt_size - rdev->cp.ring_size - 4096 - |
Line 221... | Line 223... | ||
221 | /* just do a BO wait for now */ |
223 | /* just do a BO wait for now */ |
222 | gobj = drm_gem_object_lookup(dev, filp, args->handle); |
224 | gobj = drm_gem_object_lookup(dev, filp, args->handle); |
223 | if (gobj == NULL) { |
225 | if (gobj == NULL) { |
224 | return -ENOENT; |
226 | return -ENOENT; |
225 | } |
227 | } |
226 | robj = gobj->driver_private; |
228 | robj = gem_to_radeon_bo(gobj); |
Line 227... | Line 229... | ||
227 | 229 | ||
Line 228... | Line 230... | ||
228 | r = radeon_gem_set_domain(gobj, args->read_domains, args->write_domain); |
230 | r = radeon_gem_set_domain(gobj, args->read_domains, args->write_domain); |
229 | 231 | ||
230 | drm_gem_object_unreference_unlocked(gobj); |
232 | drm_gem_object_unreference_unlocked(gobj); |
Line 231... | Line 233... | ||
231 | return r; |
233 | return r; |
232 | } |
234 | } |
- | 235 | ||
233 | 236 | int radeon_mode_dumb_mmap(struct drm_file *filp, |
|
234 | int radeon_gem_mmap_ioctl(struct drm_device *dev, void *data, |
- | |
235 | struct drm_file *filp) |
237 | struct drm_device *dev, |
236 | { |
238 | uint32_t handle, uint64_t *offset_p) |
Line 237... | Line 239... | ||
237 | struct drm_radeon_gem_mmap *args = data; |
239 | { |
238 | struct drm_gem_object *gobj; |
240 | struct drm_gem_object *gobj; |
239 | struct radeon_bo *robj; |
241 | struct radeon_bo *robj; |
240 | 242 | ||
241 | gobj = drm_gem_object_lookup(dev, filp, args->handle); |
243 | gobj = drm_gem_object_lookup(dev, filp, handle); |
242 | if (gobj == NULL) { |
244 | if (gobj == NULL) { |
243 | return -ENOENT; |
245 | return -ENOENT; |
244 | } |
246 | } |
245 | robj = gobj->driver_private; |
247 | robj = gem_to_radeon_bo(gobj); |
Line -... | Line 248... | ||
- | 248 | *offset_p = radeon_bo_mmap_offset(robj); |
|
- | 249 | drm_gem_object_unreference_unlocked(gobj); |
|
- | 250 | return 0; |
|
- | 251 | } |
|
- | 252 | ||
- | 253 | int radeon_gem_mmap_ioctl(struct drm_device *dev, void *data, |
|
- | 254 | struct drm_file *filp) |
|
- | 255 | { |
|
246 | args->addr_ptr = radeon_bo_mmap_offset(robj); |
256 | struct drm_radeon_gem_mmap *args = data; |
247 | drm_gem_object_unreference_unlocked(gobj); |
257 | |
248 | return 0; |
258 | return radeon_mode_dumb_mmap(filp, dev, args->handle, &args->addr_ptr); |
249 | } |
259 | } |
250 | 260 | ||
Line 259... | Line 269... | ||
259 | 269 | ||
260 | gobj = drm_gem_object_lookup(dev, filp, args->handle); |
270 | gobj = drm_gem_object_lookup(dev, filp, args->handle); |
261 | if (gobj == NULL) { |
271 | if (gobj == NULL) { |
262 | return -ENOENT; |
272 | return -ENOENT; |
263 | } |
273 | } |
264 | robj = gobj->driver_private; |
274 | robj = gem_to_radeon_bo(gobj); |
265 | r = radeon_bo_wait(robj, &cur_placement, true); |
275 | r = radeon_bo_wait(robj, &cur_placement, true); |
266 | switch (cur_placement) { |
276 | switch (cur_placement) { |
267 | case TTM_PL_VRAM: |
277 | case TTM_PL_VRAM: |
268 | args->domain = RADEON_GEM_DOMAIN_VRAM; |
278 | args->domain = RADEON_GEM_DOMAIN_VRAM; |
Line 289... | Line 299... | ||
289 | 299 | ||
290 | gobj = drm_gem_object_lookup(dev, filp, args->handle); |
300 | gobj = drm_gem_object_lookup(dev, filp, args->handle); |
291 | if (gobj == NULL) { |
301 | if (gobj == NULL) { |
292 | return -ENOENT; |
302 | return -ENOENT; |
293 | } |
303 | } |
294 | robj = gobj->driver_private; |
304 | robj = gem_to_radeon_bo(gobj); |
295 | r = radeon_bo_wait(robj, NULL, false); |
305 | r = radeon_bo_wait(robj, NULL, false); |
296 | /* callback hw specific functions if any */ |
306 | /* callback hw specific functions if any */ |
297 | if (robj->rdev->asic->ioctl_wait_idle) |
307 | if (robj->rdev->asic->ioctl_wait_idle) |
298 | robj->rdev->asic->ioctl_wait_idle(robj->rdev, robj); |
308 | robj->rdev->asic->ioctl_wait_idle(robj->rdev, robj); |
Line 310... | Line 320... | ||
310 | 320 | ||
311 | DRM_DEBUG("%d \n", args->handle); |
321 | DRM_DEBUG("%d \n", args->handle); |
312 | gobj = drm_gem_object_lookup(dev, filp, args->handle); |
322 | gobj = drm_gem_object_lookup(dev, filp, args->handle); |
313 | if (gobj == NULL) |
323 | if (gobj == NULL) |
314 | return -ENOENT; |
324 | return -ENOENT; |
315 | robj = gobj->driver_private; |
325 | robj = gem_to_radeon_bo(gobj); |
316 | r = radeon_bo_set_tiling_flags(robj, args->tiling_flags, args->pitch); |
326 | r = radeon_bo_set_tiling_flags(robj, args->tiling_flags, args->pitch); |
317 | drm_gem_object_unreference_unlocked(gobj); |
327 | drm_gem_object_unreference_unlocked(gobj); |
318 | return r; |
328 | return r; |