dri-devel.lists.freedesktop.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v2 00/23] Blob prerequisites + blob resources
@ 2020-09-02 21:08 Gurchetan Singh
  2020-09-02 21:08 ` [PATCH v2 01/23] Fix use after free in get_capset_info callback Gurchetan Singh
                   ` (22 more replies)
  0 siblings, 23 replies; 39+ messages in thread
From: Gurchetan Singh @ 2020-09-02 21:08 UTC (permalink / raw)
  To: dri-devel, virtio-dev; +Cc: sebastien.boeuf, kraxel, vgoyal, mst

This is the latest iteration of the blob series.  Changes since last time
include:

* RESOURCE_ASSIGN_UUID now merged (thanks kraxel@ and stevensd@!).

* some additional virtgpu prep patches -- not completely related to blob
  but not completely unrelated either.

* v3 of shm region series that Vivek sent out, with mst@'s acks.
  I think the plan is to merge this in 5.10.  After reading up on Linux
  kernel flow, I think merging to drm-misc-next now will accomplish the
  same effect ;-) ??

* applied checkpatch --strict fixes.  Ignored some messages that
  conflicted with existing code or didn't make sense.

* fixed some issues raised by the kbuildbot.

For further details on blob resources and links to open-source userspaces,
please refer to the original description [1].  The entire tree is
available at [2].

[1] https://lists.freedesktop.org/archives/dri-devel/2020-August/275972.html
[2] https://gitlab.freedesktop.org/virgl/drm-misc-next/-/commits/resource-blob

Doug Horn (1):
  Fix use after free in get_capset_info callback.

Gerd Hoffmann (6):
  virtio-gpu api: blob resources
  virtio-gpu api: host visible feature
  drm/virtio: implement blob resources: probe for the feature.
  drm/virtio: implement blob resources: probe for host visible region
  drm/virtio: implement blob resources: implement vram object
  drm/virtio: implement blob resources: resource create blob ioctl

Gurchetan Singh (13):
  drm/virtio: fix uninitialized variable
  drm/virtio: report uuid in debugfs
  drm/virtio: blob prep: refactor getting pages and attaching backing
  drm/virtio: blob prep: make CPU responses more generic
  virtio-gpu api: cross-device feature
  drm/virtio: implement blob resources: expose
    virtio_gpu_resource_id_get
  drm/virtio: implement blob resources: add new fields to internal
    structs
  drm/virtio: implement blob resources: hypercall interface
  drm/virtio: implement blob resources: blob display integration
  drm/virtio: implement blob resources: refactor UUID code somewhat
  drm/virtio: implement blob resources: fix stride discrepancy
  drm/virtio: implement blob resources: report blob mem to userspace
  drm/virtio: advertise features to userspace

Sebastien Boeuf (3):
  virtio: Add get_shm_region method
  virtio: Implement get_shm_region for PCI transport
  virtio: Implement get_shm_region for MMIO transport

 drivers/gpu/drm/virtio/Makefile          |   2 +-
 drivers/gpu/drm/virtio/virtgpu_debugfs.c |  27 +++-
 drivers/gpu/drm/virtio/virtgpu_drv.c     |   1 +
 drivers/gpu/drm/virtio/virtgpu_drv.h     |  79 ++++++++--
 drivers/gpu/drm/virtio/virtgpu_ioctl.c   | 185 ++++++++++++++++++++++-
 drivers/gpu/drm/virtio/virtgpu_kms.c     |  45 +++++-
 drivers/gpu/drm/virtio/virtgpu_object.c  |  36 +++--
 drivers/gpu/drm/virtio/virtgpu_plane.c   |  23 ++-
 drivers/gpu/drm/virtio/virtgpu_prime.c   |  46 ++++--
 drivers/gpu/drm/virtio/virtgpu_vq.c      | 165 ++++++++++++++++++--
 drivers/gpu/drm/virtio/virtgpu_vram.c    | 164 ++++++++++++++++++++
 drivers/virtio/virtio_mmio.c             |  31 ++++
 drivers/virtio/virtio_pci_modern.c       |  95 ++++++++++++
 include/linux/virtio_config.h            |  17 +++
 include/uapi/drm/virtgpu_drm.h           |  39 ++++-
 include/uapi/linux/virtio_gpu.h          |  78 ++++++++++
 include/uapi/linux/virtio_mmio.h         |  11 ++
 include/uapi/linux/virtio_pci.h          |  11 +-
 18 files changed, 991 insertions(+), 64 deletions(-)
 create mode 100644 drivers/gpu/drm/virtio/virtgpu_vram.c

-- 
2.26.2

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 39+ messages in thread

* [PATCH v2 01/23] Fix use after free in get_capset_info callback.
  2020-09-02 21:08 [PATCH v2 00/23] Blob prerequisites + blob resources Gurchetan Singh
@ 2020-09-02 21:08 ` Gurchetan Singh
  2020-09-02 21:08 ` [PATCH v2 02/23] drm/virtio: fix uninitialized variable Gurchetan Singh
                   ` (21 subsequent siblings)
  22 siblings, 0 replies; 39+ messages in thread
From: Gurchetan Singh @ 2020-09-02 21:08 UTC (permalink / raw)
  To: dri-devel, virtio-dev; +Cc: sebastien.boeuf, kraxel, vgoyal, mst

From: Doug Horn <doughorn@google.com>

If a response to virtio_gpu_cmd_get_capset_info takes longer than
five seconds to return, the callback will access freed kernel memory
in vg->capsets.

Signed-off-by: Doug Horn <doughorn@google.com>
---
 drivers/gpu/drm/virtio/virtgpu_kms.c |  2 ++
 drivers/gpu/drm/virtio/virtgpu_vq.c  | 10 +++++++---
 2 files changed, 9 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/virtio/virtgpu_kms.c b/drivers/gpu/drm/virtio/virtgpu_kms.c
index 75d0dc2f6d285..5ba389e0a02fb 100644
--- a/drivers/gpu/drm/virtio/virtgpu_kms.c
+++ b/drivers/gpu/drm/virtio/virtgpu_kms.c
@@ -80,8 +80,10 @@ static void virtio_gpu_get_capsets(struct virtio_gpu_device *vgdev,
 					 vgdev->capsets[i].id > 0, 5 * HZ);
 		if (ret == 0) {
 			DRM_ERROR("timed out waiting for cap set %d\n", i);
+			spin_lock(&vgdev->display_info_lock);
 			kfree(vgdev->capsets);
 			vgdev->capsets = NULL;
+			spin_unlock(&vgdev->display_info_lock);
 			return;
 		}
 		DRM_INFO("cap set %d: id %d, max-version %d, max-size %d\n",
diff --git a/drivers/gpu/drm/virtio/virtgpu_vq.c b/drivers/gpu/drm/virtio/virtgpu_vq.c
index c93c2db35aaf3..7436705ba5a22 100644
--- a/drivers/gpu/drm/virtio/virtgpu_vq.c
+++ b/drivers/gpu/drm/virtio/virtgpu_vq.c
@@ -684,9 +684,13 @@ static void virtio_gpu_cmd_get_capset_info_cb(struct virtio_gpu_device *vgdev,
 	int i = le32_to_cpu(cmd->capset_index);
 
 	spin_lock(&vgdev->display_info_lock);
-	vgdev->capsets[i].id = le32_to_cpu(resp->capset_id);
-	vgdev->capsets[i].max_version = le32_to_cpu(resp->capset_max_version);
-	vgdev->capsets[i].max_size = le32_to_cpu(resp->capset_max_size);
+	if (vgdev->capsets) {
+		vgdev->capsets[i].id = le32_to_cpu(resp->capset_id);
+		vgdev->capsets[i].max_version = le32_to_cpu(resp->capset_max_version);
+		vgdev->capsets[i].max_size = le32_to_cpu(resp->capset_max_size);
+	} else {
+		DRM_ERROR("invalid capset memory.");
+	}
 	spin_unlock(&vgdev->display_info_lock);
 	wake_up(&vgdev->resp_wq);
 }
-- 
2.26.2

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply related	[flat|nested] 39+ messages in thread

* [PATCH v2 02/23] drm/virtio: fix uninitialized variable
  2020-09-02 21:08 [PATCH v2 00/23] Blob prerequisites + blob resources Gurchetan Singh
  2020-09-02 21:08 ` [PATCH v2 01/23] Fix use after free in get_capset_info callback Gurchetan Singh
@ 2020-09-02 21:08 ` Gurchetan Singh
  2020-09-02 21:08 ` [PATCH v2 03/23] drm/virtio: report uuid in debugfs Gurchetan Singh
                   ` (20 subsequent siblings)
  22 siblings, 0 replies; 39+ messages in thread
From: Gurchetan Singh @ 2020-09-02 21:08 UTC (permalink / raw)
  To: dri-devel, virtio-dev; +Cc: sebastien.boeuf, kraxel, vgoyal, mst

smatch reported this with the blob series:

drivers/gpu/drm/virtio/virtgpu_kms.c:227 virtio_gpu_init()
error: uninitialized symbol 'ret'.

Signed-off-by: Gurchetan Singh <gurchetansingh@chromium.org>
---
 drivers/gpu/drm/virtio/virtgpu_kms.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/virtio/virtgpu_kms.c b/drivers/gpu/drm/virtio/virtgpu_kms.c
index 5ba389e0a02fb..06af537b0091d 100644
--- a/drivers/gpu/drm/virtio/virtgpu_kms.c
+++ b/drivers/gpu/drm/virtio/virtgpu_kms.c
@@ -105,7 +105,7 @@ int virtio_gpu_init(struct drm_device *dev)
 	/* this will expand later */
 	struct virtqueue *vqs[2];
 	u32 num_scanouts, num_capsets;
-	int ret;
+	int ret = 0;
 
 	if (!virtio_has_feature(dev_to_virtio(dev->dev), VIRTIO_F_VERSION_1))
 		return -ENODEV;
-- 
2.26.2

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply related	[flat|nested] 39+ messages in thread

* [PATCH v2 03/23] drm/virtio: report uuid in debugfs
  2020-09-02 21:08 [PATCH v2 00/23] Blob prerequisites + blob resources Gurchetan Singh
  2020-09-02 21:08 ` [PATCH v2 01/23] Fix use after free in get_capset_info callback Gurchetan Singh
  2020-09-02 21:08 ` [PATCH v2 02/23] drm/virtio: fix uninitialized variable Gurchetan Singh
@ 2020-09-02 21:08 ` Gurchetan Singh
  2020-09-02 21:08 ` [PATCH v2 04/23] virtio: Add get_shm_region method Gurchetan Singh
                   ` (19 subsequent siblings)
  22 siblings, 0 replies; 39+ messages in thread
From: Gurchetan Singh @ 2020-09-02 21:08 UTC (permalink / raw)
  To: dri-devel, virtio-dev; +Cc: sebastien.boeuf, kraxel, vgoyal, mst

In keeping with other features, report this in the debugfs.

Signed-off-by: Gurchetan Singh <gurchetansingh@chromium.org>
---
 drivers/gpu/drm/virtio/virtgpu_debugfs.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/drivers/gpu/drm/virtio/virtgpu_debugfs.c b/drivers/gpu/drm/virtio/virtgpu_debugfs.c
index 3221520f61f0c..d5b0c543bd6d7 100644
--- a/drivers/gpu/drm/virtio/virtgpu_debugfs.c
+++ b/drivers/gpu/drm/virtio/virtgpu_debugfs.c
@@ -48,6 +48,7 @@ static int virtio_gpu_features(struct seq_file *m, void *data)
 	virtio_add_bool(m, "virgl", vgdev->has_virgl_3d);
 	virtio_add_bool(m, "edid", vgdev->has_edid);
 	virtio_add_bool(m, "indirect", vgdev->has_indirect);
+	virtio_add_bool(m, "resource uuid", vgdev->has_resource_assign_uuid);
 	virtio_add_int(m, "cap sets", vgdev->num_capsets);
 	virtio_add_int(m, "scanouts", vgdev->num_scanouts);
 	return 0;
-- 
2.26.2

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply related	[flat|nested] 39+ messages in thread

* [PATCH v2 04/23] virtio: Add get_shm_region method
  2020-09-02 21:08 [PATCH v2 00/23] Blob prerequisites + blob resources Gurchetan Singh
                   ` (2 preceding siblings ...)
  2020-09-02 21:08 ` [PATCH v2 03/23] drm/virtio: report uuid in debugfs Gurchetan Singh
@ 2020-09-02 21:08 ` Gurchetan Singh
  2020-09-02 22:15   ` Vivek Goyal
  2020-09-02 21:08 ` [PATCH v2 05/23] virtio: Implement get_shm_region for PCI transport Gurchetan Singh
                   ` (18 subsequent siblings)
  22 siblings, 1 reply; 39+ messages in thread
From: Gurchetan Singh @ 2020-09-02 21:08 UTC (permalink / raw)
  To: dri-devel, virtio-dev; +Cc: sebastien.boeuf, kraxel, vgoyal, mst

From: Sebastien Boeuf <sebastien.boeuf@intel.com>

Virtio defines 'shared memory regions' that provide a continuously
shared region between the host and guest.

Provide a method to find a particular region on a device.

Signed-off-by: Sebastien Boeuf <sebastien.boeuf@intel.com>
Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
Acked-by: Michael S. Tsirkin <mst@redhat.com>
Cc: kvm@vger.kernel.org
Cc: virtualization@lists.linux-foundation.org
Cc: "Michael S. Tsirkin" <mst@redhat.com>
---
 include/linux/virtio_config.h | 17 +++++++++++++++++
 1 file changed, 17 insertions(+)

diff --git a/include/linux/virtio_config.h b/include/linux/virtio_config.h
index 8fe857e27ef32..4b8e38c5c4d8c 100644
--- a/include/linux/virtio_config.h
+++ b/include/linux/virtio_config.h
@@ -11,6 +11,11 @@
 
 struct irq_affinity;
 
+struct virtio_shm_region {
+	u64 addr;
+	u64 len;
+};
+
 /**
  * virtio_config_ops - operations for configuring a virtio device
  * Note: Do not assume that a transport implements all of the operations
@@ -66,6 +71,7 @@ struct irq_affinity;
  *      the caller can then copy.
  * @set_vq_affinity: set the affinity for a virtqueue (optional).
  * @get_vq_affinity: get the affinity for a virtqueue (optional).
+ * @get_shm_region: get a shared memory region based on the index.
  */
 typedef void vq_callback_t(struct virtqueue *);
 struct virtio_config_ops {
@@ -89,6 +95,8 @@ struct virtio_config_ops {
 			       const struct cpumask *cpu_mask);
 	const struct cpumask *(*get_vq_affinity)(struct virtio_device *vdev,
 			int index);
+	bool (*get_shm_region)(struct virtio_device *vdev,
+			       struct virtio_shm_region *region, u8 id);
 };
 
 /* If driver didn't advertise the feature, it will never appear. */
@@ -251,6 +259,15 @@ int virtqueue_set_affinity(struct virtqueue *vq, const struct cpumask *cpu_mask)
 	return 0;
 }
 
+static inline
+bool virtio_get_shm_region(struct virtio_device *vdev,
+			   struct virtio_shm_region *region, u8 id)
+{
+	if (!vdev->config->get_shm_region)
+		return false;
+	return vdev->config->get_shm_region(vdev, region, id);
+}
+
 static inline bool virtio_is_little_endian(struct virtio_device *vdev)
 {
 	return virtio_has_feature(vdev, VIRTIO_F_VERSION_1) ||
-- 
2.26.2

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply related	[flat|nested] 39+ messages in thread

* [PATCH v2 05/23] virtio: Implement get_shm_region for PCI transport
  2020-09-02 21:08 [PATCH v2 00/23] Blob prerequisites + blob resources Gurchetan Singh
                   ` (3 preceding siblings ...)
  2020-09-02 21:08 ` [PATCH v2 04/23] virtio: Add get_shm_region method Gurchetan Singh
@ 2020-09-02 21:08 ` Gurchetan Singh
  2020-09-02 21:08 ` [PATCH v2 06/23] virtio: Implement get_shm_region for MMIO transport Gurchetan Singh
                   ` (17 subsequent siblings)
  22 siblings, 0 replies; 39+ messages in thread
From: Gurchetan Singh @ 2020-09-02 21:08 UTC (permalink / raw)
  To: dri-devel, virtio-dev; +Cc: sebastien.boeuf, kraxel, vgoyal, mst

From: Sebastien Boeuf <sebastien.boeuf@intel.com>

On PCI the shm regions are found using capability entries;
find a region by searching for the capability.

Signed-off-by: Sebastien Boeuf <sebastien.boeuf@intel.com>
Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
Signed-off-by: kbuild test robot <lkp@intel.com>
Acked-by: Michael S. Tsirkin <mst@redhat.com>
Cc: kvm@vger.kernel.org
Cc: virtualization@lists.linux-foundation.org
Cc: "Michael S. Tsirkin" <mst@redhat.com>
---
 drivers/virtio/virtio_pci_modern.c | 95 ++++++++++++++++++++++++++++++
 include/uapi/linux/virtio_pci.h    | 11 +++-
 2 files changed, 105 insertions(+), 1 deletion(-)

diff --git a/drivers/virtio/virtio_pci_modern.c b/drivers/virtio/virtio_pci_modern.c
index 3e14e700b2312..dc09f75feb7cc 100644
--- a/drivers/virtio/virtio_pci_modern.c
+++ b/drivers/virtio/virtio_pci_modern.c
@@ -444,6 +444,99 @@ static void del_vq(struct virtio_pci_vq_info *info)
 	vring_del_virtqueue(vq);
 }
 
+static int virtio_pci_find_shm_cap(struct pci_dev *dev, u8 required_id,
+				   u8 *bar, u64 *offset, u64 *len)
+{
+	int pos;
+
+	for (pos = pci_find_capability(dev, PCI_CAP_ID_VNDR); pos > 0;
+	     pos = pci_find_next_capability(dev, pos, PCI_CAP_ID_VNDR)) {
+		u8 type, cap_len, id;
+		u32 tmp32;
+		u64 res_offset, res_length;
+
+		pci_read_config_byte(dev, pos + offsetof(struct virtio_pci_cap,
+							 cfg_type), &type);
+		if (type != VIRTIO_PCI_CAP_SHARED_MEMORY_CFG)
+			continue;
+
+		pci_read_config_byte(dev, pos + offsetof(struct virtio_pci_cap,
+							 cap_len), &cap_len);
+		if (cap_len != sizeof(struct virtio_pci_cap64)) {
+			dev_err(&dev->dev, "%s: shm cap with bad size offset:"
+				" %d size: %d\n", __func__, pos, cap_len);
+			continue;
+		}
+
+		pci_read_config_byte(dev, pos + offsetof(struct virtio_pci_cap,
+							 id), &id);
+		if (id != required_id)
+			continue;
+
+		/* Type, and ID match, looks good */
+		pci_read_config_byte(dev, pos + offsetof(struct virtio_pci_cap,
+							 bar), bar);
+
+		/* Read the lower 32bit of length and offset */
+		pci_read_config_dword(dev, pos + offsetof(struct virtio_pci_cap,
+							  offset), &tmp32);
+		res_offset = tmp32;
+		pci_read_config_dword(dev, pos + offsetof(struct virtio_pci_cap,
+							  length), &tmp32);
+		res_length = tmp32;
+
+		/* and now the top half */
+		pci_read_config_dword(dev,
+				      pos + offsetof(struct virtio_pci_cap64,
+						     offset_hi), &tmp32);
+		res_offset |= ((u64)tmp32) << 32;
+		pci_read_config_dword(dev,
+				      pos + offsetof(struct virtio_pci_cap64,
+						     length_hi), &tmp32);
+		res_length |= ((u64)tmp32) << 32;
+
+		*offset = res_offset;
+		*len = res_length;
+
+		return pos;
+	}
+	return 0;
+}
+
+static bool vp_get_shm_region(struct virtio_device *vdev,
+			      struct virtio_shm_region *region, u8 id)
+{
+	struct virtio_pci_device *vp_dev = to_vp_device(vdev);
+	struct pci_dev *pci_dev = vp_dev->pci_dev;
+	u8 bar;
+	u64 offset, len;
+	phys_addr_t phys_addr;
+	size_t bar_len;
+
+	if (!virtio_pci_find_shm_cap(pci_dev, id, &bar, &offset, &len))
+		return false;
+
+	phys_addr = pci_resource_start(pci_dev, bar);
+	bar_len = pci_resource_len(pci_dev, bar);
+
+	if ((offset + len) < offset) {
+		dev_err(&pci_dev->dev, "%s: cap offset+len overflow detected\n",
+			__func__);
+		return false;
+	}
+
+	if (offset + len > bar_len) {
+		dev_err(&pci_dev->dev, "%s: bar shorter than cap offset+len\n",
+			__func__);
+		return false;
+	}
+
+	region->len = len;
+	region->addr = (u64)phys_addr + offset;
+
+	return true;
+}
+
 static const struct virtio_config_ops virtio_pci_config_nodev_ops = {
 	.get		= NULL,
 	.set		= NULL,
@@ -458,6 +551,7 @@ static const struct virtio_config_ops virtio_pci_config_nodev_ops = {
 	.bus_name	= vp_bus_name,
 	.set_vq_affinity = vp_set_vq_affinity,
 	.get_vq_affinity = vp_get_vq_affinity,
+	.get_shm_region  = vp_get_shm_region,
 };
 
 static const struct virtio_config_ops virtio_pci_config_ops = {
@@ -474,6 +568,7 @@ static const struct virtio_config_ops virtio_pci_config_ops = {
 	.bus_name	= vp_bus_name,
 	.set_vq_affinity = vp_set_vq_affinity,
 	.get_vq_affinity = vp_get_vq_affinity,
+	.get_shm_region  = vp_get_shm_region,
 };
 
 /**
diff --git a/include/uapi/linux/virtio_pci.h b/include/uapi/linux/virtio_pci.h
index 90007a1abcab1..3a86f36d7e3d9 100644
--- a/include/uapi/linux/virtio_pci.h
+++ b/include/uapi/linux/virtio_pci.h
@@ -113,6 +113,8 @@
 #define VIRTIO_PCI_CAP_DEVICE_CFG	4
 /* PCI configuration access */
 #define VIRTIO_PCI_CAP_PCI_CFG		5
+/* Additional shared memory capability */
+#define VIRTIO_PCI_CAP_SHARED_MEMORY_CFG 8
 
 /* This is the PCI capability header: */
 struct virtio_pci_cap {
@@ -121,11 +123,18 @@ struct virtio_pci_cap {
 	__u8 cap_len;		/* Generic PCI field: capability length */
 	__u8 cfg_type;		/* Identifies the structure. */
 	__u8 bar;		/* Where to find it. */
-	__u8 padding[3];	/* Pad to full dword. */
+	__u8 id;		/* Multiple capabilities of the same type */
+	__u8 padding[2];	/* Pad to full dword. */
 	__le32 offset;		/* Offset within bar. */
 	__le32 length;		/* Length of the structure, in bytes. */
 };
 
+struct virtio_pci_cap64 {
+	struct virtio_pci_cap cap;
+	__le32 offset_hi;             /* Most sig 32 bits of offset */
+	__le32 length_hi;             /* Most sig 32 bits of length */
+};
+
 struct virtio_pci_notify_cap {
 	struct virtio_pci_cap cap;
 	__le32 notify_off_multiplier;	/* Multiplier for queue_notify_off. */
-- 
2.26.2

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply related	[flat|nested] 39+ messages in thread

* [PATCH v2 06/23] virtio: Implement get_shm_region for MMIO transport
  2020-09-02 21:08 [PATCH v2 00/23] Blob prerequisites + blob resources Gurchetan Singh
                   ` (4 preceding siblings ...)
  2020-09-02 21:08 ` [PATCH v2 05/23] virtio: Implement get_shm_region for PCI transport Gurchetan Singh
@ 2020-09-02 21:08 ` Gurchetan Singh
  2020-09-02 21:08 ` [PATCH v2 07/23] drm/virtio: blob prep: refactor getting pages and attaching backing Gurchetan Singh
                   ` (16 subsequent siblings)
  22 siblings, 0 replies; 39+ messages in thread
From: Gurchetan Singh @ 2020-09-02 21:08 UTC (permalink / raw)
  To: dri-devel, virtio-dev; +Cc: sebastien.boeuf, kraxel, vgoyal, mst

From: Sebastien Boeuf <sebastien.boeuf@intel.com>

On MMIO a new set of registers is defined for finding SHM
regions.  Add their definitions and use them to find the region.

Signed-off-by: Sebastien Boeuf <sebastien.boeuf@intel.com>
Cc: kvm@vger.kernel.org
Cc: virtualization@lists.linux-foundation.org
Cc: "Michael S. Tsirkin" <mst@redhat.com>
---
 drivers/virtio/virtio_mmio.c     | 31 +++++++++++++++++++++++++++++++
 include/uapi/linux/virtio_mmio.h | 11 +++++++++++
 2 files changed, 42 insertions(+)

diff --git a/drivers/virtio/virtio_mmio.c b/drivers/virtio/virtio_mmio.c
index 627ac04874940..417113935b67a 100644
--- a/drivers/virtio/virtio_mmio.c
+++ b/drivers/virtio/virtio_mmio.c
@@ -498,6 +498,36 @@ static const char *vm_bus_name(struct virtio_device *vdev)
 	return vm_dev->pdev->name;
 }
 
+static bool vm_get_shm_region(struct virtio_device *vdev,
+			      struct virtio_shm_region *region, u8 id)
+{
+	struct virtio_mmio_device *vm_dev = to_virtio_mmio_device(vdev);
+	u64 len, addr;
+
+	/* Select the region we're interested in */
+	writel(id, vm_dev->base + VIRTIO_MMIO_SHM_SEL);
+
+	/* Read the region size */
+	len = (u64)readl(vm_dev->base + VIRTIO_MMIO_SHM_LEN_LOW);
+	len |= (u64)readl(vm_dev->base + VIRTIO_MMIO_SHM_LEN_HIGH) << 32;
+
+	region->len = len;
+
+	/* Check if region length is -1. If that's the case, the shared memory
+	 * region does not exist and there is no need to proceed further.
+	 */
+	if (len == ~(u64)0)
+		return false;
+
+	/* Read the region base address */
+	addr = (u64)readl(vm_dev->base + VIRTIO_MMIO_SHM_BASE_LOW);
+	addr |= (u64)readl(vm_dev->base + VIRTIO_MMIO_SHM_BASE_HIGH) << 32;
+
+	region->addr = addr;
+
+	return true;
+}
+
 static const struct virtio_config_ops virtio_mmio_config_ops = {
 	.get		= vm_get,
 	.set		= vm_set,
@@ -510,6 +540,7 @@ static const struct virtio_config_ops virtio_mmio_config_ops = {
 	.get_features	= vm_get_features,
 	.finalize_features = vm_finalize_features,
 	.bus_name	= vm_bus_name,
+	.get_shm_region = vm_get_shm_region,
 };
 
 
diff --git a/include/uapi/linux/virtio_mmio.h b/include/uapi/linux/virtio_mmio.h
index c4b09689ab644..0650f91bea6c7 100644
--- a/include/uapi/linux/virtio_mmio.h
+++ b/include/uapi/linux/virtio_mmio.h
@@ -122,6 +122,17 @@
 #define VIRTIO_MMIO_QUEUE_USED_LOW	0x0a0
 #define VIRTIO_MMIO_QUEUE_USED_HIGH	0x0a4
 
+/* Shared memory region id */
+#define VIRTIO_MMIO_SHM_SEL             0x0ac
+
+/* Shared memory region length, 64 bits in two halves */
+#define VIRTIO_MMIO_SHM_LEN_LOW         0x0b0
+#define VIRTIO_MMIO_SHM_LEN_HIGH        0x0b4
+
+/* Shared memory region base address, 64 bits in two halves */
+#define VIRTIO_MMIO_SHM_BASE_LOW        0x0b8
+#define VIRTIO_MMIO_SHM_BASE_HIGH       0x0bc
+
 /* Configuration atomicity value */
 #define VIRTIO_MMIO_CONFIG_GENERATION	0x0fc
 
-- 
2.26.2

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply related	[flat|nested] 39+ messages in thread

* [PATCH v2 07/23] drm/virtio: blob prep: refactor getting pages and attaching backing
  2020-09-02 21:08 [PATCH v2 00/23] Blob prerequisites + blob resources Gurchetan Singh
                   ` (5 preceding siblings ...)
  2020-09-02 21:08 ` [PATCH v2 06/23] virtio: Implement get_shm_region for MMIO transport Gurchetan Singh
@ 2020-09-02 21:08 ` Gurchetan Singh
  2020-09-02 21:08 ` [PATCH v2 08/23] drm/virtio: blob prep: make CPU responses more generic Gurchetan Singh
                   ` (15 subsequent siblings)
  22 siblings, 0 replies; 39+ messages in thread
From: Gurchetan Singh @ 2020-09-02 21:08 UTC (permalink / raw)
  To: dri-devel, virtio-dev; +Cc: sebastien.boeuf, kraxel, vgoyal, mst

Useful for upcoming blob resources.

Signed-off-by: Gurchetan Singh <gurchetansingh@chromium.org>
Acked-by: Tomeu Vizoso <tomeu.vizoso@collabora.com>
---
 drivers/gpu/drm/virtio/virtgpu_object.c | 16 ++++++++--------
 1 file changed, 8 insertions(+), 8 deletions(-)

diff --git a/drivers/gpu/drm/virtio/virtgpu_object.c b/drivers/gpu/drm/virtio/virtgpu_object.c
index 729f98ad7c020..32e9eae73fc2c 100644
--- a/drivers/gpu/drm/virtio/virtgpu_object.c
+++ b/drivers/gpu/drm/virtio/virtgpu_object.c
@@ -227,22 +227,22 @@ int virtio_gpu_object_create(struct virtio_gpu_device *vgdev,
 			goto err_put_objs;
 	}
 
+	ret = virtio_gpu_object_shmem_init(vgdev, bo, &ents, &nents);
+	if (ret != 0) {
+		virtio_gpu_free_object(&shmem_obj->base);
+		return ret;
+	}
+
 	if (params->virgl) {
 		virtio_gpu_cmd_resource_create_3d(vgdev, bo, params,
 						  objs, fence);
+		virtio_gpu_object_attach(vgdev, bo, ents, nents);
 	} else {
 		virtio_gpu_cmd_create_resource(vgdev, bo, params,
 					       objs, fence);
+		virtio_gpu_object_attach(vgdev, bo, ents, nents);
 	}
 
-	ret = virtio_gpu_object_shmem_init(vgdev, bo, &ents, &nents);
-	if (ret != 0) {
-		virtio_gpu_free_object(&shmem_obj->base);
-		return ret;
-	}
-
-	virtio_gpu_object_attach(vgdev, bo, ents, nents);
-
 	*bo_ptr = bo;
 	return 0;
 
-- 
2.26.2

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply related	[flat|nested] 39+ messages in thread

* [PATCH v2 08/23] drm/virtio: blob prep: make CPU responses more generic
  2020-09-02 21:08 [PATCH v2 00/23] Blob prerequisites + blob resources Gurchetan Singh
                   ` (6 preceding siblings ...)
  2020-09-02 21:08 ` [PATCH v2 07/23] drm/virtio: blob prep: refactor getting pages and attaching backing Gurchetan Singh
@ 2020-09-02 21:08 ` Gurchetan Singh
  2020-09-02 21:08 ` [PATCH v2 09/23] virtio-gpu api: blob resources Gurchetan Singh
                   ` (14 subsequent siblings)
  22 siblings, 0 replies; 39+ messages in thread
From: Gurchetan Singh @ 2020-09-02 21:08 UTC (permalink / raw)
  To: dri-devel, virtio-dev; +Cc: sebastien.boeuf, kraxel, vgoyal, mst

RESOURCE_MAP_BLOB / RESOURCE_UNMAP_BLOB can use this.

Signed-off-by: Gurchetan Singh <gurchetansingh@chromium.org>
Acked-by: Tomeu Vizoso <tomeu.vizoso@collabora.com>
---
 drivers/gpu/drm/virtio/virtgpu_drv.h   |  6 +++---
 drivers/gpu/drm/virtio/virtgpu_prime.c |  6 +++---
 drivers/gpu/drm/virtio/virtgpu_vq.c    | 10 +++++-----
 3 files changed, 11 insertions(+), 11 deletions(-)

diff --git a/drivers/gpu/drm/virtio/virtgpu_drv.h b/drivers/gpu/drm/virtio/virtgpu_drv.h
index a52b7a39f286e..f88e8902e1d61 100644
--- a/drivers/gpu/drm/virtio/virtgpu_drv.h
+++ b/drivers/gpu/drm/virtio/virtgpu_drv.h
@@ -49,9 +49,9 @@
 #define DRIVER_MINOR 1
 #define DRIVER_PATCHLEVEL 0
 
-#define UUID_INITIALIZING 0
-#define UUID_INITIALIZED 1
-#define UUID_INITIALIZATION_FAILED 2
+#define STATE_INITIALIZING 0
+#define STATE_OK 1
+#define STATE_ERR 2
 
 struct virtio_gpu_object_params {
 	uint32_t format;
diff --git a/drivers/gpu/drm/virtio/virtgpu_prime.c b/drivers/gpu/drm/virtio/virtgpu_prime.c
index acd14ef73d563..3552db128ba3d 100644
--- a/drivers/gpu/drm/virtio/virtgpu_prime.c
+++ b/drivers/gpu/drm/virtio/virtgpu_prime.c
@@ -34,8 +34,8 @@ static int virtgpu_virtio_get_uuid(struct dma_buf *buf,
 	struct virtio_gpu_object *bo = gem_to_virtio_gpu_obj(obj);
 	struct virtio_gpu_device *vgdev = obj->dev->dev_private;
 
-	wait_event(vgdev->resp_wq, bo->uuid_state != UUID_INITIALIZING);
-	if (bo->uuid_state != UUID_INITIALIZED)
+	wait_event(vgdev->resp_wq, bo->uuid_state != STATE_INITIALIZING);
+	if (bo->uuid_state != STATE_OK)
 		return -ENODEV;
 
 	uuid_copy(uuid, &bo->uuid);
@@ -81,7 +81,7 @@ struct dma_buf *virtgpu_gem_prime_export(struct drm_gem_object *obj,
 			return ERR_PTR(ret);
 		virtio_gpu_notify(vgdev);
 	} else {
-		bo->uuid_state = UUID_INITIALIZATION_FAILED;
+		bo->uuid_state = STATE_ERR;
 	}
 
 	exp_info.ops = &virtgpu_dmabuf_ops.ops;
diff --git a/drivers/gpu/drm/virtio/virtgpu_vq.c b/drivers/gpu/drm/virtio/virtgpu_vq.c
index 7436705ba5a22..deae7687eec3c 100644
--- a/drivers/gpu/drm/virtio/virtgpu_vq.c
+++ b/drivers/gpu/drm/virtio/virtgpu_vq.c
@@ -1122,14 +1122,14 @@ static void virtio_gpu_cmd_resource_uuid_cb(struct virtio_gpu_device *vgdev,
 	uint32_t resp_type = le32_to_cpu(resp->hdr.type);
 
 	spin_lock(&vgdev->resource_export_lock);
-	WARN_ON(obj->uuid_state != UUID_INITIALIZING);
+	WARN_ON(obj->uuid_state != STATE_INITIALIZING);
 
 	if (resp_type == VIRTIO_GPU_RESP_OK_RESOURCE_UUID &&
-	    obj->uuid_state == UUID_INITIALIZING) {
+	    obj->uuid_state == STATE_INITIALIZING) {
 		memcpy(&obj->uuid.b, resp->uuid, sizeof(obj->uuid.b));
-		obj->uuid_state = UUID_INITIALIZED;
+		obj->uuid_state = STATE_OK;
 	} else {
-		obj->uuid_state = UUID_INITIALIZATION_FAILED;
+		obj->uuid_state = STATE_ERR;
 	}
 	spin_unlock(&vgdev->resource_export_lock);
 
@@ -1148,7 +1148,7 @@ virtio_gpu_cmd_resource_assign_uuid(struct virtio_gpu_device *vgdev,
 	resp_buf = kzalloc(sizeof(*resp_buf), GFP_KERNEL);
 	if (!resp_buf) {
 		spin_lock(&vgdev->resource_export_lock);
-		bo->uuid_state = UUID_INITIALIZATION_FAILED;
+		bo->uuid_state = STATE_ERR;
 		spin_unlock(&vgdev->resource_export_lock);
 		virtio_gpu_array_put_free(objs);
 		return -ENOMEM;
-- 
2.26.2

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply related	[flat|nested] 39+ messages in thread

* [PATCH v2 09/23] virtio-gpu api: blob resources
  2020-09-02 21:08 [PATCH v2 00/23] Blob prerequisites + blob resources Gurchetan Singh
                   ` (7 preceding siblings ...)
  2020-09-02 21:08 ` [PATCH v2 08/23] drm/virtio: blob prep: make CPU responses more generic Gurchetan Singh
@ 2020-09-02 21:08 ` Gurchetan Singh
  2020-09-09  6:55   ` Gerd Hoffmann
  2020-09-02 21:08 ` [PATCH v2 10/23] virtio-gpu api: host visible feature Gurchetan Singh
                   ` (13 subsequent siblings)
  22 siblings, 1 reply; 39+ messages in thread
From: Gurchetan Singh @ 2020-09-02 21:08 UTC (permalink / raw)
  To: dri-devel, virtio-dev; +Cc: sebastien.boeuf, kraxel, vgoyal, mst

From: Gerd Hoffmann <kraxel@redhat.com>

A blob resource is a container for:
   - VIRTGPU_BLOB_MEM_GUEST: a guest memory allocation
     (referred to as a "guest-only blob resource")

   - VIRTGPU_BLOB_MEM_HOST3D: a host3d memory allocation
     (referred to as a "host-only blob resource")

   - VIRTGPU_BLOB_MEM_HOST3D_GUEST: a guest + host3d memory allocation
     (referred to as a "default blob resource").

The memory properties of the blob resource must be described by
`blob_mem`.

For default and guest only blob resources set, `nents` guest system
pages are assigned to the resource.  For default blob resources,
these guest pages are used for transfer operations. Attach/detach is
also possible to allow swap-in/swap-out, but isn't required since it
may not be applicable to future blob mem types
(shared guest/guest vram).

Host allocations depend on whether the 3D is supported. If 3D is not
supported, the only valid field for `blob_mem` is
VIRTGPU_BLOB_MEM_GUEST.

If 3D is supported, the virtio-gpu resource is created from the
context local object identified by the `blob_id`. The actual host
allocation done by the EXECBUFFER ioctl or for convenience the
`cmd` field in the RESOURCE_CREATE_BLOB ioctl.

Userspace must specify if the blob resource is intended to be used
for userspace mapping, sharing between virtio-gpu contexts and/or
sharing between virtio devices. This is done via `blob_flags`.

For 3D hosts, both VIRTIO_GPU_CMD_TRANSFER_TO_HOST_3D and
VIRTIO_GPU_CMD_TRANSFER_FROM_HOST_3D may be used to update
the host resource. There is no restriction on the image/buffer
view the guest/host userspace has on the blob resource.

VIRTIO_GPU_CMD_SET_SCANOUT_BLOB / VIRTIO_GPU_CMD_RESOURCE_FLUSH may
be used with blob resources as well.  The modifier is intentionally
left out of SCANOUT_BLOB, and auxilary blobs are also left out
as a simplification.

The use case for blob resources is zero-copy, needed for coherent
memory in virglrenderer. Host only blob resources are not mappable
without the feature described in the next patch, but are shareable.

Future work:
   - Emulated coherent `blob_mem` type for QEMU/vhost-user
   - A `blob_mem` type for guest-only resources imported in
     cache-coherent FOSS GPU/display drivers.
   - Display integration involving the blob model using seamless
     Wayland windows.

Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
Co-developed-by: Gurchetan Singh <gurchetansingh@chromium.org>
Signed-off-by: Gurchetan Singh <gurchetansingh@chromium.org>
Acked-by: Tomeu Vizoso <tomeu.vizoso@collabora.com>
Acked-by: Chia-I Wu <olvaffe@gmail.com>
Acked-by: Lingfeng Yang <lfy@google.com>
---
 include/uapi/drm/virtgpu_drm.h  | 37 +++++++++++++++++++++++++++-
 include/uapi/linux/virtio_gpu.h | 43 +++++++++++++++++++++++++++++++++
 2 files changed, 79 insertions(+), 1 deletion(-)

diff --git a/include/uapi/drm/virtgpu_drm.h b/include/uapi/drm/virtgpu_drm.h
index f06a789f34cd9..bb224f604c9e3 100644
--- a/include/uapi/drm/virtgpu_drm.h
+++ b/include/uapi/drm/virtgpu_drm.h
@@ -46,6 +46,7 @@ extern "C" {
 #define DRM_VIRTGPU_TRANSFER_TO_HOST 0x07
 #define DRM_VIRTGPU_WAIT     0x08
 #define DRM_VIRTGPU_GET_CAPS  0x09
+#define DRM_VIRTGPU_RESOURCE_CREATE_BLOB 0x0a
 
 #define VIRTGPU_EXECBUF_FENCE_FD_IN	0x01
 #define VIRTGPU_EXECBUF_FENCE_FD_OUT	0x02
@@ -71,6 +72,7 @@ struct drm_virtgpu_execbuffer {
 
 #define VIRTGPU_PARAM_3D_FEATURES 1 /* do we have 3D features in the hw */
 #define VIRTGPU_PARAM_CAPSET_QUERY_FIX 2 /* do we have the capset fix */
+#define VIRTGPU_PARAM_RESOURCE_BLOB 3 /* DRM_VIRTGPU_RESOURCE_CREATE_BLOB */
 
 struct drm_virtgpu_getparam {
 	__u64 param;
@@ -100,7 +102,7 @@ struct drm_virtgpu_resource_info {
 	__u32 bo_handle;
 	__u32 res_handle;
 	__u32 size;
-	__u32 stride;
+	__u32 blob_mem;
 };
 
 struct drm_virtgpu_3d_box {
@@ -117,6 +119,8 @@ struct drm_virtgpu_3d_transfer_to_host {
 	struct drm_virtgpu_3d_box box;
 	__u32 level;
 	__u32 offset;
+	__u32 stride;
+	__u32 layer_stride;
 };
 
 struct drm_virtgpu_3d_transfer_from_host {
@@ -124,6 +128,8 @@ struct drm_virtgpu_3d_transfer_from_host {
 	struct drm_virtgpu_3d_box box;
 	__u32 level;
 	__u32 offset;
+	__u32 stride;
+	__u32 layer_stride;
 };
 
 #define VIRTGPU_WAIT_NOWAIT 1 /* like it */
@@ -140,6 +146,31 @@ struct drm_virtgpu_get_caps {
 	__u32 pad;
 };
 
+struct drm_virtgpu_resource_create_blob {
+#define VIRTGPU_BLOB_MEM_GUEST             0x0001
+#define VIRTGPU_BLOB_MEM_HOST3D            0x0002
+#define VIRTGPU_BLOB_MEM_HOST3D_GUEST      0x0003
+
+#define VIRTGPU_BLOB_FLAG_USE_MAPPABLE     0x0001
+#define VIRTGPU_BLOB_FLAG_USE_SHAREABLE    0x0002
+#define VIRTGPU_BLOB_FLAG_USE_CROSS_DEVICE 0x0004
+	/* zero is invalid blob_mem */
+	__u32 blob_mem;
+	__u32 blob_flags;
+	__u32 bo_handle;
+	__u32 res_handle;
+	__u64 size;
+
+	/*
+	 * for 3D contexts with VIRTGPU_BLOB_MEM_HOST3D_GUEST and
+	 * VIRTGPU_BLOB_MEM_HOST3D otherwise, must be zero.
+	 */
+	__u32 pad;
+	__u32 cmd_size;
+	__u64 cmd;
+	__u64 blob_id;
+};
+
 #define DRM_IOCTL_VIRTGPU_MAP \
 	DRM_IOWR(DRM_COMMAND_BASE + DRM_VIRTGPU_MAP, struct drm_virtgpu_map)
 
@@ -175,6 +206,10 @@ struct drm_virtgpu_get_caps {
 	DRM_IOWR(DRM_COMMAND_BASE + DRM_VIRTGPU_GET_CAPS, \
 	struct drm_virtgpu_get_caps)
 
+#define DRM_IOCTL_VIRTGPU_RESOURCE_CREATE_BLOB				\
+	DRM_IOWR(DRM_COMMAND_BASE + DRM_VIRTGPU_RESOURCE_CREATE_BLOB,	\
+		struct drm_virtgpu_resource_create_blob)
+
 #if defined(__cplusplus)
 }
 #endif
diff --git a/include/uapi/linux/virtio_gpu.h b/include/uapi/linux/virtio_gpu.h
index 747a5c5cc4e60..4ddf2fe342ed0 100644
--- a/include/uapi/linux/virtio_gpu.h
+++ b/include/uapi/linux/virtio_gpu.h
@@ -55,6 +55,11 @@
  */
 #define VIRTIO_GPU_F_RESOURCE_UUID       2
 
+/*
+ * VIRTIO_GPU_CMD_RESOURCE_CREATE_BLOB
+ */
+#define VIRTIO_GPU_F_RESOURCE_BLOB       3
+
 enum virtio_gpu_ctrl_type {
 	VIRTIO_GPU_UNDEFINED = 0,
 
@@ -71,6 +76,8 @@ enum virtio_gpu_ctrl_type {
 	VIRTIO_GPU_CMD_GET_CAPSET,
 	VIRTIO_GPU_CMD_GET_EDID,
 	VIRTIO_GPU_CMD_RESOURCE_ASSIGN_UUID,
+	VIRTIO_GPU_CMD_RESOURCE_CREATE_BLOB,
+	VIRTIO_GPU_CMD_SET_SCANOUT_BLOB,
 
 	/* 3d commands */
 	VIRTIO_GPU_CMD_CTX_CREATE = 0x0200,
@@ -359,4 +366,40 @@ struct virtio_gpu_resp_resource_uuid {
 	__u8 uuid[16];
 };
 
+/* VIRTIO_GPU_CMD_RESOURCE_CREATE_BLOB */
+struct virtio_gpu_resource_create_blob {
+	struct virtio_gpu_ctrl_hdr hdr;
+	__le32 resource_id;
+#define VIRTIO_GPU_BLOB_MEM_GUEST             0x0001
+#define VIRTIO_GPU_BLOB_MEM_HOST3D            0x0002
+#define VIRTIO_GPU_BLOB_MEM_HOST3D_GUEST      0x0003
+
+#define VIRTIO_GPU_BLOB_FLAG_USE_MAPPABLE     0x0001
+#define VIRTIO_GPU_BLOB_FLAG_USE_SHAREABLE    0x0002
+#define VIRTIO_GPU_BLOB_FLAG_USE_CROSS_DEVICE 0x0004
+	/* zero is invalid blob mem */
+	__le32 blob_mem;
+	__le32 blob_flags;
+	__le64 blob_id;
+	__le64 size;
+	__le32 nr_entries;
+	/*
+	 * sizeof(nr_entries * virtio_gpu_mem_entry) bytes follow
+	 */
+};
+
+/* VIRTIO_GPU_CMD_SET_SCANOUT_BLOB */
+struct virtio_gpu_set_scanout_blob {
+	struct virtio_gpu_ctrl_hdr hdr;
+	struct virtio_gpu_rect r;
+	__le32 scanout_id;
+	__le32 resource_id;
+	__le32 width;
+	__le32 height;
+	__le32 format;
+	__le32 padding;
+	__le32 strides[4];
+	__le32 offsets[4];
+};
+
 #endif
-- 
2.26.2

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply related	[flat|nested] 39+ messages in thread

* [PATCH v2 10/23] virtio-gpu api: host visible feature
  2020-09-02 21:08 [PATCH v2 00/23] Blob prerequisites + blob resources Gurchetan Singh
                   ` (8 preceding siblings ...)
  2020-09-02 21:08 ` [PATCH v2 09/23] virtio-gpu api: blob resources Gurchetan Singh
@ 2020-09-02 21:08 ` Gurchetan Singh
  2020-09-09  7:05   ` Gerd Hoffmann
  2020-09-09  7:09   ` Gerd Hoffmann
  2020-09-02 21:08 ` [PATCH v2 11/23] virtio-gpu api: cross-device feature Gurchetan Singh
                   ` (12 subsequent siblings)
  22 siblings, 2 replies; 39+ messages in thread
From: Gurchetan Singh @ 2020-09-02 21:08 UTC (permalink / raw)
  To: dri-devel, virtio-dev; +Cc: sebastien.boeuf, kraxel, vgoyal, mst

From: Gerd Hoffmann <kraxel@redhat.com>

This patch adds a new virtgpu feature that allows directly
mapping host allocated resources.

This is based on virtio shared memory regions, which allows
querying for memory regions using PCI transport. Each shared
memory region has an associated "shmid", the meaning of which
is device specific.

For virtio-gpu, we can define the shared memory region with id
VIRTIO_GPU_SHM_ID_HOST_VISIBLE to be the "host visible memory
region".

The presence of the host visible memory region means the following
hypercalls are supported:

1) VIRTIO_GPU_CMD_RESOURCE_MAP_BLOB

This hypercall tells the host to inject the host resource's
mapping in an offset into virtio-gpu's PCI address space.
This is typically done via KVM_SET_USER_MEMORY_REGION on Linux
hosts.

On success, VIRTIO_GPU_RESP_OK_MAP_INFO is returned, which
specifies the host buffer's caching type and possibly in the
future performance hints about the buffer..

2) VIRTIO_GPU_CMD_RESOURCE_UNMAP_BLOB

This hypercall tells the host to remove the host resource's
mapping from the guest VM.

Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
Co-developed-by: Gurchetan Singh <gurchetansingh@chromium.org>
Signed-off-by: Gurchetan Singh <gurchetansingh@chromium.org>
Acked-by: Tomeu Vizoso <tomeu.vizoso@collabora.com>
Acked-by: Lingfeng Yang <lfy@google.com>
---
 include/uapi/drm/virtgpu_drm.h  |  1 +
 include/uapi/linux/virtio_gpu.h | 35 +++++++++++++++++++++++++++++++++
 2 files changed, 36 insertions(+)

diff --git a/include/uapi/drm/virtgpu_drm.h b/include/uapi/drm/virtgpu_drm.h
index bb224f604c9e3..e1b1518f9acc5 100644
--- a/include/uapi/drm/virtgpu_drm.h
+++ b/include/uapi/drm/virtgpu_drm.h
@@ -73,6 +73,7 @@ struct drm_virtgpu_execbuffer {
 #define VIRTGPU_PARAM_3D_FEATURES 1 /* do we have 3D features in the hw */
 #define VIRTGPU_PARAM_CAPSET_QUERY_FIX 2 /* do we have the capset fix */
 #define VIRTGPU_PARAM_RESOURCE_BLOB 3 /* DRM_VIRTGPU_RESOURCE_CREATE_BLOB */
+#define VIRTGPU_PARAM_HOST_VISIBLE 4 /* Host blob resources are mappable */
 
 struct drm_virtgpu_getparam {
 	__u64 param;
diff --git a/include/uapi/linux/virtio_gpu.h b/include/uapi/linux/virtio_gpu.h
index 4ddf2fe342ed0..fa2ae4a1da5f9 100644
--- a/include/uapi/linux/virtio_gpu.h
+++ b/include/uapi/linux/virtio_gpu.h
@@ -88,6 +88,8 @@ enum virtio_gpu_ctrl_type {
 	VIRTIO_GPU_CMD_TRANSFER_TO_HOST_3D,
 	VIRTIO_GPU_CMD_TRANSFER_FROM_HOST_3D,
 	VIRTIO_GPU_CMD_SUBMIT_3D,
+	VIRTIO_GPU_CMD_RESOURCE_MAP_BLOB,
+	VIRTIO_GPU_CMD_RESOURCE_UNMAP_BLOB,
 
 	/* cursor commands */
 	VIRTIO_GPU_CMD_UPDATE_CURSOR = 0x0300,
@@ -100,6 +102,7 @@ enum virtio_gpu_ctrl_type {
 	VIRTIO_GPU_RESP_OK_CAPSET,
 	VIRTIO_GPU_RESP_OK_EDID,
 	VIRTIO_GPU_RESP_OK_RESOURCE_UUID,
+	VIRTIO_GPU_RESP_OK_MAP_INFO,
 
 	/* error responses */
 	VIRTIO_GPU_RESP_ERR_UNSPEC = 0x1200,
@@ -110,6 +113,11 @@ enum virtio_gpu_ctrl_type {
 	VIRTIO_GPU_RESP_ERR_INVALID_PARAMETER,
 };
 
+enum virtio_gpu_shm_id {
+	VIRTIO_GPU_SHM_ID_UNDEFINED = 0,
+	VIRTIO_GPU_SHM_ID_HOST_VISIBLE = 1
+};
+
 #define VIRTIO_GPU_FLAG_FENCE (1 << 0)
 
 struct virtio_gpu_ctrl_hdr {
@@ -402,4 +410,31 @@ struct virtio_gpu_set_scanout_blob {
 	__le32 offsets[4];
 };
 
+/* VIRTIO_GPU_CMD_RESOURCE_MAP_BLOB */
+struct virtio_gpu_resource_map_blob {
+	struct virtio_gpu_ctrl_hdr hdr;
+	__le32 resource_id;
+	__le32 padding;
+	__le64 offset;
+};
+
+/* VIRTIO_GPU_RESP_OK_MAP_INFO */
+#define VIRTIO_GPU_MAP_CACHE_MASK     0x0f
+#define VIRTIO_GPU_MAP_CACHE_NONE     0x00
+#define VIRTIO_GPU_MAP_CACHE_CACHED   0x01
+#define VIRTIO_GPU_MAP_CACHE_UNCACHED 0x02
+#define VIRTIO_GPU_MAP_CACHE_WC       0x03
+struct virtio_gpu_resp_map_info {
+	struct virtio_gpu_ctrl_hdr hdr;
+	__u32 map_info;
+	__u32 padding;
+};
+
+/* VIRTIO_GPU_CMD_RESOURCE_UNMAP_BLOB */
+struct virtio_gpu_resource_unmap_blob {
+	struct virtio_gpu_ctrl_hdr hdr;
+	__le32 resource_id;
+	__le32 padding;
+};
+
 #endif
-- 
2.26.2

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply related	[flat|nested] 39+ messages in thread

* [PATCH v2 11/23] virtio-gpu api: cross-device feature
  2020-09-02 21:08 [PATCH v2 00/23] Blob prerequisites + blob resources Gurchetan Singh
                   ` (9 preceding siblings ...)
  2020-09-02 21:08 ` [PATCH v2 10/23] virtio-gpu api: host visible feature Gurchetan Singh
@ 2020-09-02 21:08 ` Gurchetan Singh
  2020-09-02 21:08 ` [PATCH v2 12/23] drm/virtio: implement blob resources: probe for the feature Gurchetan Singh
                   ` (11 subsequent siblings)
  22 siblings, 0 replies; 39+ messages in thread
From: Gurchetan Singh @ 2020-09-02 21:08 UTC (permalink / raw)
  To: dri-devel, virtio-dev; +Cc: sebastien.boeuf, kraxel, vgoyal, mst

This feature was recently added to virtio-gpu, lets make
it userspace queryable.

Signed-off-by: Gurchetan Singh <gurchetansingh@chromium.org>
Acked-by: Tomeu Vizoso <tomeu.vizoso@collabora.com>
---
 include/uapi/drm/virtgpu_drm.h | 1 +
 1 file changed, 1 insertion(+)

diff --git a/include/uapi/drm/virtgpu_drm.h b/include/uapi/drm/virtgpu_drm.h
index e1b1518f9acc5..b9ec26e9c6463 100644
--- a/include/uapi/drm/virtgpu_drm.h
+++ b/include/uapi/drm/virtgpu_drm.h
@@ -74,6 +74,7 @@ struct drm_virtgpu_execbuffer {
 #define VIRTGPU_PARAM_CAPSET_QUERY_FIX 2 /* do we have the capset fix */
 #define VIRTGPU_PARAM_RESOURCE_BLOB 3 /* DRM_VIRTGPU_RESOURCE_CREATE_BLOB */
 #define VIRTGPU_PARAM_HOST_VISIBLE 4 /* Host blob resources are mappable */
+#define VIRTGPU_PARAM_CROSS_DEVICE 5 /* Cross virtio-device resource sharing  */
 
 struct drm_virtgpu_getparam {
 	__u64 param;
-- 
2.26.2

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply related	[flat|nested] 39+ messages in thread

* [PATCH v2 12/23] drm/virtio: implement blob resources: probe for the feature.
  2020-09-02 21:08 [PATCH v2 00/23] Blob prerequisites + blob resources Gurchetan Singh
                   ` (10 preceding siblings ...)
  2020-09-02 21:08 ` [PATCH v2 11/23] virtio-gpu api: cross-device feature Gurchetan Singh
@ 2020-09-02 21:08 ` Gurchetan Singh
  2020-09-02 21:08 ` [PATCH v2 13/23] drm/virtio: implement blob resources: probe for host visible region Gurchetan Singh
                   ` (10 subsequent siblings)
  22 siblings, 0 replies; 39+ messages in thread
From: Gurchetan Singh @ 2020-09-02 21:08 UTC (permalink / raw)
  To: dri-devel, virtio-dev; +Cc: sebastien.boeuf, kraxel, vgoyal, mst

From: Gerd Hoffmann <kraxel@redhat.com>

Let's proble for VIRTIO_GPU_F_RESOURCE_BLOB.

Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
Signed-off-by: Gurchetan Singh <gurchetansingh@chromium.org>
Acked-by: Tomeu Vizoso <tomeu.vizoso@collabora.com>
---
 drivers/gpu/drm/virtio/virtgpu_debugfs.c |  1 +
 drivers/gpu/drm/virtio/virtgpu_drv.c     |  1 +
 drivers/gpu/drm/virtio/virtgpu_drv.h     |  1 +
 drivers/gpu/drm/virtio/virtgpu_kms.c     | 10 +++++++---
 4 files changed, 10 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/virtio/virtgpu_debugfs.c b/drivers/gpu/drm/virtio/virtgpu_debugfs.c
index d5b0c543bd6d7..6b9b8376613f0 100644
--- a/drivers/gpu/drm/virtio/virtgpu_debugfs.c
+++ b/drivers/gpu/drm/virtio/virtgpu_debugfs.c
@@ -49,6 +49,7 @@ static int virtio_gpu_features(struct seq_file *m, void *data)
 	virtio_add_bool(m, "edid", vgdev->has_edid);
 	virtio_add_bool(m, "indirect", vgdev->has_indirect);
 	virtio_add_bool(m, "resource uuid", vgdev->has_resource_assign_uuid);
+	virtio_add_bool(m, "blob resources", vgdev->has_resource_blob);
 	virtio_add_int(m, "cap sets", vgdev->num_capsets);
 	virtio_add_int(m, "scanouts", vgdev->num_scanouts);
 	return 0;
diff --git a/drivers/gpu/drm/virtio/virtgpu_drv.c b/drivers/gpu/drm/virtio/virtgpu_drv.c
index b039f493bda99..3d04e428be140 100644
--- a/drivers/gpu/drm/virtio/virtgpu_drv.c
+++ b/drivers/gpu/drm/virtio/virtgpu_drv.c
@@ -166,6 +166,7 @@ static unsigned int features[] = {
 #endif
 	VIRTIO_GPU_F_EDID,
 	VIRTIO_GPU_F_RESOURCE_UUID,
+	VIRTIO_GPU_F_RESOURCE_BLOB,
 };
 static struct virtio_driver virtio_gpu_driver = {
 	.feature_table = features,
diff --git a/drivers/gpu/drm/virtio/virtgpu_drv.h b/drivers/gpu/drm/virtio/virtgpu_drv.h
index f88e8902e1d61..f73e184f79e1a 100644
--- a/drivers/gpu/drm/virtio/virtgpu_drv.h
+++ b/drivers/gpu/drm/virtio/virtgpu_drv.h
@@ -208,6 +208,7 @@ struct virtio_gpu_device {
 	bool has_edid;
 	bool has_indirect;
 	bool has_resource_assign_uuid;
+	bool has_resource_blob;
 
 	struct work_struct config_changed_work;
 
diff --git a/drivers/gpu/drm/virtio/virtgpu_kms.c b/drivers/gpu/drm/virtio/virtgpu_kms.c
index 06af537b0091d..6cc08f234ad5e 100644
--- a/drivers/gpu/drm/virtio/virtgpu_kms.c
+++ b/drivers/gpu/drm/virtio/virtgpu_kms.c
@@ -152,10 +152,14 @@ int virtio_gpu_init(struct drm_device *dev)
 	if (virtio_has_feature(vgdev->vdev, VIRTIO_GPU_F_RESOURCE_UUID)) {
 		vgdev->has_resource_assign_uuid = true;
 	}
+	if (virtio_has_feature(vgdev->vdev, VIRTIO_GPU_F_RESOURCE_BLOB)) {
+		vgdev->has_resource_blob = true;
+	}
 
-	DRM_INFO("features: %cvirgl %cedid\n",
-		 vgdev->has_virgl_3d ? '+' : '-',
-		 vgdev->has_edid     ? '+' : '-');
+	DRM_INFO("features: %cvirgl %cedid %cresource_blob\n",
+		 vgdev->has_virgl_3d    ? '+' : '-',
+		 vgdev->has_edid        ? '+' : '-',
+		 vgdev->has_resource_blob ? '+' : '-');
 
 	ret = virtio_find_vqs(vgdev->vdev, 2, vqs, callbacks, names, NULL);
 	if (ret) {
-- 
2.26.2

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply related	[flat|nested] 39+ messages in thread

* [PATCH v2 13/23] drm/virtio: implement blob resources: probe for host visible region
  2020-09-02 21:08 [PATCH v2 00/23] Blob prerequisites + blob resources Gurchetan Singh
                   ` (11 preceding siblings ...)
  2020-09-02 21:08 ` [PATCH v2 12/23] drm/virtio: implement blob resources: probe for the feature Gurchetan Singh
@ 2020-09-02 21:08 ` Gurchetan Singh
  2020-09-02 21:08 ` [PATCH v2 14/23] drm/virtio: implement blob resources: expose virtio_gpu_resource_id_get Gurchetan Singh
                   ` (9 subsequent siblings)
  22 siblings, 0 replies; 39+ messages in thread
From: Gurchetan Singh @ 2020-09-02 21:08 UTC (permalink / raw)
  To: dri-devel, virtio-dev; +Cc: sebastien.boeuf, kraxel, vgoyal, mst

From: Gerd Hoffmann <kraxel@redhat.com>

The availability of the host visible region means host 3D
allocations can be directly mapped in the guest.

Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
Co-developed-by: Gurchetan Singh <gurchetansingh@chromium.org>
Signed-off-by: Gurchetan Singh <gurchetansingh@chromium.org>
Acked-by: Tomeu Vizoso <tomeu.vizoso@collabora.com>
---
 drivers/gpu/drm/virtio/virtgpu_debugfs.c |  5 +++++
 drivers/gpu/drm/virtio/virtgpu_drv.h     |  2 ++
 drivers/gpu/drm/virtio/virtgpu_kms.c     | 27 ++++++++++++++++++++++--
 3 files changed, 32 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/virtio/virtgpu_debugfs.c b/drivers/gpu/drm/virtio/virtgpu_debugfs.c
index 6b9b8376613f0..a2cdd267914ac 100644
--- a/drivers/gpu/drm/virtio/virtgpu_debugfs.c
+++ b/drivers/gpu/drm/virtio/virtgpu_debugfs.c
@@ -52,6 +52,11 @@ static int virtio_gpu_features(struct seq_file *m, void *data)
 	virtio_add_bool(m, "blob resources", vgdev->has_resource_blob);
 	virtio_add_int(m, "cap sets", vgdev->num_capsets);
 	virtio_add_int(m, "scanouts", vgdev->num_scanouts);
+	if (vgdev->host_visible_region.len) {
+		seq_printf(m, "%-16s : 0x%lx +0x%lx\n", "host visible region",
+			   (unsigned long)vgdev->host_visible_region.addr,
+			   (unsigned long)vgdev->host_visible_region.len);
+	}
 	return 0;
 }
 
diff --git a/drivers/gpu/drm/virtio/virtgpu_drv.h b/drivers/gpu/drm/virtio/virtgpu_drv.h
index f73e184f79e1a..72abeaa3c4872 100644
--- a/drivers/gpu/drm/virtio/virtgpu_drv.h
+++ b/drivers/gpu/drm/virtio/virtgpu_drv.h
@@ -209,6 +209,8 @@ struct virtio_gpu_device {
 	bool has_indirect;
 	bool has_resource_assign_uuid;
 	bool has_resource_blob;
+	bool has_host_visible;
+	struct virtio_shm_region host_visible_region;
 
 	struct work_struct config_changed_work;
 
diff --git a/drivers/gpu/drm/virtio/virtgpu_kms.c b/drivers/gpu/drm/virtio/virtgpu_kms.c
index 6cc08f234ad5e..97b6e4fb945a7 100644
--- a/drivers/gpu/drm/virtio/virtgpu_kms.c
+++ b/drivers/gpu/drm/virtio/virtgpu_kms.c
@@ -155,11 +155,27 @@ int virtio_gpu_init(struct drm_device *dev)
 	if (virtio_has_feature(vgdev->vdev, VIRTIO_GPU_F_RESOURCE_BLOB)) {
 		vgdev->has_resource_blob = true;
 	}
+	if (virtio_get_shm_region(vgdev->vdev, &vgdev->host_visible_region,
+				  VIRTIO_GPU_SHM_ID_HOST_VISIBLE)) {
+		if (!devm_request_mem_region(&vgdev->vdev->dev,
+					     vgdev->host_visible_region.addr,
+					     vgdev->host_visible_region.len,
+					     dev_name(&vgdev->vdev->dev))) {
+			DRM_ERROR("Could not reserve host visible region\n");
+			goto err_vqs;
+		}
+
+		DRM_INFO("Host memory window: 0x%lx +0x%lx\n",
+			 (unsigned long)vgdev->host_visible_region.addr,
+			 (unsigned long)vgdev->host_visible_region.len);
+		vgdev->has_host_visible = true;
+	}
 
-	DRM_INFO("features: %cvirgl %cedid %cresource_blob\n",
+	DRM_INFO("features: %cvirgl %cedid %cresource_blob %chost_visible\n",
 		 vgdev->has_virgl_3d    ? '+' : '-',
 		 vgdev->has_edid        ? '+' : '-',
-		 vgdev->has_resource_blob ? '+' : '-');
+		 vgdev->has_resource_blob ? '+' : '-',
+		 vgdev->has_host_visible ? '+' : '-');
 
 	ret = virtio_find_vqs(vgdev->vdev, 2, vqs, callbacks, names, NULL);
 	if (ret) {
@@ -243,6 +259,13 @@ void virtio_gpu_release(struct drm_device *dev)
 	virtio_gpu_free_vbufs(vgdev);
 	virtio_gpu_cleanup_cap_cache(vgdev);
 	kfree(vgdev->capsets);
+
+	if (vgdev->has_host_visible) {
+		devm_release_mem_region(&vgdev->vdev->dev,
+					vgdev->host_visible_region.addr,
+					vgdev->host_visible_region.len);
+	}
+
 	kfree(vgdev);
 }
 
-- 
2.26.2

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply related	[flat|nested] 39+ messages in thread

* [PATCH v2 14/23] drm/virtio: implement blob resources: expose virtio_gpu_resource_id_get
  2020-09-02 21:08 [PATCH v2 00/23] Blob prerequisites + blob resources Gurchetan Singh
                   ` (12 preceding siblings ...)
  2020-09-02 21:08 ` [PATCH v2 13/23] drm/virtio: implement blob resources: probe for host visible region Gurchetan Singh
@ 2020-09-02 21:08 ` Gurchetan Singh
  2020-09-02 21:08 ` [PATCH v2 15/23] drm/virtio: implement blob resources: add new fields to internal structs Gurchetan Singh
                   ` (8 subsequent siblings)
  22 siblings, 0 replies; 39+ messages in thread
From: Gurchetan Singh @ 2020-09-02 21:08 UTC (permalink / raw)
  To: dri-devel, virtio-dev; +Cc: sebastien.boeuf, kraxel, vgoyal, mst

VRAM object will need it.

Signed-off-by: Gurchetan Singh <gurchetansingh@chromium.org>
Acked-by: Tomeu Vizoso <tomeu.vizoso@collabora.com>
---
 drivers/gpu/drm/virtio/virtgpu_drv.h    | 2 ++
 drivers/gpu/drm/virtio/virtgpu_object.c | 3 +--
 2 files changed, 3 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/virtio/virtgpu_drv.h b/drivers/gpu/drm/virtio/virtgpu_drv.h
index 72abeaa3c4872..bddc071c20bf5 100644
--- a/drivers/gpu/drm/virtio/virtgpu_drv.h
+++ b/drivers/gpu/drm/virtio/virtgpu_drv.h
@@ -384,6 +384,8 @@ int virtio_gpu_object_create(struct virtio_gpu_device *vgdev,
 
 bool virtio_gpu_is_shmem(struct virtio_gpu_object *bo);
 
+int virtio_gpu_resource_id_get(struct virtio_gpu_device *vgdev,
+			       uint32_t *resid);
 /* virtgpu_prime.c */
 struct dma_buf *virtgpu_gem_prime_export(struct drm_gem_object *obj,
 					 int flags);
diff --git a/drivers/gpu/drm/virtio/virtgpu_object.c b/drivers/gpu/drm/virtio/virtgpu_object.c
index 32e9eae73fc2c..f7064c1c23fd9 100644
--- a/drivers/gpu/drm/virtio/virtgpu_object.c
+++ b/drivers/gpu/drm/virtio/virtgpu_object.c
@@ -31,8 +31,7 @@
 static int virtio_gpu_virglrenderer_workaround = 1;
 module_param_named(virglhack, virtio_gpu_virglrenderer_workaround, int, 0400);
 
-static int virtio_gpu_resource_id_get(struct virtio_gpu_device *vgdev,
-				       uint32_t *resid)
+int virtio_gpu_resource_id_get(struct virtio_gpu_device *vgdev, uint32_t *resid)
 {
 	if (virtio_gpu_virglrenderer_workaround) {
 		/*
-- 
2.26.2

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply related	[flat|nested] 39+ messages in thread

* [PATCH v2 15/23] drm/virtio: implement blob resources: add new fields to internal structs
  2020-09-02 21:08 [PATCH v2 00/23] Blob prerequisites + blob resources Gurchetan Singh
                   ` (13 preceding siblings ...)
  2020-09-02 21:08 ` [PATCH v2 14/23] drm/virtio: implement blob resources: expose virtio_gpu_resource_id_get Gurchetan Singh
@ 2020-09-02 21:08 ` Gurchetan Singh
  2020-09-02 21:08 ` [PATCH v2 16/23] drm/virtio: implement blob resources: implement vram object Gurchetan Singh
                   ` (7 subsequent siblings)
  22 siblings, 0 replies; 39+ messages in thread
From: Gurchetan Singh @ 2020-09-02 21:08 UTC (permalink / raw)
  To: dri-devel, virtio-dev; +Cc: sebastien.boeuf, kraxel, vgoyal, mst

Useful for upcoming blob resources.

Signed-off-by: Gurchetan Singh <gurchetansingh@chromium.org>
Acked-by: Tomeu Vizoso <tomeu.vizoso@collabora.com>
---
 drivers/gpu/drm/virtio/virtgpu_drv.h | 17 ++++++++++++++---
 1 file changed, 14 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/virtio/virtgpu_drv.h b/drivers/gpu/drm/virtio/virtgpu_drv.h
index bddc071c20bf5..6d8c624515cd5 100644
--- a/drivers/gpu/drm/virtio/virtgpu_drv.h
+++ b/drivers/gpu/drm/virtio/virtgpu_drv.h
@@ -54,13 +54,16 @@
 #define STATE_ERR 2
 
 struct virtio_gpu_object_params {
-	uint32_t format;
-	uint32_t width;
-	uint32_t height;
 	unsigned long size;
 	bool dumb;
 	/* 3d */
 	bool virgl;
+	bool blob;
+
+	/* classic resources only */
+	uint32_t format;
+	uint32_t width;
+	uint32_t height;
 	uint32_t target;
 	uint32_t bind;
 	uint32_t depth;
@@ -68,6 +71,12 @@ struct virtio_gpu_object_params {
 	uint32_t last_level;
 	uint32_t nr_samples;
 	uint32_t flags;
+
+	/* blob resources only */
+	uint32_t ctx_id;
+	uint32_t blob_mem;
+	uint32_t blob_flags;
+	uint64_t blob_id;
 };
 
 struct virtio_gpu_object {
@@ -75,6 +84,8 @@ struct virtio_gpu_object {
 	uint32_t hw_res_handle;
 	bool dumb;
 	bool created;
+	bool host3d_blob, guest_blob;
+	uint32_t blob_mem, blob_flags;
 
 	int uuid_state;
 	uuid_t uuid;
-- 
2.26.2

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply related	[flat|nested] 39+ messages in thread

* [PATCH v2 16/23] drm/virtio: implement blob resources: implement vram object
  2020-09-02 21:08 [PATCH v2 00/23] Blob prerequisites + blob resources Gurchetan Singh
                   ` (14 preceding siblings ...)
  2020-09-02 21:08 ` [PATCH v2 15/23] drm/virtio: implement blob resources: add new fields to internal structs Gurchetan Singh
@ 2020-09-02 21:08 ` Gurchetan Singh
  2020-09-02 21:08 ` [PATCH v2 17/23] drm/virtio: implement blob resources: hypercall interface Gurchetan Singh
                   ` (6 subsequent siblings)
  22 siblings, 0 replies; 39+ messages in thread
From: Gurchetan Singh @ 2020-09-02 21:08 UTC (permalink / raw)
  To: dri-devel, virtio-dev; +Cc: sebastien.boeuf, kraxel, vgoyal, mst

From: Gerd Hoffmann <kraxel@redhat.com>

A virtio-gpu vram object is based on range-based allocation.
No guest shmemfs backing, so we call drm_gem_private_object_init.

This is for host memory without any guest backing (atleast initially).

Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
Co-developed-by: Gurchetan Singh <gurchetansingh@chromium.org>
Signed-off-by: Gurchetan Singh <gurchetansingh@chromium.org>
Acked-by: Tomeu Vizoso <tomeu.vizoso@collabora.com>
---
 drivers/gpu/drm/virtio/Makefile          |   2 +-
 drivers/gpu/drm/virtio/virtgpu_debugfs.c |  20 ++-
 drivers/gpu/drm/virtio/virtgpu_drv.h     |  26 +++-
 drivers/gpu/drm/virtio/virtgpu_kms.c     |   8 ++
 drivers/gpu/drm/virtio/virtgpu_object.c  |  12 ++
 drivers/gpu/drm/virtio/virtgpu_vq.c      |  66 +++++++++
 drivers/gpu/drm/virtio/virtgpu_vram.c    | 162 +++++++++++++++++++++++
 7 files changed, 293 insertions(+), 3 deletions(-)
 create mode 100644 drivers/gpu/drm/virtio/virtgpu_vram.c

diff --git a/drivers/gpu/drm/virtio/Makefile b/drivers/gpu/drm/virtio/Makefile
index 92aa2b3d349d9..b99fa4a73b68e 100644
--- a/drivers/gpu/drm/virtio/Makefile
+++ b/drivers/gpu/drm/virtio/Makefile
@@ -3,7 +3,7 @@
 # Makefile for the drm device driver.  This driver provides support for the
 # Direct Rendering Infrastructure (DRI) in XFree86 4.1.0 and higher.
 
-virtio-gpu-y := virtgpu_drv.o virtgpu_kms.o virtgpu_gem.o \
+virtio-gpu-y := virtgpu_drv.o virtgpu_kms.o virtgpu_gem.o virtgpu_vram.o \
 	virtgpu_display.o virtgpu_vq.o \
 	virtgpu_fence.o virtgpu_object.o virtgpu_debugfs.o virtgpu_plane.o \
 	virtgpu_ioctl.o virtgpu_prime.o virtgpu_trace_points.o
diff --git a/drivers/gpu/drm/virtio/virtgpu_debugfs.c b/drivers/gpu/drm/virtio/virtgpu_debugfs.c
index a2cdd267914ac..f336a8fa66667 100644
--- a/drivers/gpu/drm/virtio/virtgpu_debugfs.c
+++ b/drivers/gpu/drm/virtio/virtgpu_debugfs.c
@@ -42,7 +42,7 @@ static void virtio_add_int(struct seq_file *m, const char *name,
 
 static int virtio_gpu_features(struct seq_file *m, void *data)
 {
-	struct drm_info_node *node = (struct drm_info_node *) m->private;
+	struct drm_info_node *node = (struct drm_info_node *)m->private;
 	struct virtio_gpu_device *vgdev = node->minor->dev->dev_private;
 
 	virtio_add_bool(m, "virgl", vgdev->has_virgl_3d);
@@ -72,9 +72,27 @@ virtio_gpu_debugfs_irq_info(struct seq_file *m, void *data)
 	return 0;
 }
 
+static int
+virtio_gpu_debugfs_host_visible_mm(struct seq_file *m, void *data)
+{
+	struct drm_info_node *node = (struct drm_info_node *)m->private;
+	struct virtio_gpu_device *vgdev = node->minor->dev->dev_private;
+	struct drm_printer p;
+
+	if (!vgdev->has_host_visible) {
+		seq_puts(m, "Host allocations not visible to guest\n");
+		return 0;
+	}
+
+	p = drm_seq_file_printer(m);
+	drm_mm_print(&vgdev->host_visible_mm, &p);
+	return 0;
+}
+
 static struct drm_info_list virtio_gpu_debugfs_list[] = {
 	{ "virtio-gpu-features", virtio_gpu_features },
 	{ "virtio-gpu-irq-fence", virtio_gpu_debugfs_irq_info, 0, NULL },
+	{ "virtio-gpu-host-visible-mm", virtio_gpu_debugfs_host_visible_mm },
 };
 
 #define VIRTIO_GPU_DEBUGFS_ENTRIES ARRAY_SIZE(virtio_gpu_debugfs_list)
diff --git a/drivers/gpu/drm/virtio/virtgpu_drv.h b/drivers/gpu/drm/virtio/virtgpu_drv.h
index 6d8c624515cd5..c3094f54598f1 100644
--- a/drivers/gpu/drm/virtio/virtgpu_drv.h
+++ b/drivers/gpu/drm/virtio/virtgpu_drv.h
@@ -99,9 +99,19 @@ struct virtio_gpu_object_shmem {
 	uint32_t mapped;
 };
 
+struct virtio_gpu_object_vram {
+	struct virtio_gpu_object base;
+	uint32_t map_state;
+	uint32_t map_info;
+	struct drm_mm_node vram_node;
+};
+
 #define to_virtio_gpu_shmem(virtio_gpu_object) \
 	container_of((virtio_gpu_object), struct virtio_gpu_object_shmem, base)
 
+#define to_virtio_gpu_vram(virtio_gpu_object) \
+	container_of((virtio_gpu_object), struct virtio_gpu_object_vram, base)
+
 struct virtio_gpu_object_array {
 	struct ww_acquire_ctx ticket;
 	struct list_head next;
@@ -222,6 +232,7 @@ struct virtio_gpu_device {
 	bool has_resource_blob;
 	bool has_host_visible;
 	struct virtio_shm_region host_visible_region;
+	struct drm_mm host_visible_mm;
 
 	struct work_struct config_changed_work;
 
@@ -233,8 +244,10 @@ struct virtio_gpu_device {
 	uint32_t num_capsets;
 	struct list_head cap_cache;
 
-	/* protects resource state when exporting */
+	/* protects uuid state when exporting */
 	spinlock_t resource_export_lock;
+	/* protects map state and host_visible_mm */
+	spinlock_t host_visible_lock;
 };
 
 struct virtio_gpu_fpriv {
@@ -365,6 +378,12 @@ int
 virtio_gpu_cmd_resource_assign_uuid(struct virtio_gpu_device *vgdev,
 				    struct virtio_gpu_object_array *objs);
 
+int virtio_gpu_cmd_map(struct virtio_gpu_device *vgdev,
+		       struct virtio_gpu_object_array *objs, uint64_t offset);
+
+void virtio_gpu_cmd_unmap(struct virtio_gpu_device *vgdev,
+			  struct virtio_gpu_object *bo);
+
 /* virtgpu_display.c */
 void virtio_gpu_modeset_init(struct virtio_gpu_device *vgdev);
 void virtio_gpu_modeset_fini(struct virtio_gpu_device *vgdev);
@@ -411,4 +430,9 @@ struct drm_gem_object *virtgpu_gem_prime_import_sg_table(
 /* virtgpu_debugfs.c */
 void virtio_gpu_debugfs_init(struct drm_minor *minor);
 
+/* virtgpu_vram.c */
+bool virtio_gpu_is_vram(struct virtio_gpu_object *bo);
+int virtio_gpu_vram_create(struct virtio_gpu_device *vgdev,
+			   struct virtio_gpu_object_params *params,
+			   struct virtio_gpu_object **bo_ptr);
 #endif
diff --git a/drivers/gpu/drm/virtio/virtgpu_kms.c b/drivers/gpu/drm/virtio/virtgpu_kms.c
index 97b6e4fb945a7..7771a6b5852ea 100644
--- a/drivers/gpu/drm/virtio/virtgpu_kms.c
+++ b/drivers/gpu/drm/virtio/virtgpu_kms.c
@@ -121,6 +121,7 @@ int virtio_gpu_init(struct drm_device *dev)
 
 	spin_lock_init(&vgdev->display_info_lock);
 	spin_lock_init(&vgdev->resource_export_lock);
+	spin_lock_init(&vgdev->host_visible_lock);
 	ida_init(&vgdev->ctx_id_ida);
 	ida_init(&vgdev->resource_ida);
 	init_waitqueue_head(&vgdev->resp_wq);
@@ -169,6 +170,9 @@ int virtio_gpu_init(struct drm_device *dev)
 			 (unsigned long)vgdev->host_visible_region.addr,
 			 (unsigned long)vgdev->host_visible_region.len);
 		vgdev->has_host_visible = true;
+		drm_mm_init(&vgdev->host_visible_mm,
+			    (unsigned long)vgdev->host_visible_region.addr,
+			    (unsigned long)vgdev->host_visible_region.len);
 	}
 
 	DRM_INFO("features: %cvirgl %cedid %cresource_blob %chost_visible\n",
@@ -258,6 +262,10 @@ void virtio_gpu_release(struct drm_device *dev)
 	virtio_gpu_modeset_fini(vgdev);
 	virtio_gpu_free_vbufs(vgdev);
 	virtio_gpu_cleanup_cap_cache(vgdev);
+
+	if (vgdev->has_host_visible)
+		drm_mm_takedown(&vgdev->host_visible_mm);
+
 	kfree(vgdev->capsets);
 
 	if (vgdev->has_host_visible) {
diff --git a/drivers/gpu/drm/virtio/virtgpu_object.c b/drivers/gpu/drm/virtio/virtgpu_object.c
index f7064c1c23fd9..cef79455257df 100644
--- a/drivers/gpu/drm/virtio/virtgpu_object.c
+++ b/drivers/gpu/drm/virtio/virtgpu_object.c
@@ -83,6 +83,18 @@ void virtio_gpu_cleanup_object(struct virtio_gpu_object *bo)
 		}
 
 		drm_gem_shmem_free_object(&bo->base.base);
+	} else if (virtio_gpu_is_vram(bo)) {
+		struct virtio_gpu_object_vram *vram = to_virtio_gpu_vram(bo);
+
+		spin_lock(&vgdev->host_visible_lock);
+		if (drm_mm_node_allocated(&vram->vram_node))
+			drm_mm_remove_node(&vram->vram_node);
+
+		spin_unlock(&vgdev->host_visible_lock);
+
+		drm_gem_free_mmap_offset(&vram->base.base.base);
+		drm_gem_object_release(&vram->base.base.base);
+		kfree(vram);
 	}
 }
 
diff --git a/drivers/gpu/drm/virtio/virtgpu_vq.c b/drivers/gpu/drm/virtio/virtgpu_vq.c
index deae7687eec3c..15f9d0d9aa25c 100644
--- a/drivers/gpu/drm/virtio/virtgpu_vq.c
+++ b/drivers/gpu/drm/virtio/virtgpu_vq.c
@@ -1166,3 +1166,69 @@ virtio_gpu_cmd_resource_assign_uuid(struct virtio_gpu_device *vgdev,
 	virtio_gpu_queue_ctrl_buffer(vgdev, vbuf);
 	return 0;
 }
+
+static void virtio_gpu_cmd_resource_map_cb(struct virtio_gpu_device *vgdev,
+					   struct virtio_gpu_vbuffer *vbuf)
+{
+	struct virtio_gpu_object *bo =
+		gem_to_virtio_gpu_obj(vbuf->objs->objs[0]);
+	struct virtio_gpu_resp_map_info *resp =
+		(struct virtio_gpu_resp_map_info *)vbuf->resp_buf;
+	struct virtio_gpu_object_vram *vram = to_virtio_gpu_vram(bo);
+	uint32_t resp_type = le32_to_cpu(resp->hdr.type);
+
+	spin_lock(&vgdev->host_visible_lock);
+
+	if (resp_type == VIRTIO_GPU_RESP_OK_MAP_INFO) {
+		vram->map_info = resp->map_info;
+		vram->map_state = STATE_OK;
+	} else {
+		vram->map_state = STATE_ERR;
+	}
+
+	spin_unlock(&vgdev->host_visible_lock);
+	wake_up_all(&vgdev->resp_wq);
+}
+
+int virtio_gpu_cmd_map(struct virtio_gpu_device *vgdev,
+		       struct virtio_gpu_object_array *objs, uint64_t offset)
+{
+	struct virtio_gpu_resource_map_blob *cmd_p;
+	struct virtio_gpu_object *bo = gem_to_virtio_gpu_obj(objs->objs[0]);
+	struct virtio_gpu_vbuffer *vbuf;
+	struct virtio_gpu_resp_map_info *resp_buf;
+
+	resp_buf = kzalloc(sizeof(*resp_buf), GFP_KERNEL);
+	if (!resp_buf) {
+		virtio_gpu_array_put_free(objs);
+		return -ENOMEM;
+	}
+
+	cmd_p = virtio_gpu_alloc_cmd_resp
+		(vgdev, virtio_gpu_cmd_resource_map_cb, &vbuf, sizeof(*cmd_p),
+		 sizeof(struct virtio_gpu_resp_map_info), resp_buf);
+	memset(cmd_p, 0, sizeof(*cmd_p));
+
+	cmd_p->hdr.type = cpu_to_le32(VIRTIO_GPU_CMD_RESOURCE_MAP_BLOB);
+	cmd_p->resource_id = cpu_to_le32(bo->hw_res_handle);
+	cmd_p->offset = cpu_to_le64(offset);
+	vbuf->objs = objs;
+
+	virtio_gpu_queue_ctrl_buffer(vgdev, vbuf);
+	return 0;
+}
+
+void virtio_gpu_cmd_unmap(struct virtio_gpu_device *vgdev,
+			  struct virtio_gpu_object *bo)
+{
+	struct virtio_gpu_resource_unmap_blob *cmd_p;
+	struct virtio_gpu_vbuffer *vbuf;
+
+	cmd_p = virtio_gpu_alloc_cmd(vgdev, &vbuf, sizeof(*cmd_p));
+	memset(cmd_p, 0, sizeof(*cmd_p));
+
+	cmd_p->hdr.type = cpu_to_le32(VIRTIO_GPU_CMD_RESOURCE_UNMAP_BLOB);
+	cmd_p->resource_id = cpu_to_le32(bo->hw_res_handle);
+
+	virtio_gpu_queue_ctrl_buffer(vgdev, vbuf);
+}
diff --git a/drivers/gpu/drm/virtio/virtgpu_vram.c b/drivers/gpu/drm/virtio/virtgpu_vram.c
new file mode 100644
index 0000000000000..087945fcd230f
--- /dev/null
+++ b/drivers/gpu/drm/virtio/virtgpu_vram.c
@@ -0,0 +1,162 @@
+// SPDX-License-Identifier: GPL-2.0
+#include "virtgpu_drv.h"
+
+static void virtio_gpu_vram_free(struct drm_gem_object *obj)
+{
+	struct virtio_gpu_object *bo = gem_to_virtio_gpu_obj(obj);
+	struct virtio_gpu_device *vgdev = obj->dev->dev_private;
+	struct virtio_gpu_object_vram *vram = to_virtio_gpu_vram(bo);
+	bool unmap;
+
+	if (bo->created) {
+		spin_lock(&vgdev->host_visible_lock);
+		unmap = drm_mm_node_allocated(&vram->vram_node);
+		spin_unlock(&vgdev->host_visible_lock);
+
+		if (unmap)
+			virtio_gpu_cmd_unmap(vgdev, bo);
+
+		virtio_gpu_cmd_unref_resource(vgdev, bo);
+		virtio_gpu_notify(vgdev);
+		return;
+	}
+}
+
+static const struct vm_operations_struct virtio_gpu_vram_vm_ops = {
+	.open = drm_gem_vm_open,
+	.close = drm_gem_vm_close,
+};
+
+static int virtio_gpu_vram_mmap(struct drm_gem_object *obj,
+				struct vm_area_struct *vma)
+{
+	int ret;
+	struct virtio_gpu_device *vgdev = obj->dev->dev_private;
+	struct virtio_gpu_object *bo = gem_to_virtio_gpu_obj(obj);
+	struct virtio_gpu_object_vram *vram = to_virtio_gpu_vram(bo);
+	unsigned long vm_size = vma->vm_end - vma->vm_start;
+
+	if (!(bo->blob_flags & VIRTGPU_BLOB_FLAG_USE_MAPPABLE))
+		return -EINVAL;
+
+	wait_event(vgdev->resp_wq, vram->map_state != STATE_INITIALIZING);
+	if (vram->map_state != STATE_OK)
+		return -EINVAL;
+
+	vma->vm_pgoff -= drm_vma_node_start(&obj->vma_node);
+	vma->vm_flags |= VM_MIXEDMAP | VM_DONTEXPAND;
+	vma->vm_page_prot = vm_get_page_prot(vma->vm_flags);
+	vma->vm_page_prot = pgprot_decrypted(vma->vm_page_prot);
+	vma->vm_ops = &virtio_gpu_vram_vm_ops;
+
+	if (vram->map_info == VIRTIO_GPU_MAP_CACHE_WC)
+		vma->vm_page_prot = pgprot_writecombine(vma->vm_page_prot);
+	else if (vram->map_info == VIRTIO_GPU_MAP_CACHE_UNCACHED)
+		vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);
+
+	/* Partial mappings of GEM buffers don't happen much in practice. */
+	if (vm_size != vram->vram_node.size)
+		return -EINVAL;
+
+	ret = io_remap_pfn_range(vma, vma->vm_start,
+				 vram->vram_node.start >> PAGE_SHIFT,
+				 vm_size, vma->vm_page_prot);
+	return ret;
+}
+
+static const struct drm_gem_object_funcs virtio_gpu_vram_funcs = {
+	.open = virtio_gpu_gem_object_open,
+	.close = virtio_gpu_gem_object_close,
+	.free = virtio_gpu_vram_free,
+	.mmap = virtio_gpu_vram_mmap,
+};
+
+bool virtio_gpu_is_vram(struct virtio_gpu_object *bo)
+{
+	return bo->base.base.funcs == &virtio_gpu_vram_funcs;
+}
+
+static int virtio_gpu_vram_map(struct virtio_gpu_object *bo)
+{
+	int ret;
+	uint64_t offset;
+	struct virtio_gpu_object_array *objs;
+	struct virtio_gpu_device *vgdev = bo->base.base.dev->dev_private;
+	struct virtio_gpu_object_vram *vram = to_virtio_gpu_vram(bo);
+
+	if (!vgdev->has_host_visible)
+		return -EINVAL;
+
+	spin_lock(&vgdev->host_visible_lock);
+	ret = drm_mm_insert_node(&vgdev->host_visible_mm, &vram->vram_node,
+				 bo->base.base.size);
+	spin_unlock(&vgdev->host_visible_lock);
+
+	if (ret)
+		return ret;
+
+	objs = virtio_gpu_array_alloc(1);
+	if (!objs) {
+		ret = -ENOMEM;
+		goto err_remove_node;
+	}
+
+	virtio_gpu_array_add_obj(objs, &bo->base.base);
+	/*TODO: Add an error checking helper function in drm_mm.h */
+	offset = vram->vram_node.start - vgdev->host_visible_region.addr;
+
+	ret = virtio_gpu_cmd_map(vgdev, objs, offset);
+	if (ret) {
+		virtio_gpu_array_put_free(objs);
+		goto err_remove_node;
+	}
+
+	return 0;
+
+err_remove_node:
+	spin_lock(&vgdev->host_visible_lock);
+	drm_mm_remove_node(&vram->vram_node);
+	spin_unlock(&vgdev->host_visible_lock);
+	return ret;
+}
+
+int virtio_gpu_vram_create(struct virtio_gpu_device *vgdev,
+			   struct virtio_gpu_object_params *params,
+			   struct virtio_gpu_object **bo_ptr)
+{
+	struct drm_gem_object *obj;
+	struct virtio_gpu_object_vram *vram;
+	int ret;
+
+	vram = kzalloc(sizeof(*vram), GFP_KERNEL);
+	if (!vram)
+		return -ENOMEM;
+
+	obj = &vram->base.base.base;
+	obj->funcs = &virtio_gpu_vram_funcs;
+	drm_gem_private_object_init(vgdev->ddev, obj, params->size);
+
+	/* Create fake offset */
+	ret = drm_gem_create_mmap_offset(obj);
+	if (ret) {
+		kfree(vram);
+		return ret;
+	}
+
+	ret = virtio_gpu_resource_id_get(vgdev, &vram->base.hw_res_handle);
+	if (ret) {
+		kfree(vram);
+		return ret;
+	}
+
+	if (params->blob_flags & VIRTGPU_BLOB_FLAG_USE_MAPPABLE) {
+		ret = virtio_gpu_vram_map(&vram->base);
+		if (ret) {
+			virtio_gpu_vram_free(obj);
+			return ret;
+		}
+	}
+
+	*bo_ptr = &vram->base;
+	return 0;
+}
-- 
2.26.2

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply related	[flat|nested] 39+ messages in thread

* [PATCH v2 17/23] drm/virtio: implement blob resources: hypercall interface
  2020-09-02 21:08 [PATCH v2 00/23] Blob prerequisites + blob resources Gurchetan Singh
                   ` (15 preceding siblings ...)
  2020-09-02 21:08 ` [PATCH v2 16/23] drm/virtio: implement blob resources: implement vram object Gurchetan Singh
@ 2020-09-02 21:08 ` Gurchetan Singh
  2020-09-02 21:08 ` [PATCH v2 18/23] drm/virtio: implement blob resources: blob display integration Gurchetan Singh
                   ` (5 subsequent siblings)
  22 siblings, 0 replies; 39+ messages in thread
From: Gurchetan Singh @ 2020-09-02 21:08 UTC (permalink / raw)
  To: dri-devel, virtio-dev; +Cc: sebastien.boeuf, kraxel, vgoyal, mst

This implements the blob hypercall interface.

Signed-off-by: Gurchetan Singh <gurchetansingh@chromium.org>
Acked-by: Tomeu Vizoso <tomeu.vizoso@collabora.com>
---
 drivers/gpu/drm/virtio/virtgpu_drv.h | 15 +++++++
 drivers/gpu/drm/virtio/virtgpu_vq.c  | 65 ++++++++++++++++++++++++++++
 2 files changed, 80 insertions(+)

diff --git a/drivers/gpu/drm/virtio/virtgpu_drv.h b/drivers/gpu/drm/virtio/virtgpu_drv.h
index c3094f54598f1..0ea1b3e48c5b5 100644
--- a/drivers/gpu/drm/virtio/virtgpu_drv.h
+++ b/drivers/gpu/drm/virtio/virtgpu_drv.h
@@ -35,6 +35,7 @@
 #include <drm/drm_drv.h>
 #include <drm/drm_encoder.h>
 #include <drm/drm_fb_helper.h>
+#include <drm/drm_fourcc.h>
 #include <drm/drm_gem.h>
 #include <drm/drm_gem_shmem_helper.h>
 #include <drm/drm_ioctl.h>
@@ -384,6 +385,20 @@ int virtio_gpu_cmd_map(struct virtio_gpu_device *vgdev,
 void virtio_gpu_cmd_unmap(struct virtio_gpu_device *vgdev,
 			  struct virtio_gpu_object *bo);
 
+void
+virtio_gpu_cmd_resource_create_blob(struct virtio_gpu_device *vgdev,
+				    struct virtio_gpu_object *bo,
+				    struct virtio_gpu_object_params *params,
+				    struct virtio_gpu_mem_entry *ents,
+				    uint32_t nents);
+void
+virtio_gpu_cmd_set_scanout_blob(struct virtio_gpu_device *vgdev,
+				uint32_t scanout_id,
+				struct virtio_gpu_object *bo,
+				struct drm_framebuffer *fb,
+				uint32_t width, uint32_t height,
+				uint32_t x, uint32_t y);
+
 /* virtgpu_display.c */
 void virtio_gpu_modeset_init(struct virtio_gpu_device *vgdev);
 void virtio_gpu_modeset_fini(struct virtio_gpu_device *vgdev);
diff --git a/drivers/gpu/drm/virtio/virtgpu_vq.c b/drivers/gpu/drm/virtio/virtgpu_vq.c
index 15f9d0d9aa25c..b77d405e56b28 100644
--- a/drivers/gpu/drm/virtio/virtgpu_vq.c
+++ b/drivers/gpu/drm/virtio/virtgpu_vq.c
@@ -1232,3 +1232,68 @@ void virtio_gpu_cmd_unmap(struct virtio_gpu_device *vgdev,
 
 	virtio_gpu_queue_ctrl_buffer(vgdev, vbuf);
 }
+
+void
+virtio_gpu_cmd_resource_create_blob(struct virtio_gpu_device *vgdev,
+				    struct virtio_gpu_object *bo,
+				    struct virtio_gpu_object_params *params,
+				    struct virtio_gpu_mem_entry *ents,
+				    uint32_t nents)
+{
+	struct virtio_gpu_resource_create_blob *cmd_p;
+	struct virtio_gpu_vbuffer *vbuf;
+
+	cmd_p = virtio_gpu_alloc_cmd(vgdev, &vbuf, sizeof(*cmd_p));
+	memset(cmd_p, 0, sizeof(*cmd_p));
+
+	cmd_p->hdr.type = cpu_to_le32(VIRTIO_GPU_CMD_RESOURCE_CREATE_BLOB);
+	cmd_p->hdr.ctx_id = cpu_to_le32(params->ctx_id);
+	cmd_p->resource_id = cpu_to_le32(bo->hw_res_handle);
+	cmd_p->blob_mem = cpu_to_le32(params->blob_mem);
+	cmd_p->blob_flags = cpu_to_le32(params->blob_flags);
+	cmd_p->blob_id = cpu_to_le64(params->blob_id);
+	cmd_p->size = cpu_to_le64(params->size);
+	cmd_p->nr_entries = cpu_to_le32(nents);
+
+	vbuf->data_buf = ents;
+	vbuf->data_size = sizeof(*ents) * nents;
+
+	virtio_gpu_queue_ctrl_buffer(vgdev, vbuf);
+	bo->created = true;
+}
+
+void virtio_gpu_cmd_set_scanout_blob(struct virtio_gpu_device *vgdev,
+				     uint32_t scanout_id,
+				     struct virtio_gpu_object *bo,
+				     struct drm_framebuffer *fb,
+				     uint32_t width, uint32_t height,
+				     uint32_t x, uint32_t y)
+{
+	uint32_t i;
+	struct virtio_gpu_set_scanout_blob *cmd_p;
+	struct virtio_gpu_vbuffer *vbuf;
+	uint32_t format = virtio_gpu_translate_format(fb->format->format);
+
+	cmd_p = virtio_gpu_alloc_cmd(vgdev, &vbuf, sizeof(*cmd_p));
+	memset(cmd_p, 0, sizeof(*cmd_p));
+
+	cmd_p->hdr.type = cpu_to_le32(VIRTIO_GPU_CMD_SET_SCANOUT_BLOB);
+	cmd_p->resource_id = cpu_to_le32(bo->hw_res_handle);
+	cmd_p->scanout_id = cpu_to_le32(scanout_id);
+
+	cmd_p->format = cpu_to_le32(format);
+	cmd_p->width  = cpu_to_le32(fb->width);
+	cmd_p->height = cpu_to_le32(fb->height);
+
+	for (i = 0; i < 4; i++) {
+		cmd_p->strides[i] = cpu_to_le32(fb->pitches[i]);
+		cmd_p->offsets[i] = cpu_to_le32(fb->offsets[i]);
+	}
+
+	cmd_p->r.width = cpu_to_le32(width);
+	cmd_p->r.height = cpu_to_le32(height);
+	cmd_p->r.x = cpu_to_le32(x);
+	cmd_p->r.y = cpu_to_le32(y);
+
+	virtio_gpu_queue_ctrl_buffer(vgdev, vbuf);
+}
-- 
2.26.2

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply related	[flat|nested] 39+ messages in thread

* [PATCH v2 18/23] drm/virtio: implement blob resources: blob display integration
  2020-09-02 21:08 [PATCH v2 00/23] Blob prerequisites + blob resources Gurchetan Singh
                   ` (16 preceding siblings ...)
  2020-09-02 21:08 ` [PATCH v2 17/23] drm/virtio: implement blob resources: hypercall interface Gurchetan Singh
@ 2020-09-02 21:08 ` Gurchetan Singh
  2020-09-02 21:08 ` [PATCH v2 19/23] drm/virtio: implement blob resources: refactor UUID code somewhat Gurchetan Singh
                   ` (4 subsequent siblings)
  22 siblings, 0 replies; 39+ messages in thread
From: Gurchetan Singh @ 2020-09-02 21:08 UTC (permalink / raw)
  To: dri-devel, virtio-dev; +Cc: sebastien.boeuf, kraxel, vgoyal, mst

SCANOUT_BLOB forwards the DRM framebuffer metadata to the host. The
modifier is intentionally left out -- it may be possible to query
the host for that.

We also assume one blob resource per DRM framebuffer.  That too is
an intentional simplification.

Signed-off-by: Gurchetan Singh <gurchetansingh@chromium.org>
Acked-by: Tomeu Vizoso <tomeu.vizoso@collabora.com>
---
 drivers/gpu/drm/virtio/virtgpu_plane.c | 23 +++++++++++++++++------
 1 file changed, 17 insertions(+), 6 deletions(-)

diff --git a/drivers/gpu/drm/virtio/virtgpu_plane.c b/drivers/gpu/drm/virtio/virtgpu_plane.c
index 6a311cd934403..42ac08ed1442e 100644
--- a/drivers/gpu/drm/virtio/virtgpu_plane.c
+++ b/drivers/gpu/drm/virtio/virtgpu_plane.c
@@ -174,12 +174,23 @@ static void virtio_gpu_primary_plane_update(struct drm_plane *plane,
 			  plane->state->src_h >> 16,
 			  plane->state->src_x >> 16,
 			  plane->state->src_y >> 16);
-		virtio_gpu_cmd_set_scanout(vgdev, output->index,
-					   bo->hw_res_handle,
-					   plane->state->src_w >> 16,
-					   plane->state->src_h >> 16,
-					   plane->state->src_x >> 16,
-					   plane->state->src_y >> 16);
+
+		if (bo->host3d_blob || bo->guest_blob) {
+			virtio_gpu_cmd_set_scanout_blob
+						(vgdev, output->index, bo,
+						 plane->state->fb,
+						 plane->state->src_w >> 16,
+						 plane->state->src_h >> 16,
+						 plane->state->src_x >> 16,
+						 plane->state->src_y >> 16);
+		} else {
+			virtio_gpu_cmd_set_scanout(vgdev, output->index,
+						   bo->hw_res_handle,
+						   plane->state->src_w >> 16,
+						   plane->state->src_h >> 16,
+						   plane->state->src_x >> 16,
+						   plane->state->src_y >> 16);
+		}
 	}
 
 	virtio_gpu_cmd_resource_flush(vgdev, bo->hw_res_handle,
-- 
2.26.2

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply related	[flat|nested] 39+ messages in thread

* [PATCH v2 19/23] drm/virtio: implement blob resources: refactor UUID code somewhat
  2020-09-02 21:08 [PATCH v2 00/23] Blob prerequisites + blob resources Gurchetan Singh
                   ` (17 preceding siblings ...)
  2020-09-02 21:08 ` [PATCH v2 18/23] drm/virtio: implement blob resources: blob display integration Gurchetan Singh
@ 2020-09-02 21:08 ` Gurchetan Singh
  2020-09-02 21:08 ` [PATCH v2 20/23] drm/virtio: implement blob resources: fix stride discrepancy Gurchetan Singh
                   ` (3 subsequent siblings)
  22 siblings, 0 replies; 39+ messages in thread
From: Gurchetan Singh @ 2020-09-02 21:08 UTC (permalink / raw)
  To: dri-devel, virtio-dev; +Cc: sebastien.boeuf, kraxel, vgoyal, mst

For upcoming blob resources, userspace can specify that the
resource will be used for cross-device sharing. This is mainly
for exportable blobs that will only shared with the virtgpu
display but not across devices.

Signed-off-by: Gurchetan Singh <gurchetansingh@chromium.org>
Acked-by: Tomeu Vizoso <tomeu.vizoso@collabora.com>
---
 drivers/gpu/drm/virtio/virtgpu_drv.h   |  2 ++
 drivers/gpu/drm/virtio/virtgpu_prime.c | 42 ++++++++++++++++++--------
 2 files changed, 31 insertions(+), 13 deletions(-)

diff --git a/drivers/gpu/drm/virtio/virtgpu_drv.h b/drivers/gpu/drm/virtio/virtgpu_drv.h
index 0ea1b3e48c5b5..689297e1fff87 100644
--- a/drivers/gpu/drm/virtio/virtgpu_drv.h
+++ b/drivers/gpu/drm/virtio/virtgpu_drv.h
@@ -432,6 +432,8 @@ bool virtio_gpu_is_shmem(struct virtio_gpu_object *bo);
 int virtio_gpu_resource_id_get(struct virtio_gpu_device *vgdev,
 			       uint32_t *resid);
 /* virtgpu_prime.c */
+int virtio_gpu_resource_assign_uuid(struct virtio_gpu_device *vgdev,
+				    struct virtio_gpu_object *bo);
 struct dma_buf *virtgpu_gem_prime_export(struct drm_gem_object *obj,
 					 int flags);
 struct drm_gem_object *virtgpu_gem_prime_import(struct drm_device *dev,
diff --git a/drivers/gpu/drm/virtio/virtgpu_prime.c b/drivers/gpu/drm/virtio/virtgpu_prime.c
index 3552db128ba3d..1ef1e2f226333 100644
--- a/drivers/gpu/drm/virtio/virtgpu_prime.c
+++ b/drivers/gpu/drm/virtio/virtgpu_prime.c
@@ -59,6 +59,24 @@ const struct virtio_dma_buf_ops virtgpu_dmabuf_ops =  {
 	.get_uuid = virtgpu_virtio_get_uuid,
 };
 
+int virtio_gpu_resource_assign_uuid(struct virtio_gpu_device *vgdev,
+				    struct virtio_gpu_object *bo)
+{
+	int ret;
+	struct virtio_gpu_object_array *objs;
+
+	objs = virtio_gpu_array_alloc(1);
+	if (!objs)
+		return -ENOMEM;
+
+	virtio_gpu_array_add_obj(objs, &bo->base.base);
+	ret = virtio_gpu_cmd_resource_assign_uuid(vgdev, objs);
+	if (ret)
+		return ret;
+
+	return 0;
+}
+
 struct dma_buf *virtgpu_gem_prime_export(struct drm_gem_object *obj,
 					 int flags)
 {
@@ -66,22 +84,20 @@ struct dma_buf *virtgpu_gem_prime_export(struct drm_gem_object *obj,
 	struct drm_device *dev = obj->dev;
 	struct virtio_gpu_device *vgdev = dev->dev_private;
 	struct virtio_gpu_object *bo = gem_to_virtio_gpu_obj(obj);
-	struct virtio_gpu_object_array *objs;
 	int ret = 0;
+	bool blob = bo->host3d_blob || bo->guest_blob;
 	DEFINE_DMA_BUF_EXPORT_INFO(exp_info);
 
-	if (vgdev->has_resource_assign_uuid) {
-		objs = virtio_gpu_array_alloc(1);
-		if (!objs)
-			return ERR_PTR(-ENOMEM);
-		virtio_gpu_array_add_obj(objs, &bo->base.base);
-
-		ret = virtio_gpu_cmd_resource_assign_uuid(vgdev, objs);
-		if (ret)
-			return ERR_PTR(ret);
-		virtio_gpu_notify(vgdev);
-	} else {
-		bo->uuid_state = STATE_ERR;
+	if (!blob) {
+		if (vgdev->has_resource_assign_uuid) {
+			ret = virtio_gpu_resource_assign_uuid(vgdev, bo);
+			if (ret)
+				return ERR_PTR(ret);
+
+			virtio_gpu_notify(vgdev);
+		} else {
+			bo->uuid_state = STATE_ERR;
+		}
 	}
 
 	exp_info.ops = &virtgpu_dmabuf_ops.ops;
-- 
2.26.2

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply related	[flat|nested] 39+ messages in thread

* [PATCH v2 20/23] drm/virtio: implement blob resources: fix stride discrepancy
  2020-09-02 21:08 [PATCH v2 00/23] Blob prerequisites + blob resources Gurchetan Singh
                   ` (18 preceding siblings ...)
  2020-09-02 21:08 ` [PATCH v2 19/23] drm/virtio: implement blob resources: refactor UUID code somewhat Gurchetan Singh
@ 2020-09-02 21:08 ` Gurchetan Singh
  2020-09-02 21:08 ` [PATCH v2 21/23] drm/virtio: implement blob resources: report blob mem to userspace Gurchetan Singh
                   ` (2 subsequent siblings)
  22 siblings, 0 replies; 39+ messages in thread
From: Gurchetan Singh @ 2020-09-02 21:08 UTC (permalink / raw)
  To: dri-devel, virtio-dev; +Cc: sebastien.boeuf, kraxel, vgoyal, mst

The old transfer ioctls may work on blob resources, and the guest
may have a image view on the blob resources such that the stride is
not equal to width * bytes_per_pixel.

For host-only blobs, we can repurpose the transfer ioctls to synchronize
caches as well.

Also, with seamless Wayland integration between guest/host looking
increasingly attractive, it also makes sense to keep track of
one value for stride.

Signed-off-by: Gurchetan Singh <gurchetansingh@chromium.org>
Acked-by: Tomeu Vizoso <tomeu.vizoso@collabora.com>
---
 drivers/gpu/drm/virtio/virtgpu_drv.h   |  4 +++
 drivers/gpu/drm/virtio/virtgpu_ioctl.c | 35 +++++++++++++++++++++++---
 drivers/gpu/drm/virtio/virtgpu_vq.c    | 14 +++++++++--
 3 files changed, 47 insertions(+), 6 deletions(-)

diff --git a/drivers/gpu/drm/virtio/virtgpu_drv.h b/drivers/gpu/drm/virtio/virtgpu_drv.h
index 689297e1fff87..6162865c162df 100644
--- a/drivers/gpu/drm/virtio/virtgpu_drv.h
+++ b/drivers/gpu/drm/virtio/virtgpu_drv.h
@@ -351,12 +351,16 @@ void virtio_gpu_cmd_submit(struct virtio_gpu_device *vgdev,
 void virtio_gpu_cmd_transfer_from_host_3d(struct virtio_gpu_device *vgdev,
 					  uint32_t ctx_id,
 					  uint64_t offset, uint32_t level,
+					  uint32_t stride,
+					  uint32_t layer_stride,
 					  struct drm_virtgpu_3d_box *box,
 					  struct virtio_gpu_object_array *objs,
 					  struct virtio_gpu_fence *fence);
 void virtio_gpu_cmd_transfer_to_host_3d(struct virtio_gpu_device *vgdev,
 					uint32_t ctx_id,
 					uint64_t offset, uint32_t level,
+					uint32_t stride,
+					uint32_t layer_stride,
 					struct drm_virtgpu_3d_box *box,
 					struct virtio_gpu_object_array *objs,
 					struct virtio_gpu_fence *fence);
diff --git a/drivers/gpu/drm/virtio/virtgpu_ioctl.c b/drivers/gpu/drm/virtio/virtgpu_ioctl.c
index 7a2430e34e003..0075995a9f5b8 100644
--- a/drivers/gpu/drm/virtio/virtgpu_ioctl.c
+++ b/drivers/gpu/drm/virtio/virtgpu_ioctl.c
@@ -311,6 +311,7 @@ static int virtio_gpu_transfer_from_host_ioctl(struct drm_device *dev,
 	struct virtio_gpu_device *vgdev = dev->dev_private;
 	struct virtio_gpu_fpriv *vfpriv = file->driver_priv;
 	struct drm_virtgpu_3d_transfer_from_host *args = data;
+	struct virtio_gpu_object *bo;
 	struct virtio_gpu_object_array *objs;
 	struct virtio_gpu_fence *fence;
 	int ret;
@@ -324,6 +325,17 @@ static int virtio_gpu_transfer_from_host_ioctl(struct drm_device *dev,
 	if (objs == NULL)
 		return -ENOENT;
 
+	bo = gem_to_virtio_gpu_obj(objs->objs[0]);
+	if (bo->guest_blob && !bo->host3d_blob) {
+		ret = -EINVAL;
+		goto err_put_free;
+	}
+
+	if (!bo->host3d_blob && (args->stride || args->layer_stride)) {
+		ret = -EINVAL;
+		goto err_put_free;
+	}
+
 	ret = virtio_gpu_array_lock_resv(objs);
 	if (ret != 0)
 		goto err_put_free;
@@ -333,9 +345,10 @@ static int virtio_gpu_transfer_from_host_ioctl(struct drm_device *dev,
 		ret = -ENOMEM;
 		goto err_unlock;
 	}
+
 	virtio_gpu_cmd_transfer_from_host_3d
-		(vgdev, vfpriv->ctx_id, offset, args->level,
-		 &args->box, objs, fence);
+		(vgdev, vfpriv->ctx_id, offset, args->level, args->stride,
+		 args->layer_stride, &args->box, objs, fence);
 	dma_fence_put(&fence->f);
 	virtio_gpu_notify(vgdev);
 	return 0;
@@ -353,6 +366,7 @@ static int virtio_gpu_transfer_to_host_ioctl(struct drm_device *dev, void *data,
 	struct virtio_gpu_device *vgdev = dev->dev_private;
 	struct virtio_gpu_fpriv *vfpriv = file->driver_priv;
 	struct drm_virtgpu_3d_transfer_to_host *args = data;
+	struct virtio_gpu_object *bo;
 	struct virtio_gpu_object_array *objs;
 	struct virtio_gpu_fence *fence;
 	int ret;
@@ -362,6 +376,12 @@ static int virtio_gpu_transfer_to_host_ioctl(struct drm_device *dev, void *data,
 	if (objs == NULL)
 		return -ENOENT;
 
+	bo = gem_to_virtio_gpu_obj(objs->objs[0]);
+	if (bo->guest_blob && !bo->host3d_blob) {
+		ret = -EINVAL;
+		goto err_put_free;
+	}
+
 	if (!vgdev->has_virgl_3d) {
 		virtio_gpu_cmd_transfer_to_host_2d
 			(vgdev, offset,
@@ -369,6 +389,12 @@ static int virtio_gpu_transfer_to_host_ioctl(struct drm_device *dev, void *data,
 			 objs, NULL);
 	} else {
 		virtio_gpu_create_context(dev, file);
+
+		if (!bo->host3d_blob && (args->stride || args->layer_stride)) {
+			ret = -EINVAL;
+			goto err_put_free;
+		}
+
 		ret = virtio_gpu_array_lock_resv(objs);
 		if (ret != 0)
 			goto err_put_free;
@@ -380,8 +406,9 @@ static int virtio_gpu_transfer_to_host_ioctl(struct drm_device *dev, void *data,
 
 		virtio_gpu_cmd_transfer_to_host_3d
 			(vgdev,
-			 vfpriv ? vfpriv->ctx_id : 0, offset,
-			 args->level, &args->box, objs, fence);
+			 vfpriv ? vfpriv->ctx_id : 0, offset, args->level,
+			 args->stride, args->layer_stride, &args->box, objs,
+			 fence);
 		dma_fence_put(&fence->f);
 	}
 	virtio_gpu_notify(vgdev);
diff --git a/drivers/gpu/drm/virtio/virtgpu_vq.c b/drivers/gpu/drm/virtio/virtgpu_vq.c
index b77d405e56b28..363e30e19db4c 100644
--- a/drivers/gpu/drm/virtio/virtgpu_vq.c
+++ b/drivers/gpu/drm/virtio/virtgpu_vq.c
@@ -1012,6 +1012,8 @@ virtio_gpu_cmd_resource_create_3d(struct virtio_gpu_device *vgdev,
 void virtio_gpu_cmd_transfer_to_host_3d(struct virtio_gpu_device *vgdev,
 					uint32_t ctx_id,
 					uint64_t offset, uint32_t level,
+					uint32_t stride,
+					uint32_t layer_stride,
 					struct drm_virtgpu_3d_box *box,
 					struct virtio_gpu_object_array *objs,
 					struct virtio_gpu_fence *fence)
@@ -1020,12 +1022,14 @@ void virtio_gpu_cmd_transfer_to_host_3d(struct virtio_gpu_device *vgdev,
 	struct virtio_gpu_transfer_host_3d *cmd_p;
 	struct virtio_gpu_vbuffer *vbuf;
 	bool use_dma_api = !virtio_has_dma_quirk(vgdev->vdev);
-	struct virtio_gpu_object_shmem *shmem = to_virtio_gpu_shmem(bo);
 
-	if (use_dma_api)
+	if (virtio_gpu_is_shmem(bo) && use_dma_api) {
+		struct virtio_gpu_object_shmem *shmem = to_virtio_gpu_shmem(bo);
+
 		dma_sync_sg_for_device(vgdev->vdev->dev.parent,
 				       shmem->pages->sgl, shmem->pages->nents,
 				       DMA_TO_DEVICE);
+	}
 
 	cmd_p = virtio_gpu_alloc_cmd(vgdev, &vbuf, sizeof(*cmd_p));
 	memset(cmd_p, 0, sizeof(*cmd_p));
@@ -1038,6 +1042,8 @@ void virtio_gpu_cmd_transfer_to_host_3d(struct virtio_gpu_device *vgdev,
 	convert_to_hw_box(&cmd_p->box, box);
 	cmd_p->offset = cpu_to_le64(offset);
 	cmd_p->level = cpu_to_le32(level);
+	cmd_p->stride = cpu_to_le32(stride);
+	cmd_p->layer_stride = cpu_to_le32(layer_stride);
 
 	virtio_gpu_queue_fenced_ctrl_buffer(vgdev, vbuf, fence);
 }
@@ -1045,6 +1051,8 @@ void virtio_gpu_cmd_transfer_to_host_3d(struct virtio_gpu_device *vgdev,
 void virtio_gpu_cmd_transfer_from_host_3d(struct virtio_gpu_device *vgdev,
 					  uint32_t ctx_id,
 					  uint64_t offset, uint32_t level,
+					  uint32_t stride,
+					  uint32_t layer_stride,
 					  struct drm_virtgpu_3d_box *box,
 					  struct virtio_gpu_object_array *objs,
 					  struct virtio_gpu_fence *fence)
@@ -1064,6 +1072,8 @@ void virtio_gpu_cmd_transfer_from_host_3d(struct virtio_gpu_device *vgdev,
 	convert_to_hw_box(&cmd_p->box, box);
 	cmd_p->offset = cpu_to_le64(offset);
 	cmd_p->level = cpu_to_le32(level);
+	cmd_p->stride = cpu_to_le32(stride);
+	cmd_p->layer_stride = cpu_to_le32(layer_stride);
 
 	virtio_gpu_queue_fenced_ctrl_buffer(vgdev, vbuf, fence);
 }
-- 
2.26.2

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply related	[flat|nested] 39+ messages in thread

* [PATCH v2 21/23] drm/virtio: implement blob resources: report blob mem to userspace
  2020-09-02 21:08 [PATCH v2 00/23] Blob prerequisites + blob resources Gurchetan Singh
                   ` (19 preceding siblings ...)
  2020-09-02 21:08 ` [PATCH v2 20/23] drm/virtio: implement blob resources: fix stride discrepancy Gurchetan Singh
@ 2020-09-02 21:08 ` Gurchetan Singh
  2020-09-02 21:08 ` [PATCH v2 22/23] drm/virtio: implement blob resources: resource create blob ioctl Gurchetan Singh
  2020-09-02 21:08 ` [PATCH v2 23/23] drm/virtio: advertise features to userspace Gurchetan Singh
  22 siblings, 0 replies; 39+ messages in thread
From: Gurchetan Singh @ 2020-09-02 21:08 UTC (permalink / raw)
  To: dri-devel, virtio-dev; +Cc: sebastien.boeuf, kraxel, vgoyal, mst

The stride field has never been used, so repurpose it to be
"blob_mem". This way, userspace can know the memory properties
of the blob if it's passed between userspace processes and
no suitable userspace API exists to transmit that knowledge.

Signed-off-by: Gurchetan Singh <gurchetansingh@chromium.org>
Acked-by: Tomeu Vizoso <tomeu.vizoso@collabora.com>
---
 drivers/gpu/drm/virtio/virtgpu_ioctl.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/drivers/gpu/drm/virtio/virtgpu_ioctl.c b/drivers/gpu/drm/virtio/virtgpu_ioctl.c
index 0075995a9f5b8..7dbe24248a200 100644
--- a/drivers/gpu/drm/virtio/virtgpu_ioctl.c
+++ b/drivers/gpu/drm/virtio/virtgpu_ioctl.c
@@ -300,6 +300,9 @@ static int virtio_gpu_resource_info_ioctl(struct drm_device *dev, void *data,
 
 	ri->size = qobj->base.base.size;
 	ri->res_handle = qobj->hw_res_handle;
+	if (qobj->host3d_blob || qobj->guest_blob)
+		ri->blob_mem = qobj->blob_mem;
+
 	drm_gem_object_put(gobj);
 	return 0;
 }
-- 
2.26.2

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply related	[flat|nested] 39+ messages in thread

* [PATCH v2 22/23] drm/virtio: implement blob resources: resource create blob ioctl
  2020-09-02 21:08 [PATCH v2 00/23] Blob prerequisites + blob resources Gurchetan Singh
                   ` (20 preceding siblings ...)
  2020-09-02 21:08 ` [PATCH v2 21/23] drm/virtio: implement blob resources: report blob mem to userspace Gurchetan Singh
@ 2020-09-02 21:08 ` Gurchetan Singh
  2020-09-03 21:11   ` Chia-I Wu
  2020-09-02 21:08 ` [PATCH v2 23/23] drm/virtio: advertise features to userspace Gurchetan Singh
  22 siblings, 1 reply; 39+ messages in thread
From: Gurchetan Singh @ 2020-09-02 21:08 UTC (permalink / raw)
  To: dri-devel, virtio-dev; +Cc: sebastien.boeuf, kraxel, vgoyal, mst

From: Gerd Hoffmann <kraxel@redhat.com>

Implement resource create blob as specified.

Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
Co-developed-by: Gurchetan Singh <gurchetansingh@chromium.org>
Signed-off-by: Gurchetan Singh <gurchetansingh@chromium.org>
Acked-by: Tomeu Vizoso <tomeu.vizoso@collabora.com>
---
 drivers/gpu/drm/virtio/virtgpu_drv.h    |   4 +-
 drivers/gpu/drm/virtio/virtgpu_ioctl.c  | 136 ++++++++++++++++++++++++
 drivers/gpu/drm/virtio/virtgpu_object.c |   5 +-
 drivers/gpu/drm/virtio/virtgpu_vram.c   |   2 +
 4 files changed, 144 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/virtio/virtgpu_drv.h b/drivers/gpu/drm/virtio/virtgpu_drv.h
index 6162865c162df..d2ea199dbdb90 100644
--- a/drivers/gpu/drm/virtio/virtgpu_drv.h
+++ b/drivers/gpu/drm/virtio/virtgpu_drv.h
@@ -257,8 +257,8 @@ struct virtio_gpu_fpriv {
 	struct mutex context_lock;
 };
 
-/* virtgpu_ioctl.c */
-#define DRM_VIRTIO_NUM_IOCTLS 10
+/* virtio_ioctl.c */
+#define DRM_VIRTIO_NUM_IOCTLS 11
 extern struct drm_ioctl_desc virtio_gpu_ioctls[DRM_VIRTIO_NUM_IOCTLS];
 void virtio_gpu_create_context(struct drm_device *dev, struct drm_file *file);
 
diff --git a/drivers/gpu/drm/virtio/virtgpu_ioctl.c b/drivers/gpu/drm/virtio/virtgpu_ioctl.c
index 7dbe24248a200..442cbca59c8a5 100644
--- a/drivers/gpu/drm/virtio/virtgpu_ioctl.c
+++ b/drivers/gpu/drm/virtio/virtgpu_ioctl.c
@@ -34,6 +34,10 @@
 
 #include "virtgpu_drv.h"
 
+#define VIRTGPU_BLOB_FLAG_USE_MASK (VIRTGPU_BLOB_FLAG_USE_MAPPABLE | \
+				    VIRTGPU_BLOB_FLAG_USE_SHAREABLE | \
+				    VIRTGPU_BLOB_FLAG_USE_CROSS_DEVICE)
+
 void virtio_gpu_create_context(struct drm_device *dev, struct drm_file *file)
 {
 	struct virtio_gpu_device *vgdev = dev->dev_private;
@@ -520,6 +524,134 @@ static int virtio_gpu_get_caps_ioctl(struct drm_device *dev,
 	return 0;
 }
 
+static int verify_blob(struct virtio_gpu_device *vgdev,
+		       struct virtio_gpu_fpriv *vfpriv,
+		       struct virtio_gpu_object_params *params,
+		       struct drm_virtgpu_resource_create_blob *rc_blob,
+		       bool *guest_blob, bool *host3d_blob)
+{
+	if (!vgdev->has_resource_blob)
+		return -EINVAL;
+
+	if ((rc_blob->blob_flags & ~VIRTGPU_BLOB_FLAG_USE_MASK) ||
+	    !rc_blob->blob_flags)
+		return -EINVAL;
+
+	if (rc_blob->blob_flags & VIRTGPU_BLOB_FLAG_USE_CROSS_DEVICE) {
+		if (!vgdev->has_resource_assign_uuid)
+			return -EINVAL;
+	}
+
+	switch (rc_blob->blob_mem) {
+	case VIRTGPU_BLOB_MEM_GUEST:
+		*guest_blob = true;
+		break;
+	case VIRTGPU_BLOB_MEM_HOST3D_GUEST:
+		*guest_blob = true;
+		fallthrough;
+	case VIRTGPU_BLOB_MEM_HOST3D:
+		*host3d_blob = true;
+		break;
+	default:
+		return -EINVAL;
+	}
+
+	if (*host3d_blob) {
+		if (!vgdev->has_virgl_3d)
+			return -EINVAL;
+
+		/* Must be dword aligned. */
+		if (rc_blob->cmd_size % 4 != 0)
+			return -EINVAL;
+
+		params->ctx_id = vfpriv->ctx_id;
+		params->blob_id = rc_blob->blob_id;
+	} else {
+		if (rc_blob->blob_id != 0)
+			return -EINVAL;
+
+		if (rc_blob->cmd_size != 0)
+			return -EINVAL;
+	}
+
+	params->blob_mem = rc_blob->blob_mem;
+	params->size = rc_blob->size;
+	params->blob = true;
+	params->blob_flags = rc_blob->blob_flags;
+	return 0;
+}
+
+static int virtio_gpu_resource_create_blob(struct drm_device *dev,
+					   void *data, struct drm_file *file)
+{
+	int ret = 0;
+	uint32_t handle = 0;
+	bool guest_blob = false;
+	bool host3d_blob = false;
+	struct drm_gem_object *obj;
+	struct virtio_gpu_object *bo;
+	struct virtio_gpu_object_params params = { 0 };
+	struct virtio_gpu_device *vgdev = dev->dev_private;
+	struct virtio_gpu_fpriv *vfpriv = file->driver_priv;
+	struct drm_virtgpu_resource_create_blob *rc_blob = data;
+
+	if (verify_blob(vgdev, vfpriv, &params, rc_blob,
+			&guest_blob, &host3d_blob))
+		return -EINVAL;
+
+	if (vgdev->has_virgl_3d)
+		virtio_gpu_create_context(dev, file);
+
+	if (rc_blob->cmd_size) {
+		void *buf;
+
+		buf = memdup_user(u64_to_user_ptr(rc_blob->cmd),
+				  rc_blob->cmd_size);
+
+		if (IS_ERR(buf))
+			return PTR_ERR(buf);
+
+		virtio_gpu_cmd_submit(vgdev, buf, rc_blob->cmd_size,
+				      vfpriv->ctx_id, NULL, NULL);
+	}
+
+	if (guest_blob)
+		ret = virtio_gpu_object_create(vgdev, &params, &bo, NULL);
+	else if (!guest_blob && host3d_blob)
+		ret = virtio_gpu_vram_create(vgdev, &params, &bo);
+	else
+		return -EINVAL;
+
+	if (ret < 0)
+		return ret;
+
+	bo->guest_blob = guest_blob;
+	bo->host3d_blob = host3d_blob;
+	bo->blob_mem = rc_blob->blob_mem;
+	bo->blob_flags = rc_blob->blob_flags;
+
+	obj = &bo->base.base;
+	if (params.blob_flags & VIRTGPU_BLOB_FLAG_USE_CROSS_DEVICE) {
+		ret = virtio_gpu_resource_assign_uuid(vgdev, bo);
+		if (ret) {
+			drm_gem_object_release(obj);
+			return ret;
+		}
+	}
+
+	ret = drm_gem_handle_create(file, obj, &handle);
+	if (ret) {
+		drm_gem_object_release(obj);
+		return ret;
+	}
+	drm_gem_object_put(obj);
+
+	rc_blob->res_handle = bo->hw_res_handle;
+	rc_blob->bo_handle = handle;
+
+	return 0;
+}
+
 struct drm_ioctl_desc virtio_gpu_ioctls[DRM_VIRTIO_NUM_IOCTLS] = {
 	DRM_IOCTL_DEF_DRV(VIRTGPU_MAP, virtio_gpu_map_ioctl,
 			  DRM_RENDER_ALLOW),
@@ -552,4 +684,8 @@ struct drm_ioctl_desc virtio_gpu_ioctls[DRM_VIRTIO_NUM_IOCTLS] = {
 
 	DRM_IOCTL_DEF_DRV(VIRTGPU_GET_CAPS, virtio_gpu_get_caps_ioctl,
 			  DRM_RENDER_ALLOW),
+
+	DRM_IOCTL_DEF_DRV(VIRTGPU_RESOURCE_CREATE_BLOB,
+			  virtio_gpu_resource_create_blob,
+			  DRM_RENDER_ALLOW),
 };
diff --git a/drivers/gpu/drm/virtio/virtgpu_object.c b/drivers/gpu/drm/virtio/virtgpu_object.c
index cef79455257df..258b4eeae7c2c 100644
--- a/drivers/gpu/drm/virtio/virtgpu_object.c
+++ b/drivers/gpu/drm/virtio/virtgpu_object.c
@@ -244,7 +244,10 @@ int virtio_gpu_object_create(struct virtio_gpu_device *vgdev,
 		return ret;
 	}
 
-	if (params->virgl) {
+	if (params->blob) {
+		virtio_gpu_cmd_resource_create_blob(vgdev, bo, params,
+						    ents, nents);
+	} else if (params->virgl) {
 		virtio_gpu_cmd_resource_create_3d(vgdev, bo, params,
 						  objs, fence);
 		virtio_gpu_object_attach(vgdev, bo, ents, nents);
diff --git a/drivers/gpu/drm/virtio/virtgpu_vram.c b/drivers/gpu/drm/virtio/virtgpu_vram.c
index 087945fcd230f..23c21bc4d01e2 100644
--- a/drivers/gpu/drm/virtio/virtgpu_vram.c
+++ b/drivers/gpu/drm/virtio/virtgpu_vram.c
@@ -149,6 +149,8 @@ int virtio_gpu_vram_create(struct virtio_gpu_device *vgdev,
 		return ret;
 	}
 
+	virtio_gpu_cmd_resource_create_blob(vgdev, &vram->base, params, NULL,
+					    0);
 	if (params->blob_flags & VIRTGPU_BLOB_FLAG_USE_MAPPABLE) {
 		ret = virtio_gpu_vram_map(&vram->base);
 		if (ret) {
-- 
2.26.2

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply related	[flat|nested] 39+ messages in thread

* [PATCH v2 23/23] drm/virtio: advertise features to userspace
  2020-09-02 21:08 [PATCH v2 00/23] Blob prerequisites + blob resources Gurchetan Singh
                   ` (21 preceding siblings ...)
  2020-09-02 21:08 ` [PATCH v2 22/23] drm/virtio: implement blob resources: resource create blob ioctl Gurchetan Singh
@ 2020-09-02 21:08 ` Gurchetan Singh
  22 siblings, 0 replies; 39+ messages in thread
From: Gurchetan Singh @ 2020-09-02 21:08 UTC (permalink / raw)
  To: dri-devel, virtio-dev; +Cc: sebastien.boeuf, kraxel, vgoyal, mst

New api changes are now available to userspace. Also, the
comparison to true is redundant, so remove it.

Signed-off-by: Gurchetan Singh <gurchetansingh@chromium.org>
Acked-by: Tomeu Vizoso <tomeu.vizoso@collabora.com>
---
 drivers/gpu/drm/virtio/virtgpu_ioctl.c | 11 ++++++++++-
 1 file changed, 10 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/virtio/virtgpu_ioctl.c b/drivers/gpu/drm/virtio/virtgpu_ioctl.c
index 442cbca59c8a5..e4c0c1f34d5c9 100644
--- a/drivers/gpu/drm/virtio/virtgpu_ioctl.c
+++ b/drivers/gpu/drm/virtio/virtgpu_ioctl.c
@@ -211,11 +211,20 @@ static int virtio_gpu_getparam_ioctl(struct drm_device *dev, void *data,
 
 	switch (param->param) {
 	case VIRTGPU_PARAM_3D_FEATURES:
-		value = vgdev->has_virgl_3d == true ? 1 : 0;
+		value = vgdev->has_virgl_3d ? 1 : 0;
 		break;
 	case VIRTGPU_PARAM_CAPSET_QUERY_FIX:
 		value = 1;
 		break;
+	case VIRTGPU_PARAM_RESOURCE_BLOB:
+		value = vgdev->has_resource_blob ? 1 : 0;
+		break;
+	case VIRTGPU_PARAM_HOST_VISIBLE:
+		value = vgdev->has_host_visible ? 1 : 0;
+		break;
+	case VIRTGPU_PARAM_CROSS_DEVICE:
+		value = vgdev->has_resource_assign_uuid ? 1 : 0;
+		break;
 	default:
 		return -EINVAL;
 	}
-- 
2.26.2

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply related	[flat|nested] 39+ messages in thread

* Re: [PATCH v2 04/23] virtio: Add get_shm_region method
  2020-09-02 21:08 ` [PATCH v2 04/23] virtio: Add get_shm_region method Gurchetan Singh
@ 2020-09-02 22:15   ` Vivek Goyal
  2020-09-03  0:00     ` Gurchetan Singh
  0 siblings, 1 reply; 39+ messages in thread
From: Vivek Goyal @ 2020-09-02 22:15 UTC (permalink / raw)
  To: Gurchetan Singh
  Cc: virtio-dev, Miklos Szeredi, mst, dri-devel, sebastien.boeuf, kraxel

Hi Gurchetan,

Now Miklos has queued, these tree virtio patches for shared memory
region in his tree as part of virtiofs dax patch series.

I am hoping this will get merged in 5.10 through his tree.

https://git.kernel.org/pub/scm/linux/kernel/git/mszeredi/fuse.git/log/?h=dax

Thanks
Vivek

On Wed, Sep 02, 2020 at 02:08:28PM -0700, Gurchetan Singh wrote:
> From: Sebastien Boeuf <sebastien.boeuf@intel.com>
> 
> Virtio defines 'shared memory regions' that provide a continuously
> shared region between the host and guest.
> 
> Provide a method to find a particular region on a device.
> 
> Signed-off-by: Sebastien Boeuf <sebastien.boeuf@intel.com>
> Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
> Acked-by: Michael S. Tsirkin <mst@redhat.com>
> Cc: kvm@vger.kernel.org
> Cc: virtualization@lists.linux-foundation.org
> Cc: "Michael S. Tsirkin" <mst@redhat.com>
> ---
>  include/linux/virtio_config.h | 17 +++++++++++++++++
>  1 file changed, 17 insertions(+)
> 
> diff --git a/include/linux/virtio_config.h b/include/linux/virtio_config.h
> index 8fe857e27ef32..4b8e38c5c4d8c 100644
> --- a/include/linux/virtio_config.h
> +++ b/include/linux/virtio_config.h
> @@ -11,6 +11,11 @@
>  
>  struct irq_affinity;
>  
> +struct virtio_shm_region {
> +	u64 addr;
> +	u64 len;
> +};
> +
>  /**
>   * virtio_config_ops - operations for configuring a virtio device
>   * Note: Do not assume that a transport implements all of the operations
> @@ -66,6 +71,7 @@ struct irq_affinity;
>   *      the caller can then copy.
>   * @set_vq_affinity: set the affinity for a virtqueue (optional).
>   * @get_vq_affinity: get the affinity for a virtqueue (optional).
> + * @get_shm_region: get a shared memory region based on the index.
>   */
>  typedef void vq_callback_t(struct virtqueue *);
>  struct virtio_config_ops {
> @@ -89,6 +95,8 @@ struct virtio_config_ops {
>  			       const struct cpumask *cpu_mask);
>  	const struct cpumask *(*get_vq_affinity)(struct virtio_device *vdev,
>  			int index);
> +	bool (*get_shm_region)(struct virtio_device *vdev,
> +			       struct virtio_shm_region *region, u8 id);
>  };
>  
>  /* If driver didn't advertise the feature, it will never appear. */
> @@ -251,6 +259,15 @@ int virtqueue_set_affinity(struct virtqueue *vq, const struct cpumask *cpu_mask)
>  	return 0;
>  }
>  
> +static inline
> +bool virtio_get_shm_region(struct virtio_device *vdev,
> +			   struct virtio_shm_region *region, u8 id)
> +{
> +	if (!vdev->config->get_shm_region)
> +		return false;
> +	return vdev->config->get_shm_region(vdev, region, id);
> +}
> +
>  static inline bool virtio_is_little_endian(struct virtio_device *vdev)
>  {
>  	return virtio_has_feature(vdev, VIRTIO_F_VERSION_1) ||
> -- 
> 2.26.2
> 

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 39+ messages in thread

* Re: [PATCH v2 04/23] virtio: Add get_shm_region method
  2020-09-02 22:15   ` Vivek Goyal
@ 2020-09-03  0:00     ` Gurchetan Singh
  2020-09-09  7:03       ` Gerd Hoffmann
  0 siblings, 1 reply; 39+ messages in thread
From: Gurchetan Singh @ 2020-09-03  0:00 UTC (permalink / raw)
  To: Vivek Goyal
  Cc: virtio-dev, Miklos Szeredi, Michael S. Tsirkin, ML dri-devel,
	Sebastien Boeuf, Gerd Hoffmann


[-- Attachment #1.1: Type: text/plain, Size: 3277 bytes --]

On Wed, Sep 2, 2020 at 3:15 PM Vivek Goyal <vgoyal@redhat.com> wrote:

> Hi Gurchetan,
>
> Now Miklos has queued, these tree virtio patches for shared memory
> region in his tree as part of virtiofs dax patch series.
>
> I am hoping this will get merged in 5.10 through his tree.
>
>
> https://git.kernel.org/pub/scm/linux/kernel/git/mszeredi/fuse.git/log/?h=dax


Terrific ... !  Maybe we can queue the version Miklos has in drm-misc-next
to avoid merge conflicts ?!?

There's a few checkpatch --strict fixes in the blob version, but I doubt
anyone cares.


>
> Thanks
> Vivek
>
> On Wed, Sep 02, 2020 at 02:08:28PM -0700, Gurchetan Singh wrote:
> > From: Sebastien Boeuf <sebastien.boeuf@intel.com>
> >
> > Virtio defines 'shared memory regions' that provide a continuously
> > shared region between the host and guest.
> >
> > Provide a method to find a particular region on a device.
> >
> > Signed-off-by: Sebastien Boeuf <sebastien.boeuf@intel.com>
> > Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
> > Acked-by: Michael S. Tsirkin <mst@redhat.com>
> > Cc: kvm@vger.kernel.org
> > Cc: virtualization@lists.linux-foundation.org
> > Cc: "Michael S. Tsirkin" <mst@redhat.com>
> > ---
> >  include/linux/virtio_config.h | 17 +++++++++++++++++
> >  1 file changed, 17 insertions(+)
> >
> > diff --git a/include/linux/virtio_config.h
> b/include/linux/virtio_config.h
> > index 8fe857e27ef32..4b8e38c5c4d8c 100644
> > --- a/include/linux/virtio_config.h
> > +++ b/include/linux/virtio_config.h
> > @@ -11,6 +11,11 @@
> >
> >  struct irq_affinity;
> >
> > +struct virtio_shm_region {
> > +     u64 addr;
> > +     u64 len;
> > +};
> > +
> >  /**
> >   * virtio_config_ops - operations for configuring a virtio device
> >   * Note: Do not assume that a transport implements all of the operations
> > @@ -66,6 +71,7 @@ struct irq_affinity;
> >   *      the caller can then copy.
> >   * @set_vq_affinity: set the affinity for a virtqueue (optional).
> >   * @get_vq_affinity: get the affinity for a virtqueue (optional).
> > + * @get_shm_region: get a shared memory region based on the index.
> >   */
> >  typedef void vq_callback_t(struct virtqueue *);
> >  struct virtio_config_ops {
> > @@ -89,6 +95,8 @@ struct virtio_config_ops {
> >                              const struct cpumask *cpu_mask);
> >       const struct cpumask *(*get_vq_affinity)(struct virtio_device
> *vdev,
> >                       int index);
> > +     bool (*get_shm_region)(struct virtio_device *vdev,
> > +                            struct virtio_shm_region *region, u8 id);
> >  };
> >
> >  /* If driver didn't advertise the feature, it will never appear. */
> > @@ -251,6 +259,15 @@ int virtqueue_set_affinity(struct virtqueue *vq,
> const struct cpumask *cpu_mask)
> >       return 0;
> >  }
> >
> > +static inline
> > +bool virtio_get_shm_region(struct virtio_device *vdev,
> > +                        struct virtio_shm_region *region, u8 id)
> > +{
> > +     if (!vdev->config->get_shm_region)
> > +             return false;
> > +     return vdev->config->get_shm_region(vdev, region, id);
> > +}
> > +
> >  static inline bool virtio_is_little_endian(struct virtio_device *vdev)
> >  {
> >       return virtio_has_feature(vdev, VIRTIO_F_VERSION_1) ||
> > --
> > 2.26.2
> >
>
>

[-- Attachment #1.2: Type: text/html, Size: 4974 bytes --]

[-- Attachment #2: Type: text/plain, Size: 160 bytes --]

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 39+ messages in thread

* Re: [PATCH v2 22/23] drm/virtio: implement blob resources: resource create blob ioctl
  2020-09-02 21:08 ` [PATCH v2 22/23] drm/virtio: implement blob resources: resource create blob ioctl Gurchetan Singh
@ 2020-09-03 21:11   ` Chia-I Wu
  2020-09-03 22:12     ` Gurchetan Singh
  0 siblings, 1 reply; 39+ messages in thread
From: Chia-I Wu @ 2020-09-03 21:11 UTC (permalink / raw)
  To: Gurchetan Singh
  Cc: virtio-dev, Michael S. Tsirkin, ML dri-devel, sebastien.boeuf,
	Gerd Hoffmann, vgoyal

On Wed, Sep 2, 2020 at 2:09 PM Gurchetan Singh
<gurchetansingh@chromium.org> wrote:
>
> From: Gerd Hoffmann <kraxel@redhat.com>
>
> Implement resource create blob as specified.
>
> Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
> Co-developed-by: Gurchetan Singh <gurchetansingh@chromium.org>
> Signed-off-by: Gurchetan Singh <gurchetansingh@chromium.org>
> Acked-by: Tomeu Vizoso <tomeu.vizoso@collabora.com>
> ---
>  drivers/gpu/drm/virtio/virtgpu_drv.h    |   4 +-
>  drivers/gpu/drm/virtio/virtgpu_ioctl.c  | 136 ++++++++++++++++++++++++
>  drivers/gpu/drm/virtio/virtgpu_object.c |   5 +-
>  drivers/gpu/drm/virtio/virtgpu_vram.c   |   2 +
>  4 files changed, 144 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/gpu/drm/virtio/virtgpu_drv.h b/drivers/gpu/drm/virtio/virtgpu_drv.h
> index 6162865c162df..d2ea199dbdb90 100644
> --- a/drivers/gpu/drm/virtio/virtgpu_drv.h
> +++ b/drivers/gpu/drm/virtio/virtgpu_drv.h
> @@ -257,8 +257,8 @@ struct virtio_gpu_fpriv {
>         struct mutex context_lock;
>  };
>
> -/* virtgpu_ioctl.c */
> -#define DRM_VIRTIO_NUM_IOCTLS 10
> +/* virtio_ioctl.c */
> +#define DRM_VIRTIO_NUM_IOCTLS 11
>  extern struct drm_ioctl_desc virtio_gpu_ioctls[DRM_VIRTIO_NUM_IOCTLS];
>  void virtio_gpu_create_context(struct drm_device *dev, struct drm_file *file);
>
> diff --git a/drivers/gpu/drm/virtio/virtgpu_ioctl.c b/drivers/gpu/drm/virtio/virtgpu_ioctl.c
> index 7dbe24248a200..442cbca59c8a5 100644
> --- a/drivers/gpu/drm/virtio/virtgpu_ioctl.c
> +++ b/drivers/gpu/drm/virtio/virtgpu_ioctl.c
> @@ -34,6 +34,10 @@
>
>  #include "virtgpu_drv.h"
>
> +#define VIRTGPU_BLOB_FLAG_USE_MASK (VIRTGPU_BLOB_FLAG_USE_MAPPABLE | \
> +                                   VIRTGPU_BLOB_FLAG_USE_SHAREABLE | \
> +                                   VIRTGPU_BLOB_FLAG_USE_CROSS_DEVICE)
> +
>  void virtio_gpu_create_context(struct drm_device *dev, struct drm_file *file)
>  {
>         struct virtio_gpu_device *vgdev = dev->dev_private;
> @@ -520,6 +524,134 @@ static int virtio_gpu_get_caps_ioctl(struct drm_device *dev,
>         return 0;
>  }
>
> +static int verify_blob(struct virtio_gpu_device *vgdev,
> +                      struct virtio_gpu_fpriv *vfpriv,
> +                      struct virtio_gpu_object_params *params,
> +                      struct drm_virtgpu_resource_create_blob *rc_blob,
> +                      bool *guest_blob, bool *host3d_blob)
> +{
> +       if (!vgdev->has_resource_blob)
> +               return -EINVAL;
> +
> +       if ((rc_blob->blob_flags & ~VIRTGPU_BLOB_FLAG_USE_MASK) ||
> +           !rc_blob->blob_flags)
> +               return -EINVAL;
> +
> +       if (rc_blob->blob_flags & VIRTGPU_BLOB_FLAG_USE_CROSS_DEVICE) {
> +               if (!vgdev->has_resource_assign_uuid)
> +                       return -EINVAL;
> +       }
> +
> +       switch (rc_blob->blob_mem) {
> +       case VIRTGPU_BLOB_MEM_GUEST:
> +               *guest_blob = true;
> +               break;
> +       case VIRTGPU_BLOB_MEM_HOST3D_GUEST:
> +               *guest_blob = true;
> +               fallthrough;
> +       case VIRTGPU_BLOB_MEM_HOST3D:
> +               *host3d_blob = true;
> +               break;
> +       default:
> +               return -EINVAL;
> +       }
> +
> +       if (*host3d_blob) {
> +               if (!vgdev->has_virgl_3d)
> +                       return -EINVAL;
> +
> +               /* Must be dword aligned. */
> +               if (rc_blob->cmd_size % 4 != 0)
> +                       return -EINVAL;
> +
> +               params->ctx_id = vfpriv->ctx_id;
> +               params->blob_id = rc_blob->blob_id;
> +       } else {
> +               if (rc_blob->blob_id != 0)
> +                       return -EINVAL;
> +
> +               if (rc_blob->cmd_size != 0)
> +                       return -EINVAL;
> +       }
> +
> +       params->blob_mem = rc_blob->blob_mem;
> +       params->size = rc_blob->size;
> +       params->blob = true;
> +       params->blob_flags = rc_blob->blob_flags;
> +       return 0;
> +}
> +
> +static int virtio_gpu_resource_create_blob(struct drm_device *dev,
> +                                          void *data, struct drm_file *file)
> +{
> +       int ret = 0;
> +       uint32_t handle = 0;
> +       bool guest_blob = false;
> +       bool host3d_blob = false;
> +       struct drm_gem_object *obj;
> +       struct virtio_gpu_object *bo;
> +       struct virtio_gpu_object_params params = { 0 };
> +       struct virtio_gpu_device *vgdev = dev->dev_private;
> +       struct virtio_gpu_fpriv *vfpriv = file->driver_priv;
> +       struct drm_virtgpu_resource_create_blob *rc_blob = data;
> +
> +       if (verify_blob(vgdev, vfpriv, &params, rc_blob,
> +                       &guest_blob, &host3d_blob))
> +               return -EINVAL;
> +
> +       if (vgdev->has_virgl_3d)
> +               virtio_gpu_create_context(dev, file);
> +
> +       if (rc_blob->cmd_size) {
> +               void *buf;
> +
> +               buf = memdup_user(u64_to_user_ptr(rc_blob->cmd),
> +                                 rc_blob->cmd_size);
> +
> +               if (IS_ERR(buf))
> +                       return PTR_ERR(buf);
> +
> +               virtio_gpu_cmd_submit(vgdev, buf, rc_blob->cmd_size,
> +                                     vfpriv->ctx_id, NULL, NULL);
> +       }
> +
> +       if (guest_blob)
> +               ret = virtio_gpu_object_create(vgdev, &params, &bo, NULL);
> +       else if (!guest_blob && host3d_blob)
> +               ret = virtio_gpu_vram_create(vgdev, &params, &bo);
When cmd_size != 0, a host blob has been allocated.  Will it be leaked
if virtio_gpu_{object,vram}_create fails?


> +       else
> +               return -EINVAL;
> +
> +       if (ret < 0)
> +               return ret;
> +
> +       bo->guest_blob = guest_blob;
> +       bo->host3d_blob = host3d_blob;
> +       bo->blob_mem = rc_blob->blob_mem;
> +       bo->blob_flags = rc_blob->blob_flags;
> +
> +       obj = &bo->base.base;
> +       if (params.blob_flags & VIRTGPU_BLOB_FLAG_USE_CROSS_DEVICE) {
> +               ret = virtio_gpu_resource_assign_uuid(vgdev, bo);
> +               if (ret) {
> +                       drm_gem_object_release(obj);
> +                       return ret;
> +               }
> +       }
> +
> +       ret = drm_gem_handle_create(file, obj, &handle);
> +       if (ret) {
> +               drm_gem_object_release(obj);
> +               return ret;
> +       }
> +       drm_gem_object_put(obj);
> +
> +       rc_blob->res_handle = bo->hw_res_handle;
> +       rc_blob->bo_handle = handle;
> +
> +       return 0;
> +}
> +
>  struct drm_ioctl_desc virtio_gpu_ioctls[DRM_VIRTIO_NUM_IOCTLS] = {
>         DRM_IOCTL_DEF_DRV(VIRTGPU_MAP, virtio_gpu_map_ioctl,
>                           DRM_RENDER_ALLOW),
> @@ -552,4 +684,8 @@ struct drm_ioctl_desc virtio_gpu_ioctls[DRM_VIRTIO_NUM_IOCTLS] = {
>
>         DRM_IOCTL_DEF_DRV(VIRTGPU_GET_CAPS, virtio_gpu_get_caps_ioctl,
>                           DRM_RENDER_ALLOW),
> +
> +       DRM_IOCTL_DEF_DRV(VIRTGPU_RESOURCE_CREATE_BLOB,
> +                         virtio_gpu_resource_create_blob,
> +                         DRM_RENDER_ALLOW),
>  };
> diff --git a/drivers/gpu/drm/virtio/virtgpu_object.c b/drivers/gpu/drm/virtio/virtgpu_object.c
> index cef79455257df..258b4eeae7c2c 100644
> --- a/drivers/gpu/drm/virtio/virtgpu_object.c
> +++ b/drivers/gpu/drm/virtio/virtgpu_object.c
> @@ -244,7 +244,10 @@ int virtio_gpu_object_create(struct virtio_gpu_device *vgdev,
>                 return ret;
>         }
>
> -       if (params->virgl) {
> +       if (params->blob) {
> +               virtio_gpu_cmd_resource_create_blob(vgdev, bo, params,
> +                                                   ents, nents);
> +       } else if (params->virgl) {
>                 virtio_gpu_cmd_resource_create_3d(vgdev, bo, params,
>                                                   objs, fence);
>                 virtio_gpu_object_attach(vgdev, bo, ents, nents);
> diff --git a/drivers/gpu/drm/virtio/virtgpu_vram.c b/drivers/gpu/drm/virtio/virtgpu_vram.c
> index 087945fcd230f..23c21bc4d01e2 100644
> --- a/drivers/gpu/drm/virtio/virtgpu_vram.c
> +++ b/drivers/gpu/drm/virtio/virtgpu_vram.c
> @@ -149,6 +149,8 @@ int virtio_gpu_vram_create(struct virtio_gpu_device *vgdev,
>                 return ret;
>         }
>
> +       virtio_gpu_cmd_resource_create_blob(vgdev, &vram->base, params, NULL,
> +                                           0);
>         if (params->blob_flags & VIRTGPU_BLOB_FLAG_USE_MAPPABLE) {
>                 ret = virtio_gpu_vram_map(&vram->base);
>                 if (ret) {
> --
> 2.26.2
>
> _______________________________________________
> dri-devel mailing list
> dri-devel@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/dri-devel
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 39+ messages in thread

* Re: [PATCH v2 22/23] drm/virtio: implement blob resources: resource create blob ioctl
  2020-09-03 21:11   ` Chia-I Wu
@ 2020-09-03 22:12     ` Gurchetan Singh
  0 siblings, 0 replies; 39+ messages in thread
From: Gurchetan Singh @ 2020-09-03 22:12 UTC (permalink / raw)
  To: Chia-I Wu; +Cc: virtio-dev, ML dri-devel


[-- Attachment #1.1: Type: text/plain, Size: 9734 bytes --]

On Thu, Sep 3, 2020 at 2:11 PM Chia-I Wu <olvaffe@gmail.com> wrote:

> On Wed, Sep 2, 2020 at 2:09 PM Gurchetan Singh
> <gurchetansingh@chromium.org> wrote:
> >
> > From: Gerd Hoffmann <kraxel@redhat.com>
> >
> > Implement resource create blob as specified.
> >
> > Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
> > Co-developed-by: Gurchetan Singh <gurchetansingh@chromium.org>
> > Signed-off-by: Gurchetan Singh <gurchetansingh@chromium.org>
> > Acked-by: Tomeu Vizoso <tomeu.vizoso@collabora.com>
> > ---
> >  drivers/gpu/drm/virtio/virtgpu_drv.h    |   4 +-
> >  drivers/gpu/drm/virtio/virtgpu_ioctl.c  | 136 ++++++++++++++++++++++++
> >  drivers/gpu/drm/virtio/virtgpu_object.c |   5 +-
> >  drivers/gpu/drm/virtio/virtgpu_vram.c   |   2 +
> >  4 files changed, 144 insertions(+), 3 deletions(-)
> >
> > diff --git a/drivers/gpu/drm/virtio/virtgpu_drv.h
> b/drivers/gpu/drm/virtio/virtgpu_drv.h
> > index 6162865c162df..d2ea199dbdb90 100644
> > --- a/drivers/gpu/drm/virtio/virtgpu_drv.h
> > +++ b/drivers/gpu/drm/virtio/virtgpu_drv.h
> > @@ -257,8 +257,8 @@ struct virtio_gpu_fpriv {
> >         struct mutex context_lock;
> >  };
> >
> > -/* virtgpu_ioctl.c */
> > -#define DRM_VIRTIO_NUM_IOCTLS 10
> > +/* virtio_ioctl.c */
> > +#define DRM_VIRTIO_NUM_IOCTLS 11
> >  extern struct drm_ioctl_desc virtio_gpu_ioctls[DRM_VIRTIO_NUM_IOCTLS];
> >  void virtio_gpu_create_context(struct drm_device *dev, struct drm_file
> *file);
> >
> > diff --git a/drivers/gpu/drm/virtio/virtgpu_ioctl.c
> b/drivers/gpu/drm/virtio/virtgpu_ioctl.c
> > index 7dbe24248a200..442cbca59c8a5 100644
> > --- a/drivers/gpu/drm/virtio/virtgpu_ioctl.c
> > +++ b/drivers/gpu/drm/virtio/virtgpu_ioctl.c
> > @@ -34,6 +34,10 @@
> >
> >  #include "virtgpu_drv.h"
> >
> > +#define VIRTGPU_BLOB_FLAG_USE_MASK (VIRTGPU_BLOB_FLAG_USE_MAPPABLE | \
> > +                                   VIRTGPU_BLOB_FLAG_USE_SHAREABLE | \
> > +                                   VIRTGPU_BLOB_FLAG_USE_CROSS_DEVICE)
> > +
> >  void virtio_gpu_create_context(struct drm_device *dev, struct drm_file
> *file)
> >  {
> >         struct virtio_gpu_device *vgdev = dev->dev_private;
> > @@ -520,6 +524,134 @@ static int virtio_gpu_get_caps_ioctl(struct
> drm_device *dev,
> >         return 0;
> >  }
> >
> > +static int verify_blob(struct virtio_gpu_device *vgdev,
> > +                      struct virtio_gpu_fpriv *vfpriv,
> > +                      struct virtio_gpu_object_params *params,
> > +                      struct drm_virtgpu_resource_create_blob *rc_blob,
> > +                      bool *guest_blob, bool *host3d_blob)
> > +{
> > +       if (!vgdev->has_resource_blob)
> > +               return -EINVAL;
> > +
> > +       if ((rc_blob->blob_flags & ~VIRTGPU_BLOB_FLAG_USE_MASK) ||
> > +           !rc_blob->blob_flags)
> > +               return -EINVAL;
> > +
> > +       if (rc_blob->blob_flags & VIRTGPU_BLOB_FLAG_USE_CROSS_DEVICE) {
> > +               if (!vgdev->has_resource_assign_uuid)
> > +                       return -EINVAL;
> > +       }
> > +
> > +       switch (rc_blob->blob_mem) {
> > +       case VIRTGPU_BLOB_MEM_GUEST:
> > +               *guest_blob = true;
> > +               break;
> > +       case VIRTGPU_BLOB_MEM_HOST3D_GUEST:
> > +               *guest_blob = true;
> > +               fallthrough;
> > +       case VIRTGPU_BLOB_MEM_HOST3D:
> > +               *host3d_blob = true;
> > +               break;
> > +       default:
> > +               return -EINVAL;
> > +       }
> > +
> > +       if (*host3d_blob) {
> > +               if (!vgdev->has_virgl_3d)
> > +                       return -EINVAL;
> > +
> > +               /* Must be dword aligned. */
> > +               if (rc_blob->cmd_size % 4 != 0)
> > +                       return -EINVAL;
> > +
> > +               params->ctx_id = vfpriv->ctx_id;
> > +               params->blob_id = rc_blob->blob_id;
> > +       } else {
> > +               if (rc_blob->blob_id != 0)
> > +                       return -EINVAL;
> > +
> > +               if (rc_blob->cmd_size != 0)
> > +                       return -EINVAL;
> > +       }
> > +
> > +       params->blob_mem = rc_blob->blob_mem;
> > +       params->size = rc_blob->size;
> > +       params->blob = true;
> > +       params->blob_flags = rc_blob->blob_flags;
> > +       return 0;
> > +}
> > +
> > +static int virtio_gpu_resource_create_blob(struct drm_device *dev,
> > +                                          void *data, struct drm_file
> *file)
> > +{
> > +       int ret = 0;
> > +       uint32_t handle = 0;
> > +       bool guest_blob = false;
> > +       bool host3d_blob = false;
> > +       struct drm_gem_object *obj;
> > +       struct virtio_gpu_object *bo;
> > +       struct virtio_gpu_object_params params = { 0 };
> > +       struct virtio_gpu_device *vgdev = dev->dev_private;
> > +       struct virtio_gpu_fpriv *vfpriv = file->driver_priv;
> > +       struct drm_virtgpu_resource_create_blob *rc_blob = data;
> > +
> > +       if (verify_blob(vgdev, vfpriv, &params, rc_blob,
> > +                       &guest_blob, &host3d_blob))
> > +               return -EINVAL;
> > +
> > +       if (vgdev->has_virgl_3d)
> > +               virtio_gpu_create_context(dev, file);
> > +
> > +       if (rc_blob->cmd_size) {
> > +               void *buf;
> > +
> > +               buf = memdup_user(u64_to_user_ptr(rc_blob->cmd),
> > +                                 rc_blob->cmd_size);
> > +
> > +               if (IS_ERR(buf))
> > +                       return PTR_ERR(buf);
> > +
> > +               virtio_gpu_cmd_submit(vgdev, buf, rc_blob->cmd_size,
> > +                                     vfpriv->ctx_id, NULL, NULL);
> > +       }
> > +
> > +       if (guest_blob)
> > +               ret = virtio_gpu_object_create(vgdev, &params, &bo,
> NULL);
> > +       else if (!guest_blob && host3d_blob)
> > +               ret = virtio_gpu_vram_create(vgdev, &params, &bo);
> When cmd_size != 0, a host blob has been allocated.  Will it be leaked
> if virtio_gpu_{object,vram}_create fails?
>

The actual kick happens as a result of drm_gem_handle_create (similar to
drm_virtgpu_resource_create), so the host-side allocation doesn't happen if
the virtio_gpu_{object,vram}_create sanity checks fail.  We could unqueue
items from the virtqueue on the failure cases, but blob is big enough
already and userspace doesn't really recover gracefully if an ioctl fails
either.


>
> > +       else
> > +               return -EINVAL;
> > +
> > +       if (ret < 0)
> > +               return ret;
> > +
> > +       bo->guest_blob = guest_blob;
> > +       bo->host3d_blob = host3d_blob;
> > +       bo->blob_mem = rc_blob->blob_mem;
> > +       bo->blob_flags = rc_blob->blob_flags;
> > +
> > +       obj = &bo->base.base;
> > +       if (params.blob_flags & VIRTGPU_BLOB_FLAG_USE_CROSS_DEVICE) {
> > +               ret = virtio_gpu_resource_assign_uuid(vgdev, bo);
> > +               if (ret) {
> > +                       drm_gem_object_release(obj);
> > +                       return ret;
> > +               }
> > +       }
> > +
> > +       ret = drm_gem_handle_create(file, obj, &handle);
> > +       if (ret) {
> > +               drm_gem_object_release(obj);
> > +               return ret;
> > +       }
> > +       drm_gem_object_put(obj);
> > +
> > +       rc_blob->res_handle = bo->hw_res_handle;
> > +       rc_blob->bo_handle = handle;
> > +
> > +       return 0;
> > +}
> > +
> >  struct drm_ioctl_desc virtio_gpu_ioctls[DRM_VIRTIO_NUM_IOCTLS] = {
> >         DRM_IOCTL_DEF_DRV(VIRTGPU_MAP, virtio_gpu_map_ioctl,
> >                           DRM_RENDER_ALLOW),
> > @@ -552,4 +684,8 @@ struct drm_ioctl_desc
> virtio_gpu_ioctls[DRM_VIRTIO_NUM_IOCTLS] = {
> >
> >         DRM_IOCTL_DEF_DRV(VIRTGPU_GET_CAPS, virtio_gpu_get_caps_ioctl,
> >                           DRM_RENDER_ALLOW),
> > +
> > +       DRM_IOCTL_DEF_DRV(VIRTGPU_RESOURCE_CREATE_BLOB,
> > +                         virtio_gpu_resource_create_blob,
> > +                         DRM_RENDER_ALLOW),
> >  };
> > diff --git a/drivers/gpu/drm/virtio/virtgpu_object.c
> b/drivers/gpu/drm/virtio/virtgpu_object.c
> > index cef79455257df..258b4eeae7c2c 100644
> > --- a/drivers/gpu/drm/virtio/virtgpu_object.c
> > +++ b/drivers/gpu/drm/virtio/virtgpu_object.c
> > @@ -244,7 +244,10 @@ int virtio_gpu_object_create(struct
> virtio_gpu_device *vgdev,
> >                 return ret;
> >         }
> >
> > -       if (params->virgl) {
> > +       if (params->blob) {
> > +               virtio_gpu_cmd_resource_create_blob(vgdev, bo, params,
> > +                                                   ents, nents);
> > +       } else if (params->virgl) {
> >                 virtio_gpu_cmd_resource_create_3d(vgdev, bo, params,
> >                                                   objs, fence);
> >                 virtio_gpu_object_attach(vgdev, bo, ents, nents);
> > diff --git a/drivers/gpu/drm/virtio/virtgpu_vram.c
> b/drivers/gpu/drm/virtio/virtgpu_vram.c
> > index 087945fcd230f..23c21bc4d01e2 100644
> > --- a/drivers/gpu/drm/virtio/virtgpu_vram.c
> > +++ b/drivers/gpu/drm/virtio/virtgpu_vram.c
> > @@ -149,6 +149,8 @@ int virtio_gpu_vram_create(struct virtio_gpu_device
> *vgdev,
> >                 return ret;
> >         }
> >
> > +       virtio_gpu_cmd_resource_create_blob(vgdev, &vram->base, params,
> NULL,
> > +                                           0);
> >         if (params->blob_flags & VIRTGPU_BLOB_FLAG_USE_MAPPABLE) {
> >                 ret = virtio_gpu_vram_map(&vram->base);
> >                 if (ret) {
> > --
> > 2.26.2
> >
> > _______________________________________________
> > dri-devel mailing list
> > dri-devel@lists.freedesktop.org
> > https://lists.freedesktop.org/mailman/listinfo/dri-devel
>

[-- Attachment #1.2: Type: text/html, Size: 13349 bytes --]

[-- Attachment #2: Type: text/plain, Size: 160 bytes --]

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 39+ messages in thread

* Re: [PATCH v2 09/23] virtio-gpu api: blob resources
  2020-09-02 21:08 ` [PATCH v2 09/23] virtio-gpu api: blob resources Gurchetan Singh
@ 2020-09-09  6:55   ` Gerd Hoffmann
  2020-09-17  0:16     ` Gurchetan Singh
  0 siblings, 1 reply; 39+ messages in thread
From: Gerd Hoffmann @ 2020-09-09  6:55 UTC (permalink / raw)
  To: Gurchetan Singh; +Cc: virtio-dev, sebastien.boeuf, vgoyal, dri-devel, mst

  Hi,

> @@ -100,7 +102,7 @@ struct drm_virtgpu_resource_info {
>  	__u32 bo_handle;
>  	__u32 res_handle;
>  	__u32 size;
> -	__u32 stride;
> +	__u32 blob_mem;
>  };

Huh?  This is not in the virtio spec update proposed.

>  struct drm_virtgpu_3d_box {
> @@ -117,6 +119,8 @@ struct drm_virtgpu_3d_transfer_to_host {
>  	struct drm_virtgpu_3d_box box;
>  	__u32 level;
>  	__u32 offset;
> +	__u32 stride;
> +	__u32 layer_stride;
>  };

Same here.

>  struct drm_virtgpu_3d_transfer_from_host {
> @@ -124,6 +128,8 @@ struct drm_virtgpu_3d_transfer_from_host {
>  	struct drm_virtgpu_3d_box box;
>  	__u32 level;
>  	__u32 offset;
> +	__u32 stride;
> +	__u32 layer_stride;
>  };

And here.

take care,
  Gerd

PS: cherry-picked patches 1-3 into drm-misc-next.

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 39+ messages in thread

* Re: [PATCH v2 04/23] virtio: Add get_shm_region method
  2020-09-03  0:00     ` Gurchetan Singh
@ 2020-09-09  7:03       ` Gerd Hoffmann
  2020-09-09  7:13         ` Miklos Szeredi
  0 siblings, 1 reply; 39+ messages in thread
From: Gerd Hoffmann @ 2020-09-09  7:03 UTC (permalink / raw)
  To: Gurchetan Singh, Daniel Vetter
  Cc: virtio-dev, Miklos Szeredi, Michael S. Tsirkin, ML dri-devel,
	Sebastien Boeuf, Vivek Goyal

On Wed, Sep 02, 2020 at 05:00:25PM -0700, Gurchetan Singh wrote:
> On Wed, Sep 2, 2020 at 3:15 PM Vivek Goyal <vgoyal@redhat.com> wrote:
> 
> > Hi Gurchetan,
> >
> > Now Miklos has queued, these tree virtio patches for shared memory
> > region in his tree as part of virtiofs dax patch series.
> >
> > I am hoping this will get merged in 5.10 through his tree.
> >
> >
> > https://git.kernel.org/pub/scm/linux/kernel/git/mszeredi/fuse.git/log/?h=dax
> 
> 
> Terrific ... !  Maybe we can queue the version Miklos has in drm-misc-next
> to avoid merge conflicts ?!?

I guess it would either be merging the fuse tree into drm-misc-next,
or cherry-picking the three virtio shm patches from the fuse tree.

Daniel?  What is the usual way to handle this?

thanks,
  Gerd

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 39+ messages in thread

* Re: [PATCH v2 10/23] virtio-gpu api: host visible feature
  2020-09-02 21:08 ` [PATCH v2 10/23] virtio-gpu api: host visible feature Gurchetan Singh
@ 2020-09-09  7:05   ` Gerd Hoffmann
  2020-09-09  7:09   ` Gerd Hoffmann
  1 sibling, 0 replies; 39+ messages in thread
From: Gerd Hoffmann @ 2020-09-09  7:05 UTC (permalink / raw)
  To: Gurchetan Singh; +Cc: virtio-dev, sebastien.boeuf, vgoyal, dri-devel, mst

  Hi,

> +enum virtio_gpu_shm_id {
> +	VIRTIO_GPU_SHM_ID_UNDEFINED = 0,
> +	VIRTIO_GPU_SHM_ID_HOST_VISIBLE = 1
> +};

I think this is also not in the virtio spec update.

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 39+ messages in thread

* Re: [PATCH v2 10/23] virtio-gpu api: host visible feature
  2020-09-02 21:08 ` [PATCH v2 10/23] virtio-gpu api: host visible feature Gurchetan Singh
  2020-09-09  7:05   ` Gerd Hoffmann
@ 2020-09-09  7:09   ` Gerd Hoffmann
  1 sibling, 0 replies; 39+ messages in thread
From: Gerd Hoffmann @ 2020-09-09  7:09 UTC (permalink / raw)
  To: Gurchetan Singh; +Cc: virtio-dev, sebastien.boeuf, vgoyal, dri-devel, mst

  Hi,

> --- a/include/uapi/drm/virtgpu_drm.h

kernel <-> userspace API.

> --- a/include/uapi/linux/virtio_gpu.h

host <-> guest API.

Please create sepparate patches for these.

thanks,
  Gerd

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 39+ messages in thread

* Re: [PATCH v2 04/23] virtio: Add get_shm_region method
  2020-09-09  7:03       ` Gerd Hoffmann
@ 2020-09-09  7:13         ` Miklos Szeredi
  2020-09-09  9:26           ` Daniel Vetter
  0 siblings, 1 reply; 39+ messages in thread
From: Miklos Szeredi @ 2020-09-09  7:13 UTC (permalink / raw)
  To: Gerd Hoffmann
  Cc: virtio-dev, Michael S. Tsirkin, Daniel Vetter, ML dri-devel,
	Gurchetan Singh, Sebastien Boeuf, Vivek Goyal

On Wed, Sep 9, 2020 at 9:04 AM Gerd Hoffmann <kraxel@redhat.com> wrote:
>
> On Wed, Sep 02, 2020 at 05:00:25PM -0700, Gurchetan Singh wrote:
> > On Wed, Sep 2, 2020 at 3:15 PM Vivek Goyal <vgoyal@redhat.com> wrote:
> >
> > > Hi Gurchetan,
> > >
> > > Now Miklos has queued, these tree virtio patches for shared memory
> > > region in his tree as part of virtiofs dax patch series.
> > >
> > > I am hoping this will get merged in 5.10 through his tree.
> > >
> > >
> > > https://git.kernel.org/pub/scm/linux/kernel/git/mszeredi/fuse.git/log/?h=dax
> >
> >
> > Terrific ... !  Maybe we can queue the version Miklos has in drm-misc-next
> > to avoid merge conflicts ?!?
>
> I guess it would either be merging the fuse tree into drm-misc-next,
> or cherry-picking the three virtio shm patches from the fuse tree.

Maybe cleanest if we'd do a separate branch for the virtio patches and
pull that into both the fuse-next and the drm-misc-next trees?

Thanks,
Miklos
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 39+ messages in thread

* Re: [PATCH v2 04/23] virtio: Add get_shm_region method
  2020-09-09  7:13         ` Miklos Szeredi
@ 2020-09-09  9:26           ` Daniel Vetter
  2020-09-09  9:28             ` Daniel Vetter
  0 siblings, 1 reply; 39+ messages in thread
From: Daniel Vetter @ 2020-09-09  9:26 UTC (permalink / raw)
  To: Miklos Szeredi
  Cc: virtio-dev, Michael S. Tsirkin, Daniel Vetter, ML dri-devel,
	Gurchetan Singh, Sebastien Boeuf, Gerd Hoffmann, Vivek Goyal

On Wed, Sep 09, 2020 at 09:13:11AM +0200, Miklos Szeredi wrote:
> On Wed, Sep 9, 2020 at 9:04 AM Gerd Hoffmann <kraxel@redhat.com> wrote:
> >
> > On Wed, Sep 02, 2020 at 05:00:25PM -0700, Gurchetan Singh wrote:
> > > On Wed, Sep 2, 2020 at 3:15 PM Vivek Goyal <vgoyal@redhat.com> wrote:
> > >
> > > > Hi Gurchetan,
> > > >
> > > > Now Miklos has queued, these tree virtio patches for shared memory
> > > > region in his tree as part of virtiofs dax patch series.
> > > >
> > > > I am hoping this will get merged in 5.10 through his tree.
> > > >
> > > >
> > > > https://git.kernel.org/pub/scm/linux/kernel/git/mszeredi/fuse.git/log/?h=dax
> > >
> > >
> > > Terrific ... !  Maybe we can queue the version Miklos has in drm-misc-next
> > > to avoid merge conflicts ?!?
> >
> > I guess it would either be merging the fuse tree into drm-misc-next,
> > or cherry-picking the three virtio shm patches from the fuse tree.
> 
> Maybe cleanest if we'd do a separate branch for the virtio patches and
> pull that into both the fuse-next and the drm-misc-next trees?

+1

If the trees are more closely related (e.g. drm and v4l or so) then
occasionally we just merge patches into one tree with acks from all the
other maintainers. But topic branch for the common bits feels better here.

Please send the topic pull request to drm-misc maintainers (Maarten,
Maxime, Thomas) so they can pull it in.
-Daniel
-- 
Daniel Vetter
Software Engineer, Intel Corporation
http://blog.ffwll.ch
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 39+ messages in thread

* Re: [PATCH v2 04/23] virtio: Add get_shm_region method
  2020-09-09  9:26           ` Daniel Vetter
@ 2020-09-09  9:28             ` Daniel Vetter
  2020-09-10  0:28               ` Gurchetan Singh
  0 siblings, 1 reply; 39+ messages in thread
From: Daniel Vetter @ 2020-09-09  9:28 UTC (permalink / raw)
  To: Miklos Szeredi, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann
  Cc: virtio-dev, Michael S. Tsirkin, ML dri-devel, Gurchetan Singh,
	Sebastien Boeuf, Gerd Hoffmann, Vivek Goyal

On Wed, Sep 9, 2020 at 11:27 AM Daniel Vetter <daniel@ffwll.ch> wrote:
>
> On Wed, Sep 09, 2020 at 09:13:11AM +0200, Miklos Szeredi wrote:
> > On Wed, Sep 9, 2020 at 9:04 AM Gerd Hoffmann <kraxel@redhat.com> wrote:
> > >
> > > On Wed, Sep 02, 2020 at 05:00:25PM -0700, Gurchetan Singh wrote:
> > > > On Wed, Sep 2, 2020 at 3:15 PM Vivek Goyal <vgoyal@redhat.com> wrote:
> > > >
> > > > > Hi Gurchetan,
> > > > >
> > > > > Now Miklos has queued, these tree virtio patches for shared memory
> > > > > region in his tree as part of virtiofs dax patch series.
> > > > >
> > > > > I am hoping this will get merged in 5.10 through his tree.
> > > > >
> > > > >
> > > > > https://git.kernel.org/pub/scm/linux/kernel/git/mszeredi/fuse.git/log/?h=dax
> > > >
> > > >
> > > > Terrific ... !  Maybe we can queue the version Miklos has in drm-misc-next
> > > > to avoid merge conflicts ?!?
> > >
> > > I guess it would either be merging the fuse tree into drm-misc-next,
> > > or cherry-picking the three virtio shm patches from the fuse tree.
> >
> > Maybe cleanest if we'd do a separate branch for the virtio patches and
> > pull that into both the fuse-next and the drm-misc-next trees?
>
> +1
>
> If the trees are more closely related (e.g. drm and v4l or so) then
> occasionally we just merge patches into one tree with acks from all the
> other maintainers. But topic branch for the common bits feels better here.
>
> Please send the topic pull request to drm-misc maintainers (Maarten,
> Maxime, Thomas) so they can pull it in.

Works better when I add them :-)
-Daniel

> --
> Daniel Vetter
> Software Engineer, Intel Corporation
> http://blog.ffwll.ch



-- 
Daniel Vetter
Software Engineer, Intel Corporation
http://blog.ffwll.ch
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 39+ messages in thread

* Re: [PATCH v2 04/23] virtio: Add get_shm_region method
  2020-09-09  9:28             ` Daniel Vetter
@ 2020-09-10  0:28               ` Gurchetan Singh
  2020-09-10  9:56                 ` Miklos Szeredi
  0 siblings, 1 reply; 39+ messages in thread
From: Gurchetan Singh @ 2020-09-10  0:28 UTC (permalink / raw)
  To: Daniel Vetter
  Cc: virtio-dev, Miklos Szeredi, ML dri-devel, Michael S. Tsirkin,
	Sebastien Boeuf, Gerd Hoffmann, Thomas Zimmermann, Vivek Goyal


[-- Attachment #1.1: Type: text/plain, Size: 2141 bytes --]

On Wed, Sep 9, 2020 at 2:28 AM Daniel Vetter <daniel.vetter@ffwll.ch> wrote:

> On Wed, Sep 9, 2020 at 11:27 AM Daniel Vetter <daniel@ffwll.ch> wrote:
> >
> > On Wed, Sep 09, 2020 at 09:13:11AM +0200, Miklos Szeredi wrote:
> > > On Wed, Sep 9, 2020 at 9:04 AM Gerd Hoffmann <kraxel@redhat.com>
> wrote:
> > > >
> > > > On Wed, Sep 02, 2020 at 05:00:25PM -0700, Gurchetan Singh wrote:
> > > > > On Wed, Sep 2, 2020 at 3:15 PM Vivek Goyal <vgoyal@redhat.com>
> wrote:
> > > > >
> > > > > > Hi Gurchetan,
> > > > > >
> > > > > > Now Miklos has queued, these tree virtio patches for shared
> memory
> > > > > > region in his tree as part of virtiofs dax patch series.
> > > > > >
> > > > > > I am hoping this will get merged in 5.10 through his tree.
> > > > > >
> > > > > >
> > > > > >
> https://git.kernel.org/pub/scm/linux/kernel/git/mszeredi/fuse.git/log/?h=dax
> > > > >
> > > > >
> > > > > Terrific ... !  Maybe we can queue the version Miklos has in
> drm-misc-next
> > > > > to avoid merge conflicts ?!?
> > > >
> > > > I guess it would either be merging the fuse tree into drm-misc-next,
> > > > or cherry-picking the three virtio shm patches from the fuse tree.
> > >
> > > Maybe cleanest if we'd do a separate branch for the virtio patches and
> > > pull that into both the fuse-next and the drm-misc-next trees?
> >
> > +1
> >
> > If the trees are more closely related (e.g. drm and v4l or so) then
> > occasionally we just merge patches into one tree with acks from all the
> > other maintainers. But topic branch for the common bits feels better
> here.
> >
> > Please send the topic pull request to drm-misc maintainers (Maarten,
> > Maxime, Thomas) so they can pull it in.
>

That sounds like an excellent plan !

I will send out blob v3 (incorporating kraxel@'s feedback) once the topic
pull request (it seems Miklos will do this?) for the shm region patches has
been merged into drm-misc-next.


>
> Works better when I add them :-)
> -Daniel
>
> > --
> > Daniel Vetter
> > Software Engineer, Intel Corporation
> > http://blog.ffwll.ch
>
>
>
> --
> Daniel Vetter
> Software Engineer, Intel Corporation
> http://blog.ffwll.ch
>

[-- Attachment #1.2: Type: text/html, Size: 3568 bytes --]

[-- Attachment #2: Type: text/plain, Size: 160 bytes --]

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 39+ messages in thread

* Re: [PATCH v2 04/23] virtio: Add get_shm_region method
  2020-09-10  0:28               ` Gurchetan Singh
@ 2020-09-10  9:56                 ` Miklos Szeredi
  2020-09-14 23:44                   ` Gurchetan Singh
  0 siblings, 1 reply; 39+ messages in thread
From: Miklos Szeredi @ 2020-09-10  9:56 UTC (permalink / raw)
  To: Gurchetan Singh
  Cc: virtio-dev, Michael S. Tsirkin, Daniel Vetter, ML dri-devel,
	Sebastien Boeuf, Gerd Hoffmann, Thomas Zimmermann, Vivek Goyal

On Thu, Sep 10, 2020 at 2:28 AM Gurchetan Singh
<gurchetansingh@chromium.org> wrote:

> That sounds like an excellent plan !
>
> I will send out blob v3 (incorporating kraxel@'s feedback) once the topic pull request (it seems Miklos will do this?) for the shm region patches has been merged into drm-misc-next.

I split out the three patches into:

  git://git.kernel.org/pub/scm/linux/kernel/git/mszeredi/fuse.git#virtio-shm

Thanks,
Miklos
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 39+ messages in thread

* Re: [PATCH v2 04/23] virtio: Add get_shm_region method
  2020-09-10  9:56                 ` Miklos Szeredi
@ 2020-09-14 23:44                   ` Gurchetan Singh
  0 siblings, 0 replies; 39+ messages in thread
From: Gurchetan Singh @ 2020-09-14 23:44 UTC (permalink / raw)
  To: Miklos Szeredi
  Cc: virtio-dev, Michael S. Tsirkin, Daniel Vetter, ML dri-devel,
	Sebastien Boeuf, Gerd Hoffmann, Thomas Zimmermann, Vivek Goyal


[-- Attachment #1.1: Type: text/plain, Size: 581 bytes --]

On Thu, Sep 10, 2020 at 2:56 AM Miklos Szeredi <miklos@szeredi.hu> wrote:

> On Thu, Sep 10, 2020 at 2:28 AM Gurchetan Singh
> <gurchetansingh@chromium.org> wrote:
>
> > That sounds like an excellent plan !
> >
> > I will send out blob v3 (incorporating kraxel@'s feedback) once the
> topic pull request (it seems Miklos will do this?) for the shm region
> patches has been merged into drm-misc-next.
>
> I split out the three patches into:
>
>   git://
> git.kernel.org/pub/scm/linux/kernel/git/mszeredi/fuse.git#virtio-shm


Thanks, pull request sent.


>
>
> Thanks,
> Miklos
>

[-- Attachment #1.2: Type: text/html, Size: 1309 bytes --]

[-- Attachment #2: Type: text/plain, Size: 160 bytes --]

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 39+ messages in thread

* Re: [PATCH v2 09/23] virtio-gpu api: blob resources
  2020-09-09  6:55   ` Gerd Hoffmann
@ 2020-09-17  0:16     ` Gurchetan Singh
  0 siblings, 0 replies; 39+ messages in thread
From: Gurchetan Singh @ 2020-09-17  0:16 UTC (permalink / raw)
  To: Gerd Hoffmann; +Cc: virtio-dev, ML dri-devel


[-- Attachment #1.1: Type: text/plain, Size: 1206 bytes --]

On Tue, Sep 8, 2020 at 11:55 PM Gerd Hoffmann <kraxel@redhat.com> wrote:

>   Hi,
>
> > @@ -100,7 +102,7 @@ struct drm_virtgpu_resource_info {
> >       __u32 bo_handle;
> >       __u32 res_handle;
> >       __u32 size;
> > -     __u32 stride;
> > +     __u32 blob_mem;
> >  };
>
> Huh?  This is not in the virtio spec update proposed.
>
> >  struct drm_virtgpu_3d_box {
> > @@ -117,6 +119,8 @@ struct drm_virtgpu_3d_transfer_to_host {
> >       struct drm_virtgpu_3d_box box;
> >       __u32 level;
> >       __u32 offset;
> > +     __u32 stride;
> > +     __u32 layer_stride;
> >  };
>
> Same here.
>
> >  struct drm_virtgpu_3d_transfer_from_host {
> > @@ -124,6 +128,8 @@ struct drm_virtgpu_3d_transfer_from_host {
> >       struct drm_virtgpu_3d_box box;
> >       __u32 level;
> >       __u32 offset;
> > +     __u32 stride;
> > +     __u32 layer_stride;
> >  };


> And here.
>

Separated out the virtio and DRM api changes, as per your recommendation.
The virtio spec changes should match v6 of the proposed spec.  Explanations
for these specific DRM changes here are in patch 16 & patch 17 of the v3
implementation.


> take care,
>   Gerd
>
> PS: cherry-picked patches 1-3 into drm-misc-next.
>
>

[-- Attachment #1.2: Type: text/html, Size: 2069 bytes --]

[-- Attachment #2: Type: text/plain, Size: 160 bytes --]

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 39+ messages in thread

end of thread, other threads:[~2020-09-17  0:16 UTC | newest]

Thread overview: 39+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-09-02 21:08 [PATCH v2 00/23] Blob prerequisites + blob resources Gurchetan Singh
2020-09-02 21:08 ` [PATCH v2 01/23] Fix use after free in get_capset_info callback Gurchetan Singh
2020-09-02 21:08 ` [PATCH v2 02/23] drm/virtio: fix uninitialized variable Gurchetan Singh
2020-09-02 21:08 ` [PATCH v2 03/23] drm/virtio: report uuid in debugfs Gurchetan Singh
2020-09-02 21:08 ` [PATCH v2 04/23] virtio: Add get_shm_region method Gurchetan Singh
2020-09-02 22:15   ` Vivek Goyal
2020-09-03  0:00     ` Gurchetan Singh
2020-09-09  7:03       ` Gerd Hoffmann
2020-09-09  7:13         ` Miklos Szeredi
2020-09-09  9:26           ` Daniel Vetter
2020-09-09  9:28             ` Daniel Vetter
2020-09-10  0:28               ` Gurchetan Singh
2020-09-10  9:56                 ` Miklos Szeredi
2020-09-14 23:44                   ` Gurchetan Singh
2020-09-02 21:08 ` [PATCH v2 05/23] virtio: Implement get_shm_region for PCI transport Gurchetan Singh
2020-09-02 21:08 ` [PATCH v2 06/23] virtio: Implement get_shm_region for MMIO transport Gurchetan Singh
2020-09-02 21:08 ` [PATCH v2 07/23] drm/virtio: blob prep: refactor getting pages and attaching backing Gurchetan Singh
2020-09-02 21:08 ` [PATCH v2 08/23] drm/virtio: blob prep: make CPU responses more generic Gurchetan Singh
2020-09-02 21:08 ` [PATCH v2 09/23] virtio-gpu api: blob resources Gurchetan Singh
2020-09-09  6:55   ` Gerd Hoffmann
2020-09-17  0:16     ` Gurchetan Singh
2020-09-02 21:08 ` [PATCH v2 10/23] virtio-gpu api: host visible feature Gurchetan Singh
2020-09-09  7:05   ` Gerd Hoffmann
2020-09-09  7:09   ` Gerd Hoffmann
2020-09-02 21:08 ` [PATCH v2 11/23] virtio-gpu api: cross-device feature Gurchetan Singh
2020-09-02 21:08 ` [PATCH v2 12/23] drm/virtio: implement blob resources: probe for the feature Gurchetan Singh
2020-09-02 21:08 ` [PATCH v2 13/23] drm/virtio: implement blob resources: probe for host visible region Gurchetan Singh
2020-09-02 21:08 ` [PATCH v2 14/23] drm/virtio: implement blob resources: expose virtio_gpu_resource_id_get Gurchetan Singh
2020-09-02 21:08 ` [PATCH v2 15/23] drm/virtio: implement blob resources: add new fields to internal structs Gurchetan Singh
2020-09-02 21:08 ` [PATCH v2 16/23] drm/virtio: implement blob resources: implement vram object Gurchetan Singh
2020-09-02 21:08 ` [PATCH v2 17/23] drm/virtio: implement blob resources: hypercall interface Gurchetan Singh
2020-09-02 21:08 ` [PATCH v2 18/23] drm/virtio: implement blob resources: blob display integration Gurchetan Singh
2020-09-02 21:08 ` [PATCH v2 19/23] drm/virtio: implement blob resources: refactor UUID code somewhat Gurchetan Singh
2020-09-02 21:08 ` [PATCH v2 20/23] drm/virtio: implement blob resources: fix stride discrepancy Gurchetan Singh
2020-09-02 21:08 ` [PATCH v2 21/23] drm/virtio: implement blob resources: report blob mem to userspace Gurchetan Singh
2020-09-02 21:08 ` [PATCH v2 22/23] drm/virtio: implement blob resources: resource create blob ioctl Gurchetan Singh
2020-09-03 21:11   ` Chia-I Wu
2020-09-03 22:12     ` Gurchetan Singh
2020-09-02 21:08 ` [PATCH v2 23/23] drm/virtio: advertise features to userspace Gurchetan Singh

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).