Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 330296
b: refs/heads/master
c: f8f7d63
h: refs/heads/master
v: v3
  • Loading branch information
Gavin Shan authored and Benjamin Herrenschmidt committed Sep 9, 2012
1 parent d18d2e1 commit d50f468
Show file tree
Hide file tree
Showing 7 changed files with 29 additions and 33 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: d7bb88629dd64242fbbd7dd34ecad073afdbafad
refs/heads/master: f8f7d63fd96ead101415a1302035137a866f8998
7 changes: 2 additions & 5 deletions trunk/arch/powerpc/include/asm/eeh.h
Original file line number Diff line number Diff line change
Expand Up @@ -196,7 +196,7 @@ int __init eeh_ops_register(struct eeh_ops *ops);
int __exit eeh_ops_unregister(const char *name);
unsigned long eeh_check_failure(const volatile void __iomem *token,
unsigned long val);
int eeh_dn_check_failure(struct device_node *dn, struct pci_dev *dev);
int eeh_dev_check_failure(struct eeh_dev *edev);
void __init pci_addr_cache_build(void);
void eeh_add_device_tree_early(struct device_node *);
void eeh_add_device_tree_late(struct pci_bus *);
Expand Down Expand Up @@ -231,10 +231,7 @@ static inline unsigned long eeh_check_failure(const volatile void __iomem *token
return val;
}

static inline int eeh_dn_check_failure(struct device_node *dn, struct pci_dev *dev)
{
return 0;
}
#define eeh_dev_check_failure(x) (0)

static inline void pci_addr_cache_build(void) { }

Expand Down
2 changes: 2 additions & 0 deletions trunk/arch/powerpc/include/asm/pci-bridge.h
Original file line number Diff line number Diff line change
Expand Up @@ -184,6 +184,8 @@ static inline struct eeh_dev *of_node_to_eeh_dev(struct device_node *dn)
{
return PCI_DN(dn)->edev;
}
#else
#define of_node_to_eeh_dev(x) (NULL)
#endif

/** Find the bus corresponding to the indicated device node */
Expand Down
2 changes: 1 addition & 1 deletion trunk/arch/powerpc/include/asm/ppc-pci.h
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ extern int rtas_setup_phb(struct pci_controller *phb);
void pci_addr_cache_build(void);
void pci_addr_cache_insert_device(struct pci_dev *dev);
void pci_addr_cache_remove_device(struct pci_dev *dev);
struct pci_dev *pci_addr_cache_get_device(unsigned long addr);
struct eeh_dev *pci_addr_cache_get_device(unsigned long addr);
void eeh_slot_error_detail(struct eeh_pe *pe, int severity);
int eeh_pci_enable(struct eeh_pe *pe, int function);
int eeh_reset_pe(struct eeh_pe *);
Expand Down
2 changes: 1 addition & 1 deletion trunk/arch/powerpc/kernel/rtas_pci.c
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ int rtas_read_config(struct pci_dn *pdn, int where, int size, u32 *val)
return PCIBIOS_DEVICE_NOT_FOUND;

if (returnval == EEH_IO_ERROR_VALUE(size) &&
eeh_dn_check_failure (pdn->node, NULL))
eeh_dev_check_failure(of_node_to_eeh_dev(pdn->node)))
return PCIBIOS_DEVICE_NOT_FOUND;

return PCIBIOS_SUCCESSFUL;
Expand Down
33 changes: 14 additions & 19 deletions trunk/arch/powerpc/platforms/pseries/eeh.c
Original file line number Diff line number Diff line change
Expand Up @@ -270,9 +270,8 @@ static inline unsigned long eeh_token_to_phys(unsigned long token)
}

