summaryrefslogtreecommitdiff
path: root/include/linux
diff options
context:
space:
mode:
authorJason Gunthorpe <jgg@nvidia.com>2026-05-08 17:53:02 +0300
committerJoerg Roedel <joerg.roedel@amd.com>2026-05-19 11:45:38 +0300
commit89792629d4b260104555f9719ac84c1afc9a2012 (patch)
tree10931977863446d5fa10fd9ad5c4a24bb1d2a3a9 /include/linux
parentf0e4b7f5f87578cdd2d0f1e866183adc10d33b85 (diff)
downloadlinux-89792629d4b260104555f9719ac84c1afc9a2012.tar.xz
iommupt: Add PT_FEAT_DETAILED_GATHER
Generating the ARM SMMUv3 and RISC-V invalidation commands optimally requires some additional details from iommupt: - leaf_levels_bitmap is used to compute the ARM Range Invalidation Table Top Level hint - leaf_levels_bitmap is also used to compute the stride when generating single invalidations to invalidate once per leaf - table_levels_bitmap also computes the ARM TTL for future cases when there are no leaves Put these under a feature since only two drivers need to calculate them. This is also useful for the coming kunit iotlb invalidation test to know more about what invalidation is happening. Signed-off-by: Jason Gunthorpe <jgg@nvidia.com> Reviewed-by: Pranjal Shrivastava <praan@google.com> Tested-by: Andrew Jones <andrew.jones@oss.qualcomm.com> Signed-off-by: Joerg Roedel <joerg.roedel@amd.com>
Diffstat (limited to 'include/linux')
-rw-r--r--include/linux/generic_pt/common.h5
-rw-r--r--include/linux/iommu.h30
2 files changed, 30 insertions, 5 deletions
diff --git a/include/linux/generic_pt/common.h b/include/linux/generic_pt/common.h
index 2683e5b38998..07ef1c8341a4 100644
--- a/include/linux/generic_pt/common.h
+++ b/include/linux/generic_pt/common.h
@@ -134,6 +134,11 @@ enum pt_features {
* significant amount of page table.
*/
PT_FEAT_FLUSH_RANGE_NO_GAPS,
+ /**
+ * @PT_FEAT_DETAILED_GATHER: Fill in the struct iommu_iotlb_gather pt
+ * sub structure with information about which levels were changed.
+ */
+ PT_FEAT_DETAILED_GATHER,
/* private: */
PT_FEAT_FMT_START,
};
diff --git a/include/linux/iommu.h b/include/linux/iommu.h
index a9e89911c90f..bf8a77a164e4 100644
--- a/include/linux/iommu.h
+++ b/include/linux/iommu.h
@@ -360,11 +360,31 @@ struct iommu_iotlb_gather {
* flushed (inclusive)
*/
unsigned long end;
- /**
- * @pgsize: The interval at which to perform the flush, only used
- * by arm-smmu-v3
- */
- size_t pgsize;
+
+ union {
+ /**
+ * @pgsize: The interval at which to perform the flush, only
+ * used by arm-smmu-v3
+ */
+ size_t pgsize;
+ struct {
+ /**
+ * @pt.leaf_levels_bitmap: Bitmap of generic_pt
+ * levels where leaf entries were unmapped. Bit 0
+ * means the leaf only level. If 0 no leafs
+ * were unmapped.
+ */
+ u8 leaf_levels_bitmap;
+ /**
+ * @pt.table_levels_bitmap: Bitmap of generic_pt levels
+ * of table entries that were removed. Bit 0 is never
+ * set, bit 1 means a table of all leafs was removed.
+ * When freelist is empty this must be 0.
+ */
+ u8 table_levels_bitmap;
+ } pt;
+ };
+
/**
* @freelist: Removed pages to free after sync, only used by
* iommupt