Lines Matching refs:apic
42 static struct { int pin, apic; } ioapic_i8259 = { -1, -1 }; member
64 #define ioapic_has_eoi_reg(apic) (mp_ioapics[(apic)].mpc_apicver >= 0x20) argument
66 static int apic_pin_2_gsi_irq(int apic, int pin);
102 int apic, pin; member
113 static void add_pin_to_irq(unsigned int irq, int apic, int pin) in add_pin_to_irq() argument
118 BUG_ON((entry->apic == apic) && (entry->pin == pin)); in add_pin_to_irq()
122 BUG_ON((entry->apic == apic) && (entry->pin == pin)); in add_pin_to_irq()
132 entry->apic = apic; in add_pin_to_irq()
134 share_vector_maps(irq_2_pin[irq].apic, apic); in add_pin_to_irq()
137 static void remove_pin_from_irq(unsigned int irq, int apic, int pin) in remove_pin_from_irq() argument
142 if ((entry->apic == apic) && (entry->pin == pin)) in remove_pin_from_irq()
147 entry->pin = entry->apic = -1; in remove_pin_from_irq()
160 entry->pin = entry->apic = -1; in remove_pin_from_irq()
178 if (entry->apic == oldapic && entry->pin == oldpin) { in replace_pin_at_irq()
179 entry->apic = newapic; in replace_pin_at_irq()
196 return vector_map[entry->apic]; in io_apic_get_used_vector_map()
201 int apic; in alloc_ioapic_entries() local
208 for (apic = 0; apic < nr_ioapics; apic++) { in alloc_ioapic_entries()
209 ioapic_entries[apic] = in alloc_ioapic_entries()
211 nr_ioapic_entries[apic]); in alloc_ioapic_entries()
212 if (!ioapic_entries[apic] && nr_ioapic_entries[apic]) in alloc_ioapic_entries()
219 while (--apic >= 0) in alloc_ioapic_entries()
220 xfree(ioapic_entries[apic]); in alloc_ioapic_entries()
232 unsigned int apic, unsigned int pin, bool raw) in __ioapic_read_entry() argument
237 eu.w1 = (*read)(apic, 0x10 + 2 * pin); in __ioapic_read_entry()
238 eu.w2 = (*read)(apic, 0x11 + 2 * pin); in __ioapic_read_entry()
243 unsigned int apic, unsigned int pin, bool raw) in ioapic_read_entry() argument
249 entry = __ioapic_read_entry(apic, pin, raw); in ioapic_read_entry()
255 unsigned int apic, unsigned int pin, bool raw, in __ioapic_write_entry() argument
262 (*write)(apic, 0x11 + 2*pin, eu.w2); in __ioapic_write_entry()
263 (*write)(apic, 0x10 + 2*pin, eu.w1); in __ioapic_write_entry()
267 unsigned int apic, unsigned int pin, bool raw, in ioapic_write_entry() argument
272 __ioapic_write_entry(apic, pin, raw, e); in ioapic_write_entry()
281 static void __io_apic_eoi(unsigned int apic, unsigned int vector, unsigned int pin) in __io_apic_eoi() argument
284 if ( ioapic_has_eoi_reg(apic) ) in __io_apic_eoi()
288 vector = __ioapic_read_entry(apic, pin, TRUE).vector; in __io_apic_eoi()
290 *(IO_APIC_BASE(apic)+16) = vector; in __io_apic_eoi()
299 entry = __ioapic_read_entry(apic, pin, TRUE); in __io_apic_eoi()
306 __ioapic_write_entry(apic, pin, TRUE, entry); in __io_apic_eoi()
312 __ioapic_write_entry(apic, pin, TRUE, entry); in __io_apic_eoi()
314 __ioapic_write_entry(apic, pin, TRUE, entry); in __io_apic_eoi()
320 __ioapic_write_entry(apic, pin, TRUE, entry); in __io_apic_eoi()
330 int apic, pin; in save_IO_APIC_setup() local
335 for (apic = 0; apic < nr_ioapics; apic++) { in save_IO_APIC_setup()
336 if (!nr_ioapic_entries[apic]) in save_IO_APIC_setup()
339 if (!ioapic_entries[apic]) in save_IO_APIC_setup()
342 for (pin = 0; pin < nr_ioapic_entries[apic]; pin++) in save_IO_APIC_setup()
343 ioapic_entries[apic][pin] = __ioapic_read_entry(apic, pin, 1); in save_IO_APIC_setup()
354 int apic, pin; in mask_IO_APIC_setup() local
359 for (apic = 0; apic < nr_ioapics; apic++) { in mask_IO_APIC_setup()
360 if (!nr_ioapic_entries[apic]) in mask_IO_APIC_setup()
363 if (!ioapic_entries[apic]) in mask_IO_APIC_setup()
366 for (pin = 0; pin < nr_ioapic_entries[apic]; pin++) { in mask_IO_APIC_setup()
369 entry = ioapic_entries[apic][pin]; in mask_IO_APIC_setup()
373 ioapic_write_entry(apic, pin, 1, entry); in mask_IO_APIC_setup()
384 int apic, pin; in restore_IO_APIC_setup() local
389 for (apic = 0; apic < nr_ioapics; apic++) { in restore_IO_APIC_setup()
390 if (!nr_ioapic_entries[apic]) in restore_IO_APIC_setup()
393 if (!ioapic_entries[apic]) in restore_IO_APIC_setup()
396 for (pin = 0; pin < nr_ioapic_entries[apic]; pin++) in restore_IO_APIC_setup()
397 ioapic_write_entry(apic, pin, 1, ioapic_entries[apic][pin]); in restore_IO_APIC_setup()
405 int apic; in free_ioapic_entries() local
407 for (apic = 0; apic < nr_ioapics; apic++) in free_ioapic_entries()
408 xfree(ioapic_entries[apic]); in free_ioapic_entries()
422 reg = io_apic_read(entry->apic, 0x10 + pin*2); in __modify_IO_APIC_irq()
425 io_apic_modify(entry->apic, 0x10 + pin*2, reg); in __modify_IO_APIC_irq()
483 __io_apic_eoi(entry->apic, vector, pin); in __eoi_IO_APIC_irq()
498 static void clear_IO_APIC_pin(unsigned int apic, unsigned int pin) in clear_IO_APIC_pin() argument
503 entry = __ioapic_read_entry(apic, pin, FALSE); in clear_IO_APIC_pin()
513 __ioapic_write_entry(apic, pin, FALSE, entry); in clear_IO_APIC_pin()
515 entry = __ioapic_read_entry(apic, pin, TRUE); in clear_IO_APIC_pin()
521 __ioapic_write_entry(apic, pin, TRUE, entry); in clear_IO_APIC_pin()
523 __io_apic_eoi(apic, entry.vector, pin); in clear_IO_APIC_pin()
531 __ioapic_write_entry(apic, pin, TRUE, entry); in clear_IO_APIC_pin()
533 entry = __ioapic_read_entry(apic, pin, TRUE); in clear_IO_APIC_pin()
536 IO_APIC_ID(apic), pin); in clear_IO_APIC_pin()
541 int apic, pin; in clear_IO_APIC() local
543 for (apic = 0; apic < nr_ioapics; apic++) { in clear_IO_APIC()
544 for (pin = 0; pin < nr_ioapic_entries[apic]; pin++) in clear_IO_APIC()
545 clear_IO_APIC_pin(apic, pin); in clear_IO_APIC()
571 io_apic_write(entry->apic, 0x10 + 1 + pin*2, dest); in set_ioapic_affinity_irq()
572 data = io_apic_read(entry->apic, 0x10 + pin*2); in set_ioapic_affinity_irq()
575 io_apic_modify(entry->apic, 0x10 + pin*2, data); in set_ioapic_affinity_irq()
589 static int find_irq_entry(int apic, int pin, int type) in find_irq_entry() argument
595 (mp_irqs[i].mpc_dstapic == mp_ioapics[apic].mpc_apicid || in find_irq_entry()
643 int apic; in find_isa_irq_apic() local
644 for(apic = 0; apic < nr_ioapics; apic++) { in find_isa_irq_apic()
645 if (!nr_ioapic_entries[apic]) in find_isa_irq_apic()
647 if (mp_ioapics[apic].mpc_apicid == mp_irqs[i].mpc_dstapic) in find_isa_irq_apic()
648 return apic; in find_isa_irq_apic()
659 static int pin_2_irq(int idx, int apic, int pin);
893 static int pin_2_irq(int idx, int apic, int pin) in pin_2_irq() argument
920 while (i < apic) in pin_2_irq()
938 int apic, idx, pin; in IO_APIC_irq_trigger() local
940 for (apic = 0; apic < nr_ioapics; apic++) { in IO_APIC_irq_trigger()
941 for (pin = 0; pin < nr_ioapic_entries[apic]; pin++) { in IO_APIC_irq_trigger()
942 idx = find_irq_entry(apic,pin,mp_INT); in IO_APIC_irq_trigger()
943 if ((idx != -1) && (irq == pin_2_irq(idx,apic,pin))) in IO_APIC_irq_trigger()
979 int apic, pin, idx, irq, first_notcon = 1, vector; in setup_IO_APIC_irqs() local
984 for (apic = 0; apic < nr_ioapics; apic++) { in setup_IO_APIC_irqs()
985 for (pin = 0; pin < nr_ioapic_entries[apic]; pin++) { in setup_IO_APIC_irqs()
997 idx = find_irq_entry(apic,pin,mp_INT); in setup_IO_APIC_irqs()
1002 mp_ioapics[apic].mpc_apicid, in setup_IO_APIC_irqs()
1007 mp_ioapics[apic].mpc_apicid, pin); in setup_IO_APIC_irqs()
1019 irq = pin_2_irq(idx, apic, pin); in setup_IO_APIC_irqs()
1024 if (multi_timer_check(apic, irq)) in setup_IO_APIC_irqs()
1027 add_pin_to_irq(irq, apic, pin); in setup_IO_APIC_irqs()
1043 __ioapic_write_entry(apic, pin, 0, entry); in setup_IO_APIC_irqs()
1056 static void __init setup_ExtINT_IRQ0_pin(unsigned int apic, unsigned int pin, int vector) in setup_ExtINT_IRQ0_pin() argument
1088 ioapic_write_entry(apic, pin, 0, entry); in setup_ExtINT_IRQ0_pin()
1099 int apic, i; in __print_IO_APIC() local
1117 for (apic = 0; apic < nr_ioapics; apic++) { in __print_IO_APIC()
1121 if (!nr_ioapic_entries[apic]) in __print_IO_APIC()
1125 reg_00.raw = io_apic_read(apic, 0); in __print_IO_APIC()
1126 reg_01.raw = io_apic_read(apic, 1); in __print_IO_APIC()
1128 reg_02.raw = io_apic_read(apic, 2); in __print_IO_APIC()
1130 reg_03.raw = io_apic_read(apic, 3); in __print_IO_APIC()
1133 printk(KERN_DEBUG "IO APIC #%d......\n", mp_ioapics[apic].mpc_apicid); in __print_IO_APIC()
1200 entry = ioapic_read_entry(apic, i, 0); in __print_IO_APIC()
1232 printk("-> %d:%d", entry->apic, entry->pin); in __print_IO_APIC()
1259 int i, apic; in enable_IO_APIC() local
1270 for (apic = 0; apic < nr_ioapics; apic++) { in enable_IO_APIC()
1271 if (!nr_ioapic_entries[apic]) in enable_IO_APIC()
1273 vector_map[apic] = xzalloc(vmask_t); in enable_IO_APIC()
1274 BUG_ON(!vector_map[apic]); in enable_IO_APIC()
1279 for (apic = 1; apic < nr_ioapics; apic++) in enable_IO_APIC()
1280 vector_map[apic] = vector_map[0]; in enable_IO_APIC()
1283 for(apic = 0; apic < nr_ioapics; apic++) { in enable_IO_APIC()
1286 for (pin = 0; pin < nr_ioapic_entries[apic]; pin++) { in enable_IO_APIC()
1287 struct IO_APIC_route_entry entry = ioapic_read_entry(apic, pin, 0); in enable_IO_APIC()
1293 ioapic_i8259.apic = apic; in enable_IO_APIC()
1311 ioapic_i8259.apic = i8259_apic; in enable_IO_APIC()
1314 if (((ioapic_i8259.apic != i8259_apic) || (ioapic_i8259.pin != i8259_pin)) && in enable_IO_APIC()
1358 ioapic_write_entry(ioapic_i8259.apic, ioapic_i8259.pin, 0, entry); in disable_IO_APIC()
1374 int apic; in setup_ioapic_ids_from_mpc() local
1396 for (apic = 0; apic < nr_ioapics; apic++) { in setup_ioapic_ids_from_mpc()
1397 if (!nr_ioapic_entries[apic]) in setup_ioapic_ids_from_mpc()
1402 reg_00.raw = io_apic_read(apic, 0); in setup_ioapic_ids_from_mpc()
1405 old_id = mp_ioapics[apic].mpc_apicid; in setup_ioapic_ids_from_mpc()
1407 if (mp_ioapics[apic].mpc_apicid >= get_physical_broadcast()) { in setup_ioapic_ids_from_mpc()
1409 apic, mp_ioapics[apic].mpc_apicid); in setup_ioapic_ids_from_mpc()
1412 mp_ioapics[apic].mpc_apicid = reg_00.bits.ID; in setup_ioapic_ids_from_mpc()
1421 mp_ioapics[apic].mpc_apicid)) { in setup_ioapic_ids_from_mpc()
1423 apic, mp_ioapics[apic].mpc_apicid); in setup_ioapic_ids_from_mpc()
1431 mp_ioapics[apic].mpc_apicid = i; in setup_ioapic_ids_from_mpc()
1435 mp_ioapics[apic].mpc_apicid); in setup_ioapic_ids_from_mpc()
1437 set_apicid(mp_ioapics[apic].mpc_apicid, &phys_id_present_map); in setup_ioapic_ids_from_mpc()
1443 if (old_id != mp_ioapics[apic].mpc_apicid) in setup_ioapic_ids_from_mpc()
1447 = mp_ioapics[apic].mpc_apicid; in setup_ioapic_ids_from_mpc()
1455 mp_ioapics[apic].mpc_apicid); in setup_ioapic_ids_from_mpc()
1457 reg_00.bits.ID = mp_ioapics[apic].mpc_apicid; in setup_ioapic_ids_from_mpc()
1459 io_apic_write(apic, 0, reg_00.raw); in setup_ioapic_ids_from_mpc()
1466 reg_00.raw = io_apic_read(apic, 0); in setup_ioapic_ids_from_mpc()
1468 if (reg_00.bits.ID != mp_ioapics[apic].mpc_apicid) in setup_ioapic_ids_from_mpc()
1620 reg = io_apic_read(entry->apic, 0x10 + pin*2); in io_apic_level_ack_pending()
1829 int apic, pin, i; in unlock_ExtINT_logic() local
1834 apic = find_isa_irq_apic(8, mp_INT); in unlock_ExtINT_logic()
1835 if ( pin == -1 || apic == -1 ) in unlock_ExtINT_logic()
1838 entry0 = ioapic_read_entry(apic, pin, 0); in unlock_ExtINT_logic()
1839 clear_IO_APIC_pin(apic, pin); in unlock_ExtINT_logic()
1851 ioapic_write_entry(apic, pin, 0, entry1); in unlock_ExtINT_logic()
1868 clear_IO_APIC_pin(apic, pin); in unlock_ExtINT_logic()
1870 ioapic_write_entry(apic, pin, 0, entry0); in unlock_ExtINT_logic()
1917 apic2 = ioapic_i8259.apic; in check_timer()
2058 int apic, i; in ioapic_suspend() local
2061 for (apic = 0; apic < nr_ioapics; apic++) { in ioapic_suspend()
2062 for (i = 0; i < nr_ioapic_entries[apic]; i ++, entry ++ ) { in ioapic_suspend()
2063 *(((int *)entry) + 1) = __io_apic_read(apic, 0x11 + 2 * i); in ioapic_suspend()
2064 *(((int *)entry) + 0) = __io_apic_read(apic, 0x10 + 2 * i); in ioapic_suspend()
2075 int i, apic; in ioapic_resume() local
2078 for (apic = 0; apic < nr_ioapics; apic++){ in ioapic_resume()
2079 if (!nr_ioapic_entries[apic]) in ioapic_resume()
2081 reg_00.raw = __io_apic_read(apic, 0); in ioapic_resume()
2082 if (reg_00.bits.ID != mp_ioapics[apic].mpc_apicid) { in ioapic_resume()
2083 reg_00.bits.ID = mp_ioapics[apic].mpc_apicid; in ioapic_resume()
2084 __io_apic_write(apic, 0, reg_00.raw); in ioapic_resume()
2086 for (i = 0; i < nr_ioapic_entries[apic]; i++, entry++) { in ioapic_resume()
2087 __io_apic_write(apic, 0x11+2*i, *(((int *)entry)+1)); in ioapic_resume()
2088 __io_apic_write(apic, 0x10+2*i, *(((int *)entry)+0)); in ioapic_resume()
2268 int apic; in ioapic_physbase_to_id() local
2269 for ( apic = 0; apic < nr_ioapics; apic++ ) in ioapic_physbase_to_id()
2271 if ( !nr_ioapic_entries[apic] ) in ioapic_physbase_to_id()
2273 if ( mp_ioapics[apic].mpc_apicaddr == physbase ) in ioapic_physbase_to_id()
2274 return apic; in ioapic_physbase_to_id()
2279 static int apic_pin_2_gsi_irq(int apic, int pin) in apic_pin_2_gsi_irq() argument
2283 if (apic < 0) in apic_pin_2_gsi_irq()
2286 idx = find_irq_entry(apic, pin, mp_INT); in apic_pin_2_gsi_irq()
2288 return idx >= 0 ? pin_2_irq(idx, apic, pin) in apic_pin_2_gsi_irq()
2289 : io_apic_gsi_base(apic) + pin; in apic_pin_2_gsi_irq()
2294 int apic; in ioapic_guest_read() local
2297 if ( (apic = ioapic_physbase_to_id(physbase)) < 0 ) in ioapic_guest_read()
2298 return apic; in ioapic_guest_read()
2301 *pval = io_apic_read(apic, reg); in ioapic_guest_read()
2311 apic, pin, irq, *(u32 *)&rte, ##a )
2315 int apic, pin, irq, ret, pirq; in ioapic_guest_write() local
2320 if ( (apic = ioapic_physbase_to_id(physbase)) < 0 ) in ioapic_guest_write()
2321 return apic; in ioapic_guest_write()
2343 printk(" APIC=%d/%d, lo-reg=%x\n", apic, pin, val); in ioapic_guest_write()
2354 irq = apic_pin_2_gsi_irq(apic, pin); in ioapic_guest_write()
2378 ret = io_apic_read(apic, 0x10 + 2 * pin); in ioapic_guest_write()
2393 add_pin_to_irq(irq, apic, pin); in ioapic_guest_write()
2400 remove_pin_from_irq(irq, apic, pin); in ioapic_guest_write()
2430 __ioapic_write_entry(apic, pin, 0, rte); in ioapic_guest_write()
2481 printk(" Apic 0x%02x, Pin %2d: ", entry->apic, pin); in dump_ioapic_irq_info()
2483 rte = ioapic_read_entry(entry->apic, pin, 0); in dump_ioapic_irq_info()