Use the pSeries_reconfig notifier chain for tearing down the iommu table when a device node is removed.
Signed-off-by: Nathan Lynch <[EMAIL PROTECTED]> Signed-off-by: Paul Mackerras <[EMAIL PROTECTED]> arch/ppc64/kernel/pSeries_iommu.c | 25 +++++++++++++++ arch/ppc64/kernel/pSeries_reconfig.c | 12 ------- 2 files changed, 25 insertions(+), 12 deletions(-) Index: linux-2.6.11-bk10/arch/ppc64/kernel/pSeries_iommu.c =================================================================== --- linux-2.6.11-bk10.orig/arch/ppc64/kernel/pSeries_iommu.c 2005-03-13 02:51:53.000000000 +0000 +++ linux-2.6.11-bk10/arch/ppc64/kernel/pSeries_iommu.c 2005-03-14 22:29:30.000000000 +0000 @@ -43,6 +43,7 @@ #include <asm/machdep.h> #include <asm/abs_addr.h> #include <asm/plpar_wrappers.h> +#include <asm/pSeries_reconfig.h> #include <asm/systemcfg.h> #include "pci.h" @@ -455,6 +456,28 @@ static void iommu_dev_setup_pSeries(stru } } +static int iommu_reconfig_notifier(struct notifier_block *nb, unsigned long action, void *node) +{ + int err = NOTIFY_OK; + struct device_node *np = node; + + switch (action) { + case PSERIES_RECONFIG_REMOVE: + if (np->iommu_table && + get_property(np, "ibm,dma-window", NULL)) + iommu_free_table(np); + break; + default: + err = NOTIFY_DONE; + break; + } + return err; +} + +static struct notifier_block iommu_reconfig_nb = { + .notifier_call = iommu_reconfig_notifier, +}; + static void iommu_bus_setup_null(struct pci_bus *b) { } static void iommu_dev_setup_null(struct pci_dev *d) { } @@ -487,6 +510,8 @@ void iommu_init_early_pSeries(void) ppc_md.iommu_dev_setup = iommu_dev_setup_pSeries; + pSeries_reconfig_notifier_register(&iommu_reconfig_nb); + pci_iommu_init(); } Index: linux-2.6.11-bk10/arch/ppc64/kernel/pSeries_reconfig.c =================================================================== --- linux-2.6.11-bk10.orig/arch/ppc64/kernel/pSeries_reconfig.c 2005-03-14 22:16:09.000000000 +0000 +++ linux-2.6.11-bk10/arch/ppc64/kernel/pSeries_reconfig.c 2005-03-14 22:29:30.000000000 +0000 @@ -164,16 +164,6 @@ out_err: return err; } -/* - * Prepare an OF node for removal from system - * XXX move this to pSeries_iommu.c - */ -static void of_cleanup_node(struct device_node *np) -{ - if (np->iommu_table && get_property(np, "ibm,dma-window", NULL)) - iommu_free_table(np); -} - static int pSeries_reconfig_remove_node(struct device_node *np) { struct device_node *parent, *child; @@ -187,8 +177,6 @@ static int pSeries_reconfig_remove_node( return -EBUSY; } - of_cleanup_node(np); - remove_node_proc_entries(np); notifier_call_chain(&pSeries_reconfig_chain, - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/