Introduce device parts access commands via the admin queue.

These commands and their structure adhere to the Virtio 1.4
specification.

Signed-off-by: Yishai Hadas <yish...@nvidia.com>
---
 include/uapi/linux/virtio_pci.h | 131 ++++++++++++++++++++++++++++++++
 1 file changed, 131 insertions(+)

diff --git a/include/uapi/linux/virtio_pci.h b/include/uapi/linux/virtio_pci.h
index a8208492e822..1beb317df1b9 100644
--- a/include/uapi/linux/virtio_pci.h
+++ b/include/uapi/linux/virtio_pci.h
@@ -40,6 +40,7 @@
 #define _LINUX_VIRTIO_PCI_H
 
 #include <linux/types.h>
+#include <linux/kernel.h>
 
 #ifndef VIRTIO_PCI_NO_LEGACY
 
@@ -240,6 +241,17 @@ struct virtio_pci_cfg_cap {
 #define VIRTIO_ADMIN_CMD_LEGACY_DEV_CFG_READ           0x5
 #define VIRTIO_ADMIN_CMD_LEGACY_NOTIFY_INFO            0x6
 
+/* Device parts access commands. */
+#define VIRTIO_ADMIN_CMD_CAP_ID_LIST_QUERY             0x7
+#define VIRTIO_ADMIN_CMD_DEVICE_CAP_GET                        0x8
+#define VIRTIO_ADMIN_CMD_DRIVER_CAP_SET                        0x9
+#define VIRTIO_ADMIN_CMD_RESOURCE_OBJ_CREATE           0xa
+#define VIRTIO_ADMIN_CMD_RESOURCE_OBJ_DESTROY          0xd
+#define VIRTIO_ADMIN_CMD_DEV_PARTS_METADATA_GET                0xe
+#define VIRTIO_ADMIN_CMD_DEV_PARTS_GET                 0xf
+#define VIRTIO_ADMIN_CMD_DEV_PARTS_SET                 0x10
+#define VIRTIO_ADMIN_CMD_DEV_MODE_SET                  0x11
+
 struct virtio_admin_cmd_hdr {
        __le16 opcode;
        /*
@@ -286,4 +298,123 @@ struct virtio_admin_cmd_notify_info_result {
        struct virtio_admin_cmd_notify_info_data 
entries[VIRTIO_ADMIN_CMD_MAX_NOTIFY_INFO];
 };
 
+#define VIRTIO_DEV_PARTS_CAP 0x0000
+
+struct virtio_dev_parts_cap {
+       __u8 get_parts_resource_objects_limit;
+       __u8 set_parts_resource_objects_limit;
+};
+
+#define MAX_CAP_ID __KERNEL_DIV_ROUND_UP(VIRTIO_DEV_PARTS_CAP + 1, 64)
+
+struct virtio_admin_cmd_query_cap_id_result {
+       __le64 supported_caps[MAX_CAP_ID];
+};
+
+struct virtio_admin_cmd_cap_get_data {
+       __le16 id;
+       __u8 reserved[6];
+};
+
+struct virtio_admin_cmd_cap_set_data {
+       __le16 id;
+       __u8 reserved[6];
+       __u8 cap_specific_data[];
+};
+
+struct virtio_admin_cmd_resource_obj_cmd_hdr {
+       __le16 type;
+       __u8 reserved[2];
+       __le32 id; /* Indicates unique resource object id per resource object 
type */
+};
+
+struct virtio_admin_cmd_resource_obj_create_data {
+       struct virtio_admin_cmd_resource_obj_cmd_hdr hdr;
+       __le64 flags;
+       __u8 resource_obj_specific_data[];
+};
+
+#define VIRTIO_RESOURCE_OBJ_DEV_PARTS 0
+
+#define VIRTIO_RESOURCE_OBJ_DEV_PARTS_TYPE_GET 0
+#define VIRTIO_RESOURCE_OBJ_DEV_PARTS_TYPE_SET 1
+
+struct virtio_resource_obj_dev_parts {
+       __u8 type;
+       __u8 reserved[7];
+};
+
+#define VIRTIO_ADMIN_CMD_DEV_PARTS_METADATA_TYPE_SIZE 0
+#define VIRTIO_ADMIN_CMD_DEV_PARTS_METADATA_TYPE_COUNT 1
+#define VIRTIO_ADMIN_CMD_DEV_PARTS_METADATA_TYPE_LIST 2
+
+struct virtio_admin_cmd_dev_parts_metadata_data {
+       struct virtio_admin_cmd_resource_obj_cmd_hdr hdr;
+       __u8 type;
+       __u8 reserved[7];
+};
+
+#define VIRTIO_DEV_PART_F_OPTIONAL 0
+
+struct virtio_dev_part_hdr {
+       __le16 part_type;
+       __u8 flags;
+       __u8 reserved;
+       union {
+               struct {
+                       __le32 offset;
+                       __le32 reserved;
+               } pci_common_cfg;
+               struct {
+                       __le16 index;
+                       __u8 reserved[6];
+               } vq_index;
+       } selector;
+       __le32 length;
+};
+
+struct virtio_dev_part {
+       struct virtio_dev_part_hdr hdr;
+       __u8 value[];
+};
+
+struct virtio_admin_cmd_dev_parts_metadata_result {
+       union {
+               struct {
+                       __le32 size;
+                       __le32 reserved;
+               } parts_size;
+               struct {
+                       __le32 count;
+                       __le32 reserved;
+               } hdr_list_count;
+               struct {
+                       __le32 count;
+                       __le32 reserved;
+                       struct virtio_dev_part_hdr hdrs[];
+               } hdr_list;
+       };
+};
+
+#define VIRTIO_ADMIN_CMD_DEV_PARTS_GET_TYPE_SELECTED 0
+#define VIRTIO_ADMIN_CMD_DEV_PARTS_GET_TYPE_ALL 1
+
+struct virtio_admin_cmd_dev_parts_get_data {
+       struct virtio_admin_cmd_resource_obj_cmd_hdr hdr;
+       __u8 type;
+       __u8 reserved[7];
+       struct virtio_dev_part_hdr hdr_list[];
+};
+
+struct virtio_admin_cmd_dev_parts_set_data {
+       struct virtio_admin_cmd_resource_obj_cmd_hdr hdr;
+       struct virtio_dev_part parts[];
+};
+
+#define VIRTIO_ADMIN_CMD_DEV_MODE_F_STOPPED 0
+
+struct virtio_admin_cmd_dev_mode_set_data {
+       __u8 flags;
+};
+
 #endif
-- 
2.27.0


Reply via email to