drivers/accel/amdxdna/aie4_ctx.c

Source file repositories/reference/linux-study-clean/drivers/accel/amdxdna/aie4_ctx.c

File Facts

System
Linux kernel
Corpus path
drivers/accel/amdxdna/aie4_ctx.c
Extension
.c
Size
8603 bytes
Lines
334
Domain
Driver Families
Bucket
drivers/accel
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

if (!valid_queue_index(ri, wi, CTX_MAX_CMDS)) {
			XDNA_ERR(xdna, "Invalid index after retry, ri %llu, wi %llu", ri, wi);
			ri = 0;
		}
	}

	return ri;
}

static inline bool check_cmd_done(struct amdxdna_hwctx *hwctx, u64 seq)
{
	u64 read_idx = get_read_index(hwctx);

	return read_idx > seq;
}

int aie4_cmd_wait(struct amdxdna_hwctx *hwctx, u64 seq, u32 timeout)
{
	unsigned long wait_jifs = MAX_SCHEDULE_TIMEOUT;
	struct amdxdna_hwctx_priv *priv = hwctx->priv;
	struct cert_comp *cert_comp = priv->cert_comp;
	long ret;

	if (timeout)
		wait_jifs = msecs_to_jiffies(timeout);

	ret = wait_event_interruptible_timeout(cert_comp->waitq,
					       (check_cmd_done(hwctx, seq)),
					       wait_jifs);

	if (!ret)
		ret = -ETIME;

	return ret <= 0 ? ret : 0;
}

int aie4_hwctx_valid_doorbell(struct amdxdna_client *client, u32 vm_pgoff)
{
	struct amdxdna_hwctx *hwctx;
	unsigned long hwctx_id;
	int idx;

	idx = srcu_read_lock(&client->hwctx_srcu);
	amdxdna_for_each_hwctx(client, hwctx_id, hwctx) {
		if (vm_pgoff == (hwctx->doorbell_offset >> PAGE_SHIFT)) {
			srcu_read_unlock(&client->hwctx_srcu, idx);
			return 1;
		}
	}
	srcu_read_unlock(&client->hwctx_srcu, idx);

	return 0;
}

Annotation

Implementation Notes