Lines Matching +full:hardware +full:- +full:fifo
1 // SPDX-License-Identifier: GPL-2.0 OR MIT
4 * Copyright 2009-2023 VMware, Inc., Palo Alto, CA., USA
20 * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
38 const struct vmw_fifo_state *fifo = dev_priv->fifo; in vmw_supports_3d() local
40 if (!(dev_priv->capabilities & SVGA_CAP_3D)) in vmw_supports_3d()
43 if (dev_priv->capabilities & SVGA_CAP_GBOBJECTS) { in vmw_supports_3d()
46 if (!dev_priv->has_mob) in vmw_supports_3d()
54 if (!(dev_priv->capabilities & SVGA_CAP_EXTENDED_FIFO)) in vmw_supports_3d()
64 ((fifo->capabilities & in vmw_supports_3d()
76 if (dev_priv->active_display_unit == vmw_du_legacy) in vmw_supports_3d()
86 if (!(dev_priv->capabilities & SVGA_CAP_EXTENDED_FIFO)) in vmw_fifo_have_pitchlock()
98 struct vmw_fifo_state *fifo; in vmw_fifo_create() local
102 if (!dev_priv->fifo_mem) in vmw_fifo_create()
105 fifo = kzalloc(sizeof(*fifo), GFP_KERNEL); in vmw_fifo_create()
106 if (!fifo) in vmw_fifo_create()
107 return ERR_PTR(-ENOMEM); in vmw_fifo_create()
108 fifo->static_buffer_size = VMWGFX_FIFO_STATIC_SIZE; in vmw_fifo_create()
109 fifo->static_buffer = vmalloc(fifo->static_buffer_size); in vmw_fifo_create()
110 if (unlikely(fifo->static_buffer == NULL)) { in vmw_fifo_create()
111 kfree(fifo); in vmw_fifo_create()
112 return ERR_PTR(-ENOMEM); in vmw_fifo_create()
115 fifo->dynamic_buffer = NULL; in vmw_fifo_create()
116 fifo->reserved_size = 0; in vmw_fifo_create()
117 fifo->using_bounce_buffer = false; in vmw_fifo_create()
119 mutex_init(&fifo->fifo_mutex); in vmw_fifo_create()
120 init_rwsem(&fifo->rwsem); in vmw_fifo_create()
122 if (dev_priv->capabilities & SVGA_CAP_EXTENDED_FIFO) in vmw_fifo_create()
130 vmw_fifo_mem_write(dev_priv, SVGA_FIFO_MAX, dev_priv->fifo_mem_size); in vmw_fifo_create()
141 fifo->capabilities = vmw_fifo_mem_read(dev_priv, SVGA_FIFO_CAPABILITIES); in vmw_fifo_create()
143 drm_info(&dev_priv->drm, in vmw_fifo_create()
144 "Fifo max 0x%08x min 0x%08x cap 0x%08x\n", in vmw_fifo_create()
147 (unsigned int) fifo->capabilities); in vmw_fifo_create()
150 drm_warn(&dev_priv->drm, in vmw_fifo_create()
151 "FIFO memory is not usable. Driver failed to initialize."); in vmw_fifo_create()
152 return ERR_PTR(-ENXIO); in vmw_fifo_create()
155 return fifo; in vmw_fifo_create()
160 u32 *fifo_mem = dev_priv->fifo_mem; in vmw_fifo_ping_host()
168 struct vmw_fifo_state *fifo = dev_priv->fifo; in vmw_fifo_destroy() local
170 if (!fifo) in vmw_fifo_destroy()
173 if (likely(fifo->static_buffer != NULL)) { in vmw_fifo_destroy()
174 vfree(fifo->static_buffer); in vmw_fifo_destroy()
175 fifo->static_buffer = NULL; in vmw_fifo_destroy()
178 if (likely(fifo->dynamic_buffer != NULL)) { in vmw_fifo_destroy()
179 vfree(fifo->dynamic_buffer); in vmw_fifo_destroy()
180 fifo->dynamic_buffer = NULL; in vmw_fifo_destroy()
182 kfree(fifo); in vmw_fifo_destroy()
183 dev_priv->fifo = NULL; in vmw_fifo_destroy()
193 return ((max - next_cmd) + (stop - min) <= bytes); in vmw_fifo_is_full()
204 DRM_INFO("Fifo wait noirq.\n"); in vmw_fifo_wait_noirq()
207 prepare_to_wait(&dev_priv->fifo_queue, &__wait, in vmw_fifo_wait_noirq()
213 ret = -EBUSY; in vmw_fifo_wait_noirq()
219 ret = -ERESTARTSYS; in vmw_fifo_wait_noirq()
223 finish_wait(&dev_priv->fifo_queue, &__wait); in vmw_fifo_wait_noirq()
224 wake_up_all(&dev_priv->fifo_queue); in vmw_fifo_wait_noirq()
225 DRM_INFO("Fifo noirq exit.\n"); in vmw_fifo_wait_noirq()
239 if (!(dev_priv->capabilities & SVGA_CAP_IRQMASK)) in vmw_fifo_wait()
244 &dev_priv->fifo_queue_waiters); in vmw_fifo_wait()
248 (dev_priv->fifo_queue, in vmw_fifo_wait()
252 (dev_priv->fifo_queue, in vmw_fifo_wait()
256 ret = -EBUSY; in vmw_fifo_wait()
261 &dev_priv->fifo_queue_waiters); in vmw_fifo_wait()
267 * Reserve @bytes number of bytes in the fifo.
270 * If it timeouts waiting for fifo space, or if @bytes is larger than the
271 * available fifo space.
274 * Pointer to the fifo, or null on error (possible hardware hang).
279 struct vmw_fifo_state *fifo_state = dev_priv->fifo; in vmw_local_fifo_reserve()
280 u32 *fifo_mem = dev_priv->fifo_mem; in vmw_local_fifo_reserve()
284 uint32_t reserveable = fifo_state->capabilities & SVGA_FIFO_CAP_RESERVE; in vmw_local_fifo_reserve()
287 mutex_lock(&fifo_state->fifo_mutex); in vmw_local_fifo_reserve()
292 if (unlikely(bytes >= (max - min))) in vmw_local_fifo_reserve()
295 BUG_ON(fifo_state->reserved_size != 0); in vmw_local_fifo_reserve()
296 BUG_ON(fifo_state->dynamic_buffer != NULL); in vmw_local_fifo_reserve()
298 fifo_state->reserved_size = bytes; in vmw_local_fifo_reserve()
332 fifo_state->using_bounce_buffer = false; in vmw_local_fifo_reserve()
346 fifo_state->using_bounce_buffer = true; in vmw_local_fifo_reserve()
347 if (bytes < fifo_state->static_buffer_size) in vmw_local_fifo_reserve()
348 return fifo_state->static_buffer; in vmw_local_fifo_reserve()
350 fifo_state->dynamic_buffer = vmalloc(bytes); in vmw_local_fifo_reserve()
351 if (!fifo_state->dynamic_buffer) in vmw_local_fifo_reserve()
353 return fifo_state->dynamic_buffer; in vmw_local_fifo_reserve()
358 fifo_state->reserved_size = 0; in vmw_local_fifo_reserve()
359 mutex_unlock(&fifo_state->fifo_mutex); in vmw_local_fifo_reserve()
369 if (dev_priv->cman) in vmw_cmd_ctx_reserve()
370 ret = vmw_cmdbuf_reserve(dev_priv->cman, bytes, in vmw_cmd_ctx_reserve()
389 u32 *fifo_mem = vmw->fifo_mem; in vmw_fifo_res_copy()
390 uint32_t chunk_size = max - next_cmd; in vmw_fifo_res_copy()
392 uint32_t *buffer = (fifo_state->dynamic_buffer != NULL) ? in vmw_fifo_res_copy()
393 fifo_state->dynamic_buffer : fifo_state->static_buffer; in vmw_fifo_res_copy()
401 rest = bytes - chunk_size; in vmw_fifo_res_copy()
411 uint32_t *buffer = (fifo_state->dynamic_buffer != NULL) ? in vmw_fifo_slow_copy()
412 fifo_state->dynamic_buffer : fifo_state->static_buffer; in vmw_fifo_slow_copy()
422 bytes -= sizeof(uint32_t); in vmw_fifo_slow_copy()
428 struct vmw_fifo_state *fifo_state = dev_priv->fifo; in vmw_local_fifo_commit()
432 bool reserveable = fifo_state->capabilities & SVGA_FIFO_CAP_RESERVE; in vmw_local_fifo_commit()
435 BUG_ON(bytes > fifo_state->reserved_size); in vmw_local_fifo_commit()
437 fifo_state->reserved_size = 0; in vmw_local_fifo_commit()
439 if (fifo_state->using_bounce_buffer) { in vmw_local_fifo_commit()
447 if (fifo_state->dynamic_buffer) { in vmw_local_fifo_commit()
448 vfree(fifo_state->dynamic_buffer); in vmw_local_fifo_commit()
449 fifo_state->dynamic_buffer = NULL; in vmw_local_fifo_commit()
454 down_write(&fifo_state->rwsem); in vmw_local_fifo_commit()
455 if (fifo_state->using_bounce_buffer || reserveable) { in vmw_local_fifo_commit()
458 next_cmd -= max - min; in vmw_local_fifo_commit()
466 up_write(&fifo_state->rwsem); in vmw_local_fifo_commit()
468 mutex_unlock(&fifo_state->fifo_mutex); in vmw_local_fifo_commit()
473 if (dev_priv->cman) in vmw_cmd_commit()
474 vmw_cmdbuf_commit(dev_priv->cman, bytes, NULL, false); in vmw_cmd_commit()
481 * vmw_cmd_commit_flush - Commit fifo space and flush any buffered commands.
488 if (dev_priv->cman) in vmw_cmd_commit_flush()
489 vmw_cmdbuf_commit(dev_priv->cman, bytes, NULL, true); in vmw_cmd_commit_flush()
495 * vmw_cmd_flush - Flush any buffered commands and make sure command processing
505 if (dev_priv->cman) in vmw_cmd_flush()
506 return vmw_cmdbuf_cur_flush(dev_priv->cman, interruptible); in vmw_cmd_flush()
520 *seqno = atomic_read(&dev_priv->marker_seq); in vmw_cmd_send_fence()
521 ret = -ENOMEM; in vmw_cmd_send_fence()
528 *seqno = atomic_add_return(1, &dev_priv->marker_seq); in vmw_cmd_send_fence()
534 * Don't request hardware to send a fence. The in vmw_cmd_send_fence()
544 cmd_fence->fence = *seqno; in vmw_cmd_send_fence()
553 * vmw_cmd_emit_dummy_legacy_query - emits a dummy query to the fifo using
557 * @cid: The hardware context id used for the query.
570 struct ttm_buffer_object *bo = &dev_priv->dummy_query_bo->tbo; in vmw_cmd_emit_dummy_legacy_query()
578 return -ENOMEM; in vmw_cmd_emit_dummy_legacy_query()
580 cmd->header.id = SVGA_3D_CMD_WAIT_FOR_QUERY; in vmw_cmd_emit_dummy_legacy_query()
581 cmd->header.size = sizeof(cmd->body); in vmw_cmd_emit_dummy_legacy_query()
582 cmd->body.cid = cid; in vmw_cmd_emit_dummy_legacy_query()
583 cmd->body.type = SVGA3D_QUERYTYPE_OCCLUSION; in vmw_cmd_emit_dummy_legacy_query()
585 if (bo->resource->mem_type == TTM_PL_VRAM) { in vmw_cmd_emit_dummy_legacy_query()
586 cmd->body.guestResult.gmrId = SVGA_GMR_FRAMEBUFFER; in vmw_cmd_emit_dummy_legacy_query()
587 cmd->body.guestResult.offset = bo->resource->start << PAGE_SHIFT; in vmw_cmd_emit_dummy_legacy_query()
589 cmd->body.guestResult.gmrId = bo->resource->start; in vmw_cmd_emit_dummy_legacy_query()
590 cmd->body.guestResult.offset = 0; in vmw_cmd_emit_dummy_legacy_query()
599 * vmw_cmd_emit_dummy_gb_query - emits a dummy query to the fifo using
600 * guest-backed resource query commands.
603 * @cid: The hardware context id used for the query.
616 struct ttm_buffer_object *bo = &dev_priv->dummy_query_bo->tbo; in vmw_cmd_emit_dummy_gb_query()
624 return -ENOMEM; in vmw_cmd_emit_dummy_gb_query()
626 cmd->header.id = SVGA_3D_CMD_WAIT_FOR_GB_QUERY; in vmw_cmd_emit_dummy_gb_query()
627 cmd->header.size = sizeof(cmd->body); in vmw_cmd_emit_dummy_gb_query()
628 cmd->body.cid = cid; in vmw_cmd_emit_dummy_gb_query()
629 cmd->body.type = SVGA3D_QUERYTYPE_OCCLUSION; in vmw_cmd_emit_dummy_gb_query()
630 BUG_ON(bo->resource->mem_type != VMW_PL_MOB); in vmw_cmd_emit_dummy_gb_query()
631 cmd->body.mobid = bo->resource->start; in vmw_cmd_emit_dummy_gb_query()
632 cmd->body.offset = 0; in vmw_cmd_emit_dummy_gb_query()
641 * vmw_cmd_emit_dummy_query - emits a dummy query to the fifo using
645 * @cid: The hardware context id used for the query.
653 * of the dev_priv->dummy_query_bo buffer object. And that buffer object
656 * Returns -ENOMEM on failure to reserve fifo space.
661 if (dev_priv->has_mob) in vmw_cmd_emit_dummy_query()
669 * vmw_cmd_supported - returns true if the given device supports
679 (vmw->capabilities & (SVGA_CAP_COMMAND_BUFFERS | in vmw_cmd_supported()
683 (vmw->capabilities & SVGA_CAP_GBOBJECTS) != 0); in vmw_cmd_supported()
685 * We have FIFO cmd's in vmw_cmd_supported()
687 return has_cmdbufs || vmw->fifo_mem != NULL; in vmw_cmd_supported()