mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-02 15:23:53 -06:00

This patch implements the endpoint attach/detach to/from a domain. Domain and endpoint internal datatypes are introduced. Both are stored in RB trees. The domain owns a list of endpoints attached to it. Also helpers to get/put end points and domains are introduced. As for the IOMMU memory regions, a callback is called on PCI bus enumeration that initializes for a given device on the bus hierarchy an IOMMU memory region. The PCI bus hierarchy is stored locally in IOMMUPciBus and IOMMUDevice objects. At the time of the enumeration, the bus number may not be computed yet. So operations that will need to retrieve the IOMMUdevice and its IOMMU memory region from the bus number and devfn, once the bus number is garanteed to be frozen, use an array of IOMMUPciBus, lazily populated. Signed-off-by: Eric Auger <eric.auger@redhat.com> Reviewed-by: Peter Xu <peterx@redhat.com> Reviewed-by: Michael S. Tsirkin <mst@redhat.com> Message-Id: <20200214132745.23392-4-eric.auger@redhat.com> Reviewed-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
60 lines
1.7 KiB
C
60 lines
1.7 KiB
C
/*
|
|
* virtio-iommu device
|
|
*
|
|
* Copyright (c) 2020 Red Hat, Inc.
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify it
|
|
* under the terms and conditions of the GNU General Public License,
|
|
* version 2 or later, as published by the Free Software Foundation.
|
|
*
|
|
* This program is distributed in the hope it will be useful, but WITHOUT
|
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
* more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License along with
|
|
* this program. If not, see <http://www.gnu.org/licenses/>.
|
|
*
|
|
*/
|
|
|
|
#ifndef QEMU_VIRTIO_IOMMU_H
|
|
#define QEMU_VIRTIO_IOMMU_H
|
|
|
|
#include "standard-headers/linux/virtio_iommu.h"
|
|
#include "hw/virtio/virtio.h"
|
|
#include "hw/pci/pci.h"
|
|
|
|
#define TYPE_VIRTIO_IOMMU "virtio-iommu-device"
|
|
#define VIRTIO_IOMMU(obj) \
|
|
OBJECT_CHECK(VirtIOIOMMU, (obj), TYPE_VIRTIO_IOMMU)
|
|
|
|
#define TYPE_VIRTIO_IOMMU_MEMORY_REGION "virtio-iommu-memory-region"
|
|
|
|
typedef struct IOMMUDevice {
|
|
void *viommu;
|
|
PCIBus *bus;
|
|
int devfn;
|
|
IOMMUMemoryRegion iommu_mr;
|
|
AddressSpace as;
|
|
} IOMMUDevice;
|
|
|
|
typedef struct IOMMUPciBus {
|
|
PCIBus *bus;
|
|
IOMMUDevice *pbdev[0]; /* Parent array is sparse, so dynamically alloc */
|
|
} IOMMUPciBus;
|
|
|
|
typedef struct VirtIOIOMMU {
|
|
VirtIODevice parent_obj;
|
|
VirtQueue *req_vq;
|
|
VirtQueue *event_vq;
|
|
struct virtio_iommu_config config;
|
|
uint64_t features;
|
|
GHashTable *as_by_busptr;
|
|
IOMMUPciBus *iommu_pcibus_by_bus_num[PCI_BUS_MAX];
|
|
PCIBus *primary_bus;
|
|
GTree *domains;
|
|
QemuMutex mutex;
|
|
GTree *endpoints;
|
|
} VirtIOIOMMU;
|
|
|
|
#endif
|