diff options
Diffstat (limited to 'arch/powerpc/platforms/ps3/smp.c')
| -rw-r--r-- | arch/powerpc/platforms/ps3/smp.c | 62 | 
1 files changed, 32 insertions, 30 deletions
diff --git a/arch/powerpc/platforms/ps3/smp.c b/arch/powerpc/platforms/ps3/smp.c index 4c44794faac..efc1cd8c034 100644 --- a/arch/powerpc/platforms/ps3/smp.c +++ b/arch/powerpc/platforms/ps3/smp.c @@ -59,46 +59,49 @@ static void ps3_smp_message_pass(int cpu, int msg)  static int ps3_smp_probe(void)  { -	return 2; -} +	int cpu; -static void __init ps3_smp_setup_cpu(int cpu) -{ -	int result; -	unsigned int *virqs = per_cpu(ps3_ipi_virqs, cpu); -	int i; +	for (cpu = 0; cpu < 2; cpu++) { +		int result; +		unsigned int *virqs = per_cpu(ps3_ipi_virqs, cpu); +		int i; -	DBG(" -> %s:%d: (%d)\n", __func__, __LINE__, cpu); +		DBG(" -> %s:%d: (%d)\n", __func__, __LINE__, cpu); -	/* -	 * Check assumptions on ps3_ipi_virqs[] indexing. If this -	 * check fails, then a different mapping of PPC_MSG_ -	 * to index needs to be setup. -	 */ +		/* +		* Check assumptions on ps3_ipi_virqs[] indexing. If this +		* check fails, then a different mapping of PPC_MSG_ +		* to index needs to be setup. +		*/ -	BUILD_BUG_ON(PPC_MSG_CALL_FUNCTION    != 0); -	BUILD_BUG_ON(PPC_MSG_RESCHEDULE       != 1); -	BUILD_BUG_ON(PPC_MSG_CALL_FUNC_SINGLE != 2); -	BUILD_BUG_ON(PPC_MSG_DEBUGGER_BREAK   != 3); +		BUILD_BUG_ON(PPC_MSG_CALL_FUNCTION    != 0); +		BUILD_BUG_ON(PPC_MSG_RESCHEDULE       != 1); +		BUILD_BUG_ON(PPC_MSG_CALL_FUNC_SINGLE != 2); +		BUILD_BUG_ON(PPC_MSG_DEBUGGER_BREAK   != 3); -	for (i = 0; i < MSG_COUNT; i++) { -		result = ps3_event_receive_port_setup(cpu, &virqs[i]); +		for (i = 0; i < MSG_COUNT; i++) { +			result = ps3_event_receive_port_setup(cpu, &virqs[i]); -		if (result) -			continue; +			if (result) +				continue; -		DBG("%s:%d: (%d, %d) => virq %u\n", -			__func__, __LINE__, cpu, i, virqs[i]); +			DBG("%s:%d: (%d, %d) => virq %u\n", +				__func__, __LINE__, cpu, i, virqs[i]); -		result = smp_request_message_ipi(virqs[i], i); +			result = smp_request_message_ipi(virqs[i], i); -		if (result) -			virqs[i] = NO_IRQ; -	} +			if (result) +				virqs[i] = NO_IRQ; +			else +				ps3_register_ipi_irq(cpu, virqs[i]); +		} -	ps3_register_ipi_debug_brk(cpu, virqs[PPC_MSG_DEBUGGER_BREAK]); +		ps3_register_ipi_debug_brk(cpu, virqs[PPC_MSG_DEBUGGER_BREAK]); -	DBG(" <- %s:%d: (%d)\n", __func__, __LINE__, cpu); +		DBG(" <- %s:%d: (%d)\n", __func__, __LINE__, cpu); +	} + +	return 2;  }  void ps3_smp_cleanup_cpu(int cpu) @@ -121,7 +124,6 @@ static struct smp_ops_t ps3_smp_ops = {  	.probe		= ps3_smp_probe,  	.message_pass	= ps3_smp_message_pass,  	.kick_cpu	= smp_generic_kick_cpu, -	.setup_cpu	= ps3_smp_setup_cpu,  };  void smp_init_ps3(void)  |