From: Vasant Hegde <vasant.hegde@amd.com>
To: <iommu@lists.linux.dev>, <joro@8bytes.org>
Cc: <suravee.suthikulpanit@amd.com>, <wei.huang2@amd.com>,
<jsnitsel@redhat.com>, <jgg@ziepe.ca>,
Vasant Hegde <vasant.hegde@amd.com>
Subject: [PATCH 08/11] iommu/amd: Refactor GCR3 table helper functions
Date: Tue, 8 Aug 2023 10:02:29 +0000 [thread overview]
Message-ID: <20230808100232.5977-9-vasant.hegde@amd.com> (raw)
In-Reply-To: <20230808100232.5977-1-vasant.hegde@amd.com>
From: Suravee Suthikulpanit <suravee.suthikulpanit@amd.com>
To use the new per-device struct gcr3_tbl_info. Also modify
set_dte_entry() to use new per device GCR3 table.
Signed-off-by: Suravee Suthikulpanit <suravee.suthikulpanit@amd.com>
Co-developed-by: Vasant Hegde <vasant.hegde@amd.com>
Signed-off-by: Vasant Hegde <vasant.hegde@amd.com>
---
drivers/iommu/amd/iommu.c | 75 +++++++++++++++++++++++++--------------
1 file changed, 48 insertions(+), 27 deletions(-)
diff --git a/drivers/iommu/amd/iommu.c b/drivers/iommu/amd/iommu.c
index c9318be9fe4e..bba2034a28f6 100644
--- a/drivers/iommu/amd/iommu.c
+++ b/drivers/iommu/amd/iommu.c
@@ -78,6 +78,11 @@ struct kmem_cache *amd_iommu_irq_cache;
static void detach_device(struct device *dev);
+static void set_dte_entry(struct amd_iommu *iommu, u16 devid,
+ struct gcr3_tbl_info *gcr3_info,
+ struct protection_domain *domain, bool ats,
+ enum ppr_handlers ppr);
+
static int __set_gcr3(struct iommu_dev_data *dev_data,
u32 pasid, unsigned long gcr3);
@@ -1679,16 +1684,27 @@ static void free_gcr3_tbl_level2(u64 *tbl)
}
}
-static void free_gcr3_table(struct protection_domain *domain)
+static void free_gcr3_table(struct iommu_dev_data *dev_data)
{
- if (domain->glx == 2)
- free_gcr3_tbl_level2(domain->gcr3_tbl);
- else if (domain->glx == 1)
- free_gcr3_tbl_level1(domain->gcr3_tbl);
+ struct gcr3_tbl_info *gcr3_info = &dev_data->gcr3_info;
+ struct amd_iommu *iommu = amd_iommu_rlookup_iommu(dev_data->dev);
+
+ if (gcr3_info->glx == 2)
+ free_gcr3_tbl_level2(gcr3_info->gcr3_tbl);
+ else if (gcr3_info->glx == 1)
+ free_gcr3_tbl_level1(gcr3_info->gcr3_tbl);
else
- BUG_ON(domain->glx != 0);
+ WARN_ON_ONCE(gcr3_info->glx != 0);
+
+ gcr3_info->glx = 0;
+
+ set_dte_entry(iommu, dev_data->devid, NULL, dev_data->domain,
+ dev_data->ats_enabled, dev_data->ppr);
+ clone_aliases(iommu, dev_data->dev);
+ device_flush_dte(dev_data);
- free_page((unsigned long)domain->gcr3_tbl);
+ free_page((unsigned long)gcr3_info->gcr3_tbl);
+ gcr3_info->gcr3_tbl = NULL;
}
/*
@@ -1703,27 +1719,35 @@ static int get_gcr3_levels(int pasids)
return (DIV_ROUND_UP(get_count_order(pasids), 9) - 1);
}
-/* Note: This function expects iommu_domain->lock to be held prior calling the function. */
-static int setup_gcr3_table(struct protection_domain *domain, int pasids)
+static int setup_gcr3_table(struct iommu_dev_data *dev_data, int pasids)
{
+ struct gcr3_tbl_info *gcr3_info = &dev_data->gcr3_info;
+ struct amd_iommu *iommu = amd_iommu_rlookup_iommu(dev_data->dev);
int levels = get_gcr3_levels(pasids);
if (levels > amd_iommu_max_glx_val)
return -EINVAL;
- domain->gcr3_tbl = alloc_pgtable_page(domain->nid, GFP_ATOMIC);
- if (domain->gcr3_tbl == NULL)
+ if (gcr3_info->gcr3_tbl)
+ return -EBUSY;
+
+ gcr3_info->gcr3_tbl = alloc_pgtable_page(dev_to_node(dev_data->dev),
+ GFP_ATOMIC);
+ if (gcr3_info->gcr3_tbl == NULL)
return -ENOMEM;
- domain->glx = levels;
- domain->flags |= PD_IOMMUV2_MASK;
+ gcr3_info->glx = levels;
- amd_iommu_domain_update(domain);
+ set_dte_entry(iommu, dev_data->devid, &dev_data->gcr3_info,
+ dev_data->domain, dev_data->ats_enabled, dev_data->ppr);
+ clone_aliases(iommu, dev_data->dev);
+ device_flush_dte(dev_data);
return 0;
}
static void set_dte_entry(struct amd_iommu *iommu, u16 devid,
+ struct gcr3_tbl_info *gcr3_info,
struct protection_domain *domain, bool ats,
enum ppr_handlers ppr)
{
@@ -1755,9 +1779,9 @@ static void set_dte_entry(struct amd_iommu *iommu, u16 devid,
if (ppr != PPR_HANDLER_NONE)
pte_root |= 1ULL << DEV_ENTRY_PPR;
- if (domain->flags & PD_IOMMUV2_MASK) {
- u64 gcr3 = iommu_virt_to_phys(domain->gcr3_tbl);
- u64 glx = domain->glx;
+ if (gcr3_info && gcr3_info->gcr3_tbl) {
+ u64 gcr3 = iommu_virt_to_phys(gcr3_info->gcr3_tbl);
+ u64 glx = gcr3_info->glx;
u64 tmp;
pte_root |= DTE_FLAG_GV;
@@ -1785,7 +1809,7 @@ static void set_dte_entry(struct amd_iommu *iommu, u16 devid,
((u64)GUEST_PGTABLE_5_LEVEL << DTE_GPT_LEVEL_SHIFT);
}
- if (domain->flags & PD_GIOV_MASK)
+ if (gcr3_info->giov)
pte_root |= DTE_FLAG_GIOV;
}
@@ -1835,7 +1859,7 @@ static int default_gcr3_init(struct iommu_dev_data *dev_data)
* By default, setup GCR3 table to support MAX PASIDs
* support by the IOMMU HW.
*/
- return setup_gcr3_table(dev_data->domain, -1);
+ return setup_gcr3_table(dev_data, -1);
}
static inline void default_gcr3_destroy(struct iommu_dev_data *dev_data)
@@ -1843,7 +1867,7 @@ static inline void default_gcr3_destroy(struct iommu_dev_data *dev_data)
struct gcr3_tbl_info *gcr3_info = &dev_data->gcr3_info;
gcr3_info->giov = false;
- free_gcr3_table(dev_data->domain);
+ free_gcr3_table(dev_data);
}
static int do_attach(struct iommu_dev_data *dev_data,
@@ -1884,8 +1908,8 @@ static int do_attach(struct iommu_dev_data *dev_data,
}
/* Update device table */
- set_dte_entry(iommu, dev_data->devid, domain,
- ats, dev_data->ppr);
+ set_dte_entry(iommu, dev_data->devid, &dev_data->gcr3_info,
+ domain, ats, dev_data->ppr);
clone_aliases(iommu, dev_data->dev);
device_flush_dte(dev_data);
@@ -2088,8 +2112,8 @@ static void update_device_table(struct protection_domain *domain)
if (!iommu)
continue;
- set_dte_entry(iommu, dev_data->devid, domain,
- dev_data->ats_enabled, dev_data->ppr);
+ set_dte_entry(iommu, dev_data->devid, &dev_data->gcr3_info,
+ domain, dev_data->ats_enabled, dev_data->ppr);
clone_aliases(iommu, dev_data->dev);
}
}
@@ -2637,9 +2661,6 @@ int amd_iommu_domain_enable_v2(struct iommu_domain *dom, int pasids)
if (pdom->dev_cnt > 0 || pdom->flags & PD_IOMMUV2_MASK)
goto out;
- if (!pdom->gcr3_tbl)
- ret = setup_gcr3_table(pdom, pasids);
-
out:
spin_unlock_irqrestore(&pdom->lock, flags);
return ret;
--
2.31.1
next prev parent reply other threads:[~2023-08-08 10:07 UTC|newest]
Thread overview: 35+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-08-08 10:02 [PATCH 00/11] iommu/amd: SVA support (part 2) - refactor support for GCR3 table Vasant Hegde
2023-08-08 10:02 ` [PATCH 01/11] iommu/amd: Rename helper function rlookup_amd_iommu() Vasant Hegde
2023-08-08 15:28 ` Jason Gunthorpe
2023-08-10 23:06 ` Suthikulpanit, Suravee
2023-08-11 13:06 ` Jason Gunthorpe
2023-08-08 10:02 ` [PATCH 02/11] iommu/amd: Introduce struct protection_domain.pd_mode Vasant Hegde
2023-08-08 15:30 ` Jason Gunthorpe
2023-08-11 10:04 ` Vasant Hegde
2023-08-11 13:21 ` Jason Gunthorpe
2023-08-08 10:02 ` [PATCH 03/11] iommu/amd: Introduce per-device GCR3 table Vasant Hegde
2023-08-08 15:32 ` Jason Gunthorpe
2023-08-10 23:31 ` Suthikulpanit, Suravee
2023-08-08 10:02 ` [PATCH 04/11] iommu/amd: Use protection_domain.flags to check page table mode Vasant Hegde
2023-08-08 15:35 ` Jason Gunthorpe
2023-08-11 10:10 ` Vasant Hegde
2023-08-08 10:02 ` [PATCH 05/11] iommu/amd: Refactor helper function for setting / clearing GCR3 Vasant Hegde
2023-08-08 10:02 ` [PATCH 06/11] iommu/amd: Refactor helper function for attaching / detaching device Vasant Hegde
2023-08-08 15:39 ` Jason Gunthorpe
2023-08-11 10:07 ` Vasant Hegde
2023-08-11 13:20 ` Jason Gunthorpe
2023-08-11 16:50 ` Vasant Hegde
2023-08-11 23:50 ` Jason Gunthorpe
2023-08-15 4:19 ` Tian, Kevin
2023-08-15 5:33 ` Suthikulpanit, Suravee
2023-08-15 11:42 ` Jason Gunthorpe
2023-08-08 10:02 ` [PATCH 07/11] iommu/amd: Refactor protection_domain helper functions Vasant Hegde
2023-08-08 10:02 ` Vasant Hegde [this message]
2023-08-08 10:02 ` [PATCH 09/11] iommu/amd: Introduce helper functions for AMD IOMMU v2 driver Vasant Hegde
2023-08-08 15:49 ` Jason Gunthorpe
2023-08-11 1:34 ` Suthikulpanit, Suravee
2023-08-11 13:17 ` Jason Gunthorpe
2023-08-11 16:51 ` Suthikulpanit, Suravee
2023-08-08 10:02 ` [PATCH 10/11] iommu/amd/iommu_v2: Add support to switch default domain to SVA mode Vasant Hegde
2023-08-08 15:51 ` Jason Gunthorpe
2023-08-08 10:02 ` [PATCH 11/11] iommu/amd: Remove unused GCR3 table parameters from struct protection_domain Vasant Hegde
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20230808100232.5977-9-vasant.hegde@amd.com \
--to=vasant.hegde@amd.com \
--cc=iommu@lists.linux.dev \
--cc=jgg@ziepe.ca \
--cc=joro@8bytes.org \
--cc=jsnitsel@redhat.com \
--cc=suravee.suthikulpanit@amd.com \
--cc=wei.huang2@amd.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.