Lines Matching refs:ioapic
107 static struct ioapic { struct
138 static inline int mp_ioapic_pin_count(int ioapic) in mp_ioapic_pin_count() argument
140 struct mp_ioapic_gsi *gsi_cfg = mp_ioapic_gsi_routing(ioapic); in mp_ioapic_pin_count()
145 static inline u32 mp_pin_to_gsi(int ioapic, int pin) in mp_pin_to_gsi() argument
147 return mp_ioapic_gsi_routing(ioapic)->gsi_base + pin; in mp_pin_to_gsi()
155 static inline struct irq_domain *mp_ioapic_irqdomain(int ioapic) in mp_ioapic_irqdomain() argument
157 return ioapics[ioapic].irqdomain; in mp_ioapic_irqdomain()
767 int ioapic, pin, idx; in __acpi_get_override_irq() local
772 ioapic = mp_find_ioapic(gsi); in __acpi_get_override_irq()
773 if (ioapic < 0) in __acpi_get_override_irq()
776 pin = mp_find_ioapic_pin(ioapic, gsi); in __acpi_get_override_irq()
780 idx = find_irq_entry(ioapic, pin, mp_INT); in __acpi_get_override_irq()
803 info->ioapic.node = node; in ioapic_set_alloc_attr()
804 info->ioapic.is_level = trigger; in ioapic_set_alloc_attr()
805 info->ioapic.active_low = polarity; in ioapic_set_alloc_attr()
806 info->ioapic.valid = 1; in ioapic_set_alloc_attr()
818 dst->ioapic.pin = pin; in ioapic_copy_alloc_attr()
819 dst->ioapic.valid = 1; in ioapic_copy_alloc_attr()
820 if (src && src->ioapic.valid) { in ioapic_copy_alloc_attr()
821 dst->ioapic.node = src->ioapic.node; in ioapic_copy_alloc_attr()
822 dst->ioapic.is_level = src->ioapic.is_level; in ioapic_copy_alloc_attr()
823 dst->ioapic.active_low = src->ioapic.active_low; in ioapic_copy_alloc_attr()
825 dst->ioapic.node = NUMA_NO_NODE; in ioapic_copy_alloc_attr()
827 dst->ioapic.is_level = level; in ioapic_copy_alloc_attr()
828 dst->ioapic.active_low = pol_low; in ioapic_copy_alloc_attr()
834 dst->ioapic.is_level = true; in ioapic_copy_alloc_attr()
835 dst->ioapic.active_low = true; in ioapic_copy_alloc_attr()
842 return (info && info->ioapic.valid) ? info->ioapic.node : NUMA_NO_NODE; in ioapic_alloc_attr_node()
872 if (info->ioapic.is_level != data->is_level) in mp_check_pin_attr()
873 mp_register_handler(irq, info->ioapic.is_level); in mp_check_pin_attr()
874 data->entry.is_level = data->is_level = info->ioapic.is_level; in mp_check_pin_attr()
875 data->entry.active_low = data->active_low = info->ioapic.active_low; in mp_check_pin_attr()
878 return data->is_level == info->ioapic.is_level && in mp_check_pin_attr()
879 data->active_low == info->ioapic.active_low; in mp_check_pin_attr()
882 static int alloc_irq_from_domain(struct irq_domain *domain, int ioapic, u32 gsi, in alloc_irq_from_domain() argument
885 int type = ioapics[ioapic].irqdomain_cfg.type; in alloc_irq_from_domain()
923 static int alloc_isa_irq_from_domain(struct irq_domain *domain, int irq, int ioapic, int pin, in alloc_isa_irq_from_domain() argument
938 if (!add_pin_to_irq_node(irq_data->chip_data, node, ioapic, info->ioapic.pin)) in alloc_isa_irq_from_domain()
953 static int mp_map_pin_to_irq(u32 gsi, int idx, int ioapic, int pin, in mp_map_pin_to_irq() argument
956 struct irq_domain *domain = mp_ioapic_irqdomain(ioapic); in mp_map_pin_to_irq()
988 ioapic_copy_alloc_attr(&tmp, info, gsi, ioapic, pin); in mp_map_pin_to_irq()
991 ioapic, pin, &tmp); in mp_map_pin_to_irq()
993 irq = alloc_irq_from_domain(domain, ioapic, gsi, &tmp); in mp_map_pin_to_irq()
1004 static int pin_2_irq(int idx, int ioapic, int pin, unsigned int flags) in pin_2_irq() argument
1006 u32 gsi = mp_pin_to_gsi(ioapic, pin); in pin_2_irq()
1028 return mp_map_pin_to_irq(gsi, idx, ioapic, pin, flags, NULL); in pin_2_irq()
1033 int ioapic, pin, idx; in mp_map_gsi_to_irq() local
1035 ioapic = mp_find_ioapic(gsi); in mp_map_gsi_to_irq()
1036 if (ioapic < 0) in mp_map_gsi_to_irq()
1039 pin = mp_find_ioapic_pin(ioapic, gsi); in mp_map_gsi_to_irq()
1040 idx = find_irq_entry(ioapic, pin, mp_INT); in mp_map_gsi_to_irq()
1044 return mp_map_pin_to_irq(gsi, idx, ioapic, pin, flags, info); in mp_map_gsi_to_irq()
1128 unsigned int ioapic, pin; in setup_IO_APIC_irqs() local
1133 for_each_ioapic_pin(ioapic, pin) { in setup_IO_APIC_irqs()
1134 idx = find_irq_entry(ioapic, pin, mp_INT); in setup_IO_APIC_irqs()
1137 mpc_ioapic_id(ioapic), pin); in setup_IO_APIC_irqs()
1139 pin_2_irq(idx, ioapic, pin, ioapic ? 0 : IOAPIC_MAP_ALLOC); in setup_IO_APIC_irqs()
2009 static int __init mp_alloc_timer_irq(int ioapic, int pin) in mp_alloc_timer_irq() argument
2011 struct irq_domain *domain = mp_ioapic_irqdomain(ioapic); in mp_alloc_timer_irq()
2018 info.devid = mpc_ioapic_id(ioapic); in mp_alloc_timer_irq()
2019 info.ioapic.pin = pin; in mp_alloc_timer_irq()
2021 irq = alloc_isa_irq_from_domain(domain, 0, ioapic, pin, &info); in mp_alloc_timer_irq()
2213 static int mp_irqdomain_create(int ioapic) in mp_irqdomain_create() argument
2215 struct mp_ioapic_gsi *gsi_cfg = mp_ioapic_gsi_routing(ioapic); in mp_irqdomain_create()
2216 int hwirqs = mp_ioapic_pin_count(ioapic); in mp_irqdomain_create()
2217 struct ioapic *ip = &ioapics[ioapic]; in mp_irqdomain_create()
2230 fn = irq_domain_alloc_named_id_fwnode("IO-APIC", mpc_ioapic_id(ioapic)); in mp_irqdomain_create()
2237 fwspec.param[0] = mpc_ioapic_id(ioapic); in mp_irqdomain_create()
2247 (void *)(long)ioapic); in mp_irqdomain_create()
2276 int ioapic; in setup_IO_APIC() local
2284 for_each_ioapic(ioapic) in setup_IO_APIC()
2285 BUG_ON(mp_irqdomain_create(ioapic)); in setup_IO_APIC()
2335 static int io_apic_get_redir_entries(int ioapic) in io_apic_get_redir_entries() argument
2340 reg_01.raw = io_apic_read(ioapic, 1); in io_apic_get_redir_entries()
2369 static int io_apic_get_unique_id(int ioapic, int apic_id) in io_apic_get_unique_id() argument
2381 reg_00.raw = io_apic_read(ioapic, 0); in io_apic_get_unique_id()
2385 ioapic, apic_id, reg_00.bits.ID); in io_apic_get_unique_id()
2399 pr_warn("IOAPIC[%d]: apic_id %d already used, trying %d\n", ioapic, apic_id, i); in io_apic_get_unique_id()
2409 io_apic_write(ioapic, 0, reg_00.raw); in io_apic_get_unique_id()
2410 reg_00.raw = io_apic_read(ioapic, 0); in io_apic_get_unique_id()
2415 pr_err("IOAPIC[%d]: Unable to change apic_id!\n", ioapic); in io_apic_get_unique_id()
2420 apic_pr_verbose("IOAPIC[%d]: Assigned apic_id %d\n", ioapic, apic_id); in io_apic_get_unique_id()
2475 static int io_apic_get_version(int ioapic) in io_apic_get_version() argument
2480 reg_01.raw = io_apic_read(ioapic, 1); in io_apic_get_version()
2621 int mp_find_ioapic_pin(int ioapic, u32 gsi) in mp_find_ioapic_pin() argument
2625 if (WARN_ON(ioapic < 0)) in mp_find_ioapic_pin()
2628 gsi_cfg = mp_ioapic_gsi_routing(ioapic); in mp_find_ioapic_pin()
2674 int idx, ioapic, entries; in mp_register_ioapic() local
2682 for_each_ioapic(ioapic) { in mp_register_ioapic()
2683 if (ioapics[ioapic].mp_config.apicaddr == address) { in mp_register_ioapic()
2684 pr_warn("address 0x%x conflicts with IOAPIC%d\n", address, ioapic); in mp_register_ioapic()
2715 for_each_ioapic(ioapic) { in mp_register_ioapic()
2716 gsi_cfg = mp_ioapic_gsi_routing(ioapic); in mp_register_ioapic()
2764 int ioapic, pin; in mp_unregister_ioapic() local
2767 for_each_ioapic(ioapic) { in mp_unregister_ioapic()
2768 if (ioapics[ioapic].gsi_config.gsi_base == gsi_base) { in mp_unregister_ioapic()
2779 for_each_pin(ioapic, pin) { in mp_unregister_ioapic()
2780 u32 gsi = mp_pin_to_gsi(ioapic, pin); in mp_unregister_ioapic()
2787 pr_warn("pin%d on IOAPIC%d is still in use.\n", pin, ioapic); in mp_unregister_ioapic()
2794 ioapics[ioapic].nr_registers = 0; in mp_unregister_ioapic()
2795 ioapic_destroy_irqdomain(ioapic); in mp_unregister_ioapic()
2796 free_ioapic_saved_registers(ioapic); in mp_unregister_ioapic()
2797 if (ioapics[ioapic].iomem_res) in mp_unregister_ioapic()
2798 release_resource(ioapics[ioapic].iomem_res); in mp_unregister_ioapic()
2799 clear_fixmap(FIX_IO_APIC_BASE_0 + ioapic); in mp_unregister_ioapic()
2800 memset(&ioapics[ioapic], 0, sizeof(ioapics[ioapic])); in mp_unregister_ioapic()
2807 int ioapic; in mp_ioapic_registered() local
2809 for_each_ioapic(ioapic) in mp_ioapic_registered()
2810 if (ioapics[ioapic].gsi_config.gsi_base == gsi_base) in mp_ioapic_registered()
2819 if (info && info->ioapic.valid) { in mp_irqdomain_get_attr()
2820 data->is_level = info->ioapic.is_level; in mp_irqdomain_get_attr()
2821 data->active_low = info->ioapic.active_low; in mp_irqdomain_get_attr()
2861 int ret, ioapic, pin; in mp_irqdomain_alloc() local
2870 ioapic = mp_irqdomain_ioapic_idx(domain); in mp_irqdomain_alloc()
2871 pin = info->ioapic.pin; in mp_irqdomain_alloc()
2884 irq_data->hwirq = info->ioapic.pin; in mp_irqdomain_alloc()
2888 mp_irqdomain_get_attr(mp_pin_to_gsi(ioapic, pin), data, info); in mp_irqdomain_alloc()
2890 if (!add_pin_to_irq_node(data, ioapic_alloc_attr_node(info), ioapic, pin)) { in mp_irqdomain_alloc()
2904 ioapic, mpc_ioapic_id(ioapic), pin, virq, data->is_level, data->active_low); in mp_irqdomain_alloc()