Lines Matching refs:man

151 	struct vmw_cmdbuf_man *man;  member
193 static int vmw_cmdbuf_startstop(struct vmw_cmdbuf_man *man, u32 context,
195 static int vmw_cmdbuf_preempt(struct vmw_cmdbuf_man *man, u32 context);
203 static int vmw_cmdbuf_cur_lock(struct vmw_cmdbuf_man *man, bool interruptible) in vmw_cmdbuf_cur_lock() argument
206 if (mutex_lock_interruptible(&man->cur_mutex)) in vmw_cmdbuf_cur_lock()
209 mutex_lock(&man->cur_mutex); in vmw_cmdbuf_cur_lock()
220 static void vmw_cmdbuf_cur_unlock(struct vmw_cmdbuf_man *man) in vmw_cmdbuf_cur_unlock() argument
222 mutex_unlock(&man->cur_mutex); in vmw_cmdbuf_cur_unlock()
241 dma_pool_free(header->man->dheaders, dheader, header->handle); in vmw_cmdbuf_header_inline_free()
255 struct vmw_cmdbuf_man *man = header->man; in __vmw_cmdbuf_header_free() local
257 lockdep_assert_held_once(&man->lock); in __vmw_cmdbuf_header_free()
265 wake_up_all(&man->alloc_queue); in __vmw_cmdbuf_header_free()
267 dma_pool_free(man->headers, header->cb_header, in __vmw_cmdbuf_header_free()
280 struct vmw_cmdbuf_man *man = header->man; in vmw_cmdbuf_header_free() local
287 spin_lock(&man->lock); in vmw_cmdbuf_header_free()
289 spin_unlock(&man->lock); in vmw_cmdbuf_header_free()
300 struct vmw_cmdbuf_man *man = header->man; in vmw_cmdbuf_header_submit() local
304 vmw_write(man->dev_priv, SVGA_REG_COMMAND_HIGH, val); in vmw_cmdbuf_header_submit()
308 vmw_write(man->dev_priv, SVGA_REG_COMMAND_LOW, val); in vmw_cmdbuf_header_submit()
336 static void vmw_cmdbuf_ctx_submit(struct vmw_cmdbuf_man *man, in vmw_cmdbuf_ctx_submit() argument
339 while (ctx->num_hw_submitted < man->max_hw_submitted && in vmw_cmdbuf_ctx_submit()
374 static void vmw_cmdbuf_ctx_process(struct vmw_cmdbuf_man *man, in vmw_cmdbuf_ctx_process() argument
380 vmw_cmdbuf_ctx_submit(man, ctx); in vmw_cmdbuf_ctx_process()
389 wake_up_all(&man->idle_queue); in vmw_cmdbuf_ctx_process()
397 list_add_tail(&entry->list, &man->error); in vmw_cmdbuf_ctx_process()
398 schedule_work(&man->work); in vmw_cmdbuf_ctx_process()
415 vmw_cmdbuf_ctx_submit(man, ctx); in vmw_cmdbuf_ctx_process()
430 static void vmw_cmdbuf_man_process(struct vmw_cmdbuf_man *man) in vmw_cmdbuf_man_process() argument
438 for_each_cmdbuf_ctx(man, i, ctx) in vmw_cmdbuf_man_process()
439 vmw_cmdbuf_ctx_process(man, ctx, &notempty); in vmw_cmdbuf_man_process()
441 if (man->irq_on && !notempty) { in vmw_cmdbuf_man_process()
442 vmw_generic_waiter_remove(man->dev_priv, in vmw_cmdbuf_man_process()
444 &man->dev_priv->cmdbuf_waiters); in vmw_cmdbuf_man_process()
445 man->irq_on = false; in vmw_cmdbuf_man_process()
446 } else if (!man->irq_on && notempty) { in vmw_cmdbuf_man_process()
447 vmw_generic_waiter_add(man->dev_priv, in vmw_cmdbuf_man_process()
449 &man->dev_priv->cmdbuf_waiters); in vmw_cmdbuf_man_process()
450 man->irq_on = true; in vmw_cmdbuf_man_process()
470 static void vmw_cmdbuf_ctx_add(struct vmw_cmdbuf_man *man, in vmw_cmdbuf_ctx_add() argument
477 list_add_tail(&header->list, &man->ctx[cb_context].submitted); in vmw_cmdbuf_ctx_add()
479 vmw_cmdbuf_man_process(man); in vmw_cmdbuf_ctx_add()
492 void vmw_cmdbuf_irqthread(struct vmw_cmdbuf_man *man) in vmw_cmdbuf_irqthread() argument
494 spin_lock(&man->lock); in vmw_cmdbuf_irqthread()
495 vmw_cmdbuf_man_process(man); in vmw_cmdbuf_irqthread()
496 spin_unlock(&man->lock); in vmw_cmdbuf_irqthread()
510 struct vmw_cmdbuf_man *man = in vmw_cmdbuf_work_func() local
521 for_each_cmdbuf_ctx(man, i, ctx) { in vmw_cmdbuf_work_func()
526 mutex_lock(&man->error_mutex); in vmw_cmdbuf_work_func()
527 spin_lock(&man->lock); in vmw_cmdbuf_work_func()
528 list_for_each_entry_safe(entry, next, &man->error, list) { in vmw_cmdbuf_work_func()
562 if (man->using_mob) in vmw_cmdbuf_work_func()
575 for_each_cmdbuf_ctx(man, i, ctx) in vmw_cmdbuf_work_func()
576 man->ctx[i].block_submission = true; in vmw_cmdbuf_work_func()
578 spin_unlock(&man->lock); in vmw_cmdbuf_work_func()
581 if (global_block && vmw_cmdbuf_preempt(man, 0)) in vmw_cmdbuf_work_func()
584 spin_lock(&man->lock); in vmw_cmdbuf_work_func()
585 for_each_cmdbuf_ctx(man, i, ctx) { in vmw_cmdbuf_work_func()
587 vmw_cmdbuf_ctx_process(man, ctx, &dummy); in vmw_cmdbuf_work_func()
604 vmw_cmdbuf_man_process(man); in vmw_cmdbuf_work_func()
605 spin_unlock(&man->lock); in vmw_cmdbuf_work_func()
607 if (global_block && vmw_cmdbuf_startstop(man, 0, true)) in vmw_cmdbuf_work_func()
612 vmw_fifo_send_fence(man->dev_priv, &dummy); in vmw_cmdbuf_work_func()
613 wake_up_all(&man->idle_queue); in vmw_cmdbuf_work_func()
616 mutex_unlock(&man->error_mutex); in vmw_cmdbuf_work_func()
626 static bool vmw_cmdbuf_man_idle(struct vmw_cmdbuf_man *man, in vmw_cmdbuf_man_idle() argument
633 spin_lock(&man->lock); in vmw_cmdbuf_man_idle()
634 vmw_cmdbuf_man_process(man); in vmw_cmdbuf_man_idle()
635 for_each_cmdbuf_ctx(man, i, ctx) { in vmw_cmdbuf_man_idle()
642 idle = list_empty(&man->error); in vmw_cmdbuf_man_idle()
645 spin_unlock(&man->lock); in vmw_cmdbuf_man_idle()
659 static void __vmw_cmdbuf_cur_flush(struct vmw_cmdbuf_man *man) in __vmw_cmdbuf_cur_flush() argument
661 struct vmw_cmdbuf_header *cur = man->cur; in __vmw_cmdbuf_cur_flush()
663 WARN_ON(!mutex_is_locked(&man->cur_mutex)); in __vmw_cmdbuf_cur_flush()
668 spin_lock(&man->lock); in __vmw_cmdbuf_cur_flush()
669 if (man->cur_pos == 0) { in __vmw_cmdbuf_cur_flush()
674 man->cur->cb_header->length = man->cur_pos; in __vmw_cmdbuf_cur_flush()
675 vmw_cmdbuf_ctx_add(man, man->cur, SVGA_CB_CONTEXT_0); in __vmw_cmdbuf_cur_flush()
677 spin_unlock(&man->lock); in __vmw_cmdbuf_cur_flush()
678 man->cur = NULL; in __vmw_cmdbuf_cur_flush()
679 man->cur_pos = 0; in __vmw_cmdbuf_cur_flush()
692 int vmw_cmdbuf_cur_flush(struct vmw_cmdbuf_man *man, in vmw_cmdbuf_cur_flush() argument
695 int ret = vmw_cmdbuf_cur_lock(man, interruptible); in vmw_cmdbuf_cur_flush()
700 __vmw_cmdbuf_cur_flush(man); in vmw_cmdbuf_cur_flush()
701 vmw_cmdbuf_cur_unlock(man); in vmw_cmdbuf_cur_flush()
717 int vmw_cmdbuf_idle(struct vmw_cmdbuf_man *man, bool interruptible, in vmw_cmdbuf_idle() argument
722 ret = vmw_cmdbuf_cur_flush(man, interruptible); in vmw_cmdbuf_idle()
723 vmw_generic_waiter_add(man->dev_priv, in vmw_cmdbuf_idle()
725 &man->dev_priv->cmdbuf_waiters); in vmw_cmdbuf_idle()
729 (man->idle_queue, vmw_cmdbuf_man_idle(man, true), in vmw_cmdbuf_idle()
733 (man->idle_queue, vmw_cmdbuf_man_idle(man, true), in vmw_cmdbuf_idle()
736 vmw_generic_waiter_remove(man->dev_priv, in vmw_cmdbuf_idle()
738 &man->dev_priv->cmdbuf_waiters); in vmw_cmdbuf_idle()
740 if (!vmw_cmdbuf_man_idle(man, true)) in vmw_cmdbuf_idle()
761 static bool vmw_cmdbuf_try_alloc(struct vmw_cmdbuf_man *man, in vmw_cmdbuf_try_alloc() argument
770 spin_lock(&man->lock); in vmw_cmdbuf_try_alloc()
771 ret = drm_mm_insert_node(&man->mm, info->node, info->page_size); in vmw_cmdbuf_try_alloc()
773 vmw_cmdbuf_man_process(man); in vmw_cmdbuf_try_alloc()
774 ret = drm_mm_insert_node(&man->mm, info->node, info->page_size); in vmw_cmdbuf_try_alloc()
777 spin_unlock(&man->lock); in vmw_cmdbuf_try_alloc()
795 static int vmw_cmdbuf_alloc_space(struct vmw_cmdbuf_man *man, in vmw_cmdbuf_alloc_space() argument
811 if (mutex_lock_interruptible(&man->space_mutex)) in vmw_cmdbuf_alloc_space()
814 mutex_lock(&man->space_mutex); in vmw_cmdbuf_alloc_space()
818 if (vmw_cmdbuf_try_alloc(man, &info)) in vmw_cmdbuf_alloc_space()
821 vmw_generic_waiter_add(man->dev_priv, in vmw_cmdbuf_alloc_space()
823 &man->dev_priv->cmdbuf_waiters); in vmw_cmdbuf_alloc_space()
829 (man->alloc_queue, vmw_cmdbuf_try_alloc(man, &info)); in vmw_cmdbuf_alloc_space()
832 (man->dev_priv, SVGA_IRQFLAG_COMMAND_BUFFER, in vmw_cmdbuf_alloc_space()
833 &man->dev_priv->cmdbuf_waiters); in vmw_cmdbuf_alloc_space()
834 mutex_unlock(&man->space_mutex); in vmw_cmdbuf_alloc_space()
838 wait_event(man->alloc_queue, vmw_cmdbuf_try_alloc(man, &info)); in vmw_cmdbuf_alloc_space()
840 vmw_generic_waiter_remove(man->dev_priv, in vmw_cmdbuf_alloc_space()
842 &man->dev_priv->cmdbuf_waiters); in vmw_cmdbuf_alloc_space()
845 mutex_unlock(&man->space_mutex); in vmw_cmdbuf_alloc_space()
859 static int vmw_cmdbuf_space_pool(struct vmw_cmdbuf_man *man, in vmw_cmdbuf_space_pool() argument
868 if (!man->has_pool) in vmw_cmdbuf_space_pool()
871 ret = vmw_cmdbuf_alloc_space(man, &header->node, size, interruptible); in vmw_cmdbuf_space_pool()
876 header->cb_header = dma_pool_zalloc(man->headers, GFP_KERNEL, in vmw_cmdbuf_space_pool()
886 header->cmd = man->map + offset; in vmw_cmdbuf_space_pool()
887 if (man->using_mob) { in vmw_cmdbuf_space_pool()
889 cb_hdr->ptr.mob.mobid = man->cmd_space->mem.start; in vmw_cmdbuf_space_pool()
892 cb_hdr->ptr.pa = (u64)man->handle + (u64)offset; in vmw_cmdbuf_space_pool()
898 spin_lock(&man->lock); in vmw_cmdbuf_space_pool()
900 spin_unlock(&man->lock); in vmw_cmdbuf_space_pool()
913 static int vmw_cmdbuf_space_inline(struct vmw_cmdbuf_man *man, in vmw_cmdbuf_space_inline() argument
923 dheader = dma_pool_zalloc(man->dheaders, GFP_KERNEL, in vmw_cmdbuf_space_inline()
954 void *vmw_cmdbuf_alloc(struct vmw_cmdbuf_man *man, in vmw_cmdbuf_alloc() argument
968 ret = vmw_cmdbuf_space_inline(man, header, size); in vmw_cmdbuf_alloc()
970 ret = vmw_cmdbuf_space_pool(man, header, size, interruptible); in vmw_cmdbuf_alloc()
977 header->man = man; in vmw_cmdbuf_alloc()
997 static void *vmw_cmdbuf_reserve_cur(struct vmw_cmdbuf_man *man, in vmw_cmdbuf_reserve_cur() argument
1005 if (vmw_cmdbuf_cur_lock(man, interruptible)) in vmw_cmdbuf_reserve_cur()
1008 cur = man->cur; in vmw_cmdbuf_reserve_cur()
1009 if (cur && (size + man->cur_pos > cur->size || in vmw_cmdbuf_reserve_cur()
1012 __vmw_cmdbuf_cur_flush(man); in vmw_cmdbuf_reserve_cur()
1014 if (!man->cur) { in vmw_cmdbuf_reserve_cur()
1015 ret = vmw_cmdbuf_alloc(man, in vmw_cmdbuf_reserve_cur()
1016 max_t(size_t, size, man->default_size), in vmw_cmdbuf_reserve_cur()
1017 interruptible, &man->cur); in vmw_cmdbuf_reserve_cur()
1019 vmw_cmdbuf_cur_unlock(man); in vmw_cmdbuf_reserve_cur()
1023 cur = man->cur; in vmw_cmdbuf_reserve_cur()
1033 return (void *) (man->cur->cmd + man->cur_pos); in vmw_cmdbuf_reserve_cur()
1043 static void vmw_cmdbuf_commit_cur(struct vmw_cmdbuf_man *man, in vmw_cmdbuf_commit_cur() argument
1046 struct vmw_cmdbuf_header *cur = man->cur; in vmw_cmdbuf_commit_cur()
1048 WARN_ON(!mutex_is_locked(&man->cur_mutex)); in vmw_cmdbuf_commit_cur()
1051 man->cur_pos += size; in vmw_cmdbuf_commit_cur()
1055 __vmw_cmdbuf_cur_flush(man); in vmw_cmdbuf_commit_cur()
1056 vmw_cmdbuf_cur_unlock(man); in vmw_cmdbuf_commit_cur()
1072 void *vmw_cmdbuf_reserve(struct vmw_cmdbuf_man *man, size_t size, in vmw_cmdbuf_reserve() argument
1077 return vmw_cmdbuf_reserve_cur(man, size, ctx_id, interruptible); in vmw_cmdbuf_reserve()
1100 void vmw_cmdbuf_commit(struct vmw_cmdbuf_man *man, size_t size, in vmw_cmdbuf_commit() argument
1104 vmw_cmdbuf_commit_cur(man, size, flush); in vmw_cmdbuf_commit()
1108 (void) vmw_cmdbuf_cur_lock(man, false); in vmw_cmdbuf_commit()
1109 __vmw_cmdbuf_cur_flush(man); in vmw_cmdbuf_commit()
1111 man->cur = header; in vmw_cmdbuf_commit()
1112 man->cur_pos = size; in vmw_cmdbuf_commit()
1116 __vmw_cmdbuf_cur_flush(man); in vmw_cmdbuf_commit()
1117 vmw_cmdbuf_cur_unlock(man); in vmw_cmdbuf_commit()
1130 static int vmw_cmdbuf_send_device_command(struct vmw_cmdbuf_man *man, in vmw_cmdbuf_send_device_command() argument
1136 void *cmd = vmw_cmdbuf_alloc(man, size, false, &header); in vmw_cmdbuf_send_device_command()
1144 spin_lock(&man->lock); in vmw_cmdbuf_send_device_command()
1146 spin_unlock(&man->lock); in vmw_cmdbuf_send_device_command()
1166 static int vmw_cmdbuf_preempt(struct vmw_cmdbuf_man *man, u32 context) in vmw_cmdbuf_preempt() argument
1177 return vmw_cmdbuf_send_device_command(man, &cmd, sizeof(cmd)); in vmw_cmdbuf_preempt()
1190 static int vmw_cmdbuf_startstop(struct vmw_cmdbuf_man *man, u32 context, in vmw_cmdbuf_startstop() argument
1202 return vmw_cmdbuf_send_device_command(man, &cmd, sizeof(cmd)); in vmw_cmdbuf_startstop()
1220 int vmw_cmdbuf_set_pool_size(struct vmw_cmdbuf_man *man, in vmw_cmdbuf_set_pool_size() argument
1223 struct vmw_private *dev_priv = man->dev_priv; in vmw_cmdbuf_set_pool_size()
1227 if (man->has_pool) in vmw_cmdbuf_set_pool_size()
1232 man->map = dma_alloc_coherent(&dev_priv->dev->pdev->dev, size, in vmw_cmdbuf_set_pool_size()
1233 &man->handle, GFP_KERNEL); in vmw_cmdbuf_set_pool_size()
1234 if (man->map) { in vmw_cmdbuf_set_pool_size()
1235 man->using_mob = false; in vmw_cmdbuf_set_pool_size()
1248 &man->cmd_space); in vmw_cmdbuf_set_pool_size()
1252 man->using_mob = true; in vmw_cmdbuf_set_pool_size()
1253 ret = ttm_bo_kmap(man->cmd_space, 0, size >> PAGE_SHIFT, in vmw_cmdbuf_set_pool_size()
1254 &man->map_obj); in vmw_cmdbuf_set_pool_size()
1258 man->map = ttm_kmap_obj_virtual(&man->map_obj, &dummy); in vmw_cmdbuf_set_pool_size()
1261 man->size = size; in vmw_cmdbuf_set_pool_size()
1262 drm_mm_init(&man->mm, 0, size >> PAGE_SHIFT); in vmw_cmdbuf_set_pool_size()
1264 man->has_pool = true; in vmw_cmdbuf_set_pool_size()
1272 man->default_size = VMW_CMDBUF_INLINE_SIZE; in vmw_cmdbuf_set_pool_size()
1274 (man->using_mob) ? "MOB" : "DMA"); in vmw_cmdbuf_set_pool_size()
1279 if (man->using_mob) in vmw_cmdbuf_set_pool_size()
1280 ttm_bo_unref(&man->cmd_space); in vmw_cmdbuf_set_pool_size()
1297 struct vmw_cmdbuf_man *man; in vmw_cmdbuf_man_create() local
1305 man = kzalloc(sizeof(*man), GFP_KERNEL); in vmw_cmdbuf_man_create()
1306 if (!man) in vmw_cmdbuf_man_create()
1309 man->num_contexts = (dev_priv->capabilities & SVGA_CAP_HP_CMD_QUEUE) ? in vmw_cmdbuf_man_create()
1311 man->headers = dma_pool_create("vmwgfx cmdbuf", in vmw_cmdbuf_man_create()
1315 if (!man->headers) { in vmw_cmdbuf_man_create()
1320 man->dheaders = dma_pool_create("vmwgfx inline cmdbuf", in vmw_cmdbuf_man_create()
1324 if (!man->dheaders) { in vmw_cmdbuf_man_create()
1329 for_each_cmdbuf_ctx(man, i, ctx) in vmw_cmdbuf_man_create()
1332 INIT_LIST_HEAD(&man->error); in vmw_cmdbuf_man_create()
1333 spin_lock_init(&man->lock); in vmw_cmdbuf_man_create()
1334 mutex_init(&man->cur_mutex); in vmw_cmdbuf_man_create()
1335 mutex_init(&man->space_mutex); in vmw_cmdbuf_man_create()
1336 mutex_init(&man->error_mutex); in vmw_cmdbuf_man_create()
1337 man->default_size = VMW_CMDBUF_INLINE_SIZE; in vmw_cmdbuf_man_create()
1338 init_waitqueue_head(&man->alloc_queue); in vmw_cmdbuf_man_create()
1339 init_waitqueue_head(&man->idle_queue); in vmw_cmdbuf_man_create()
1340 man->dev_priv = dev_priv; in vmw_cmdbuf_man_create()
1341 man->max_hw_submitted = SVGA_CB_MAX_QUEUED_PER_CONTEXT - 1; in vmw_cmdbuf_man_create()
1342 INIT_WORK(&man->work, &vmw_cmdbuf_work_func); in vmw_cmdbuf_man_create()
1345 ret = vmw_cmdbuf_startstop(man, 0, true); in vmw_cmdbuf_man_create()
1348 vmw_cmdbuf_man_destroy(man); in vmw_cmdbuf_man_create()
1352 return man; in vmw_cmdbuf_man_create()
1355 dma_pool_destroy(man->headers); in vmw_cmdbuf_man_create()
1357 kfree(man); in vmw_cmdbuf_man_create()
1373 void vmw_cmdbuf_remove_pool(struct vmw_cmdbuf_man *man) in vmw_cmdbuf_remove_pool() argument
1375 if (!man->has_pool) in vmw_cmdbuf_remove_pool()
1378 man->has_pool = false; in vmw_cmdbuf_remove_pool()
1379 man->default_size = VMW_CMDBUF_INLINE_SIZE; in vmw_cmdbuf_remove_pool()
1380 (void) vmw_cmdbuf_idle(man, false, 10*HZ); in vmw_cmdbuf_remove_pool()
1381 if (man->using_mob) { in vmw_cmdbuf_remove_pool()
1382 (void) ttm_bo_kunmap(&man->map_obj); in vmw_cmdbuf_remove_pool()
1383 ttm_bo_unref(&man->cmd_space); in vmw_cmdbuf_remove_pool()
1385 dma_free_coherent(&man->dev_priv->dev->pdev->dev, in vmw_cmdbuf_remove_pool()
1386 man->size, man->map, man->handle); in vmw_cmdbuf_remove_pool()
1397 void vmw_cmdbuf_man_destroy(struct vmw_cmdbuf_man *man) in vmw_cmdbuf_man_destroy() argument
1399 WARN_ON_ONCE(man->has_pool); in vmw_cmdbuf_man_destroy()
1400 (void) vmw_cmdbuf_idle(man, false, 10*HZ); in vmw_cmdbuf_man_destroy()
1402 if (vmw_cmdbuf_startstop(man, 0, false)) in vmw_cmdbuf_man_destroy()
1405 vmw_generic_waiter_remove(man->dev_priv, SVGA_IRQFLAG_ERROR, in vmw_cmdbuf_man_destroy()
1406 &man->dev_priv->error_waiters); in vmw_cmdbuf_man_destroy()
1407 (void) cancel_work_sync(&man->work); in vmw_cmdbuf_man_destroy()
1408 dma_pool_destroy(man->dheaders); in vmw_cmdbuf_man_destroy()
1409 dma_pool_destroy(man->headers); in vmw_cmdbuf_man_destroy()
1410 mutex_destroy(&man->cur_mutex); in vmw_cmdbuf_man_destroy()
1411 mutex_destroy(&man->space_mutex); in vmw_cmdbuf_man_destroy()
1412 mutex_destroy(&man->error_mutex); in vmw_cmdbuf_man_destroy()
1413 kfree(man); in vmw_cmdbuf_man_destroy()