Lines Matching +full:sci +full:- +full:inta
1 // SPDX-License-Identifier: GPL-2.0
7 * Copyright (C) 2000-2002 J.I. Lee <jung-ik.lee@intel.com>
8 * Copyright (C) 1999-2000, 2002-2003 Hewlett-Packard Co.
9 * David Mosberger-Tang <davidm@hpl.hp.com>
38 * 03/02/19 B. Helgaas Make pcat_compat system-wide, not per-IOSAPIC.
50 * (1) A PCI device raises one of the four interrupt pins (INTA, INTB, INTC,
51 * INTD). The device is uniquely identified by its bus-, and slot-number
63 * IOSAPIC pin into the IA-64 interrupt vector. This interrupt vector is then
67 * used as architecture-independent interrupt handling mechanism in Linux.
69 * IA-64 interrupt vector number <-> IRQ number mapping. On smaller
70 * systems, we use one-to-one mapping between IA-64 vector and IRQ.
74 * PCI pin -> global system interrupt (GSI) -> IA-64 vector <-> IRQ
111 * These tables map IA-64 vectors to the IOSAPIC pin that generates this
155 spin_lock_irqsave(&iosapic->lock, flags); in iosapic_write()
156 __iosapic_write(iosapic->addr, reg, val); in iosapic_write()
157 spin_unlock_irqrestore(&iosapic->lock, flags); in iosapic_write()
169 if ((unsigned) (gsi - iosapic_lists[i].gsi_base) < in find_iosapic()
174 return -1; in find_iosapic()
185 list_for_each_entry(rte, &info->rtes, rte_list) in __gsi_to_irq()
186 if (rte->iosapic->gsi_base + rte->rte_index == gsi) in __gsi_to_irq()
189 return -1; in __gsi_to_irq()
209 if (rte->iosapic->gsi_base + rte->rte_index == gsi) in find_rte()
230 rte_index = rte->rte_index; in set_rte()
250 iosapic_write(rte->iosapic, IOSAPIC_RTE_HIGH(rte_index), high32); in set_rte()
251 iosapic_write(rte->iosapic, IOSAPIC_RTE_LOW(rte_index), low32); in set_rte()
275 list_for_each_entry(rte, &info->rtes, in kexec_disable_iosapic()
277 iosapic_write(rte->iosapic, in kexec_disable_iosapic()
278 IOSAPIC_RTE_LOW(rte->rte_index), in kexec_disable_iosapic()
280 iosapic_eoi(rte->iosapic->addr, vec); in kexec_disable_iosapic()
289 unsigned int irq = data->irq; in mask_irq()
300 rte_index = rte->rte_index; in mask_irq()
301 iosapic_write(rte->iosapic, IOSAPIC_RTE_LOW(rte_index), low32); in mask_irq()
308 unsigned int irq = data->irq; in unmask_irq()
318 rte_index = rte->rte_index; in unmask_irq()
319 iosapic_write(rte->iosapic, IOSAPIC_RTE_LOW(rte_index), low32); in unmask_irq()
329 unsigned int irq = data->irq; in iosapic_set_affinity()
340 return -1; in iosapic_set_affinity()
343 return -1; in iosapic_set_affinity()
348 return -1; /* not an IOSAPIC interrupt */ in iosapic_set_affinity()
368 iosapic = rte->iosapic; in iosapic_set_affinity()
369 rte_index = rte->rte_index; in iosapic_set_affinity()
379 * Handlers for level-triggered interrupts.
392 unsigned int irq = data->irq; in iosapic_unmask_level_irq()
405 iosapic_eoi(rte->iosapic->addr, vec); in iosapic_unmask_level_irq()
419 .name = "IO-SAPIC-level",
431 * Handlers for edge-triggered interrupts.
449 irq_complete_move(data->irq); in iosapic_ack_edge_irq()
457 .name = "IO-SAPIC-edge",
485 int i, irq = -ENOSPC, min_count = -1; in iosapic_find_sharable_irq()
489 * shared vectors for edge-triggered interrupts are not in iosapic_find_sharable_irq()
493 return -EINVAL; in iosapic_find_sharable_irq()
497 if (info->trigger == trigger && info->polarity == pol && in iosapic_find_sharable_irq()
498 (info->dmode == IOSAPIC_FIXED || in iosapic_find_sharable_irq()
499 info->dmode == IOSAPIC_LOWEST_PRIORITY) && in iosapic_find_sharable_irq()
501 if (min_count == -1 || info->count < min_count) { in iosapic_find_sharable_irq()
503 min_count = info->count; in iosapic_find_sharable_irq()
563 return -ENODEV; in register_intr()
572 return -ENOMEM; in register_intr()
575 rte->iosapic = &iosapic_lists[index]; in register_intr()
576 rte->rte_index = gsi - rte->iosapic->gsi_base; in register_intr()
577 rte->refcnt++; in register_intr()
578 list_add_tail(&rte->rte_list, &iosapic_intr_info[irq].rtes); in register_intr()
582 else if (rte->refcnt == NO_REF_RTE) { in register_intr()
584 if (info->count > 0 && in register_intr()
585 (info->trigger != trigger || info->polarity != polarity)){ in register_intr()
589 return -EINVAL; in register_intr()
591 rte->refcnt++; in register_intr()
608 chip->name, irq_type->name); in register_intr()
621 static int cpu = -1; in get_target_cpu()
640 * Some interrupts (ACPI SCI, for instance) are registered in get_target_cpu()
682 * Otherwise, round-robin interrupt vectors across all the in get_target_cpu()
735 } else if (rte->refcnt != NO_REF_RTE) { in iosapic_register_intr()
736 rte->refcnt++; in iosapic_register_intr()
750 raw_spin_lock(&desc->lock); in iosapic_register_intr()
755 raw_spin_unlock(&desc->lock); in iosapic_register_intr()
769 printk(KERN_INFO "GSI %u (%s, %s) -> CPU %d (0x%04x) vector %d\n", in iosapic_register_intr()
774 raw_spin_unlock(&desc->lock); in iosapic_register_intr()
811 if (--rte->refcnt > 0) in iosapic_unregister_intr()
814 rte->refcnt = NO_REF_RTE; in iosapic_unregister_intr()
818 iosapic_write(rte->iosapic, IOSAPIC_RTE_LOW(rte->rte_index), low32); in iosapic_unregister_intr()
820 iosapic_intr_info[irq].count--; in iosapic_unregister_intr()
822 iosapic_lists[index].rtes_inuse--; in iosapic_unregister_intr()
829 "GSI %u (%s, %s) -> CPU %d (0x%04x) vector %d unregistered\n", in iosapic_unregister_intr()
893 return -1; in iosapic_register_platform_intr()
899 "PLATFORM int %s (0x%x): GSI %u (%s, %s) -> CPU %d (0x%04x)" in iosapic_register_platform_intr()
925 DBG("ISA: IRQ %u -> GSI %u (%s,%s) -> CPU %d (0x%04x) vector %d\n", in iosapic_override_isa_irq()
942 "%s: Disabling PC-AT compatible 8259 interrupts\n", in ia64_native_iosapic_pcat_compat_init()
977 return -1; in iosapic_alloc()
999 end = base + iosapic_lists[index].num_rte - 1; in iosapic_check_gsi_range()
1004 return -EBUSY; in iosapic_check_gsi_range()
1016 if (rte->iosapic->gsi_base + rte->rte_index == gsi) { in iosapic_delete_rte()
1017 if (rte->refcnt) in iosapic_delete_rte()
1018 return -EBUSY; in iosapic_delete_rte()
1020 list_del(&rte->rte_list); in iosapic_delete_rte()
1026 return -EINVAL; in iosapic_delete_rte()
1040 return -EBUSY; in iosapic_init()
1046 return -ENOMEM; in iosapic_init()
1100 err = -EBUSY; in iosapic_remove()