|
@@ -25,9 +25,85 @@
|
|
#include <linux/types.h>
|
|
#include <linux/types.h>
|
|
#include <linux/msi.h>
|
|
#include <linux/msi.h>
|
|
|
|
|
|
-#ifdef CONFIG_DMAR
|
|
|
|
|
|
+#if defined(CONFIG_DMAR) || defined(CONFIG_INTR_REMAP)
|
|
struct intel_iommu;
|
|
struct intel_iommu;
|
|
|
|
|
|
|
|
+struct dmar_drhd_unit {
|
|
|
|
+ struct list_head list; /* list of drhd units */
|
|
|
|
+ struct acpi_dmar_header *hdr; /* ACPI header */
|
|
|
|
+ u64 reg_base_addr; /* register base address*/
|
|
|
|
+ struct pci_dev **devices; /* target device array */
|
|
|
|
+ int devices_cnt; /* target device count */
|
|
|
|
+ u8 ignored:1; /* ignore drhd */
|
|
|
|
+ u8 include_all:1;
|
|
|
|
+ struct intel_iommu *iommu;
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+extern struct list_head dmar_drhd_units;
|
|
|
|
+
|
|
|
|
+#define for_each_drhd_unit(drhd) \
|
|
|
|
+ list_for_each_entry(drhd, &dmar_drhd_units, list)
|
|
|
|
+
|
|
|
|
+extern int dmar_table_init(void);
|
|
|
|
+extern int early_dmar_detect(void);
|
|
|
|
+extern int dmar_dev_scope_init(void);
|
|
|
|
+
|
|
|
|
+/* Intel IOMMU detection */
|
|
|
|
+extern void detect_intel_iommu(void);
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+extern int parse_ioapics_under_ir(void);
|
|
|
|
+extern int alloc_iommu(struct dmar_drhd_unit *);
|
|
|
|
+#else
|
|
|
|
+static inline void detect_intel_iommu(void)
|
|
|
|
+{
|
|
|
|
+ return;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static inline int dmar_table_init(void)
|
|
|
|
+{
|
|
|
|
+ return -ENODEV;
|
|
|
|
+}
|
|
|
|
+#endif /* !CONFIG_DMAR && !CONFIG_INTR_REMAP */
|
|
|
|
+
|
|
|
|
+#ifdef CONFIG_INTR_REMAP
|
|
|
|
+extern int intr_remapping_enabled;
|
|
|
|
+extern int enable_intr_remapping(int);
|
|
|
|
+
|
|
|
|
+struct irte {
|
|
|
|
+ union {
|
|
|
|
+ struct {
|
|
|
|
+ __u64 present : 1,
|
|
|
|
+ fpd : 1,
|
|
|
|
+ dst_mode : 1,
|
|
|
|
+ redir_hint : 1,
|
|
|
|
+ trigger_mode : 1,
|
|
|
|
+ dlvry_mode : 3,
|
|
|
|
+ avail : 4,
|
|
|
|
+ __reserved_1 : 4,
|
|
|
|
+ vector : 8,
|
|
|
|
+ __reserved_2 : 8,
|
|
|
|
+ dest_id : 32;
|
|
|
|
+ };
|
|
|
|
+ __u64 low;
|
|
|
|
+ };
|
|
|
|
+
|
|
|
|
+ union {
|
|
|
|
+ struct {
|
|
|
|
+ __u64 sid : 16,
|
|
|
|
+ sq : 2,
|
|
|
|
+ svt : 2,
|
|
|
|
+ __reserved_3 : 44;
|
|
|
|
+ };
|
|
|
|
+ __u64 high;
|
|
|
|
+ };
|
|
|
|
+};
|
|
|
|
+#else
|
|
|
|
+#define enable_intr_remapping(mode) (-1)
|
|
|
|
+#define intr_remapping_enabled (0)
|
|
|
|
+#endif
|
|
|
|
+
|
|
|
|
+#ifdef CONFIG_DMAR
|
|
extern const char *dmar_get_fault_reason(u8 fault_reason);
|
|
extern const char *dmar_get_fault_reason(u8 fault_reason);
|
|
|
|
|
|
/* Can't use the common MSI interrupt functions
|
|
/* Can't use the common MSI interrupt functions
|
|
@@ -40,29 +116,8 @@ extern void dmar_msi_write(int irq, struct msi_msg *msg);
|
|
extern int dmar_set_interrupt(struct intel_iommu *iommu);
|
|
extern int dmar_set_interrupt(struct intel_iommu *iommu);
|
|
extern int arch_setup_dmar_msi(unsigned int irq);
|
|
extern int arch_setup_dmar_msi(unsigned int irq);
|
|
|
|
|
|
-/* Intel IOMMU detection and initialization functions */
|
|
|
|
-extern void detect_intel_iommu(void);
|
|
|
|
-extern int intel_iommu_init(void);
|
|
|
|
-
|
|
|
|
-extern int dmar_table_init(void);
|
|
|
|
-extern int early_dmar_detect(void);
|
|
|
|
-extern int dmar_dev_scope_init(void);
|
|
|
|
-extern int parse_ioapics_under_ir(void);
|
|
|
|
-
|
|
|
|
-extern struct list_head dmar_drhd_units;
|
|
|
|
|
|
+extern int iommu_detected, no_iommu;
|
|
extern struct list_head dmar_rmrr_units;
|
|
extern struct list_head dmar_rmrr_units;
|
|
-
|
|
|
|
-struct dmar_drhd_unit {
|
|
|
|
- struct list_head list; /* list of drhd units */
|
|
|
|
- struct acpi_dmar_header *hdr; /* ACPI header */
|
|
|
|
- u64 reg_base_addr; /* register base address*/
|
|
|
|
- struct pci_dev **devices; /* target device array */
|
|
|
|
- int devices_cnt; /* target device count */
|
|
|
|
- u8 ignored:1; /* ignore drhd */
|
|
|
|
- u8 include_all:1;
|
|
|
|
- struct intel_iommu *iommu;
|
|
|
|
-};
|
|
|
|
-
|
|
|
|
struct dmar_rmrr_unit {
|
|
struct dmar_rmrr_unit {
|
|
struct list_head list; /* list of rmrr units */
|
|
struct list_head list; /* list of rmrr units */
|
|
struct acpi_dmar_header *hdr; /* ACPI header */
|
|
struct acpi_dmar_header *hdr; /* ACPI header */
|
|
@@ -72,24 +127,19 @@ struct dmar_rmrr_unit {
|
|
int devices_cnt; /* target device count */
|
|
int devices_cnt; /* target device count */
|
|
};
|
|
};
|
|
|
|
|
|
-#define for_each_drhd_unit(drhd) \
|
|
|
|
- list_for_each_entry(drhd, &dmar_drhd_units, list)
|
|
|
|
#define for_each_rmrr_units(rmrr) \
|
|
#define for_each_rmrr_units(rmrr) \
|
|
list_for_each_entry(rmrr, &dmar_rmrr_units, list)
|
|
list_for_each_entry(rmrr, &dmar_rmrr_units, list)
|
|
-
|
|
|
|
-extern int alloc_iommu(struct dmar_drhd_unit *);
|
|
|
|
|
|
+/* Intel DMAR initialization functions */
|
|
|
|
+extern int intel_iommu_init(void);
|
|
|
|
+extern int dmar_disabled;
|
|
#else
|
|
#else
|
|
-static inline void detect_intel_iommu(void)
|
|
|
|
-{
|
|
|
|
- return;
|
|
|
|
-}
|
|
|
|
static inline int intel_iommu_init(void)
|
|
static inline int intel_iommu_init(void)
|
|
{
|
|
{
|
|
|
|
+#ifdef CONFIG_INTR_REMAP
|
|
|
|
+ return dmar_dev_scope_init();
|
|
|
|
+#else
|
|
return -ENODEV;
|
|
return -ENODEV;
|
|
-}
|
|
|
|
-static inline int dmar_table_init(void)
|
|
|
|
-{
|
|
|
|
- return -ENODEV;
|
|
|
|
|
|
+#endif
|
|
}
|
|
}
|
|
#endif /* !CONFIG_DMAR */
|
|
#endif /* !CONFIG_DMAR */
|
|
#endif /* __DMAR_H__ */
|
|
#endif /* __DMAR_H__ */
|