diff options
Diffstat (limited to 'arch/powerpc/kernel/iommu.c')
| -rw-r--r-- | arch/powerpc/kernel/iommu.c | 12 | 
1 files changed, 12 insertions, 0 deletions
diff --git a/arch/powerpc/kernel/iommu.c b/arch/powerpc/kernel/iommu.c index d773dd440a45..88e3ec6e1d96 100644 --- a/arch/powerpc/kernel/iommu.c +++ b/arch/powerpc/kernel/iommu.c @@ -1088,6 +1088,14 @@ int iommu_take_ownership(struct iommu_table *tbl)  	memset(tbl->it_map, 0xff, sz);  	iommu_clear_tces_and_put_pages(tbl, tbl->it_offset, tbl->it_size); +	/* +	 * Disable iommu bypass, otherwise the user can DMA to all of +	 * our physical memory via the bypass window instead of just +	 * the pages that has been explicitly mapped into the iommu +	 */ +	if (tbl->set_bypass) +		tbl->set_bypass(tbl, false); +  	return 0;  }  EXPORT_SYMBOL_GPL(iommu_take_ownership); @@ -1102,6 +1110,10 @@ void iommu_release_ownership(struct iommu_table *tbl)  	/* Restore bit#0 set by iommu_init_table() */  	if (tbl->it_offset == 0)  		set_bit(0, tbl->it_map); + +	/* The kernel owns the device now, we can restore the iommu bypass */ +	if (tbl->set_bypass) +		tbl->set_bypass(tbl, true);  }  EXPORT_SYMBOL_GPL(iommu_release_ownership);  | 
