Rev 1404 | Rev 1986 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 1404 | Rev 1963 | ||
---|---|---|---|
Line 62... | Line 62... | ||
62 | } |
62 | } |
63 | /* At least align on page size */ |
63 | /* At least align on page size */ |
64 | if (alignment < PAGE_SIZE) { |
64 | if (alignment < PAGE_SIZE) { |
65 | alignment = PAGE_SIZE; |
65 | alignment = PAGE_SIZE; |
66 | } |
66 | } |
67 | r = radeon_fb_bo_create(rdev, gobj, size, kernel, initial_domain, &robj); |
67 | r = radeon_bo_create(rdev, gobj, size, alignment, kernel, initial_domain, &robj); |
68 | if (r) { |
68 | if (r) { |
69 | DRM_ERROR("Failed to allocate GEM object (%d, %d, %u)\n", |
69 | DRM_ERROR("Failed to allocate GEM object (%d, %d, %u)\n", |
70 | size, initial_domain, alignment); |
70 | size, initial_domain, alignment); |
71 | return r; |
71 | return r; |
72 | } |
72 | } |
Line 151... | Line 151... | ||
151 | { |
151 | { |
152 | struct radeon_device *rdev = dev->dev_private; |
152 | struct radeon_device *rdev = dev->dev_private; |
153 | struct drm_radeon_gem_info *args = data; |
153 | struct drm_radeon_gem_info *args = data; |
Line 154... | Line 154... | ||
154 | 154 | ||
155 | args->vram_size = rdev->mc.real_vram_size; |
155 | args->vram_size = rdev->mc.real_vram_size; |
- | 156 | args->vram_visible = rdev->mc.real_vram_size; |
|
- | 157 | if (rdev->stollen_vga_memory) |
|
156 | /* FIXME: report somethings that makes sense */ |
158 | args->vram_visible -= radeon_bo_size(rdev->stollen_vga_memory); |
157 | args->vram_visible = rdev->mc.real_vram_size - (4 * 1024 * 1024); |
159 | args->vram_visible -= radeon_fbdev_total_size(rdev); |
- | 160 | args->gart_size = rdev->mc.gtt_size - rdev->cp.ring_size - 4096 - |
|
158 | args->gart_size = rdev->mc.gtt_size; |
161 | RADEON_IB_POOL_SIZE*64*1024; |
159 | return 0; |
162 | return 0; |
Line 160... | Line 163... | ||
160 | } |
163 | } |
161 | 164 | ||
Line 191... | Line 194... | ||
191 | false, &gobj); |
194 | false, &gobj); |
192 | if (r) { |
195 | if (r) { |
193 | return r; |
196 | return r; |
194 | } |
197 | } |
195 | r = drm_gem_handle_create(filp, gobj, &handle); |
198 | r = drm_gem_handle_create(filp, gobj, &handle); |
- | 199 | /* drop reference from allocate - handle holds it now */ |
|
- | 200 | drm_gem_object_unreference_unlocked(gobj); |
|
196 | if (r) { |
201 | if (r) { |
197 | mutex_lock(&dev->struct_mutex); |
- | |
198 | drm_gem_object_unreference(gobj); |
- | |
199 | mutex_unlock(&dev->struct_mutex); |
- | |
200 | return r; |
202 | return r; |
201 | } |
203 | } |
202 | mutex_lock(&dev->struct_mutex); |
- | |
203 | drm_gem_object_handle_unreference(gobj); |
- | |
204 | mutex_unlock(&dev->struct_mutex); |
- | |
205 | args->handle = handle; |
204 | args->handle = handle; |
206 | return 0; |
205 | return 0; |
207 | } |
206 | } |
Line 208... | Line 207... | ||
208 | 207 | ||
Line 220... | Line 219... | ||
220 | * just make sure the buffer is finished with */ |
219 | * just make sure the buffer is finished with */ |
Line 221... | Line 220... | ||
221 | 220 | ||
222 | /* just do a BO wait for now */ |
221 | /* just do a BO wait for now */ |
223 | gobj = drm_gem_object_lookup(dev, filp, args->handle); |
222 | gobj = drm_gem_object_lookup(dev, filp, args->handle); |
224 | if (gobj == NULL) { |
223 | if (gobj == NULL) { |
225 | return -EINVAL; |
224 | return -ENOENT; |
226 | } |
225 | } |
Line 227... | Line 226... | ||
227 | robj = gobj->driver_private; |
226 | robj = gobj->driver_private; |
Line 228... | Line -... | ||
228 | - | ||
229 | r = radeon_gem_set_domain(gobj, args->read_domains, args->write_domain); |
227 | |
230 | - | ||
231 | mutex_lock(&dev->struct_mutex); |
228 | r = radeon_gem_set_domain(gobj, args->read_domains, args->write_domain); |
232 | drm_gem_object_unreference(gobj); |
229 | |
Line 233... | Line 230... | ||
233 | mutex_unlock(&dev->struct_mutex); |
230 | drm_gem_object_unreference_unlocked(gobj); |
234 | return r; |
231 | return r; |
Line 241... | Line 238... | ||
241 | struct drm_gem_object *gobj; |
238 | struct drm_gem_object *gobj; |
242 | struct radeon_bo *robj; |
239 | struct radeon_bo *robj; |
Line 243... | Line 240... | ||
243 | 240 | ||
244 | gobj = drm_gem_object_lookup(dev, filp, args->handle); |
241 | gobj = drm_gem_object_lookup(dev, filp, args->handle); |
245 | if (gobj == NULL) { |
242 | if (gobj == NULL) { |
246 | return -EINVAL; |
243 | return -ENOENT; |
247 | } |
244 | } |
248 | robj = gobj->driver_private; |
245 | robj = gobj->driver_private; |
249 | args->addr_ptr = radeon_bo_mmap_offset(robj); |
- | |
250 | mutex_lock(&dev->struct_mutex); |
246 | args->addr_ptr = radeon_bo_mmap_offset(robj); |
251 | drm_gem_object_unreference(gobj); |
- | |
252 | mutex_unlock(&dev->struct_mutex); |
247 | drm_gem_object_unreference_unlocked(gobj); |
253 | return 0; |
248 | return 0; |
Line 254... | Line 249... | ||
254 | } |
249 | } |
255 | 250 | ||
Line 262... | Line 257... | ||
262 | int r; |
257 | int r; |
263 | uint32_t cur_placement = 0; |
258 | uint32_t cur_placement = 0; |
Line 264... | Line 259... | ||
264 | 259 | ||
265 | gobj = drm_gem_object_lookup(dev, filp, args->handle); |
260 | gobj = drm_gem_object_lookup(dev, filp, args->handle); |
266 | if (gobj == NULL) { |
261 | if (gobj == NULL) { |
267 | return -EINVAL; |
262 | return -ENOENT; |
268 | } |
263 | } |
269 | robj = gobj->driver_private; |
264 | robj = gobj->driver_private; |
270 | r = radeon_bo_wait(robj, &cur_placement, true); |
265 | r = radeon_bo_wait(robj, &cur_placement, true); |
271 | switch (cur_placement) { |
266 | switch (cur_placement) { |
Line 278... | Line 273... | ||
278 | case TTM_PL_SYSTEM: |
273 | case TTM_PL_SYSTEM: |
279 | args->domain = RADEON_GEM_DOMAIN_CPU; |
274 | args->domain = RADEON_GEM_DOMAIN_CPU; |
280 | default: |
275 | default: |
281 | break; |
276 | break; |
282 | } |
277 | } |
283 | mutex_lock(&dev->struct_mutex); |
- | |
284 | drm_gem_object_unreference(gobj); |
278 | drm_gem_object_unreference_unlocked(gobj); |
285 | mutex_unlock(&dev->struct_mutex); |
- | |
286 | return r; |
279 | return r; |
287 | } |
280 | } |
Line 288... | Line 281... | ||
288 | 281 | ||
289 | int radeon_gem_wait_idle_ioctl(struct drm_device *dev, void *data, |
282 | int radeon_gem_wait_idle_ioctl(struct drm_device *dev, void *data, |
Line 294... | Line 287... | ||
294 | struct radeon_bo *robj; |
287 | struct radeon_bo *robj; |
295 | int r; |
288 | int r; |
Line 296... | Line 289... | ||
296 | 289 | ||
297 | gobj = drm_gem_object_lookup(dev, filp, args->handle); |
290 | gobj = drm_gem_object_lookup(dev, filp, args->handle); |
298 | if (gobj == NULL) { |
291 | if (gobj == NULL) { |
299 | return -EINVAL; |
292 | return -ENOENT; |
300 | } |
293 | } |
301 | robj = gobj->driver_private; |
294 | robj = gobj->driver_private; |
302 | r = radeon_bo_wait(robj, NULL, false); |
295 | r = radeon_bo_wait(robj, NULL, false); |
303 | /* callback hw specific functions if any */ |
296 | /* callback hw specific functions if any */ |
304 | if (robj->rdev->asic->ioctl_wait_idle) |
297 | if (robj->rdev->asic->ioctl_wait_idle) |
305 | robj->rdev->asic->ioctl_wait_idle(robj->rdev, robj); |
- | |
306 | mutex_lock(&dev->struct_mutex); |
298 | robj->rdev->asic->ioctl_wait_idle(robj->rdev, robj); |
307 | drm_gem_object_unreference(gobj); |
- | |
308 | mutex_unlock(&dev->struct_mutex); |
299 | drm_gem_object_unreference_unlocked(gobj); |
309 | return r; |
300 | return r; |
Line 310... | Line 301... | ||
310 | } |
301 | } |
311 | 302 | ||
Line 318... | Line 309... | ||
318 | int r = 0; |
309 | int r = 0; |
Line 319... | Line 310... | ||
319 | 310 | ||
320 | DRM_DEBUG("%d \n", args->handle); |
311 | DRM_DEBUG("%d \n", args->handle); |
321 | gobj = drm_gem_object_lookup(dev, filp, args->handle); |
312 | gobj = drm_gem_object_lookup(dev, filp, args->handle); |
322 | if (gobj == NULL) |
313 | if (gobj == NULL) |
323 | return -EINVAL; |
314 | return -ENOENT; |
324 | robj = gobj->driver_private; |
315 | robj = gobj->driver_private; |
325 | r = radeon_bo_set_tiling_flags(robj, args->tiling_flags, args->pitch); |
- | |
326 | mutex_lock(&dev->struct_mutex); |
316 | r = radeon_bo_set_tiling_flags(robj, args->tiling_flags, args->pitch); |
327 | drm_gem_object_unreference(gobj); |
- | |
328 | mutex_unlock(&dev->struct_mutex); |
317 | drm_gem_object_unreference_unlocked(gobj); |
329 | return r; |
318 | return r; |
Line 330... | Line 319... | ||
330 | } |
319 | } |