drivers/gpu/drm/ttm/ttm_execbuf_util.c

Source file repositories/reference/linux-study-clean/drivers/gpu/drm/ttm/ttm_execbuf_util.c

File Facts

System
Linux kernel
Corpus path
drivers/gpu/drm/ttm/ttm_execbuf_util.c
Extension
.c
Size
4701 bytes
Lines
164
Domain
Driver Families
Bucket
drivers/gpu
Inferred role
Driver Families: exported/initcall integration point
Status
integration implementation candidate

Why This File Exists

Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.

Dependency Surface

Detected Declarations

Annotated Snippet

if (ret == -EALREADY && dups) {
			struct ttm_validate_buffer *safe = entry;
			entry = list_prev_entry(entry, head);
			list_del(&safe->head);
			list_add(&safe->head, dups);
			continue;
		}

		num_fences = max(entry->num_shared, 1u);
		if (!ret) {
			ret = dma_resv_reserve_fences(bo->base.resv,
						      num_fences);
			if (!ret)
				continue;
		}

		/* uh oh, we lost out, drop every reservation and try
		 * to only reserve this buffer, then start over if
		 * this succeeds.
		 */
		ttm_eu_backoff_reservation_reverse(list, entry);

		if (ret == -EDEADLK) {
			ret = ttm_bo_reserve_slowpath(bo, intr, ticket);
		}

		if (!ret)
			ret = dma_resv_reserve_fences(bo->base.resv,
						      num_fences);

		if (unlikely(ret != 0)) {
			if (ticket) {
				ww_acquire_done(ticket);
				ww_acquire_fini(ticket);
			}
			return ret;
		}

		/* move this item to the front of the list,
		 * forces correct iteration of the loop without keeping track
		 */
		list_del(&entry->head);
		list_add(&entry->head, list);
	}

	return 0;
}
EXPORT_SYMBOL(ttm_eu_reserve_buffers);

void ttm_eu_fence_buffer_objects(struct ww_acquire_ctx *ticket,
				 struct list_head *list,
				 struct dma_fence *fence)
{
	struct ttm_validate_buffer *entry;

	if (list_empty(list))
		return;

	list_for_each_entry(entry, list, head) {
		struct ttm_buffer_object *bo = entry->bo;

		dma_resv_add_fence(bo->base.resv, fence, entry->num_shared ?
				   DMA_RESV_USAGE_READ : DMA_RESV_USAGE_WRITE);
		ttm_bo_move_to_lru_tail_unlocked(bo);
		dma_resv_unlock(bo->base.resv);
	}
	if (ticket)
		ww_acquire_fini(ticket);
}
EXPORT_SYMBOL(ttm_eu_fence_buffer_objects);

Annotation

Implementation Notes