mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-30 05:21:55 -06:00
vdpa: use dev_shared in vdpa_iommu
The memory listener functions can call these too. Make vdpa_iommu work with VhostVDPAShared. Signed-off-by: Eugenio Pérez <eperezma@redhat.com> Acked-by: Jason Wang <jasowang@redhat.com> Message-Id: <20231221174322.3130442-13-eperezma@redhat.com> Tested-by: Lei Yang <leiyang@redhat.com> Reviewed-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
This commit is contained in:
parent
6f03d9ef8a
commit
b06a38f2b0
2 changed files with 9 additions and 9 deletions
|
@ -199,7 +199,7 @@ static void vhost_vdpa_iommu_map_notify(IOMMUNotifier *n, IOMMUTLBEntry *iotlb)
|
||||||
struct vdpa_iommu *iommu = container_of(n, struct vdpa_iommu, n);
|
struct vdpa_iommu *iommu = container_of(n, struct vdpa_iommu, n);
|
||||||
|
|
||||||
hwaddr iova = iotlb->iova + iommu->iommu_offset;
|
hwaddr iova = iotlb->iova + iommu->iommu_offset;
|
||||||
struct vhost_vdpa *v = iommu->dev;
|
VhostVDPAShared *s = iommu->dev_shared;
|
||||||
void *vaddr;
|
void *vaddr;
|
||||||
int ret;
|
int ret;
|
||||||
Int128 llend;
|
Int128 llend;
|
||||||
|
@ -212,10 +212,10 @@ static void vhost_vdpa_iommu_map_notify(IOMMUNotifier *n, IOMMUTLBEntry *iotlb)
|
||||||
RCU_READ_LOCK_GUARD();
|
RCU_READ_LOCK_GUARD();
|
||||||
/* check if RAM section out of device range */
|
/* check if RAM section out of device range */
|
||||||
llend = int128_add(int128_makes64(iotlb->addr_mask), int128_makes64(iova));
|
llend = int128_add(int128_makes64(iotlb->addr_mask), int128_makes64(iova));
|
||||||
if (int128_gt(llend, int128_make64(v->shared->iova_range.last))) {
|
if (int128_gt(llend, int128_make64(s->iova_range.last))) {
|
||||||
error_report("RAM section out of device range (max=0x%" PRIx64
|
error_report("RAM section out of device range (max=0x%" PRIx64
|
||||||
", end addr=0x%" PRIx64 ")",
|
", end addr=0x%" PRIx64 ")",
|
||||||
v->shared->iova_range.last, int128_get64(llend));
|
s->iova_range.last, int128_get64(llend));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -225,20 +225,20 @@ static void vhost_vdpa_iommu_map_notify(IOMMUNotifier *n, IOMMUTLBEntry *iotlb)
|
||||||
if (!memory_get_xlat_addr(iotlb, &vaddr, NULL, &read_only, NULL)) {
|
if (!memory_get_xlat_addr(iotlb, &vaddr, NULL, &read_only, NULL)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
ret = vhost_vdpa_dma_map(v->shared, VHOST_VDPA_GUEST_PA_ASID, iova,
|
ret = vhost_vdpa_dma_map(s, VHOST_VDPA_GUEST_PA_ASID, iova,
|
||||||
iotlb->addr_mask + 1, vaddr, read_only);
|
iotlb->addr_mask + 1, vaddr, read_only);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
error_report("vhost_vdpa_dma_map(%p, 0x%" HWADDR_PRIx ", "
|
error_report("vhost_vdpa_dma_map(%p, 0x%" HWADDR_PRIx ", "
|
||||||
"0x%" HWADDR_PRIx ", %p) = %d (%m)",
|
"0x%" HWADDR_PRIx ", %p) = %d (%m)",
|
||||||
v, iova, iotlb->addr_mask + 1, vaddr, ret);
|
s, iova, iotlb->addr_mask + 1, vaddr, ret);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
ret = vhost_vdpa_dma_unmap(v->shared, VHOST_VDPA_GUEST_PA_ASID, iova,
|
ret = vhost_vdpa_dma_unmap(s, VHOST_VDPA_GUEST_PA_ASID, iova,
|
||||||
iotlb->addr_mask + 1);
|
iotlb->addr_mask + 1);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
error_report("vhost_vdpa_dma_unmap(%p, 0x%" HWADDR_PRIx ", "
|
error_report("vhost_vdpa_dma_unmap(%p, 0x%" HWADDR_PRIx ", "
|
||||||
"0x%" HWADDR_PRIx ") = %d (%m)",
|
"0x%" HWADDR_PRIx ") = %d (%m)",
|
||||||
v, iova, iotlb->addr_mask + 1, ret);
|
s, iova, iotlb->addr_mask + 1, ret);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -270,7 +270,7 @@ static void vhost_vdpa_iommu_region_add(MemoryListener *listener,
|
||||||
iommu_idx);
|
iommu_idx);
|
||||||
iommu->iommu_offset = section->offset_within_address_space -
|
iommu->iommu_offset = section->offset_within_address_space -
|
||||||
section->offset_within_region;
|
section->offset_within_region;
|
||||||
iommu->dev = v;
|
iommu->dev_shared = v->shared;
|
||||||
|
|
||||||
ret = memory_region_register_iommu_notifier(section->mr, &iommu->n, NULL);
|
ret = memory_region_register_iommu_notifier(section->mr, &iommu->n, NULL);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
|
|
|
@ -75,7 +75,7 @@ int vhost_vdpa_dma_unmap(VhostVDPAShared *s, uint32_t asid, hwaddr iova,
|
||||||
hwaddr size);
|
hwaddr size);
|
||||||
|
|
||||||
typedef struct vdpa_iommu {
|
typedef struct vdpa_iommu {
|
||||||
struct vhost_vdpa *dev;
|
VhostVDPAShared *dev_shared;
|
||||||
IOMMUMemoryRegion *iommu_mr;
|
IOMMUMemoryRegion *iommu_mr;
|
||||||
hwaddr iommu_offset;
|
hwaddr iommu_offset;
|
||||||
IOMMUNotifier n;
|
IOMMUNotifier n;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue