summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLingfeng Yang <lfy@google.com>2020-04-16 09:54:50 -0700
committerAlistair Delva <adelva@google.com>2020-04-22 13:34:25 -0700
commita54055e2f6f3197497eab163ec592f78698659af (patch)
tree91ab3ff69b5f605d4d322753d4352e390eb8257d
parent72d2272da9e19681961035653154622453105005 (diff)
downloadcuttlefish-modules-a54055e2f6f3197497eab163ec592f78698659af.tar.gz
CHROMIUM: virtio-gpu api: VIRTIO_GPU_F_MEMORY
Introduce the concept of memory types and memory regions to virtio-gpu. Initially only memory regions composed of guest pages are supported (VIRTIO_GPU_MEMORY_TRANSFER, pretty much like current backing storage for resources). I expect support for other memory types will be added later on. VIRTIO_GPU_CMD_MEMORY_CREATE: creates a new memory region. VIRTIO_GPU_CMD_MEMORY_UNREF: destroys a memory region. VIRTIO_GPU_CMD_RESOURCE_CREATE_V2 : new command to create resources. It will (a) allow to specify the memory type, (b) adds support planar resources and (c) returns alignment, stride and size of the resource planes. The later will be needed in case we support mapping host resources into the guest some day. VIRTIO_GPU_CMD_RESOURCE_ATTACH_MEMORY: Use memory region as backing storage for the given resource. The existing VIRTIO_GPU_CMD_RESOURCE_DETACH_BACKING command can be used to detach. Motivation: This separates storage management from resource management. It allows memory pooling (vulkan support will most likely need this). It makes things a bit more flexible in general, for example we can represent gem objects as memory regions even if we don't know the format yet (happens on dma-buf import for example). Signed-off-by: Gerd Hoffmann <kraxel@redhat.com> (cherry picked from commit 8eefa19d3e2ace7047c0082bf601c6f4f36f37fd) Signed-off-by: Gurchetan Singh <gurchetansingh@chromium.org> BUG=chromium:924405 TEST=compile Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/third_party/kernel/+/1591998 Reviewed-by: Robert Tarasov <tutankhamen@chromium.org> Commit-Queue: Gurchetan Singh <gurchetansingh@chromium.org> Tested-by: Gurchetan Singh <gurchetansingh@chromium.org> [rebase54(groeck): Context conflicts Note that this patch does not match the patch with the same subject on the kernel mailing list (https://patchwork.kernel.org/patch/10893777/). No idea if that means that this version is more recent or older or inofficial, or that it was modified locally. ] Signed-off-by: Guenter Roeck <groeck@chromium.org> Bug: 153580313 Signed-off-by: Lingfeng Yang <lfy@google.com> Change-Id: I258a3a735678ddefd75b968d3f6874f394ac3e46
-rw-r--r--uapi/linux/virtio_gpu.h82
1 files changed, 82 insertions, 0 deletions
diff --git a/uapi/linux/virtio_gpu.h b/uapi/linux/virtio_gpu.h
index 570a234..e0801c8 100644
--- a/uapi/linux/virtio_gpu.h
+++ b/uapi/linux/virtio_gpu.h
@@ -51,6 +51,13 @@
*/
#define VIRTIO_GPU_F_EDID 1
+/*
+ * VIRTIO_GPU_CMD_MEMORY_CREATE
+ * VIRTIO_GPU_CMD_MEMORY_UNREF
+ * VIRTIO_GPU_CMD_RESOURCE_CREATE_V2
+ * VIRTIO_GPU_CMD_RESOURCE_ATTACH_MEMORY
+ */
+#define VIRTIO_GPU_F_MEMORY 2
enum virtio_gpu_ctrl_type {
VIRTIO_GPU_UNDEFINED = 0,
@@ -66,6 +73,10 @@ enum virtio_gpu_ctrl_type {
VIRTIO_GPU_CMD_GET_CAPSET_INFO,
VIRTIO_GPU_CMD_GET_CAPSET,
VIRTIO_GPU_CMD_GET_EDID,
+ VIRTIO_GPU_CMD_MEMORY_CREATE,
+ VIRTIO_GPU_CMD_MEMORY_UNREF,
+ VIRTIO_GPU_CMD_RESOURCE_ATTACH_MEMORY,
+ VIRTIO_GPU_CMD_RESOURCE_CREATE_V2,
/* 3d commands */
VIRTIO_GPU_CMD_CTX_CREATE = 0x0200,
@@ -88,6 +99,7 @@ enum virtio_gpu_ctrl_type {
VIRTIO_GPU_RESP_OK_CAPSET,
VIRTIO_GPU_RESP_OK_EDID,
VIRTIO_GPU_RESP_OK_RESOURCE_PLANE_INFO,
+ VIRTIO_GPU_RESP_OK_RESOURCE_INFO,
/* error responses */
VIRTIO_GPU_RESP_ERR_UNSPEC = 0x1200,
@@ -96,6 +108,22 @@ enum virtio_gpu_ctrl_type {
VIRTIO_GPU_RESP_ERR_INVALID_RESOURCE_ID,
VIRTIO_GPU_RESP_ERR_INVALID_CONTEXT_ID,
VIRTIO_GPU_RESP_ERR_INVALID_PARAMETER,
+ VIRTIO_GPU_RESP_ERR_INVALID_MEMORY_ID,
+};
+
+enum virtio_gpu_memory_type {
+ VIRTIO_GPU_MEMORY_UNDEFINED = 0,
+
+ /*
+ * Traditional virtio-gpu memory.
+ * Has both host and guest side storage.
+ *
+ * VIRTIO_GPU_CMD_TRANSFER_* commands are used
+ * to copy between guest and host storage.
+ *
+ * Created using VIRTIO_GPU_CMD_MEMORY_CREATE.
+ */
+ VIRTIO_GPU_MEMORY_TRANSFER,
};
#define VIRTIO_GPU_FLAG_FENCE (1 << 0)
@@ -147,6 +175,7 @@ struct virtio_gpu_resource_unref {
struct virtio_gpu_resource_create_2d {
struct virtio_gpu_ctrl_hdr hdr;
__le32 resource_id;
+ /* memory_type is VIRTIO_GPU_MEMORY_TRANSFER */
__le32 format;
__le32 width;
__le32 height;
@@ -188,6 +217,7 @@ struct virtio_gpu_resource_attach_backing {
struct virtio_gpu_ctrl_hdr hdr;
__le32 resource_id;
__le32 nr_entries;
+ /* struct virtio_gpu_mem_entry entries follow here */
};
/* VIRTIO_GPU_CMD_RESOURCE_DETACH_BACKING */
@@ -231,6 +261,7 @@ struct virtio_gpu_transfer_host_3d {
struct virtio_gpu_resource_create_3d {
struct virtio_gpu_ctrl_hdr hdr;
__le32 resource_id;
+ /* memory_type is VIRTIO_GPU_MEMORY_TRANSFER */
__le32 target;
__le32 format;
__le32 bind;
@@ -271,6 +302,57 @@ struct virtio_gpu_cmd_submit {
__le32 padding;
};
+/* VIRTIO_GPU_CMD_MEMORY_CREATE */
+struct virtio_gpu_cmd_memory_create {
+ struct virtio_gpu_ctrl_hdr hdr;
+ __le32 memory_id;
+ __le32 memory_type;
+ __le32 flags;
+ __le32 nr_entries;
+ /* struct virtio_gpu_mem_entry entries follow here */
+};
+
+/* VIRTIO_GPU_CMD_MEMORY_UNREF */
+struct virtio_gpu_cmd_memory_unref {
+ struct virtio_gpu_ctrl_hdr hdr;
+ __le32 memory_id;
+ __le32 padding;
+};
+
+/* VIRTIO_GPU_CMD_RESOURCE_ATTACH_MEMORY */
+struct virtio_gpu_cmd_resource_attach_memory {
+ struct virtio_gpu_ctrl_hdr hdr;
+ __le32 resource_id;
+ __le32 memory_id;
+ __le64 offset[4];
+};
+
+/* VIRTIO_GPU_CMD_RESOURCE_CREATE_V2 */
+struct virtio_gpu_cmd_resource_create_v2 {
+ struct virtio_gpu_ctrl_hdr hdr;
+ __le32 resource_id;
+ __le32 memory_type;
+ __le32 format;
+ __le32 width;
+ __le32 height;
+ /* 3d only */
+ __le32 target;
+ __le32 bind;
+ __le32 depth;
+ __le32 array_size;
+ __le32 last_level;
+ __le32 nr_samples;
+ __le32 flags;
+};
+
+/* VIRTIO_GPU_RESP_OK_RESOURCE_INFO */
+struct virtio_gpu_resp_resource_info {
+ struct virtio_gpu_ctrl_hdr hdr;
+ __le32 align[4];
+ __le32 stride[4];
+ __le32 size[4];
+};
+
#define VIRTIO_GPU_CAPSET_VIRGL 1
#define VIRTIO_GPU_CAPSET_VIRGL2 2