[RFC,3/8] common/iavf: add large vsi queue config
Checks
Commit Message
From: Qi Zhang <qi.z.zhang@intel.com>
Signed-off-by: Qi Zhang <qi.z.zhang@intel.com>
---
drivers/common/iavf/virtchnl.h | 54 ++++++++++++++++++++++++++++++++++
drivers/net/iavf/iavf_vchnl.c | 6 ++--
2 files changed, 57 insertions(+), 3 deletions(-)
@@ -143,6 +143,7 @@ enum virtchnl_ops {
VIRTCHNL_OP_ENABLE_LARGE_QUEUES = 50,
VIRTCHNL_OP_DISABLE_LARGE_QUEUES = 51,
VIRTCHNL_OP_CONFIG_LARGE_IRQ_MAP = 52,
+ VIRTCHNL_OP_CONFIG_LARGE_VSI_QUEUES = 53,
};
/* These macros are used to generate compilation errors if a structure/union
@@ -303,6 +304,17 @@ struct virtchnl_txq_info {
VIRTCHNL_CHECK_STRUCT_LEN(24, virtchnl_txq_info);
+struct virtchnl_txq_info_2 {
+ u16 vsi_id;
+ u16 queue_id;
+ u16 ring_len; /* number of descriptors, multiple of 8 */
+ u16 reserved;
+ u64 dma_ring_addr;
+};
+
+VIRTCHNL_CHECK_STRUCT_LEN(16, virtchnl_txq_info_2);
+
+
/* VIRTCHNL_OP_CONFIG_RX_QUEUE
* VF sends this message to set up parameters for one RX queue.
* External data buffer contains one instance of virtchnl_rxq_info.
@@ -353,6 +365,15 @@ struct virtchnl_queue_pair_info {
VIRTCHNL_CHECK_STRUCT_LEN(64, virtchnl_queue_pair_info);
+struct virtchnl_large_queue_pair_info {
+ /* NOTE: vsi_id and queue_id should be identical for both queues. */
+ struct virtchnl_txq_info_2 txq;
+ struct virtchnl_rxq_info rxq;
+};
+
+VIRTCHNL_CHECK_STRUCT_LEN(56, virtchnl_large_queue_pair_info);
+
+
struct virtchnl_vsi_queue_config_info {
u16 vsi_id;
u16 num_queue_pairs;
@@ -362,6 +383,16 @@ struct virtchnl_vsi_queue_config_info {
VIRTCHNL_CHECK_STRUCT_LEN(72, virtchnl_vsi_queue_config_info);
+struct virtchnl_large_vsi_queue_config_info {
+ u16 vsi_id;
+ u16 num_queue_pairs;
+ u32 pad;
+ struct virtchnl_large_queue_pair_info qpair[1];
+};
+
+VIRTCHNL_CHECK_STRUCT_LEN(64, virtchnl_large_vsi_queue_config_info);
+
+
/* VIRTCHNL_OP_REQUEST_QUEUES
* VF sends this message to request the PF to allocate additional queues to
* this VF. Each VF gets a guaranteed number of queues on init but asking for
@@ -809,6 +840,11 @@ enum virtchnl_vector_limits {
VIRTCHNL_OP_CONFIG_LARGE_IRQ_MAP_MAX =
((u16)(~0) - sizeof(struct virtchnl_large_irq_map_info)) /
sizeof(struct virtchnl_large_vector_map),
+
+ VIRTCHNL_OP_CONFIG_LARGE_VSI_QUEUES_MAX =
+ ((u16)(~0) - sizeof(struct virtchnl_large_vsi_queue_config_info)) /
+ sizeof(struct virtchnl_large_queue_pair_info),
+
};
/* VF reset states - these are written into the RSTAT register:
@@ -1185,6 +1221,24 @@ virtchnl_vc_validate_vf_msg(struct virtchnl_version_info *ver, u32 v_opcode,
virtchnl_queue_pair_info));
}
break;
+ case VIRTCHNL_OP_CONFIG_LARGE_VSI_QUEUES:
+ valid_len = sizeof(struct virtchnl_large_vsi_queue_config_info);
+ if (msglen >= valid_len) {
+ struct virtchnl_large_vsi_queue_config_info *vqc =
+ (struct virtchnl_large_vsi_queue_config_info *)msg;
+
+ if (vqc->num_queue_pairs == 0 || vqc->num_queue_pairs >
+ VIRTCHNL_OP_CONFIG_LARGE_VSI_QUEUES_MAX) {
+ err_msg_format = true;
+ break;
+ }
+
+ valid_len += (vqc->num_queue_pairs *
+ sizeof(struct
+ virtchnl_large_queue_pair_info));
+ }
+ break;
+
case VIRTCHNL_OP_CONFIG_IRQ_MAP:
valid_len = sizeof(struct virtchnl_irq_map_info);
if (msglen >= valid_len) {
@@ -606,8 +606,8 @@ iavf_configure_queues(struct iavf_adapter *adapter)
struct iavf_tx_queue **txq =
(struct iavf_tx_queue **)adapter->eth_dev->data->tx_queues;
struct iavf_info *vf = IAVF_DEV_PRIVATE_TO_VF(adapter);
- struct virtchnl_vsi_queue_config_info *vc_config;
- struct virtchnl_queue_pair_info *vc_qp;
+ struct virtchnl_large_vsi_queue_config_info *vc_config;
+ struct virtchnl_large_queue_pair_info *vc_qp;
struct iavf_cmd_info args;
uint16_t i, size;
int err;
@@ -668,7 +668,7 @@ iavf_configure_queues(struct iavf_adapter *adapter)
}
memset(&args, 0, sizeof(args));
- args.ops = VIRTCHNL_OP_CONFIG_VSI_QUEUES;
+ args.ops = VIRTCHNL_OP_CONFIG_LARGE_VSI_QUEUES;
args.in_args = (uint8_t *)vc_config;
args.in_args_size = size;
args.out_buffer = vf->aq_resp;