cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

vmwgfx_cmdbuf.c (39850B)


      1// SPDX-License-Identifier: GPL-2.0 OR MIT
      2/**************************************************************************
      3 *
      4 * Copyright 2015 VMware, Inc., Palo Alto, CA., USA
      5 *
      6 * Permission is hereby granted, free of charge, to any person obtaining a
      7 * copy of this software and associated documentation files (the
      8 * "Software"), to deal in the Software without restriction, including
      9 * without limitation the rights to use, copy, modify, merge, publish,
     10 * distribute, sub license, and/or sell copies of the Software, and to
     11 * permit persons to whom the Software is furnished to do so, subject to
     12 * the following conditions:
     13 *
     14 * The above copyright notice and this permission notice (including the
     15 * next paragraph) shall be included in all copies or substantial portions
     16 * of the Software.
     17 *
     18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     19 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     20 * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
     21 * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM,
     22 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
     23 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
     24 * USE OR OTHER DEALINGS IN THE SOFTWARE.
     25 *
     26 **************************************************************************/
     27
     28#include <linux/dmapool.h>
     29#include <linux/pci.h>
     30
     31#include <drm/ttm/ttm_bo_api.h>
     32
     33#include "vmwgfx_drv.h"
     34
     35/*
     36 * Size of inline command buffers. Try to make sure that a page size is a
     37 * multiple of the DMA pool allocation size.
     38 */
     39#define VMW_CMDBUF_INLINE_ALIGN 64
     40#define VMW_CMDBUF_INLINE_SIZE \
     41	(1024 - ALIGN(sizeof(SVGACBHeader), VMW_CMDBUF_INLINE_ALIGN))
     42
     43/**
     44 * struct vmw_cmdbuf_context - Command buffer context queues
     45 *
     46 * @submitted: List of command buffers that have been submitted to the
     47 * manager but not yet submitted to hardware.
     48 * @hw_submitted: List of command buffers submitted to hardware.
     49 * @preempted: List of preempted command buffers.
     50 * @num_hw_submitted: Number of buffers currently being processed by hardware
     51 * @block_submission: Identifies a block command submission.
     52 */
     53struct vmw_cmdbuf_context {
     54	struct list_head submitted;
     55	struct list_head hw_submitted;
     56	struct list_head preempted;
     57	unsigned num_hw_submitted;
     58	bool block_submission;
     59};
     60
     61/**
     62 * struct vmw_cmdbuf_man - Command buffer manager
     63 *
     64 * @cur_mutex: Mutex protecting the command buffer used for incremental small
     65 * kernel command submissions, @cur.
     66 * @space_mutex: Mutex to protect against starvation when we allocate
     67 * main pool buffer space.
     68 * @error_mutex: Mutex to serialize the work queue error handling.
     69 * Note this is not needed if the same workqueue handler
     70 * can't race with itself...
     71 * @work: A struct work_struct implementeing command buffer error handling.
     72 * Immutable.
     73 * @dev_priv: Pointer to the device private struct. Immutable.
     74 * @ctx: Array of command buffer context queues. The queues and the context
     75 * data is protected by @lock.
     76 * @error: List of command buffers that have caused device errors.
     77 * Protected by @lock.
     78 * @mm: Range manager for the command buffer space. Manager allocations and
     79 * frees are protected by @lock.
     80 * @cmd_space: Buffer object for the command buffer space, unless we were
     81 * able to make a contigous coherent DMA memory allocation, @handle. Immutable.
     82 * @map_obj: Mapping state for @cmd_space. Immutable.
     83 * @map: Pointer to command buffer space. May be a mapped buffer object or
     84 * a contigous coherent DMA memory allocation. Immutable.
     85 * @cur: Command buffer for small kernel command submissions. Protected by
     86 * the @cur_mutex.
     87 * @cur_pos: Space already used in @cur. Protected by @cur_mutex.
     88 * @default_size: Default size for the @cur command buffer. Immutable.
     89 * @max_hw_submitted: Max number of in-flight command buffers the device can
     90 * handle. Immutable.
     91 * @lock: Spinlock protecting command submission queues.
     92 * @headers: Pool of DMA memory for device command buffer headers.
     93 * Internal protection.
     94 * @dheaders: Pool of DMA memory for device command buffer headers with trailing
     95 * space for inline data. Internal protection.
     96 * @alloc_queue: Wait queue for processes waiting to allocate command buffer
     97 * space.
     98 * @idle_queue: Wait queue for processes waiting for command buffer idle.
     99 * @irq_on: Whether the process function has requested irq to be turned on.
    100 * Protected by @lock.
    101 * @using_mob: Whether the command buffer space is a MOB or a contigous DMA
    102 * allocation. Immutable.
    103 * @has_pool: Has a large pool of DMA memory which allows larger allocations.
    104 * Typically this is false only during bootstrap.
    105 * @handle: DMA address handle for the command buffer space if @using_mob is
    106 * false. Immutable.
    107 * @size: The size of the command buffer space. Immutable.
    108 * @num_contexts: Number of contexts actually enabled.
    109 */
    110struct vmw_cmdbuf_man {
    111	struct mutex cur_mutex;
    112	struct mutex space_mutex;
    113	struct mutex error_mutex;
    114	struct work_struct work;
    115	struct vmw_private *dev_priv;
    116	struct vmw_cmdbuf_context ctx[SVGA_CB_CONTEXT_MAX];
    117	struct list_head error;
    118	struct drm_mm mm;
    119	struct ttm_buffer_object *cmd_space;
    120	struct ttm_bo_kmap_obj map_obj;
    121	u8 *map;
    122	struct vmw_cmdbuf_header *cur;
    123	size_t cur_pos;
    124	size_t default_size;
    125	unsigned max_hw_submitted;
    126	spinlock_t lock;
    127	struct dma_pool *headers;
    128	struct dma_pool *dheaders;
    129	wait_queue_head_t alloc_queue;
    130	wait_queue_head_t idle_queue;
    131	bool irq_on;
    132	bool using_mob;
    133	bool has_pool;
    134	dma_addr_t handle;
    135	size_t size;
    136	u32 num_contexts;
    137};
    138
    139/**
    140 * struct vmw_cmdbuf_header - Command buffer metadata
    141 *
    142 * @man: The command buffer manager.
    143 * @cb_header: Device command buffer header, allocated from a DMA pool.
    144 * @cb_context: The device command buffer context.
    145 * @list: List head for attaching to the manager lists.
    146 * @node: The range manager node.
    147 * @handle: The DMA address of @cb_header. Handed to the device on command
    148 * buffer submission.
    149 * @cmd: Pointer to the command buffer space of this buffer.
    150 * @size: Size of the command buffer space of this buffer.
    151 * @reserved: Reserved space of this buffer.
    152 * @inline_space: Whether inline command buffer space is used.
    153 */
    154struct vmw_cmdbuf_header {
    155	struct vmw_cmdbuf_man *man;
    156	SVGACBHeader *cb_header;
    157	SVGACBContext cb_context;
    158	struct list_head list;
    159	struct drm_mm_node node;
    160	dma_addr_t handle;
    161	u8 *cmd;
    162	size_t size;
    163	size_t reserved;
    164	bool inline_space;
    165};
    166
    167/**
    168 * struct vmw_cmdbuf_dheader - Device command buffer header with inline
    169 * command buffer space.
    170 *
    171 * @cb_header: Device command buffer header.
    172 * @cmd: Inline command buffer space.
    173 */
    174struct vmw_cmdbuf_dheader {
    175	SVGACBHeader cb_header;
    176	u8 cmd[VMW_CMDBUF_INLINE_SIZE] __aligned(VMW_CMDBUF_INLINE_ALIGN);
    177};
    178
    179/**
    180 * struct vmw_cmdbuf_alloc_info - Command buffer space allocation metadata
    181 *
    182 * @page_size: Size of requested command buffer space in pages.
    183 * @node: Pointer to the range manager node.
    184 * @done: True if this allocation has succeeded.
    185 */
    186struct vmw_cmdbuf_alloc_info {
    187	size_t page_size;
    188	struct drm_mm_node *node;
    189	bool done;
    190};
    191
    192/* Loop over each context in the command buffer manager. */
    193#define for_each_cmdbuf_ctx(_man, _i, _ctx)				\
    194	for (_i = 0, _ctx = &(_man)->ctx[0]; (_i) < (_man)->num_contexts; \
    195	     ++(_i), ++(_ctx))
    196
    197static int vmw_cmdbuf_startstop(struct vmw_cmdbuf_man *man, u32 context,
    198				bool enable);
    199static int vmw_cmdbuf_preempt(struct vmw_cmdbuf_man *man, u32 context);
    200
    201/**
    202 * vmw_cmdbuf_cur_lock - Helper to lock the cur_mutex.
    203 *
    204 * @man: The range manager.
    205 * @interruptible: Whether to wait interruptible when locking.
    206 */
    207static int vmw_cmdbuf_cur_lock(struct vmw_cmdbuf_man *man, bool interruptible)
    208{
    209	if (interruptible) {
    210		if (mutex_lock_interruptible(&man->cur_mutex))
    211			return -ERESTARTSYS;
    212	} else {
    213		mutex_lock(&man->cur_mutex);
    214	}
    215
    216	return 0;
    217}
    218
    219/**
    220 * vmw_cmdbuf_cur_unlock - Helper to unlock the cur_mutex.
    221 *
    222 * @man: The range manager.
    223 */
    224static void vmw_cmdbuf_cur_unlock(struct vmw_cmdbuf_man *man)
    225{
    226	mutex_unlock(&man->cur_mutex);
    227}
    228
    229/**
    230 * vmw_cmdbuf_header_inline_free - Free a struct vmw_cmdbuf_header that has
    231 * been used for the device context with inline command buffers.
    232 * Need not be called locked.
    233 *
    234 * @header: Pointer to the header to free.
    235 */
    236static void vmw_cmdbuf_header_inline_free(struct vmw_cmdbuf_header *header)
    237{
    238	struct vmw_cmdbuf_dheader *dheader;
    239
    240	if (WARN_ON_ONCE(!header->inline_space))
    241		return;
    242
    243	dheader = container_of(header->cb_header, struct vmw_cmdbuf_dheader,
    244			       cb_header);
    245	dma_pool_free(header->man->dheaders, dheader, header->handle);
    246	kfree(header);
    247}
    248
    249/**
    250 * __vmw_cmdbuf_header_free - Free a struct vmw_cmdbuf_header  and its
    251 * associated structures.
    252 *
    253 * @header: Pointer to the header to free.
    254 *
    255 * For internal use. Must be called with man::lock held.
    256 */
    257static void __vmw_cmdbuf_header_free(struct vmw_cmdbuf_header *header)
    258{
    259	struct vmw_cmdbuf_man *man = header->man;
    260
    261	lockdep_assert_held_once(&man->lock);
    262
    263	if (header->inline_space) {
    264		vmw_cmdbuf_header_inline_free(header);
    265		return;
    266	}
    267
    268	drm_mm_remove_node(&header->node);
    269	wake_up_all(&man->alloc_queue);
    270	if (header->cb_header)
    271		dma_pool_free(man->headers, header->cb_header,
    272			      header->handle);
    273	kfree(header);
    274}
    275
    276/**
    277 * vmw_cmdbuf_header_free - Free a struct vmw_cmdbuf_header  and its
    278 * associated structures.
    279 *
    280 * @header: Pointer to the header to free.
    281 */
    282void vmw_cmdbuf_header_free(struct vmw_cmdbuf_header *header)
    283{
    284	struct vmw_cmdbuf_man *man = header->man;
    285
    286	/* Avoid locking if inline_space */
    287	if (header->inline_space) {
    288		vmw_cmdbuf_header_inline_free(header);
    289		return;
    290	}
    291	spin_lock(&man->lock);
    292	__vmw_cmdbuf_header_free(header);
    293	spin_unlock(&man->lock);
    294}
    295
    296
    297/**
    298 * vmw_cmdbuf_header_submit: Submit a command buffer to hardware.
    299 *
    300 * @header: The header of the buffer to submit.
    301 */
    302static int vmw_cmdbuf_header_submit(struct vmw_cmdbuf_header *header)
    303{
    304	struct vmw_cmdbuf_man *man = header->man;
    305	u32 val;
    306
    307	val = upper_32_bits(header->handle);
    308	vmw_write(man->dev_priv, SVGA_REG_COMMAND_HIGH, val);
    309
    310	val = lower_32_bits(header->handle);
    311	val |= header->cb_context & SVGA_CB_CONTEXT_MASK;
    312	vmw_write(man->dev_priv, SVGA_REG_COMMAND_LOW, val);
    313
    314	return header->cb_header->status;
    315}
    316
    317/**
    318 * vmw_cmdbuf_ctx_init: Initialize a command buffer context.
    319 *
    320 * @ctx: The command buffer context to initialize
    321 */
    322static void vmw_cmdbuf_ctx_init(struct vmw_cmdbuf_context *ctx)
    323{
    324	INIT_LIST_HEAD(&ctx->hw_submitted);
    325	INIT_LIST_HEAD(&ctx->submitted);
    326	INIT_LIST_HEAD(&ctx->preempted);
    327	ctx->num_hw_submitted = 0;
    328}
    329
    330/**
    331 * vmw_cmdbuf_ctx_submit: Submit command buffers from a command buffer
    332 * context.
    333 *
    334 * @man: The command buffer manager.
    335 * @ctx: The command buffer context.
    336 *
    337 * Submits command buffers to hardware until there are no more command
    338 * buffers to submit or the hardware can't handle more command buffers.
    339 */
    340static void vmw_cmdbuf_ctx_submit(struct vmw_cmdbuf_man *man,
    341				  struct vmw_cmdbuf_context *ctx)
    342{
    343	while (ctx->num_hw_submitted < man->max_hw_submitted &&
    344	       !list_empty(&ctx->submitted) &&
    345	       !ctx->block_submission) {
    346		struct vmw_cmdbuf_header *entry;
    347		SVGACBStatus status;
    348
    349		entry = list_first_entry(&ctx->submitted,
    350					 struct vmw_cmdbuf_header,
    351					 list);
    352
    353		status = vmw_cmdbuf_header_submit(entry);
    354
    355		/* This should never happen */
    356		if (WARN_ON_ONCE(status == SVGA_CB_STATUS_QUEUE_FULL)) {
    357			entry->cb_header->status = SVGA_CB_STATUS_NONE;
    358			break;
    359		}
    360
    361		list_move_tail(&entry->list, &ctx->hw_submitted);
    362		ctx->num_hw_submitted++;
    363	}
    364
    365}
    366
    367/**
    368 * vmw_cmdbuf_ctx_process - Process a command buffer context.
    369 *
    370 * @man: The command buffer manager.
    371 * @ctx: The command buffer context.
    372 * @notempty: Pass back count of non-empty command submitted lists.
    373 *
    374 * Submit command buffers to hardware if possible, and process finished
    375 * buffers. Typically freeing them, but on preemption or error take
    376 * appropriate action. Wake up waiters if appropriate.
    377 */
    378static void vmw_cmdbuf_ctx_process(struct vmw_cmdbuf_man *man,
    379				   struct vmw_cmdbuf_context *ctx,
    380				   int *notempty)
    381{
    382	struct vmw_cmdbuf_header *entry, *next;
    383
    384	vmw_cmdbuf_ctx_submit(man, ctx);
    385
    386	list_for_each_entry_safe(entry, next, &ctx->hw_submitted, list) {
    387		SVGACBStatus status = entry->cb_header->status;
    388
    389		if (status == SVGA_CB_STATUS_NONE)
    390			break;
    391
    392		list_del(&entry->list);
    393		wake_up_all(&man->idle_queue);
    394		ctx->num_hw_submitted--;
    395		switch (status) {
    396		case SVGA_CB_STATUS_COMPLETED:
    397			__vmw_cmdbuf_header_free(entry);
    398			break;
    399		case SVGA_CB_STATUS_COMMAND_ERROR:
    400			WARN_ONCE(true, "Command buffer error.\n");
    401			entry->cb_header->status = SVGA_CB_STATUS_NONE;
    402			list_add_tail(&entry->list, &man->error);
    403			schedule_work(&man->work);
    404			break;
    405		case SVGA_CB_STATUS_PREEMPTED:
    406			entry->cb_header->status = SVGA_CB_STATUS_NONE;
    407			list_add_tail(&entry->list, &ctx->preempted);
    408			break;
    409		case SVGA_CB_STATUS_CB_HEADER_ERROR:
    410			WARN_ONCE(true, "Command buffer header error.\n");
    411			__vmw_cmdbuf_header_free(entry);
    412			break;
    413		default:
    414			WARN_ONCE(true, "Undefined command buffer status.\n");
    415			__vmw_cmdbuf_header_free(entry);
    416			break;
    417		}
    418	}
    419
    420	vmw_cmdbuf_ctx_submit(man, ctx);
    421	if (!list_empty(&ctx->submitted))
    422		(*notempty)++;
    423}
    424
    425/**
    426 * vmw_cmdbuf_man_process - Process all command buffer contexts and
    427 * switch on and off irqs as appropriate.
    428 *
    429 * @man: The command buffer manager.
    430 *
    431 * Calls vmw_cmdbuf_ctx_process() on all contexts. If any context has
    432 * command buffers left that are not submitted to hardware, Make sure
    433 * IRQ handling is turned on. Otherwise, make sure it's turned off.
    434 */
    435static void vmw_cmdbuf_man_process(struct vmw_cmdbuf_man *man)
    436{
    437	int notempty;
    438	struct vmw_cmdbuf_context *ctx;
    439	int i;
    440
    441retry:
    442	notempty = 0;
    443	for_each_cmdbuf_ctx(man, i, ctx)
    444		vmw_cmdbuf_ctx_process(man, ctx, &notempty);
    445
    446	if (man->irq_on && !notempty) {
    447		vmw_generic_waiter_remove(man->dev_priv,
    448					  SVGA_IRQFLAG_COMMAND_BUFFER,
    449					  &man->dev_priv->cmdbuf_waiters);
    450		man->irq_on = false;
    451	} else if (!man->irq_on && notempty) {
    452		vmw_generic_waiter_add(man->dev_priv,
    453				       SVGA_IRQFLAG_COMMAND_BUFFER,
    454				       &man->dev_priv->cmdbuf_waiters);
    455		man->irq_on = true;
    456
    457		/* Rerun in case we just missed an irq. */
    458		goto retry;
    459	}
    460}
    461
    462/**
    463 * vmw_cmdbuf_ctx_add - Schedule a command buffer for submission on a
    464 * command buffer context
    465 *
    466 * @man: The command buffer manager.
    467 * @header: The header of the buffer to submit.
    468 * @cb_context: The command buffer context to use.
    469 *
    470 * This function adds @header to the "submitted" queue of the command
    471 * buffer context identified by @cb_context. It then calls the command buffer
    472 * manager processing to potentially submit the buffer to hardware.
    473 * @man->lock needs to be held when calling this function.
    474 */
    475static void vmw_cmdbuf_ctx_add(struct vmw_cmdbuf_man *man,
    476			       struct vmw_cmdbuf_header *header,
    477			       SVGACBContext cb_context)
    478{
    479	if (!(header->cb_header->flags & SVGA_CB_FLAG_DX_CONTEXT))
    480		header->cb_header->dxContext = 0;
    481	header->cb_context = cb_context;
    482	list_add_tail(&header->list, &man->ctx[cb_context].submitted);
    483
    484	vmw_cmdbuf_man_process(man);
    485}
    486
    487/**
    488 * vmw_cmdbuf_irqthread - The main part of the command buffer interrupt
    489 * handler implemented as a threaded irq task.
    490 *
    491 * @man: Pointer to the command buffer manager.
    492 *
    493 * The bottom half of the interrupt handler simply calls into the
    494 * command buffer processor to free finished buffers and submit any
    495 * queued buffers to hardware.
    496 */
    497void vmw_cmdbuf_irqthread(struct vmw_cmdbuf_man *man)
    498{
    499	spin_lock(&man->lock);
    500	vmw_cmdbuf_man_process(man);
    501	spin_unlock(&man->lock);
    502}
    503
    504/**
    505 * vmw_cmdbuf_work_func - The deferred work function that handles
    506 * command buffer errors.
    507 *
    508 * @work: The work func closure argument.
    509 *
    510 * Restarting the command buffer context after an error requires process
    511 * context, so it is deferred to this work function.
    512 */
    513static void vmw_cmdbuf_work_func(struct work_struct *work)
    514{
    515	struct vmw_cmdbuf_man *man =
    516		container_of(work, struct vmw_cmdbuf_man, work);
    517	struct vmw_cmdbuf_header *entry, *next;
    518	uint32_t dummy = 0;
    519	bool send_fence = false;
    520	struct list_head restart_head[SVGA_CB_CONTEXT_MAX];
    521	int i;
    522	struct vmw_cmdbuf_context *ctx;
    523	bool global_block = false;
    524
    525	for_each_cmdbuf_ctx(man, i, ctx)
    526		INIT_LIST_HEAD(&restart_head[i]);
    527
    528	mutex_lock(&man->error_mutex);
    529	spin_lock(&man->lock);
    530	list_for_each_entry_safe(entry, next, &man->error, list) {
    531		SVGACBHeader *cb_hdr = entry->cb_header;
    532		SVGA3dCmdHeader *header = (SVGA3dCmdHeader *)
    533			(entry->cmd + cb_hdr->errorOffset);
    534		u32 error_cmd_size, new_start_offset;
    535		const char *cmd_name;
    536
    537		list_del_init(&entry->list);
    538		global_block = true;
    539
    540		if (!vmw_cmd_describe(header, &error_cmd_size, &cmd_name)) {
    541			VMW_DEBUG_USER("Unknown command causing device error.\n");
    542			VMW_DEBUG_USER("Command buffer offset is %lu\n",
    543				       (unsigned long) cb_hdr->errorOffset);
    544			__vmw_cmdbuf_header_free(entry);
    545			send_fence = true;
    546			continue;
    547		}
    548
    549		VMW_DEBUG_USER("Command \"%s\" causing device error.\n",
    550			       cmd_name);
    551		VMW_DEBUG_USER("Command buffer offset is %lu\n",
    552			       (unsigned long) cb_hdr->errorOffset);
    553		VMW_DEBUG_USER("Command size is %lu\n",
    554			       (unsigned long) error_cmd_size);
    555
    556		new_start_offset = cb_hdr->errorOffset + error_cmd_size;
    557
    558		if (new_start_offset >= cb_hdr->length) {
    559			__vmw_cmdbuf_header_free(entry);
    560			send_fence = true;
    561			continue;
    562		}
    563
    564		if (man->using_mob)
    565			cb_hdr->ptr.mob.mobOffset += new_start_offset;
    566		else
    567			cb_hdr->ptr.pa += (u64) new_start_offset;
    568
    569		entry->cmd += new_start_offset;
    570		cb_hdr->length -= new_start_offset;
    571		cb_hdr->errorOffset = 0;
    572		cb_hdr->offset = 0;
    573
    574		list_add_tail(&entry->list, &restart_head[entry->cb_context]);
    575	}
    576
    577	for_each_cmdbuf_ctx(man, i, ctx)
    578		man->ctx[i].block_submission = true;
    579
    580	spin_unlock(&man->lock);
    581
    582	/* Preempt all contexts */
    583	if (global_block && vmw_cmdbuf_preempt(man, 0))
    584		DRM_ERROR("Failed preempting command buffer contexts\n");
    585
    586	spin_lock(&man->lock);
    587	for_each_cmdbuf_ctx(man, i, ctx) {
    588		/* Move preempted command buffers to the preempted queue. */
    589		vmw_cmdbuf_ctx_process(man, ctx, &dummy);
    590
    591		/*
    592		 * Add the preempted queue after the command buffer
    593		 * that caused an error.
    594		 */
    595		list_splice_init(&ctx->preempted, restart_head[i].prev);
    596
    597		/*
    598		 * Finally add all command buffers first in the submitted
    599		 * queue, to rerun them.
    600		 */
    601
    602		ctx->block_submission = false;
    603		list_splice_init(&restart_head[i], &ctx->submitted);
    604	}
    605
    606	vmw_cmdbuf_man_process(man);
    607	spin_unlock(&man->lock);
    608
    609	if (global_block && vmw_cmdbuf_startstop(man, 0, true))
    610		DRM_ERROR("Failed restarting command buffer contexts\n");
    611
    612	/* Send a new fence in case one was removed */
    613	if (send_fence) {
    614		vmw_cmd_send_fence(man->dev_priv, &dummy);
    615		wake_up_all(&man->idle_queue);
    616	}
    617
    618	mutex_unlock(&man->error_mutex);
    619}
    620
    621/**
    622 * vmw_cmdbuf_man_idle - Check whether the command buffer manager is idle.
    623 *
    624 * @man: The command buffer manager.
    625 * @check_preempted: Check also the preempted queue for pending command buffers.
    626 *
    627 */
    628static bool vmw_cmdbuf_man_idle(struct vmw_cmdbuf_man *man,
    629				bool check_preempted)
    630{
    631	struct vmw_cmdbuf_context *ctx;
    632	bool idle = false;
    633	int i;
    634
    635	spin_lock(&man->lock);
    636	vmw_cmdbuf_man_process(man);
    637	for_each_cmdbuf_ctx(man, i, ctx) {
    638		if (!list_empty(&ctx->submitted) ||
    639		    !list_empty(&ctx->hw_submitted) ||
    640		    (check_preempted && !list_empty(&ctx->preempted)))
    641			goto out_unlock;
    642	}
    643
    644	idle = list_empty(&man->error);
    645
    646out_unlock:
    647	spin_unlock(&man->lock);
    648
    649	return idle;
    650}
    651
    652/**
    653 * __vmw_cmdbuf_cur_flush - Flush the current command buffer for small kernel
    654 * command submissions
    655 *
    656 * @man: The command buffer manager.
    657 *
    658 * Flushes the current command buffer without allocating a new one. A new one
    659 * is automatically allocated when needed. Call with @man->cur_mutex held.
    660 */
    661static void __vmw_cmdbuf_cur_flush(struct vmw_cmdbuf_man *man)
    662{
    663	struct vmw_cmdbuf_header *cur = man->cur;
    664
    665	lockdep_assert_held_once(&man->cur_mutex);
    666
    667	if (!cur)
    668		return;
    669
    670	spin_lock(&man->lock);
    671	if (man->cur_pos == 0) {
    672		__vmw_cmdbuf_header_free(cur);
    673		goto out_unlock;
    674	}
    675
    676	man->cur->cb_header->length = man->cur_pos;
    677	vmw_cmdbuf_ctx_add(man, man->cur, SVGA_CB_CONTEXT_0);
    678out_unlock:
    679	spin_unlock(&man->lock);
    680	man->cur = NULL;
    681	man->cur_pos = 0;
    682}
    683
    684/**
    685 * vmw_cmdbuf_cur_flush - Flush the current command buffer for small kernel
    686 * command submissions
    687 *
    688 * @man: The command buffer manager.
    689 * @interruptible: Whether to sleep interruptible when sleeping.
    690 *
    691 * Flushes the current command buffer without allocating a new one. A new one
    692 * is automatically allocated when needed.
    693 */
    694int vmw_cmdbuf_cur_flush(struct vmw_cmdbuf_man *man,
    695			 bool interruptible)
    696{
    697	int ret = vmw_cmdbuf_cur_lock(man, interruptible);
    698
    699	if (ret)
    700		return ret;
    701
    702	__vmw_cmdbuf_cur_flush(man);
    703	vmw_cmdbuf_cur_unlock(man);
    704
    705	return 0;
    706}
    707
    708/**
    709 * vmw_cmdbuf_idle - Wait for command buffer manager idle.
    710 *
    711 * @man: The command buffer manager.
    712 * @interruptible: Sleep interruptible while waiting.
    713 * @timeout: Time out after this many ticks.
    714 *
    715 * Wait until the command buffer manager has processed all command buffers,
    716 * or until a timeout occurs. If a timeout occurs, the function will return
    717 * -EBUSY.
    718 */
    719int vmw_cmdbuf_idle(struct vmw_cmdbuf_man *man, bool interruptible,
    720		    unsigned long timeout)
    721{
    722	int ret;
    723
    724	ret = vmw_cmdbuf_cur_flush(man, interruptible);
    725	vmw_generic_waiter_add(man->dev_priv,
    726			       SVGA_IRQFLAG_COMMAND_BUFFER,
    727			       &man->dev_priv->cmdbuf_waiters);
    728
    729	if (interruptible) {
    730		ret = wait_event_interruptible_timeout
    731			(man->idle_queue, vmw_cmdbuf_man_idle(man, true),
    732			 timeout);
    733	} else {
    734		ret = wait_event_timeout
    735			(man->idle_queue, vmw_cmdbuf_man_idle(man, true),
    736			 timeout);
    737	}
    738	vmw_generic_waiter_remove(man->dev_priv,
    739				  SVGA_IRQFLAG_COMMAND_BUFFER,
    740				  &man->dev_priv->cmdbuf_waiters);
    741	if (ret == 0) {
    742		if (!vmw_cmdbuf_man_idle(man, true))
    743			ret = -EBUSY;
    744		else
    745			ret = 0;
    746	}
    747	if (ret > 0)
    748		ret = 0;
    749
    750	return ret;
    751}
    752
    753/**
    754 * vmw_cmdbuf_try_alloc - Try to allocate buffer space from the main pool.
    755 *
    756 * @man: The command buffer manager.
    757 * @info: Allocation info. Will hold the size on entry and allocated mm node
    758 * on successful return.
    759 *
    760 * Try to allocate buffer space from the main pool. Returns true if succeeded.
    761 * If a fatal error was hit, the error code is returned in @info->ret.
    762 */
    763static bool vmw_cmdbuf_try_alloc(struct vmw_cmdbuf_man *man,
    764				 struct vmw_cmdbuf_alloc_info *info)
    765{
    766	int ret;
    767
    768	if (info->done)
    769		return true;
    770
    771	memset(info->node, 0, sizeof(*info->node));
    772	spin_lock(&man->lock);
    773	ret = drm_mm_insert_node(&man->mm, info->node, info->page_size);
    774	if (ret) {
    775		vmw_cmdbuf_man_process(man);
    776		ret = drm_mm_insert_node(&man->mm, info->node, info->page_size);
    777	}
    778
    779	spin_unlock(&man->lock);
    780	info->done = !ret;
    781
    782	return info->done;
    783}
    784
    785/**
    786 * vmw_cmdbuf_alloc_space - Allocate buffer space from the main pool.
    787 *
    788 * @man: The command buffer manager.
    789 * @node: Pointer to pre-allocated range-manager node.
    790 * @size: The size of the allocation.
    791 * @interruptible: Whether to sleep interruptible while waiting for space.
    792 *
    793 * This function allocates buffer space from the main pool, and if there is
    794 * no space available ATM, it turns on IRQ handling and sleeps waiting for it to
    795 * become available.
    796 */
    797static int vmw_cmdbuf_alloc_space(struct vmw_cmdbuf_man *man,
    798				  struct drm_mm_node *node,
    799				  size_t size,
    800				  bool interruptible)
    801{
    802	struct vmw_cmdbuf_alloc_info info;
    803
    804	info.page_size = PFN_UP(size);
    805	info.node = node;
    806	info.done = false;
    807
    808	/*
    809	 * To prevent starvation of large requests, only one allocating call
    810	 * at a time waiting for space.
    811	 */
    812	if (interruptible) {
    813		if (mutex_lock_interruptible(&man->space_mutex))
    814			return -ERESTARTSYS;
    815	} else {
    816		mutex_lock(&man->space_mutex);
    817	}
    818
    819	/* Try to allocate space without waiting. */
    820	if (vmw_cmdbuf_try_alloc(man, &info))
    821		goto out_unlock;
    822
    823	vmw_generic_waiter_add(man->dev_priv,
    824			       SVGA_IRQFLAG_COMMAND_BUFFER,
    825			       &man->dev_priv->cmdbuf_waiters);
    826
    827	if (interruptible) {
    828		int ret;
    829
    830		ret = wait_event_interruptible
    831			(man->alloc_queue, vmw_cmdbuf_try_alloc(man, &info));
    832		if (ret) {
    833			vmw_generic_waiter_remove
    834				(man->dev_priv, SVGA_IRQFLAG_COMMAND_BUFFER,
    835				 &man->dev_priv->cmdbuf_waiters);
    836			mutex_unlock(&man->space_mutex);
    837			return ret;
    838		}
    839	} else {
    840		wait_event(man->alloc_queue, vmw_cmdbuf_try_alloc(man, &info));
    841	}
    842	vmw_generic_waiter_remove(man->dev_priv,
    843				  SVGA_IRQFLAG_COMMAND_BUFFER,
    844				  &man->dev_priv->cmdbuf_waiters);
    845
    846out_unlock:
    847	mutex_unlock(&man->space_mutex);
    848
    849	return 0;
    850}
    851
    852/**
    853 * vmw_cmdbuf_space_pool - Set up a command buffer header with command buffer
    854 * space from the main pool.
    855 *
    856 * @man: The command buffer manager.
    857 * @header: Pointer to the header to set up.
    858 * @size: The requested size of the buffer space.
    859 * @interruptible: Whether to sleep interruptible while waiting for space.
    860 */
    861static int vmw_cmdbuf_space_pool(struct vmw_cmdbuf_man *man,
    862				 struct vmw_cmdbuf_header *header,
    863				 size_t size,
    864				 bool interruptible)
    865{
    866	SVGACBHeader *cb_hdr;
    867	size_t offset;
    868	int ret;
    869
    870	if (!man->has_pool)
    871		return -ENOMEM;
    872
    873	ret = vmw_cmdbuf_alloc_space(man, &header->node,  size, interruptible);
    874
    875	if (ret)
    876		return ret;
    877
    878	header->cb_header = dma_pool_zalloc(man->headers, GFP_KERNEL,
    879					    &header->handle);
    880	if (!header->cb_header) {
    881		ret = -ENOMEM;
    882		goto out_no_cb_header;
    883	}
    884
    885	header->size = header->node.size << PAGE_SHIFT;
    886	cb_hdr = header->cb_header;
    887	offset = header->node.start << PAGE_SHIFT;
    888	header->cmd = man->map + offset;
    889	if (man->using_mob) {
    890		cb_hdr->flags = SVGA_CB_FLAG_MOB;
    891		cb_hdr->ptr.mob.mobid = man->cmd_space->resource->start;
    892		cb_hdr->ptr.mob.mobOffset = offset;
    893	} else {
    894		cb_hdr->ptr.pa = (u64)man->handle + (u64)offset;
    895	}
    896
    897	return 0;
    898
    899out_no_cb_header:
    900	spin_lock(&man->lock);
    901	drm_mm_remove_node(&header->node);
    902	spin_unlock(&man->lock);
    903
    904	return ret;
    905}
    906
    907/**
    908 * vmw_cmdbuf_space_inline - Set up a command buffer header with
    909 * inline command buffer space.
    910 *
    911 * @man: The command buffer manager.
    912 * @header: Pointer to the header to set up.
    913 * @size: The requested size of the buffer space.
    914 */
    915static int vmw_cmdbuf_space_inline(struct vmw_cmdbuf_man *man,
    916				   struct vmw_cmdbuf_header *header,
    917				   int size)
    918{
    919	struct vmw_cmdbuf_dheader *dheader;
    920	SVGACBHeader *cb_hdr;
    921
    922	if (WARN_ON_ONCE(size > VMW_CMDBUF_INLINE_SIZE))
    923		return -ENOMEM;
    924
    925	dheader = dma_pool_zalloc(man->dheaders, GFP_KERNEL,
    926				  &header->handle);
    927	if (!dheader)
    928		return -ENOMEM;
    929
    930	header->inline_space = true;
    931	header->size = VMW_CMDBUF_INLINE_SIZE;
    932	cb_hdr = &dheader->cb_header;
    933	header->cb_header = cb_hdr;
    934	header->cmd = dheader->cmd;
    935	cb_hdr->status = SVGA_CB_STATUS_NONE;
    936	cb_hdr->flags = SVGA_CB_FLAG_NONE;
    937	cb_hdr->ptr.pa = (u64)header->handle +
    938		(u64)offsetof(struct vmw_cmdbuf_dheader, cmd);
    939
    940	return 0;
    941}
    942
    943/**
    944 * vmw_cmdbuf_alloc - Allocate a command buffer header complete with
    945 * command buffer space.
    946 *
    947 * @man: The command buffer manager.
    948 * @size: The requested size of the buffer space.
    949 * @interruptible: Whether to sleep interruptible while waiting for space.
    950 * @p_header: points to a header pointer to populate on successful return.
    951 *
    952 * Returns a pointer to command buffer space if successful. Otherwise
    953 * returns an error pointer. The header pointer returned in @p_header should
    954 * be used for upcoming calls to vmw_cmdbuf_reserve() and vmw_cmdbuf_commit().
    955 */
    956void *vmw_cmdbuf_alloc(struct vmw_cmdbuf_man *man,
    957		       size_t size, bool interruptible,
    958		       struct vmw_cmdbuf_header **p_header)
    959{
    960	struct vmw_cmdbuf_header *header;
    961	int ret = 0;
    962
    963	*p_header = NULL;
    964
    965	header = kzalloc(sizeof(*header), GFP_KERNEL);
    966	if (!header)
    967		return ERR_PTR(-ENOMEM);
    968
    969	if (size <= VMW_CMDBUF_INLINE_SIZE)
    970		ret = vmw_cmdbuf_space_inline(man, header, size);
    971	else
    972		ret = vmw_cmdbuf_space_pool(man, header, size, interruptible);
    973
    974	if (ret) {
    975		kfree(header);
    976		return ERR_PTR(ret);
    977	}
    978
    979	header->man = man;
    980	INIT_LIST_HEAD(&header->list);
    981	header->cb_header->status = SVGA_CB_STATUS_NONE;
    982	*p_header = header;
    983
    984	return header->cmd;
    985}
    986
    987/**
    988 * vmw_cmdbuf_reserve_cur - Reserve space for commands in the current
    989 * command buffer.
    990 *
    991 * @man: The command buffer manager.
    992 * @size: The requested size of the commands.
    993 * @ctx_id: The context id if any. Otherwise set to SVGA3D_REG_INVALID.
    994 * @interruptible: Whether to sleep interruptible while waiting for space.
    995 *
    996 * Returns a pointer to command buffer space if successful. Otherwise
    997 * returns an error pointer.
    998 */
    999static void *vmw_cmdbuf_reserve_cur(struct vmw_cmdbuf_man *man,
   1000				    size_t size,
   1001				    int ctx_id,
   1002				    bool interruptible)
   1003{
   1004	struct vmw_cmdbuf_header *cur;
   1005	void *ret;
   1006
   1007	if (vmw_cmdbuf_cur_lock(man, interruptible))
   1008		return ERR_PTR(-ERESTARTSYS);
   1009
   1010	cur = man->cur;
   1011	if (cur && (size + man->cur_pos > cur->size ||
   1012		    ((cur->cb_header->flags & SVGA_CB_FLAG_DX_CONTEXT) &&
   1013		     ctx_id != cur->cb_header->dxContext)))
   1014		__vmw_cmdbuf_cur_flush(man);
   1015
   1016	if (!man->cur) {
   1017		ret = vmw_cmdbuf_alloc(man,
   1018				       max_t(size_t, size, man->default_size),
   1019				       interruptible, &man->cur);
   1020		if (IS_ERR(ret)) {
   1021			vmw_cmdbuf_cur_unlock(man);
   1022			return ret;
   1023		}
   1024
   1025		cur = man->cur;
   1026	}
   1027
   1028	if (ctx_id != SVGA3D_INVALID_ID) {
   1029		cur->cb_header->flags |= SVGA_CB_FLAG_DX_CONTEXT;
   1030		cur->cb_header->dxContext = ctx_id;
   1031	}
   1032
   1033	cur->reserved = size;
   1034
   1035	return (void *) (man->cur->cmd + man->cur_pos);
   1036}
   1037
   1038/**
   1039 * vmw_cmdbuf_commit_cur - Commit commands in the current command buffer.
   1040 *
   1041 * @man: The command buffer manager.
   1042 * @size: The size of the commands actually written.
   1043 * @flush: Whether to flush the command buffer immediately.
   1044 */
   1045static void vmw_cmdbuf_commit_cur(struct vmw_cmdbuf_man *man,
   1046				  size_t size, bool flush)
   1047{
   1048	struct vmw_cmdbuf_header *cur = man->cur;
   1049
   1050	lockdep_assert_held_once(&man->cur_mutex);
   1051
   1052	WARN_ON(size > cur->reserved);
   1053	man->cur_pos += size;
   1054	if (!size)
   1055		cur->cb_header->flags &= ~SVGA_CB_FLAG_DX_CONTEXT;
   1056	if (flush)
   1057		__vmw_cmdbuf_cur_flush(man);
   1058	vmw_cmdbuf_cur_unlock(man);
   1059}
   1060
   1061/**
   1062 * vmw_cmdbuf_reserve - Reserve space for commands in a command buffer.
   1063 *
   1064 * @man: The command buffer manager.
   1065 * @size: The requested size of the commands.
   1066 * @ctx_id: The context id if any. Otherwise set to SVGA3D_REG_INVALID.
   1067 * @interruptible: Whether to sleep interruptible while waiting for space.
   1068 * @header: Header of the command buffer. NULL if the current command buffer
   1069 * should be used.
   1070 *
   1071 * Returns a pointer to command buffer space if successful. Otherwise
   1072 * returns an error pointer.
   1073 */
   1074void *vmw_cmdbuf_reserve(struct vmw_cmdbuf_man *man, size_t size,
   1075			 int ctx_id, bool interruptible,
   1076			 struct vmw_cmdbuf_header *header)
   1077{
   1078	if (!header)
   1079		return vmw_cmdbuf_reserve_cur(man, size, ctx_id, interruptible);
   1080
   1081	if (size > header->size)
   1082		return ERR_PTR(-EINVAL);
   1083
   1084	if (ctx_id != SVGA3D_INVALID_ID) {
   1085		header->cb_header->flags |= SVGA_CB_FLAG_DX_CONTEXT;
   1086		header->cb_header->dxContext = ctx_id;
   1087	}
   1088
   1089	header->reserved = size;
   1090	return header->cmd;
   1091}
   1092
   1093/**
   1094 * vmw_cmdbuf_commit - Commit commands in a command buffer.
   1095 *
   1096 * @man: The command buffer manager.
   1097 * @size: The size of the commands actually written.
   1098 * @header: Header of the command buffer. NULL if the current command buffer
   1099 * should be used.
   1100 * @flush: Whether to flush the command buffer immediately.
   1101 */
   1102void vmw_cmdbuf_commit(struct vmw_cmdbuf_man *man, size_t size,
   1103		       struct vmw_cmdbuf_header *header, bool flush)
   1104{
   1105	if (!header) {
   1106		vmw_cmdbuf_commit_cur(man, size, flush);
   1107		return;
   1108	}
   1109
   1110	(void) vmw_cmdbuf_cur_lock(man, false);
   1111	__vmw_cmdbuf_cur_flush(man);
   1112	WARN_ON(size > header->reserved);
   1113	man->cur = header;
   1114	man->cur_pos = size;
   1115	if (!size)
   1116		header->cb_header->flags &= ~SVGA_CB_FLAG_DX_CONTEXT;
   1117	if (flush)
   1118		__vmw_cmdbuf_cur_flush(man);
   1119	vmw_cmdbuf_cur_unlock(man);
   1120}
   1121
   1122
   1123/**
   1124 * vmw_cmdbuf_send_device_command - Send a command through the device context.
   1125 *
   1126 * @man: The command buffer manager.
   1127 * @command: Pointer to the command to send.
   1128 * @size: Size of the command.
   1129 *
   1130 * Synchronously sends a device context command.
   1131 */
   1132static int vmw_cmdbuf_send_device_command(struct vmw_cmdbuf_man *man,
   1133					  const void *command,
   1134					  size_t size)
   1135{
   1136	struct vmw_cmdbuf_header *header;
   1137	int status;
   1138	void *cmd = vmw_cmdbuf_alloc(man, size, false, &header);
   1139
   1140	if (IS_ERR(cmd))
   1141		return PTR_ERR(cmd);
   1142
   1143	memcpy(cmd, command, size);
   1144	header->cb_header->length = size;
   1145	header->cb_context = SVGA_CB_CONTEXT_DEVICE;
   1146	spin_lock(&man->lock);
   1147	status = vmw_cmdbuf_header_submit(header);
   1148	spin_unlock(&man->lock);
   1149	vmw_cmdbuf_header_free(header);
   1150
   1151	if (status != SVGA_CB_STATUS_COMPLETED) {
   1152		DRM_ERROR("Device context command failed with status %d\n",
   1153			  status);
   1154		return -EINVAL;
   1155	}
   1156
   1157	return 0;
   1158}
   1159
   1160/**
   1161 * vmw_cmdbuf_preempt - Send a preempt command through the device
   1162 * context.
   1163 *
   1164 * @man: The command buffer manager.
   1165 * @context: Device context to pass command through.
   1166 *
   1167 * Synchronously sends a preempt command.
   1168 */
   1169static int vmw_cmdbuf_preempt(struct vmw_cmdbuf_man *man, u32 context)
   1170{
   1171	struct {
   1172		uint32 id;
   1173		SVGADCCmdPreempt body;
   1174	} __packed cmd;
   1175
   1176	cmd.id = SVGA_DC_CMD_PREEMPT;
   1177	cmd.body.context = SVGA_CB_CONTEXT_0 + context;
   1178	cmd.body.ignoreIDZero = 0;
   1179
   1180	return vmw_cmdbuf_send_device_command(man, &cmd, sizeof(cmd));
   1181}
   1182
   1183
   1184/**
   1185 * vmw_cmdbuf_startstop - Send a start / stop command through the device
   1186 * context.
   1187 *
   1188 * @man: The command buffer manager.
   1189 * @context: Device context to start/stop.
   1190 * @enable: Whether to enable or disable the context.
   1191 *
   1192 * Synchronously sends a device start / stop context command.
   1193 */
   1194static int vmw_cmdbuf_startstop(struct vmw_cmdbuf_man *man, u32 context,
   1195				bool enable)
   1196{
   1197	struct {
   1198		uint32 id;
   1199		SVGADCCmdStartStop body;
   1200	} __packed cmd;
   1201
   1202	cmd.id = SVGA_DC_CMD_START_STOP_CONTEXT;
   1203	cmd.body.enable = (enable) ? 1 : 0;
   1204	cmd.body.context = SVGA_CB_CONTEXT_0 + context;
   1205
   1206	return vmw_cmdbuf_send_device_command(man, &cmd, sizeof(cmd));
   1207}
   1208
   1209/**
   1210 * vmw_cmdbuf_set_pool_size - Set command buffer manager sizes
   1211 *
   1212 * @man: The command buffer manager.
   1213 * @size: The size of the main space pool.
   1214 *
   1215 * Set the size and allocate the main command buffer space pool.
   1216 * If successful, this enables large command submissions.
   1217 * Note that this function requires that rudimentary command
   1218 * submission is already available and that the MOB memory manager is alive.
   1219 * Returns 0 on success. Negative error code on failure.
   1220 */
   1221int vmw_cmdbuf_set_pool_size(struct vmw_cmdbuf_man *man, size_t size)
   1222{
   1223	struct vmw_private *dev_priv = man->dev_priv;
   1224	bool dummy;
   1225	int ret;
   1226
   1227	if (man->has_pool)
   1228		return -EINVAL;
   1229
   1230	/* First, try to allocate a huge chunk of DMA memory */
   1231	size = PAGE_ALIGN(size);
   1232	man->map = dma_alloc_coherent(dev_priv->drm.dev, size,
   1233				      &man->handle, GFP_KERNEL);
   1234	if (man->map) {
   1235		man->using_mob = false;
   1236	} else {
   1237		/*
   1238		 * DMA memory failed. If we can have command buffers in a
   1239		 * MOB, try to use that instead. Note that this will
   1240		 * actually call into the already enabled manager, when
   1241		 * binding the MOB.
   1242		 */
   1243		if (!(dev_priv->capabilities & SVGA_CAP_DX) ||
   1244		    !dev_priv->has_mob)
   1245			return -ENOMEM;
   1246
   1247		ret = vmw_bo_create_kernel(dev_priv, size,
   1248					   &vmw_mob_placement,
   1249					   &man->cmd_space);
   1250		if (ret)
   1251			return ret;
   1252
   1253		man->using_mob = true;
   1254		ret = ttm_bo_kmap(man->cmd_space, 0, size >> PAGE_SHIFT,
   1255				  &man->map_obj);
   1256		if (ret)
   1257			goto out_no_map;
   1258
   1259		man->map = ttm_kmap_obj_virtual(&man->map_obj, &dummy);
   1260	}
   1261
   1262	man->size = size;
   1263	drm_mm_init(&man->mm, 0, size >> PAGE_SHIFT);
   1264
   1265	man->has_pool = true;
   1266
   1267	/*
   1268	 * For now, set the default size to VMW_CMDBUF_INLINE_SIZE to
   1269	 * prevent deadlocks from happening when vmw_cmdbuf_space_pool()
   1270	 * needs to wait for space and we block on further command
   1271	 * submissions to be able to free up space.
   1272	 */
   1273	man->default_size = VMW_CMDBUF_INLINE_SIZE;
   1274	drm_info(&dev_priv->drm,
   1275		 "Using command buffers with %s pool.\n",
   1276		 (man->using_mob) ? "MOB" : "DMA");
   1277
   1278	return 0;
   1279
   1280out_no_map:
   1281	if (man->using_mob) {
   1282		ttm_bo_put(man->cmd_space);
   1283		man->cmd_space = NULL;
   1284	}
   1285
   1286	return ret;
   1287}
   1288
   1289/**
   1290 * vmw_cmdbuf_man_create: Create a command buffer manager and enable it for
   1291 * inline command buffer submissions only.
   1292 *
   1293 * @dev_priv: Pointer to device private structure.
   1294 *
   1295 * Returns a pointer to a cummand buffer manager to success or error pointer
   1296 * on failure. The command buffer manager will be enabled for submissions of
   1297 * size VMW_CMDBUF_INLINE_SIZE only.
   1298 */
   1299struct vmw_cmdbuf_man *vmw_cmdbuf_man_create(struct vmw_private *dev_priv)
   1300{
   1301	struct vmw_cmdbuf_man *man;
   1302	struct vmw_cmdbuf_context *ctx;
   1303	unsigned int i;
   1304	int ret;
   1305
   1306	if (!(dev_priv->capabilities & SVGA_CAP_COMMAND_BUFFERS))
   1307		return ERR_PTR(-ENOSYS);
   1308
   1309	man = kzalloc(sizeof(*man), GFP_KERNEL);
   1310	if (!man)
   1311		return ERR_PTR(-ENOMEM);
   1312
   1313	man->num_contexts = (dev_priv->capabilities & SVGA_CAP_HP_CMD_QUEUE) ?
   1314		2 : 1;
   1315	man->headers = dma_pool_create("vmwgfx cmdbuf",
   1316				       dev_priv->drm.dev,
   1317				       sizeof(SVGACBHeader),
   1318				       64, PAGE_SIZE);
   1319	if (!man->headers) {
   1320		ret = -ENOMEM;
   1321		goto out_no_pool;
   1322	}
   1323
   1324	man->dheaders = dma_pool_create("vmwgfx inline cmdbuf",
   1325					dev_priv->drm.dev,
   1326					sizeof(struct vmw_cmdbuf_dheader),
   1327					64, PAGE_SIZE);
   1328	if (!man->dheaders) {
   1329		ret = -ENOMEM;
   1330		goto out_no_dpool;
   1331	}
   1332
   1333	for_each_cmdbuf_ctx(man, i, ctx)
   1334		vmw_cmdbuf_ctx_init(ctx);
   1335
   1336	INIT_LIST_HEAD(&man->error);
   1337	spin_lock_init(&man->lock);
   1338	mutex_init(&man->cur_mutex);
   1339	mutex_init(&man->space_mutex);
   1340	mutex_init(&man->error_mutex);
   1341	man->default_size = VMW_CMDBUF_INLINE_SIZE;
   1342	init_waitqueue_head(&man->alloc_queue);
   1343	init_waitqueue_head(&man->idle_queue);
   1344	man->dev_priv = dev_priv;
   1345	man->max_hw_submitted = SVGA_CB_MAX_QUEUED_PER_CONTEXT - 1;
   1346	INIT_WORK(&man->work, &vmw_cmdbuf_work_func);
   1347	vmw_generic_waiter_add(dev_priv, SVGA_IRQFLAG_ERROR,
   1348			       &dev_priv->error_waiters);
   1349	ret = vmw_cmdbuf_startstop(man, 0, true);
   1350	if (ret) {
   1351		DRM_ERROR("Failed starting command buffer contexts\n");
   1352		vmw_cmdbuf_man_destroy(man);
   1353		return ERR_PTR(ret);
   1354	}
   1355
   1356	return man;
   1357
   1358out_no_dpool:
   1359	dma_pool_destroy(man->headers);
   1360out_no_pool:
   1361	kfree(man);
   1362
   1363	return ERR_PTR(ret);
   1364}
   1365
   1366/**
   1367 * vmw_cmdbuf_remove_pool - Take down the main buffer space pool.
   1368 *
   1369 * @man: Pointer to a command buffer manager.
   1370 *
   1371 * This function removes the main buffer space pool, and should be called
   1372 * before MOB memory management is removed. When this function has been called,
   1373 * only small command buffer submissions of size VMW_CMDBUF_INLINE_SIZE or
   1374 * less are allowed, and the default size of the command buffer for small kernel
   1375 * submissions is also set to this size.
   1376 */
   1377void vmw_cmdbuf_remove_pool(struct vmw_cmdbuf_man *man)
   1378{
   1379	if (!man->has_pool)
   1380		return;
   1381
   1382	man->has_pool = false;
   1383	man->default_size = VMW_CMDBUF_INLINE_SIZE;
   1384	(void) vmw_cmdbuf_idle(man, false, 10*HZ);
   1385	if (man->using_mob) {
   1386		(void) ttm_bo_kunmap(&man->map_obj);
   1387		ttm_bo_put(man->cmd_space);
   1388		man->cmd_space = NULL;
   1389	} else {
   1390		dma_free_coherent(man->dev_priv->drm.dev,
   1391				  man->size, man->map, man->handle);
   1392	}
   1393}
   1394
   1395/**
   1396 * vmw_cmdbuf_man_destroy - Take down a command buffer manager.
   1397 *
   1398 * @man: Pointer to a command buffer manager.
   1399 *
   1400 * This function idles and then destroys a command buffer manager.
   1401 */
   1402void vmw_cmdbuf_man_destroy(struct vmw_cmdbuf_man *man)
   1403{
   1404	WARN_ON_ONCE(man->has_pool);
   1405	(void) vmw_cmdbuf_idle(man, false, 10*HZ);
   1406
   1407	if (vmw_cmdbuf_startstop(man, 0, false))
   1408		DRM_ERROR("Failed stopping command buffer contexts.\n");
   1409
   1410	vmw_generic_waiter_remove(man->dev_priv, SVGA_IRQFLAG_ERROR,
   1411				  &man->dev_priv->error_waiters);
   1412	(void) cancel_work_sync(&man->work);
   1413	dma_pool_destroy(man->dheaders);
   1414	dma_pool_destroy(man->headers);
   1415	mutex_destroy(&man->cur_mutex);
   1416	mutex_destroy(&man->space_mutex);
   1417	mutex_destroy(&man->error_mutex);
   1418	kfree(man);
   1419}