hw/riscv/virt.c | 4 ++++ include/hw/riscv/virt.h | 2 ++ 2 files changed, 6 insertions(+)
The virt machine can have two UARTs and the second UART
can be used when host secure-mode support is enabled.
Signed-off-by: Yong Li <yong.li@intel.com>
---
hw/riscv/virt.c | 4 ++++
include/hw/riscv/virt.h | 2 ++
2 files changed, 6 insertions(+)
diff --git a/hw/riscv/virt.c b/hw/riscv/virt.c
index b38b41e685..02475e1678 100644
--- a/hw/riscv/virt.c
+++ b/hw/riscv/virt.c
@@ -88,6 +88,7 @@ static const MemMapEntry virt_memmap[] = {
[VIRT_APLIC_S] = { 0xd000000, APLIC_SIZE(VIRT_CPUS_MAX) },
[VIRT_UART0] = { 0x10000000, 0x100 },
[VIRT_VIRTIO] = { 0x10001000, 0x1000 },
+ [VIRT_UART1] = { 0x10002000, 0x100 },
[VIRT_FW_CFG] = { 0x10100000, 0x18 },
[VIRT_FLASH] = { 0x20000000, 0x4000000 },
[VIRT_IMSIC_M] = { 0x24000000, VIRT_IMSIC_MAX_SIZE },
@@ -1508,6 +1509,9 @@ static void virt_machine_init(MachineState *machine)
serial_mm_init(system_memory, memmap[VIRT_UART0].base,
0, qdev_get_gpio_in(DEVICE(mmio_irqchip), UART0_IRQ), 399193,
serial_hd(0), DEVICE_LITTLE_ENDIAN);
+ serial_mm_init(system_memory, memmap[VIRT_UART1].base,
+ 0, qdev_get_gpio_in(DEVICE(mmio_irqchip), UART1_IRQ), 399193,
+ serial_hd(1), DEVICE_LITTLE_ENDIAN);
sysbus_create_simple("goldfish_rtc", memmap[VIRT_RTC].base,
qdev_get_gpio_in(DEVICE(mmio_irqchip), RTC_IRQ));
diff --git a/include/hw/riscv/virt.h b/include/hw/riscv/virt.h
index e5c474b26e..8d2f8f225d 100644
--- a/include/hw/riscv/virt.h
+++ b/include/hw/riscv/virt.h
@@ -74,6 +74,7 @@ enum {
VIRT_APLIC_S,
VIRT_UART0,
VIRT_VIRTIO,
+ VIRT_UART1,
VIRT_FW_CFG,
VIRT_IMSIC_M,
VIRT_IMSIC_S,
@@ -88,6 +89,7 @@ enum {
enum {
UART0_IRQ = 10,
RTC_IRQ = 11,
+ UART1_IRQ = 12,
VIRTIO_IRQ = 1, /* 1 to 8 */
VIRTIO_COUNT = 8,
PCIE_IRQ = 0x20, /* 32 to 35 */
--
2.25.1
On Mon, 24 Apr 2023 at 07:24, Yong Li <yong.li@intel.com> wrote: > > The virt machine can have two UARTs and the second UART > can be used when host secure-mode support is enabled. Do you mean "host" here, or "guest" ? > Signed-off-by: Yong Li <yong.li@intel.com> > --- > hw/riscv/virt.c | 4 ++++ > include/hw/riscv/virt.h | 2 ++ > 2 files changed, 6 insertions(+) > > diff --git a/hw/riscv/virt.c b/hw/riscv/virt.c > index b38b41e685..02475e1678 100644 > --- a/hw/riscv/virt.c > +++ b/hw/riscv/virt.c > @@ -88,6 +88,7 @@ static const MemMapEntry virt_memmap[] = { > [VIRT_APLIC_S] = { 0xd000000, APLIC_SIZE(VIRT_CPUS_MAX) }, > [VIRT_UART0] = { 0x10000000, 0x100 }, > [VIRT_VIRTIO] = { 0x10001000, 0x1000 }, > + [VIRT_UART1] = { 0x10002000, 0x100 }, > [VIRT_FW_CFG] = { 0x10100000, 0x18 }, > [VIRT_FLASH] = { 0x20000000, 0x4000000 }, > [VIRT_IMSIC_M] = { 0x24000000, VIRT_IMSIC_MAX_SIZE }, > @@ -1508,6 +1509,9 @@ static void virt_machine_init(MachineState *machine) > serial_mm_init(system_memory, memmap[VIRT_UART0].base, > 0, qdev_get_gpio_in(DEVICE(mmio_irqchip), UART0_IRQ), 399193, > serial_hd(0), DEVICE_LITTLE_ENDIAN); > + serial_mm_init(system_memory, memmap[VIRT_UART1].base, > + 0, qdev_get_gpio_in(DEVICE(mmio_irqchip), UART1_IRQ), 399193, > + serial_hd(1), DEVICE_LITTLE_ENDIAN); > > sysbus_create_simple("goldfish_rtc", memmap[VIRT_RTC].base, > qdev_get_gpio_in(DEVICE(mmio_irqchip), RTC_IRQ)); Is it intentional that you only create the UART device and do not add it to the FDT ? (UART0 doesn't seem to be in the ACPI table generation code so I guess that part is OK.) You probably also want to test for compatibility: for arm we found that different bits of software (firmware, Linux kernel) annoyingly iterated through the dtb in different orders. thanks -- PMM
On 2023/4/24 16:59, Peter Maydell wrote: > On Mon, 24 Apr 2023 at 07:24, Yong Li<yong.li@intel.com> wrote: >> The virt machine can have two UARTs and the second UART >> can be used when host secure-mode support is enabled. > Do you mean "host" here, or "guest" ? Currently, it is an UEFI secure firmware residing in a secure partition. Let me update the message with a v2 patch >> Signed-off-by: Yong Li<yong.li@intel.com> >> --- >> hw/riscv/virt.c | 4 ++++ >> include/hw/riscv/virt.h | 2 ++ >> 2 files changed, 6 insertions(+) >> >> diff --git a/hw/riscv/virt.c b/hw/riscv/virt.c >> index b38b41e685..02475e1678 100644 >> --- a/hw/riscv/virt.c >> +++ b/hw/riscv/virt.c >> @@ -88,6 +88,7 @@ static const MemMapEntry virt_memmap[] = { >> [VIRT_APLIC_S] = { 0xd000000, APLIC_SIZE(VIRT_CPUS_MAX) }, >> [VIRT_UART0] = { 0x10000000, 0x100 }, >> [VIRT_VIRTIO] = { 0x10001000, 0x1000 }, >> + [VIRT_UART1] = { 0x10002000, 0x100 }, >> [VIRT_FW_CFG] = { 0x10100000, 0x18 }, >> [VIRT_FLASH] = { 0x20000000, 0x4000000 }, >> [VIRT_IMSIC_M] = { 0x24000000, VIRT_IMSIC_MAX_SIZE }, >> @@ -1508,6 +1509,9 @@ static void virt_machine_init(MachineState *machine) >> serial_mm_init(system_memory, memmap[VIRT_UART0].base, >> 0, qdev_get_gpio_in(DEVICE(mmio_irqchip), UART0_IRQ), 399193, >> serial_hd(0), DEVICE_LITTLE_ENDIAN); >> + serial_mm_init(system_memory, memmap[VIRT_UART1].base, >> + 0, qdev_get_gpio_in(DEVICE(mmio_irqchip), UART1_IRQ), 399193, >> + serial_hd(1), DEVICE_LITTLE_ENDIAN); >> >> sysbus_create_simple("goldfish_rtc", memmap[VIRT_RTC].base, >> qdev_get_gpio_in(DEVICE(mmio_irqchip), RTC_IRQ)); > Is it intentional that you only create the UART device > and do not add it to the FDT ? (UART0 doesn't seem to be > in the ACPI table generation code so I guess that part > is OK.) > > You probably also want to test for compatibility: > for arm we found that different bits of software > (firmware, Linux kernel) annoyingly iterated through > the dtb in different orders. Thanks for the comments. Yes, tested with our software stack which has edk2 , u-boot firmware, and also linux/debian os. No compatibility issue. > > thanks > -- PMM
© 2016 - 2024 Red Hat, Inc.