move page table handling utility functions from intel-iommu.c to dma_remapping.h, because some of them will be used in other .c files.
Signed-off-by: Weidong Han <[EMAIL PROTECTED]> --- drivers/pci/intel-iommu.c | 45 ---------------------------------------- include/linux/dma_remapping.h | 46 ++++++++++++++++++++++++++++++++++++++++- 2 files changed, 45 insertions(+), 46 deletions(-) diff --git a/drivers/pci/intel-iommu.c b/drivers/pci/intel-iommu.c index 39c5e9d..a18e0b4 100644 --- a/drivers/pci/intel-iommu.c +++ b/drivers/pci/intel-iommu.c @@ -288,51 +288,6 @@ out: spin_unlock_irqrestore(&iommu->lock, flags); } -/* page table handling */ -#define LEVEL_STRIDE (9) -#define LEVEL_MASK (((u64)1 << LEVEL_STRIDE) - 1) - -static inline int agaw_to_level(int agaw) -{ - return agaw + 2; -} - -static inline int agaw_to_width(int agaw) -{ - return 30 + agaw * LEVEL_STRIDE; - -} - -static inline int width_to_agaw(int width) -{ - return (width - 30) / LEVEL_STRIDE; -} - -static inline unsigned int level_to_offset_bits(int level) -{ - return (12 + (level - 1) * LEVEL_STRIDE); -} - -static inline int address_level_offset(u64 addr, int level) -{ - return ((addr >> level_to_offset_bits(level)) & LEVEL_MASK); -} - -static inline u64 level_mask(int level) -{ - return ((u64)-1 << level_to_offset_bits(level)); -} - -static inline u64 level_size(int level) -{ - return ((u64)1 << level_to_offset_bits(level)); -} - -static inline u64 align_to_level(u64 addr, int level) -{ - return ((addr + level_size(level) - 1) & level_mask(level)); -} - static struct dma_pte * addr_to_dma_pte(struct dmar_domain *domain, u64 addr) { int addr_width = agaw_to_width(domain->agaw); diff --git a/include/linux/dma_remapping.h b/include/linux/dma_remapping.h index 66f7887..eeb8243 100644 --- a/include/linux/dma_remapping.h +++ b/include/linux/dma_remapping.h @@ -13,6 +13,50 @@ #define DMA_32BIT_PFN IOVA_PFN(DMA_32BIT_MASK) #define DMA_64BIT_PFN IOVA_PFN(DMA_64BIT_MASK) +/* page table handling */ +#define VTD_LEVEL_STRIDE (9) +#define VTD_LEVEL_MASK (((u64)1 << VTD_LEVEL_STRIDE) - 1) + +static inline int agaw_to_level(int agaw) +{ + return agaw + 2; +} + +static inline int agaw_to_width(int agaw) +{ + return 30 + agaw * VTD_LEVEL_STRIDE; +} + +static inline int width_to_agaw(int width) +{ + return (width - 30) / VTD_LEVEL_STRIDE; +} + +static inline unsigned int level_to_offset_bits(int level) +{ + return 12 + (level - 1) * VTD_LEVEL_STRIDE; +} + +static inline int address_level_offset(u64 addr, int level) +{ + return (addr >> level_to_offset_bits(level)) & VTD_LEVEL_MASK; +} + +static inline u64 level_mask(int level) +{ + return (u64)-1 << level_to_offset_bits(level); +} + +static inline u64 level_size(int level) +{ + return (u64)1 << level_to_offset_bits(level); +} + +static inline u64 align_to_level(u64 addr, int level) +{ + return (addr + level_size(level) - 1) & level_mask(level); +} + /* * 0: Present @@ -27,7 +71,7 @@ struct root_entry { #define ROOT_ENTRY_NR (VTD_PAGE_SIZE/sizeof(struct root_entry)) static inline bool root_present(struct root_entry *root) { - return (root->val & 1); + return root->val & 1; } static inline void set_root_present(struct root_entry *root) { -- 1.5.1
0002-move-page-table-handling-utility-functions.patch
Description: 0002-move-page-table-handling-utility-functions.patch