forked from mirrors/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
					
				
					 5 changed files with 4 additions and 29 deletions
				
			
		| 
						 | 
					@ -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);
 | 
						set_iommu_table_base_and_group(&pdev->dev, pe->tce32_table);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int pnv_pci_ioda_dma_set_mask(struct pnv_phb *phb,
 | 
					static int pnv_pci_ioda_dma_set_mask(struct pci_dev *pdev, u64 dma_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 pci_dn *pdn = pci_get_pdn(pdev);
 | 
				
			||||||
	struct pnv_ioda_pe *pe;
 | 
						struct pnv_ioda_pe *pe;
 | 
				
			||||||
	uint64_t top;
 | 
						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,
 | 
					       .enable_device_hook = pnv_pci_enable_device_hook,
 | 
				
			||||||
       .window_alignment = pnv_pci_window_alignment,
 | 
					       .window_alignment = pnv_pci_window_alignment,
 | 
				
			||||||
       .reset_secondary_bus = pnv_pci_reset_secondary_bus,
 | 
					       .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,
 | 
					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 */
 | 
						/* Setup TCEs */
 | 
				
			||||||
	phb->dma_dev_setup = pnv_pci_ioda_dma_dev_setup;
 | 
						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;
 | 
						phb->dma_get_required_mask = pnv_pci_ioda_dma_get_required_mask;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Setup shutdown function for kexec */
 | 
						/* 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);
 | 
							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)
 | 
					u64 pnv_pci_dma_get_required_mask(struct pci_dev *pdev)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct pci_controller *hose = pci_bus_to_host(pdev->bus);
 | 
						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 hwirq, unsigned int virq,
 | 
				
			||||||
			 unsigned int is_64, struct msi_msg *msg);
 | 
								 unsigned int is_64, struct msi_msg *msg);
 | 
				
			||||||
	void (*dma_dev_setup)(struct pnv_phb *phb, struct pci_dev *pdev);
 | 
						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,
 | 
						u64 (*dma_get_required_mask)(struct pnv_phb *phb,
 | 
				
			||||||
				     struct pci_dev *pdev);
 | 
									     struct pci_dev *pdev);
 | 
				
			||||||
	void (*fixup_phb)(struct pci_controller *hose);
 | 
						void (*fixup_phb)(struct pci_controller *hose);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -12,17 +12,11 @@ struct pci_dev;
 | 
				
			||||||
#ifdef CONFIG_PCI
 | 
					#ifdef CONFIG_PCI
 | 
				
			||||||
extern void pnv_pci_init(void);
 | 
					extern void pnv_pci_init(void);
 | 
				
			||||||
extern void pnv_pci_shutdown(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);
 | 
					extern u64 pnv_pci_dma_get_required_mask(struct pci_dev *pdev);
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
static inline void pnv_pci_init(void) { }
 | 
					static inline void pnv_pci_init(void) { }
 | 
				
			||||||
static inline void pnv_pci_shutdown(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)
 | 
					static inline u64 pnv_pci_dma_get_required_mask(struct pci_dev *pdev)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	return 0;
 | 
						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)
 | 
					static u64 pnv_dma_get_required_mask(struct device *dev)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	if (dev_is_pci(dev))
 | 
						if (dev_is_pci(dev))
 | 
				
			||||||
| 
						 | 
					@ -321,7 +314,6 @@ define_machine(powernv) {
 | 
				
			||||||
	.machine_shutdown	= pnv_shutdown,
 | 
						.machine_shutdown	= pnv_shutdown,
 | 
				
			||||||
	.power_save             = power7_idle,
 | 
						.power_save             = power7_idle,
 | 
				
			||||||
	.calibrate_decr		= generic_calibrate_decr,
 | 
						.calibrate_decr		= generic_calibrate_decr,
 | 
				
			||||||
	.dma_set_mask		= pnv_dma_set_mask,
 | 
					 | 
				
			||||||
	.dma_get_required_mask	= pnv_dma_get_required_mask,
 | 
						.dma_get_required_mask	= pnv_dma_get_required_mask,
 | 
				
			||||||
#ifdef CONFIG_KEXEC
 | 
					#ifdef CONFIG_KEXEC
 | 
				
			||||||
	.kexec_cpu_down		= pnv_kexec_cpu_down,
 | 
						.kexec_cpu_down		= pnv_kexec_cpu_down,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue