|
@@ -75,6 +75,28 @@ static void pe_level_printk(const struct pnv_ioda_pe *pe, const char *level,
|
|
|
#define pe_info(pe, fmt, ...) \
|
|
|
pe_level_printk(pe, KERN_INFO, fmt, ##__VA_ARGS__)
|
|
|
|
|
|
+static bool pnv_iommu_bypass_disabled __read_mostly;
|
|
|
+
|
|
|
+static int __init iommu_setup(char *str)
|
|
|
+{
|
|
|
+ if (!str)
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
+ while (*str) {
|
|
|
+ if (!strncmp(str, "nobypass", 8)) {
|
|
|
+ pnv_iommu_bypass_disabled = true;
|
|
|
+ pr_info("PowerNV: IOMMU bypass window disabled.\n");
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ str += strcspn(str, ",");
|
|
|
+ if (*str == ',')
|
|
|
+ str++;
|
|
|
+ }
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+early_param("iommu", iommu_setup);
|
|
|
+
|
|
|
/*
|
|
|
* stdcix is only supposed to be used in hypervisor real mode as per
|
|
|
* the architecture spec
|
|
@@ -1351,7 +1373,9 @@ static void pnv_pci_ioda2_setup_dma_pe(struct pnv_phb *phb,
|
|
|
pnv_ioda_setup_bus_dma(pe, pe->pbus, true);
|
|
|
|
|
|
/* Also create a bypass window */
|
|
|
- pnv_pci_ioda2_setup_bypass_pe(phb, pe);
|
|
|
+ if (!pnv_iommu_bypass_disabled)
|
|
|
+ pnv_pci_ioda2_setup_bypass_pe(phb, pe);
|
|
|
+
|
|
|
return;
|
|
|
fail:
|
|
|
if (pe->tce32_seg >= 0)
|