[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <CACGkMEvOB6+Db+KmftFihOTuU11zL0zLcrPbsq=LOgK18qm90g@mail.gmail.com>
Date: Mon, 15 May 2023 11:50:25 +0800
From: Jason Wang <jasowang@...hat.com>
To: Shannon Nelson <shannon.nelson@....com>
Cc: mst@...hat.com, virtualization@...ts.linux-foundation.org,
brett.creeley@....com, netdev@...r.kernel.org, simon.horman@...igine.com,
drivers@...sando.io
Subject: Re: [PATCH v5 virtio 05/11] pds_vdpa: new adminq entries
On Thu, May 4, 2023 at 2:13 AM Shannon Nelson <shannon.nelson@....com> wrote:
>
> Add new adminq definitions in support for vDPA operations.
>
> Signed-off-by: Shannon Nelson <shannon.nelson@....com>
Acked-by: Jason Wang <jasowang@...hat.com>
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
>
Powered by blists - more mailing lists