Commit 97754e3c authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'powerpc-4.0-2' of git://git.kernel.org/pub/scm/linux/kernel/git/mpe/linux

Pull powerpc fixes from Michael Ellerman:
 - Fix for dynticks.
 - Fix for smpboot bug.
 - Fix for IOMMU group refcounting.

* tag 'powerpc-4.0-2' of git://git.kernel.org/pub/scm/linux/kernel/git/mpe/linux:
  powerpc/iommu: Remove IOMMU device references via bus notifier
  powerpc/smp: Wait until secondaries are active & online
  powerpc: Re-enable dynticks
parents a6c5170d 4ad04e59
...@@ -113,6 +113,7 @@ extern void iommu_register_group(struct iommu_table *tbl, ...@@ -113,6 +113,7 @@ extern void iommu_register_group(struct iommu_table *tbl,
int pci_domain_number, unsigned long pe_num); int pci_domain_number, unsigned long pe_num);
extern int iommu_add_device(struct device *dev); extern int iommu_add_device(struct device *dev);
extern void iommu_del_device(struct device *dev); extern void iommu_del_device(struct device *dev);
extern int __init tce_iommu_bus_notifier_init(void);
#else #else
static inline void iommu_register_group(struct iommu_table *tbl, static inline void iommu_register_group(struct iommu_table *tbl,
int pci_domain_number, int pci_domain_number,
...@@ -128,6 +129,11 @@ static inline int iommu_add_device(struct device *dev) ...@@ -128,6 +129,11 @@ static inline int iommu_add_device(struct device *dev)
static inline void iommu_del_device(struct device *dev) static inline void iommu_del_device(struct device *dev)
{ {
} }
static inline int __init tce_iommu_bus_notifier_init(void)
{
return 0;
}
#endif /* !CONFIG_IOMMU_API */ #endif /* !CONFIG_IOMMU_API */
static inline void set_iommu_table_base_and_group(struct device *dev, static inline void set_iommu_table_base_and_group(struct device *dev,
......
#ifndef _ASM_POWERPC_IRQ_WORK_H
#define _ASM_POWERPC_IRQ_WORK_H
static inline bool arch_irq_work_has_interrupt(void)
{
return true;
}
#endif /* _ASM_POWERPC_IRQ_WORK_H */
...@@ -1175,4 +1175,30 @@ void iommu_del_device(struct device *dev) ...@@ -1175,4 +1175,30 @@ void iommu_del_device(struct device *dev)
} }
EXPORT_SYMBOL_GPL(iommu_del_device); EXPORT_SYMBOL_GPL(iommu_del_device);
static int tce_iommu_bus_notifier(struct notifier_block *nb,
unsigned long action, void *data)
{
struct device *dev = data;
switch (action) {
case BUS_NOTIFY_ADD_DEVICE:
return iommu_add_device(dev);
case BUS_NOTIFY_DEL_DEVICE:
if (dev->iommu_group)
iommu_del_device(dev);
return 0;
default:
return 0;
}
}
static struct notifier_block tce_iommu_bus_nb = {
.notifier_call = tce_iommu_bus_notifier,
};
int __init tce_iommu_bus_notifier_init(void)
{
bus_register_notifier(&pci_bus_type, &tce_iommu_bus_nb);
return 0;
}
#endif /* CONFIG_IOMMU_API */ #endif /* CONFIG_IOMMU_API */
...@@ -541,8 +541,8 @@ int __cpu_up(unsigned int cpu, struct task_struct *tidle) ...@@ -541,8 +541,8 @@ int __cpu_up(unsigned int cpu, struct task_struct *tidle)
if (smp_ops->give_timebase) if (smp_ops->give_timebase)
smp_ops->give_timebase(); smp_ops->give_timebase();
/* Wait until cpu puts itself in the online map */ /* Wait until cpu puts itself in the online & active maps */
while (!cpu_online(cpu)) while (!cpu_online(cpu) || !cpu_active(cpu))
cpu_relax(); cpu_relax();
return 0; return 0;
......
...@@ -836,30 +836,4 @@ void __init pnv_pci_init(void) ...@@ -836,30 +836,4 @@ void __init pnv_pci_init(void)
#endif #endif
} }
static int tce_iommu_bus_notifier(struct notifier_block *nb,
unsigned long action, void *data)
{
struct device *dev = data;
switch (action) {
case BUS_NOTIFY_ADD_DEVICE:
return iommu_add_device(dev);
case BUS_NOTIFY_DEL_DEVICE:
if (dev->iommu_group)
iommu_del_device(dev);
return 0;
default:
return 0;
}
}
static struct notifier_block tce_iommu_bus_nb = {
.notifier_call = tce_iommu_bus_notifier,
};
static int __init tce_iommu_bus_notifier_init(void)
{
bus_register_notifier(&pci_bus_type, &tce_iommu_bus_nb);
return 0;
}
machine_subsys_initcall_sync(powernv, tce_iommu_bus_notifier_init); machine_subsys_initcall_sync(powernv, tce_iommu_bus_notifier_init);
...@@ -1340,3 +1340,5 @@ static int __init disable_multitce(char *str) ...@@ -1340,3 +1340,5 @@ static int __init disable_multitce(char *str)
} }
__setup("multitce=", disable_multitce); __setup("multitce=", disable_multitce);
machine_subsys_initcall_sync(pseries, tce_iommu_bus_notifier_init);
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment