[PATCH 5/8] pci_dn.c: use pSeries reconfig notifier

Nathan Lynch ntl at pobox.com
Thu Mar 10 11:51:57 EST 2005


Use the pSeries_reconfig notifier list to handle newly added pci
device nodes.  Remove duplicated version of update_dn_pci_info from
prom.c.

Signed-off-by: Nathan Lynch <ntl at pobox.com>

 pci_dn.c |   22 ++++++++++++++++++++++
 prom.c   |   14 --------------
 2 files changed, 22 insertions(+), 14 deletions(-)

Index: linux-2.6.11-bk5/arch/ppc64/kernel/pci_dn.c
===================================================================
--- linux-2.6.11-bk5.orig/arch/ppc64/kernel/pci_dn.c	2005-03-09 20:01:32.000000000 +0000
+++ linux-2.6.11-bk5/arch/ppc64/kernel/pci_dn.c	2005-03-09 20:16:54.000000000 +0000
@@ -27,6 +27,7 @@
 #include <asm/io.h>
 #include <asm/prom.h>
 #include <asm/pci-bridge.h>
+#include <asm/pSeries_reconfig.h>
 
 #include "pci.h"
 
@@ -161,6 +162,25 @@ struct device_node *fetch_dev_dn(struct 
 }
 EXPORT_SYMBOL(fetch_dev_dn);
 
+static int pci_dn_reconfig_notifier(struct notifier_block *nb, unsigned long action, void *node)
+{
+	struct device_node *np = node;
+	int err = NOTIFY_OK;
+
+	switch (action) {
+	case PSERIES_RECONFIG_ADD:
+		update_dn_pci_info(np, np->parent->phb);
+		break;
+	default:
+		err = NOTIFY_DONE;
+		break;
+	}
+	return err;
+}
+
+static struct notifier_block pci_dn_reconfig_nb = {
+	.notifier_call = pci_dn_reconfig_notifier,
+};
 
 /*
  * Actually initialize the phbs.
@@ -173,4 +193,6 @@ void __init pci_devs_phb_init(void)
 	/* This must be done first so the device nodes have valid pci info! */
 	list_for_each_entry_safe(phb, tmp, &hose_list, list_node)
 		pci_devs_phb_init_dynamic(phb);
+
+	pSeries_reconfig_notifier_register(&pci_dn_reconfig_nb);
 }
Index: linux-2.6.11-bk5/arch/ppc64/kernel/prom.c
===================================================================
--- linux-2.6.11-bk5.orig/arch/ppc64/kernel/prom.c	2005-03-09 20:16:43.000000000 +0000
+++ linux-2.6.11-bk5/arch/ppc64/kernel/prom.c	2005-03-09 20:16:54.000000000 +0000
@@ -1583,7 +1583,6 @@ static int of_finish_dynamic_node(struct
 				  int unused3, int unused4)
 {
 	struct device_node *parent = of_get_parent(node);
-	u32 *regs;
 	int err = 0;
 	phandle *ibm_phandle;
 
@@ -1605,19 +1604,6 @@ static int of_finish_dynamic_node(struct
 	if ((ibm_phandle = (unsigned int *)get_property(node, "ibm,phandle", NULL)))
 		node->linux_phandle = *ibm_phandle;
 
-	/* now do the rough equivalent of update_dn_pci_info, this
-	 * probably is not correct for phb's, but should work for
-	 * IOAs and slots.
-	 */
-
-	node->phb = parent->phb;
-
-	regs = (u32 *)get_property(node, "reg", NULL);
-	if (regs) {
-		node->busno = (regs[0] >> 16) & 0xff;
-		node->devfn = (regs[0] >> 8) & 0xff;
-	}
-
 out:
 	of_node_put(parent);
 	return err;



More information about the Linuxppc64-dev mailing list