mirror of https://github.com/xemu-project/xemu.git
hw/loongarch: Add some devices support for 3A5000.
1.Add uart,virtio-net,vga and usb for 3A5000. 2.Add irq set and map for the pci host. Non pci device use irq 0-16, pci device use 16-64. 3.Add some unimplented device to emulate guest unused memory space. Signed-off-by: Xiaojuan Yang <yangxiaojuan@loongson.cn> Signed-off-by: Song Gao <gaosong@loongson.cn> Acked-by: Richard Henderson <richard.henderson@linaro.org> Message-Id: <20220606124333.2060567-38-yangxiaojuan@loongson.cn> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
parent
256309e188
commit
dc93b8df8a
|
@ -2,6 +2,13 @@ config LOONGARCH_VIRT
|
||||||
bool
|
bool
|
||||||
select PCI
|
select PCI
|
||||||
select PCI_EXPRESS_GENERIC_BRIDGE
|
select PCI_EXPRESS_GENERIC_BRIDGE
|
||||||
|
imply VGA_PCI
|
||||||
|
imply VIRTIO_VGA
|
||||||
|
imply PCI_DEVICES
|
||||||
|
select ISA_BUS
|
||||||
|
select SERIAL
|
||||||
|
select SERIAL_ISA
|
||||||
|
select VIRTIO_PCI
|
||||||
select LOONGARCH_IPI
|
select LOONGARCH_IPI
|
||||||
select LOONGARCH_PCH_PIC
|
select LOONGARCH_PCH_PIC
|
||||||
select LOONGARCH_PCH_MSI
|
select LOONGARCH_PCH_MSI
|
||||||
|
|
|
@ -9,6 +9,7 @@
|
||||||
#include "qemu/datadir.h"
|
#include "qemu/datadir.h"
|
||||||
#include "qapi/error.h"
|
#include "qapi/error.h"
|
||||||
#include "hw/boards.h"
|
#include "hw/boards.h"
|
||||||
|
#include "hw/char/serial.h"
|
||||||
#include "sysemu/sysemu.h"
|
#include "sysemu/sysemu.h"
|
||||||
#include "sysemu/qtest.h"
|
#include "sysemu/qtest.h"
|
||||||
#include "sysemu/runstate.h"
|
#include "sysemu/runstate.h"
|
||||||
|
@ -16,14 +17,88 @@
|
||||||
#include "sysemu/rtc.h"
|
#include "sysemu/rtc.h"
|
||||||
#include "hw/loongarch/virt.h"
|
#include "hw/loongarch/virt.h"
|
||||||
#include "exec/address-spaces.h"
|
#include "exec/address-spaces.h"
|
||||||
|
#include "hw/irq.h"
|
||||||
|
#include "net/net.h"
|
||||||
#include "hw/intc/loongarch_ipi.h"
|
#include "hw/intc/loongarch_ipi.h"
|
||||||
#include "hw/intc/loongarch_extioi.h"
|
#include "hw/intc/loongarch_extioi.h"
|
||||||
#include "hw/intc/loongarch_pch_pic.h"
|
#include "hw/intc/loongarch_pch_pic.h"
|
||||||
#include "hw/intc/loongarch_pch_msi.h"
|
#include "hw/intc/loongarch_pch_msi.h"
|
||||||
#include "hw/pci-host/ls7a.h"
|
#include "hw/pci-host/ls7a.h"
|
||||||
|
#include "hw/pci-host/gpex.h"
|
||||||
|
#include "hw/misc/unimp.h"
|
||||||
|
|
||||||
#include "target/loongarch/cpu.h"
|
#include "target/loongarch/cpu.h"
|
||||||
|
|
||||||
|
static void loongarch_devices_init(DeviceState *pch_pic)
|
||||||
|
{
|
||||||
|
DeviceState *gpex_dev;
|
||||||
|
SysBusDevice *d;
|
||||||
|
PCIBus *pci_bus;
|
||||||
|
MemoryRegion *ecam_alias, *ecam_reg, *pio_alias, *pio_reg;
|
||||||
|
MemoryRegion *mmio_alias, *mmio_reg;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
gpex_dev = qdev_new(TYPE_GPEX_HOST);
|
||||||
|
d = SYS_BUS_DEVICE(gpex_dev);
|
||||||
|
sysbus_realize_and_unref(d, &error_fatal);
|
||||||
|
pci_bus = PCI_HOST_BRIDGE(gpex_dev)->bus;
|
||||||
|
|
||||||
|
/* Map only part size_ecam bytes of ECAM space */
|
||||||
|
ecam_alias = g_new0(MemoryRegion, 1);
|
||||||
|
ecam_reg = sysbus_mmio_get_region(d, 0);
|
||||||
|
memory_region_init_alias(ecam_alias, OBJECT(gpex_dev), "pcie-ecam",
|
||||||
|
ecam_reg, 0, LS_PCIECFG_SIZE);
|
||||||
|
memory_region_add_subregion(get_system_memory(), LS_PCIECFG_BASE,
|
||||||
|
ecam_alias);
|
||||||
|
|
||||||
|
/* Map PCI mem space */
|
||||||
|
mmio_alias = g_new0(MemoryRegion, 1);
|
||||||
|
mmio_reg = sysbus_mmio_get_region(d, 1);
|
||||||
|
memory_region_init_alias(mmio_alias, OBJECT(gpex_dev), "pcie-mmio",
|
||||||
|
mmio_reg, LS7A_PCI_MEM_BASE, LS7A_PCI_MEM_SIZE);
|
||||||
|
memory_region_add_subregion(get_system_memory(), LS7A_PCI_MEM_BASE,
|
||||||
|
mmio_alias);
|
||||||
|
|
||||||
|
/* Map PCI IO port space. */
|
||||||
|
pio_alias = g_new0(MemoryRegion, 1);
|
||||||
|
pio_reg = sysbus_mmio_get_region(d, 2);
|
||||||
|
memory_region_init_alias(pio_alias, OBJECT(gpex_dev), "pcie-io", pio_reg,
|
||||||
|
LS7A_PCI_IO_OFFSET, LS7A_PCI_IO_SIZE);
|
||||||
|
memory_region_add_subregion(get_system_memory(), LS7A_PCI_IO_BASE,
|
||||||
|
pio_alias);
|
||||||
|
|
||||||
|
for (i = 0; i < GPEX_NUM_IRQS; i++) {
|
||||||
|
sysbus_connect_irq(d, i,
|
||||||
|
qdev_get_gpio_in(pch_pic, 16 + i));
|
||||||
|
gpex_set_irq_num(GPEX_HOST(gpex_dev), i, 16 + i);
|
||||||
|
}
|
||||||
|
|
||||||
|
serial_mm_init(get_system_memory(), LS7A_UART_BASE, 0,
|
||||||
|
qdev_get_gpio_in(pch_pic,
|
||||||
|
LS7A_UART_IRQ - PCH_PIC_IRQ_OFFSET),
|
||||||
|
115200, serial_hd(0), DEVICE_LITTLE_ENDIAN);
|
||||||
|
|
||||||
|
/* Network init */
|
||||||
|
for (i = 0; i < nb_nics; i++) {
|
||||||
|
NICInfo *nd = &nd_table[i];
|
||||||
|
|
||||||
|
if (!nd->model) {
|
||||||
|
nd->model = g_strdup("virtio");
|
||||||
|
}
|
||||||
|
|
||||||
|
pci_nic_init_nofail(nd, pci_bus, nd->model, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* VGA setup */
|
||||||
|
pci_vga_init(pci_bus);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* There are some invalid guest memory access.
|
||||||
|
* Create some unimplemented devices to emulate this.
|
||||||
|
*/
|
||||||
|
create_unimplemented_device("pci-dma-cfg", 0x1001041c, 0x4);
|
||||||
|
}
|
||||||
|
|
||||||
static void loongarch_irq_init(LoongArchMachineState *lams)
|
static void loongarch_irq_init(LoongArchMachineState *lams)
|
||||||
{
|
{
|
||||||
MachineState *ms = MACHINE(lams);
|
MachineState *ms = MACHINE(lams);
|
||||||
|
@ -118,6 +193,8 @@ static void loongarch_irq_init(LoongArchMachineState *lams)
|
||||||
qdev_connect_gpio_out(DEVICE(d), i,
|
qdev_connect_gpio_out(DEVICE(d), i,
|
||||||
qdev_get_gpio_in(extioi, i + PCH_MSI_IRQ_START));
|
qdev_get_gpio_in(extioi, i + PCH_MSI_IRQ_START));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
loongarch_devices_init(pch_pic);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void loongarch_init(MachineState *machine)
|
static void loongarch_init(MachineState *machine)
|
||||||
|
|
|
@ -17,6 +17,11 @@
|
||||||
|
|
||||||
#define LS7A_PCI_MEM_BASE 0x40000000UL
|
#define LS7A_PCI_MEM_BASE 0x40000000UL
|
||||||
#define LS7A_PCI_MEM_SIZE 0x40000000UL
|
#define LS7A_PCI_MEM_SIZE 0x40000000UL
|
||||||
|
#define LS7A_PCI_IO_OFFSET 0x4000
|
||||||
|
#define LS_PCIECFG_BASE 0x20000000
|
||||||
|
#define LS_PCIECFG_SIZE 0x08000000
|
||||||
|
#define LS7A_PCI_IO_BASE 0x18004000UL
|
||||||
|
#define LS7A_PCI_IO_SIZE 0xC000
|
||||||
|
|
||||||
#define LS7A_PCH_REG_BASE 0x10000000UL
|
#define LS7A_PCH_REG_BASE 0x10000000UL
|
||||||
#define LS7A_IOAPIC_REG_BASE (LS7A_PCH_REG_BASE)
|
#define LS7A_IOAPIC_REG_BASE (LS7A_PCH_REG_BASE)
|
||||||
|
@ -30,4 +35,6 @@
|
||||||
#define PCH_PIC_IRQ_OFFSET 64
|
#define PCH_PIC_IRQ_OFFSET 64
|
||||||
#define LS7A_DEVICE_IRQS 16
|
#define LS7A_DEVICE_IRQS 16
|
||||||
#define LS7A_PCI_IRQS 48
|
#define LS7A_PCI_IRQS 48
|
||||||
|
#define LS7A_UART_IRQ (PCH_PIC_IRQ_OFFSET + 2)
|
||||||
|
#define LS7A_UART_BASE 0x1fe001e0
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue