/* * enum pds_core_adminq_opcode - AdminQ command opcodes * These commands are only processed on AdminQ, not available in devcmd
*/ enum pds_core_adminq_opcode {
PDS_AQ_CMD_NOP = 0,
/** * struct pds_core_notifyq_event - Generic event reporting structure * @eid: event number * @ecode: event code * * This is the generic event report struct from which the other * actual events will be formed.
*/ struct pds_core_notifyq_event {
__le64 eid;
__le16 ecode;
};
/** * struct pds_core_link_change_event - Link change event notification * @eid: event number * @ecode: event code = PDS_EVENT_LINK_CHANGE * @link_status: link up/down, with error bits * @link_speed: speed of the network link * * Sent when the network link state changes between UP and DOWN
*/ struct pds_core_link_change_event {
__le64 eid;
__le16 ecode;
__le16 link_status;
__le32 link_speed; /* units of 1Mbps: e.g. 10000 = 10Gbps */
};
/** * struct pds_core_reset_event - Reset event notification * @eid: event number * @ecode: event code = PDS_EVENT_RESET * @reset_code: reset type * @state: 0=pending, 1=complete, 2=error * * Sent when the NIC or some subsystem is going to be or * has been reset.
*/ struct pds_core_reset_event {
__le64 eid;
__le16 ecode;
u8 reset_code;
u8 state;
};
/** * struct pds_core_client_event - Client event notification * @eid: event number * @ecode: event code = PDS_EVENT_CLIENT * @client_id: client to sent event to * @client_event: wrapped event struct for the client * * Sent when an event needs to be passed on to a client
*/ struct pds_core_client_event {
__le64 eid;
__le16 ecode;
__le16 client_id;
u8 client_event[54];
};
/** * struct pds_core_notifyq_cmd - Placeholder for building qcq * @data: anonymous field for building the qcq
*/ struct pds_core_notifyq_cmd {
__le32 data; /* Not used but needed for qcq structure */
};
#define PDS_DEVNAME_LEN 32 /** * struct pds_core_client_reg_cmd - Register a new client with DSC * @opcode: opcode PDS_AQ_CMD_CLIENT_REG * @rsvd: word boundary padding * @devname: text name of client device * @vif_type: what type of device (enum pds_core_vif_types) * * Tell the DSC of the new client, and receive a client_id from DSC.
*/ struct pds_core_client_reg_cmd {
u8 opcode;
u8 rsvd[3]; char devname[PDS_DEVNAME_LEN];
u8 vif_type;
};
/** * struct pds_core_client_reg_comp - Client registration completion * @status: Status of the command (enum pdc_core_status_code) * @rsvd: Word boundary padding * @comp_index: Index in the descriptor ring for which this is the completion * @client_id: New id assigned by DSC * @rsvd1: Word boundary padding * @color: Color bit
*/ struct pds_core_client_reg_comp {
u8 status;
u8 rsvd;
__le16 comp_index;
__le16 client_id;
u8 rsvd1[9];
u8 color;
};
/** * struct pds_core_client_unreg_cmd - Unregister a client from DSC * @opcode: opcode PDS_AQ_CMD_CLIENT_UNREG * @rsvd: word boundary padding * @client_id: id of client being removed * * Tell the DSC this client is going away and remove its context * This uses the generic completion.
*/ struct pds_core_client_unreg_cmd {
u8 opcode;
u8 rsvd;
__le16 client_id;
};
/** * struct pds_core_client_request_cmd - Pass along a wrapped client AdminQ cmd * @opcode: opcode PDS_AQ_CMD_CLIENT_CMD * @rsvd: word boundary padding * @client_id: id of client being removed * @client_cmd: the wrapped client command * * Proxy post an adminq command for the client. * This uses the generic completion.
*/ struct pds_core_client_request_cmd {
u8 opcode;
u8 rsvd;
__le16 client_id;
u8 client_cmd[60];
};
PDS_CORE_QTYPE_MAX = 16 /* don't change - used in struct size */
};
/** * union pds_core_lif_config - LIF configuration * @state: LIF state (enum pds_core_lif_state) * @rsvd: Word boundary padding * @name: LIF name * @rsvd2: Word boundary padding * @features: LIF features active (enum pds_core_hw_features) * @queue_count: Queue counts per queue-type * @words: Full union buffer size
*/ union pds_core_lif_config { struct {
u8 state;
u8 rsvd[3]; char name[PDS_CORE_IFNAMSIZ];
u8 rsvd2[12];
__le64 features;
__le32 queue_count[PDS_CORE_QTYPE_MAX];
} __packed;
__le32 words[64];
};
/** * struct pds_core_lif_status - LIF status register * @eid: most recent NotifyQ event id * @rsvd: full struct size
*/ struct pds_core_lif_status {
__le64 eid;
u8 rsvd[56];
};
/** * struct pds_core_lif_info - LIF info structure * @config: LIF configuration structure * @status: LIF status structure
*/ struct pds_core_lif_info { union pds_core_lif_config config; struct pds_core_lif_status status;
};
/** * struct pds_core_lif_identity - LIF identity information (type-specific) * @features: LIF features (see enum pds_core_hw_features) * @version: Identify structure version * @hw_index: LIF hardware index * @rsvd: Word boundary padding * @max_nb_sessions: Maximum number of sessions supported * @rsvd2: buffer padding * @config: LIF config struct with features, q counts
*/ struct pds_core_lif_identity {
__le64 features;
u8 version;
u8 hw_index;
u8 rsvd[2];
__le32 max_nb_sessions;
u8 rsvd2[120]; union pds_core_lif_config config;
};
/** * struct pds_core_lif_identify_cmd - Get LIF identity info command * @opcode: Opcode PDS_AQ_CMD_LIF_IDENTIFY * @type: LIF type (enum pds_core_lif_type) * @client_id: Client identifier * @ver: Version of identify returned by device * @rsvd: Word boundary padding * @ident_pa: DMA address to receive identity info * * Firmware will copy LIF identity data (struct pds_core_lif_identity) * into the buffer address given.
*/ struct pds_core_lif_identify_cmd {
u8 opcode;
u8 type;
__le16 client_id;
u8 ver;
u8 rsvd[3];
__le64 ident_pa;
};
/** * struct pds_core_lif_identify_comp - LIF identify command completion * @status: Status of the command (enum pds_core_status_code) * @ver: Version of identify returned by device * @bytes: Bytes copied into the buffer * @rsvd: Word boundary padding * @color: Color bit
*/ struct pds_core_lif_identify_comp {
u8 status;
u8 ver;
__le16 bytes;
u8 rsvd[11];
u8 color;
};
/** * struct pds_core_lif_init_comp - LIF init command completion * @status: Status of the command (enum pds_core_status_code) * @rsvd: Word boundary padding * @hw_index: Hardware index of the initialized LIF * @rsvd1: Word boundary padding * @color: Color bit
*/ struct pds_core_lif_init_comp {
u8 status;
u8 rsvd;
__le16 hw_index;
u8 rsvd1[11];
u8 color;
};
/** * struct pds_core_lif_reset_cmd - LIF reset command * Will reset only the specified LIF. * @opcode: Opcode PDS_AQ_CMD_LIF_RESET * @rsvd: Word boundary padding * @client_id: Client identifier
*/ struct pds_core_lif_reset_cmd {
u8 opcode;
u8 rsvd;
__le16 client_id;
};
/** * enum pds_core_lif_attr - List of LIF attributes * @PDS_CORE_LIF_ATTR_STATE: LIF state attribute * @PDS_CORE_LIF_ATTR_NAME: LIF name attribute * @PDS_CORE_LIF_ATTR_FEATURES: LIF features attribute * @PDS_CORE_LIF_ATTR_STATS_CTRL: LIF statistics control attribute
*/ enum pds_core_lif_attr {
PDS_CORE_LIF_ATTR_STATE = 0,
PDS_CORE_LIF_ATTR_NAME = 1,
PDS_CORE_LIF_ATTR_FEATURES = 4,
PDS_CORE_LIF_ATTR_STATS_CTRL = 6,
};
/** * struct pds_core_lif_setattr_cmd - Set LIF attributes on the NIC * @opcode: Opcode PDS_AQ_CMD_LIF_SETATTR * @attr: Attribute type (enum pds_core_lif_attr) * @client_id: Client identifier * @state: LIF state (enum pds_core_lif_state) * @name: The name string, 0 terminated * @features: Features (enum pds_core_hw_features) * @stats_ctl: Stats control commands (enum pds_core_stats_ctl_cmd) * @rsvd: Command Buffer padding
*/ struct pds_core_lif_setattr_cmd {
u8 opcode;
u8 attr;
__le16 client_id; union {
u8 state; char name[PDS_CORE_IFNAMSIZ];
__le64 features;
u8 stats_ctl;
u8 rsvd[60];
} __packed;
};
/** * struct pds_core_lif_setattr_comp - LIF set attr command completion * @status: Status of the command (enum pds_core_status_code) * @rsvd: Word boundary padding * @comp_index: Index in the descriptor ring for which this is the completion * @features: Features (enum pds_core_hw_features) * @rsvd2: Word boundary padding * @color: Color bit
*/ struct pds_core_lif_setattr_comp {
u8 status;
u8 rsvd;
__le16 comp_index; union {
__le64 features;
u8 rsvd2[11];
} __packed;
u8 color;
};
/** * struct pds_core_lif_getattr_cmd - Get LIF attributes from the NIC * @opcode: Opcode PDS_AQ_CMD_LIF_GETATTR * @attr: Attribute type (enum pds_core_lif_attr) * @client_id: Client identifier
*/ struct pds_core_lif_getattr_cmd {
u8 opcode;
u8 attr;
__le16 client_id;
};
/** * struct pds_core_lif_getattr_comp - LIF get attr command completion * @status: Status of the command (enum pds_core_status_code) * @rsvd: Word boundary padding * @comp_index: Index in the descriptor ring for which this is the completion * @state: LIF state (enum pds_core_lif_state) * @features: Features (enum pds_core_hw_features) * @rsvd2: Word boundary padding * @color: Color bit
*/ struct pds_core_lif_getattr_comp {
u8 status;
u8 rsvd;
__le16 comp_index; union {
u8 state;
__le64 features;
u8 rsvd2[11];
} __packed;
u8 color;
};
/** * union pds_core_q_identity - Queue identity information * @version: Queue type version that can be used with FW * @supported: Bitfield of queue versions, first bit = ver 0 * @rsvd: Word boundary padding * @features: Queue features * @desc_sz: Descriptor size * @comp_sz: Completion descriptor size * @rsvd2: Word boundary padding
*/ struct pds_core_q_identity {
u8 version;
u8 supported;
u8 rsvd[6]; #define PDS_CORE_QIDENT_F_CQ 0x01 /* queue has completion ring */
__le64 features;
__le16 desc_sz;
__le16 comp_sz;
u8 rsvd2[6];
};
/** * struct pds_core_q_identify_cmd - queue identify command * @opcode: Opcode PDS_AQ_CMD_Q_IDENTIFY * @type: Logical queue type (enum pds_core_logical_qtype) * @client_id: Client identifier * @ver: Highest queue type version that the driver supports * @rsvd: Word boundary padding * @ident_pa: DMA address to receive the data (struct pds_core_q_identity)
*/ struct pds_core_q_identify_cmd {
u8 opcode;
u8 type;
__le16 client_id;
u8 ver;
u8 rsvd[3];
__le64 ident_pa;
};
/** * struct pds_core_q_identify_comp - queue identify command completion * @status: Status of the command (enum pds_core_status_code) * @rsvd: Word boundary padding * @comp_index: Index in the descriptor ring for which this is the completion * @ver: Queue type version that can be used with FW * @rsvd1: Word boundary padding * @color: Color bit
*/ struct pds_core_q_identify_comp {
u8 status;
u8 rsvd;
__le16 comp_index;
u8 ver;
u8 rsvd1[10];
u8 color;
};
/** * struct pds_core_q_init_cmd - Queue init command * @opcode: Opcode PDS_AQ_CMD_Q_INIT * @type: Logical queue type * @client_id: Client identifier * @ver: Queue type version * @rsvd: Word boundary padding * @index: (LIF, qtype) relative admin queue index * @intr_index: Interrupt control register index, or Event queue index * @pid: Process ID * @flags: * IRQ: Interrupt requested on completion * ENA: Enable the queue. If ENA=0 the queue is initialized * but remains disabled, to be later enabled with the * Queue Enable command. If ENA=1, then queue is * initialized and then enabled. * @cos: Class of service for this queue * @ring_size: Queue ring size, encoded as a log2(size), in * number of descriptors. The actual ring size is * (1 << ring_size). For example, to select a ring size * of 64 descriptors write ring_size = 6. The minimum * ring_size value is 2 for a ring of 4 descriptors. * The maximum ring_size value is 12 for a ring of 4k * descriptors. Values of ring_size <2 and >12 are * reserved. * @ring_base: Queue ring base address * @cq_ring_base: Completion queue ring base address
*/ struct pds_core_q_init_cmd {
u8 opcode;
u8 type;
__le16 client_id;
u8 ver;
u8 rsvd[3];
__le32 index;
__le16 pid;
__le16 intr_index;
__le16 flags; #define PDS_CORE_QINIT_F_IRQ 0x01 /* Request interrupt on completion */ #define PDS_CORE_QINIT_F_ENA 0x02 /* Enable the queue */
u8 cos; #define PDS_CORE_QSIZE_MIN_LG2 2 #define PDS_CORE_QSIZE_MAX_LG2 12
u8 ring_size;
__le64 ring_base;
__le64 cq_ring_base;
} __packed;
/** * struct pds_core_q_init_comp - Queue init command completion * @status: Status of the command (enum pds_core_status_code) * @rsvd: Word boundary padding * @comp_index: Index in the descriptor ring for which this is the completion * @hw_index: Hardware Queue ID * @hw_type: Hardware Queue type * @rsvd2: Word boundary padding * @color: Color
*/ struct pds_core_q_init_comp {
u8 status;
u8 rsvd;
__le16 comp_index;
__le32 hw_index;
u8 hw_type;
u8 rsvd2[6];
u8 color;
};
/** * 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;
};
/** * struct pds_lm_state_size_comp - STATE_SIZE command completion * @status: Status of the command (enum pds_core_status_code) * @rsvd: Word boundary padding * @comp_index: Index in the desc ring for which this is the completion * @size: Size of the device state * @rsvd2: Word boundary padding * @color: Color bit
*/ struct pds_lm_state_size_comp {
u8 status;
u8 rsvd;
__le16 comp_index; union {
__le64 size;
u8 rsvd2[11];
} __packed;
u8 color;
};
/** * struct pds_lm_suspend_cmd - SUSPEND command * @opcode: Opcode PDS_LM_CMD_SUSPEND * @rsvd: Word boundary padding * @vf_id: VF id * @type: Type of suspend (enum pds_lm_suspend_resume_type)
*/ struct pds_lm_suspend_cmd {
u8 opcode;
u8 rsvd;
__le16 vf_id;
u8 type;
};
/** * struct pds_lm_suspend_status_cmd - SUSPEND status command * @opcode: Opcode PDS_AQ_CMD_LM_SUSPEND_STATUS * @rsvd: Word boundary padding * @vf_id: VF id * @type: Type of suspend (enum pds_lm_suspend_resume_type)
*/ struct pds_lm_suspend_status_cmd {
u8 opcode;
u8 rsvd;
__le16 vf_id;
u8 type;
};
/** * struct pds_lm_resume_cmd - RESUME command * @opcode: Opcode PDS_LM_CMD_RESUME * @rsvd: Word boundary padding * @vf_id: VF id * @type: Type of resume (enum pds_lm_suspend_resume_type)
*/ struct pds_lm_resume_cmd {
u8 opcode;
u8 rsvd;
__le16 vf_id;
u8 type;
};
/** * struct pds_lm_sg_elem - Transmit scatter-gather (SG) descriptor element * @addr: DMA address of SG element data buffer * @len: Length of SG element data buffer, in bytes * @rsvd: Word boundary padding
*/ struct pds_lm_sg_elem {
__le64 addr;
__le32 len;
__le16 rsvd[2];
};
/** * struct pds_lm_save_cmd - SAVE command * @opcode: Opcode PDS_LM_CMD_SAVE * @rsvd: Word boundary padding * @vf_id: VF id * @rsvd2: Word boundary padding * @sgl_addr: IOVA address of the SGL to dma the device state * @num_sge: Total number of SG elements
*/ struct pds_lm_save_cmd {
u8 opcode;
u8 rsvd;
__le16 vf_id;
u8 rsvd2[4];
__le64 sgl_addr;
__le32 num_sge;
} __packed;
/** * struct pds_lm_restore_cmd - RESTORE command * @opcode: Opcode PDS_LM_CMD_RESTORE * @rsvd: Word boundary padding * @vf_id: VF id * @rsvd2: Word boundary padding * @sgl_addr: IOVA address of the SGL to dma the device state * @num_sge: Total number of SG elements
*/ struct pds_lm_restore_cmd {
u8 opcode;
u8 rsvd;
__le16 vf_id;
u8 rsvd2[4];
__le64 sgl_addr;
__le32 num_sge;
} __packed;
/** * union pds_lm_dev_state - device state information * @words: Device state words
*/ union pds_lm_dev_state {
__le32 words[PDS_LM_DEVICE_STATE_LENGTH / sizeof(__le32)];
};
/** * struct pds_lm_dirty_region_info - Memory region info for STATUS and ENABLE * @dma_base: Base address of the DMA-contiguous memory region * @page_count: Number of pages in the memory region * @page_size_log2: Log2 page size in the memory region * @rsvd: Word boundary padding
*/ struct pds_lm_dirty_region_info {
__le64 dma_base;
__le32 page_count;
u8 page_size_log2;
u8 rsvd[3];
};
/** * struct pds_lm_dirty_status_cmd - DIRTY_STATUS command * @opcode: Opcode PDS_LM_CMD_DIRTY_STATUS * @rsvd: Word boundary padding * @vf_id: VF id * @max_regions: Capacity of the region info buffer * @rsvd2: Word boundary padding * @regions_dma: DMA address of the region info buffer * * The minimum of max_regions (from the command) and num_regions (from the * completion) of struct pds_lm_dirty_region_info will be written to * regions_dma. * * The max_regions may be zero, in which case regions_dma is ignored. In that * case, the completion will only report the maximum number of regions * supported by the device, and the number of regions currently enabled.
*/ struct pds_lm_dirty_status_cmd {
u8 opcode;
u8 rsvd;
__le16 vf_id;
u8 max_regions;
u8 rsvd2[3];
__le64 regions_dma;
} __packed;
/** * struct pds_lm_dirty_status_comp - STATUS command completion * @status: Status of the command (enum pds_core_status_code) * @rsvd: Word boundary padding * @comp_index: Index in the desc ring for which this is the completion * @max_regions: Maximum number of regions supported by the device * @num_regions: Number of regions currently enabled * @bmp_type: Type of dirty bitmap representation * @rsvd2: Word boundary padding * @bmp_type_mask: Mask of supported bitmap types, bit index per type * @rsvd3: Word boundary padding * @color: Color bit * * This completion descriptor is used for STATUS, ENABLE, and DISABLE.
*/ struct pds_lm_dirty_status_comp {
u8 status;
u8 rsvd;
__le16 comp_index;
u8 max_regions;
u8 num_regions;
u8 bmp_type;
u8 rsvd2;
__le32 bmp_type_mask;
u8 rsvd3[3];
u8 color;
};
/** * struct pds_lm_dirty_enable_cmd - DIRTY_ENABLE command * @opcode: Opcode PDS_LM_CMD_DIRTY_ENABLE * @rsvd: Word boundary padding * @vf_id: VF id * @bmp_type: Type of dirty bitmap representation * @num_regions: Number of entries in the region info buffer * @rsvd2: Word boundary padding * @regions_dma: DMA address of the region info buffer * * The num_regions must be nonzero, and less than or equal to the maximum * number of regions supported by the device. * * The memory regions should not overlap. * * The information should be initialized by the driver. The device may modify * the information on successful completion, such as by size-aligning the * number of pages in a region. * * The modified number of pages will be greater than or equal to the page count * given in the enable command, and at least as coarsly aligned as the given * value. For example, the count might be aligned to a multiple of 64, but * if the value is already a multiple of 128 or higher, it will not change. * If the driver requires its own minimum alignment of the number of pages, the * driver should account for that already in the region info of this command. * * This command uses struct pds_lm_dirty_status_comp for its completion.
*/ struct pds_lm_dirty_enable_cmd {
u8 opcode;
u8 rsvd;
__le16 vf_id;
u8 bmp_type;
u8 num_regions;
u8 rsvd2[2];
__le64 regions_dma;
} __packed;
/** * struct pds_lm_dirty_disable_cmd - DIRTY_DISABLE command * @opcode: Opcode PDS_LM_CMD_DIRTY_DISABLE * @rsvd: Word boundary padding * @vf_id: VF id * * Dirty page tracking will be disabled. This may be called in any state, as * long as dirty page tracking is supported by the device, to ensure that dirty * page tracking is disabled. * * This command uses struct pds_lm_dirty_status_comp for its completion. On * success, num_regions will be zero.
*/ struct pds_lm_dirty_disable_cmd {
u8 opcode;
u8 rsvd;
__le16 vf_id;
};
/** * struct pds_lm_dirty_seq_ack_cmd - DIRTY_READ_SEQ or _WRITE_ACK command * @opcode: Opcode PDS_LM_CMD_DIRTY_[READ_SEQ|WRITE_ACK] * @rsvd: Word boundary padding * @vf_id: VF id * @off_bytes: Byte offset in the bitmap * @len_bytes: Number of bytes to transfer * @num_sge: Number of DMA scatter gather elements * @rsvd2: Word boundary padding * @sgl_addr: DMA address of scatter gather list * * Read bytes from the SEQ bitmap, or write bytes into the ACK bitmap. * * This command treats the entire bitmap as a byte buffer. It does not * distinguish between guest memory regions. The driver should refer to the * number of pages in each region, according to PDS_LM_CMD_DIRTY_STATUS, to * determine the region boundaries in the bitmap. Each region will be * represented by exactly the number of bits as the page count for that region, * immediately following the last bit of the previous region.
*/ struct pds_lm_dirty_seq_ack_cmd {
u8 opcode;
u8 rsvd;
__le16 vf_id;
__le32 off_bytes;
__le32 len_bytes;
__le16 num_sge;
u8 rsvd2[2];
__le64 sgl_addr;
} __packed;
/** * struct pds_lm_host_vf_status_cmd - HOST_VF_STATUS command * @opcode: Opcode PDS_LM_CMD_HOST_VF_STATUS * @rsvd: Word boundary padding * @vf_id: VF id * @status: Current LM status of host VF driver (enum pds_lm_host_status)
*/ struct pds_lm_host_vf_status_cmd {
u8 opcode;
u8 rsvd;
__le16 vf_id;
u8 status;
};
/** * struct pds_fwctl_comp - Firmware control completion structure * @status: Status of the firmware control operation * @rsvd: Reserved * @comp_index: Completion index in little-endian format * @rsvd2: Reserved * @color: Color bit indicating the state of the completion
*/ struct pds_fwctl_comp {
u8 status;
u8 rsvd;
__le16 comp_index;
u8 rsvd2[11];
u8 color;
} __packed;
/** * struct pds_fwctl_ident_cmd - Firmware control identification command structure * @opcode: Operation code for the command * @rsvd: Reserved * @version: Interface version * @rsvd2: Reserved * @len: Length of the identification data * @ident_pa: Physical address of the identification data
*/ struct pds_fwctl_ident_cmd {
u8 opcode;
u8 rsvd;
u8 version;
u8 rsvd2;
__le32 len;
__le64 ident_pa;
} __packed;
/* future feature bits here * enum pds_fwctl_features { * }; * (compilers don't like empty enums)
*/
/** * struct pds_fwctl_ident - Firmware control identification structure * @features: Supported features (enum pds_fwctl_features) * @version: Interface version * @rsvd: Reserved * @max_req_sz: Maximum request size * @max_resp_sz: Maximum response size * @max_req_sg_elems: Maximum number of request SGs * @max_resp_sg_elems: Maximum number of response SGs
*/ struct pds_fwctl_ident {
__le64 features;
u8 version;
u8 rsvd[3];
__le32 max_req_sz;
__le32 max_resp_sz;
u8 max_req_sg_elems;
u8 max_resp_sg_elems;
} __packed;
/* * FW command attributes that map to the FWCTL scope values
*/ #define PDSFC_FW_CMD_ATTR_READ 0x00 #define PDSFC_FW_CMD_ATTR_DEBUG_READ 0x02 #define PDSFC_FW_CMD_ATTR_WRITE 0x04 #define PDSFC_FW_CMD_ATTR_DEBUG_WRITE 0x08 #define PDSFC_FW_CMD_ATTR_SYNC 0x10
/** * struct pds_fwctl_query_cmd - Firmware control query command structure * @opcode: Operation code for the command * @entity: Entity type to query (enum pds_fwctl_query_entity) * @version: Version of the query data structure supported by the driver * @rsvd: Reserved * @query_data_buf_len: Length of the query data buffer * @query_data_buf_pa: Physical address of the query data buffer * @ep: Endpoint identifier to query (when entity is PDS_FWCTL_RPC_ENDPOINT) * @op: Operation identifier to query (when entity is PDS_FWCTL_RPC_OPERATION) * * This structure is used to send a query command to the firmware control * interface. The structure is packed to ensure there is no padding between * the fields.
*/ struct pds_fwctl_query_cmd {
u8 opcode;
u8 entity;
u8 version;
u8 rsvd;
__le32 query_data_buf_len;
__le64 query_data_buf_pa; union {
__le32 ep;
__le32 op;
};
} __packed;
/** * struct pds_fwctl_query_comp - Firmware control query completion structure * @status: Status of the query command * @rsvd: Reserved * @comp_index: Completion index in little-endian format * @version: Version of the query data structure returned by firmware. This * should be less than or equal to the version supported by the driver * @rsvd2: Reserved * @color: Color bit indicating the state of the completion
*/ struct pds_fwctl_query_comp {
u8 status;
u8 rsvd;
__le16 comp_index;
u8 version;
u8 rsvd2[2];
u8 color;
} __packed;
/** * struct pds_fwctl_query_data_endpoint - query data for entity PDS_FWCTL_RPC_ROOT * @id: The identifier for the data endpoint
*/ struct pds_fwctl_query_data_endpoint {
__le32 id;
} __packed;
/** * struct pds_fwctl_query_data_operation - query data for entity PDS_FWCTL_RPC_ENDPOINT * @id: Operation identifier * @scope: Scope of the operation (enum fwctl_rpc_scope) * @rsvd: Reserved
*/ struct pds_fwctl_query_data_operation {
__le32 id;
u8 scope;
u8 rsvd[3];
} __packed;
/** * struct pds_fwctl_query_data - query data structure * @version: Version of the query data structure * @rsvd: Reserved * @num_entries: Number of entries in the union * @entries: Array of query data entries, depending on the entity type
*/ struct pds_fwctl_query_data {
u8 version;
u8 rsvd[3];
__le32 num_entries;
u8 entries[] __counted_by_le(num_entries);
} __packed;
/** * struct pds_fwctl_rpc_cmd - Firmware control RPC command * @opcode: opcode PDS_FWCTL_CMD_RPC * @rsvd: Reserved * @flags: Indicates indirect request and/or response handling * @ep: Endpoint identifier * @op: Operation identifier * @inline_req0: Buffer for inline request * @inline_req1: Buffer for inline request * @req_pa: Physical address of request data * @req_sz: Size of the request * @req_sg_elems: Number of request SGs * @req_rsvd: Reserved * @inline_req2: Buffer for inline request * @resp_pa: Physical address of response data * @resp_sz: Size of the response * @resp_sg_elems: Number of response SGs * @resp_rsvd: Reserved
*/ struct pds_fwctl_rpc_cmd {
u8 opcode;
u8 rsvd;
__le16 flags; #define PDS_FWCTL_RPC_IND_REQ 0x1 #define PDS_FWCTL_RPC_IND_RESP 0x2
__le32 ep;
__le32 op;
u8 inline_req0[16]; union {
u8 inline_req1[16]; struct {
__le64 req_pa;
__le32 req_sz;
u8 req_sg_elems;
u8 req_rsvd[3];
};
}; union {
u8 inline_req2[16]; struct {
__le64 resp_pa;
__le32 resp_sz;
u8 resp_sg_elems;
u8 resp_rsvd[3];
};
};
} __packed;
/** * struct pds_sg_elem - Transmit scatter-gather (SG) descriptor element * @addr: DMA address of SG element data buffer * @len: Length of SG element data buffer, in bytes * @rsvd: Reserved
*/ struct pds_sg_elem {
__le64 addr;
__le32 len;
u8 rsvd[4];
} __packed;
/** * struct pds_fwctl_rpc_comp - Completion of a firmware control RPC * @status: Status of the command * @rsvd: Reserved * @comp_index: Completion index of the command * @err: Error code, if any, from the RPC * @resp_sz: Size of the response * @rsvd2: Reserved * @color: Color bit indicating the state of the completion
*/ struct pds_fwctl_rpc_comp {
u8 status;
u8 rsvd;
__le16 comp_index;
__le32 err;
__le32 resp_sz;
u8 rsvd2[3];
u8 color;
} __packed;
union pds_core_adminq_cmd {
u8 opcode;
u8 bytes[64];
/* The color bit is a 'done' bit for the completion descriptors * where the meaning alternates between '1' and '0' for alternating * passes through the completion descriptor ring.
*/ staticinlinebool pdsc_color_match(u8 color, bool done_color)
{ return (!!(color & PDS_COMP_COLOR_MASK)) == done_color;
}
struct pdsc; int pdsc_adminq_post(struct pdsc *pdsc, union pds_core_adminq_cmd *cmd, union pds_core_adminq_comp *comp, bool fast_poll);
#endif/* _PDS_CORE_ADMINQ_H_ */
Messung V0.5
¤ Dauer der Verarbeitung: 0.5 Sekunden
(vorverarbeitet)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.