
From: Paul Mackerras <paulus@samba.org>

This patch is from John Rose <johnrose@austin.ibm.com>.

Upon DLPAR addition of a PCI Host Brige to a system with purely virtual I/O,
set pci_io_base as necessary.

Signed-off-by: John Rose <johnrose@austin.ibm.com>
Signed-off-by: Paul Mackerras <paulus@samba.org>
Signed-off-by: Andrew Morton <akpm@osdl.org>
---

 25-akpm/arch/ppc64/kernel/pSeries_pci.c |    4 +++-
 25-akpm/arch/ppc64/kernel/pci.c         |    6 +++++-
 25-akpm/arch/ppc64/kernel/pci.h         |    3 +--
 3 files changed, 9 insertions(+), 4 deletions(-)

diff -puN arch/ppc64/kernel/pci.c~ppc64-set-pci_io_base-dynamically-if-necessary arch/ppc64/kernel/pci.c
--- 25/arch/ppc64/kernel/pci.c~ppc64-set-pci_io_base-dynamically-if-necessary	2005-03-07 20:41:26.000000000 -0800
+++ 25-akpm/arch/ppc64/kernel/pci.c	2005-03-07 20:41:26.000000000 -0800
@@ -619,7 +619,8 @@ void __init pci_setup_phb_io(struct pci_
 	res->end += io_virt_offset;
 }
 
-void __devinit pci_setup_phb_io_dynamic(struct pci_controller *hose)
+void __devinit pci_setup_phb_io_dynamic(struct pci_controller *hose,
+					int primary)
 {
 	unsigned long size = hose->pci_io_size;
 	unsigned long io_virt_offset;
@@ -631,6 +632,9 @@ void __devinit pci_setup_phb_io_dynamic(
 		hose->global_number, hose->io_base_phys,
 		(unsigned long) hose->io_base_virt);
 
+	if (primary)
+		pci_io_base = (unsigned long)hose->io_base_virt;
+
 	io_virt_offset = (unsigned long)hose->io_base_virt - pci_io_base;
 	res = &hose->io_resource;
 	res->start += io_virt_offset;
diff -puN arch/ppc64/kernel/pci.h~ppc64-set-pci_io_base-dynamically-if-necessary arch/ppc64/kernel/pci.h
--- 25/arch/ppc64/kernel/pci.h~ppc64-set-pci_io_base-dynamically-if-necessary	2005-03-07 20:41:26.000000000 -0800
+++ 25-akpm/arch/ppc64/kernel/pci.h	2005-03-07 20:41:26.000000000 -0800
@@ -16,8 +16,7 @@ extern unsigned long isa_io_base;
 
 extern void pci_setup_pci_controller(struct pci_controller *hose);
 extern void pci_setup_phb_io(struct pci_controller *hose, int primary);
-
-extern void pci_setup_phb_io_dynamic(struct pci_controller *hose);
+extern void pci_setup_phb_io_dynamic(struct pci_controller *hose, int primary);
 
 
 extern struct list_head hose_list;
diff -puN arch/ppc64/kernel/pSeries_pci.c~ppc64-set-pci_io_base-dynamically-if-necessary arch/ppc64/kernel/pSeries_pci.c
--- 25/arch/ppc64/kernel/pSeries_pci.c~ppc64-set-pci_io_base-dynamically-if-necessary	2005-03-07 20:41:26.000000000 -0800
+++ 25-akpm/arch/ppc64/kernel/pSeries_pci.c	2005-03-07 20:41:26.000000000 -0800
@@ -424,16 +424,18 @@ struct pci_controller * __devinit init_p
 	unsigned int root_size_cells = 0;
 	struct pci_controller *phb;
 	struct pci_bus *bus;
+	int primary;
 
 	root_size_cells = prom_n_size_cells(root);
 
+	primary = list_empty(&hose_list);
 	phb = alloc_phb_dynamic(dn, root_size_cells);
 	if (!phb)
 		return NULL;
 
 	pci_process_bridge_OF_ranges(phb, dn);
 
-	pci_setup_phb_io_dynamic(phb);
+	pci_setup_phb_io_dynamic(phb, primary);
 	of_node_put(root);
 
 	pci_devs_phb_init_dynamic(phb);
_
