forked from Minki/linux
763d2d8df1
Previously, dma_set_mask() on powernv was convoluted: 0) Call dma_set_mask() (a/p/kernel/dma.c) 1) In dma_set_mask(), ppc_md.dma_set_mask() exists, so call it. 2) On powernv, that function pointer is pnv_dma_set_mask(). In pnv_dma_set_mask(), the device is pci, so call pnv_pci_dma_set_mask(). 3) In pnv_pci_dma_set_mask(), call pnv_phb->set_dma_mask() if it exists. 4) It only exists in the ioda case, where it points to pnv_pci_ioda_dma_set_mask(), which is the final function. So the call chain is: dma_set_mask() -> pnv_dma_set_mask() -> pnv_pci_dma_set_mask() -> pnv_pci_ioda_dma_set_mask() Both ppc_md and pnv_phb function pointers are used. Rip out the ppc_md call, pnv_dma_set_mask() and pnv_pci_dma_set_mask(). Instead: 0) Call dma_set_mask() (a/p/kernel/dma.c) 1) In dma_set_mask(), the device is pci, and pci_controller_ops.dma_set_mask() exists, so call pci_controller_ops.dma_set_mask() 2) In the ioda case, that points to pnv_pci_ioda_dma_set_mask(). The new call chain is dma_set_mask() -> pnv_pci_ioda_dma_set_mask() Now only the pci_controller_ops function pointer is used. The fallback paths for p5ioc2 are the same. Previously, pnv_pci_dma_set_mask() would find no pnv_phb->set_dma_mask() function, to it would call __set_dma_mask(). Now, dma_set_mask() finds no ppc_md call or pci_controller_ops call, so it calls __set_dma_mask(). Signed-off-by: Daniel Axtens <dja@axtens.net> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
36 lines
735 B
C
36 lines
735 B
C
#ifndef _POWERNV_H
|
|
#define _POWERNV_H
|
|
|
|
#ifdef CONFIG_SMP
|
|
extern void pnv_smp_init(void);
|
|
#else
|
|
static inline void pnv_smp_init(void) { }
|
|
#endif
|
|
|
|
struct pci_dev;
|
|
|
|
#ifdef CONFIG_PCI
|
|
extern void pnv_pci_init(void);
|
|
extern void pnv_pci_shutdown(void);
|
|
extern u64 pnv_pci_dma_get_required_mask(struct pci_dev *pdev);
|
|
#else
|
|
static inline void pnv_pci_init(void) { }
|
|
static inline void pnv_pci_shutdown(void) { }
|
|
|
|
static inline u64 pnv_pci_dma_get_required_mask(struct pci_dev *pdev)
|
|
{
|
|
return 0;
|
|
}
|
|
#endif
|
|
|
|
extern u32 pnv_get_supported_cpuidle_states(void);
|
|
|
|
extern void pnv_lpc_init(void);
|
|
|
|
extern void opal_handle_events(uint64_t events);
|
|
extern void opal_event_shutdown(void);
|
|
|
|
bool cpu_core_split_required(void);
|
|
|
|
#endif /* _POWERNV_H */
|