i40e/base: support RSS for X722
Add AQ functions to handle RSS Key and LUT programming. This is needed for FortPark RSS support. FortPark has additional PCTYPES supported for RSS Signed-off-by: Jingjing Wu <jingjing.wu@intel.com> Acked-by: Helin Zhang <helin.zhang@intel.com> Tested-by: Huilong Xu <huilongx.xu@intel.com>
This commit is contained in:
parent
32216a586a
commit
4000d1d0cc
@ -265,6 +265,12 @@ enum i40e_admin_queue_opc {
|
||||
/* Tunnel commands */
|
||||
i40e_aqc_opc_add_udp_tunnel = 0x0B00,
|
||||
i40e_aqc_opc_del_udp_tunnel = 0x0B01,
|
||||
#ifdef X722_SUPPORT
|
||||
i40e_aqc_opc_set_rss_key = 0x0B02,
|
||||
i40e_aqc_opc_set_rss_lut = 0x0B03,
|
||||
i40e_aqc_opc_get_rss_key = 0x0B04,
|
||||
i40e_aqc_opc_get_rss_lut = 0x0B05,
|
||||
#endif
|
||||
|
||||
/* Async Events */
|
||||
i40e_aqc_opc_event_lan_overflow = 0x1001,
|
||||
@ -831,6 +837,10 @@ struct i40e_aqc_vsi_properties_data {
|
||||
u8 queueing_opt_flags;
|
||||
#define I40E_AQ_VSI_QUE_OPT_TCP_ENA 0x10
|
||||
#define I40E_AQ_VSI_QUE_OPT_FCOE_ENA 0x20
|
||||
#ifdef X722_SUPPORT
|
||||
#define I40E_AQ_VSI_QUE_OPT_RSS_LUT_PF 0x00
|
||||
#define I40E_AQ_VSI_QUE_OPT_RSS_LUT_VSI 0x40
|
||||
#endif
|
||||
u8 queueing_opt_reserved[3];
|
||||
/* scheduler section */
|
||||
u8 up_enable_bits;
|
||||
@ -2208,6 +2218,48 @@ struct i40e_aqc_del_udp_tunnel_completion {
|
||||
};
|
||||
|
||||
I40E_CHECK_CMD_LENGTH(i40e_aqc_del_udp_tunnel_completion);
|
||||
#ifdef X722_SUPPORT
|
||||
|
||||
struct i40e_aqc_get_set_rss_key {
|
||||
#define I40E_AQC_SET_RSS_KEY_VSI_VALID (0x1 << 15)
|
||||
#define I40E_AQC_SET_RSS_KEY_VSI_ID_SHIFT 0
|
||||
#define I40E_AQC_SET_RSS_KEY_VSI_ID_MASK (0x3FF << \
|
||||
I40E_AQC_SET_RSS_KEY_VSI_ID_SHIFT)
|
||||
__le16 vsi_id;
|
||||
u8 reserved[6];
|
||||
__le32 addr_high;
|
||||
__le32 addr_low;
|
||||
};
|
||||
|
||||
I40E_CHECK_CMD_LENGTH(i40e_aqc_get_set_rss_key);
|
||||
|
||||
struct i40e_aqc_get_set_rss_key_data {
|
||||
u8 standard_rss_key[0x28];
|
||||
u8 extended_hash_key[0xc];
|
||||
};
|
||||
|
||||
I40E_CHECK_STRUCT_LEN(0x34, i40e_aqc_get_set_rss_key_data);
|
||||
|
||||
struct i40e_aqc_get_set_rss_lut {
|
||||
#define I40E_AQC_SET_RSS_LUT_VSI_VALID (0x1 << 15)
|
||||
#define I40E_AQC_SET_RSS_LUT_VSI_ID_SHIFT 0
|
||||
#define I40E_AQC_SET_RSS_LUT_VSI_ID_MASK (0x3FF << \
|
||||
I40E_AQC_SET_RSS_LUT_VSI_ID_SHIFT)
|
||||
__le16 vsi_id;
|
||||
#define I40E_AQC_SET_RSS_LUT_TABLE_TYPE_SHIFT 0
|
||||
#define I40E_AQC_SET_RSS_LUT_TABLE_TYPE_MASK (0x1 << \
|
||||
I40E_AQC_SET_RSS_LUT_TABLE_TYPE_SHIFT)
|
||||
|
||||
#define I40E_AQC_SET_RSS_LUT_TABLE_TYPE_VSI 0
|
||||
#define I40E_AQC_SET_RSS_LUT_TABLE_TYPE_PF 1
|
||||
__le16 flags;
|
||||
u8 reserved[4];
|
||||
__le32 addr_high;
|
||||
__le32 addr_low;
|
||||
};
|
||||
|
||||
I40E_CHECK_CMD_LENGTH(i40e_aqc_get_set_rss_lut);
|
||||
#endif
|
||||
|
||||
/* tunnel key structure 0x0B10 */
|
||||
|
||||
|
@ -435,6 +435,166 @@ enum i40e_status_code i40e_aq_queue_shutdown(struct i40e_hw *hw,
|
||||
|
||||
return status;
|
||||
}
|
||||
#ifdef X722_SUPPORT
|
||||
|
||||
/**
|
||||
* i40e_aq_get_set_rss_lut
|
||||
* @hw: pointer to the hardware structure
|
||||
* @vsi_id: vsi fw index
|
||||
* @pf_lut: for PF table set true, for VSI table set false
|
||||
* @lut: pointer to the lut buffer provided by the caller
|
||||
* @lut_size: size of the lut buffer
|
||||
* @set: set true to set the table, false to get the table
|
||||
*
|
||||
* Internal function to get or set RSS look up table
|
||||
**/
|
||||
STATIC enum i40e_status_code i40e_aq_get_set_rss_lut(struct i40e_hw *hw,
|
||||
u16 vsi_id, bool pf_lut,
|
||||
u8 *lut, u16 lut_size,
|
||||
bool set)
|
||||
{
|
||||
enum i40e_status_code status;
|
||||
struct i40e_aq_desc desc;
|
||||
struct i40e_aqc_get_set_rss_lut *cmd_resp =
|
||||
(struct i40e_aqc_get_set_rss_lut *)&desc.params.raw;
|
||||
|
||||
if (set)
|
||||
i40e_fill_default_direct_cmd_desc(&desc,
|
||||
i40e_aqc_opc_set_rss_lut);
|
||||
else
|
||||
i40e_fill_default_direct_cmd_desc(&desc,
|
||||
i40e_aqc_opc_get_rss_lut);
|
||||
|
||||
/* Indirect command */
|
||||
desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
|
||||
desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_RD);
|
||||
|
||||
cmd_resp->vsi_id =
|
||||
CPU_TO_LE16((u16)((vsi_id <<
|
||||
I40E_AQC_SET_RSS_LUT_VSI_ID_SHIFT) &
|
||||
I40E_AQC_SET_RSS_LUT_VSI_ID_MASK));
|
||||
cmd_resp->vsi_id |= CPU_TO_LE16((u16)I40E_AQC_SET_RSS_LUT_VSI_VALID);
|
||||
|
||||
if (pf_lut)
|
||||
cmd_resp->flags |= CPU_TO_LE16((u16)
|
||||
((I40E_AQC_SET_RSS_LUT_TABLE_TYPE_PF <<
|
||||
I40E_AQC_SET_RSS_LUT_TABLE_TYPE_SHIFT) &
|
||||
I40E_AQC_SET_RSS_LUT_TABLE_TYPE_MASK));
|
||||
else
|
||||
cmd_resp->flags |= CPU_TO_LE16((u16)
|
||||
((I40E_AQC_SET_RSS_LUT_TABLE_TYPE_VSI <<
|
||||
I40E_AQC_SET_RSS_LUT_TABLE_TYPE_SHIFT) &
|
||||
I40E_AQC_SET_RSS_LUT_TABLE_TYPE_MASK));
|
||||
|
||||
status = i40e_asq_send_command(hw, &desc, lut, lut_size, NULL);
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
/**
|
||||
* i40e_aq_get_rss_lut
|
||||
* @hw: pointer to the hardware structure
|
||||
* @vsi_id: vsi fw index
|
||||
* @pf_lut: for PF table set true, for VSI table set false
|
||||
* @lut: pointer to the lut buffer provided by the caller
|
||||
* @lut_size: size of the lut buffer
|
||||
*
|
||||
* get the RSS lookup table, PF or VSI type
|
||||
**/
|
||||
enum i40e_status_code i40e_aq_get_rss_lut(struct i40e_hw *hw, u16 vsi_id,
|
||||
bool pf_lut, u8 *lut, u16 lut_size)
|
||||
{
|
||||
return i40e_aq_get_set_rss_lut(hw, vsi_id, pf_lut, lut, lut_size,
|
||||
false);
|
||||
}
|
||||
|
||||
/**
|
||||
* i40e_aq_set_rss_lut
|
||||
* @hw: pointer to the hardware structure
|
||||
* @vsi_id: vsi fw index
|
||||
* @pf_lut: for PF table set true, for VSI table set false
|
||||
* @lut: pointer to the lut buffer provided by the caller
|
||||
* @lut_size: size of the lut buffer
|
||||
*
|
||||
* set the RSS lookup table, PF or VSI type
|
||||
**/
|
||||
enum i40e_status_code i40e_aq_set_rss_lut(struct i40e_hw *hw, u16 vsi_id,
|
||||
bool pf_lut, u8 *lut, u16 lut_size)
|
||||
{
|
||||
return i40e_aq_get_set_rss_lut(hw, vsi_id, pf_lut, lut, lut_size, true);
|
||||
}
|
||||
|
||||
/**
|
||||
* i40e_aq_get_set_rss_key
|
||||
* @hw: pointer to the hw struct
|
||||
* @vsi_id: vsi fw index
|
||||
* @key: pointer to key info struct
|
||||
* @set: set true to set the key, false to get the key
|
||||
*
|
||||
* get the RSS key per VSI
|
||||
**/
|
||||
STATIC enum i40e_status_code i40e_aq_get_set_rss_key(struct i40e_hw *hw,
|
||||
u16 vsi_id,
|
||||
struct i40e_aqc_get_set_rss_key_data *key,
|
||||
bool set)
|
||||
{
|
||||
enum i40e_status_code status;
|
||||
struct i40e_aq_desc desc;
|
||||
struct i40e_aqc_get_set_rss_key *cmd_resp =
|
||||
(struct i40e_aqc_get_set_rss_key *)&desc.params.raw;
|
||||
u16 key_size = sizeof(struct i40e_aqc_get_set_rss_key_data);
|
||||
|
||||
if (set)
|
||||
i40e_fill_default_direct_cmd_desc(&desc,
|
||||
i40e_aqc_opc_set_rss_key);
|
||||
else
|
||||
i40e_fill_default_direct_cmd_desc(&desc,
|
||||
i40e_aqc_opc_get_rss_key);
|
||||
|
||||
/* Indirect command */
|
||||
desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
|
||||
desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_RD);
|
||||
|
||||
cmd_resp->vsi_id =
|
||||
CPU_TO_LE16((u16)((vsi_id <<
|
||||
I40E_AQC_SET_RSS_KEY_VSI_ID_SHIFT) &
|
||||
I40E_AQC_SET_RSS_KEY_VSI_ID_MASK));
|
||||
cmd_resp->vsi_id |= CPU_TO_LE16((u16)I40E_AQC_SET_RSS_KEY_VSI_VALID);
|
||||
|
||||
status = i40e_asq_send_command(hw, &desc, key, key_size, NULL);
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
/**
|
||||
* i40e_aq_get_rss_key
|
||||
* @hw: pointer to the hw struct
|
||||
* @vsi_id: vsi fw index
|
||||
* @key: pointer to key info struct
|
||||
*
|
||||
**/
|
||||
enum i40e_status_code i40e_aq_get_rss_key(struct i40e_hw *hw,
|
||||
u16 vsi_id,
|
||||
struct i40e_aqc_get_set_rss_key_data *key)
|
||||
{
|
||||
return i40e_aq_get_set_rss_key(hw, vsi_id, key, false);
|
||||
}
|
||||
|
||||
/**
|
||||
* i40e_aq_set_rss_key
|
||||
* @hw: pointer to the hw struct
|
||||
* @vsi_id: vsi fw index
|
||||
* @key: pointer to key info struct
|
||||
*
|
||||
* set the RSS key per VSI
|
||||
**/
|
||||
enum i40e_status_code i40e_aq_set_rss_key(struct i40e_hw *hw,
|
||||
u16 vsi_id,
|
||||
struct i40e_aqc_get_set_rss_key_data *key)
|
||||
{
|
||||
return i40e_aq_get_set_rss_key(hw, vsi_id, key, true);
|
||||
}
|
||||
#endif /* X722_SUPPORT */
|
||||
|
||||
/* The i40e_ptype_lookup table is used to convert from the 8-bit ptype in the
|
||||
* hardware to a bit-field that can be used by SW to more easily determine the
|
||||
|
@ -77,6 +77,19 @@ void i40e_idle_aq(struct i40e_hw *hw);
|
||||
void i40e_resume_aq(struct i40e_hw *hw);
|
||||
bool i40e_check_asq_alive(struct i40e_hw *hw);
|
||||
enum i40e_status_code i40e_aq_queue_shutdown(struct i40e_hw *hw, bool unloading);
|
||||
#ifdef X722_SUPPORT
|
||||
|
||||
enum i40e_status_code i40e_aq_get_rss_lut(struct i40e_hw *hw, u16 seid,
|
||||
bool pf_lut, u8 *lut, u16 lut_size);
|
||||
enum i40e_status_code i40e_aq_set_rss_lut(struct i40e_hw *hw, u16 seid,
|
||||
bool pf_lut, u8 *lut, u16 lut_size);
|
||||
enum i40e_status_code i40e_aq_get_rss_key(struct i40e_hw *hw,
|
||||
u16 seid,
|
||||
struct i40e_aqc_get_set_rss_key_data *key);
|
||||
enum i40e_status_code i40e_aq_set_rss_key(struct i40e_hw *hw,
|
||||
u16 seid,
|
||||
struct i40e_aqc_get_set_rss_key_data *key);
|
||||
#endif
|
||||
#ifndef I40E_NDIS_SUPPORT
|
||||
const char *i40e_aq_str(struct i40e_hw *hw, enum i40e_admin_queue_err aq_err);
|
||||
const char *i40e_stat_str(struct i40e_hw *hw, enum i40e_status_code stat_err);
|
||||
|
@ -1175,15 +1175,38 @@ struct i40e_filter_program_desc {
|
||||
|
||||
/* Packet Classifier Types for filters */
|
||||
enum i40e_filter_pctype {
|
||||
#ifdef X722_SUPPORT
|
||||
/* Note: Values 0-28 are reserved for future use.
|
||||
* Value 29, 30, 32 are not supported on XL710 and X710.
|
||||
*/
|
||||
I40E_FILTER_PCTYPE_NONF_UNICAST_IPV4_UDP = 29,
|
||||
I40E_FILTER_PCTYPE_NONF_MULTICAST_IPV4_UDP = 30,
|
||||
#else
|
||||
/* Note: Values 0-30 are reserved for future use */
|
||||
#endif
|
||||
I40E_FILTER_PCTYPE_NONF_IPV4_UDP = 31,
|
||||
#ifdef X722_SUPPORT
|
||||
I40E_FILTER_PCTYPE_NONF_IPV4_TCP_SYN_NO_ACK = 32,
|
||||
#else
|
||||
/* Note: Value 32 is reserved for future use */
|
||||
#endif
|
||||
I40E_FILTER_PCTYPE_NONF_IPV4_TCP = 33,
|
||||
I40E_FILTER_PCTYPE_NONF_IPV4_SCTP = 34,
|
||||
I40E_FILTER_PCTYPE_NONF_IPV4_OTHER = 35,
|
||||
I40E_FILTER_PCTYPE_FRAG_IPV4 = 36,
|
||||
#ifdef X722_SUPPORT
|
||||
/* Note: Values 37-38 are reserved for future use.
|
||||
* Value 39, 40, 42 are not supported on XL710 and X710.
|
||||
*/
|
||||
I40E_FILTER_PCTYPE_NONF_UNICAST_IPV6_UDP = 39,
|
||||
I40E_FILTER_PCTYPE_NONF_MULTICAST_IPV6_UDP = 40,
|
||||
#else
|
||||
/* Note: Values 37-40 are reserved for future use */
|
||||
#endif
|
||||
I40E_FILTER_PCTYPE_NONF_IPV6_UDP = 41,
|
||||
#ifdef X722_SUPPORT
|
||||
I40E_FILTER_PCTYPE_NONF_IPV6_TCP_SYN_NO_ACK = 42,
|
||||
#endif
|
||||
I40E_FILTER_PCTYPE_NONF_IPV6_TCP = 43,
|
||||
I40E_FILTER_PCTYPE_NONF_IPV6_SCTP = 44,
|
||||
I40E_FILTER_PCTYPE_NONF_IPV6_OTHER = 45,
|
||||
|
Loading…
Reference in New Issue
Block a user