![Gavin Shan](/assets/img/avatar_default.png)
Original EEH implementation depends on struct pci_dn heavily. However, EEH shouldn't depend on that actually because EEH needn't share much information with other PCI components. That's to say, EEH should have worked independently. The patch introduces struct eeh_dev so that EEH core components needn't be working based on struct pci_dn in future. Also, struct pci_dn, struct eeh_dev instances are created in dynamic fasion and the binding with EEH device, OF node, PCI device is implemented as well. The EEH devices are created after PHBs are detected and initialized, but PCI emunation hasn't started yet. Apart from that, PHB might be created dynamically through DLPAR component and the EEH devices should be creatd as well. Another case might be OF node is created dynamically by DR (Dynamic Reconfiguration), which has been defined by PAPR. For those OF nodes created by DR, EEH devices should be also created accordingly. The binding between EEH device and OF node is done while the EEH device is initially created. The binding between EEH device and PCI device should be done after PCI emunation is done. Besides, PCI hotplug also needs the binding so that the EEH devices could be traced from the newly coming PCI buses or PCI devices. Signed-off-by: Gavin Shan <shangw@linux.vnet.ibm.com> Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
46 lines
878 B
C
46 lines
878 B
C
/*
|
|
* Arch specific extensions to struct device
|
|
*
|
|
* This file is released under the GPLv2
|
|
*/
|
|
#ifndef _ASM_POWERPC_DEVICE_H
|
|
#define _ASM_POWERPC_DEVICE_H
|
|
|
|
struct dma_map_ops;
|
|
struct device_node;
|
|
|
|
/*
|
|
* Arch extensions to struct device.
|
|
*
|
|
* When adding fields, consider macio_add_one_device in
|
|
* drivers/macintosh/macio_asic.c
|
|
*/
|
|
struct dev_archdata {
|
|
/* DMA operations on that device */
|
|
struct dma_map_ops *dma_ops;
|
|
|
|
/*
|
|
* When an iommu is in use, dma_data is used as a ptr to the base of the
|
|
* iommu_table. Otherwise, it is a simple numerical offset.
|
|
*/
|
|
union {
|
|
dma_addr_t dma_offset;
|
|
void *iommu_table_base;
|
|
} dma_data;
|
|
|
|
#ifdef CONFIG_SWIOTLB
|
|
dma_addr_t max_direct_dma_addr;
|
|
#endif
|
|
#ifdef CONFIG_EEH
|
|
struct eeh_dev *edev;
|
|
#endif
|
|
};
|
|
|
|
struct pdev_archdata {
|
|
u64 dma_mask;
|
|
};
|
|
|
|
#define ARCH_HAS_DMA_GET_REQUIRED_MASK
|
|
|
|
#endif /* _ASM_POWERPC_DEVICE_H */
|