drivers/accel/amdxdna/aie2_ctx.c

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

File Facts

System
Linux kernel
Corpus path
drivers/accel/amdxdna/aie2_ctx.c
Extension
.c
Size
30904 bytes
Lines
1208
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

struct aie2_ctx_health {
	struct amdxdna_ctx_health header;
	u32 txn_op_idx;
	u32 ctx_pc;
	u32 fatal_error_type;
	u32 fatal_error_exception_type;
	u32 fatal_error_exception_pc;
	u32 fatal_error_app_module;
};

static inline void aie2_tdr_signal(struct amdxdna_dev *xdna)
{
	WRITE_ONCE(xdna->dev_handle->tdr_status, AIE2_TDR_SIGNALED);
}

static bool aie2_tdr_detect(struct amdxdna_dev *xdna)
{
	struct amdxdna_dev_hdl *ndev = xdna->dev_handle;

	if (READ_ONCE(ndev->tdr_status) == AIE2_TDR_WAIT) {
		XDNA_ERR(xdna, "TDR timeout detected");
		return true;
	}

	WRITE_ONCE(ndev->tdr_status, AIE2_TDR_WAIT);
	return false;
}

static void aie2_job_release(struct kref *ref)
{
	struct amdxdna_sched_job *job;

	job = container_of(ref, struct amdxdna_sched_job, refcnt);

	amdxdna_sched_job_cleanup(job);
	atomic64_inc(&job->hwctx->job_free_cnt);
	wake_up(&job->hwctx->priv->job_free_wq);
	if (job->out_fence)
		dma_fence_put(job->out_fence);
	kfree(job->aie2_job_health);
	kfree(job);
}

static void aie2_job_put(struct amdxdna_sched_job *job)
{
	kref_put(&job->refcnt, aie2_job_release);
}

/* The bad_job is used in aie2_sched_job_timedout, otherwise, set it to NULL */
static void aie2_hwctx_stop(struct amdxdna_dev *xdna, struct amdxdna_hwctx *hwctx,
			    struct drm_sched_job *bad_job)
{
	drm_sched_stop(&hwctx->priv->sched, bad_job);
	aie2_destroy_context(xdna->dev_handle, hwctx);
	drm_sched_start(&hwctx->priv->sched, 0);
}

static int aie2_hwctx_restart(struct amdxdna_dev *xdna, struct amdxdna_hwctx *hwctx)
{
	struct amdxdna_gem_obj *heap = hwctx->priv->heap;
	unsigned long heap_id;
	int ret;

	ret = aie2_create_context(xdna->dev_handle, hwctx);
	if (ret) {
		XDNA_ERR(xdna, "Create hwctx failed, ret %d", ret);
		goto out;
	}

	ret = aie2_map_host_buf(xdna->dev_handle, hwctx->fw_ctx_id,
				amdxdna_obj_dma_addr(heap),
				heap->mem.size);
	if (ret) {
		XDNA_ERR(xdna, "Map host buf failed, ret %d", ret);
		goto out;
	}

	xa_for_each_range(&hwctx->client->dev_heap_xa, heap_id, heap, 1,
			  hwctx->last_attached_heap) {
		ret = aie2_add_host_buf(xdna->dev_handle, hwctx->fw_ctx_id,
					amdxdna_obj_dma_addr(heap),
					heap->mem.size);
		if (ret) {
			XDNA_ERR(xdna, "Add heap %ld failed ret %d", heap_id, ret);
			goto out;
		}
	}

	ret = aie2_config_cu(hwctx, NULL);
	if (ret) {

Annotation

Implementation Notes