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

Commit eb21ab24 authored by Yasuaki Ishimatsu's avatar Yasuaki Ishimatsu Committed by Tony Luck
Browse files

[IA64] Use dynamic irq for iosapic interrupts



Use create_irq()/destroy_irq() for iosapic interrupts.

Signed-off-by: default avatarKenji Kaneshige <kaneshige.kenji@jp.fujitsu.com>
Signed-off-by: default avatarYasuaki Ishimatsu <isimatu.yasuaki@jp.fujitsu.com>
Signed-off-by: default avatarTony Luck <tony.luck@intel.com>
parent c1726d6f
Loading
Loading
Loading
Loading
+15 −24
Original line number Diff line number Diff line
@@ -533,12 +533,13 @@ static int iosapic_find_sharable_vector (unsigned long trigger,
static void __init
iosapic_reassign_vector (int vector)
{
	int new_vector;
	int irq, new_vector;

	if (!list_empty(&iosapic_intr_info[vector].rtes)) {
		new_vector = assign_irq_vector(AUTO_ASSIGN);
		if (new_vector < 0)
		irq = create_irq();
		if (irq < 0)
			panic("%s: out of interrupt vectors!\n", __FUNCTION__);
		new_vector = irq_to_vector(irq);
		printk(KERN_INFO "Reassigning vector %d to %d\n",
		       vector, new_vector);
		memcpy(&iosapic_intr_info[new_vector], &iosapic_intr_info[vector],
@@ -753,7 +754,7 @@ int
iosapic_register_intr (unsigned int gsi,
		       unsigned long polarity, unsigned long trigger)
{
	int vector, mask = 1, err;
	int irq, vector, mask = 1, err;
	unsigned int dest;
	unsigned long flags;
	struct iosapic_rte_info *rte;
@@ -773,12 +774,13 @@ iosapic_register_intr (unsigned int gsi,
	}

	/* If vector is running out, we try to find a sharable vector */
	vector = assign_irq_vector(AUTO_ASSIGN);
	if (vector < 0) {
	irq = create_irq();
	if (irq < 0) {
		vector = iosapic_find_sharable_vector(trigger, polarity);
  		if (vector < 0)
			goto unlock_iosapic_lock;
	}
	} else
		vector = irq_to_vector(irq);

	spin_lock(&irq_desc[vector].lock);
	dest = get_target_cpu(gsi, vector);
@@ -873,30 +875,18 @@ iosapic_unregister_intr (unsigned int gsi)
	if (list_empty(&iosapic_intr_info[vector].rtes)) {
		/* Sanity check */
		BUG_ON(iosapic_intr_info[vector].count);

		/* Clear the interrupt controller descriptor */
		idesc->chip = &no_irq_type;

#ifdef CONFIG_SMP
		/* Clear affinity */
		cpus_setall(idesc->affinity);
#endif

		/* Clear the interrupt information */
		memset(&iosapic_intr_info[vector], 0,
		       sizeof(struct iosapic_intr_info));
		iosapic_intr_info[vector].low32 |= IOSAPIC_MASK;
		INIT_LIST_HEAD(&iosapic_intr_info[vector].rtes);

		if (idesc->action) {
			printk(KERN_ERR
			       "interrupt handlers still exist on IRQ %u\n",
			       irq);
			WARN_ON(1);
		}

		/* Free the interrupt vector */
		free_irq_vector(vector);
		/* Destroy IRQ */
		destroy_irq(irq);
	}
 out:
	spin_unlock_irqrestore(&iosapic_lock, flags);
@@ -912,7 +902,7 @@ iosapic_register_platform_intr (u32 int_type, unsigned int gsi,
{
	static const char * const name[] = {"unknown", "PMI", "INIT", "CPEI"};
	unsigned char delivery;
	int vector, mask = 0;
	int irq, vector, mask = 0;
	unsigned int dest = ((id << 8) | eid) & 0xffff;

	switch (int_type) {
@@ -926,9 +916,10 @@ iosapic_register_platform_intr (u32 int_type, unsigned int gsi,
		delivery = IOSAPIC_PMI;
		break;
	      case ACPI_INTERRUPT_INIT:
		vector = assign_irq_vector(AUTO_ASSIGN);
		if (vector < 0)
		irq = create_irq();
		if (irq < 0)
			panic("%s: out of interrupt vectors!\n", __FUNCTION__);
		vector = irq_to_vector(irq);
		delivery = IOSAPIC_INIT;
		break;
	      case ACPI_INTERRUPT_CPEI: