提交 ba8ef506 编写于 作者: A Arthur Kiyanovski 提交者: David S. Miller

net: ena: add MAX_QUEUES_EXT get feature admin command

Add a new admin command to support different queue size for Tx/Rx
queues (the change also support different SQ/CQ sizes)
Signed-off-by: NArthur Kiyanovski <akiyano@amazon.com>
Signed-off-by: NSameeh Jubran <sameehj@amazon.com>
Signed-off-by: NDavid S. Miller <davem@davemloft.net>
上级 f2dec9a2
...@@ -64,6 +64,7 @@ enum ena_admin_aq_feature_id { ...@@ -64,6 +64,7 @@ enum ena_admin_aq_feature_id {
ENA_ADMIN_LLQ = 4, ENA_ADMIN_LLQ = 4,
ENA_ADMIN_EXTRA_PROPERTIES_STRINGS = 5, ENA_ADMIN_EXTRA_PROPERTIES_STRINGS = 5,
ENA_ADMIN_EXTRA_PROPERTIES_FLAGS = 6, ENA_ADMIN_EXTRA_PROPERTIES_FLAGS = 6,
ENA_ADMIN_MAX_QUEUES_EXT = 7,
ENA_ADMIN_RSS_HASH_FUNCTION = 10, ENA_ADMIN_RSS_HASH_FUNCTION = 10,
ENA_ADMIN_STATELESS_OFFLOAD_CONFIG = 11, ENA_ADMIN_STATELESS_OFFLOAD_CONFIG = 11,
ENA_ADMIN_RSS_REDIRECTION_TABLE_CONFIG = 12, ENA_ADMIN_RSS_REDIRECTION_TABLE_CONFIG = 12,
...@@ -425,7 +426,13 @@ struct ena_admin_get_set_feature_common_desc { ...@@ -425,7 +426,13 @@ struct ena_admin_get_set_feature_common_desc {
/* as appears in ena_admin_aq_feature_id */ /* as appears in ena_admin_aq_feature_id */
u8 feature_id; u8 feature_id;
u16 reserved16; /* The driver specifies the max feature version it supports and the
* device responds with the currently supported feature version. The
* field is zero based
*/
u8 feature_version;
u8 reserved8;
}; };
struct ena_admin_device_attr_feature_desc { struct ena_admin_device_attr_feature_desc {
...@@ -535,6 +542,34 @@ struct ena_admin_feature_llq_desc { ...@@ -535,6 +542,34 @@ struct ena_admin_feature_llq_desc {
u32 max_tx_burst_size; u32 max_tx_burst_size;
}; };
struct ena_admin_queue_ext_feature_fields {
u32 max_tx_sq_num;
u32 max_tx_cq_num;
u32 max_rx_sq_num;
u32 max_rx_cq_num;
u32 max_tx_sq_depth;
u32 max_tx_cq_depth;
u32 max_rx_sq_depth;
u32 max_rx_cq_depth;
u32 max_tx_header_size;
/* Maximum Descriptors number, including meta descriptor, allowed for
* a single Tx packet
*/
u16 max_per_packet_tx_descs;
/* Maximum Descriptors number allowed for a single Rx packet */
u16 max_per_packet_rx_descs;
};
struct ena_admin_queue_feature_desc { struct ena_admin_queue_feature_desc {
u32 max_sq_num; u32 max_sq_num;
...@@ -849,6 +884,19 @@ struct ena_admin_get_feat_cmd { ...@@ -849,6 +884,19 @@ struct ena_admin_get_feat_cmd {
u32 raw[11]; u32 raw[11];
}; };
struct ena_admin_queue_ext_feature_desc {
/* version */
u8 version;
u8 reserved1[3];
union {
struct ena_admin_queue_ext_feature_fields max_queue_ext;
u32 raw[10];
};
};
struct ena_admin_get_feat_resp { struct ena_admin_get_feat_resp {
struct ena_admin_acq_common_desc acq_common_desc; struct ena_admin_acq_common_desc acq_common_desc;
...@@ -861,6 +909,8 @@ struct ena_admin_get_feat_resp { ...@@ -861,6 +909,8 @@ struct ena_admin_get_feat_resp {
struct ena_admin_queue_feature_desc max_queue; struct ena_admin_queue_feature_desc max_queue;
struct ena_admin_queue_ext_feature_desc max_queue_ext;
struct ena_admin_feature_aenq_desc aenq; struct ena_admin_feature_aenq_desc aenq;
struct ena_admin_get_feature_link_desc link; struct ena_admin_get_feature_link_desc link;
...@@ -929,7 +979,9 @@ struct ena_admin_aenq_common_desc { ...@@ -929,7 +979,9 @@ struct ena_admin_aenq_common_desc {
u16 syndrom; u16 syndrom;
/* 0 : phase */ /* 0 : phase
* 7:1 : reserved - MBZ
*/
u8 flags; u8 flags;
u8 reserved1[3]; u8 reserved1[3];
......
...@@ -978,7 +978,8 @@ static int ena_com_get_feature_ex(struct ena_com_dev *ena_dev, ...@@ -978,7 +978,8 @@ static int ena_com_get_feature_ex(struct ena_com_dev *ena_dev,
struct ena_admin_get_feat_resp *get_resp, struct ena_admin_get_feat_resp *get_resp,
enum ena_admin_aq_feature_id feature_id, enum ena_admin_aq_feature_id feature_id,
dma_addr_t control_buf_dma_addr, dma_addr_t control_buf_dma_addr,
u32 control_buff_size) u32 control_buff_size,
u8 feature_ver)
{ {
struct ena_com_admin_queue *admin_queue; struct ena_com_admin_queue *admin_queue;
struct ena_admin_get_feat_cmd get_cmd; struct ena_admin_get_feat_cmd get_cmd;
...@@ -1009,7 +1010,7 @@ static int ena_com_get_feature_ex(struct ena_com_dev *ena_dev, ...@@ -1009,7 +1010,7 @@ static int ena_com_get_feature_ex(struct ena_com_dev *ena_dev,
} }
get_cmd.control_buffer.length = control_buff_size; get_cmd.control_buffer.length = control_buff_size;
get_cmd.feat_common.feature_version = feature_ver;
get_cmd.feat_common.feature_id = feature_id; get_cmd.feat_common.feature_id = feature_id;
ret = ena_com_execute_admin_command(admin_queue, ret = ena_com_execute_admin_command(admin_queue,
...@@ -1029,13 +1030,15 @@ static int ena_com_get_feature_ex(struct ena_com_dev *ena_dev, ...@@ -1029,13 +1030,15 @@ static int ena_com_get_feature_ex(struct ena_com_dev *ena_dev,
static int ena_com_get_feature(struct ena_com_dev *ena_dev, static int ena_com_get_feature(struct ena_com_dev *ena_dev,
struct ena_admin_get_feat_resp *get_resp, struct ena_admin_get_feat_resp *get_resp,
enum ena_admin_aq_feature_id feature_id) enum ena_admin_aq_feature_id feature_id,
u8 feature_ver)
{ {
return ena_com_get_feature_ex(ena_dev, return ena_com_get_feature_ex(ena_dev,
get_resp, get_resp,
feature_id, feature_id,
0, 0,
0); 0,
feature_ver);
} }
static int ena_com_hash_key_allocate(struct ena_com_dev *ena_dev) static int ena_com_hash_key_allocate(struct ena_com_dev *ena_dev)
...@@ -1095,7 +1098,7 @@ static int ena_com_indirect_table_allocate(struct ena_com_dev *ena_dev, ...@@ -1095,7 +1098,7 @@ static int ena_com_indirect_table_allocate(struct ena_com_dev *ena_dev,
int ret; int ret;
ret = ena_com_get_feature(ena_dev, &get_resp, ret = ena_com_get_feature(ena_dev, &get_resp,
ENA_ADMIN_RSS_REDIRECTION_TABLE_CONFIG); ENA_ADMIN_RSS_REDIRECTION_TABLE_CONFIG, 0);
if (unlikely(ret)) if (unlikely(ret))
return ret; return ret;
...@@ -1515,7 +1518,7 @@ int ena_com_set_aenq_config(struct ena_com_dev *ena_dev, u32 groups_flag) ...@@ -1515,7 +1518,7 @@ int ena_com_set_aenq_config(struct ena_com_dev *ena_dev, u32 groups_flag)
struct ena_admin_get_feat_resp get_resp; struct ena_admin_get_feat_resp get_resp;
int ret; int ret;
ret = ena_com_get_feature(ena_dev, &get_resp, ENA_ADMIN_AENQ_CONFIG); ret = ena_com_get_feature(ena_dev, &get_resp, ENA_ADMIN_AENQ_CONFIG, 0);
if (ret) { if (ret) {
pr_info("Can't get aenq configuration\n"); pr_info("Can't get aenq configuration\n");
return ret; return ret;
...@@ -1890,7 +1893,7 @@ void ena_com_destroy_io_queue(struct ena_com_dev *ena_dev, u16 qid) ...@@ -1890,7 +1893,7 @@ void ena_com_destroy_io_queue(struct ena_com_dev *ena_dev, u16 qid)
int ena_com_get_link_params(struct ena_com_dev *ena_dev, int ena_com_get_link_params(struct ena_com_dev *ena_dev,
struct ena_admin_get_feat_resp *resp) struct ena_admin_get_feat_resp *resp)
{ {
return ena_com_get_feature(ena_dev, resp, ENA_ADMIN_LINK_CONFIG); return ena_com_get_feature(ena_dev, resp, ENA_ADMIN_LINK_CONFIG, 0);
} }
int ena_com_extra_properties_strings_init(struct ena_com_dev *ena_dev) int ena_com_extra_properties_strings_init(struct ena_com_dev *ena_dev)
...@@ -1916,7 +1919,7 @@ int ena_com_extra_properties_strings_init(struct ena_com_dev *ena_dev) ...@@ -1916,7 +1919,7 @@ int ena_com_extra_properties_strings_init(struct ena_com_dev *ena_dev)
rc = ena_com_get_feature_ex(ena_dev, &resp, rc = ena_com_get_feature_ex(ena_dev, &resp,
ENA_ADMIN_EXTRA_PROPERTIES_STRINGS, ENA_ADMIN_EXTRA_PROPERTIES_STRINGS,
extra_properties_strings->dma_addr, extra_properties_strings->dma_addr,
extra_properties_strings->size); extra_properties_strings->size, 0);
if (rc) { if (rc) {
pr_debug("Failed to get extra properties strings\n"); pr_debug("Failed to get extra properties strings\n");
goto err; goto err;
...@@ -1946,7 +1949,7 @@ int ena_com_get_extra_properties_flags(struct ena_com_dev *ena_dev, ...@@ -1946,7 +1949,7 @@ int ena_com_get_extra_properties_flags(struct ena_com_dev *ena_dev,
struct ena_admin_get_feat_resp *resp) struct ena_admin_get_feat_resp *resp)
{ {
return ena_com_get_feature(ena_dev, resp, return ena_com_get_feature(ena_dev, resp,
ENA_ADMIN_EXTRA_PROPERTIES_FLAGS); ENA_ADMIN_EXTRA_PROPERTIES_FLAGS, 0);
} }
int ena_com_get_dev_attr_feat(struct ena_com_dev *ena_dev, int ena_com_get_dev_attr_feat(struct ena_com_dev *ena_dev,
...@@ -1956,7 +1959,7 @@ int ena_com_get_dev_attr_feat(struct ena_com_dev *ena_dev, ...@@ -1956,7 +1959,7 @@ int ena_com_get_dev_attr_feat(struct ena_com_dev *ena_dev,
int rc; int rc;
rc = ena_com_get_feature(ena_dev, &get_resp, rc = ena_com_get_feature(ena_dev, &get_resp,
ENA_ADMIN_DEVICE_ATTRIBUTES); ENA_ADMIN_DEVICE_ATTRIBUTES, 0);
if (rc) if (rc)
return rc; return rc;
...@@ -1964,17 +1967,34 @@ int ena_com_get_dev_attr_feat(struct ena_com_dev *ena_dev, ...@@ -1964,17 +1967,34 @@ int ena_com_get_dev_attr_feat(struct ena_com_dev *ena_dev,
sizeof(get_resp.u.dev_attr)); sizeof(get_resp.u.dev_attr));
ena_dev->supported_features = get_resp.u.dev_attr.supported_features; ena_dev->supported_features = get_resp.u.dev_attr.supported_features;
rc = ena_com_get_feature(ena_dev, &get_resp, if (ena_dev->supported_features & BIT(ENA_ADMIN_MAX_QUEUES_EXT)) {
ENA_ADMIN_MAX_QUEUES_NUM); rc = ena_com_get_feature(ena_dev, &get_resp,
if (rc) ENA_ADMIN_MAX_QUEUES_EXT,
return rc; ENA_FEATURE_MAX_QUEUE_EXT_VER);
if (rc)
return rc;
memcpy(&get_feat_ctx->max_queues, &get_resp.u.max_queue, if (get_resp.u.max_queue_ext.version != ENA_FEATURE_MAX_QUEUE_EXT_VER)
sizeof(get_resp.u.max_queue)); return -EINVAL;
ena_dev->tx_max_header_size = get_resp.u.max_queue.max_header_size;
memcpy(&get_feat_ctx->max_queue_ext, &get_resp.u.max_queue_ext,
sizeof(get_resp.u.max_queue_ext));
ena_dev->tx_max_header_size =
get_resp.u.max_queue_ext.max_queue_ext.max_tx_header_size;
} else {
rc = ena_com_get_feature(ena_dev, &get_resp,
ENA_ADMIN_MAX_QUEUES_NUM, 0);
memcpy(&get_feat_ctx->max_queues, &get_resp.u.max_queue,
sizeof(get_resp.u.max_queue));
ena_dev->tx_max_header_size =
get_resp.u.max_queue.max_header_size;
if (rc)
return rc;
}
rc = ena_com_get_feature(ena_dev, &get_resp, rc = ena_com_get_feature(ena_dev, &get_resp,
ENA_ADMIN_AENQ_CONFIG); ENA_ADMIN_AENQ_CONFIG, 0);
if (rc) if (rc)
return rc; return rc;
...@@ -1982,7 +2002,7 @@ int ena_com_get_dev_attr_feat(struct ena_com_dev *ena_dev, ...@@ -1982,7 +2002,7 @@ int ena_com_get_dev_attr_feat(struct ena_com_dev *ena_dev,
sizeof(get_resp.u.aenq)); sizeof(get_resp.u.aenq));
rc = ena_com_get_feature(ena_dev, &get_resp, rc = ena_com_get_feature(ena_dev, &get_resp,
ENA_ADMIN_STATELESS_OFFLOAD_CONFIG); ENA_ADMIN_STATELESS_OFFLOAD_CONFIG, 0);
if (rc) if (rc)
return rc; return rc;
...@@ -1992,7 +2012,7 @@ int ena_com_get_dev_attr_feat(struct ena_com_dev *ena_dev, ...@@ -1992,7 +2012,7 @@ int ena_com_get_dev_attr_feat(struct ena_com_dev *ena_dev,
/* Driver hints isn't mandatory admin command. So in case the /* Driver hints isn't mandatory admin command. So in case the
* command isn't supported set driver hints to 0 * command isn't supported set driver hints to 0
*/ */
rc = ena_com_get_feature(ena_dev, &get_resp, ENA_ADMIN_HW_HINTS); rc = ena_com_get_feature(ena_dev, &get_resp, ENA_ADMIN_HW_HINTS, 0);
if (!rc) if (!rc)
memcpy(&get_feat_ctx->hw_hints, &get_resp.u.hw_hints, memcpy(&get_feat_ctx->hw_hints, &get_resp.u.hw_hints,
...@@ -2003,7 +2023,7 @@ int ena_com_get_dev_attr_feat(struct ena_com_dev *ena_dev, ...@@ -2003,7 +2023,7 @@ int ena_com_get_dev_attr_feat(struct ena_com_dev *ena_dev,
else else
return rc; return rc;
rc = ena_com_get_feature(ena_dev, &get_resp, ENA_ADMIN_LLQ); rc = ena_com_get_feature(ena_dev, &get_resp, ENA_ADMIN_LLQ, 0);
if (!rc) if (!rc)
memcpy(&get_feat_ctx->llq, &get_resp.u.llq, memcpy(&get_feat_ctx->llq, &get_resp.u.llq,
sizeof(get_resp.u.llq)); sizeof(get_resp.u.llq));
...@@ -2240,7 +2260,7 @@ int ena_com_get_offload_settings(struct ena_com_dev *ena_dev, ...@@ -2240,7 +2260,7 @@ int ena_com_get_offload_settings(struct ena_com_dev *ena_dev,
struct ena_admin_get_feat_resp resp; struct ena_admin_get_feat_resp resp;
ret = ena_com_get_feature(ena_dev, &resp, ret = ena_com_get_feature(ena_dev, &resp,
ENA_ADMIN_STATELESS_OFFLOAD_CONFIG); ENA_ADMIN_STATELESS_OFFLOAD_CONFIG, 0);
if (unlikely(ret)) { if (unlikely(ret)) {
pr_err("Failed to get offload capabilities %d\n", ret); pr_err("Failed to get offload capabilities %d\n", ret);
return ret; return ret;
...@@ -2269,7 +2289,7 @@ int ena_com_set_hash_function(struct ena_com_dev *ena_dev) ...@@ -2269,7 +2289,7 @@ int ena_com_set_hash_function(struct ena_com_dev *ena_dev)
/* Validate hash function is supported */ /* Validate hash function is supported */
ret = ena_com_get_feature(ena_dev, &get_resp, ret = ena_com_get_feature(ena_dev, &get_resp,
ENA_ADMIN_RSS_HASH_FUNCTION); ENA_ADMIN_RSS_HASH_FUNCTION, 0);
if (unlikely(ret)) if (unlikely(ret))
return ret; return ret;
...@@ -2329,7 +2349,7 @@ int ena_com_fill_hash_function(struct ena_com_dev *ena_dev, ...@@ -2329,7 +2349,7 @@ int ena_com_fill_hash_function(struct ena_com_dev *ena_dev,
rc = ena_com_get_feature_ex(ena_dev, &get_resp, rc = ena_com_get_feature_ex(ena_dev, &get_resp,
ENA_ADMIN_RSS_HASH_FUNCTION, ENA_ADMIN_RSS_HASH_FUNCTION,
rss->hash_key_dma_addr, rss->hash_key_dma_addr,
sizeof(*rss->hash_key)); sizeof(*rss->hash_key), 0);
if (unlikely(rc)) if (unlikely(rc))
return rc; return rc;
...@@ -2381,7 +2401,7 @@ int ena_com_get_hash_function(struct ena_com_dev *ena_dev, ...@@ -2381,7 +2401,7 @@ int ena_com_get_hash_function(struct ena_com_dev *ena_dev,
rc = ena_com_get_feature_ex(ena_dev, &get_resp, rc = ena_com_get_feature_ex(ena_dev, &get_resp,
ENA_ADMIN_RSS_HASH_FUNCTION, ENA_ADMIN_RSS_HASH_FUNCTION,
rss->hash_key_dma_addr, rss->hash_key_dma_addr,
sizeof(*rss->hash_key)); sizeof(*rss->hash_key), 0);
if (unlikely(rc)) if (unlikely(rc))
return rc; return rc;
...@@ -2406,7 +2426,7 @@ int ena_com_get_hash_ctrl(struct ena_com_dev *ena_dev, ...@@ -2406,7 +2426,7 @@ int ena_com_get_hash_ctrl(struct ena_com_dev *ena_dev,
rc = ena_com_get_feature_ex(ena_dev, &get_resp, rc = ena_com_get_feature_ex(ena_dev, &get_resp,
ENA_ADMIN_RSS_HASH_INPUT, ENA_ADMIN_RSS_HASH_INPUT,
rss->hash_ctrl_dma_addr, rss->hash_ctrl_dma_addr,
sizeof(*rss->hash_ctrl)); sizeof(*rss->hash_ctrl), 0);
if (unlikely(rc)) if (unlikely(rc))
return rc; return rc;
...@@ -2642,7 +2662,7 @@ int ena_com_indirect_table_get(struct ena_com_dev *ena_dev, u32 *ind_tbl) ...@@ -2642,7 +2662,7 @@ int ena_com_indirect_table_get(struct ena_com_dev *ena_dev, u32 *ind_tbl)
rc = ena_com_get_feature_ex(ena_dev, &get_resp, rc = ena_com_get_feature_ex(ena_dev, &get_resp,
ENA_ADMIN_RSS_REDIRECTION_TABLE_CONFIG, ENA_ADMIN_RSS_REDIRECTION_TABLE_CONFIG,
rss->rss_ind_tbl_dma_addr, rss->rss_ind_tbl_dma_addr,
tbl_size); tbl_size, 0);
if (unlikely(rc)) if (unlikely(rc))
return rc; return rc;
...@@ -2857,7 +2877,7 @@ int ena_com_init_interrupt_moderation(struct ena_com_dev *ena_dev) ...@@ -2857,7 +2877,7 @@ int ena_com_init_interrupt_moderation(struct ena_com_dev *ena_dev)
int rc; int rc;
rc = ena_com_get_feature(ena_dev, &get_resp, rc = ena_com_get_feature(ena_dev, &get_resp,
ENA_ADMIN_INTERRUPT_MODERATION); ENA_ADMIN_INTERRUPT_MODERATION, 0);
if (rc) { if (rc) {
if (rc == -EOPNOTSUPP) { if (rc == -EOPNOTSUPP) {
......
...@@ -101,6 +101,8 @@ ...@@ -101,6 +101,8 @@
#define ENA_HW_HINTS_NO_TIMEOUT 0xFFFF #define ENA_HW_HINTS_NO_TIMEOUT 0xFFFF
#define ENA_FEATURE_MAX_QUEUE_EXT_VER 1
enum ena_intr_moder_level { enum ena_intr_moder_level {
ENA_INTR_MODER_LOWEST = 0, ENA_INTR_MODER_LOWEST = 0,
ENA_INTR_MODER_LOW, ENA_INTR_MODER_LOW,
...@@ -389,6 +391,7 @@ struct ena_com_dev { ...@@ -389,6 +391,7 @@ struct ena_com_dev {
struct ena_com_dev_get_features_ctx { struct ena_com_dev_get_features_ctx {
struct ena_admin_queue_feature_desc max_queues; struct ena_admin_queue_feature_desc max_queues;
struct ena_admin_queue_ext_feature_desc max_queue_ext;
struct ena_admin_device_attr_feature_desc dev_attr; struct ena_admin_device_attr_feature_desc dev_attr;
struct ena_admin_feature_aenq_desc aenq; struct ena_admin_feature_aenq_desc aenq;
struct ena_admin_feature_offload_desc offload; struct ena_admin_feature_offload_desc offload;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册