PCIMAP controls how PCILO and PCIHi regions map into PCI memory space. Signed-off-by: Jiaxun Yang <jiaxun.y...@flygoat.com> --- hw/pci-host/bonito.c | 37 ++++++++++++++++++++++++++++++++----- 1 file changed, 32 insertions(+), 5 deletions(-)
diff --git a/hw/pci-host/bonito.c b/hw/pci-host/bonito.c index a599a1db4c068325b8c1aa8fb4a45f6b299b581b..f509f22df90ff7ed31ff5387a0acc239c22fd5f6 100644 --- a/hw/pci-host/bonito.c +++ b/hw/pci-host/bonito.c @@ -137,6 +137,12 @@ FIELD(BONGENCFG, PCIQUEUE, 12, 1) /* 4. PCI address map control */ #define BONITO_PCIMAP (0x10 >> 2) /* 0x110 */ +REG32(PCIMAP, 0x110) +FIELD(PCIMAP, LO0, 0, 6) +FIELD(PCIMAP, LO1, 6, 6) +FIELD(PCIMAP, LO2, 12, 6) +FIELD(PCIMAP, 2, 18, 1) + #define BONITO_PCIMEMBASECFG (0x14 >> 2) /* 0x114 */ #define BONITO_PCIMAP_CFG (0x18 >> 2) /* 0x118 */ @@ -245,7 +251,6 @@ struct PCIBonitoState { MemoryRegion iomem_cop; MemoryRegion bonito_pciio; MemoryRegion bonito_localio; - }; typedef struct PCIBonitoState PCIBonitoState; @@ -254,6 +259,8 @@ struct BonitoState { qemu_irq *pic; PCIBonitoState *pci_dev; MemoryRegion pci_mem; + MemoryRegion *pcimem_lo_alias; + MemoryRegion *pcimem_hi_alias; }; #define TYPE_PCI_BONITO "Bonito" @@ -293,6 +300,20 @@ static void bonito_set_irq(void *opaque, int irq, int level) bonito_update_irq(s); } +static void bonito_update_pcimap(PCIBonitoState *s) +{ + uint32_t pcimap = s->regs[BONITO_PCIMAP]; + + memory_region_set_alias_offset(&s->pcihost->pcimem_lo_alias[0], + FIELD_EX32(pcimap, PCIMAP, LO0) << 26); + memory_region_set_alias_offset(&s->pcihost->pcimem_lo_alias[1], + FIELD_EX32(pcimap, PCIMAP, LO1) << 26); + memory_region_set_alias_offset(&s->pcihost->pcimem_lo_alias[2], + FIELD_EX32(pcimap, PCIMAP, LO2) << 26); + memory_region_set_alias_offset(s->pcihost->pcimem_hi_alias, + FIELD_EX32(pcimap, PCIMAP, 2) << 31); +} + static void bonito_writel(void *opaque, hwaddr addr, uint64_t val, unsigned size) { @@ -308,7 +329,6 @@ static void bonito_writel(void *opaque, hwaddr addr, case BONITO_BONPONCFG: case BONITO_IODEVCFG: case BONITO_SDCFG: - case BONITO_PCIMAP: case BONITO_PCIMEMBASECFG: case BONITO_PCIMAP_CFG: case BONITO_GPIODATA: @@ -330,6 +350,10 @@ static void bonito_writel(void *opaque, hwaddr addr, case BONITO_MEMSIZE: s->regs[saddr] = val; break; + case BONITO_PCIMAP: + s->regs[BONITO_PCIMAP] = val; + bonito_update_pcimap(s); + break; case BONITO_BONGENCFG: if (!(s->regs[saddr] & 0x04) && (val & 0x04)) { reset = 1; /* bit 2 jump from 0 to 1 cause reset */ @@ -664,6 +688,8 @@ static void bonito_host_realize(DeviceState *dev, Error **errp) g_free(name); } + bs->pcimem_lo_alias = pcimem_lo_alias; + create_unimplemented_device("pci.io", BONITO_PCIIO_BASE, 1 * MiB); } @@ -673,7 +699,7 @@ static void bonito_pci_realize(PCIDevice *dev, Error **errp) MemoryRegion *host_mem = get_system_memory(); PCIHostState *phb = PCI_HOST_BRIDGE(s->pcihost); BonitoState *bs = s->pcihost; - MemoryRegion *pcimem_alias = g_new(MemoryRegion, 1); + MemoryRegion *pcimem_hi_alias = g_new(MemoryRegion, 1); /* * Bonito North Bridge, built on FPGA, @@ -730,9 +756,10 @@ static void bonito_pci_realize(PCIDevice *dev, Error **errp) create_unimplemented_device("IOCS[3]", BONITO_DEV_BASE + 3 * 256 * KiB, 256 * KiB); - memory_region_init_alias(pcimem_alias, NULL, "pci.mem.alias", + memory_region_init_alias(pcimem_hi_alias, NULL, "pci.memhi.alias", &bs->pci_mem, 0, BONITO_PCIHI_SIZE); - memory_region_add_subregion(host_mem, BONITO_PCIHI_BASE, pcimem_alias); + memory_region_add_subregion(host_mem, BONITO_PCIHI_BASE, pcimem_hi_alias); + bs->pcimem_hi_alias = pcimem_hi_alias; create_unimplemented_device("PCI_2", (hwaddr)BONITO_PCIHI_BASE + BONITO_PCIHI_SIZE, 2 * GiB); -- Git-154)