Lines Matching +full:reserved +full:- +full:ipi +full:- +full:vectors

6  * Copyright (C) 2008 Ralf Baechle (ralf@linux-mips.org)
7 * Copyright (C) 2012 MIPS Technologies, Inc. All rights reserved.
10 #define pr_fmt(fmt) "irq-mips-gic: " fmt
24 #include <asm/mips-cps.h>
28 #include <dt-bindings/interrupt-controller/mips-gic.h>
42 #define GIC_HWIRQ_TO_LOCAL(x) ((x) - GIC_LOCAL_HWIRQ_BASE)
45 #define GIC_HWIRQ_TO_SHARED(x) ((x) - GIC_SHARED_HWIRQ_BASE)
102 irq -= GIC_PIN_TO_VEC_OFFSET; in gic_bind_eic_interrupt()
128 return -1; in gic_get_c0_perfcount_int()
140 return -1; in gic_get_c0_fdc_int()
154 /* Get per-cpu bitmaps */ in gic_handle_shared_int()
178 unsigned int intr = GIC_HWIRQ_TO_SHARED(d->hwirq); in gic_mask_irq()
186 unsigned int intr = GIC_HWIRQ_TO_SHARED(d->hwirq); in gic_unmask_irq()
198 unsigned int irq = GIC_HWIRQ_TO_SHARED(d->hwirq); in gic_ack_irq()
208 irq = GIC_HWIRQ_TO_SHARED(d->hwirq); in gic_set_type()
259 unsigned int irq = GIC_HWIRQ_TO_SHARED(d->hwirq); in gic_set_affinity()
265 return -EINVAL; in gic_set_affinity()
270 /* Re-route this IRQ */ in gic_set_affinity()
329 int intr = GIC_HWIRQ_TO_LOCAL(d->hwirq); in gic_mask_local_irq()
336 int intr = GIC_HWIRQ_TO_LOCAL(d->hwirq); in gic_unmask_local_irq()
353 intr = GIC_HWIRQ_TO_LOCAL(d->hwirq); in gic_mask_local_irq_all_vpes()
355 cd->mask = false; in gic_mask_local_irq_all_vpes()
371 intr = GIC_HWIRQ_TO_LOCAL(d->hwirq); in gic_unmask_local_irq_all_vpes()
373 cd->mask = true; in gic_unmask_local_irq_all_vpes()
388 intr = GIC_HWIRQ_TO_LOCAL(d->hwirq); in gic_all_vpes_irq_cpu_online()
391 write_gic_vl_map(mips_gic_vx_map_reg(intr), cd->map); in gic_all_vpes_irq_cpu_online()
392 if (cd->mask) in gic_all_vpes_irq_cpu_online()
439 return -EINVAL; in gic_irq_domain_xlate()
446 return -EINVAL; in gic_irq_domain_xlate()
462 /* verify that shared irqs don't conflict with an IPI irq */ in gic_irq_domain_map()
464 return -EBUSY; in gic_irq_domain_map()
492 cd->map = map; in gic_irq_domain_map()
515 return -EPERM; in gic_irq_domain_map()
533 if (fwspec->param[0] == GIC_SHARED) in gic_irq_domain_alloc()
534 hwirq = GIC_SHARED_TO_HWIRQ(fwspec->param[1]); in gic_irq_domain_alloc()
536 hwirq = GIC_LOCAL_TO_HWIRQ(fwspec->param[1]); in gic_irq_domain_alloc()
577 return -ENOMEM; in gic_ipi_domain_alloc()
582 return -EBUSY; in gic_ipi_domain_alloc()
597 ret = irq_domain_set_hwirq_and_chip(d->parent, virq + i, hwirq, in gic_ipi_domain_alloc()
641 is_ipi = d->bus_token == bus_token; in gic_ipi_domain_match()
642 return (!node || to_of_node(d->fwnode) == node) && is_ipi; in gic_ipi_domain_match()
675 unsigned long reserved; in gic_of_init() local
682 reserved = (C_SW0 | C_SW1) >> __ffs(C_SW0); in gic_of_init()
683 while (!of_property_read_u32_index(node, "mti,reserved-cpu-vectors", in gic_of_init()
685 reserved |= BIT(cpu_vec); in gic_of_init()
687 cpu_vec = find_first_zero_bit(&reserved, hweight_long(ST0_IM)); in gic_of_init()
689 pr_err("No CPU vectors available\n"); in gic_of_init()
690 return -ENODEV; in gic_of_init()
696 * in the device-tree. in gic_of_init()
706 return -ENODEV; in gic_of_init()
733 gic_cpu_pin = cpu_vec - GIC_CPU_PIN_OFFSET; in gic_of_init()
739 * waiting poll loop. We must not re-route those CPU's local in gic_of_init()
764 return -ENXIO; in gic_of_init()
772 pr_err("Failed to add IPI domain"); in gic_of_init()
773 return -ENXIO; in gic_of_init()
779 !of_property_read_u32_array(node, "mti,reserved-ipi-vectors", v, 2)) { in gic_of_init()
787 bitmap_set(ipi_resrv, gic_shared_intrs - num_ipis, num_ipis); in gic_of_init()