Merge tag 'iommu-updates-v4.20' of git://git.kernel.org/pub/scm/linux/kernel/git/joro/iommu
Pull IOMMU updates from Joerg Roedel: - Debugfs support for the Intel VT-d driver. When enabled, it now also exposes some of its internal data structures to user-space for debugging purposes. - ARM-SMMU driver now uses the generic deferred flushing and fast-path iova allocation code. This is expected to be a major performance improvement, as this allocation path scales a lot better. - Support for r8a7744 in the Renesas iommu driver - Couple of minor fixes and improvements all over the place * tag 'iommu-updates-v4.20' of git://git.kernel.org/pub/scm/linux/kernel/git/joro/iommu: (39 commits) iommu/arm-smmu-v3: Remove unnecessary wrapper function iommu/arm-smmu-v3: Add SPDX header iommu/amd: Add default branch in amd_iommu_capable() dt-bindings: iommu: ipmmu-vmsa: Add r8a7744 support iommu/amd: Move iommu_init_pci() to .init section iommu/arm-smmu: Support non-strict mode iommu/io-pgtable-arm-v7s: Add support for non-strict mode iommu/arm-smmu-v3: Add support for non-strict mode iommu/io-pgtable-arm: Add support for non-strict mode iommu: Add "iommu.strict" command line option iommu/dma: Add support for non-strict mode iommu/arm-smmu: Ensure that page-table updates are visible before TLBI iommu/arm-smmu-v3: Implement flush_iotlb_all hook iommu/arm-smmu-v3: Avoid back-to-back CMD_SYNC operations iommu/arm-smmu-v3: Fix unexpected CMD_SYNC timeout iommu/io-pgtable-arm: Fix race handling in split_blk_unmap() iommu/arm-smmu-v3: Fix a couple of minor comment typos iommu: Fix a typo iommu: Remove .domain_{get,set}_windows iommu: Tidy up window attributes ...
This commit is contained in:
@@ -351,6 +351,14 @@ int mc_send_command(struct fsl_mc_io *mc_io, struct fsl_mc_command *cmd);
|
||||
#define dev_is_fsl_mc(_dev) (0)
|
||||
#endif
|
||||
|
||||
/* Macro to check if a device is a container device */
|
||||
#define fsl_mc_is_cont_dev(_dev) (to_fsl_mc_device(_dev)->flags & \
|
||||
FSL_MC_IS_DPRC)
|
||||
|
||||
/* Macro to get the container device of a MC device */
|
||||
#define fsl_mc_cont_dev(_dev) (fsl_mc_is_cont_dev(_dev) ? \
|
||||
(_dev) : (_dev)->parent)
|
||||
|
||||
/*
|
||||
* module_fsl_mc_driver() - Helper macro for drivers that don't do
|
||||
* anything special in module init/exit. This eliminates a lot of
|
||||
|
@@ -72,6 +72,42 @@
|
||||
#define DMAR_PEDATA_REG 0xe4 /* Page request event interrupt data register */
|
||||
#define DMAR_PEADDR_REG 0xe8 /* Page request event interrupt addr register */
|
||||
#define DMAR_PEUADDR_REG 0xec /* Page request event Upper address register */
|
||||
#define DMAR_MTRRCAP_REG 0x100 /* MTRR capability register */
|
||||
#define DMAR_MTRRDEF_REG 0x108 /* MTRR default type register */
|
||||
#define DMAR_MTRR_FIX64K_00000_REG 0x120 /* MTRR Fixed range registers */
|
||||
#define DMAR_MTRR_FIX16K_80000_REG 0x128
|
||||
#define DMAR_MTRR_FIX16K_A0000_REG 0x130
|
||||
#define DMAR_MTRR_FIX4K_C0000_REG 0x138
|
||||
#define DMAR_MTRR_FIX4K_C8000_REG 0x140
|
||||
#define DMAR_MTRR_FIX4K_D0000_REG 0x148
|
||||
#define DMAR_MTRR_FIX4K_D8000_REG 0x150
|
||||
#define DMAR_MTRR_FIX4K_E0000_REG 0x158
|
||||
#define DMAR_MTRR_FIX4K_E8000_REG 0x160
|
||||
#define DMAR_MTRR_FIX4K_F0000_REG 0x168
|
||||
#define DMAR_MTRR_FIX4K_F8000_REG 0x170
|
||||
#define DMAR_MTRR_PHYSBASE0_REG 0x180 /* MTRR Variable range registers */
|
||||
#define DMAR_MTRR_PHYSMASK0_REG 0x188
|
||||
#define DMAR_MTRR_PHYSBASE1_REG 0x190
|
||||
#define DMAR_MTRR_PHYSMASK1_REG 0x198
|
||||
#define DMAR_MTRR_PHYSBASE2_REG 0x1a0
|
||||
#define DMAR_MTRR_PHYSMASK2_REG 0x1a8
|
||||
#define DMAR_MTRR_PHYSBASE3_REG 0x1b0
|
||||
#define DMAR_MTRR_PHYSMASK3_REG 0x1b8
|
||||
#define DMAR_MTRR_PHYSBASE4_REG 0x1c0
|
||||
#define DMAR_MTRR_PHYSMASK4_REG 0x1c8
|
||||
#define DMAR_MTRR_PHYSBASE5_REG 0x1d0
|
||||
#define DMAR_MTRR_PHYSMASK5_REG 0x1d8
|
||||
#define DMAR_MTRR_PHYSBASE6_REG 0x1e0
|
||||
#define DMAR_MTRR_PHYSMASK6_REG 0x1e8
|
||||
#define DMAR_MTRR_PHYSBASE7_REG 0x1f0
|
||||
#define DMAR_MTRR_PHYSMASK7_REG 0x1f8
|
||||
#define DMAR_MTRR_PHYSBASE8_REG 0x200
|
||||
#define DMAR_MTRR_PHYSMASK8_REG 0x208
|
||||
#define DMAR_MTRR_PHYSBASE9_REG 0x210
|
||||
#define DMAR_MTRR_PHYSMASK9_REG 0x218
|
||||
#define DMAR_VCCAP_REG 0xe00 /* Virtual command capability register */
|
||||
#define DMAR_VCMD_REG 0xe10 /* Virtual command register */
|
||||
#define DMAR_VCRSP_REG 0xe20 /* Virtual command response register */
|
||||
|
||||
#define OFFSET_STRIDE (9)
|
||||
|
||||
@@ -389,6 +425,33 @@ struct pasid_entry;
|
||||
struct pasid_state_entry;
|
||||
struct page_req_dsc;
|
||||
|
||||
/*
|
||||
* 0: Present
|
||||
* 1-11: Reserved
|
||||
* 12-63: Context Ptr (12 - (haw-1))
|
||||
* 64-127: Reserved
|
||||
*/
|
||||
struct root_entry {
|
||||
u64 lo;
|
||||
u64 hi;
|
||||
};
|
||||
|
||||
/*
|
||||
* low 64 bits:
|
||||
* 0: present
|
||||
* 1: fault processing disable
|
||||
* 2-3: translation type
|
||||
* 12-63: address space root
|
||||
* high 64 bits:
|
||||
* 0-2: address width
|
||||
* 3-6: aval
|
||||
* 8-23: domain id
|
||||
*/
|
||||
struct context_entry {
|
||||
u64 lo;
|
||||
u64 hi;
|
||||
};
|
||||
|
||||
struct dmar_domain {
|
||||
int nid; /* node id */
|
||||
|
||||
@@ -558,6 +621,15 @@ extern int intel_iommu_enable_pasid(struct intel_iommu *iommu, struct intel_svm_
|
||||
extern struct intel_iommu *intel_svm_device_to_iommu(struct device *dev);
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_INTEL_IOMMU_DEBUGFS
|
||||
void intel_iommu_debugfs_init(void);
|
||||
#else
|
||||
static inline void intel_iommu_debugfs_init(void) {}
|
||||
#endif /* CONFIG_INTEL_IOMMU_DEBUGFS */
|
||||
|
||||
extern const struct attribute_group *intel_iommu_groups[];
|
||||
bool context_present(struct context_entry *context);
|
||||
struct context_entry *iommu_context_addr(struct intel_iommu *iommu, u8 bus,
|
||||
u8 devfn, int alloc);
|
||||
|
||||
#endif
|
||||
|
@@ -124,6 +124,7 @@ enum iommu_attr {
|
||||
DOMAIN_ATTR_FSL_PAMU_ENABLE,
|
||||
DOMAIN_ATTR_FSL_PAMUV1,
|
||||
DOMAIN_ATTR_NESTING, /* two stages of translation */
|
||||
DOMAIN_ATTR_DMA_USE_FLUSH_QUEUE,
|
||||
DOMAIN_ATTR_MAX,
|
||||
};
|
||||
|
||||
@@ -181,8 +182,6 @@ struct iommu_resv_region {
|
||||
* @apply_resv_region: Temporary helper call-back for iova reserved ranges
|
||||
* @domain_window_enable: Configure and enable a particular window for a domain
|
||||
* @domain_window_disable: Disable a particular window for a domain
|
||||
* @domain_set_windows: Set the number of windows for a domain
|
||||
* @domain_get_windows: Return the number of windows for a domain
|
||||
* @of_xlate: add OF master IDs to iommu grouping
|
||||
* @pgsize_bitmap: bitmap of all possible supported page sizes
|
||||
*/
|
||||
@@ -223,10 +222,6 @@ struct iommu_ops {
|
||||
int (*domain_window_enable)(struct iommu_domain *domain, u32 wnd_nr,
|
||||
phys_addr_t paddr, u64 size, int prot);
|
||||
void (*domain_window_disable)(struct iommu_domain *domain, u32 wnd_nr);
|
||||
/* Set the number of windows per domain */
|
||||
int (*domain_set_windows)(struct iommu_domain *domain, u32 w_count);
|
||||
/* Get the number of windows per domain */
|
||||
u32 (*domain_get_windows)(struct iommu_domain *domain);
|
||||
|
||||
int (*of_xlate)(struct device *dev, struct of_phandle_args *args);
|
||||
bool (*is_attach_deferred)(struct iommu_domain *domain, struct device *dev);
|
||||
@@ -293,6 +288,7 @@ extern int iommu_attach_device(struct iommu_domain *domain,
|
||||
extern void iommu_detach_device(struct iommu_domain *domain,
|
||||
struct device *dev);
|
||||
extern struct iommu_domain *iommu_get_domain_for_dev(struct device *dev);
|
||||
extern struct iommu_domain *iommu_get_dma_domain(struct device *dev);
|
||||
extern int iommu_map(struct iommu_domain *domain, unsigned long iova,
|
||||
phys_addr_t paddr, size_t size, int prot);
|
||||
extern size_t iommu_unmap(struct iommu_domain *domain, unsigned long iova,
|
||||
@@ -377,6 +373,8 @@ static inline void iommu_tlb_sync(struct iommu_domain *domain)
|
||||
extern struct iommu_group *pci_device_group(struct device *dev);
|
||||
/* Generic device grouping function */
|
||||
extern struct iommu_group *generic_device_group(struct device *dev);
|
||||
/* FSL-MC device grouping function */
|
||||
struct iommu_group *fsl_mc_device_group(struct device *dev);
|
||||
|
||||
/**
|
||||
* struct iommu_fwspec - per-device IOMMU instance data
|
||||
|
@@ -75,6 +75,7 @@ struct iova_domain {
|
||||
unsigned long granule; /* pfn granularity for this domain */
|
||||
unsigned long start_pfn; /* Lower limit for this domain */
|
||||
unsigned long dma_32bit_pfn;
|
||||
unsigned long max32_alloc_size; /* Size of last failed allocation */
|
||||
struct iova anchor; /* rbtree lookup anchor */
|
||||
struct iova_rcache rcaches[IOVA_RANGE_CACHE_MAX_SIZE]; /* IOVA range caches */
|
||||
|
||||
|
@@ -550,6 +550,10 @@ bool of_console_check(struct device_node *dn, char *name, int index);
|
||||
|
||||
extern int of_cpu_node_to_id(struct device_node *np);
|
||||
|
||||
int of_map_rid(struct device_node *np, u32 rid,
|
||||
const char *map_name, const char *map_mask_name,
|
||||
struct device_node **target, u32 *id_out);
|
||||
|
||||
#else /* CONFIG_OF */
|
||||
|
||||
static inline void of_core_init(void)
|
||||
@@ -952,6 +956,13 @@ static inline int of_cpu_node_to_id(struct device_node *np)
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
static inline int of_map_rid(struct device_node *np, u32 rid,
|
||||
const char *map_name, const char *map_mask_name,
|
||||
struct device_node **target, u32 *id_out)
|
||||
{
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
#define of_match_ptr(_ptr) NULL
|
||||
#define of_match_node(_matches, _node) NULL
|
||||
#endif /* CONFIG_OF */
|
||||
|
@@ -14,9 +14,6 @@ struct device_node *of_pci_find_child_device(struct device_node *parent,
|
||||
unsigned int devfn);
|
||||
int of_pci_get_devfn(struct device_node *np);
|
||||
void of_pci_check_probe_only(void);
|
||||
int of_pci_map_rid(struct device_node *np, u32 rid,
|
||||
const char *map_name, const char *map_mask_name,
|
||||
struct device_node **target, u32 *id_out);
|
||||
#else
|
||||
static inline struct device_node *of_pci_find_child_device(struct device_node *parent,
|
||||
unsigned int devfn)
|
||||
@@ -29,13 +26,6 @@ static inline int of_pci_get_devfn(struct device_node *np)
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
static inline int of_pci_map_rid(struct device_node *np, u32 rid,
|
||||
const char *map_name, const char *map_mask_name,
|
||||
struct device_node **target, u32 *id_out)
|
||||
{
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
static inline void of_pci_check_probe_only(void) { }
|
||||
#endif
|
||||
|
||||
|
Reference in New Issue
Block a user