pds_vdpa: new adminq entries
authorShannon Nelson <shannon.nelson@amd.com>
Fri, 19 May 2023 21:56:26 +0000 (14:56 -0700)
committerMichael S. Tsirkin <mst@redhat.com>
Tue, 27 Jun 2023 14:47:08 +0000 (10:47 -0400)
Add new adminq definitions in support for vDPA operations.

Signed-off-by: Shannon Nelson <shannon.nelson@amd.com>
Acked-by: Jason Wang <jasowang@redhat.com>
Message-Id: <20230519215632.12343-6-shannon.nelson@amd.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
include/linux/pds/pds_adminq.h

index 61b0a8634e1addad12d142f06e14860518fa4e12..bcba7fda3cc974fd47f764ce11aeea966285c46d 100644 (file)
@@ -605,6 +605,219 @@ struct pds_core_q_init_comp {
        u8     color;
 };
 
+/*
+ * enum pds_vdpa_cmd_opcode - vDPA Device commands
+ */
+enum pds_vdpa_cmd_opcode {
+       PDS_VDPA_CMD_INIT               = 48,
+       PDS_VDPA_CMD_IDENT              = 49,
+       PDS_VDPA_CMD_RESET              = 51,
+       PDS_VDPA_CMD_VQ_RESET           = 52,
+       PDS_VDPA_CMD_VQ_INIT            = 53,
+       PDS_VDPA_CMD_STATUS_UPDATE      = 54,
+       PDS_VDPA_CMD_SET_FEATURES       = 55,
+       PDS_VDPA_CMD_SET_ATTR           = 56,
+};
+
+/**
+ * struct pds_vdpa_cmd - generic command
+ * @opcode:    Opcode
+ * @vdpa_index:        Index for vdpa subdevice
+ * @vf_id:     VF id
+ */
+struct pds_vdpa_cmd {
+       u8     opcode;
+       u8     vdpa_index;
+       __le16 vf_id;
+};
+
+/**
+ * struct pds_vdpa_init_cmd - INIT command
+ * @opcode:    Opcode PDS_VDPA_CMD_INIT
+ * @vdpa_index: Index for vdpa subdevice
+ * @vf_id:     VF id
+ */
+struct pds_vdpa_init_cmd {
+       u8     opcode;
+       u8     vdpa_index;
+       __le16 vf_id;
+};
+
+/**
+ * struct pds_vdpa_ident - vDPA identification data
+ * @hw_features:       vDPA features supported by device
+ * @max_vqs:           max queues available (2 queues for a single queuepair)
+ * @max_qlen:          log(2) of maximum number of descriptors
+ * @min_qlen:          log(2) of minimum number of descriptors
+ *
+ * This struct is used in a DMA block that is set up for the PDS_VDPA_CMD_IDENT
+ * transaction.  Set up the DMA block and send the address in the IDENT cmd
+ * data, the DSC will write the ident information, then we can remove the DMA
+ * block after reading the answer.  If the completion status is 0, then there
+ * is valid information, else there was an error and the data should be invalid.
+ */
+struct pds_vdpa_ident {
+       __le64 hw_features;
+       __le16 max_vqs;
+       __le16 max_qlen;
+       __le16 min_qlen;
+};
+
+/**
+ * struct pds_vdpa_ident_cmd - IDENT command
+ * @opcode:    Opcode PDS_VDPA_CMD_IDENT
+ * @rsvd:       Word boundary padding
+ * @vf_id:     VF id
+ * @len:       length of ident info DMA space
+ * @ident_pa:  address for DMA of ident info (struct pds_vdpa_ident)
+ *                     only used for this transaction, then forgotten by DSC
+ */
+struct pds_vdpa_ident_cmd {
+       u8     opcode;
+       u8     rsvd;
+       __le16 vf_id;
+       __le32 len;
+       __le64 ident_pa;
+};
+
+/**
+ * struct pds_vdpa_status_cmd - STATUS_UPDATE command
+ * @opcode:    Opcode PDS_VDPA_CMD_STATUS_UPDATE
+ * @vdpa_index: Index for vdpa subdevice
+ * @vf_id:     VF id
+ * @status:    new status bits
+ */
+struct pds_vdpa_status_cmd {
+       u8     opcode;
+       u8     vdpa_index;
+       __le16 vf_id;
+       u8     status;
+};
+
+/**
+ * enum pds_vdpa_attr - List of VDPA device attributes
+ * @PDS_VDPA_ATTR_MAC:          MAC address
+ * @PDS_VDPA_ATTR_MAX_VQ_PAIRS: Max virtqueue pairs
+ */
+enum pds_vdpa_attr {
+       PDS_VDPA_ATTR_MAC          = 1,
+       PDS_VDPA_ATTR_MAX_VQ_PAIRS = 2,
+};
+
+/**
+ * struct pds_vdpa_setattr_cmd - SET_ATTR command
+ * @opcode:            Opcode PDS_VDPA_CMD_SET_ATTR
+ * @vdpa_index:                Index for vdpa subdevice
+ * @vf_id:             VF id
+ * @attr:              attribute to be changed (enum pds_vdpa_attr)
+ * @pad:               Word boundary padding
+ * @mac:               new mac address to be assigned as vdpa device address
+ * @max_vq_pairs:      new limit of virtqueue pairs
+ */
+struct pds_vdpa_setattr_cmd {
+       u8     opcode;
+       u8     vdpa_index;
+       __le16 vf_id;
+       u8     attr;
+       u8     pad[3];
+       union {
+               u8 mac[6];
+               __le16 max_vq_pairs;
+       } __packed;
+};
+
+/**
+ * struct pds_vdpa_vq_init_cmd - queue init command
+ * @opcode: Opcode PDS_VDPA_CMD_VQ_INIT
+ * @vdpa_index:        Index for vdpa subdevice
+ * @vf_id:     VF id
+ * @qid:       Queue id (bit0 clear = rx, bit0 set = tx, qid=N is ctrlq)
+ * @len:       log(2) of max descriptor count
+ * @desc_addr: DMA address of descriptor area
+ * @avail_addr:        DMA address of available descriptors (aka driver area)
+ * @used_addr: DMA address of used descriptors (aka device area)
+ * @intr_index:        interrupt index
+ * @avail_index:       initial device position in available ring
+ * @used_index:        initial device position in used ring
+ */
+struct pds_vdpa_vq_init_cmd {
+       u8     opcode;
+       u8     vdpa_index;
+       __le16 vf_id;
+       __le16 qid;
+       __le16 len;
+       __le64 desc_addr;
+       __le64 avail_addr;
+       __le64 used_addr;
+       __le16 intr_index;
+       __le16 avail_index;
+       __le16 used_index;
+};
+
+/**
+ * struct pds_vdpa_vq_init_comp - queue init completion
+ * @status:    Status of the command (enum pds_core_status_code)
+ * @hw_qtype:  HW queue type, used in doorbell selection
+ * @hw_qindex: HW queue index, used in doorbell selection
+ * @rsvd:      Word boundary padding
+ * @color:     Color bit
+ */
+struct pds_vdpa_vq_init_comp {
+       u8     status;
+       u8     hw_qtype;
+       __le16 hw_qindex;
+       u8     rsvd[11];
+       u8     color;
+};
+
+/**
+ * struct pds_vdpa_vq_reset_cmd - queue reset command
+ * @opcode:    Opcode PDS_VDPA_CMD_VQ_RESET
+ * @vdpa_index:        Index for vdpa subdevice
+ * @vf_id:     VF id
+ * @qid:       Queue id
+ */
+struct pds_vdpa_vq_reset_cmd {
+       u8     opcode;
+       u8     vdpa_index;
+       __le16 vf_id;
+       __le16 qid;
+};
+
+/**
+ * struct pds_vdpa_vq_reset_comp - queue reset completion
+ * @status:    Status of the command (enum pds_core_status_code)
+ * @rsvd0:     Word boundary padding
+ * @avail_index:       current device position in available ring
+ * @used_index:        current device position in used ring
+ * @rsvd:      Word boundary padding
+ * @color:     Color bit
+ */
+struct pds_vdpa_vq_reset_comp {
+       u8     status;
+       u8     rsvd0;
+       __le16 avail_index;
+       __le16 used_index;
+       u8     rsvd[9];
+       u8     color;
+};
+
+/**
+ * struct pds_vdpa_set_features_cmd - set hw features
+ * @opcode: Opcode PDS_VDPA_CMD_SET_FEATURES
+ * @vdpa_index:        Index for vdpa subdevice
+ * @vf_id:     VF id
+ * @rsvd:       Word boundary padding
+ * @features:  Feature bit mask
+ */
+struct pds_vdpa_set_features_cmd {
+       u8     opcode;
+       u8     vdpa_index;
+       __le16 vf_id;
+       __le32 rsvd;
+       __le64 features;
+};
+
 union pds_core_adminq_cmd {
        u8     opcode;
        u8     bytes[64];
@@ -621,6 +834,16 @@ union pds_core_adminq_cmd {
 
        struct pds_core_q_identify_cmd    q_ident;
        struct pds_core_q_init_cmd        q_init;
+
+       struct pds_vdpa_cmd               vdpa;
+       struct pds_vdpa_init_cmd          vdpa_init;
+       struct pds_vdpa_ident_cmd         vdpa_ident;
+       struct pds_vdpa_status_cmd        vdpa_status;
+       struct pds_vdpa_setattr_cmd       vdpa_setattr;
+       struct pds_vdpa_set_features_cmd  vdpa_set_features;
+       struct pds_vdpa_vq_init_cmd       vdpa_vq_init;
+       struct pds_vdpa_vq_reset_cmd      vdpa_vq_reset;
+
 };
 
 union pds_core_adminq_comp {
@@ -642,6 +865,9 @@ union pds_core_adminq_comp {
 
        struct pds_core_q_identify_comp   q_ident;
        struct pds_core_q_init_comp       q_init;
+
+       struct pds_vdpa_vq_init_comp      vdpa_vq_init;
+       struct pds_vdpa_vq_reset_comp     vdpa_vq_reset;
 };
 
 #ifndef __CHECKER__