Commit c7fe9384 authored by Sairaj Kodilkar's avatar Sairaj Kodilkar Committed by Joerg Roedel
Browse files

amd/iommu: Make protection domain ID functions non-static



So that both iommu.c and init.c can utilize them. Also define a new
function 'pdom_id_destroy()' to destroy 'pdom_ids' instead of directly
calling ida functions.

Signed-off-by: default avatarSairaj Kodilkar <sarunkod@amd.com>
Reviewed-by: default avatarVasant Hegde <vasant.hegde@amd.com>
Signed-off-by: default avatarJoerg Roedel <joerg.roedel@amd.com>
parent c2e8dc12
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -173,6 +173,11 @@ static inline struct protection_domain *to_pdomain(struct iommu_domain *dom)
bool translation_pre_enabled(struct amd_iommu *iommu);
int __init add_special_device(u8 type, u8 id, u32 *devid, bool cmd_line);

int amd_iommu_pdom_id_alloc(void);
int amd_iommu_pdom_id_reserve(u16 id, gfp_t gfp);
void amd_iommu_pdom_id_free(int id);
void amd_iommu_pdom_id_destroy(void);

#ifdef CONFIG_DMI
void amd_iommu_apply_ivrs_quirks(void);
#else
+2 −5
Original line number Diff line number Diff line
@@ -1142,7 +1142,6 @@ static bool __reuse_device_table(struct amd_iommu *iommu)
	u16 dom_id;
	bool dte_v;
	u64 entry;
	int ret;

	/* Each IOMMU use separate device table with the same size */
	lo = readl(iommu->mmio_base + MMIO_DEV_TABLE_OFFSET);
@@ -1189,8 +1188,7 @@ static bool __reuse_device_table(struct amd_iommu *iommu)
		 * are multiple devices present in the same domain,
		 * hence check only for -ENOMEM.
		 */
		ret = ida_alloc_range(&pdom_ids, dom_id, dom_id, GFP_KERNEL);
		if (ret == -ENOMEM)
		if (amd_iommu_pdom_id_reserve(dom_id, GFP_KERNEL) == -ENOMEM)
			return false;
	}

@@ -3148,8 +3146,7 @@ static bool __init check_ioapic_information(void)

static void __init free_dma_resources(void)
{
	ida_destroy(&pdom_ids);

	amd_iommu_pdom_id_destroy();
	free_unity_maps();
}

+18 −9
Original line number Diff line number Diff line
@@ -1811,17 +1811,26 @@ int amd_iommu_complete_ppr(struct device *dev, u32 pasid, int status, int tag)
 * contain.
 *
 ****************************************************************************/

static int pdom_id_alloc(void)
int amd_iommu_pdom_id_alloc(void)
{
	return ida_alloc_range(&pdom_ids, 1, MAX_DOMAIN_ID - 1, GFP_ATOMIC);
}

static void pdom_id_free(int id)
int amd_iommu_pdom_id_reserve(u16 id, gfp_t gfp)
{
	return ida_alloc_range(&pdom_ids, id, id, gfp);
}

void amd_iommu_pdom_id_free(int id)
{
	ida_free(&pdom_ids, id);
}

void amd_iommu_pdom_id_destroy(void)
{
	ida_destroy(&pdom_ids);
}

static void free_gcr3_tbl_level1(u64 *tbl)
{
	u64 *ptr;
@@ -1864,7 +1873,7 @@ static void free_gcr3_table(struct gcr3_tbl_info *gcr3_info)
	gcr3_info->glx = 0;

	/* Free per device domain ID */
	pdom_id_free(gcr3_info->domid);
	amd_iommu_pdom_id_free(gcr3_info->domid);

	iommu_free_pages(gcr3_info->gcr3_tbl);
	gcr3_info->gcr3_tbl = NULL;
@@ -1900,14 +1909,14 @@ static int setup_gcr3_table(struct gcr3_tbl_info *gcr3_info,
		return -EBUSY;

	/* Allocate per device domain ID */
	domid = pdom_id_alloc();
	domid = amd_iommu_pdom_id_alloc();
	if (domid <= 0)
		return -ENOSPC;
	gcr3_info->domid = domid;

	gcr3_info->gcr3_tbl = iommu_alloc_pages_node_sz(nid, GFP_ATOMIC, SZ_4K);
	if (gcr3_info->gcr3_tbl == NULL) {
		pdom_id_free(domid);
		amd_iommu_pdom_id_free(domid);
		return -ENOMEM;
	}

@@ -2503,7 +2512,7 @@ struct protection_domain *protection_domain_alloc(void)
	if (!domain)
		return NULL;

	domid = pdom_id_alloc();
	domid = amd_iommu_pdom_id_alloc();
	if (domid <= 0) {
		kfree(domain);
		return NULL;
@@ -2802,7 +2811,7 @@ void amd_iommu_domain_free(struct iommu_domain *dom)

	WARN_ON(!list_empty(&domain->dev_list));
	pt_iommu_deinit(&domain->iommu);
	pdom_id_free(domain->id);
	amd_iommu_pdom_id_free(domain->id);
	kfree(domain);
}

@@ -2853,7 +2862,7 @@ void amd_iommu_init_identity_domain(void)
	domain->ops = &identity_domain_ops;
	domain->owner = &amd_iommu_ops;

	identity_domain.id = pdom_id_alloc();
	identity_domain.id = amd_iommu_pdom_id_alloc();

	protection_domain_init(&identity_domain);
}