drivers/accel/amdxdna/aie.c

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

File Facts

System
Linux kernel
Corpus path
drivers/accel/amdxdna/aie.c
Extension
.c
Size
4192 bytes
Lines
168
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 (tbl[i].revision == rev) {
			xdna->vbnv = tbl[i].vbnv;
			break;
		}
	}
}

void amdxdna_vbnv_init(struct amdxdna_dev *xdna)
{
	const struct amdxdna_dev_info *info = xdna->dev_info;
	u32 rev;

	xdna->vbnv = info->default_vbnv;

	if (!info->ops->get_dev_revision || !info->rev_vbnv_tbl)
		return;

	if (info->ops->get_dev_revision(xdna, &rev))
		return;

	amdxdna_update_vbnv(xdna, info->rev_vbnv_tbl, rev);
}

int amdxdna_get_metadata(struct aie_device *aie,
			 struct amdxdna_client *client,
			 struct amdxdna_drm_get_info *args)
{
	int ret = 0;
	u32 buf_sz;

	buf_sz = min(args->buffer_size, sizeof(aie->metadata));
	if (copy_to_user(u64_to_user_ptr(args->buffer), &aie->metadata, buf_sz))
		ret = -EFAULT;

	return ret;
}

void *amdxdna_alloc_msg_buffer(struct amdxdna_dev *xdna, u32 *size,
			       dma_addr_t *dma_addr)
{
	void *vaddr;
	int order;

	*size = max_t(u32, *size, SZ_8K);
	order = get_order(*size);
	if (order > MAX_PAGE_ORDER)
		return ERR_PTR(-EINVAL);
	*size = PAGE_SIZE << order;

	if (amdxdna_iova_on(xdna))
		return amdxdna_iommu_alloc(xdna, *size, dma_addr);

	vaddr = dma_alloc_noncoherent(xdna->ddev.dev, *size, dma_addr,
				      DMA_FROM_DEVICE, GFP_KERNEL);
	if (!vaddr)
		return ERR_PTR(-ENOMEM);

	return vaddr;
}

void amdxdna_free_msg_buffer(struct amdxdna_dev *xdna, size_t size,
			     void *cpu_addr, dma_addr_t dma_addr)
{
	if (amdxdna_iova_on(xdna)) {
		amdxdna_iommu_free(xdna, size, cpu_addr, dma_addr);
		return;
	}

	dma_free_noncoherent(xdna->ddev.dev, size, cpu_addr, dma_addr, DMA_FROM_DEVICE);
}

Annotation

Implementation Notes