mirror of
https://github.com/projectacrn/acrn-hypervisor.git
synced 2025-06-26 15:31:35 +00:00
HV: support vuart base & irq can be changed
add two static variables for COM_BASE & COM_IRQ, to support them dynamically changed. Tracked-On: #2170 Signed-off-by: Minggui Cao <minggui.cao@intel.com> Acked-by: Eddie Dong <eddie.dong@intel.com>
This commit is contained in:
parent
537adaeb46
commit
f4beaf501c
@ -33,6 +33,8 @@
|
|||||||
|
|
||||||
#include "uart16550.h"
|
#include "uart16550.h"
|
||||||
|
|
||||||
|
static uint8_t vuart_com_irq = CONFIG_COM_IRQ;
|
||||||
|
static uint16_t vuart_com_base = CONFIG_COM_BASE;
|
||||||
|
|
||||||
#ifndef CONFIG_PARTITION_MODE
|
#ifndef CONFIG_PARTITION_MODE
|
||||||
static char vuart_rx_buf[RX_BUF_SIZE];
|
static char vuart_rx_buf[RX_BUF_SIZE];
|
||||||
@ -111,8 +113,7 @@ static uint8_t vuart_intr_reason(const struct acrn_vuart *vu)
|
|||||||
{
|
{
|
||||||
if (((vu->lsr & LSR_OE) != 0U) && ((vu->ier & IER_ELSI) != 0U)) {
|
if (((vu->lsr & LSR_OE) != 0U) && ((vu->ier & IER_ELSI) != 0U)) {
|
||||||
return IIR_RLS;
|
return IIR_RLS;
|
||||||
} else if ((fifo_numchars(&vu->rxfifo) > 0U) &&
|
} else if ((fifo_numchars(&vu->rxfifo) > 0U) && ((vu->ier & IER_ERBFI) != 0U)) {
|
||||||
((vu->ier & IER_ERBFI) != 0U)) {
|
|
||||||
return IIR_RXTOUT;
|
return IIR_RXTOUT;
|
||||||
} else if (vu->thre_int_pending && ((vu->ier & IER_ETBEI) != 0U)) {
|
} else if (vu->thre_int_pending && ((vu->ier & IER_ETBEI) != 0U)) {
|
||||||
return IIR_TXRDY;
|
return IIR_TXRDY;
|
||||||
@ -132,7 +133,7 @@ static void vuart_toggle_intr(const struct acrn_vuart *vu)
|
|||||||
uint32_t operation;
|
uint32_t operation;
|
||||||
|
|
||||||
intr_reason = vuart_intr_reason(vu);
|
intr_reason = vuart_intr_reason(vu);
|
||||||
vioapic_get_rte(vu->vm, CONFIG_COM_IRQ, &rte);
|
vioapic_get_rte(vu->vm, vuart_com_irq, &rte);
|
||||||
|
|
||||||
/* TODO:
|
/* TODO:
|
||||||
* Here should assert vuart irq according to CONFIG_COM_IRQ polarity.
|
* Here should assert vuart irq according to CONFIG_COM_IRQ polarity.
|
||||||
@ -143,15 +144,13 @@ static void vuart_toggle_intr(const struct acrn_vuart *vu)
|
|||||||
* we want to make it as an known issue.
|
* we want to make it as an known issue.
|
||||||
*/
|
*/
|
||||||
if ((rte.full & IOAPIC_RTE_INTPOL) != 0UL) {
|
if ((rte.full & IOAPIC_RTE_INTPOL) != 0UL) {
|
||||||
operation = (intr_reason != IIR_NOPEND) ?
|
operation = (intr_reason != IIR_NOPEND) ? GSI_SET_LOW : GSI_SET_HIGH;
|
||||||
GSI_SET_LOW : GSI_SET_HIGH;
|
|
||||||
} else {
|
} else {
|
||||||
operation = (intr_reason != IIR_NOPEND) ?
|
operation = (intr_reason != IIR_NOPEND) ? GSI_SET_HIGH : GSI_SET_LOW;
|
||||||
GSI_SET_HIGH : GSI_SET_LOW;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
vpic_set_irq(vu->vm, CONFIG_COM_IRQ, operation);
|
vpic_set_irq(vu->vm, vuart_com_irq, operation);
|
||||||
vioapic_set_irq(vu->vm, CONFIG_COM_IRQ, operation);
|
vioapic_set_irq(vu->vm, vuart_com_irq, operation);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void vuart_write(struct acrn_vm *vm, uint16_t offset_arg,
|
static void vuart_write(struct acrn_vm *vm, uint16_t offset_arg,
|
||||||
@ -202,8 +201,7 @@ static void vuart_write(struct acrn_vm *vm, uint16_t offset_arg,
|
|||||||
fifo_reset(&vu->rxfifo);
|
fifo_reset(&vu->rxfifo);
|
||||||
}
|
}
|
||||||
|
|
||||||
vu->fcr = value_u8 &
|
vu->fcr = value_u8 & (FCR_FIFOE | FCR_DMA | FCR_RX_MASK);
|
||||||
(FCR_FIFOE | FCR_DMA | FCR_RX_MASK);
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case UART16550_LCR:
|
case UART16550_LCR:
|
||||||
@ -323,7 +321,7 @@ static void vuart_register_io_handler(struct acrn_vm *vm)
|
|||||||
{
|
{
|
||||||
struct vm_io_range range = {
|
struct vm_io_range range = {
|
||||||
.flags = IO_ATTR_RW,
|
.flags = IO_ATTR_RW,
|
||||||
.base = CONFIG_COM_BASE,
|
.base = vuart_com_base,
|
||||||
.len = 8U
|
.len = 8U
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -402,7 +400,7 @@ void vuart_init(struct acrn_vm *vm)
|
|||||||
vm->vuart.dlh = (uint8_t)(divisor >> 8U);
|
vm->vuart.dlh = (uint8_t)(divisor >> 8U);
|
||||||
|
|
||||||
vm->vuart.active = false;
|
vm->vuart.active = false;
|
||||||
vm->vuart.base = CONFIG_COM_BASE;
|
vm->vuart.base = vuart_com_base;
|
||||||
vm->vuart.vm = vm;
|
vm->vuart.vm = vm;
|
||||||
vuart_fifo_init(vu);
|
vuart_fifo_init(vu);
|
||||||
vuart_lock_init(vu);
|
vuart_lock_init(vu);
|
||||||
@ -411,5 +409,5 @@ void vuart_init(struct acrn_vm *vm)
|
|||||||
|
|
||||||
bool hv_used_dbg_intx(uint8_t intx_pin)
|
bool hv_used_dbg_intx(uint8_t intx_pin)
|
||||||
{
|
{
|
||||||
return is_dbg_uart_enabled() && (intx_pin == CONFIG_COM_IRQ);
|
return is_dbg_uart_enabled() && (intx_pin == vuart_com_irq);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user