Lines Matching refs:vu
53 #define init_vuart_lock(vu) spinlock_init(&((vu)->lock)) argument
54 #define obtain_vuart_lock(vu, flags) spinlock_irqsave_obtain(&((vu)->lock), &(flags)) argument
55 #define release_vuart_lock(vu, flags) spinlock_irqrestore_release(&((vu)->lock), (flags)) argument
111 void vuart_putchar(struct acrn_vuart *vu, char ch) in vuart_putchar() argument
115 obtain_vuart_lock(vu, rflags); in vuart_putchar()
116 fifo_putchar(&vu->rxfifo, ch); in vuart_putchar()
117 release_vuart_lock(vu, rflags); in vuart_putchar()
120 char vuart_getchar(struct acrn_vuart *vu) in vuart_getchar() argument
125 obtain_vuart_lock(vu, rflags); in vuart_getchar()
126 c = fifo_getchar(&vu->txfifo); in vuart_getchar()
127 release_vuart_lock(vu, rflags); in vuart_getchar()
131 static inline void init_fifo(struct acrn_vuart *vu) in init_fifo() argument
133 vu->txfifo.buf = vu->vuart_tx_buf; in init_fifo()
134 vu->rxfifo.buf = vu->vuart_rx_buf; in init_fifo()
135 vu->txfifo.size = TX_BUF_SIZE; in init_fifo()
136 vu->rxfifo.size = RX_BUF_SIZE; in init_fifo()
137 reset_fifo(&(vu->txfifo)); in init_fifo()
138 reset_fifo(&(vu->rxfifo)); in init_fifo()
148 static uint8_t vuart_intr_reason(const struct acrn_vuart *vu) in vuart_intr_reason() argument
152 if (((vu->lsr & (LSR_OE | LSR_BI)) != 0U) && ((vu->ier & IER_ELSI) != 0U)) { in vuart_intr_reason()
154 } else if ((fifo_numchars(&vu->rxfifo) > 0U) && ((vu->ier & IER_ERBFI) != 0U)) { in vuart_intr_reason()
156 } else if (vu->thre_int_pending && ((vu->ier & IER_ETBEI) != 0U)) { in vuart_intr_reason()
158 } else if(((vu->msr & MSR_DELTA_MASK) != 0U) && ((vu->ier & IER_EMSC) != 0U)) { in vuart_intr_reason()
169 struct acrn_vuart *vu, *ret_vu = NULL; in find_vuart_by_port() local
173 vu = &vm->vuart[i]; in find_vuart_by_port()
174 if ((vu->active) && (vu->port_base == (offset & ~0x7U))) { in find_vuart_by_port()
175 ret_vu = vu; in find_vuart_by_port()
182 static void vuart_trigger_level_intr(const struct acrn_vuart *vu, bool assert) in vuart_trigger_level_intr() argument
187 vioapic_get_rte(vu->vm, vu->irq, &rte); in vuart_trigger_level_intr()
203 vpic_set_irqline(vm_pic(vu->vm), vu->irq, operation); in vuart_trigger_level_intr()
204 vioapic_set_irqline_lock(vu->vm, vu->irq, operation); in vuart_trigger_level_intr()
211 void vuart_toggle_intr(const struct acrn_vuart *vu) in vuart_toggle_intr() argument
215 intr_reason = vuart_intr_reason(vu); in vuart_toggle_intr()
217 if ((vu->vdev != NULL) && (intr_reason != IIR_NOPEND)) { in vuart_toggle_intr()
219 trigger_vmcs9900_msix(vu->vdev); in vuart_toggle_intr()
221 vuart_trigger_level_intr(vu, true); in vuart_toggle_intr()
223 vuart_trigger_level_intr(vu, false); in vuart_toggle_intr()
227 static bool send_to_target(struct acrn_vuart *vu, uint8_t value_u8) in send_to_target() argument
232 obtain_vuart_lock(vu, rflags); in send_to_target()
233 if (vu->active) { in send_to_target()
234 fifo_putchar(&vu->rxfifo, (char)value_u8); in send_to_target()
235 if (fifo_isfull(&vu->rxfifo)) { in send_to_target()
238 vuart_toggle_intr(vu); in send_to_target()
240 release_vuart_lock(vu, rflags); in send_to_target()
305 static void write_reg(struct acrn_vuart *vu, uint16_t reg, uint8_t value_u8) in write_reg() argument
310 obtain_vuart_lock(vu, rflags); in write_reg()
314 if (((vu->lcr & LCR_DLAB) != 0U) && (reg == UART16550_DLL)) { in write_reg()
315 vu->dll = value_u8; in write_reg()
316 } else if (((vu->lcr & LCR_DLAB) != 0U) && (reg == UART16550_DLM)) { in write_reg()
317 vu->dlh = value_u8; in write_reg()
321 if ((vu->mcr & MCR_LOOPBACK) != 0U) { in write_reg()
322 fifo_putchar(&vu->rxfifo, (char)value_u8); in write_reg()
323 vu->lsr |= LSR_OE; in write_reg()
325 fifo_putchar(&vu->txfifo, (char)value_u8); in write_reg()
327 vu->thre_int_pending = true; in write_reg()
330 if (((vu->ier & IER_ETBEI) == 0U) && ((value_u8 & IER_ETBEI) != 0U)) { in write_reg()
331 vu->thre_int_pending = true; in write_reg()
337 vu->ier = value_u8 & 0x0FU; in write_reg()
345 vu->fcr = 0U; in write_reg()
348 reset_fifo(&vu->rxfifo); in write_reg()
350 vu->fcr = value_u8 & (FCR_FIFOE | FCR_DMA | FCR_RX_MASK); in write_reg()
354 vu->lcr = value_u8; in write_reg()
358 vu->mcr = value_u8 & 0x1FU; in write_reg()
359 msr = get_modem_status(vu->mcr); in write_reg()
364 vu->msr = update_modem_status(msr, vu->msr); in write_reg()
378 vu->scr = value_u8; in write_reg()
389 vuart_toggle_intr(vu); in write_reg()
390 release_vuart_lock(vu, rflags); in write_reg()
419 void vuart_write_reg(struct acrn_vuart *vu, uint16_t offset, uint8_t value_u8) in vuart_write_reg() argument
424 target_vu = vu->target_vu; in vuart_write_reg()
426 if (((vu->mcr & MCR_LOOPBACK) == 0U) && ((vu->lcr & LCR_DLAB) == 0U) in vuart_write_reg()
430 obtain_vuart_lock(vu, rflags); in vuart_write_reg()
431 vu->thre_int_pending = true; in vuart_write_reg()
432 vuart_toggle_intr(vu); in vuart_write_reg()
433 release_vuart_lock(vu, rflags); in vuart_write_reg()
436 write_reg(vu, offset, value_u8); in vuart_write_reg()
468 struct acrn_vuart *vu = find_vuart_by_port(vcpu->vm, offset); in vuart_write() local
471 if (vu != NULL) { in vuart_write()
472 offset -= vu->port_base; in vuart_write()
473 vuart_write_reg(vu, offset, value_u8); in vuart_write()
478 static void notify_target(const struct acrn_vuart *vu) in notify_target() argument
483 if (vu != NULL) { in notify_target()
484 t_vu = vu->target_vu; in notify_target()
485 if ((t_vu != NULL) && !fifo_isfull(&vu->rxfifo)) { in notify_target()
518 uint8_t vuart_read_reg(struct acrn_vuart *vu, uint16_t offset) in vuart_read_reg() argument
524 t_vu = vu->target_vu; in vuart_read_reg()
525 obtain_vuart_lock(vu, rflags); in vuart_read_reg()
529 if ((vu->lcr & LCR_DLAB) != 0U) { in vuart_read_reg()
531 reg = vu->dll; in vuart_read_reg()
533 reg = vu->dlh; in vuart_read_reg()
540 vu->lsr &= ~LSR_OE; in vuart_read_reg()
541 reg = (uint8_t)fifo_getchar(&vu->rxfifo); in vuart_read_reg()
544 reg = vu->ier; in vuart_read_reg()
547 iir = ((vu->fcr & FCR_FIFOE) != 0U) ? IIR_FIFO_MASK : 0U; in vuart_read_reg()
548 intr_reason = vuart_intr_reason(vu); in vuart_read_reg()
553 vu->thre_int_pending = false; in vuart_read_reg()
559 reg = vu->lcr; in vuart_read_reg()
562 reg = vu->mcr; in vuart_read_reg()
567 vu->lsr |= LSR_TEMT | LSR_THRE; in vuart_read_reg()
570 vu->lsr |= LSR_TEMT | LSR_THRE; in vuart_read_reg()
573 if (fifo_numchars(&vu->rxfifo) > 0U) { in vuart_read_reg()
574 vu->lsr |= LSR_DR; in vuart_read_reg()
576 vu->lsr &= ~LSR_DR; in vuart_read_reg()
578 reg = vu->lsr; in vuart_read_reg()
580 vu->lsr &= ~(LSR_OE | LSR_BI); in vuart_read_reg()
586 reg = vu->msr; in vuart_read_reg()
587 vu->msr &= ~MSR_DELTA_MASK; in vuart_read_reg()
590 reg = vu->scr; in vuart_read_reg()
597 vuart_toggle_intr(vu); in vuart_read_reg()
598 release_vuart_lock(vu, rflags); in vuart_read_reg()
603 notify_target(vu); in vuart_read_reg()
635 struct acrn_vuart *vu = find_vuart_by_port(vcpu->vm, offset); in vuart_read() local
638 if (vu != NULL) { in vuart_read()
639 offset -= vu->port_base; in vuart_read()
640 pio_req->value = (uint32_t)vuart_read_reg(vu, offset); in vuart_read()
669 struct acrn_vuart *vu = &vm->vuart[vuart_idx]; in setup_vuart() local
673 vu->dll = (uint8_t)divisor; in setup_vuart()
674 vu->dlh = (uint8_t)(divisor >> 8U); in setup_vuart()
675 vu->vm = vm; in setup_vuart()
676 init_fifo(vu); in setup_vuart()
677 init_vuart_lock(vu); in setup_vuart()
678 vu->thre_int_pending = true; in setup_vuart()
679 vu->ier = 0U; in setup_vuart()
680 vuart_toggle_intr(vu); in setup_vuart()
681 vu->target_vu = NULL; in setup_vuart()
708 struct acrn_vuart *vu, *t_vu; in vuart_setup_connection() local
710 vu = &vm->vuart[vuart_idx]; in vuart_setup_connection()
711 if (vu->active) { in vuart_setup_connection()
714 vu->target_vu = t_vu; in vuart_setup_connection()
715 t_vu->target_vu = vu; in vuart_setup_connection()
720 static void vuart_deinit_connection(struct acrn_vuart *vu) in vuart_deinit_connection() argument
722 struct acrn_vuart *t_vu = vu->target_vu; in vuart_deinit_connection()
725 vu->target_vu = NULL; in vuart_deinit_connection()
787 struct acrn_vuart *vu; in init_legacy_vuarts() local
792 vu = &vm->vuart[i]; in init_legacy_vuarts()
794 vu->port_base = vu_config[i].addr.port_base; in init_legacy_vuarts()
795 vu->irq = vu_config[i].irq; in init_legacy_vuarts()
796 if (vuart_register_io_handler(vm, vu->port_base, i) != 0U) { in init_legacy_vuarts()
797 vu->active = true; in init_legacy_vuarts()
798 vu->escaping = false; in init_legacy_vuarts()
866 struct acrn_vuart *vu = vdev->priv_data; in init_pci_vuart() local
873 vu->vdev = vdev; in init_pci_vuart()
878 vu->active = true; in init_pci_vuart()
879 vu->escaping = false; in init_pci_vuart()
906 struct acrn_vuart *vu = vdev->priv_data; in deinit_pci_vuart() local
908 vu->active = false; in deinit_pci_vuart()
909 vu->escaping = false; in deinit_pci_vuart()
910 if (vu->target_vu != NULL) { in deinit_pci_vuart()
911 vuart_deinit_connection(vu); in deinit_pci_vuart()