Lines Matching refs:man
156 struct vmw_cmdbuf_man *man; member
198 static int vmw_cmdbuf_startstop(struct vmw_cmdbuf_man *man, u32 context,
200 static int vmw_cmdbuf_preempt(struct vmw_cmdbuf_man *man, u32 context);
208 static int vmw_cmdbuf_cur_lock(struct vmw_cmdbuf_man *man, bool interruptible) in vmw_cmdbuf_cur_lock() argument
211 if (mutex_lock_interruptible(&man->cur_mutex)) in vmw_cmdbuf_cur_lock()
214 mutex_lock(&man->cur_mutex); in vmw_cmdbuf_cur_lock()
225 static void vmw_cmdbuf_cur_unlock(struct vmw_cmdbuf_man *man) in vmw_cmdbuf_cur_unlock() argument
227 mutex_unlock(&man->cur_mutex); in vmw_cmdbuf_cur_unlock()
246 dma_pool_free(header->man->dheaders, dheader, header->handle); in vmw_cmdbuf_header_inline_free()
260 struct vmw_cmdbuf_man *man = header->man; in __vmw_cmdbuf_header_free() local
262 lockdep_assert_held_once(&man->lock); in __vmw_cmdbuf_header_free()
270 wake_up_all(&man->alloc_queue); in __vmw_cmdbuf_header_free()
272 dma_pool_free(man->headers, header->cb_header, in __vmw_cmdbuf_header_free()
285 struct vmw_cmdbuf_man *man = header->man; in vmw_cmdbuf_header_free() local
292 spin_lock(&man->lock); in vmw_cmdbuf_header_free()
294 spin_unlock(&man->lock); in vmw_cmdbuf_header_free()
305 struct vmw_cmdbuf_man *man = header->man; in vmw_cmdbuf_header_submit() local
308 header->cb_header->id = man->id++; in vmw_cmdbuf_header_submit()
311 vmw_write(man->dev_priv, SVGA_REG_COMMAND_HIGH, val); in vmw_cmdbuf_header_submit()
315 vmw_write(man->dev_priv, SVGA_REG_COMMAND_LOW, val); in vmw_cmdbuf_header_submit()
343 static void vmw_cmdbuf_ctx_submit(struct vmw_cmdbuf_man *man, in vmw_cmdbuf_ctx_submit() argument
346 while (ctx->num_hw_submitted < man->max_hw_submitted && in vmw_cmdbuf_ctx_submit()
381 static void vmw_cmdbuf_ctx_process(struct vmw_cmdbuf_man *man, in vmw_cmdbuf_ctx_process() argument
387 vmw_cmdbuf_ctx_submit(man, ctx); in vmw_cmdbuf_ctx_process()
396 wake_up_all(&man->idle_queue); in vmw_cmdbuf_ctx_process()
405 list_add_tail(&entry->list, &man->error); in vmw_cmdbuf_ctx_process()
406 schedule_work(&man->work); in vmw_cmdbuf_ctx_process()
423 vmw_cmdbuf_ctx_submit(man, ctx); in vmw_cmdbuf_ctx_process()
438 static void vmw_cmdbuf_man_process(struct vmw_cmdbuf_man *man) in vmw_cmdbuf_man_process() argument
446 for_each_cmdbuf_ctx(man, i, ctx) in vmw_cmdbuf_man_process()
447 vmw_cmdbuf_ctx_process(man, ctx, ¬empty); in vmw_cmdbuf_man_process()
449 if (man->irq_on && !notempty) { in vmw_cmdbuf_man_process()
450 vmw_generic_waiter_remove(man->dev_priv, in vmw_cmdbuf_man_process()
452 &man->dev_priv->cmdbuf_waiters); in vmw_cmdbuf_man_process()
453 man->irq_on = false; in vmw_cmdbuf_man_process()
454 } else if (!man->irq_on && notempty) { in vmw_cmdbuf_man_process()
455 vmw_generic_waiter_add(man->dev_priv, in vmw_cmdbuf_man_process()
457 &man->dev_priv->cmdbuf_waiters); in vmw_cmdbuf_man_process()
458 man->irq_on = true; in vmw_cmdbuf_man_process()
478 static void vmw_cmdbuf_ctx_add(struct vmw_cmdbuf_man *man, in vmw_cmdbuf_ctx_add() argument
485 list_add_tail(&header->list, &man->ctx[cb_context].submitted); in vmw_cmdbuf_ctx_add()
487 vmw_cmdbuf_man_process(man); in vmw_cmdbuf_ctx_add()
500 void vmw_cmdbuf_irqthread(struct vmw_cmdbuf_man *man) in vmw_cmdbuf_irqthread() argument
502 spin_lock(&man->lock); in vmw_cmdbuf_irqthread()
503 vmw_cmdbuf_man_process(man); in vmw_cmdbuf_irqthread()
504 spin_unlock(&man->lock); in vmw_cmdbuf_irqthread()
518 struct vmw_cmdbuf_man *man = in vmw_cmdbuf_work_func() local
528 for_each_cmdbuf_ctx(man, i, ctx) in vmw_cmdbuf_work_func()
531 mutex_lock(&man->error_mutex); in vmw_cmdbuf_work_func()
532 spin_lock(&man->lock); in vmw_cmdbuf_work_func()
533 list_for_each_entry_safe(entry, next, &man->error, list) { in vmw_cmdbuf_work_func()
567 if (man->using_mob) in vmw_cmdbuf_work_func()
580 for_each_cmdbuf_ctx(man, i, ctx) in vmw_cmdbuf_work_func()
581 man->ctx[i].block_submission = true; in vmw_cmdbuf_work_func()
583 spin_unlock(&man->lock); in vmw_cmdbuf_work_func()
586 if (global_block && vmw_cmdbuf_preempt(man, 0)) in vmw_cmdbuf_work_func()
589 spin_lock(&man->lock); in vmw_cmdbuf_work_func()
590 for_each_cmdbuf_ctx(man, i, ctx) { in vmw_cmdbuf_work_func()
592 vmw_cmdbuf_ctx_process(man, ctx, &dummy); in vmw_cmdbuf_work_func()
609 vmw_cmdbuf_man_process(man); in vmw_cmdbuf_work_func()
610 spin_unlock(&man->lock); in vmw_cmdbuf_work_func()
612 if (global_block && vmw_cmdbuf_startstop(man, 0, true)) in vmw_cmdbuf_work_func()
617 vmw_cmd_send_fence(man->dev_priv, &dummy); in vmw_cmdbuf_work_func()
618 wake_up_all(&man->idle_queue); in vmw_cmdbuf_work_func()
621 mutex_unlock(&man->error_mutex); in vmw_cmdbuf_work_func()
631 static bool vmw_cmdbuf_man_idle(struct vmw_cmdbuf_man *man, in vmw_cmdbuf_man_idle() argument
638 spin_lock(&man->lock); in vmw_cmdbuf_man_idle()
639 vmw_cmdbuf_man_process(man); in vmw_cmdbuf_man_idle()
640 for_each_cmdbuf_ctx(man, i, ctx) { in vmw_cmdbuf_man_idle()
647 idle = list_empty(&man->error); in vmw_cmdbuf_man_idle()
650 spin_unlock(&man->lock); in vmw_cmdbuf_man_idle()
664 static void __vmw_cmdbuf_cur_flush(struct vmw_cmdbuf_man *man) in __vmw_cmdbuf_cur_flush() argument
666 struct vmw_cmdbuf_header *cur = man->cur; in __vmw_cmdbuf_cur_flush()
668 lockdep_assert_held_once(&man->cur_mutex); in __vmw_cmdbuf_cur_flush()
673 spin_lock(&man->lock); in __vmw_cmdbuf_cur_flush()
674 if (man->cur_pos == 0) { in __vmw_cmdbuf_cur_flush()
679 man->cur->cb_header->length = man->cur_pos; in __vmw_cmdbuf_cur_flush()
680 vmw_cmdbuf_ctx_add(man, man->cur, SVGA_CB_CONTEXT_0); in __vmw_cmdbuf_cur_flush()
682 spin_unlock(&man->lock); in __vmw_cmdbuf_cur_flush()
683 man->cur = NULL; in __vmw_cmdbuf_cur_flush()
684 man->cur_pos = 0; in __vmw_cmdbuf_cur_flush()
697 int vmw_cmdbuf_cur_flush(struct vmw_cmdbuf_man *man, in vmw_cmdbuf_cur_flush() argument
700 int ret = vmw_cmdbuf_cur_lock(man, interruptible); in vmw_cmdbuf_cur_flush()
705 __vmw_cmdbuf_cur_flush(man); in vmw_cmdbuf_cur_flush()
706 vmw_cmdbuf_cur_unlock(man); in vmw_cmdbuf_cur_flush()
722 int vmw_cmdbuf_idle(struct vmw_cmdbuf_man *man, bool interruptible, in vmw_cmdbuf_idle() argument
727 ret = vmw_cmdbuf_cur_flush(man, interruptible); in vmw_cmdbuf_idle()
728 vmw_generic_waiter_add(man->dev_priv, in vmw_cmdbuf_idle()
730 &man->dev_priv->cmdbuf_waiters); in vmw_cmdbuf_idle()
734 (man->idle_queue, vmw_cmdbuf_man_idle(man, true), in vmw_cmdbuf_idle()
738 (man->idle_queue, vmw_cmdbuf_man_idle(man, true), in vmw_cmdbuf_idle()
741 vmw_generic_waiter_remove(man->dev_priv, in vmw_cmdbuf_idle()
743 &man->dev_priv->cmdbuf_waiters); in vmw_cmdbuf_idle()
745 if (!vmw_cmdbuf_man_idle(man, true)) in vmw_cmdbuf_idle()
766 static bool vmw_cmdbuf_try_alloc(struct vmw_cmdbuf_man *man, in vmw_cmdbuf_try_alloc() argument
775 spin_lock(&man->lock); in vmw_cmdbuf_try_alloc()
776 ret = drm_mm_insert_node(&man->mm, info->node, info->page_size); in vmw_cmdbuf_try_alloc()
778 vmw_cmdbuf_man_process(man); in vmw_cmdbuf_try_alloc()
779 ret = drm_mm_insert_node(&man->mm, info->node, info->page_size); in vmw_cmdbuf_try_alloc()
782 spin_unlock(&man->lock); in vmw_cmdbuf_try_alloc()
800 static int vmw_cmdbuf_alloc_space(struct vmw_cmdbuf_man *man, in vmw_cmdbuf_alloc_space() argument
816 if (mutex_lock_interruptible(&man->space_mutex)) in vmw_cmdbuf_alloc_space()
819 mutex_lock(&man->space_mutex); in vmw_cmdbuf_alloc_space()
823 if (vmw_cmdbuf_try_alloc(man, &info)) in vmw_cmdbuf_alloc_space()
826 vmw_generic_waiter_add(man->dev_priv, in vmw_cmdbuf_alloc_space()
828 &man->dev_priv->cmdbuf_waiters); in vmw_cmdbuf_alloc_space()
834 (man->alloc_queue, vmw_cmdbuf_try_alloc(man, &info)); in vmw_cmdbuf_alloc_space()
837 (man->dev_priv, SVGA_IRQFLAG_COMMAND_BUFFER, in vmw_cmdbuf_alloc_space()
838 &man->dev_priv->cmdbuf_waiters); in vmw_cmdbuf_alloc_space()
839 mutex_unlock(&man->space_mutex); in vmw_cmdbuf_alloc_space()
843 wait_event(man->alloc_queue, vmw_cmdbuf_try_alloc(man, &info)); in vmw_cmdbuf_alloc_space()
845 vmw_generic_waiter_remove(man->dev_priv, in vmw_cmdbuf_alloc_space()
847 &man->dev_priv->cmdbuf_waiters); in vmw_cmdbuf_alloc_space()
850 mutex_unlock(&man->space_mutex); in vmw_cmdbuf_alloc_space()
864 static int vmw_cmdbuf_space_pool(struct vmw_cmdbuf_man *man, in vmw_cmdbuf_space_pool() argument
873 if (!man->has_pool) in vmw_cmdbuf_space_pool()
876 ret = vmw_cmdbuf_alloc_space(man, &header->node, size, interruptible); in vmw_cmdbuf_space_pool()
881 header->cb_header = dma_pool_zalloc(man->headers, GFP_KERNEL, in vmw_cmdbuf_space_pool()
891 header->cmd = man->map + offset; in vmw_cmdbuf_space_pool()
892 if (man->using_mob) { in vmw_cmdbuf_space_pool()
894 cb_hdr->ptr.mob.mobid = man->cmd_space->tbo.resource->start; in vmw_cmdbuf_space_pool()
897 cb_hdr->ptr.pa = (u64)man->handle + (u64)offset; in vmw_cmdbuf_space_pool()
903 spin_lock(&man->lock); in vmw_cmdbuf_space_pool()
905 spin_unlock(&man->lock); in vmw_cmdbuf_space_pool()
918 static int vmw_cmdbuf_space_inline(struct vmw_cmdbuf_man *man, in vmw_cmdbuf_space_inline() argument
928 dheader = dma_pool_zalloc(man->dheaders, GFP_KERNEL, in vmw_cmdbuf_space_inline()
959 void *vmw_cmdbuf_alloc(struct vmw_cmdbuf_man *man, in vmw_cmdbuf_alloc() argument
973 ret = vmw_cmdbuf_space_inline(man, header, size); in vmw_cmdbuf_alloc()
975 ret = vmw_cmdbuf_space_pool(man, header, size, interruptible); in vmw_cmdbuf_alloc()
982 header->man = man; in vmw_cmdbuf_alloc()
1002 static void *vmw_cmdbuf_reserve_cur(struct vmw_cmdbuf_man *man, in vmw_cmdbuf_reserve_cur() argument
1010 if (vmw_cmdbuf_cur_lock(man, interruptible)) in vmw_cmdbuf_reserve_cur()
1013 cur = man->cur; in vmw_cmdbuf_reserve_cur()
1014 if (cur && (size + man->cur_pos > cur->size || in vmw_cmdbuf_reserve_cur()
1017 __vmw_cmdbuf_cur_flush(man); in vmw_cmdbuf_reserve_cur()
1019 if (!man->cur) { in vmw_cmdbuf_reserve_cur()
1020 ret = vmw_cmdbuf_alloc(man, in vmw_cmdbuf_reserve_cur()
1021 max_t(size_t, size, man->default_size), in vmw_cmdbuf_reserve_cur()
1022 interruptible, &man->cur); in vmw_cmdbuf_reserve_cur()
1024 vmw_cmdbuf_cur_unlock(man); in vmw_cmdbuf_reserve_cur()
1028 cur = man->cur; in vmw_cmdbuf_reserve_cur()
1038 return (void *) (man->cur->cmd + man->cur_pos); in vmw_cmdbuf_reserve_cur()
1048 static void vmw_cmdbuf_commit_cur(struct vmw_cmdbuf_man *man, in vmw_cmdbuf_commit_cur() argument
1051 struct vmw_cmdbuf_header *cur = man->cur; in vmw_cmdbuf_commit_cur()
1053 lockdep_assert_held_once(&man->cur_mutex); in vmw_cmdbuf_commit_cur()
1056 man->cur_pos += size; in vmw_cmdbuf_commit_cur()
1060 __vmw_cmdbuf_cur_flush(man); in vmw_cmdbuf_commit_cur()
1061 vmw_cmdbuf_cur_unlock(man); in vmw_cmdbuf_commit_cur()
1077 void *vmw_cmdbuf_reserve(struct vmw_cmdbuf_man *man, size_t size, in vmw_cmdbuf_reserve() argument
1082 return vmw_cmdbuf_reserve_cur(man, size, ctx_id, interruptible); in vmw_cmdbuf_reserve()
1105 void vmw_cmdbuf_commit(struct vmw_cmdbuf_man *man, size_t size, in vmw_cmdbuf_commit() argument
1109 vmw_cmdbuf_commit_cur(man, size, flush); in vmw_cmdbuf_commit()
1113 (void) vmw_cmdbuf_cur_lock(man, false); in vmw_cmdbuf_commit()
1114 __vmw_cmdbuf_cur_flush(man); in vmw_cmdbuf_commit()
1116 man->cur = header; in vmw_cmdbuf_commit()
1117 man->cur_pos = size; in vmw_cmdbuf_commit()
1121 __vmw_cmdbuf_cur_flush(man); in vmw_cmdbuf_commit()
1122 vmw_cmdbuf_cur_unlock(man); in vmw_cmdbuf_commit()
1135 static int vmw_cmdbuf_send_device_command(struct vmw_cmdbuf_man *man, in vmw_cmdbuf_send_device_command() argument
1141 void *cmd = vmw_cmdbuf_alloc(man, size, false, &header); in vmw_cmdbuf_send_device_command()
1149 spin_lock(&man->lock); in vmw_cmdbuf_send_device_command()
1151 spin_unlock(&man->lock); in vmw_cmdbuf_send_device_command()
1172 static int vmw_cmdbuf_preempt(struct vmw_cmdbuf_man *man, u32 context) in vmw_cmdbuf_preempt() argument
1183 return vmw_cmdbuf_send_device_command(man, &cmd, sizeof(cmd)); in vmw_cmdbuf_preempt()
1197 static int vmw_cmdbuf_startstop(struct vmw_cmdbuf_man *man, u32 context, in vmw_cmdbuf_startstop() argument
1209 return vmw_cmdbuf_send_device_command(man, &cmd, sizeof(cmd)); in vmw_cmdbuf_startstop()
1224 int vmw_cmdbuf_set_pool_size(struct vmw_cmdbuf_man *man, size_t size) in vmw_cmdbuf_set_pool_size() argument
1226 struct vmw_private *dev_priv = man->dev_priv; in vmw_cmdbuf_set_pool_size()
1229 if (man->has_pool) in vmw_cmdbuf_set_pool_size()
1234 man->map = dma_alloc_coherent(dev_priv->drm.dev, size, in vmw_cmdbuf_set_pool_size()
1235 &man->handle, GFP_KERNEL); in vmw_cmdbuf_set_pool_size()
1236 if (man->map) { in vmw_cmdbuf_set_pool_size()
1237 man->using_mob = false; in vmw_cmdbuf_set_pool_size()
1256 ret = vmw_bo_create(dev_priv, &bo_params, &man->cmd_space); in vmw_cmdbuf_set_pool_size()
1260 man->map = vmw_bo_map_and_cache(man->cmd_space); in vmw_cmdbuf_set_pool_size()
1261 man->using_mob = man->map; in vmw_cmdbuf_set_pool_size()
1264 man->size = size; in vmw_cmdbuf_set_pool_size()
1265 drm_mm_init(&man->mm, 0, size >> PAGE_SHIFT); in vmw_cmdbuf_set_pool_size()
1267 man->has_pool = true; in vmw_cmdbuf_set_pool_size()
1275 man->default_size = VMW_CMDBUF_INLINE_SIZE; in vmw_cmdbuf_set_pool_size()
1278 (man->using_mob) ? "MOB" : "DMA"); in vmw_cmdbuf_set_pool_size()
1295 struct vmw_cmdbuf_man *man; in vmw_cmdbuf_man_create() local
1303 man = kzalloc_obj(*man); in vmw_cmdbuf_man_create()
1304 if (!man) in vmw_cmdbuf_man_create()
1307 man->num_contexts = (dev_priv->capabilities & SVGA_CAP_HP_CMD_QUEUE) ? in vmw_cmdbuf_man_create()
1309 man->headers = dma_pool_create("vmwgfx cmdbuf", in vmw_cmdbuf_man_create()
1313 if (!man->headers) { in vmw_cmdbuf_man_create()
1318 man->dheaders = dma_pool_create("vmwgfx inline cmdbuf", in vmw_cmdbuf_man_create()
1322 if (!man->dheaders) { in vmw_cmdbuf_man_create()
1327 for_each_cmdbuf_ctx(man, i, ctx) in vmw_cmdbuf_man_create()
1330 INIT_LIST_HEAD(&man->error); in vmw_cmdbuf_man_create()
1331 spin_lock_init(&man->lock); in vmw_cmdbuf_man_create()
1332 mutex_init(&man->cur_mutex); in vmw_cmdbuf_man_create()
1333 mutex_init(&man->space_mutex); in vmw_cmdbuf_man_create()
1334 mutex_init(&man->error_mutex); in vmw_cmdbuf_man_create()
1335 man->default_size = VMW_CMDBUF_INLINE_SIZE; in vmw_cmdbuf_man_create()
1336 init_waitqueue_head(&man->alloc_queue); in vmw_cmdbuf_man_create()
1337 init_waitqueue_head(&man->idle_queue); in vmw_cmdbuf_man_create()
1338 man->dev_priv = dev_priv; in vmw_cmdbuf_man_create()
1339 man->max_hw_submitted = SVGA_CB_MAX_QUEUED_PER_CONTEXT - 1; in vmw_cmdbuf_man_create()
1340 INIT_WORK(&man->work, &vmw_cmdbuf_work_func); in vmw_cmdbuf_man_create()
1343 ret = vmw_cmdbuf_startstop(man, 0, true); in vmw_cmdbuf_man_create()
1346 vmw_cmdbuf_man_destroy(man); in vmw_cmdbuf_man_create()
1350 return man; in vmw_cmdbuf_man_create()
1353 dma_pool_destroy(man->headers); in vmw_cmdbuf_man_create()
1355 kfree(man); in vmw_cmdbuf_man_create()
1371 void vmw_cmdbuf_remove_pool(struct vmw_cmdbuf_man *man) in vmw_cmdbuf_remove_pool() argument
1373 if (!man->has_pool) in vmw_cmdbuf_remove_pool()
1376 man->has_pool = false; in vmw_cmdbuf_remove_pool()
1377 man->default_size = VMW_CMDBUF_INLINE_SIZE; in vmw_cmdbuf_remove_pool()
1378 (void) vmw_cmdbuf_idle(man, false, 10*HZ); in vmw_cmdbuf_remove_pool()
1379 if (man->using_mob) in vmw_cmdbuf_remove_pool()
1380 vmw_bo_unreference(&man->cmd_space); in vmw_cmdbuf_remove_pool()
1382 dma_free_coherent(man->dev_priv->drm.dev, in vmw_cmdbuf_remove_pool()
1383 man->size, man->map, man->handle); in vmw_cmdbuf_remove_pool()
1393 void vmw_cmdbuf_man_destroy(struct vmw_cmdbuf_man *man) in vmw_cmdbuf_man_destroy() argument
1395 WARN_ON_ONCE(man->has_pool); in vmw_cmdbuf_man_destroy()
1396 (void) vmw_cmdbuf_idle(man, false, 10*HZ); in vmw_cmdbuf_man_destroy()
1398 if (vmw_cmdbuf_startstop(man, 0, false)) in vmw_cmdbuf_man_destroy()
1401 vmw_generic_waiter_remove(man->dev_priv, SVGA_IRQFLAG_ERROR, in vmw_cmdbuf_man_destroy()
1402 &man->dev_priv->error_waiters); in vmw_cmdbuf_man_destroy()
1403 (void) cancel_work_sync(&man->work); in vmw_cmdbuf_man_destroy()
1404 dma_pool_destroy(man->dheaders); in vmw_cmdbuf_man_destroy()
1405 dma_pool_destroy(man->headers); in vmw_cmdbuf_man_destroy()
1406 mutex_destroy(&man->cur_mutex); in vmw_cmdbuf_man_destroy()
1407 mutex_destroy(&man->space_mutex); in vmw_cmdbuf_man_destroy()
1408 mutex_destroy(&man->error_mutex); in vmw_cmdbuf_man_destroy()
1409 kfree(man); in vmw_cmdbuf_man_destroy()