aboutsummaryrefslogtreecommitdiffstats
path: root/arch/powerpc/platforms/pseries/iommu.c
diff options
context:
space:
mode:
authorNishanth Aravamudan <nacc@linux.vnet.ibm.com>2013-01-18 04:17:36 -0500
committerBenjamin Herrenschmidt <benh@kernel.crashing.org>2013-01-28 19:35:09 -0500
commit71cf1def1ad8384d5fa008f96de94b36668e5460 (patch)
treead20be4201314d8534b616a745ed1621364023ff /arch/powerpc/platforms/pseries/iommu.c
parent22b382985a2e213e4ea0b4e436df24ab7228961d (diff)
pseries/iommu: Ensure TCEs are cleared with non-huge DDW
There are now two kinds of DMA windows that might be presented by PowerVM DDW support -- huge windows (that can map all of system memory regardless of the LPAR configuration) and non-huge windows (which can't). They are implemented slightly differently in PowerVM, and thus have different characteristics. The most obvious is that slot isolate doesn't clear the TCEs/window for us with non-huge windows. Thus, when a DLPAR operation occurs on a slot using a non-huge window, TCEs are still present (the notifier chain doesn't currently remove them explicitly) and the DLPAR fails. Fix this by calling remove_ddw() first, which will unmap the DDW TCEs. Note: a corresponding change to drmgr is needed to actually successfully DLPAR, such that the device-tree update (which causes the notifier chain to fire) occurs before slot isolate. Signed-off-by: Nishanth Aravamudan <nacc@us.ibm.com> Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Diffstat (limited to 'arch/powerpc/platforms/pseries/iommu.c')
-rw-r--r--arch/powerpc/platforms/pseries/iommu.c11
1 files changed, 1 insertions, 10 deletions
diff --git a/arch/powerpc/platforms/pseries/iommu.c b/arch/powerpc/platforms/pseries/iommu.c
index a55b6858ceac..b4bb9e141149 100644
--- a/arch/powerpc/platforms/pseries/iommu.c
+++ b/arch/powerpc/platforms/pseries/iommu.c
@@ -1296,6 +1296,7 @@ static int iommu_reconfig_notifier(struct notifier_block *nb, unsigned long acti
1296 1296
1297 switch (action) { 1297 switch (action) {
1298 case OF_RECONFIG_DETACH_NODE: 1298 case OF_RECONFIG_DETACH_NODE:
1299 remove_ddw(np);
1299 if (pci && pci->iommu_table) 1300 if (pci && pci->iommu_table)
1300 iommu_free_table(pci->iommu_table, np->full_name); 1301 iommu_free_table(pci->iommu_table, np->full_name);
1301 1302
@@ -1308,16 +1309,6 @@ static int iommu_reconfig_notifier(struct notifier_block *nb, unsigned long acti
1308 } 1309 }
1309 } 1310 }
1310 spin_unlock(&direct_window_list_lock); 1311 spin_unlock(&direct_window_list_lock);
1311
1312 /*
1313 * Because the notifier runs after isolation of the
1314 * slot, we are guaranteed any DMA window has already
1315 * been revoked and the TCEs have been marked invalid,
1316 * so we don't need a call to remove_ddw(np). However,
1317 * if an additional notifier action is added before the
1318 * isolate call, we should update this code for
1319 * completeness with such a call.
1320 */
1321 break; 1312 break;
1322 default: 1313 default:
1323 err = NOTIFY_DONE; 1314 err = NOTIFY_DONE;