drivers/iommu/generic_pt/kunit_iommu.h

Source file repositories/reference/linux-study-clean/drivers/iommu/generic_pt/kunit_iommu.h

File Facts

System
Linux kernel
Corpus path
drivers/iommu/generic_pt/kunit_iommu.h
Extension
.h
Size
5707 bytes
Lines
185
Domain
Driver Families
Bucket
drivers/iommu
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 kunit_iommu_priv {
	union {
		struct iommu_domain domain;
		struct pt_iommu_table fmt_table;
	};
	spinlock_t top_lock;
	struct device *dummy_dev;
	struct pt_iommu *iommu;
	struct pt_common *common;
	struct pt_iommu_table_cfg cfg;
	struct pt_iommu_info info;
	unsigned int smallest_pgsz_lg2;
	pt_vaddr_t smallest_pgsz;
	unsigned int largest_pgsz_lg2;
	pt_oaddr_t test_oa;
	pt_vaddr_t safe_pgsize_bitmap;
	unsigned long orig_nr_secondary_pagetable;

};
PT_IOMMU_CHECK_DOMAIN(struct kunit_iommu_priv, fmt_table.iommu, domain);

static void pt_kunit_iotlb_sync(struct iommu_domain *domain,
				struct iommu_iotlb_gather *gather)
{
	iommu_put_pages_list(&gather->freelist);
}

#define IOMMU_PT_DOMAIN_OPS1(x) IOMMU_PT_DOMAIN_OPS(x)
static const struct iommu_domain_ops kunit_pt_ops = {
	IOMMU_PT_DOMAIN_OPS1(PTPFX_RAW),
	.iotlb_sync = &pt_kunit_iotlb_sync,
};

static void pt_kunit_change_top(struct pt_iommu *iommu_table,
				phys_addr_t top_paddr, unsigned int top_level)
{
}

static spinlock_t *pt_kunit_get_top_lock(struct pt_iommu *iommu_table)
{
	struct kunit_iommu_priv *priv = container_of(
		iommu_table, struct kunit_iommu_priv, fmt_table.iommu);

	return &priv->top_lock;
}

static const struct pt_iommu_driver_ops pt_kunit_driver_ops = {
	.change_top = &pt_kunit_change_top,
	.get_top_lock = &pt_kunit_get_top_lock,
};

static int pt_kunit_priv_init(struct kunit *test, struct kunit_iommu_priv *priv)
{
	unsigned int va_lg2sz;
	int ret;

	/* Enough so the memory allocator works */
	priv->dummy_dev = kunit_device_register(test, "pt_kunit_dev");
	if (IS_ERR(priv->dummy_dev))
		return PTR_ERR(priv->dummy_dev);
	set_dev_node(priv->dummy_dev, NUMA_NO_NODE);

	spin_lock_init(&priv->top_lock);

#ifdef kunit_fmt_cfgs
	priv->cfg = kunit_fmt_cfgs[((uintptr_t)test->param_value) - 1];
	/*
	 * The format can set a list of features that the kunit_fmt_cfgs
	 * controls, other features are default to on.
	 */
	priv->cfg.common.features |= PT_SUPPORTED_FEATURES &
				     (~KUNIT_FMT_FEATURES);
#else
	priv->cfg.common.features = PT_SUPPORTED_FEATURES;
#endif

	/* Defaults, for the kunit */
	if (!priv->cfg.common.hw_max_vasz_lg2)
		priv->cfg.common.hw_max_vasz_lg2 = PT_MAX_VA_ADDRESS_LG2;
	if (!priv->cfg.common.hw_max_oasz_lg2)
		priv->cfg.common.hw_max_oasz_lg2 = pt_max_oa_lg2(NULL);

	priv->fmt_table.iommu.nid = NUMA_NO_NODE;
	priv->fmt_table.iommu.driver_ops = &pt_kunit_driver_ops;
	priv->fmt_table.iommu.iommu_device = priv->dummy_dev;
	priv->domain.ops = &kunit_pt_ops;
	ret = pt_iommu_init(&priv->fmt_table, &priv->cfg, GFP_KERNEL);
	if (ret) {
		if (ret == -EOVERFLOW)
			kunit_skip(

Annotation

Implementation Notes