net/i40e: support updating pctype mapping table

Add new functions which allow modify, return or reset to default
the contents of flow type to pctype dynamic mapping table.

Signed-off-by: Kirill Rybalchenko <kirill.rybalchenko@intel.com>
Reviewed-by: Ferruh Yigit <ferruh.yigit@intel.com>
This commit is contained in:
Kirill Rybalchenko 2017-10-04 13:52:11 +01:00 committed by Ferruh Yigit
parent a286ebeb07
commit 350861b35c
3 changed files with 152 additions and 0 deletions

View File

@ -2332,3 +2332,97 @@ rte_pmd_i40e_add_vf_mac_addr(uint8_t port, uint16_t vf_id,
return 0;
}
int rte_pmd_i40e_flow_type_mapping_reset(uint8_t port)
{
struct rte_eth_dev *dev;
RTE_ETH_VALID_PORTID_OR_ERR_RET(port, -ENODEV);
dev = &rte_eth_devices[port];
if (!is_i40e_supported(dev))
return -ENOTSUP;
i40e_set_default_pctype_table(dev);
return 0;
}
int rte_pmd_i40e_flow_type_mapping_get(
uint8_t port,
struct rte_pmd_i40e_flow_type_mapping *mapping_items)
{
struct rte_eth_dev *dev;
struct i40e_adapter *ad;
uint16_t i;
RTE_ETH_VALID_PORTID_OR_ERR_RET(port, -ENODEV);
dev = &rte_eth_devices[port];
if (!is_i40e_supported(dev))
return -ENOTSUP;
ad = I40E_DEV_PRIVATE_TO_ADAPTER(dev->data->dev_private);
for (i = 0; i < I40E_FLOW_TYPE_MAX; i++) {
mapping_items[i].flow_type = i;
mapping_items[i].pctype = ad->pctypes_tbl[i];
}
return 0;
}
int
rte_pmd_i40e_flow_type_mapping_update(
uint8_t port,
struct rte_pmd_i40e_flow_type_mapping *mapping_items,
uint16_t count,
uint8_t exclusive)
{
struct rte_eth_dev *dev;
struct i40e_adapter *ad;
int i;
RTE_ETH_VALID_PORTID_OR_ERR_RET(port, -ENODEV);
dev = &rte_eth_devices[port];
if (!is_i40e_supported(dev))
return -ENOTSUP;
if (count > I40E_FLOW_TYPE_MAX)
return -EINVAL;
for (i = 0; i < count; i++)
if (mapping_items[i].flow_type >= I40E_FLOW_TYPE_MAX ||
mapping_items[i].flow_type == RTE_ETH_FLOW_UNKNOWN ||
(mapping_items[i].pctype &
(1ULL << I40E_FILTER_PCTYPE_INVALID)))
return -EINVAL;
ad = I40E_DEV_PRIVATE_TO_ADAPTER(dev->data->dev_private);
if (exclusive) {
for (i = 0; i < I40E_FLOW_TYPE_MAX; i++)
ad->pctypes_tbl[i] = 0ULL;
ad->flow_types_mask = 0ULL;
}
for (i = 0; i < count; i++) {
ad->pctypes_tbl[mapping_items[i].flow_type] =
mapping_items[i].pctype;
if (mapping_items[i].pctype)
ad->flow_types_mask |=
(1ULL << mapping_items[i].flow_type);
else
ad->flow_types_mask &=
~(1ULL << mapping_items[i].flow_type);
}
for (i = 0, ad->pctypes_mask = 0ULL; i < I40E_FLOW_TYPE_MAX; i++)
ad->pctypes_mask |= ad->pctypes_tbl[i];
return 0;
}

View File

@ -682,4 +682,59 @@ int rte_pmd_i40e_ptype_mapping_replace(uint8_t port,
int rte_pmd_i40e_add_vf_mac_addr(uint8_t port, uint16_t vf_id,
struct ether_addr *mac_addr);
#define RTE_PMD_I40E_PCTYPE_MAX 64
#define RTE_PMD_I40E_FLOW_TYPE_MAX 64
struct rte_pmd_i40e_flow_type_mapping {
uint16_t flow_type; /**< software defined flow type*/
uint64_t pctype; /**< hardware defined pctype */
};
/**
* Update hardware defined pctype to software defined flow type
* mapping table.
*
* @param port
* pointer to port identifier of the device.
* @param mapping_items
* the base address of the mapping items array.
* @param count
* number of mapping items.
* @param exclusive
* the flag indicate different pctype mapping update method.
* -(0) only overwrite referred PCTYPE mapping,
* keep other PCTYPEs mapping unchanged.
* -(!0) overwrite referred PCTYPE mapping,
* set other PCTYPEs maps to PCTYPE_INVALID.
*/
int rte_pmd_i40e_flow_type_mapping_update(
uint8_t port,
struct rte_pmd_i40e_flow_type_mapping *mapping_items,
uint16_t count,
uint8_t exclusive);
/**
* Get software defined flow type to hardware defined pctype
* mapping items.
*
* @param port
* pointer to port identifier of the device.
* @param mapping_items
* the base address of the array to store returned items.
* array should be allocated by caller with minimum size of
* RTE_PMD_I40E_FLOW_TYPE_MAX items
*/
int rte_pmd_i40e_flow_type_mapping_get(
uint8_t port,
struct rte_pmd_i40e_flow_type_mapping *mapping_items);
/**
* Reset hardware defined pctype to software defined flow type
* mapping table to default.
*
* @param port
* pointer to port identifier of the device
*/
int rte_pmd_i40e_flow_type_mapping_reset(uint8_t port);
#endif /* _PMD_I40E_H_ */

View File

@ -50,5 +50,8 @@ DPDK_17.11 {
global:
rte_pmd_i40e_add_vf_mac_addr;
rte_pmd_i40e_flow_type_mapping_update;
rte_pmd_i40e_flow_type_mapping_get;
rte_pmd_i40e_flow_type_mapping_reset;
} DPDK_17.08;