spapr_pci: spapr_iommu: Make DMA window a subregion
Currently the default DMA window is represented by a single MemoryRegion. However there can be more than just one window so we need a "root" memory region to be separated from the actual DMA window(s). This introduces a "root" IOMMU memory region and adds a subregion for the default DMA 32bit window. Following patches will add other subregion(s). This initializes a default DMA window subregion size to the guest RAM size as this window can be switched into "bypass" mode which implements direct DMA mapping. Signed-off-by: Alexey Kardashevskiy <aik@ozlabs.ru> Signed-off-by: Alexander Graf <agraf@suse.de>
This commit is contained in:
parent
da6ccee418
commit
cca7fad576
@ -135,7 +135,7 @@ static int spapr_tce_table_realize(DeviceState *dev)
|
||||
trace_spapr_iommu_new_table(tcet->liobn, tcet, tcet->table, tcet->fd);
|
||||
|
||||
memory_region_init_iommu(&tcet->iommu, OBJECT(dev), &spapr_iommu_ops,
|
||||
"iommu-spapr", UINT64_MAX);
|
||||
"iommu-spapr", ram_size);
|
||||
|
||||
QLIST_INSERT_HEAD(&spapr_tce_tables, tcet, list);
|
||||
|
||||
|
@ -610,6 +610,20 @@ static void spapr_phb_realize(DeviceState *dev, Error **errp)
|
||||
PCI_DEVFN(0, 0), PCI_NUM_PINS, TYPE_PCI_BUS);
|
||||
phb->bus = bus;
|
||||
|
||||
/*
|
||||
* Initialize PHB address space.
|
||||
* By default there will be at least one subregion for default
|
||||
* 32bit DMA window.
|
||||
* Later the guest might want to create another DMA window
|
||||
* which will become another memory subregion.
|
||||
*/
|
||||
sprintf(namebuf, "%s.iommu-root", sphb->dtbusname);
|
||||
|
||||
memory_region_init(&sphb->iommu_root, OBJECT(sphb),
|
||||
namebuf, UINT64_MAX);
|
||||
address_space_init(&sphb->iommu_as, &sphb->iommu_root,
|
||||
sphb->dtbusname);
|
||||
|
||||
pci_setup_iommu(bus, spapr_pci_dma_iommu, sphb);
|
||||
|
||||
pci_bus_set_route_irq_fn(bus, spapr_route_intx_pin_to_irq);
|
||||
@ -648,8 +662,10 @@ static void spapr_phb_finish_realize(sPAPRPHBState *sphb, Error **errp)
|
||||
sphb->dtbusname);
|
||||
return ;
|
||||
}
|
||||
address_space_init(&sphb->iommu_as, spapr_tce_get_iommu(sphb->tcet),
|
||||
sphb->dtbusname);
|
||||
|
||||
/* Register default 32bit DMA window */
|
||||
memory_region_add_subregion(&sphb->iommu_root, 0,
|
||||
spapr_tce_get_iommu(sphb->tcet));
|
||||
}
|
||||
|
||||
static void spapr_phb_reset(DeviceState *qdev)
|
||||
|
@ -64,6 +64,7 @@ struct sPAPRPHBState {
|
||||
uint64_t dma_window_size;
|
||||
sPAPRTCETable *tcet;
|
||||
AddressSpace iommu_as;
|
||||
MemoryRegion iommu_root;
|
||||
|
||||
struct spapr_pci_lsi {
|
||||
uint32_t irq;
|
||||
|
Loading…
Reference in New Issue
Block a user