Lines Matching +full:low +full:- +full:level

1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
64 int acnt; /* sum of pin asserts (+1) and deasserts (-1) */
68 #define VIOAPIC_LOCK(vioapic) mtx_lock_spin(&((vioapic)->mtx))
69 #define VIOAPIC_UNLOCK(vioapic) mtx_unlock_spin(&((vioapic)->mtx))
70 #define VIOAPIC_LOCKED(vioapic) mtx_owned(&((vioapic)->mtx))
75 VM_CTR1((vioapic)->vm, fmt, a1)
78 VM_CTR2((vioapic)->vm, fmt, a1, a2)
81 VM_CTR3((vioapic)->vm, fmt, a1, a2, a3)
84 VM_CTR4((vioapic)->vm, fmt, a1, a2, a3, a4)
102 uint32_t low, high, dest; in vioapic_send_intr() local
103 bool level, phys; in vioapic_send_intr() local
111 low = vioapic->rtbl[pin].reg; in vioapic_send_intr()
112 high = vioapic->rtbl[pin].reg >> 32; in vioapic_send_intr()
114 if ((low & IOART_INTMASK) == IOART_INTMSET) { in vioapic_send_intr()
119 phys = ((low & IOART_DESTMOD) == IOART_DESTPHY); in vioapic_send_intr()
120 delmode = low & IOART_DELMOD; in vioapic_send_intr()
121 level = low & IOART_TRGRLVL ? true : false; in vioapic_send_intr()
122 if (level) { in vioapic_send_intr()
123 if ((low & IOART_REM_IRR) != 0) { in vioapic_send_intr()
128 vioapic->rtbl[pin].reg |= IOART_REM_IRR; in vioapic_send_intr()
131 vector = low & IOART_INTVEC; in vioapic_send_intr()
133 vlapic_deliver_intr(vioapic->vm, level, dest, phys, delmode, vector); in vioapic_send_intr()
148 oldcnt = vioapic->rtbl[pin].acnt; in vioapic_set_pinstate()
150 vioapic->rtbl[pin].acnt++; in vioapic_set_pinstate()
152 vioapic->rtbl[pin].acnt--; in vioapic_set_pinstate()
153 newcnt = vioapic->rtbl[pin].acnt; in vioapic_set_pinstate()
233 * Reset the vlapic's trigger-mode register to reflect the ioapic pin
241 uint32_t low, high, dest; in vioapic_update_tmr() local
243 bool level, phys; in vioapic_update_tmr() local
250 * Reset all vectors to be edge-triggered. in vioapic_update_tmr()
254 low = vioapic->rtbl[pin].reg; in vioapic_update_tmr()
255 high = vioapic->rtbl[pin].reg >> 32; in vioapic_update_tmr()
257 level = low & IOART_TRGRLVL ? true : false; in vioapic_update_tmr()
258 if (!level) in vioapic_update_tmr()
262 * For a level-triggered 'pin' let the vlapic figure out if in vioapic_update_tmr()
265 * TMR bit associated with this vector to level-triggered. in vioapic_update_tmr()
267 phys = ((low & IOART_DESTMOD) == IOART_DESTPHY); in vioapic_update_tmr()
268 delmode = low & IOART_DELMOD; in vioapic_update_tmr()
269 vector = low & IOART_INTVEC; in vioapic_update_tmr()
284 return (vioapic->id); in vioapic_read()
287 return (((REDIR_ENTRIES - 1) << MAXREDIRSHIFT) | 0x11); in vioapic_read()
290 return (vioapic->id); in vioapic_read()
299 pin = (regnum - IOAPIC_REDTBL) / 2; in vioapic_read()
300 if ((regnum - IOAPIC_REDTBL) % 2) in vioapic_read()
305 return (vioapic->rtbl[pin].reg >> rshift); in vioapic_read()
323 vioapic->id = data & APIC_ID_MASK; in vioapic_write()
336 pin = (regnum - IOAPIC_REDTBL) / 2; in vioapic_write()
337 if ((regnum - IOAPIC_REDTBL) % 2) in vioapic_write()
342 last = vioapic->rtbl[pin].reg; in vioapic_write()
346 vioapic->rtbl[pin].reg &= ~mask64 | RTBL_RO_BITS; in vioapic_write()
347 vioapic->rtbl[pin].reg |= data64 & ~RTBL_RO_BITS; in vioapic_write()
350 * Switching from level to edge triggering will clear the IRR in vioapic_write()
352 * interrupt when the IO-APIC doesn't support targeted EOI (see in vioapic_write()
355 if ((vioapic->rtbl[pin].reg & IOART_TRGRMOD) == IOART_TRGREDG && in vioapic_write()
356 (vioapic->rtbl[pin].reg & IOART_REM_IRR) != 0) in vioapic_write()
357 vioapic->rtbl[pin].reg &= ~IOART_REM_IRR; in vioapic_write()
360 pin, vioapic->rtbl[pin].reg); in vioapic_write()
365 * to update their vlapic trigger-mode registers. in vioapic_write()
367 changed = last ^ vioapic->rtbl[pin].reg; in vioapic_write()
370 "vlapic trigger-mode register", pin); in vioapic_write()
372 allvcpus = vm_active_cpus(vioapic->vm); in vioapic_write()
380 * - pin trigger mode is level in vioapic_write()
381 * - pin level is asserted in vioapic_write()
383 if ((vioapic->rtbl[pin].reg & IOART_TRGRMOD) == IOART_TRGRLVL && in vioapic_write()
384 (vioapic->rtbl[pin].acnt > 0)) { in vioapic_write()
386 "write, acnt %d", pin, vioapic->rtbl[pin].acnt); in vioapic_write()
398 offset = gpa - VIOAPIC_BASE; in vioapic_mmio_rw()
401 * The IOAPIC specification allows 32-bit wide accesses to the in vioapic_mmio_rw()
413 *data = vioapic->ioregsel; in vioapic_mmio_rw()
415 vioapic->ioregsel = *data; in vioapic_mmio_rw()
419 vioapic->ioregsel); in vioapic_mmio_rw()
421 vioapic_write(vioapic, vcpu, vioapic->ioregsel, in vioapic_mmio_rw()
472 if ((vioapic->rtbl[pin].reg & IOART_REM_IRR) == 0) in vioapic_process_eoi()
474 if ((vioapic->rtbl[pin].reg & IOART_INTVEC) != vector) in vioapic_process_eoi()
476 vioapic->rtbl[pin].reg &= ~IOART_REM_IRR; in vioapic_process_eoi()
477 if (vioapic->rtbl[pin].acnt > 0) { in vioapic_process_eoi()
479 "acnt %d", pin, vioapic->rtbl[pin].acnt); in vioapic_process_eoi()
494 vioapic->vm = vm; in vioapic_init()
495 mtx_init(&vioapic->mtx, "vioapic lock", NULL, MTX_SPIN); in vioapic_init()
499 vioapic->rtbl[i].reg = 0x0001000000010000UL; in vioapic_init()
508 mtx_destroy(&vioapic->mtx); in vioapic_cleanup()
526 SNAPSHOT_VAR_OR_LEAVE(vioapic->ioregsel, meta, ret, done); in vioapic_snapshot()
528 for (i = 0; i < nitems(vioapic->rtbl); i++) { in vioapic_snapshot()
529 SNAPSHOT_VAR_OR_LEAVE(vioapic->rtbl[i].reg, meta, ret, done); in vioapic_snapshot()
530 SNAPSHOT_VAR_OR_LEAVE(vioapic->rtbl[i].acnt, meta, ret, done); in vioapic_snapshot()