Beispiel #1
0
int ps3_sb_event_receive_port_setup(struct ps3_system_bus_device *dev,
	enum ps3_cpu_binding cpu, unsigned int *virq)
{
	/* this should go in system-bus.c */

	int result;

	result = ps3_event_receive_port_setup(cpu, virq);

	if (result)
		return result;

	result = lv1_connect_interrupt_event_receive_port(dev->bus_id,
		dev->dev_id, virq_to_hw(*virq), dev->interrupt_id);

	if (result) {
		pr_debug("%s:%d: lv1_connect_interrupt_event_receive_port"
			" failed: %s\n", __func__, __LINE__,
			ps3_result(result));
		ps3_event_receive_port_destroy(*virq);
		*virq = NO_IRQ;
		return result;
	}

	pr_debug("%s:%d: interrupt_id %u, virq %u\n", __func__, __LINE__,
		dev->interrupt_id, *virq);

	return 0;
}
Beispiel #2
0
static int __init ps3_smp_probe(void)
{
	int cpu;

	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);


		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]);

			if (result)
				continue;

			DBG("%s:%d: (%d, %d) => virq %u\n",
				__func__, __LINE__, cpu, i, virqs[i]);

			result = smp_request_message_ipi(virqs[i], i);

			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]);

		DBG(" <- %s:%d: (%d)\n", __func__, __LINE__, cpu);
	}

	return 2;
}