On Thu, May 4, 2023 at 2:13 AM Shannon Nelson <shannon.nelson@xxxxxxx> wrote: > > Add new adminq definitions in support for vDPA operations. > > Signed-off-by: Shannon Nelson <shannon.nelson@xxxxxxx> Acked-by: Jason Wang <jasowang@xxxxxxxxxx> Thanks > --- > include/linux/pds/pds_adminq.h | 266 +++++++++++++++++++++++++++++++++ > 1 file changed, 266 insertions(+) > > diff --git a/include/linux/pds/pds_adminq.h b/include/linux/pds/pds_adminq.h > index 61b0a8634e1a..c66ead725434 100644 > --- a/include/linux/pds/pds_adminq.h > +++ b/include/linux/pds/pds_adminq.h > @@ -605,6 +605,257 @@ 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, > + PDS_VDPA_CMD_VQ_SET_STATE = 57, > + PDS_VDPA_CMD_VQ_GET_STATE = 58, > +}; > + > +/** > + * 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 > + */ > +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; > +}; > + > +/** > + * 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_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; > +}; > + > +/** > + * struct pds_vdpa_vq_set_state_cmd - set vq state > + * @opcode: Opcode PDS_VDPA_CMD_VQ_SET_STATE > + * @vdpa_index: Index for vdpa subdevice > + * @vf_id: VF id > + * @qid: Queue id > + * @avail: Device avail index. > + * @used: Device used index. > + * > + * If the virtqueue uses packed descriptor format, then the avail and used > + * index must have a wrap count. The bits should be arranged like the upper > + * 16 bits in the device available notification data: 15 bit index, 1 bit wrap. > + */ > +struct pds_vdpa_vq_set_state_cmd { > + u8 opcode; > + u8 vdpa_index; > + __le16 vf_id; > + __le16 qid; > + __le16 avail; > + __le16 used; > +}; > + > +/** > + * struct pds_vdpa_vq_get_state_cmd - get vq state > + * @opcode: Opcode PDS_VDPA_CMD_VQ_GET_STATE > + * @vdpa_index: Index for vdpa subdevice > + * @vf_id: VF id > + * @qid: Queue id > + */ > +struct pds_vdpa_vq_get_state_cmd { > + u8 opcode; > + u8 vdpa_index; > + __le16 vf_id; > + __le16 qid; > +}; > + > +/** > + * struct pds_vdpa_vq_get_state_comp - get vq state completion > + * @status: Status of the command (enum pds_core_status_code) > + * @rsvd0: Word boundary padding > + * @avail: Device avail index. > + * @used: Device used index. > + * @rsvd: Word boundary padding > + * @color: Color bit > + * > + * If the virtqueue uses packed descriptor format, then the avail and used > + * index will have a wrap count. The bits will be arranged like the "next" > + * part of device available notification data: 15 bit index, 1 bit wrap. > + */ > +struct pds_vdpa_vq_get_state_comp { > + u8 status; > + u8 rsvd0; > + __le16 avail; > + __le16 used; > + u8 rsvd[9]; > + u8 color; > +}; > + > union pds_core_adminq_cmd { > u8 opcode; > u8 bytes[64]; > @@ -621,6 +872,18 @@ 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; > + struct pds_vdpa_vq_set_state_cmd vdpa_vq_set_state; > + struct pds_vdpa_vq_get_state_cmd vdpa_vq_get_state; > + > }; > > union pds_core_adminq_comp { > @@ -642,6 +905,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_get_state_comp vdpa_vq_get_state; > }; > > #ifndef __CHECKER__ > -- > 2.17.1 > _______________________________________________ Virtualization mailing list Virtualization@xxxxxxxxxxxxxxxxxxxxxxxxxx https://lists.linuxfoundation.org/mailman/listinfo/virtualization