* [Qemu-devel] [PATCH 0/2] virtio-gpu: add iommu support
@ 2018-08-29 12:20 Gerd Hoffmann
2018-08-29 12:21 ` [Qemu-devel] [PATCH 1/2] virtio-gpu: pass down VirtIOGPU pointer to a bunch of functions Gerd Hoffmann
2018-08-29 12:21 ` [Qemu-devel] [PATCH 2/2] virtio-gpu: add iommu support Gerd Hoffmann
0 siblings, 2 replies; 3+ messages in thread
From: Gerd Hoffmann @ 2018-08-29 12:20 UTC (permalink / raw)
To: qemu-devel; +Cc: Gerd Hoffmann, Michael S. Tsirkin
Gerd Hoffmann (2):
virtio-gpu: pass down VirtIOGPU pointer to a bunch of functions
virtio-gpu: add iommu support
include/hw/virtio/virtio-gpu.h | 6 +++--
hw/display/virtio-gpu-3d.c | 8 +++----
hw/display/virtio-gpu.c | 50 ++++++++++++++++++++++++------------------
3 files changed, 37 insertions(+), 27 deletions(-)
--
2.9.3
^ permalink raw reply [flat|nested] 3+ messages in thread
* [Qemu-devel] [PATCH 1/2] virtio-gpu: pass down VirtIOGPU pointer to a bunch of functions
2018-08-29 12:20 [Qemu-devel] [PATCH 0/2] virtio-gpu: add iommu support Gerd Hoffmann
@ 2018-08-29 12:21 ` Gerd Hoffmann
2018-08-29 12:21 ` [Qemu-devel] [PATCH 2/2] virtio-gpu: add iommu support Gerd Hoffmann
1 sibling, 0 replies; 3+ messages in thread
From: Gerd Hoffmann @ 2018-08-29 12:21 UTC (permalink / raw)
To: qemu-devel; +Cc: Gerd Hoffmann, Michael S. Tsirkin
No functional change, just preparation for a followup patch
which needs a VirtIOGPU pointer.
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
include/hw/virtio/virtio-gpu.h | 6 ++++--
hw/display/virtio-gpu-3d.c | 8 ++++----
hw/display/virtio-gpu.c | 25 +++++++++++++++----------
3 files changed, 23 insertions(+), 16 deletions(-)
diff --git a/include/hw/virtio/virtio-gpu.h b/include/hw/virtio/virtio-gpu.h
index d0321672f4..08a27384a6 100644
--- a/include/hw/virtio/virtio-gpu.h
+++ b/include/hw/virtio/virtio-gpu.h
@@ -159,10 +159,12 @@ void virtio_gpu_ctrl_response_nodata(VirtIOGPU *g,
enum virtio_gpu_ctrl_type type);
void virtio_gpu_get_display_info(VirtIOGPU *g,
struct virtio_gpu_ctrl_command *cmd);
-int virtio_gpu_create_mapping_iov(struct virtio_gpu_resource_attach_backing *ab,
+int virtio_gpu_create_mapping_iov(VirtIOGPU *g,
+ struct virtio_gpu_resource_attach_backing *ab,
struct virtio_gpu_ctrl_command *cmd,
uint64_t **addr, struct iovec **iov);
-void virtio_gpu_cleanup_mapping_iov(struct iovec *iov, uint32_t count);
+void virtio_gpu_cleanup_mapping_iov(VirtIOGPU *g,
+ struct iovec *iov, uint32_t count);
void virtio_gpu_process_cmdq(VirtIOGPU *g);
/* virtio-gpu-3d.c */
diff --git a/hw/display/virtio-gpu-3d.c b/hw/display/virtio-gpu-3d.c
index 3558f38fe8..55d76405a9 100644
--- a/hw/display/virtio-gpu-3d.c
+++ b/hw/display/virtio-gpu-3d.c
@@ -86,7 +86,7 @@ static void virgl_cmd_resource_unref(VirtIOGPU *g,
&res_iovs,
&num_iovs);
if (res_iovs != NULL && num_iovs != 0) {
- virtio_gpu_cleanup_mapping_iov(res_iovs, num_iovs);
+ virtio_gpu_cleanup_mapping_iov(g, res_iovs, num_iovs);
}
virgl_renderer_resource_unref(unref.resource_id);
}
@@ -291,7 +291,7 @@ static void virgl_resource_attach_backing(VirtIOGPU *g,
VIRTIO_GPU_FILL_CMD(att_rb);
trace_virtio_gpu_cmd_res_back_attach(att_rb.resource_id);
- ret = virtio_gpu_create_mapping_iov(&att_rb, cmd, NULL, &res_iovs);
+ ret = virtio_gpu_create_mapping_iov(g, &att_rb, cmd, NULL, &res_iovs);
if (ret != 0) {
cmd->error = VIRTIO_GPU_RESP_ERR_UNSPEC;
return;
@@ -301,7 +301,7 @@ static void virgl_resource_attach_backing(VirtIOGPU *g,
res_iovs, att_rb.nr_entries);
if (ret != 0)
- virtio_gpu_cleanup_mapping_iov(res_iovs, att_rb.nr_entries);
+ virtio_gpu_cleanup_mapping_iov(g, res_iovs, att_rb.nr_entries);
}
static void virgl_resource_detach_backing(VirtIOGPU *g,
@@ -320,7 +320,7 @@ static void virgl_resource_detach_backing(VirtIOGPU *g,
if (res_iovs == NULL || num_iovs == 0) {
return;
}
- virtio_gpu_cleanup_mapping_iov(res_iovs, num_iovs);
+ virtio_gpu_cleanup_mapping_iov(g, res_iovs, num_iovs);
}
diff --git a/hw/display/virtio-gpu.c b/hw/display/virtio-gpu.c
index 3ddd29c0de..76e3542bf8 100644
--- a/hw/display/virtio-gpu.c
+++ b/hw/display/virtio-gpu.c
@@ -29,7 +29,8 @@
static struct virtio_gpu_simple_resource*
virtio_gpu_find_resource(VirtIOGPU *g, uint32_t resource_id);
-static void virtio_gpu_cleanup_mapping(struct virtio_gpu_simple_resource *res);
+static void virtio_gpu_cleanup_mapping(VirtIOGPU *g,
+ struct virtio_gpu_simple_resource *res);
static void
virtio_gpu_ctrl_hdr_bswap(struct virtio_gpu_ctrl_hdr *hdr)
@@ -447,7 +448,7 @@ static void virtio_gpu_resource_destroy(VirtIOGPU *g,
}
pixman_image_unref(res->image);
- virtio_gpu_cleanup_mapping(res);
+ virtio_gpu_cleanup_mapping(g, res);
QTAILQ_REMOVE(&g->reslist, res, next);
g->hostmem -= res->hostmem;
g_free(res);
@@ -693,7 +694,8 @@ static void virtio_gpu_set_scanout(VirtIOGPU *g,
scanout->height = ss.r.height;
}
-int virtio_gpu_create_mapping_iov(struct virtio_gpu_resource_attach_backing *ab,
+int virtio_gpu_create_mapping_iov(VirtIOGPU *g,
+ struct virtio_gpu_resource_attach_backing *ab,
struct virtio_gpu_ctrl_command *cmd,
uint64_t **addr, struct iovec **iov)
{
@@ -737,7 +739,7 @@ int virtio_gpu_create_mapping_iov(struct virtio_gpu_resource_attach_backing *ab,
qemu_log_mask(LOG_GUEST_ERROR, "%s: failed to map MMIO memory for"
" resource %d element %d\n",
__func__, ab->resource_id, i);
- virtio_gpu_cleanup_mapping_iov(*iov, i);
+ virtio_gpu_cleanup_mapping_iov(g, *iov, i);
g_free(ents);
*iov = NULL;
if (addr) {
@@ -751,7 +753,8 @@ int virtio_gpu_create_mapping_iov(struct virtio_gpu_resource_attach_backing *ab,
return 0;
}
-void virtio_gpu_cleanup_mapping_iov(struct iovec *iov, uint32_t count)
+void virtio_gpu_cleanup_mapping_iov(VirtIOGPU *g,
+ struct iovec *iov, uint32_t count)
{
int i;
@@ -762,9 +765,10 @@ void virtio_gpu_cleanup_mapping_iov(struct iovec *iov, uint32_t count)
g_free(iov);
}
-static void virtio_gpu_cleanup_mapping(struct virtio_gpu_simple_resource *res)
+static void virtio_gpu_cleanup_mapping(VirtIOGPU *g,
+ struct virtio_gpu_simple_resource *res)
{
- virtio_gpu_cleanup_mapping_iov(res->iov, res->iov_cnt);
+ virtio_gpu_cleanup_mapping_iov(g, res->iov, res->iov_cnt);
res->iov = NULL;
res->iov_cnt = 0;
g_free(res->addrs);
@@ -796,7 +800,7 @@ virtio_gpu_resource_attach_backing(VirtIOGPU *g,
return;
}
- ret = virtio_gpu_create_mapping_iov(&ab, cmd, &res->addrs, &res->iov);
+ ret = virtio_gpu_create_mapping_iov(g, &ab, cmd, &res->addrs, &res->iov);
if (ret != 0) {
cmd->error = VIRTIO_GPU_RESP_ERR_UNSPEC;
return;
@@ -823,7 +827,7 @@ virtio_gpu_resource_detach_backing(VirtIOGPU *g,
cmd->error = VIRTIO_GPU_RESP_ERR_INVALID_RESOURCE_ID;
return;
}
- virtio_gpu_cleanup_mapping(res);
+ virtio_gpu_cleanup_mapping(g, res);
}
static void virtio_gpu_simple_process_cmd(VirtIOGPU *g,
@@ -1149,6 +1153,7 @@ static int virtio_gpu_load(QEMUFile *f, void *opaque, size_t size,
hwaddr len = res->iov[i].iov_len;
res->iov[i].iov_base =
cpu_physical_memory_map(res->addrs[i], &len, 1);
+
if (!res->iov[i].iov_base || len != res->iov[i].iov_len) {
/* Clean up the half-a-mapping we just created... */
if (res->iov[i].iov_base) {
@@ -1157,7 +1162,7 @@ static int virtio_gpu_load(QEMUFile *f, void *opaque, size_t size,
}
/* ...and the mappings for previous loop iterations */
res->iov_cnt = i;
- virtio_gpu_cleanup_mapping(res);
+ virtio_gpu_cleanup_mapping(g, res);
pixman_image_unref(res->image);
g_free(res);
return -EINVAL;
--
2.9.3
^ permalink raw reply related [flat|nested] 3+ messages in thread
* [Qemu-devel] [PATCH 2/2] virtio-gpu: add iommu support
2018-08-29 12:20 [Qemu-devel] [PATCH 0/2] virtio-gpu: add iommu support Gerd Hoffmann
2018-08-29 12:21 ` [Qemu-devel] [PATCH 1/2] virtio-gpu: pass down VirtIOGPU pointer to a bunch of functions Gerd Hoffmann
@ 2018-08-29 12:21 ` Gerd Hoffmann
1 sibling, 0 replies; 3+ messages in thread
From: Gerd Hoffmann @ 2018-08-29 12:21 UTC (permalink / raw)
To: qemu-devel; +Cc: Gerd Hoffmann, Michael S. Tsirkin
Switch from cpu_physical_memory_map to dma_memory_map,
so iommu mappings for virtio-gpu objects work properly.
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
hw/display/virtio-gpu.c | 25 ++++++++++++++-----------
1 file changed, 14 insertions(+), 11 deletions(-)
diff --git a/hw/display/virtio-gpu.c b/hw/display/virtio-gpu.c
index 76e3542bf8..a564b3f3a3 100644
--- a/hw/display/virtio-gpu.c
+++ b/hw/display/virtio-gpu.c
@@ -17,6 +17,7 @@
#include "qemu/iov.h"
#include "ui/console.h"
#include "trace.h"
+#include "sysemu/dma.h"
#include "hw/virtio/virtio.h"
#include "hw/virtio/virtio-gpu.h"
#include "hw/virtio/virtio-bus.h"
@@ -731,7 +732,8 @@ int virtio_gpu_create_mapping_iov(VirtIOGPU *g,
uint32_t l = le32_to_cpu(ents[i].length);
hwaddr len = l;
(*iov)[i].iov_len = l;
- (*iov)[i].iov_base = cpu_physical_memory_map(a, &len, 1);
+ (*iov)[i].iov_base = dma_memory_map(VIRTIO_DEVICE(g)->dma_as,
+ a, &len, DMA_DIRECTION_TO_DEVICE);
if (addr) {
(*addr)[i] = a;
}
@@ -759,8 +761,10 @@ void virtio_gpu_cleanup_mapping_iov(VirtIOGPU *g,
int i;
for (i = 0; i < count; i++) {
- cpu_physical_memory_unmap(iov[i].iov_base, iov[i].iov_len, 1,
- iov[i].iov_len);
+ dma_memory_unmap(VIRTIO_DEVICE(g)->dma_as,
+ iov[i].iov_base, iov[i].iov_len,
+ DMA_DIRECTION_TO_DEVICE,
+ iov[i].iov_len);
}
g_free(iov);
}
@@ -1152,13 +1156,17 @@ static int virtio_gpu_load(QEMUFile *f, void *opaque, size_t size,
for (i = 0; i < res->iov_cnt; i++) {
hwaddr len = res->iov[i].iov_len;
res->iov[i].iov_base =
- cpu_physical_memory_map(res->addrs[i], &len, 1);
+ dma_memory_map(VIRTIO_DEVICE(g)->dma_as,
+ res->addrs[i], &len, DMA_DIRECTION_TO_DEVICE);
if (!res->iov[i].iov_base || len != res->iov[i].iov_len) {
/* Clean up the half-a-mapping we just created... */
if (res->iov[i].iov_base) {
- cpu_physical_memory_unmap(res->iov[i].iov_base,
- len, 0, 0);
+ dma_memory_unmap(VIRTIO_DEVICE(g)->dma_as,
+ res->iov[i].iov_base,
+ res->iov[i].iov_len,
+ DMA_DIRECTION_TO_DEVICE,
+ res->iov[i].iov_len);
}
/* ...and the mappings for previous loop iterations */
res->iov_cnt = i;
@@ -1210,11 +1218,6 @@ static void virtio_gpu_device_realize(DeviceState *qdev, Error **errp)
Error *local_err = NULL;
int i;
- if (virtio_host_has_feature(vdev, VIRTIO_F_IOMMU_PLATFORM)) {
- error_setg(errp, "virtio-gpu does not support vIOMMU yet");
- return;
- }
-
if (g->conf.max_outputs > VIRTIO_GPU_MAX_SCANOUTS) {
error_setg(errp, "invalid max_outputs > %d", VIRTIO_GPU_MAX_SCANOUTS);
return;
--
2.9.3
^ permalink raw reply related [flat|nested] 3+ messages in thread
end of thread, other threads:[~2018-08-29 12:21 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2018-08-29 12:20 [Qemu-devel] [PATCH 0/2] virtio-gpu: add iommu support Gerd Hoffmann
2018-08-29 12:21 ` [Qemu-devel] [PATCH 1/2] virtio-gpu: pass down VirtIOGPU pointer to a bunch of functions Gerd Hoffmann
2018-08-29 12:21 ` [Qemu-devel] [PATCH 2/2] virtio-gpu: add iommu support Gerd Hoffmann
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).