• Home
  • History
  • Annotate
  • Raw
  • Download
  • only in /freebsd-13-stable/sys/amd64/vmm/io/

Lines Matching refs:atpic

54 static MALLOC_DEFINE(M_VATPIC, "atpic", "bhyve virtual atpic (8259)");
66 struct atpic {
91 struct atpic atpic[2];
113 #define ATPIC_PIN_FOREACH(pinvar, atpic, tmpvar) \
114 for (tmpvar = 0, pinvar = (atpic->lowprio + 1) & 0x7; \
121 master_atpic(struct vatpic *vatpic, struct atpic *atpic)
124 if (atpic == &vatpic->atpic[0])
131 vatpic_get_highest_isrpin(struct atpic *atpic)
136 ATPIC_PIN_FOREACH(pin, atpic, i) {
139 if (atpic->service & bit) {
144 if (atpic->smm && (atpic->mask & bit) != 0)
155 vatpic_get_highest_irrpin(struct atpic *atpic)
165 serviced = atpic->service;
166 if (atpic->sfn)
175 if (atpic->smm)
178 ATPIC_PIN_FOREACH(pin, atpic, tmp) {
192 if ((atpic->request & bit) != 0 && (atpic->mask & bit) == 0)
202 struct atpic *atpic;
210 atpic = &vatpic->atpic[1];
211 if (!atpic->intr_raised &&
212 (pin = vatpic_get_highest_irrpin(atpic)) != -1) {
213 VATPIC_CTR4(vatpic, "atpic slave notify pin = %d "
215 atpic->mask, atpic->request, atpic->service);
220 atpic->intr_raised = true;
224 VATPIC_CTR3(vatpic, "atpic slave no eligible interrupts "
226 atpic->mask, atpic->request, atpic->service);
232 atpic = &vatpic->atpic[0];
233 if (!atpic->intr_raised &&
234 (pin = vatpic_get_highest_irrpin(atpic)) != -1) {
235 VATPIC_CTR4(vatpic, "atpic master notify pin = %d "
237 atpic->mask, atpic->request, atpic->service);
264 atpic->intr_raised = true;
268 VATPIC_CTR3(vatpic, "atpic master no eligible interrupts "
270 atpic->mask, atpic->request, atpic->service);
275 vatpic_icw1(struct vatpic *vatpic, struct atpic *atpic, uint8_t val)
277 VATPIC_CTR1(vatpic, "atpic icw1 0x%x", val);
279 atpic->ready = false;
281 atpic->icw_num = 1;
282 atpic->request = 0;
283 atpic->mask = 0;
284 atpic->lowprio = 7;
285 atpic->rd_cmd_reg = 0;
286 atpic->poll = 0;
287 atpic->smm = 0;
299 atpic->icw_num++;
305 vatpic_icw2(struct vatpic *vatpic, struct atpic *atpic, uint8_t val)
307 VATPIC_CTR1(vatpic, "atpic icw2 0x%x", val);
309 atpic->irq_base = val & 0xf8;
311 atpic->icw_num++;
317 vatpic_icw3(struct vatpic *vatpic, struct atpic *atpic, uint8_t val)
319 VATPIC_CTR1(vatpic, "atpic icw3 0x%x", val);
321 atpic->icw_num++;
327 vatpic_icw4(struct vatpic *vatpic, struct atpic *atpic, uint8_t val)
329 VATPIC_CTR1(vatpic, "atpic icw4 0x%x", val);
337 atpic->aeoi = true;
340 if (master_atpic(vatpic, atpic)) {
341 atpic->sfn = true;
344 "mode on slave atpic: %#x", val);
348 atpic->icw_num = 0;
349 atpic->ready = true;
355 vatpic_ocw1(struct vatpic *vatpic, struct atpic *atpic, uint8_t val)
357 VATPIC_CTR1(vatpic, "atpic ocw1 0x%x", val);
359 atpic->mask = val & 0xff;
365 vatpic_ocw2(struct vatpic *vatpic, struct atpic *atpic, uint8_t val)
367 VATPIC_CTR1(vatpic, "atpic ocw2 0x%x", val);
369 atpic->rotate = ((val & OCW2_R) != 0);
379 isr_bit = vatpic_get_highest_isrpin(atpic);
383 atpic->service &= ~(1 << isr_bit);
385 if (atpic->rotate)
386 atpic->lowprio = isr_bit;
388 } else if ((val & OCW2_SL) != 0 && atpic->rotate == true) {
390 atpic->lowprio = val & 0x7;
397 vatpic_ocw3(struct vatpic *vatpic, struct atpic *atpic, uint8_t val)
399 VATPIC_CTR1(vatpic, "atpic ocw3 0x%x", val);
402 atpic->smm = val & OCW3_SMM ? 1 : 0;
403 VATPIC_CTR2(vatpic, "%s atpic special mask mode %s",
404 master_atpic(vatpic, atpic) ? "master" : "slave",
405 atpic->smm ? "enabled" : "disabled");
410 atpic->rd_cmd_reg = val & OCW3_RIS;
413 atpic->poll = ((val & OCW3_P) != 0);
422 struct atpic *atpic;
431 atpic = &vatpic->atpic[pin >> 3];
433 oldcnt = atpic->acnt[pin & 0x7];
435 atpic->acnt[pin & 0x7]++;
437 atpic->acnt[pin & 0x7]--;
438 newcnt = atpic->acnt[pin & 0x7];
441 VATPIC_CTR2(vatpic, "atpic pin%d: bad acnt %d", pin, newcnt);
448 VATPIC_CTR1(vatpic, "atpic pin%d: asserted", pin);
449 atpic->request |= (1 << (pin & 0x7));
452 VATPIC_CTR1(vatpic, "atpic pin%d: deasserted", pin);
454 atpic->request &= ~(1 << (pin & 0x7));
456 VATPIC_CTR3(vatpic, "atpic pin%d: %s, ignored, acnt %d",
467 struct atpic *atpic;
473 atpic = &vatpic->atpic[irq >> 3];
475 if (atpic->ready == false)
557 struct atpic *atpic;
562 atpic = &vatpic->atpic[0];
566 pin = vatpic_get_highest_irrpin(atpic);
568 atpic = &vatpic->atpic[1];
569 pin = vatpic_get_highest_irrpin(atpic);
580 *vecptr = atpic->irq_base + pin;
586 vatpic_pin_accepted(struct atpic *atpic, int pin)
588 atpic->intr_raised = false;
590 if (atpic->acnt[pin] == 0)
591 atpic->request &= ~(1 << pin);
593 if (atpic->aeoi == true) {
594 if (atpic->rotate == true)
595 atpic->lowprio = pin;
597 atpic->service |= (1 << pin);
613 if ((vector & ~0x7) == vatpic->atpic[1].irq_base) {
614 vatpic_pin_accepted(&vatpic->atpic[1], pin);
619 vatpic_pin_accepted(&vatpic->atpic[0], 2);
621 vatpic_pin_accepted(&vatpic->atpic[0], pin);
630 vatpic_read(struct vatpic *vatpic, struct atpic *atpic, bool in, int port,
637 if (atpic->poll) {
638 atpic->poll = 0;
639 pin = vatpic_get_highest_irrpin(atpic);
641 vatpic_pin_accepted(atpic, pin);
649 *eax = atpic->mask;
651 if (atpic->rd_cmd_reg == OCW3_RIS) {
653 *eax = atpic->service;
656 *eax = atpic->request;
668 vatpic_write(struct vatpic *vatpic, struct atpic *atpic, bool in, int port,
680 switch (atpic->icw_num) {
682 error = vatpic_icw2(vatpic, atpic, val);
685 error = vatpic_icw3(vatpic, atpic, val);
688 error = vatpic_icw4(vatpic, atpic, val);
691 error = vatpic_ocw1(vatpic, atpic, val);
696 error = vatpic_icw1(vatpic, atpic, val);
698 if (atpic->ready) {
700 error = vatpic_ocw3(vatpic, atpic, val);
702 error = vatpic_ocw2(vatpic, atpic, val);
706 if (atpic->ready)
719 struct atpic *atpic;
722 atpic = &vatpic->atpic[0];
728 return (vatpic_read(vatpic, atpic, in, port, bytes, eax));
731 return (vatpic_write(vatpic, atpic, in, port, bytes, eax));
739 struct atpic *atpic;
742 atpic = &vatpic->atpic[1];
748 return (vatpic_read(vatpic, atpic, in, port, bytes, eax));
751 return (vatpic_write(vatpic, atpic, in, port, bytes, eax));
821 struct atpic *atpic;
823 for (i = 0; i < nitems(vatpic->atpic); i++) {
824 atpic = &vatpic->atpic[i];
826 SNAPSHOT_VAR_OR_LEAVE(atpic->ready, meta, ret, done);
827 SNAPSHOT_VAR_OR_LEAVE(atpic->icw_num, meta, ret, done);
828 SNAPSHOT_VAR_OR_LEAVE(atpic->rd_cmd_reg, meta, ret, done);
830 SNAPSHOT_VAR_OR_LEAVE(atpic->aeoi, meta, ret, done);
831 SNAPSHOT_VAR_OR_LEAVE(atpic->poll, meta, ret, done);
832 SNAPSHOT_VAR_OR_LEAVE(atpic->rotate, meta, ret, done);
833 SNAPSHOT_VAR_OR_LEAVE(atpic->sfn, meta, ret, done);
834 SNAPSHOT_VAR_OR_LEAVE(atpic->irq_base, meta, ret, done);
835 SNAPSHOT_VAR_OR_LEAVE(atpic->request, meta, ret, done);
836 SNAPSHOT_VAR_OR_LEAVE(atpic->service, meta, ret, done);
837 SNAPSHOT_VAR_OR_LEAVE(atpic->mask, meta, ret, done);
838 SNAPSHOT_VAR_OR_LEAVE(atpic->smm, meta, ret, done);
840 SNAPSHOT_BUF_OR_LEAVE(atpic->acnt, sizeof(atpic->acnt),
842 SNAPSHOT_VAR_OR_LEAVE(atpic->lowprio, meta, ret, done);
843 SNAPSHOT_VAR_OR_LEAVE(atpic->intr_raised, meta, ret, done);