]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
amd/iommu: Make protection domain ID functions non-static
authorSairaj Kodilkar <sarunkod@amd.com>
Fri, 21 Nov 2025 09:11:16 +0000 (14:41 +0530)
committerJoerg Roedel <joerg.roedel@amd.com>
Fri, 19 Dec 2025 10:23:49 +0000 (11:23 +0100)
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: Sairaj Kodilkar <sarunkod@amd.com>
Reviewed-by: Vasant Hegde <vasant.hegde@amd.com>
Signed-off-by: Joerg Roedel <joerg.roedel@amd.com>
drivers/iommu/amd/amd_iommu.h
drivers/iommu/amd/init.c
drivers/iommu/amd/iommu.c

index 25044d28f28a8ddd03d7489eabce7e5c0f4912d0..b742ef1adb352bce7fbb611040ff7a9b038a141a 100644 (file)
@@ -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
index 106ee3cf30388af4acdfe358fab9feded2e9d314..384c90b4f90a0a267177925da95225712f941219 100644 (file)
@@ -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();
 }
 
index 9f1d56a5e145fe798c09f6065dd44a38e07e591d..5d45795c367a6be0acf32213556c2bd900d175b8 100644 (file)
@@ -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);
 }