Loading arch/powerpc/include/asm/device.h +3 −0 Original line number Diff line number Diff line Loading @@ -31,6 +31,9 @@ struct dev_archdata { #ifdef CONFIG_SWIOTLB dma_addr_t max_direct_dma_addr; #endif #ifdef CONFIG_EEH struct eeh_dev *edev; #endif }; struct pdev_archdata { Loading arch/powerpc/include/asm/eeh.h +106 −28 Original line number Diff line number Diff line /* * eeh.h * Copyright (C) 2001 Dave Engebretsen & Todd Inglett IBM Corporation. * Copyright 2001-2012 IBM Corporation. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by Loading Loading @@ -31,44 +31,105 @@ struct device_node; #ifdef CONFIG_EEH extern int eeh_subsystem_enabled; /* * The struct is used to trace EEH state for the associated * PCI device node or PCI device. In future, it might * represent PE as well so that the EEH device to form * another tree except the currently existing tree of PCI * buses and PCI devices */ #define EEH_MODE_SUPPORTED (1<<0) /* EEH supported on the device */ #define EEH_MODE_NOCHECK (1<<1) /* EEH check should be skipped */ #define EEH_MODE_ISOLATED (1<<2) /* The device has been isolated */ #define EEH_MODE_RECOVERING (1<<3) /* Recovering the device */ #define EEH_MODE_IRQ_DISABLED (1<<4) /* Interrupt disabled */ struct eeh_dev { int mode; /* EEH mode */ int class_code; /* Class code of the device */ int config_addr; /* Config address */ int pe_config_addr; /* PE config address */ int check_count; /* Times of ignored error */ int freeze_count; /* Times of froze up */ int false_positives; /* Times of reported #ff's */ u32 config_space[16]; /* Saved PCI config space */ struct pci_controller *phb; /* Associated PHB */ struct device_node *dn; /* Associated device node */ struct pci_dev *pdev; /* Associated PCI device */ }; static inline struct device_node *eeh_dev_to_of_node(struct eeh_dev *edev) { return edev->dn; } static inline struct pci_dev *eeh_dev_to_pci_dev(struct eeh_dev *edev) { return edev->pdev; } /* Values for eeh_mode bits in device_node */ #define EEH_MODE_SUPPORTED (1<<0) #define EEH_MODE_NOCHECK (1<<1) #define EEH_MODE_ISOLATED (1<<2) #define EEH_MODE_RECOVERING (1<<3) #define EEH_MODE_IRQ_DISABLED (1<<4) /* * The struct is used to trace the registered EEH operation * callback functions. Actually, those operation callback * functions are heavily platform dependent. That means the * platform should register its own EEH operation callback * functions before any EEH further operations. */ #define EEH_OPT_DISABLE 0 /* EEH disable */ #define EEH_OPT_ENABLE 1 /* EEH enable */ #define EEH_OPT_THAW_MMIO 2 /* MMIO enable */ #define EEH_OPT_THAW_DMA 3 /* DMA enable */ #define EEH_STATE_UNAVAILABLE (1 << 0) /* State unavailable */ #define EEH_STATE_NOT_SUPPORT (1 << 1) /* EEH not supported */ #define EEH_STATE_RESET_ACTIVE (1 << 2) /* Active reset */ #define EEH_STATE_MMIO_ACTIVE (1 << 3) /* Active MMIO */ #define EEH_STATE_DMA_ACTIVE (1 << 4) /* Active DMA */ #define EEH_STATE_MMIO_ENABLED (1 << 5) /* MMIO enabled */ #define EEH_STATE_DMA_ENABLED (1 << 6) /* DMA enabled */ #define EEH_RESET_DEACTIVATE 0 /* Deactivate the PE reset */ #define EEH_RESET_HOT 1 /* Hot reset */ #define EEH_RESET_FUNDAMENTAL 3 /* Fundamental reset */ #define EEH_LOG_TEMP 1 /* EEH temporary error log */ #define EEH_LOG_PERM 2 /* EEH permanent error log */ struct eeh_ops { char *name; int (*init)(void); int (*set_option)(struct device_node *dn, int option); int (*get_pe_addr)(struct device_node *dn); int (*get_state)(struct device_node *dn, int *state); int (*reset)(struct device_node *dn, int option); int (*wait_state)(struct device_node *dn, int max_wait); int (*get_log)(struct device_node *dn, int severity, char *drv_log, unsigned long len); int (*configure_bridge)(struct device_node *dn); int (*read_config)(struct device_node *dn, int where, int size, u32 *val); int (*write_config)(struct device_node *dn, int where, int size, u32 val); }; extern struct eeh_ops *eeh_ops; extern int eeh_subsystem_enabled; /* Max number of EEH freezes allowed before we consider the device * to be permanently disabled. */ /* * Max number of EEH freezes allowed before we consider the device * to be permanently disabled. */ #define EEH_MAX_ALLOWED_FREEZES 5 void * __devinit eeh_dev_init(struct device_node *dn, void *data); void __devinit eeh_dev_phb_init_dynamic(struct pci_controller *phb); void __init eeh_dev_phb_init(void); void __init eeh_init(void); #ifdef CONFIG_PPC_PSERIES int __init eeh_pseries_init(void); #endif 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); void __init pci_addr_cache_build(void); /** * eeh_add_device_early * eeh_add_device_late * * Perform eeh initialization for devices added after boot. * Call eeh_add_device_early before doing any i/o to the * device (including config space i/o). Call eeh_add_device_late * to finish the eeh setup for this device. */ void eeh_add_device_tree_early(struct device_node *); void eeh_add_device_tree_late(struct pci_bus *); /** * eeh_remove_device_recursive - undo EEH for device & children. * @dev: pci device to be removed * * As above, this removes the device; it also removes child * pci devices as well. */ void eeh_remove_bus_device(struct pci_dev *); /** Loading @@ -87,8 +148,25 @@ void eeh_remove_bus_device(struct pci_dev *); #define EEH_IO_ERROR_VALUE(size) (~0U >> ((4 - (size)) * 8)) #else /* !CONFIG_EEH */ static inline void *eeh_dev_init(struct device_node *dn, void *data) { return NULL; } static inline void eeh_dev_phb_init_dynamic(struct pci_controller *phb) { } static inline void eeh_dev_phb_init(void) { } static inline void eeh_init(void) { } #ifdef CONFIG_PPC_PSERIES static inline int eeh_pseries_init(void) { return 0; } #endif /* CONFIG_PPC_PSERIES */ static inline unsigned long eeh_check_failure(const volatile void __iomem *token, unsigned long val) { return val; Loading arch/powerpc/include/asm/eeh_event.h +9 −24 Original line number Diff line number Diff line /* * eeh_event.h * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or Loading @@ -22,32 +20,19 @@ #define ASM_POWERPC_EEH_EVENT_H #ifdef __KERNEL__ /** EEH event -- structure holding pci controller data that describes * a change in the isolation status of a PCI slot. A pointer * to this struct is passed as the data pointer in a notify callback. /* * structure holding pci controller data that describes a * change in the isolation status of a PCI slot. A pointer * to this struct is passed as the data pointer in a notify * callback. */ struct eeh_event { struct list_head list; struct device_node *dn; /* struct device node */ struct pci_dev *dev; /* affected device */ struct list_head list; /* to form event queue */ struct eeh_dev *edev; /* EEH device */ }; /** * eeh_send_failure_event - generate a PCI error event * @dev pci device * * This routine builds a PCI error event which will be delivered * to all listeners on the eeh_notifier_chain. * * This routine can be called within an interrupt context; * the actual event will be delivered in a normal context * (from a workqueue). */ int eeh_send_failure_event (struct device_node *dn, struct pci_dev *dev); /* Main recovery function */ struct pci_dn * handle_eeh_events (struct eeh_event *); int eeh_send_failure_event(struct eeh_dev *edev); struct eeh_dev *handle_eeh_events(struct eeh_event *); #endif /* __KERNEL__ */ #endif /* ASM_POWERPC_EEH_EVENT_H */ arch/powerpc/include/asm/ppc-pci.h +9 −80 Original line number Diff line number Diff line Loading @@ -47,92 +47,21 @@ extern int rtas_setup_phb(struct pci_controller *phb); extern unsigned long pci_probe_only; /* ---- EEH internal-use-only related routines ---- */ #ifdef CONFIG_EEH 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); void pci_addr_cache_build(void); struct pci_dev *pci_get_device_by_addr(unsigned long addr); /** * eeh_slot_error_detail -- record and EEH error condition to the log * @pdn: pci device node * @severity: EEH_LOG_TEMP_FAILURE or EEH_LOG_PERM_FAILURE * * Obtains the EEH error details from the RTAS subsystem, * and then logs these details with the RTAS error log system. */ #define EEH_LOG_TEMP_FAILURE 1 #define EEH_LOG_PERM_FAILURE 2 void eeh_slot_error_detail (struct pci_dn *pdn, int severity); /** * rtas_pci_enable - enable IO transfers for this slot * @pdn: pci device node * @function: either EEH_THAW_MMIO or EEH_THAW_DMA * * Enable I/O transfers to this slot */ #define EEH_THAW_MMIO 2 #define EEH_THAW_DMA 3 int rtas_pci_enable(struct pci_dn *pdn, int function); /** * rtas_set_slot_reset -- unfreeze a frozen slot * @pdn: pci device node * * Clear the EEH-frozen condition on a slot. This routine * does this by asserting the PCI #RST line for 1/8th of * a second; this routine will sleep while the adapter is * being reset. * * Returns a non-zero value if the reset failed. */ int rtas_set_slot_reset (struct pci_dn *); int eeh_wait_for_slot_status(struct pci_dn *pdn, int max_wait_msecs); /** * eeh_restore_bars - Restore device configuration info. * @pdn: pci device node * * A reset of a PCI device will clear out its config space. * This routines will restore the config space for this * device, and is children, to values previously obtained * from the firmware. */ void eeh_restore_bars(struct pci_dn *); /** * rtas_configure_bridge -- firmware initialization of pci bridge * @pdn: pci device node * * Ask the firmware to configure all PCI bridges devices * located behind the indicated node. Required after a * pci device reset. Does essentially the same hing as * eeh_restore_bars, but for brdges, and lets firmware * do the work. */ void rtas_configure_bridge(struct pci_dn *); struct pci_dev *pci_addr_cache_get_device(unsigned long addr); void eeh_slot_error_detail(struct eeh_dev *edev, int severity); int eeh_pci_enable(struct eeh_dev *edev, int function); int eeh_reset_pe(struct eeh_dev *); void eeh_restore_bars(struct eeh_dev *); int rtas_write_config(struct pci_dn *, int where, int size, u32 val); int rtas_read_config(struct pci_dn *, int where, int size, u32 *val); /** * eeh_mark_slot -- set mode flags for pertition endpoint * @pdn: pci device node * * mark and clear slots: find "partition endpoint" PE and set or * clear the flags for each subnode of the PE. */ void eeh_mark_slot(struct device_node *dn, int mode_flag); void eeh_clear_slot(struct device_node *dn, int mode_flag); /** * find_device_pe -- Find the associated "Partiationable Endpoint" PE * @pdn: pci device node */ struct device_node * find_device_pe(struct device_node *dn); struct device_node *eeh_find_device_pe(struct device_node *dn); void eeh_sysfs_add_device(struct pci_dev *pdev); void eeh_sysfs_remove_device(struct pci_dev *pdev); Loading arch/powerpc/kernel/of_platform.c +5 −1 Original line number Diff line number Diff line Loading @@ -21,12 +21,13 @@ #include <linux/of.h> #include <linux/of_device.h> #include <linux/of_platform.h> #include <linux/atomic.h> #include <asm/errno.h> #include <asm/topology.h> #include <asm/pci-bridge.h> #include <asm/ppc-pci.h> #include <linux/atomic.h> #include <asm/eeh.h> #ifdef CONFIG_PPC_OF_PLATFORM_PCI Loading Loading @@ -66,6 +67,9 @@ static int __devinit of_pci_phb_probe(struct platform_device *dev) /* Init pci_dn data structures */ pci_devs_phb_init_dynamic(phb); /* Create EEH devices for the PHB */ eeh_dev_phb_init_dynamic(phb); /* Register devices with EEH */ #ifdef CONFIG_EEH if (dev->dev.of_node->child) Loading Loading
arch/powerpc/include/asm/device.h +3 −0 Original line number Diff line number Diff line Loading @@ -31,6 +31,9 @@ struct dev_archdata { #ifdef CONFIG_SWIOTLB dma_addr_t max_direct_dma_addr; #endif #ifdef CONFIG_EEH struct eeh_dev *edev; #endif }; struct pdev_archdata { Loading
arch/powerpc/include/asm/eeh.h +106 −28 Original line number Diff line number Diff line /* * eeh.h * Copyright (C) 2001 Dave Engebretsen & Todd Inglett IBM Corporation. * Copyright 2001-2012 IBM Corporation. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by Loading Loading @@ -31,44 +31,105 @@ struct device_node; #ifdef CONFIG_EEH extern int eeh_subsystem_enabled; /* * The struct is used to trace EEH state for the associated * PCI device node or PCI device. In future, it might * represent PE as well so that the EEH device to form * another tree except the currently existing tree of PCI * buses and PCI devices */ #define EEH_MODE_SUPPORTED (1<<0) /* EEH supported on the device */ #define EEH_MODE_NOCHECK (1<<1) /* EEH check should be skipped */ #define EEH_MODE_ISOLATED (1<<2) /* The device has been isolated */ #define EEH_MODE_RECOVERING (1<<3) /* Recovering the device */ #define EEH_MODE_IRQ_DISABLED (1<<4) /* Interrupt disabled */ struct eeh_dev { int mode; /* EEH mode */ int class_code; /* Class code of the device */ int config_addr; /* Config address */ int pe_config_addr; /* PE config address */ int check_count; /* Times of ignored error */ int freeze_count; /* Times of froze up */ int false_positives; /* Times of reported #ff's */ u32 config_space[16]; /* Saved PCI config space */ struct pci_controller *phb; /* Associated PHB */ struct device_node *dn; /* Associated device node */ struct pci_dev *pdev; /* Associated PCI device */ }; static inline struct device_node *eeh_dev_to_of_node(struct eeh_dev *edev) { return edev->dn; } static inline struct pci_dev *eeh_dev_to_pci_dev(struct eeh_dev *edev) { return edev->pdev; } /* Values for eeh_mode bits in device_node */ #define EEH_MODE_SUPPORTED (1<<0) #define EEH_MODE_NOCHECK (1<<1) #define EEH_MODE_ISOLATED (1<<2) #define EEH_MODE_RECOVERING (1<<3) #define EEH_MODE_IRQ_DISABLED (1<<4) /* * The struct is used to trace the registered EEH operation * callback functions. Actually, those operation callback * functions are heavily platform dependent. That means the * platform should register its own EEH operation callback * functions before any EEH further operations. */ #define EEH_OPT_DISABLE 0 /* EEH disable */ #define EEH_OPT_ENABLE 1 /* EEH enable */ #define EEH_OPT_THAW_MMIO 2 /* MMIO enable */ #define EEH_OPT_THAW_DMA 3 /* DMA enable */ #define EEH_STATE_UNAVAILABLE (1 << 0) /* State unavailable */ #define EEH_STATE_NOT_SUPPORT (1 << 1) /* EEH not supported */ #define EEH_STATE_RESET_ACTIVE (1 << 2) /* Active reset */ #define EEH_STATE_MMIO_ACTIVE (1 << 3) /* Active MMIO */ #define EEH_STATE_DMA_ACTIVE (1 << 4) /* Active DMA */ #define EEH_STATE_MMIO_ENABLED (1 << 5) /* MMIO enabled */ #define EEH_STATE_DMA_ENABLED (1 << 6) /* DMA enabled */ #define EEH_RESET_DEACTIVATE 0 /* Deactivate the PE reset */ #define EEH_RESET_HOT 1 /* Hot reset */ #define EEH_RESET_FUNDAMENTAL 3 /* Fundamental reset */ #define EEH_LOG_TEMP 1 /* EEH temporary error log */ #define EEH_LOG_PERM 2 /* EEH permanent error log */ struct eeh_ops { char *name; int (*init)(void); int (*set_option)(struct device_node *dn, int option); int (*get_pe_addr)(struct device_node *dn); int (*get_state)(struct device_node *dn, int *state); int (*reset)(struct device_node *dn, int option); int (*wait_state)(struct device_node *dn, int max_wait); int (*get_log)(struct device_node *dn, int severity, char *drv_log, unsigned long len); int (*configure_bridge)(struct device_node *dn); int (*read_config)(struct device_node *dn, int where, int size, u32 *val); int (*write_config)(struct device_node *dn, int where, int size, u32 val); }; extern struct eeh_ops *eeh_ops; extern int eeh_subsystem_enabled; /* Max number of EEH freezes allowed before we consider the device * to be permanently disabled. */ /* * Max number of EEH freezes allowed before we consider the device * to be permanently disabled. */ #define EEH_MAX_ALLOWED_FREEZES 5 void * __devinit eeh_dev_init(struct device_node *dn, void *data); void __devinit eeh_dev_phb_init_dynamic(struct pci_controller *phb); void __init eeh_dev_phb_init(void); void __init eeh_init(void); #ifdef CONFIG_PPC_PSERIES int __init eeh_pseries_init(void); #endif 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); void __init pci_addr_cache_build(void); /** * eeh_add_device_early * eeh_add_device_late * * Perform eeh initialization for devices added after boot. * Call eeh_add_device_early before doing any i/o to the * device (including config space i/o). Call eeh_add_device_late * to finish the eeh setup for this device. */ void eeh_add_device_tree_early(struct device_node *); void eeh_add_device_tree_late(struct pci_bus *); /** * eeh_remove_device_recursive - undo EEH for device & children. * @dev: pci device to be removed * * As above, this removes the device; it also removes child * pci devices as well. */ void eeh_remove_bus_device(struct pci_dev *); /** Loading @@ -87,8 +148,25 @@ void eeh_remove_bus_device(struct pci_dev *); #define EEH_IO_ERROR_VALUE(size) (~0U >> ((4 - (size)) * 8)) #else /* !CONFIG_EEH */ static inline void *eeh_dev_init(struct device_node *dn, void *data) { return NULL; } static inline void eeh_dev_phb_init_dynamic(struct pci_controller *phb) { } static inline void eeh_dev_phb_init(void) { } static inline void eeh_init(void) { } #ifdef CONFIG_PPC_PSERIES static inline int eeh_pseries_init(void) { return 0; } #endif /* CONFIG_PPC_PSERIES */ static inline unsigned long eeh_check_failure(const volatile void __iomem *token, unsigned long val) { return val; Loading
arch/powerpc/include/asm/eeh_event.h +9 −24 Original line number Diff line number Diff line /* * eeh_event.h * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or Loading @@ -22,32 +20,19 @@ #define ASM_POWERPC_EEH_EVENT_H #ifdef __KERNEL__ /** EEH event -- structure holding pci controller data that describes * a change in the isolation status of a PCI slot. A pointer * to this struct is passed as the data pointer in a notify callback. /* * structure holding pci controller data that describes a * change in the isolation status of a PCI slot. A pointer * to this struct is passed as the data pointer in a notify * callback. */ struct eeh_event { struct list_head list; struct device_node *dn; /* struct device node */ struct pci_dev *dev; /* affected device */ struct list_head list; /* to form event queue */ struct eeh_dev *edev; /* EEH device */ }; /** * eeh_send_failure_event - generate a PCI error event * @dev pci device * * This routine builds a PCI error event which will be delivered * to all listeners on the eeh_notifier_chain. * * This routine can be called within an interrupt context; * the actual event will be delivered in a normal context * (from a workqueue). */ int eeh_send_failure_event (struct device_node *dn, struct pci_dev *dev); /* Main recovery function */ struct pci_dn * handle_eeh_events (struct eeh_event *); int eeh_send_failure_event(struct eeh_dev *edev); struct eeh_dev *handle_eeh_events(struct eeh_event *); #endif /* __KERNEL__ */ #endif /* ASM_POWERPC_EEH_EVENT_H */
arch/powerpc/include/asm/ppc-pci.h +9 −80 Original line number Diff line number Diff line Loading @@ -47,92 +47,21 @@ extern int rtas_setup_phb(struct pci_controller *phb); extern unsigned long pci_probe_only; /* ---- EEH internal-use-only related routines ---- */ #ifdef CONFIG_EEH 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); void pci_addr_cache_build(void); struct pci_dev *pci_get_device_by_addr(unsigned long addr); /** * eeh_slot_error_detail -- record and EEH error condition to the log * @pdn: pci device node * @severity: EEH_LOG_TEMP_FAILURE or EEH_LOG_PERM_FAILURE * * Obtains the EEH error details from the RTAS subsystem, * and then logs these details with the RTAS error log system. */ #define EEH_LOG_TEMP_FAILURE 1 #define EEH_LOG_PERM_FAILURE 2 void eeh_slot_error_detail (struct pci_dn *pdn, int severity); /** * rtas_pci_enable - enable IO transfers for this slot * @pdn: pci device node * @function: either EEH_THAW_MMIO or EEH_THAW_DMA * * Enable I/O transfers to this slot */ #define EEH_THAW_MMIO 2 #define EEH_THAW_DMA 3 int rtas_pci_enable(struct pci_dn *pdn, int function); /** * rtas_set_slot_reset -- unfreeze a frozen slot * @pdn: pci device node * * Clear the EEH-frozen condition on a slot. This routine * does this by asserting the PCI #RST line for 1/8th of * a second; this routine will sleep while the adapter is * being reset. * * Returns a non-zero value if the reset failed. */ int rtas_set_slot_reset (struct pci_dn *); int eeh_wait_for_slot_status(struct pci_dn *pdn, int max_wait_msecs); /** * eeh_restore_bars - Restore device configuration info. * @pdn: pci device node * * A reset of a PCI device will clear out its config space. * This routines will restore the config space for this * device, and is children, to values previously obtained * from the firmware. */ void eeh_restore_bars(struct pci_dn *); /** * rtas_configure_bridge -- firmware initialization of pci bridge * @pdn: pci device node * * Ask the firmware to configure all PCI bridges devices * located behind the indicated node. Required after a * pci device reset. Does essentially the same hing as * eeh_restore_bars, but for brdges, and lets firmware * do the work. */ void rtas_configure_bridge(struct pci_dn *); struct pci_dev *pci_addr_cache_get_device(unsigned long addr); void eeh_slot_error_detail(struct eeh_dev *edev, int severity); int eeh_pci_enable(struct eeh_dev *edev, int function); int eeh_reset_pe(struct eeh_dev *); void eeh_restore_bars(struct eeh_dev *); int rtas_write_config(struct pci_dn *, int where, int size, u32 val); int rtas_read_config(struct pci_dn *, int where, int size, u32 *val); /** * eeh_mark_slot -- set mode flags for pertition endpoint * @pdn: pci device node * * mark and clear slots: find "partition endpoint" PE and set or * clear the flags for each subnode of the PE. */ void eeh_mark_slot(struct device_node *dn, int mode_flag); void eeh_clear_slot(struct device_node *dn, int mode_flag); /** * find_device_pe -- Find the associated "Partiationable Endpoint" PE * @pdn: pci device node */ struct device_node * find_device_pe(struct device_node *dn); struct device_node *eeh_find_device_pe(struct device_node *dn); void eeh_sysfs_add_device(struct pci_dev *pdev); void eeh_sysfs_remove_device(struct pci_dev *pdev); Loading
arch/powerpc/kernel/of_platform.c +5 −1 Original line number Diff line number Diff line Loading @@ -21,12 +21,13 @@ #include <linux/of.h> #include <linux/of_device.h> #include <linux/of_platform.h> #include <linux/atomic.h> #include <asm/errno.h> #include <asm/topology.h> #include <asm/pci-bridge.h> #include <asm/ppc-pci.h> #include <linux/atomic.h> #include <asm/eeh.h> #ifdef CONFIG_PPC_OF_PLATFORM_PCI Loading Loading @@ -66,6 +67,9 @@ static int __devinit of_pci_phb_probe(struct platform_device *dev) /* Init pci_dn data structures */ pci_devs_phb_init_dynamic(phb); /* Create EEH devices for the PHB */ eeh_dev_phb_init_dynamic(phb); /* Register devices with EEH */ #ifdef CONFIG_EEH if (dev->dev.of_node->child) Loading