/**
* eeh_dn_check_failure - Check if all 1's data is due to EEH slot freeze
* @dn: device node
* @dev: pci device, if known
* eeh_dev_check_failure - Check if all 1's data is due to EEH slot freeze
* @edev: eeh device
*
* Check for an EEH failure for the given device node. Call this
* routine if the result of a read was all 0xff's and you want to
Expand All @@ -284,12 +283,13 @@ static inline unsigned long eeh_token_to_phys(unsigned long token)
*
* It is safe to call this routine in an interrupt context.
*/
int eeh_dn_check_failure(struct device_node *dn, struct pci_dev *dev)
int eeh_dev_check_failure(struct eeh_dev *edev)
{
int ret;
unsigned long flags;
struct device_node *dn;
struct pci_dev *dev;
struct eeh_pe *pe;
struct eeh_dev *edev;
int rc = 0;
const char *location;

Expand All @@ -298,15 +298,12 @@ int eeh_dn_check_failure(struct device_node *dn, struct pci_dev *dev)
if (!eeh_subsystem_enabled)
return 0;

if (dn) {
edev = of_node_to_eeh_dev(dn);
} else if (dev) {
edev = pci_dev_to_eeh_dev(dev);
dn = pci_device_to_OF_node(dev);
} else {
if (!edev) {
eeh_stats.no_dn++;
return 0;
}
dn = eeh_dev_to_of_node(edev);
dev = eeh_dev_to_pci_dev(edev);
pe = edev->pe;

/* Access to IO BARs might get this far and still not want checking. */
Expand Down Expand Up @@ -393,7 +390,7 @@ int eeh_dn_check_failure(struct device_node *dn, struct pci_dev *dev)
return rc;
}

EXPORT_SYMBOL_GPL(eeh_dn_check_failure);
EXPORT_SYMBOL_GPL(eeh_dev_check_failure);

/**
* eeh_check_failure - Check if all 1's data is due to EEH slot freeze
Expand All @@ -410,21 +407,19 @@ EXPORT_SYMBOL_GPL(eeh_dn_check_failure);
unsigned long eeh_check_failure(const volatile void __iomem *token, unsigned long val)
{
unsigned long addr;
struct pci_dev *dev;
struct device_node *dn;
struct eeh_dev *edev;

/* Finding the phys addr + pci device; this is pretty quick. */
addr = eeh_token_to_phys((unsigned long __force) token);
dev = pci_addr_cache_get_device(addr);
if (!dev) {
edev = pci_addr_cache_get_device(addr);
if (!edev) {
eeh_stats.no_device++;
return val;
}

dn = pci_device_to_OF_node(dev);
eeh_dn_check_failure(dn, dev);
eeh_dev_check_failure(edev);

pci_dev_put(dev);
pci_dev_put(eeh_dev_to_pci_dev(edev));
return val;
}

Expand Down
14 changes: 8 additions & 6 deletions trunk/arch/powerpc/platforms/pseries/eeh_cache.c
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ struct pci_io_addr_range {
struct rb_node rb_node;
unsigned long addr_lo;
unsigned long addr_hi;
struct eeh_dev *edev;
struct pci_dev *pcidev;
unsigned int flags;
};
Expand All @@ -59,7 +60,7 @@ static struct pci_io_addr_cache {
spinlock_t piar_lock;
} pci_io_addr_cache_root;

static inline struct pci_dev *__pci_addr_cache_get_device(unsigned long addr)
static inline struct eeh_dev *__pci_addr_cache_get_device(unsigned long addr)
{
struct rb_node *n = pci_io_addr_cache_root.rb_root.rb_node;

Expand All @@ -74,7 +75,7 @@ static inline struct pci_dev *__pci_addr_cache_get_device(unsigned long addr)
n = n->rb_right;
} else {
pci_dev_get(piar->pcidev);
return piar->pcidev;
return piar->edev;
}
}
}
Expand All @@ -92,15 +93,15 @@ static inline struct pci_dev *__pci_addr_cache_get_device(unsigned long addr)
* from zero (that is, they do *not* have pci_io_addr added in).
* It is safe to call this function within an interrupt.
*/
struct pci_dev *pci_addr_cache_get_device(unsigned long addr)
struct eeh_dev *pci_addr_cache_get_device(unsigned long addr)
{
struct pci_dev *dev;
struct eeh_dev *edev;
unsigned long flags;

spin_lock_irqsave(&pci_io_addr_cache_root.piar_lock, flags);
dev = __pci_addr_cache_get_device(addr);
edev = __pci_addr_cache_get_device(addr);
spin_unlock_irqrestore(&pci_io_addr_cache_root.piar_lock, flags);
return dev;
return edev;
}

#ifdef DEBUG
Expand Down Expand Up @@ -158,6 +159,7 @@ pci_addr_cache_insert(struct pci_dev *dev, unsigned long alo,
pci_dev_get(dev);
piar->addr_lo = alo;
piar->addr_hi = ahi;
piar->edev = pci_dev_to_eeh_dev(dev);
piar->pcidev = dev;
piar->flags = flags;

Expand Down

0 comments on commit d50f468

Please sign in to comment.