mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-12-17 21:26:13 -07:00
memory/iommu: introduce IOMMUMemoryRegionClass
This finishes QOM'fication of IOMMUMemoryRegion by introducing a IOMMUMemoryRegionClass. This also provides a fastpath analog for IOMMU_MEMORY_REGION_GET_CLASS(). This makes IOMMUMemoryRegion an abstract class. Signed-off-by: Alexey Kardashevskiy <aik@ozlabs.ru> Message-Id: <20170711035620.4232-3-aik@ozlabs.ru> Acked-by: Cornelia Huck <cohuck@redhat.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
3df9d74806
commit
1221a47467
15 changed files with 205 additions and 70 deletions
|
|
@ -133,6 +133,8 @@ typedef struct IOMMUState {
|
|||
#define APB_DEVICE(obj) \
|
||||
OBJECT_CHECK(APBState, (obj), TYPE_APB)
|
||||
|
||||
#define TYPE_APB_IOMMU_MEMORY_REGION "pbm-iommu-memory-region"
|
||||
|
||||
typedef struct APBState {
|
||||
PCIHostState parent_obj;
|
||||
|
||||
|
|
@ -322,10 +324,6 @@ static IOMMUTLBEntry pbm_translate_iommu(IOMMUMemoryRegion *iommu, hwaddr addr,
|
|||
return ret;
|
||||
}
|
||||
|
||||
static MemoryRegionIOMMUOps pbm_iommu_ops = {
|
||||
.translate = pbm_translate_iommu,
|
||||
};
|
||||
|
||||
static void iommu_config_write(void *opaque, hwaddr addr,
|
||||
uint64_t val, unsigned size)
|
||||
{
|
||||
|
|
@ -697,7 +695,8 @@ PCIBus *pci_apb_init(hwaddr special_base,
|
|||
is = &d->iommu;
|
||||
memset(is, 0, sizeof(IOMMUState));
|
||||
|
||||
memory_region_init_iommu(&is->iommu, OBJECT(dev), &pbm_iommu_ops,
|
||||
memory_region_init_iommu(&is->iommu, sizeof(is->iommu),
|
||||
TYPE_APB_IOMMU_MEMORY_REGION, OBJECT(dev),
|
||||
"iommu-apb", UINT64_MAX);
|
||||
address_space_init(&is->iommu_as, MEMORY_REGION(&is->iommu), "pbm-as");
|
||||
pci_setup_iommu(phb->bus, pbm_pci_dma_iommu, is);
|
||||
|
|
@ -860,11 +859,25 @@ static const TypeInfo pbm_pci_bridge_info = {
|
|||
.class_init = pbm_pci_bridge_class_init,
|
||||
};
|
||||
|
||||
static void pbm_iommu_memory_region_class_init(ObjectClass *klass, void *data)
|
||||
{
|
||||
IOMMUMemoryRegionClass *imrc = IOMMU_MEMORY_REGION_CLASS(klass);
|
||||
|
||||
imrc->translate = pbm_translate_iommu;
|
||||
}
|
||||
|
||||
static const TypeInfo pbm_iommu_memory_region_info = {
|
||||
.parent = TYPE_IOMMU_MEMORY_REGION,
|
||||
.name = TYPE_APB_IOMMU_MEMORY_REGION,
|
||||
.class_init = pbm_iommu_memory_region_class_init,
|
||||
};
|
||||
|
||||
static void pbm_register_types(void)
|
||||
{
|
||||
type_register_static(&pbm_host_info);
|
||||
type_register_static(&pbm_pci_host_info);
|
||||
type_register_static(&pbm_pci_bridge_info);
|
||||
type_register_static(&pbm_iommu_memory_region_info);
|
||||
}
|
||||
|
||||
type_init(pbm_register_types)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue