drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c

Source file repositories/reference/linux-study-clean/drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c

File Facts

System
Linux kernel
Corpus path
drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c
Extension
.c
Size
41419 bytes
Lines
1917
Domain
Driver Families
Bucket
drivers/gpu
Inferred role
Driver Families: implementation source
Status
source 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

struct parallel_switch {
	struct kthread_worker *worker;
	struct kthread_work work;
	struct intel_context *ce[2];
	int result;
};

static void __live_parallel_switch1(struct kthread_work *work)
{
	struct parallel_switch *arg =
		container_of(work, typeof(*arg), work);
	IGT_TIMEOUT(end_time);
	unsigned long count;

	count = 0;
	arg->result = 0;
	do {
		struct i915_request *rq = NULL;
		int n;

		for (n = 0; !arg->result && n < ARRAY_SIZE(arg->ce); n++) {
			struct i915_request *prev = rq;

			rq = i915_request_create(arg->ce[n]);
			if (IS_ERR(rq)) {
				i915_request_put(prev);
				arg->result = PTR_ERR(rq);
				break;
			}

			i915_request_get(rq);
			if (prev) {
				arg->result =
					i915_request_await_dma_fence(rq,
								     &prev->fence);
				i915_request_put(prev);
			}

			i915_request_add(rq);
		}

		if (IS_ERR_OR_NULL(rq))
			break;

		if (i915_request_wait(rq, 0, HZ) < 0)
			arg->result = -ETIME;

		i915_request_put(rq);

		count++;
	} while (!arg->result && !__igt_timeout(end_time, NULL));

	pr_info("%s: %lu switches (sync) <%d>\n",
		arg->ce[0]->engine->name, count, arg->result);
}

static void __live_parallel_switchN(struct kthread_work *work)
{
	struct parallel_switch *arg =
		container_of(work, typeof(*arg), work);
	struct i915_request *rq = NULL;
	IGT_TIMEOUT(end_time);
	unsigned long count;
	int n;

	count = 0;
	arg->result = 0;
	do {
		for (n = 0; !arg->result && n < ARRAY_SIZE(arg->ce); n++) {
			struct i915_request *prev = rq;

			rq = i915_request_create(arg->ce[n]);
			if (IS_ERR(rq)) {
				i915_request_put(prev);
				arg->result = PTR_ERR(rq);
				break;
			}

			i915_request_get(rq);
			if (prev) {
				arg->result =
					i915_request_await_dma_fence(rq,
								     &prev->fence);
				i915_request_put(prev);
			}

			i915_request_add(rq);
		}

		count++;

Annotation

Implementation Notes