diff options
-rw-r--r-- | linux-core/drm_bo.c | 304 | ||||
-rw-r--r-- | linux-core/drm_bo_move.c | 122 | ||||
-rw-r--r-- | linux-core/drm_ttm.c | 17 | ||||
-rw-r--r-- | linux-core/drm_ttm.h | 3 | ||||
-rw-r--r-- | linux-core/i915_buffer.c | 103 |
5 files changed, 244 insertions, 305 deletions
diff --git a/linux-core/drm_bo.c b/linux-core/drm_bo.c index 48cb5ef4..ed089096 100644 --- a/linux-core/drm_bo.c +++ b/linux-core/drm_bo.c @@ -49,12 +49,10 @@ * */ - - -static void drm_bo_destroy_locked(drm_buffer_object_t *bo); -static int drm_bo_setup_vm_locked(drm_buffer_object_t *bo); -static void drm_bo_takedown_vm_locked(drm_buffer_object_t *bo); -static void drm_bo_unmap_virtual(drm_buffer_object_t *bo); +static void drm_bo_destroy_locked(drm_buffer_object_t * bo); +static int drm_bo_setup_vm_locked(drm_buffer_object_t * bo); +static void drm_bo_takedown_vm_locked(drm_buffer_object_t * bo); +static void drm_bo_unmap_virtual(drm_buffer_object_t * bo); static inline uint32_t drm_bo_type_flags(unsigned type) { @@ -80,19 +78,17 @@ void drm_bo_add_to_lru(drm_buffer_object_t * bo) if (bo->mem.mm_node != bo->pinned_node) { man = &bo->dev->bm.man[bo->mem.mem_type]; list_add_tail(&bo->lru, &man->lru); - } else + } else INIT_LIST_HEAD(&bo->lru); } - -static int drm_bo_vm_pre_move(drm_buffer_object_t *bo, - int old_is_pci) +static int drm_bo_vm_pre_move(drm_buffer_object_t * bo, int old_is_pci) { #ifdef DRM_ODD_MM_COMPAT int ret; ret = drm_bo_lock_kmm(bo); - if (ret) + if (ret) return ret; drm_bo_unmap_virtual(bo); if (old_is_pci) @@ -103,11 +99,11 @@ static int drm_bo_vm_pre_move(drm_buffer_object_t *bo, return 0; } -static void drm_bo_vm_post_move(drm_buffer_object_t *bo) +static void drm_bo_vm_post_move(drm_buffer_object_t * bo) { #ifdef DRM_ODD_MM_COMPAT int ret; - + ret = drm_bo_remap_bound(bo); if (ret) { DRM_ERROR("Failed to remap a bound buffer object.\n" @@ -129,7 +125,7 @@ static int drm_bo_add_ttm(drm_buffer_object_t * bo) switch (bo->type) { case drm_bo_type_dc: - bo->ttm = drm_ttm_init(dev, bo->mem.num_pages << PAGE_SHIFT); + bo->ttm = drm_ttm_init(dev, bo->mem.num_pages << PAGE_SHIFT); if (!bo->ttm) ret = -ENOMEM; break; @@ -145,13 +141,9 @@ static int drm_bo_add_ttm(drm_buffer_object_t * bo) return ret; } - - - -static int drm_bo_handle_move_mem(drm_buffer_object_t *bo, - drm_bo_mem_reg_t *mem, - int evict, - int no_wait) +static int drm_bo_handle_move_mem(drm_buffer_object_t * bo, + drm_bo_mem_reg_t * mem, + int evict, int no_wait) { drm_device_t *dev = bo->dev; drm_buffer_manager_t *bm = &dev->bm; @@ -161,7 +153,6 @@ static int drm_bo_handle_move_mem(drm_buffer_object_t *bo, drm_mem_type_manager_t *new_man = &bm->man[mem->mem_type]; int ret = 0; - if (old_is_pci || new_is_pci) ret = drm_bo_vm_pre_move(bo, old_is_pci); if (ret) @@ -171,8 +162,7 @@ static int drm_bo_handle_move_mem(drm_buffer_object_t *bo, * Create and bind a ttm if required. */ - if (!(new_man->flags & _DRM_FLAG_MEMTYPE_FIXED) && - (bo->ttm == NULL)) { + if (!(new_man->flags & _DRM_FLAG_MEMTYPE_FIXED) && (bo->ttm == NULL)) { ret = drm_bo_add_ttm(bo); if (ret) goto out_err; @@ -185,7 +175,7 @@ static int drm_bo_handle_move_mem(drm_buffer_object_t *bo, goto out_err; } } - + if ((bo->mem.mem_type == DRM_BO_MEM_LOCAL) && bo->ttm == NULL) { drm_bo_mem_reg_t *old_mem = &bo->mem; @@ -195,15 +185,14 @@ static int drm_bo_handle_move_mem(drm_buffer_object_t *bo, *old_mem = *mem; mem->mm_node = NULL; old_mem->mask = save_mask; - DRM_FLAG_MASKED(save_flags, mem->flags, - DRM_BO_MASK_MEMTYPE); + DRM_FLAG_MASKED(save_flags, mem->flags, DRM_BO_MASK_MEMTYPE); } else if (!(old_man->flags & _DRM_FLAG_MEMTYPE_FIXED) && - !(new_man->flags & _DRM_FLAG_MEMTYPE_FIXED)) { + !(new_man->flags & _DRM_FLAG_MEMTYPE_FIXED)) { ret = drm_bo_move_ttm(bo, evict, no_wait, mem); - } else if (dev->driver->bo_driver->move) { + } else if (dev->driver->bo_driver->move) { ret = dev->driver->bo_driver->move(bo, evict, no_wait, mem); } else { @@ -217,13 +206,15 @@ static int drm_bo_handle_move_mem(drm_buffer_object_t *bo, if (old_is_pci || new_is_pci) drm_bo_vm_post_move(bo); - + if (bo->priv_flags & _DRM_BO_FLAG_EVICTED) { - ret = dev->driver->bo_driver->invalidate_caches(dev, bo->mem.flags); + ret = + dev->driver->bo_driver->invalidate_caches(dev, + bo->mem.flags); if (ret) DRM_ERROR("Can not flush read caches\n"); } - + DRM_FLAG_MASKED(bo->priv_flags, (evict) ? _DRM_BO_FLAG_EVICTED : 0, _DRM_BO_FLAG_EVICTED); @@ -233,10 +224,10 @@ static int drm_bo_handle_move_mem(drm_buffer_object_t *bo, return 0; -out_err: + out_err: if (old_is_pci || new_is_pci) drm_bo_vm_post_move(bo); - + new_man = &bm->man[bo->mem.mem_type]; if ((new_man->flags & _DRM_FLAG_MEMTYPE_FIXED) && bo->ttm) { drm_ttm_unbind(bo->ttm); @@ -282,8 +273,7 @@ int drm_bo_wait(drm_buffer_object_t * bo, int lazy, int ignore_signals, return 0; } -static int drm_bo_expire_fence(drm_buffer_object_t *bo, - int allow_errors) +static int drm_bo_expire_fence(drm_buffer_object_t * bo, int allow_errors) { drm_device_t *dev = bo->dev; drm_buffer_manager_t *bm = &dev->bm; @@ -312,8 +302,7 @@ static int drm_bo_expire_fence(drm_buffer_object_t *bo, } } return 0; -} - +} /* * Call dev->struct_mutex locked. @@ -321,8 +310,7 @@ static int drm_bo_expire_fence(drm_buffer_object_t *bo, * fence object and removing from lru lists and memory managers. */ - -static void drm_bo_cleanup_refs(drm_buffer_object_t *bo, int remove_all) +static void drm_bo_cleanup_refs(drm_buffer_object_t * bo, int remove_all) { drm_device_t *dev = bo->dev; drm_buffer_manager_t *bm = &dev->bm; @@ -333,14 +321,13 @@ static void drm_bo_cleanup_refs(drm_buffer_object_t *bo, int remove_all) DRM_FLAG_MASKED(bo->priv_flags, 0, _DRM_BO_FLAG_UNFENCED); - if (bo->fence && drm_fence_object_signaled(bo->fence, - bo->fence_type)) { + if (bo->fence && drm_fence_object_signaled(bo->fence, bo->fence_type)) { drm_fence_usage_deref_locked(dev, bo->fence); bo->fence = NULL; } - if (bo->fence && remove_all) - (void) drm_bo_expire_fence(bo, 0); + if (bo->fence && remove_all) + (void)drm_bo_expire_fence(bo, 0); mutex_lock(&dev->struct_mutex); @@ -369,30 +356,27 @@ static void drm_bo_cleanup_refs(drm_buffer_object_t *bo, int remove_all) drm_fence_object_flush(dev, bo->fence, bo->fence_type); list_add_tail(&bo->ddestroy, &bm->ddestroy); schedule_delayed_work(&bm->wq, - ((DRM_HZ / 100) < - 1) ? 1 : DRM_HZ / 100); + ((DRM_HZ / 100) < 1) ? 1 : DRM_HZ / 100); } -out: + out: mutex_unlock(&bo->mutex); return; } - /* * Verify that refcount is 0 and that there are no internal references * to the buffer object. Then destroy it. */ -static void drm_bo_destroy_locked(drm_buffer_object_t *bo) +static void drm_bo_destroy_locked(drm_buffer_object_t * bo) { drm_device_t *dev = bo->dev; drm_buffer_manager_t *bm = &dev->bm; - if (list_empty(&bo->lru) && bo->mem.mm_node == NULL && + if (list_empty(&bo->lru) && bo->mem.mm_node == NULL && list_empty(&bo->pinned_lru) && bo->pinned_node == NULL && - list_empty(&bo->ddestroy) && - atomic_read(&bo->usage) == 0) { + list_empty(&bo->ddestroy) && atomic_read(&bo->usage) == 0) { BUG_ON(bo->fence != NULL); #ifdef DRM_ODD_MM_COMPAT @@ -423,7 +407,6 @@ static void drm_bo_destroy_locked(drm_buffer_object_t *bo) return; } - /* * Call dev->struct_mutex locked. */ @@ -435,10 +418,9 @@ static void drm_bo_delayed_delete(drm_device_t * dev, int remove_all) drm_buffer_object_t *entry, *nentry; struct list_head *list, *next; - list_for_each_safe(list, next, &bm->ddestroy) { entry = list_entry(list, drm_buffer_object_t, ddestroy); - + nentry = NULL; if (next != &bm->ddestroy) { nentry = list_entry(next, drm_buffer_object_t, @@ -464,11 +446,11 @@ static void drm_bo_delayed_workqueue(struct work_struct *work) drm_device_t *dev = (drm_device_t *) data; drm_buffer_manager_t *bm = &dev->bm; #else - drm_buffer_manager_t *bm = container_of(work, drm_buffer_manager_t, wq.work); + drm_buffer_manager_t *bm = + container_of(work, drm_buffer_manager_t, wq.work); drm_device_t *dev = container_of(bm, drm_device_t, bm); #endif - DRM_DEBUG("Delayed delete Worker\n"); mutex_lock(&dev->struct_mutex); @@ -494,10 +476,10 @@ void drm_bo_usage_deref_locked(drm_buffer_object_t * bo) static void drm_bo_base_deref_locked(drm_file_t * priv, drm_user_object_t * uo) { drm_buffer_object_t *bo = - drm_user_object_entry(uo, drm_buffer_object_t, base); + drm_user_object_entry(uo, drm_buffer_object_t, base); drm_bo_takedown_vm_locked(bo); - drm_bo_usage_deref_locked(bo); + drm_bo_usage_deref_locked(bo); } static void drm_bo_usage_deref_unlocked(drm_buffer_object_t * bo) @@ -641,7 +623,6 @@ static int drm_bo_evict(drm_buffer_object_t * bo, unsigned mem_type, goto out; } - evict_mem = bo->mem; evict_mem.mm_node = NULL; @@ -663,19 +644,19 @@ static int drm_bo_evict(drm_buffer_object_t * bo, unsigned mem_type, "buffer eviction.\n"); goto out; } - + if (bo->pinned_node) - DRM_ERROR("Evicting pinned buffer\n"); + DRM_ERROR("Evicting pinned buffer\n"); ret = drm_bo_handle_move_mem(bo, &evict_mem, 1, no_wait); - + if (ret) { if (ret != -EAGAIN) DRM_ERROR("Buffer eviction failed\n"); goto out; } - -out1: + + out1: mutex_lock(&dev->struct_mutex); if (evict_mem.mm_node) { drm_mm_put_block(evict_mem.mm_node); @@ -687,15 +668,14 @@ out1: DRM_FLAG_MASKED(bo->priv_flags, _DRM_BO_FLAG_EVICTED, _DRM_BO_FLAG_EVICTED); - -out: + + out: return ret; } -static int drm_bo_mem_force_space(drm_device_t *dev, - drm_bo_mem_reg_t *mem, - uint32_t mem_type, - int no_wait) +static int drm_bo_mem_force_space(drm_device_t * dev, + drm_bo_mem_reg_t * mem, + uint32_t mem_type, int no_wait) { drm_mm_node_t *node; drm_buffer_manager_t *bm = &dev->bm; @@ -707,7 +687,7 @@ static int drm_bo_mem_force_space(drm_device_t *dev, mutex_lock(&dev->struct_mutex); do { - node = drm_mm_search_free(&man->manager, num_pages, + node = drm_mm_search_free(&man->manager, num_pages, mem->page_alignment, 1); if (node) break; @@ -720,7 +700,8 @@ static int drm_bo_mem_force_space(drm_device_t *dev, atomic_inc(&entry->usage); mutex_unlock(&dev->struct_mutex); mutex_lock(&entry->mutex); - BUG_ON(entry->mem.flags & (DRM_BO_FLAG_NO_MOVE | DRM_BO_FLAG_NO_EVICT)); + BUG_ON(entry->mem. + flags & (DRM_BO_FLAG_NO_MOVE | DRM_BO_FLAG_NO_EVICT)); ret = drm_bo_evict(entry, mem_type, no_wait); mutex_unlock(&entry->mutex); @@ -742,10 +723,9 @@ static int drm_bo_mem_force_space(drm_device_t *dev, return 0; } -static int drm_bo_mt_compatible(drm_mem_type_manager_t *man, +static int drm_bo_mt_compatible(drm_mem_type_manager_t * man, uint32_t mem_type, - uint32_t mask, - uint32_t *res_mask) + uint32_t mask, uint32_t * res_mask) { uint32_t cur_flags = drm_bo_type_flags(mem_type); uint32_t flag_diff; @@ -773,14 +753,13 @@ static int drm_bo_mt_compatible(drm_mem_type_manager_t *man, *res_mask = cur_flags; return 1; } - -int drm_bo_mem_space(drm_buffer_object_t *bo, - drm_bo_mem_reg_t *mem, - int no_wait) + +int drm_bo_mem_space(drm_buffer_object_t * bo, + drm_bo_mem_reg_t * mem, int no_wait) { drm_device_t *dev = bo->dev; - drm_buffer_manager_t *bm= &dev->bm; - drm_mem_type_manager_t *man; + drm_buffer_manager_t *bm = &dev->bm; + drm_mem_type_manager_t *man; uint32_t num_prios = dev->driver->bo_driver->num_mem_type_prio; const uint32_t *prios = dev->driver->bo_driver->mem_type_prio; @@ -793,12 +772,12 @@ int drm_bo_mem_space(drm_buffer_object_t *bo, drm_mm_node_t *node = NULL; int ret; - for (i=0; i<num_prios; ++i) { + for (i = 0; i < num_prios; ++i) { mem_type = prios[i]; man = &bm->man[mem_type]; - type_ok = drm_bo_mt_compatible(man, mem_type, mem->mask, - &cur_flags); + type_ok = drm_bo_mt_compatible(man, mem_type, mem->mask, + &cur_flags); if (!type_ok) continue; @@ -808,7 +787,7 @@ int drm_bo_mem_space(drm_buffer_object_t *bo, if ((mem_type == bo->pinned_mem_type) && (bo->pinned_node != NULL)) { - DRM_ERROR("Choosing pinned region\n"); + DRM_ERROR("Choosing pinned region\n"); node = bo->pinned_node; break; } @@ -816,17 +795,17 @@ int drm_bo_mem_space(drm_buffer_object_t *bo, mutex_lock(&dev->struct_mutex); if (man->has_type && man->use_type) { type_found = 1; - node = drm_mm_search_free(&man->manager, mem->num_pages, + node = drm_mm_search_free(&man->manager, mem->num_pages, mem->page_alignment, 1); - if (node) - node = drm_mm_get_block(node, mem->num_pages, + if (node) + node = drm_mm_get_block(node, mem->num_pages, mem->page_alignment); } mutex_unlock(&dev->struct_mutex); if (node) break; } - + if ((type_ok && (mem_type == DRM_BO_MEM_LOCAL)) || node) { mem->mm_node = node; mem->mem_type = mem_type; @@ -834,27 +813,26 @@ int drm_bo_mem_space(drm_buffer_object_t *bo, return 0; } - if (!type_found) + if (!type_found) return -EINVAL; - + num_prios = dev->driver->bo_driver->num_mem_busy_prio; prios = dev->driver->bo_driver->mem_busy_prio; - for (i=0; i<num_prios; ++i) { + for (i = 0; i < num_prios; ++i) { mem_type = prios[i]; man = &bm->man[mem_type]; - if (!drm_bo_mt_compatible(man, mem_type, mem->mask, - &cur_flags)) + if (!drm_bo_mt_compatible(man, mem_type, mem->mask, &cur_flags)) continue; - + ret = drm_bo_mem_force_space(dev, mem, mem_type, no_wait); - + if (ret == 0) { mem->flags = cur_flags; return 0; } - + if (ret == -EAGAIN) has_eagain = 1; } @@ -862,10 +840,10 @@ int drm_bo_mem_space(drm_buffer_object_t *bo, ret = (has_eagain) ? -EAGAIN : -ENOMEM; return ret; } -EXPORT_SYMBOL(drm_bo_mem_space); +EXPORT_SYMBOL(drm_bo_mem_space); -static int drm_bo_new_mask(drm_buffer_object_t *bo, +static int drm_bo_new_mask(drm_buffer_object_t * bo, uint32_t new_mask, uint32_t hint) { uint32_t new_props; @@ -1253,7 +1231,6 @@ int drm_bo_move_buffer(drm_buffer_object_t * bo, uint32_t new_mem_flags, if (ret) return ret; - mem.num_pages = bo->mem.num_pages; mem.size = mem.num_pages << PAGE_SHIFT; mem.mask = new_mem_flags; @@ -1263,7 +1240,7 @@ int drm_bo_move_buffer(drm_buffer_object_t * bo, uint32_t new_mem_flags, mutex_lock(&dev->struct_mutex); list_del(&bo->lru); list_add_tail(&bo->lru, &bm->unfenced); - DRM_FLAG_MASKED(bo->priv_flags, _DRM_BO_FLAG_UNFENCED, + DRM_FLAG_MASKED(bo->priv_flags, _DRM_BO_FLAG_UNFENCED, _DRM_BO_FLAG_UNFENCED); mutex_unlock(&dev->struct_mutex); @@ -1271,13 +1248,13 @@ int drm_bo_move_buffer(drm_buffer_object_t * bo, uint32_t new_mem_flags, * Determine where to move the buffer. */ ret = drm_bo_mem_space(bo, &mem, no_wait); - + if (ret) goto out_unlock; ret = drm_bo_handle_move_mem(bo, &mem, 0, no_wait); - out_unlock: + out_unlock: if (ret || !move_unfenced) { mutex_lock(&dev->struct_mutex); if (mem.mm_node) { @@ -1288,18 +1265,16 @@ int drm_bo_move_buffer(drm_buffer_object_t * bo, uint32_t new_mem_flags, DRM_WAKEUP(&bo->event_queue); list_del(&bo->lru); drm_bo_add_to_lru(bo); - mutex_unlock(&dev->struct_mutex); + mutex_unlock(&dev->struct_mutex); } mutex_unlock(&bm->evict_mutex); return ret; } - -static int drm_bo_mem_compat(drm_bo_mem_reg_t *mem) +static int drm_bo_mem_compat(drm_bo_mem_reg_t * mem) { - uint32_t - flag_diff = (mem->mask ^ mem->flags); + uint32_t flag_diff = (mem->mask ^ mem->flags); if ((mem->mask & mem->flags & DRM_BO_MASK_MEM) == 0) return 0; @@ -1311,11 +1286,11 @@ static int drm_bo_mem_compat(drm_bo_mem_reg_t *mem) return 0; return 1; } - -static int drm_bo_check_fake(drm_device_t *dev, drm_bo_mem_reg_t *mem) + +static int drm_bo_check_fake(drm_device_t * dev, drm_bo_mem_reg_t * mem) { drm_buffer_manager_t *bm = &dev->bm; - drm_mem_type_manager_t *man; + drm_mem_type_manager_t *man; uint32_t num_prios = dev->driver->bo_driver->num_mem_type_prio; const uint32_t *prios = dev->driver->bo_driver->mem_type_prio; uint32_t i; @@ -1328,11 +1303,11 @@ static int drm_bo_check_fake(drm_device_t *dev, drm_bo_mem_reg_t *mem) BUG_ON(mem->mm_node); - for (i=0; i<num_prios; ++i) { + for (i = 0; i < num_prios; ++i) { mem_type = prios[i]; man = &bm->man[mem_type]; - type_ok = drm_bo_mt_compatible(man, mem_type, mem->mask, - &cur_flags); + type_ok = drm_bo_mt_compatible(man, mem_type, mem->mask, + &cur_flags); if (type_ok) break; } @@ -1348,7 +1323,7 @@ static int drm_bo_check_fake(drm_device_t *dev, drm_bo_mem_reg_t *mem) DRM_ERROR("Illegal fake buffer flags 0x%08x\n", mem->mask); return -EINVAL; } - + /* * bo locked. */ @@ -1361,9 +1336,10 @@ static int drm_buffer_object_validate(drm_buffer_object_t * bo, drm_bo_driver_t *driver = dev->driver->bo_driver; int ret; - DRM_DEBUG("New flags 0x%08x, Old flags 0x%08x\n", bo->mem.mask, + DRM_DEBUG("New flags 0x%08x, Old flags 0x%08x\n", bo->mem.mask, bo->mem.flags); - ret = driver->fence_type(bo->mem.mask, &bo->fence_class, &bo->fence_type); + ret = + driver->fence_type(bo->mem.mask, &bo->fence_class, &bo->fence_type); if (ret) { DRM_ERROR("Driver did not support given buffer permissions\n"); return ret; @@ -1384,7 +1360,7 @@ static int drm_buffer_object_validate(drm_buffer_object_t * bo, */ if (!drm_bo_mem_compat(&bo->mem)) { - ret = drm_bo_move_buffer(bo, bo->mem.mask & DRM_BO_MASK_MEMTYPE, + ret = drm_bo_move_buffer(bo, bo->mem.mask & DRM_BO_MASK_MEMTYPE, no_wait, move_unfenced); if (ret) { if (ret != -EAGAIN) @@ -1427,7 +1403,7 @@ static int drm_buffer_object_validate(drm_buffer_object_t * bo, if (bo->mem.mem_type == DRM_BO_MEM_LOCAL && bo->ttm == NULL) { ret = drm_bo_add_ttm(bo); - if (ret) + if (ret) return ret; } DRM_FLAG_MASKED(bo->mem.flags, bo->mem.mask, ~DRM_BO_MASK_MEMTYPE); @@ -1435,23 +1411,23 @@ static int drm_buffer_object_validate(drm_buffer_object_t * bo, /* * Finally, adjust lru to be sure. */ - + mutex_lock(&dev->struct_mutex); list_del(&bo->lru); if (move_unfenced) { list_add_tail(&bo->lru, &bm->unfenced); - DRM_FLAG_MASKED(bo->priv_flags, _DRM_BO_FLAG_UNFENCED, + DRM_FLAG_MASKED(bo->priv_flags, _DRM_BO_FLAG_UNFENCED, _DRM_BO_FLAG_UNFENCED); } else { drm_bo_add_to_lru(bo); if (bo->priv_flags & _DRM_BO_FLAG_UNFENCED) { DRM_WAKEUP(&bo->event_queue); - DRM_FLAG_MASKED(bo->priv_flags, 0, _DRM_BO_FLAG_UNFENCED); + DRM_FLAG_MASKED(bo->priv_flags, 0, + _DRM_BO_FLAG_UNFENCED); } } mutex_unlock(&dev->struct_mutex); - return 0; } @@ -1601,7 +1577,7 @@ int drm_buffer_object_create(drm_file_t * priv, if (ret) goto out_err; - + if (bo->type == drm_bo_type_dc) { mutex_lock(&dev->struct_mutex); ret = drm_bo_setup_vm_locked(bo); @@ -1609,8 +1585,7 @@ int drm_buffer_object_create(drm_file_t * priv, if (ret) goto out_err; } - ret = drm_buffer_object_validate(bo, 0, - hint & DRM_BO_HINT_DONT_BLOCK); + ret = drm_buffer_object_validate(bo, 0, hint & DRM_BO_HINT_DONT_BLOCK); if (ret) goto out_err; @@ -1788,10 +1763,9 @@ int drm_bo_ioctl(DRM_IOCTL_ARGS) return 0; } -static int drm_bo_leave_list(drm_buffer_object_t *bo, +static int drm_bo_leave_list(drm_buffer_object_t * bo, uint32_t mem_type, - int free_pinned, - int allow_errors) + int free_pinned, int allow_errors) { drm_device_t *dev = bo->dev; int ret = 0; @@ -1805,7 +1779,7 @@ static int drm_bo_leave_list(drm_buffer_object_t *bo, goto out; DRM_FLAG_MASKED(bo->priv_flags, 0, _DRM_BO_FLAG_UNFENCED); - + if (free_pinned) { DRM_FLAG_MASKED(bo->mem.flags, 0, DRM_BO_FLAG_NO_MOVE); mutex_lock(&dev->struct_mutex); @@ -1815,7 +1789,7 @@ static int drm_bo_leave_list(drm_buffer_object_t *bo, if (bo->pinned_node != NULL) { drm_mm_put_block(bo->pinned_node); bo->pinned_node = NULL; - } + } mutex_unlock(&dev->struct_mutex); } @@ -1825,26 +1799,25 @@ static int drm_bo_leave_list(drm_buffer_object_t *bo, bo->mem.flags &= ~DRM_BO_FLAG_NO_EVICT; bo->mem.mask &= ~DRM_BO_FLAG_NO_EVICT; } - + if (bo->mem.mem_type == mem_type) ret = drm_bo_evict(bo, mem_type, 0); - if (ret){ - if (allow_errors){ + if (ret) { + if (allow_errors) { goto out; } else { ret = 0; DRM_ERROR("Cleanup eviction failed\n"); } } - -out: + + out: mutex_unlock(&bo->mutex); mutex_lock(&dev->struct_mutex); drm_bo_usage_deref_locked(bo); return ret; } - /* * dev->struct_sem locked. @@ -1853,9 +1826,8 @@ out: static int drm_bo_force_list_clean(drm_device_t * dev, struct list_head *head, unsigned mem_type, - int free_pinned, - int allow_errors, - int pinned_list) + int free_pinned, + int allow_errors, int pinned_list) { struct list_head *list, *next; drm_buffer_object_t *entry; @@ -1869,16 +1841,15 @@ static int drm_bo_force_list_clean(drm_device_t * dev, * For this operation. */ -retry: + retry: list_for_each_safe(list, next, head) { if (pinned_list) - entry = list_entry(list, drm_buffer_object_t, + entry = list_entry(list, drm_buffer_object_t, pinned_lru); else - entry = list_entry(list, drm_buffer_object_t, - lru); + entry = list_entry(list, drm_buffer_object_t, lru); atomic_inc(&entry->usage); - ret = drm_bo_leave_list(entry, mem_type, free_pinned, + ret = drm_bo_leave_list(entry, mem_type, free_pinned, allow_errors); do_retry = list->next != next; @@ -1890,7 +1861,7 @@ retry: if (do_retry) goto retry; } - return 0; + return 0; } int drm_bo_clean_mm(drm_device_t * dev, unsigned mem_type) @@ -1966,7 +1937,7 @@ static int drm_bo_init_mm(drm_device_t * dev, DRM_ERROR("Illegal memory type %d\n", type); return ret; } - + man = &bm->man[type]; if (man->has_type) { DRM_ERROR("Memory manager already initialized for type %d\n", @@ -1975,7 +1946,7 @@ static int drm_bo_init_mm(drm_device_t * dev, } ret = dev->driver->bo_driver->init_mem_type(dev, type, man); - if (ret) + if (ret) return ret; ret = 0; @@ -2174,15 +2145,15 @@ int drm_mm_init_ioctl(DRM_IOCTL_ARGS) * buffer object vm functions. */ -int drm_mem_reg_is_pci(drm_device_t *dev, drm_bo_mem_reg_t *mem) +int drm_mem_reg_is_pci(drm_device_t * dev, drm_bo_mem_reg_t * mem) { drm_buffer_manager_t *bm = &dev->bm; - drm_mem_type_manager_t *man = &bm->man[mem->mem_type]; + drm_mem_type_manager_t *man = &bm->man[mem->mem_type]; if (!(man->flags & _DRM_FLAG_MEMTYPE_FIXED)) { if (mem->mem_type == DRM_BO_MEM_LOCAL) return 0; - + if (man->flags & _DRM_FLAG_MEMTYPE_CMA) return 0; @@ -2191,6 +2162,7 @@ int drm_mem_reg_is_pci(drm_device_t *dev, drm_bo_mem_reg_t *mem) } return 1; } + EXPORT_SYMBOL(drm_mem_reg_is_pci); /** @@ -2207,17 +2179,16 @@ EXPORT_SYMBOL(drm_mem_reg_is_pci); * Otherwise returns zero. */ -int drm_bo_pci_offset(drm_device_t *dev, - drm_bo_mem_reg_t *mem, +int drm_bo_pci_offset(drm_device_t * dev, + drm_bo_mem_reg_t * mem, unsigned long *bus_base, - unsigned long *bus_offset, - unsigned long *bus_size) + unsigned long *bus_offset, unsigned long *bus_size) { drm_buffer_manager_t *bm = &dev->bm; - drm_mem_type_manager_t *man = &bm->man[mem->mem_type]; + drm_mem_type_manager_t *man = &bm->man[mem->mem_type]; *bus_size = 0; - if (!(man->flags & _DRM_FLAG_MEMTYPE_MAPPABLE)) + if (!(man->flags & _DRM_FLAG_MEMTYPE_MAPPABLE)) return -EINVAL; if (drm_mem_reg_is_pci(dev, mem)) { @@ -2229,7 +2200,6 @@ int drm_bo_pci_offset(drm_device_t *dev, return 0; } - /** * \c Kill all user-space virtual mappings of this buffer object. * @@ -2238,7 +2208,7 @@ int drm_bo_pci_offset(drm_device_t *dev, * Call bo->mutex locked. */ -void drm_bo_unmap_virtual(drm_buffer_object_t *bo) +void drm_bo_unmap_virtual(drm_buffer_object_t * bo) { drm_device_t *dev = bo->dev; loff_t offset = ((loff_t) bo->map_list.hash.key) << PAGE_SHIFT; @@ -2247,12 +2217,12 @@ void drm_bo_unmap_virtual(drm_buffer_object_t *bo) unmap_mapping_range(dev->dev_mapping, offset, holelen, 1); } -static void drm_bo_takedown_vm_locked(drm_buffer_object_t *bo) +static void drm_bo_takedown_vm_locked(drm_buffer_object_t * bo) { drm_map_list_t *list = &bo->map_list; drm_local_map_t *map; drm_device_t *dev = bo->dev; - + if (list->user_token) { drm_ht_remove_item(&dev->map_hash, &list->hash); list->user_token = 0; @@ -2272,12 +2242,12 @@ static void drm_bo_takedown_vm_locked(drm_buffer_object_t *bo) drm_bo_usage_deref_locked(bo); } -static int drm_bo_setup_vm_locked(drm_buffer_object_t *bo) +static int drm_bo_setup_vm_locked(drm_buffer_object_t * bo) { drm_map_list_t *list = &bo->map_list; drm_local_map_t *map; drm_device_t *dev = bo->dev; - + list->map = drm_ctl_calloc(1, sizeof(*map), DRM_MEM_BUFOBJ); if (!list->map) return -ENOMEM; @@ -2288,8 +2258,8 @@ static int drm_bo_setup_vm_locked(drm_buffer_object_t *bo) map->flags = _DRM_REMOVABLE; map->size = bo->mem.num_pages * PAGE_SIZE; atomic_inc(&bo->usage); - map->handle = (void *) bo; - + map->handle = (void *)bo; + list->file_offset_node = drm_mm_search_free(&dev->offset_manager, bo->mem.num_pages, 0, 0); @@ -2306,7 +2276,7 @@ static int drm_bo_setup_vm_locked(drm_buffer_object_t *bo) drm_bo_takedown_vm_locked(bo); return -ENOMEM; } - + list->user_token = ((drm_u64_t) list->hash.key) << PAGE_SHIFT; return 0; diff --git a/linux-core/drm_bo_move.c b/linux-core/drm_bo_move.c index 1d142087..7e195125 100644 --- a/linux-core/drm_bo_move.c +++ b/linux-core/drm_bo_move.c @@ -30,18 +30,16 @@ #include "drmP.h" - /** * Free the old memory node unless it's a pinned region and we * have not been requested to free also pinned regions. */ -static void drm_bo_free_old_node(drm_buffer_object_t *bo) +static void drm_bo_free_old_node(drm_buffer_object_t * bo) { drm_bo_mem_reg_t *old_mem = &bo->mem; - if (old_mem->mm_node && - (old_mem->mm_node != bo->pinned_node)) { + if (old_mem->mm_node && (old_mem->mm_node != bo->pinned_node)) { mutex_lock(&bo->dev->struct_mutex); drm_mm_put_block(old_mem->mm_node); old_mem->mm_node = NULL; @@ -50,10 +48,8 @@ static void drm_bo_free_old_node(drm_buffer_object_t *bo) old_mem->mm_node = NULL; } -int drm_bo_move_ttm(drm_buffer_object_t *bo, - int evict, - int no_wait, - drm_bo_mem_reg_t *new_mem) +int drm_bo_move_ttm(drm_buffer_object_t * bo, + int evict, int no_wait, drm_bo_mem_reg_t * new_mem) { drm_ttm_t *ttm = bo->ttm; drm_bo_mem_reg_t *old_mem = &bo->mem; @@ -69,15 +65,15 @@ int drm_bo_move_ttm(drm_buffer_object_t *bo, drm_ttm_unbind(ttm); drm_bo_free_old_node(bo); - DRM_FLAG_MASKED(old_mem->flags, - DRM_BO_FLAG_CACHED | DRM_BO_FLAG_MAPPABLE | - DRM_BO_FLAG_MEM_LOCAL, DRM_BO_MASK_MEMTYPE); + DRM_FLAG_MASKED(old_mem->flags, + DRM_BO_FLAG_CACHED | DRM_BO_FLAG_MAPPABLE | + DRM_BO_FLAG_MEM_LOCAL, DRM_BO_MASK_MEMTYPE); old_mem->mem_type = DRM_BO_MEM_LOCAL; save_flags = old_mem->flags; - } + } if (new_mem->mem_type != DRM_BO_MEM_LOCAL) { - ret = drm_bind_ttm(ttm, - new_mem->flags & DRM_BO_FLAG_CACHED, + ret = drm_bind_ttm(ttm, + new_mem->flags & DRM_BO_FLAG_CACHED, new_mem->mm_node->start); if (ret) return ret; @@ -89,8 +85,8 @@ int drm_bo_move_ttm(drm_buffer_object_t *bo, DRM_FLAG_MASKED(save_flags, new_mem->flags, DRM_BO_MASK_MEMTYPE); return 0; } -EXPORT_SYMBOL(drm_bo_move_ttm); +EXPORT_SYMBOL(drm_bo_move_ttm); /** * \c Return a kernel virtual address to the buffer object PCI memory. @@ -107,11 +103,11 @@ EXPORT_SYMBOL(drm_bo_move_ttm); * Call bo->mutex locked. */ - -int drm_mem_reg_ioremap(drm_device_t *dev, drm_bo_mem_reg_t *mem, void **virtual) +int drm_mem_reg_ioremap(drm_device_t * dev, drm_bo_mem_reg_t * mem, + void **virtual) { drm_buffer_manager_t *bm = &dev->bm; - drm_mem_type_manager_t *man = &bm->man[mem->mem_type]; + drm_mem_type_manager_t *man = &bm->man[mem->mem_type]; unsigned long bus_offset; unsigned long bus_size; unsigned long bus_base; @@ -120,11 +116,11 @@ int drm_mem_reg_ioremap(drm_device_t *dev, drm_bo_mem_reg_t *mem, void **virtual *virtual = NULL; ret = drm_bo_pci_offset(dev, mem, &bus_base, &bus_offset, &bus_size); - if (ret || bus_size == 0) + if (ret || bus_size == 0) return ret; if (!(man->flags & _DRM_FLAG_NEEDS_IOREMAP)) - addr = (void *) (((u8 *)man->io_addr) + bus_offset); + addr = (void *)(((u8 *) man->io_addr) + bus_offset); else { addr = ioremap_nocache(bus_base + bus_offset, bus_size); if (!addr) @@ -134,7 +130,6 @@ int drm_mem_reg_ioremap(drm_device_t *dev, drm_bo_mem_reg_t *mem, void **virtual return 0; } - /** * \c Unmap mapping obtained using drm_bo_ioremap * @@ -143,34 +138,34 @@ int drm_mem_reg_ioremap(drm_device_t *dev, drm_bo_mem_reg_t *mem, void **virtual * Call bo->mutex locked. */ -void drm_mem_reg_iounmap(drm_device_t *dev, drm_bo_mem_reg_t *mem, +void drm_mem_reg_iounmap(drm_device_t * dev, drm_bo_mem_reg_t * mem, void *virtual) { - drm_buffer_manager_t *bm; - drm_mem_type_manager_t *man; - + drm_buffer_manager_t *bm; + drm_mem_type_manager_t *man; bm = &dev->bm; man = &bm->man[mem->mem_type]; - + if (virtual && (man->flags & _DRM_FLAG_NEEDS_IOREMAP)) { iounmap(virtual); } } - static int drm_copy_io_page(void *dst, void *src, unsigned long page) { - uint32_t *dstP = (uint32_t *)((unsigned long) dst + (page << PAGE_SHIFT)); - uint32_t *srcP = (uint32_t *)((unsigned long) src + (page << PAGE_SHIFT)); + uint32_t *dstP = + (uint32_t *) ((unsigned long)dst + (page << PAGE_SHIFT)); + uint32_t *srcP = + (uint32_t *) ((unsigned long)src + (page << PAGE_SHIFT)); int i; - for (i=0; i < PAGE_SIZE / sizeof(uint32_t); ++i) + for (i = 0; i < PAGE_SIZE / sizeof(uint32_t); ++i) iowrite32(ioread32(srcP++), dstP++); return 0; } -static int drm_copy_io_ttm_page(drm_ttm_t *ttm, void *src, unsigned long page) +static int drm_copy_io_ttm_page(drm_ttm_t * ttm, void *src, unsigned long page) { struct page *d = drm_ttm_get_page(ttm, page); void *dst; @@ -178,7 +173,7 @@ static int drm_copy_io_ttm_page(drm_ttm_t *ttm, void *src, unsigned long page) if (!d) return -ENOMEM; - src = (void *)((unsigned long) src + (page << PAGE_SHIFT)); + src = (void *)((unsigned long)src + (page << PAGE_SHIFT)); dst = kmap(d); if (!dst) return -ENOMEM; @@ -188,7 +183,7 @@ static int drm_copy_io_ttm_page(drm_ttm_t *ttm, void *src, unsigned long page) return 0; } -static int drm_copy_ttm_io_page(drm_ttm_t *ttm, void *dst, unsigned long page) +static int drm_copy_ttm_io_page(drm_ttm_t * ttm, void *dst, unsigned long page) { struct page *s = drm_ttm_get_page(ttm, page); void *src; @@ -196,7 +191,7 @@ static int drm_copy_ttm_io_page(drm_ttm_t *ttm, void *dst, unsigned long page) if (!s) return -ENOMEM; - dst = (void *)((unsigned long) dst + (page << PAGE_SHIFT)); + dst = (void *)((unsigned long)dst + (page << PAGE_SHIFT)); src = kmap(s); if (!src) return -ENOMEM; @@ -206,11 +201,8 @@ static int drm_copy_ttm_io_page(drm_ttm_t *ttm, void *dst, unsigned long page) return 0; } - -int drm_bo_move_memcpy(drm_buffer_object_t *bo, - int evict, - int no_wait, - drm_bo_mem_reg_t *new_mem) +int drm_bo_move_memcpy(drm_buffer_object_t * bo, + int evict, int no_wait, drm_bo_mem_reg_t * new_mem) { drm_device_t *dev = bo->dev; drm_mem_type_manager_t *man = &dev->bm.man[new_mem->mem_type]; @@ -226,42 +218,42 @@ int drm_bo_move_memcpy(drm_buffer_object_t *bo, unsigned long page; unsigned long add = 0; int dir; - + ret = drm_mem_reg_ioremap(dev, old_mem, &old_iomap); if (ret) return ret; ret = drm_mem_reg_ioremap(dev, new_mem, &new_iomap); - if (ret) + if (ret) goto out; if (old_iomap == NULL && new_iomap == NULL) goto out2; if (old_iomap == NULL && ttm == NULL) goto out2; - + add = 0; dir = 1; - if ((old_mem->mem_type == new_mem->mem_type) && - (new_mem->mm_node->start < - old_mem->mm_node->start + old_mem->mm_node->size)) { + if ((old_mem->mem_type == new_mem->mem_type) && + (new_mem->mm_node->start < + old_mem->mm_node->start + old_mem->mm_node->size)) { dir = -1; add = new_mem->num_pages - 1; } - for (i=0; i < new_mem->num_pages; ++i) { - page = i*dir + add; - if (old_iomap == NULL) + for (i = 0; i < new_mem->num_pages; ++i) { + page = i * dir + add; + if (old_iomap == NULL) ret = drm_copy_ttm_io_page(ttm, new_iomap, page); else if (new_iomap == NULL) ret = drm_copy_io_ttm_page(ttm, old_iomap, page); - else + else ret = drm_copy_io_page(new_iomap, old_iomap, page); if (ret) goto out1; } mb(); -out2: + out2: drm_bo_free_old_node(bo); *old_mem = *new_mem; @@ -275,12 +267,13 @@ out2: bo->ttm = NULL; } -out1: + out1: drm_mem_reg_iounmap(dev, new_mem, new_iomap); -out: + out: drm_mem_reg_iounmap(dev, &old_copy, old_iomap); return ret; } + EXPORT_SYMBOL(drm_bo_move_memcpy); /* @@ -289,8 +282,8 @@ EXPORT_SYMBOL(drm_bo_move_memcpy); * object. Call bo->mutex locked. */ -int drm_buffer_object_transfer(drm_buffer_object_t *bo, - drm_buffer_object_t **new_obj) +int drm_buffer_object_transfer(drm_buffer_object_t * bo, + drm_buffer_object_t ** new_obj) { drm_buffer_object_t *fbo; drm_device_t *dev = bo->dev; @@ -299,7 +292,7 @@ int drm_buffer_object_transfer(drm_buffer_object_t *bo, fbo = drm_ctl_calloc(1, sizeof(*fbo), DRM_MEM_BUFOBJ); if (!fbo) return -ENOMEM; - + *fbo = *bo; mutex_init(&fbo->mutex); mutex_lock(&fbo->mutex); @@ -331,12 +324,11 @@ int drm_buffer_object_transfer(drm_buffer_object_t *bo, * We cannot restart until it has finished. */ -int drm_bo_move_accel_cleanup(drm_buffer_object_t *bo, +int drm_bo_move_accel_cleanup(drm_buffer_object_t * bo, int evict, int no_wait, uint32_t fence_type, - uint32_t fence_flags, - drm_bo_mem_reg_t *new_mem) + uint32_t fence_flags, drm_bo_mem_reg_t * new_mem) { drm_device_t *dev = bo->dev; drm_mem_type_manager_t *man = &dev->bm.man[new_mem->mem_type]; @@ -345,7 +337,7 @@ int drm_bo_move_accel_cleanup(drm_buffer_object_t *bo, uint32_t save_flags = old_mem->flags; uint32_t save_mask = old_mem->mask; drm_buffer_object_t *old_obj; - + if (bo->fence) drm_fence_usage_deref_unlocked(dev, bo->fence); ret = drm_fence_object_create(dev, fence_type, @@ -365,18 +357,17 @@ int drm_bo_move_accel_cleanup(drm_buffer_object_t *bo, */ if (1) #else - if (evict || ((bo->mem.mm_node == bo->pinned_node) && + if (evict || ((bo->mem.mm_node == bo->pinned_node) && bo->mem.mm_node != NULL)) #endif { ret = drm_bo_wait(bo, 0, 1, 0); - if (ret) + if (ret) return ret; drm_bo_free_old_node(bo); - if ((man->flags & _DRM_FLAG_MEMTYPE_FIXED) && - (bo->ttm != NULL)) { + if ((man->flags & _DRM_FLAG_MEMTYPE_FIXED) && (bo->ttm != NULL)) { drm_ttm_unbind(bo->ttm); drm_destroy_ttm(bo->ttm); bo->ttm = NULL; @@ -404,7 +395,7 @@ int drm_bo_move_accel_cleanup(drm_buffer_object_t *bo, list_del_init(&old_obj->lru); DRM_FLAG_MASKED(bo->priv_flags, 0, _DRM_BO_FLAG_UNFENCED); drm_bo_add_to_lru(old_obj); - + drm_bo_usage_deref_locked(old_obj); mutex_unlock(&dev->struct_mutex); @@ -416,6 +407,5 @@ int drm_bo_move_accel_cleanup(drm_buffer_object_t *bo, DRM_FLAG_MASKED(save_flags, new_mem->flags, DRM_BO_MASK_MEMTYPE); return 0; } -EXPORT_SYMBOL(drm_bo_move_accel_cleanup); - +EXPORT_SYMBOL(drm_bo_move_accel_cleanup); diff --git a/linux-core/drm_ttm.c b/linux-core/drm_ttm.c index 8cd961d7..e67719e2 100644 --- a/linux-core/drm_ttm.c +++ b/linux-core/drm_ttm.c @@ -35,18 +35,17 @@ static void drm_ttm_ipi_handler(void *null) flush_agp_cache(); } -static void drm_ttm_cache_flush(void) +static void drm_ttm_cache_flush(void) { if (on_each_cpu(drm_ttm_ipi_handler, NULL, 1, 1) != 0) DRM_ERROR("Timed out waiting for drm cache flush.\n"); } - /* * Use kmalloc if possible. Otherwise fall back to vmalloc. */ -static void ttm_alloc_pages(drm_ttm_t *ttm) +static void ttm_alloc_pages(drm_ttm_t * ttm) { unsigned long size = ttm->num_pages * sizeof(*ttm->pages); ttm->pages = NULL; @@ -67,7 +66,7 @@ static void ttm_alloc_pages(drm_ttm_t *ttm) } } -static void ttm_free_pages(drm_ttm_t *ttm) +static void ttm_free_pages(drm_ttm_t * ttm) { unsigned long size = ttm->num_pages * sizeof(*ttm->pages); @@ -81,7 +80,6 @@ static void ttm_free_pages(drm_ttm_t *ttm) ttm->pages = NULL; } - static struct page *drm_ttm_alloc_page(void) { struct page *page; @@ -102,7 +100,6 @@ static struct page *drm_ttm_alloc_page(void) return page; } - /* * Change caching policy for the linear kernel map * for range of pages in a ttm. @@ -117,7 +114,7 @@ static int drm_set_caching(drm_ttm_t * ttm, int noncached) if ((ttm->page_flags & DRM_TTM_PAGE_UNCACHED) == noncached) return 0; - if (noncached) + if (noncached) drm_ttm_cache_flush(); for (i = 0; i < ttm->num_pages; ++i) { @@ -194,7 +191,7 @@ int drm_destroy_ttm(drm_ttm_t * ttm) return 0; } -struct page *drm_ttm_get_page(drm_ttm_t *ttm, int index) +struct page *drm_ttm_get_page(drm_ttm_t * ttm, int index) { struct page *p; drm_buffer_manager_t *bm = &ttm->dev->bm; @@ -210,7 +207,6 @@ struct page *drm_ttm_get_page(drm_ttm_t *ttm, int index) return p; } - static int drm_ttm_populate(drm_ttm_t * ttm) { struct page *page; @@ -235,7 +231,7 @@ static int drm_ttm_populate(drm_ttm_t * ttm) * Initialize a ttm. */ -drm_ttm_t *drm_ttm_init(struct drm_device *dev, unsigned long size) +drm_ttm_t *drm_ttm_init(struct drm_device * dev, unsigned long size) { drm_bo_driver_t *bo_driver = dev->driver->bo_driver; drm_ttm_t *ttm; @@ -344,4 +340,5 @@ int drm_bind_ttm(drm_ttm_t * ttm, int cached, unsigned long aper_offset) return 0; } + EXPORT_SYMBOL(drm_bind_ttm); diff --git a/linux-core/drm_ttm.h b/linux-core/drm_ttm.h index e10db8c1..b96f5cee 100644 --- a/linux-core/drm_ttm.h +++ b/linux-core/drm_ttm.h @@ -79,13 +79,12 @@ typedef struct drm_ttm { } drm_ttm_t; - extern drm_ttm_t *drm_ttm_init(struct drm_device *dev, unsigned long size); extern int drm_bind_ttm(drm_ttm_t * ttm, int cached, unsigned long aper_offset); extern void drm_ttm_unbind(drm_ttm_t * ttm); extern void drm_ttm_evict(drm_ttm_t * ttm); extern void drm_ttm_fixup_caching(drm_ttm_t * ttm); -extern struct page *drm_ttm_get_page(drm_ttm_t *ttm, int index); +extern struct page *drm_ttm_get_page(drm_ttm_t * ttm, int index); /* * Destroy a ttm. The user normally calls drmRmMap or a similar IOCTL to do this, diff --git a/linux-core/i915_buffer.c b/linux-core/i915_buffer.c index 7655902f..4fab0bef 100644 --- a/linux-core/i915_buffer.c +++ b/linux-core/i915_buffer.c @@ -33,7 +33,6 @@ #include "i915_drm.h" #include "i915_drv.h" - drm_ttm_backend_t *i915_create_ttm_backend_entry(drm_device_t * dev) { return drm_agp_init_ttm(dev, NULL); @@ -65,51 +64,49 @@ int i915_invalidate_caches(drm_device_t * dev, uint32_t flags) return i915_emit_mi_flush(dev, flush_cmd); } -int i915_init_mem_type(drm_device_t *dev, uint32_t type, - drm_mem_type_manager_t *man) +int i915_init_mem_type(drm_device_t * dev, uint32_t type, + drm_mem_type_manager_t * man) { - switch(type) { + switch (type) { case DRM_BO_MEM_LOCAL: man->flags = _DRM_FLAG_MEMTYPE_MAPPABLE | - _DRM_FLAG_MEMTYPE_CACHED; + _DRM_FLAG_MEMTYPE_CACHED; break; case DRM_BO_MEM_TT: if (!(drm_core_has_AGP(dev) && dev->agp)) { - DRM_ERROR("AGP is not enabled for memory type %u\n", - (unsigned) type); + DRM_ERROR("AGP is not enabled for memory type %u\n", + (unsigned)type); return -EINVAL; } man->io_offset = dev->agp->agp_info.aper_base; man->io_size = dev->agp->agp_info.aper_size * 1024 * 1024; man->io_addr = NULL; man->flags = _DRM_FLAG_MEMTYPE_MAPPABLE | - _DRM_FLAG_MEMTYPE_CSELECT | - _DRM_FLAG_NEEDS_IOREMAP; + _DRM_FLAG_MEMTYPE_CSELECT | _DRM_FLAG_NEEDS_IOREMAP; break; case DRM_BO_MEM_PRIV0: if (!(drm_core_has_AGP(dev) && dev->agp)) { - DRM_ERROR("AGP is not enabled for memory type %u\n", - (unsigned) type); + DRM_ERROR("AGP is not enabled for memory type %u\n", + (unsigned)type); return -EINVAL; } man->io_offset = dev->agp->agp_info.aper_base; man->io_size = dev->agp->agp_info.aper_size * 1024 * 1024; man->io_addr = NULL; man->flags = _DRM_FLAG_MEMTYPE_MAPPABLE | - _DRM_FLAG_MEMTYPE_FIXED | - _DRM_FLAG_NEEDS_IOREMAP; + _DRM_FLAG_MEMTYPE_FIXED | _DRM_FLAG_NEEDS_IOREMAP; break; default: - DRM_ERROR("Unsupported memory type %u\n", (unsigned) type); + DRM_ERROR("Unsupported memory type %u\n", (unsigned)type); return -EINVAL; } return 0; } -uint32_t i915_evict_flags(drm_device_t *dev, uint32_t type) +uint32_t i915_evict_flags(drm_device_t * dev, uint32_t type) { - switch(type) { + switch (type) { case DRM_BO_MEM_LOCAL: case DRM_BO_MEM_TT: return DRM_BO_FLAG_MEM_LOCAL; @@ -118,11 +115,10 @@ uint32_t i915_evict_flags(drm_device_t *dev, uint32_t type) } } -static void i915_emit_copy_blit(drm_device_t *dev, - uint32_t src_offset, - uint32_t dst_offset, - uint32_t pages, - int direction) +static void i915_emit_copy_blit(drm_device_t * dev, + uint32_t src_offset, + uint32_t dst_offset, + uint32_t pages, int direction) { uint32_t cur_pages; uint32_t stride = PAGE_SIZE; @@ -131,9 +127,9 @@ static void i915_emit_copy_blit(drm_device_t *dev, if (!dev_priv) return; - + i915_kernel_lost_context(dev); - while(pages > 0) { + while (pages > 0) { cur_pages = pages; if (cur_pages > 2048) cur_pages = 2048; @@ -142,7 +138,7 @@ static void i915_emit_copy_blit(drm_device_t *dev, BEGIN_LP_RING(6); OUT_RING(SRC_COPY_BLT_CMD | XY_SRC_COPY_BLT_WRITE_ALPHA | XY_SRC_COPY_BLT_WRITE_RGB); - OUT_RING((stride & 0xffff) | ( 0xcc << 16) | (1 << 24) | + OUT_RING((stride & 0xffff) | (0xcc << 16) | (1 << 24) | (1 << 25) | (direction ? (1 << 30) : 0)); OUT_RING((cur_pages << 16) | PAGE_SIZE); OUT_RING(dst_offset); @@ -153,33 +149,29 @@ static void i915_emit_copy_blit(drm_device_t *dev, return; } -static int i915_move_blit(drm_buffer_object_t *bo, - int evict, - int no_wait, - drm_bo_mem_reg_t *new_mem) +static int i915_move_blit(drm_buffer_object_t * bo, + int evict, int no_wait, drm_bo_mem_reg_t * new_mem) { drm_bo_mem_reg_t *old_mem = &bo->mem; int dir = 0; - if ((old_mem->mem_type == new_mem->mem_type) && - (new_mem->mm_node->start < - old_mem->mm_node->start + old_mem->mm_node->size)) { + if ((old_mem->mem_type == new_mem->mem_type) && + (new_mem->mm_node->start < + old_mem->mm_node->start + old_mem->mm_node->size)) { dir = 1; } i915_emit_copy_blit(bo->dev, old_mem->mm_node->start << PAGE_SHIFT, new_mem->mm_node->start << PAGE_SHIFT, - new_mem->num_pages, - dir); + new_mem->num_pages, dir); i915_emit_mi_flush(bo->dev, MI_READ_FLUSH | MI_EXE_FLUSH); return drm_bo_move_accel_cleanup(bo, evict, no_wait, DRM_FENCE_TYPE_EXE | - DRM_I915_FENCE_TYPE_RW, - DRM_I915_FENCE_FLAG_FLUSHED, - new_mem); + DRM_I915_FENCE_TYPE_RW, + DRM_I915_FENCE_FLAG_FLUSHED, new_mem); } /* @@ -187,11 +179,8 @@ static int i915_move_blit(drm_buffer_object_t *bo, * then blit and subsequently move out again. */ - -static int i915_move_flip(drm_buffer_object_t *bo, - int evict, - int no_wait, - drm_bo_mem_reg_t *new_mem) +static int i915_move_flip(drm_buffer_object_t * bo, + int evict, int no_wait, drm_bo_mem_reg_t * new_mem) { drm_device_t *dev = bo->dev; drm_bo_mem_reg_t tmp_mem; @@ -200,23 +189,22 @@ static int i915_move_flip(drm_buffer_object_t *bo, tmp_mem = *new_mem; tmp_mem.mm_node = NULL; tmp_mem.mask = DRM_BO_FLAG_MEM_TT | - DRM_BO_FLAG_CACHED | - DRM_BO_FLAG_FORCE_CACHING; - + DRM_BO_FLAG_CACHED | DRM_BO_FLAG_FORCE_CACHING; + ret = drm_bo_mem_space(bo, &tmp_mem, no_wait); - if (ret) + if (ret) return ret; - + ret = drm_bind_ttm(bo->ttm, 1, tmp_mem.mm_node->start); - if (ret) + if (ret) goto out_cleanup; ret = i915_move_blit(bo, 1, no_wait, &tmp_mem); - if (ret) + if (ret) goto out_cleanup; - + ret = drm_bo_move_ttm(bo, evict, no_wait, new_mem); -out_cleanup: + out_cleanup: if (tmp_mem.mm_node) { mutex_lock(&dev->struct_mutex); drm_mm_put_block(tmp_mem.mm_node); @@ -226,24 +214,19 @@ out_cleanup: return ret; } - -int i915_move(drm_buffer_object_t *bo, - int evict, - int no_wait, - drm_bo_mem_reg_t *new_mem) +int i915_move(drm_buffer_object_t * bo, + int evict, int no_wait, drm_bo_mem_reg_t * new_mem) { drm_bo_mem_reg_t *old_mem = &bo->mem; if (old_mem->mem_type == DRM_BO_MEM_LOCAL) { return drm_bo_move_memcpy(bo, evict, no_wait, new_mem); } else if (new_mem->mem_type == DRM_BO_MEM_LOCAL) { - if (i915_move_flip(bo, evict, no_wait, new_mem)) - return drm_bo_move_memcpy(bo, evict, no_wait, - new_mem); + if (i915_move_flip(bo, evict, no_wait, new_mem)) + return drm_bo_move_memcpy(bo, evict, no_wait, new_mem); } else { if (i915_move_blit(bo, evict, no_wait, new_mem)) - return drm_bo_move_memcpy(bo, evict, no_wait, - new_mem); + return drm_bo_move_memcpy(bo, evict, no_wait, new_mem); } return 0; } |