forked from Minki/linux
powerpc/powernv: Move dma_set_mask() from pnv_phb to pci_controller_ops
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>
This commit is contained in:
parent
3405c2570f
commit
763d2d8df1
@ -1601,9 +1601,10 @@ static void pnv_pci_ioda_dma_dev_setup(struct pnv_phb *phb, struct pci_dev *pdev
|
||||
set_iommu_table_base_and_group(&pdev->dev, pe->tce32_table);
|
||||
}
|
||||
|
||||
static int pnv_pci_ioda_dma_set_mask(struct pnv_phb *phb,
|
||||
struct pci_dev *pdev, u64 dma_mask)
|
||||
static int pnv_pci_ioda_dma_set_mask(struct pci_dev *pdev, u64 dma_mask)
|
||||
{
|
||||
struct pci_controller *hose = pci_bus_to_host(pdev->bus);
|
||||
struct pnv_phb *phb = hose->private_data;
|
||||
struct pci_dn *pdn = pci_get_pdn(pdev);
|
||||
struct pnv_ioda_pe *pe;
|
||||
uint64_t top;
|
||||
@ -2657,6 +2658,7 @@ static const struct pci_controller_ops pnv_pci_ioda_controller_ops = {
|
||||
.enable_device_hook = pnv_pci_enable_device_hook,
|
||||
.window_alignment = pnv_pci_window_alignment,
|
||||
.reset_secondary_bus = pnv_pci_reset_secondary_bus,
|
||||
.dma_set_mask = pnv_pci_ioda_dma_set_mask,
|
||||
};
|
||||
|
||||
static void __init pnv_pci_init_ioda_phb(struct device_node *np,
|
||||
@ -2802,7 +2804,6 @@ static void __init pnv_pci_init_ioda_phb(struct device_node *np,
|
||||
|
||||
/* Setup TCEs */
|
||||
phb->dma_dev_setup = pnv_pci_ioda_dma_dev_setup;
|
||||
phb->dma_set_mask = pnv_pci_ioda_dma_set_mask;
|
||||
phb->dma_get_required_mask = pnv_pci_ioda_dma_get_required_mask;
|
||||
|
||||
/* Setup shutdown function for kexec */
|
||||
|
@ -689,16 +689,6 @@ void pnv_pci_dma_dev_setup(struct pci_dev *pdev)
|
||||
phb->dma_dev_setup(phb, pdev);
|
||||
}
|
||||
|
||||
int pnv_pci_dma_set_mask(struct pci_dev *pdev, u64 dma_mask)
|
||||
{
|
||||
struct pci_controller *hose = pci_bus_to_host(pdev->bus);
|
||||
struct pnv_phb *phb = hose->private_data;
|
||||
|
||||
if (phb && phb->dma_set_mask)
|
||||
return phb->dma_set_mask(phb, pdev, dma_mask);
|
||||
return __dma_set_mask(&pdev->dev, dma_mask);
|
||||
}
|
||||
|
||||
u64 pnv_pci_dma_get_required_mask(struct pci_dev *pdev)
|
||||
{
|
||||
struct pci_controller *hose = pci_bus_to_host(pdev->bus);
|
||||
|
@ -106,8 +106,6 @@ struct pnv_phb {
|
||||
unsigned int hwirq, unsigned int virq,
|
||||
unsigned int is_64, struct msi_msg *msg);
|
||||
void (*dma_dev_setup)(struct pnv_phb *phb, struct pci_dev *pdev);
|
||||
int (*dma_set_mask)(struct pnv_phb *phb, struct pci_dev *pdev,
|
||||
u64 dma_mask);
|
||||
u64 (*dma_get_required_mask)(struct pnv_phb *phb,
|
||||
struct pci_dev *pdev);
|
||||
void (*fixup_phb)(struct pci_controller *hose);
|
||||
|
@ -12,17 +12,11 @@ struct pci_dev;
|
||||
#ifdef CONFIG_PCI
|
||||
extern void pnv_pci_init(void);
|
||||
extern void pnv_pci_shutdown(void);
|
||||
extern int pnv_pci_dma_set_mask(struct pci_dev *pdev, u64 dma_mask);
|
||||
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 int pnv_pci_dma_set_mask(struct pci_dev *pdev, u64 dma_mask)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
static inline u64 pnv_pci_dma_get_required_mask(struct pci_dev *pdev)
|
||||
{
|
||||
return 0;
|
||||
|
@ -165,13 +165,6 @@ static void pnv_progress(char *s, unsigned short hex)
|
||||
{
|
||||
}
|
||||
|
||||
static int pnv_dma_set_mask(struct device *dev, u64 dma_mask)
|
||||
{
|
||||
if (dev_is_pci(dev))
|
||||
return pnv_pci_dma_set_mask(to_pci_dev(dev), dma_mask);
|
||||
return __dma_set_mask(dev, dma_mask);
|
||||
}
|
||||
|
||||
static u64 pnv_dma_get_required_mask(struct device *dev)
|
||||
{
|
||||
if (dev_is_pci(dev))
|
||||
@ -321,7 +314,6 @@ define_machine(powernv) {
|
||||
.machine_shutdown = pnv_shutdown,
|
||||
.power_save = power7_idle,
|
||||
.calibrate_decr = generic_calibrate_decr,
|
||||
.dma_set_mask = pnv_dma_set_mask,
|
||||
.dma_get_required_mask = pnv_dma_get_required_mask,
|
||||
#ifdef CONFIG_KEXEC
|
||||
.kexec_cpu_down = pnv_kexec_cpu_down,
|
||||
|
Loading…
Reference in New Issue
Block a user