Commit b5463305 authored by Linus Torvalds's avatar Linus Torvalds
parents 7b14e3b5 56ec6462
...@@ -225,9 +225,9 @@ V_FUNCTION_BEGIN(__do_get_xsec) ...@@ -225,9 +225,9 @@ V_FUNCTION_BEGIN(__do_get_xsec)
.cfi_startproc .cfi_startproc
/* check for update count & load values */ /* check for update count & load values */
1: ld r8,CFG_TB_UPDATE_COUNT(r3) 1: ld r8,CFG_TB_UPDATE_COUNT(r3)
andi. r0,r4,1 /* pending update ? loop */ andi. r0,r8,1 /* pending update ? loop */
bne- 1b bne- 1b
xor r0,r4,r4 /* create dependency */ xor r0,r8,r8 /* create dependency */
add r3,r3,r0 add r3,r3,r0
/* Get TB & offset it */ /* Get TB & offset it */
......
...@@ -169,7 +169,7 @@ int htab_bolt_mapping(unsigned long vstart, unsigned long vend, ...@@ -169,7 +169,7 @@ int htab_bolt_mapping(unsigned long vstart, unsigned long vend,
#ifdef CONFIG_PPC_ISERIES #ifdef CONFIG_PPC_ISERIES
if (_machine == PLATFORM_ISERIES_LPAR) if (_machine == PLATFORM_ISERIES_LPAR)
ret = iSeries_hpte_insert(hpteg, va, ret = iSeries_hpte_insert(hpteg, va,
virt_to_abs(paddr), __pa(vaddr),
tmp_mode, tmp_mode,
HPTE_V_BOLTED, HPTE_V_BOLTED,
psize); psize);
......
...@@ -893,6 +893,20 @@ void eeh_add_device_tree_early(struct device_node *dn) ...@@ -893,6 +893,20 @@ void eeh_add_device_tree_early(struct device_node *dn)
} }
EXPORT_SYMBOL_GPL(eeh_add_device_tree_early); EXPORT_SYMBOL_GPL(eeh_add_device_tree_early);
void eeh_add_device_tree_late(struct pci_bus *bus)
{
struct pci_dev *dev;
list_for_each_entry(dev, &bus->devices, bus_list) {
eeh_add_device_late(dev);
if (dev->hdr_type == PCI_HEADER_TYPE_BRIDGE) {
struct pci_bus *subbus = dev->subordinate;
if (subbus)
eeh_add_device_tree_late(subbus);
}
}
}
/** /**
* eeh_add_device_late - perform EEH initialization for the indicated pci device * eeh_add_device_late - perform EEH initialization for the indicated pci device
* @dev: pci device for which to set up EEH * @dev: pci device for which to set up EEH
......
...@@ -37,7 +37,7 @@ ...@@ -37,7 +37,7 @@
static inline const char * pcid_name (struct pci_dev *pdev) static inline const char * pcid_name (struct pci_dev *pdev)
{ {
if (pdev->dev.driver) if (pdev && pdev->dev.driver)
return pdev->dev.driver->name; return pdev->dev.driver->name;
return ""; return "";
} }
......
...@@ -106,6 +106,8 @@ pcibios_fixup_new_pci_devices(struct pci_bus *bus, int fix_bus) ...@@ -106,6 +106,8 @@ pcibios_fixup_new_pci_devices(struct pci_bus *bus, int fix_bus)
} }
} }
} }
eeh_add_device_tree_late(bus);
} }
EXPORT_SYMBOL_GPL(pcibios_fixup_new_pci_devices); EXPORT_SYMBOL_GPL(pcibios_fixup_new_pci_devices);
...@@ -114,7 +116,6 @@ pcibios_pci_config_bridge(struct pci_dev *dev) ...@@ -114,7 +116,6 @@ pcibios_pci_config_bridge(struct pci_dev *dev)
{ {
u8 sec_busno; u8 sec_busno;
struct pci_bus *child_bus; struct pci_bus *child_bus;
struct pci_dev *child_dev;
/* Get busno of downstream bus */ /* Get busno of downstream bus */
pci_read_config_byte(dev, PCI_SECONDARY_BUS, &sec_busno); pci_read_config_byte(dev, PCI_SECONDARY_BUS, &sec_busno);
...@@ -129,10 +130,6 @@ pcibios_pci_config_bridge(struct pci_dev *dev) ...@@ -129,10 +130,6 @@ pcibios_pci_config_bridge(struct pci_dev *dev)
pci_scan_child_bus(child_bus); pci_scan_child_bus(child_bus);
list_for_each_entry(child_dev, &child_bus->devices, bus_list) {
eeh_add_device_late(child_dev);
}
/* Fixup new pci devices without touching bus struct */ /* Fixup new pci devices without touching bus struct */
pcibios_fixup_new_pci_devices(child_bus, 0); pcibios_fixup_new_pci_devices(child_bus, 0);
...@@ -160,18 +157,25 @@ pcibios_add_pci_devices(struct pci_bus * bus) ...@@ -160,18 +157,25 @@ pcibios_add_pci_devices(struct pci_bus * bus)
eeh_add_device_tree_early(dn); eeh_add_device_tree_early(dn);
/* pci_scan_slot should find all children */ if (_machine == PLATFORM_PSERIES_LPAR) {
slotno = PCI_SLOT(PCI_DN(dn->child)->devfn); /* use ofdt-based probe */
num = pci_scan_slot(bus, PCI_DEVFN(slotno, 0)); of_scan_bus(dn, bus);
if (num) { if (!list_empty(&bus->devices)) {
pcibios_fixup_new_pci_devices(bus, 1); pcibios_fixup_new_pci_devices(bus, 0);
pci_bus_add_devices(bus); pci_bus_add_devices(bus);
} }
} else {
/* use legacy probe */
slotno = PCI_SLOT(PCI_DN(dn->child)->devfn);
num = pci_scan_slot(bus, PCI_DEVFN(slotno, 0));
if (num) {
pcibios_fixup_new_pci_devices(bus, 1);
pci_bus_add_devices(bus);
}
list_for_each_entry(dev, &bus->devices, bus_list) { list_for_each_entry(dev, &bus->devices, bus_list)
eeh_add_device_late (dev); if (dev->hdr_type == PCI_HEADER_TYPE_BRIDGE)
if (dev->hdr_type == PCI_HEADER_TYPE_BRIDGE) pcibios_pci_config_bridge(dev);
pcibios_pci_config_bridge(dev);
} }
} }
EXPORT_SYMBOL_GPL(pcibios_add_pci_devices); EXPORT_SYMBOL_GPL(pcibios_add_pci_devices);
...@@ -27,6 +27,7 @@ ...@@ -27,6 +27,7 @@
#include <linux/string.h> #include <linux/string.h>
struct pci_dev; struct pci_dev;
struct pci_bus;
struct device_node; struct device_node;
#ifdef CONFIG_EEH #ifdef CONFIG_EEH
...@@ -61,7 +62,7 @@ void __init pci_addr_cache_build(void); ...@@ -61,7 +62,7 @@ void __init pci_addr_cache_build(void);
*/ */
void eeh_add_device_early(struct device_node *); void eeh_add_device_early(struct device_node *);
void eeh_add_device_tree_early(struct device_node *); void eeh_add_device_tree_early(struct device_node *);
void eeh_add_device_late(struct pci_dev *); void eeh_add_device_tree_late(struct pci_bus *);
/** /**
* eeh_remove_device - undo EEH setup for the indicated pci device * eeh_remove_device - undo EEH setup for the indicated pci device
...@@ -116,12 +117,12 @@ static inline void pci_addr_cache_build(void) { } ...@@ -116,12 +117,12 @@ static inline void pci_addr_cache_build(void) { }
static inline void eeh_add_device_early(struct device_node *dn) { } static inline void eeh_add_device_early(struct device_node *dn) { }
static inline void eeh_add_device_late(struct pci_dev *dev) { }
static inline void eeh_remove_device(struct pci_dev *dev) { } static inline void eeh_remove_device(struct pci_dev *dev) { }
static inline void eeh_add_device_tree_early(struct device_node *dn) { } static inline void eeh_add_device_tree_early(struct device_node *dn) { }
static inline void eeh_add_device_tree_late(struct pci_bus *bus) { }
static inline void eeh_remove_bus_device(struct pci_dev *dev) { } static inline void eeh_remove_bus_device(struct pci_dev *dev) { }
#define EEH_POSSIBLE_ERROR(val, type) (0) #define EEH_POSSIBLE_ERROR(val, type) (0)
#define EEH_IO_ERROR_VALUE(size) (-1UL) #define EEH_IO_ERROR_VALUE(size) (-1UL)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment