Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d0014be4 authored by Bob Liu's avatar Bob Liu
Browse files

blackfin: smp: cleanup smp code



move idle task point to percpu blackfin_cpudata and add smp_timer_broadcast
interface.
enable SUPPLE_1_WAKEUP and add BFIN_IPI_TIMER ipi support.

Signed-off-by: default avatarSteven Miao <realmz6@gmail.com>
Signed-off-by: default avatarBob Liu <lliubbo@gmail.com>
parent 16df3666
Loading
Loading
Loading
Loading
+3 −0
Original line number Original line Diff line number Diff line
@@ -14,6 +14,9 @@ struct blackfin_cpudata {
	struct cpu cpu;
	struct cpu cpu;
	unsigned int imemctl;
	unsigned int imemctl;
	unsigned int dmemctl;
	unsigned int dmemctl;
#ifdef CONFIG_SMP
	struct task_struct *idle;
#endif
};
};


DECLARE_PER_CPU(struct blackfin_cpudata, cpu_data);
DECLARE_PER_CPU(struct blackfin_cpudata, cpu_data);
+4 −1
Original line number Original line Diff line number Diff line
@@ -46,4 +46,7 @@ int __cpu_disable(void);
int __cpu_die(unsigned int cpu);
int __cpu_die(unsigned int cpu);
#endif
#endif


void smp_timer_broadcast(const struct cpumask *mask);


#endif /* !__ASM_BLACKFIN_SMP_H */
#endif /* !__ASM_BLACKFIN_SMP_H */
+25 −1
Original line number Original line Diff line number Diff line
@@ -219,7 +219,7 @@ static void __init bfin_gptmr0_clockevent_init(struct clock_event_device *evt)


#if defined(CONFIG_TICKSOURCE_CORETMR)
#if defined(CONFIG_TICKSOURCE_CORETMR)
/* per-cpu local core timer */
/* per-cpu local core timer */
static DEFINE_PER_CPU(struct clock_event_device, coretmr_events);
DEFINE_PER_CPU(struct clock_event_device, coretmr_events);


static int bfin_coretmr_set_next_event(unsigned long cycles,
static int bfin_coretmr_set_next_event(unsigned long cycles,
				struct clock_event_device *evt)
				struct clock_event_device *evt)
@@ -281,6 +281,25 @@ void bfin_coretmr_init(void)
#ifdef CONFIG_CORE_TIMER_IRQ_L1
#ifdef CONFIG_CORE_TIMER_IRQ_L1
__attribute__((l1_text))
__attribute__((l1_text))
#endif
#endif

static void broadcast_timer_set_mode(enum clock_event_mode mode,
		struct clock_event_device *evt)
{
}

static void __cpuinit broadcast_timer_setup(struct clock_event_device *evt)
{
	evt->name       = "dummy_timer";
	evt->features   = CLOCK_EVT_FEAT_ONESHOT |
		CLOCK_EVT_FEAT_PERIODIC |
		CLOCK_EVT_FEAT_DUMMY;
	evt->rating     = 400;
	evt->mult       = 1;
	evt->set_mode   = broadcast_timer_set_mode;

	clockevents_register_device(evt);
}

irqreturn_t bfin_coretmr_interrupt(int irq, void *dev_id)
irqreturn_t bfin_coretmr_interrupt(int irq, void *dev_id)
{
{
	int cpu = smp_processor_id();
	int cpu = smp_processor_id();
@@ -306,6 +325,11 @@ void bfin_coretmr_clockevent_init(void)
	unsigned int cpu = smp_processor_id();
	unsigned int cpu = smp_processor_id();
	struct clock_event_device *evt = &per_cpu(coretmr_events, cpu);
	struct clock_event_device *evt = &per_cpu(coretmr_events, cpu);


#ifdef CONFIG_SMP
	evt->broadcast = smp_timer_broadcast;
#endif


	evt->name = "bfin_core_timer";
	evt->name = "bfin_core_timer";
	evt->rating = 350;
	evt->rating = 350;
	evt->irq = -1;
	evt->irq = -1;
+3 −1
Original line number Original line Diff line number Diff line
@@ -16,6 +16,7 @@
#include <mach/irq.h>
#include <mach/irq.h>


#define SUPPLE_0_WAKEUP ((IRQ_SUPPLE_0 - (IRQ_CORETMR + 1)) % 32)
#define SUPPLE_0_WAKEUP ((IRQ_SUPPLE_0 - (IRQ_CORETMR + 1)) % 32)
#define SUPPLE_1_WAKEUP ((IRQ_SUPPLE_1 - (IRQ_CORETMR + 1)) % 32)


static inline void
static inline void
bfin_iwr_restore(unsigned long iwr0, unsigned long iwr1, unsigned long iwr2)
bfin_iwr_restore(unsigned long iwr0, unsigned long iwr1, unsigned long iwr2)
@@ -42,7 +43,8 @@ bfin_iwr_save(unsigned long niwr0, unsigned long niwr1, unsigned long niwr2,
static inline void
static inline void
bfin_iwr_set_sup0(unsigned long *iwr0, unsigned long *iwr1, unsigned long *iwr2)
bfin_iwr_set_sup0(unsigned long *iwr0, unsigned long *iwr1, unsigned long *iwr2)
{
{
	bfin_iwr_save(0, IWR_ENABLE(SUPPLE_0_WAKEUP), 0, iwr0, iwr1, iwr2);
	bfin_iwr_save(0, IWR_ENABLE(SUPPLE_0_WAKEUP) |
			IWR_ENABLE(SUPPLE_1_WAKEUP), 0, iwr0, iwr1, iwr2);
}
}


#endif
#endif
+1 −1
Original line number Original line Diff line number Diff line
@@ -84,7 +84,7 @@ int __cpuinit platform_boot_secondary(unsigned int cpu, struct task_struct *idle


	if ((bfin_read_SYSCR() & COREB_SRAM_INIT) == 0) {
	if ((bfin_read_SYSCR() & COREB_SRAM_INIT) == 0) {
		/* CoreB already running, sending ipi to wakeup it */
		/* CoreB already running, sending ipi to wakeup it */
		platform_send_ipi_cpu(cpu, IRQ_SUPPLE_0);
		smp_send_reschedule(cpu);
	} else {
	} else {
		/* Kick CoreB, which should start execution from CORE_SRAM_BASE. */
		/* Kick CoreB, which should start execution from CORE_SRAM_BASE. */
		bfin_write_SYSCR(bfin_read_SYSCR() & ~COREB_SRAM_INIT);
		bfin_write_SYSCR(bfin_read_SYSCR() & ~COREB_SRAM_INIT);
Loading