net/ixgbe: add API for VF management
Add APIs to configure and manage VFs on an Intel 82559 NIC. add rte_pmd_ixgbe_set_vf_vlan_anti_spoof function. add rte_pmd_ixgbe_set_vf_mac_anti_spoof function. add rte_pmd_ixgbe_set_vf_stripq function. Signed-off-by: Alex Zelezniak <alexz@att.com> add rte_pmd_ixgbe_set_vf_vlan_insert function. add rte_pmd_ixgbe_set_tx_loopback function. add rte_pmd_ixgbe_set_all_queues_drop function. add rte_pmd_ixgbe_set_vf_split_drop_en function. add rte_pmd_ixgbe_set_vf_mac_addr function. Signed-off-by: Bernard Iremonger <bernard.iremonger@intel.com>
This commit is contained in:
parent
e9261d5731
commit
49e248223e
@ -1,6 +1,6 @@
|
||||
# BSD LICENSE
|
||||
#
|
||||
# Copyright(c) 2010-2015 Intel Corporation. All rights reserved.
|
||||
# Copyright(c) 2010-2016 Intel Corporation. All rights reserved.
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
@ -119,6 +119,8 @@ SRCS-$(CONFIG_RTE_LIBRTE_IXGBE_PMD) += ixgbe_bypass.c
|
||||
SRCS-$(CONFIG_RTE_LIBRTE_IXGBE_PMD) += ixgbe_82599_bypass.c
|
||||
endif
|
||||
|
||||
# install this header file
|
||||
SYMLINK-$(CONFIG_RTE_LIBRTE_IXGBE_PMD)-include := rte_pmd_ixgbe.h
|
||||
|
||||
# this lib depends upon:
|
||||
DEPDIRS-$(CONFIG_RTE_LIBRTE_IXGBE_PMD) += lib/librte_eal lib/librte_ether
|
||||
|
@ -72,6 +72,8 @@
|
||||
#include "base/ixgbe_phy.h"
|
||||
#include "ixgbe_regs.h"
|
||||
|
||||
#include "rte_pmd_ixgbe.h"
|
||||
|
||||
/*
|
||||
* High threshold controlling when to start sending XOFF frames. Must be at
|
||||
* least 8 bytes less than receive packet buffer size. This value is in units
|
||||
@ -4046,6 +4048,38 @@ ixgbe_set_default_mac_addr(struct rte_eth_dev *dev, struct ether_addr *addr)
|
||||
ixgbe_add_rar(dev, addr, 0, 0);
|
||||
}
|
||||
|
||||
int
|
||||
rte_pmd_ixgbe_set_vf_mac_addr(uint8_t port, uint16_t vf,
|
||||
struct ether_addr *mac_addr)
|
||||
{
|
||||
struct ixgbe_hw *hw;
|
||||
struct ixgbe_vf_info *vfinfo;
|
||||
int rar_entry;
|
||||
uint8_t *new_mac = (uint8_t *)(mac_addr);
|
||||
struct rte_eth_dev *dev;
|
||||
struct rte_eth_dev_info dev_info;
|
||||
|
||||
RTE_ETH_VALID_PORTID_OR_ERR_RET(port, -ENODEV);
|
||||
|
||||
dev = &rte_eth_devices[port];
|
||||
rte_eth_dev_info_get(port, &dev_info);
|
||||
|
||||
if (vf >= dev_info.max_vfs)
|
||||
return -EINVAL;
|
||||
|
||||
hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
|
||||
vfinfo = *(IXGBE_DEV_PRIVATE_TO_P_VFDATA(dev->data->dev_private));
|
||||
rar_entry = hw->mac.num_rar_entries - (vf + 1);
|
||||
|
||||
if (is_valid_assigned_ether_addr((struct ether_addr *)new_mac)) {
|
||||
rte_memcpy(vfinfo[vf].vf_mac_addresses, new_mac,
|
||||
ETHER_ADDR_LEN);
|
||||
return hw->mac.ops.set_rar(hw, rar_entry, new_mac, vf,
|
||||
IXGBE_RAH_AV);
|
||||
}
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
static int
|
||||
ixgbe_dev_mtu_set(struct rte_eth_dev *dev, uint16_t mtu)
|
||||
{
|
||||
@ -4639,6 +4673,216 @@ ixgbe_set_pool_vlan_filter(struct rte_eth_dev *dev, uint16_t vlan,
|
||||
return ret;
|
||||
}
|
||||
|
||||
int
|
||||
rte_pmd_ixgbe_set_vf_vlan_anti_spoof(uint8_t port, uint16_t vf, uint8_t on)
|
||||
{
|
||||
struct ixgbe_hw *hw;
|
||||
struct ixgbe_mac_info *mac;
|
||||
struct rte_eth_dev *dev;
|
||||
struct rte_eth_dev_info dev_info;
|
||||
|
||||
RTE_ETH_VALID_PORTID_OR_ERR_RET(port, -ENODEV);
|
||||
|
||||
dev = &rte_eth_devices[port];
|
||||
rte_eth_dev_info_get(port, &dev_info);
|
||||
|
||||
if (vf >= dev_info.max_vfs)
|
||||
return -EINVAL;
|
||||
|
||||
if (on > 1)
|
||||
return -EINVAL;
|
||||
|
||||
hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
|
||||
mac = &hw->mac;
|
||||
|
||||
mac->ops.set_vlan_anti_spoofing(hw, on, vf);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
rte_pmd_ixgbe_set_vf_mac_anti_spoof(uint8_t port, uint16_t vf, uint8_t on)
|
||||
{
|
||||
struct ixgbe_hw *hw;
|
||||
struct ixgbe_mac_info *mac;
|
||||
struct rte_eth_dev *dev;
|
||||
struct rte_eth_dev_info dev_info;
|
||||
|
||||
RTE_ETH_VALID_PORTID_OR_ERR_RET(port, -ENODEV);
|
||||
|
||||
dev = &rte_eth_devices[port];
|
||||
rte_eth_dev_info_get(port, &dev_info);
|
||||
|
||||
if (vf >= dev_info.max_vfs)
|
||||
return -EINVAL;
|
||||
|
||||
if (on > 1)
|
||||
return -EINVAL;
|
||||
|
||||
hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
|
||||
mac = &hw->mac;
|
||||
mac->ops.set_mac_anti_spoofing(hw, on, vf);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
rte_pmd_ixgbe_set_vf_vlan_insert(uint8_t port, uint16_t vf, uint8_t on)
|
||||
{
|
||||
struct ixgbe_hw *hw;
|
||||
uint32_t ctrl;
|
||||
struct rte_eth_dev *dev;
|
||||
struct rte_eth_dev_info dev_info;
|
||||
|
||||
RTE_ETH_VALID_PORTID_OR_ERR_RET(port, -ENODEV);
|
||||
|
||||
dev = &rte_eth_devices[port];
|
||||
rte_eth_dev_info_get(port, &dev_info);
|
||||
|
||||
if (vf >= dev_info.max_vfs)
|
||||
return -EINVAL;
|
||||
|
||||
if (on > 1)
|
||||
return -EINVAL;
|
||||
|
||||
hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
|
||||
ctrl = IXGBE_READ_REG(hw, IXGBE_VMVIR(vf));
|
||||
if (on) {
|
||||
ctrl = on;
|
||||
ctrl |= IXGBE_VMVIR_VLANA_DEFAULT;
|
||||
} else {
|
||||
ctrl = 0;
|
||||
}
|
||||
|
||||
IXGBE_WRITE_REG(hw, IXGBE_VMVIR(vf), ctrl);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
rte_pmd_ixgbe_set_tx_loopback(uint8_t port, uint8_t on)
|
||||
{
|
||||
struct ixgbe_hw *hw;
|
||||
uint32_t ctrl;
|
||||
struct rte_eth_dev *dev;
|
||||
|
||||
RTE_ETH_VALID_PORTID_OR_ERR_RET(port, -ENODEV);
|
||||
|
||||
dev = &rte_eth_devices[port];
|
||||
|
||||
if (on > 1)
|
||||
return -EINVAL;
|
||||
|
||||
hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
|
||||
ctrl = IXGBE_READ_REG(hw, IXGBE_PFDTXGSWC);
|
||||
/* enable or disable VMDQ loopback */
|
||||
if (on)
|
||||
ctrl |= IXGBE_PFDTXGSWC_VT_LBEN;
|
||||
else
|
||||
ctrl &= ~IXGBE_PFDTXGSWC_VT_LBEN;
|
||||
|
||||
IXGBE_WRITE_REG(hw, IXGBE_PFDTXGSWC, ctrl);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
rte_pmd_ixgbe_set_all_queues_drop_en(uint8_t port, uint8_t on)
|
||||
{
|
||||
struct ixgbe_hw *hw;
|
||||
uint32_t reg_value;
|
||||
int i;
|
||||
int num_queues = (int)(IXGBE_QDE_IDX_MASK >> IXGBE_QDE_IDX_SHIFT);
|
||||
struct rte_eth_dev *dev;
|
||||
|
||||
RTE_ETH_VALID_PORTID_OR_ERR_RET(port, -ENODEV);
|
||||
|
||||
dev = &rte_eth_devices[port];
|
||||
|
||||
if (on > 1)
|
||||
return -EINVAL;
|
||||
|
||||
hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
|
||||
for (i = 0; i <= num_queues; i++) {
|
||||
reg_value = IXGBE_QDE_WRITE |
|
||||
(i << IXGBE_QDE_IDX_SHIFT) |
|
||||
(on & IXGBE_QDE_ENABLE);
|
||||
IXGBE_WRITE_REG(hw, IXGBE_QDE, reg_value);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
rte_pmd_ixgbe_set_vf_split_drop_en(uint8_t port, uint16_t vf, uint8_t on)
|
||||
{
|
||||
struct ixgbe_hw *hw;
|
||||
uint32_t reg_value;
|
||||
struct rte_eth_dev *dev;
|
||||
struct rte_eth_dev_info dev_info;
|
||||
|
||||
RTE_ETH_VALID_PORTID_OR_ERR_RET(port, -ENODEV);
|
||||
|
||||
dev = &rte_eth_devices[port];
|
||||
rte_eth_dev_info_get(port, &dev_info);
|
||||
|
||||
/* only support VF's 0 to 63 */
|
||||
if ((vf >= dev_info.max_vfs) || (vf > 63))
|
||||
return -EINVAL;
|
||||
|
||||
if (on > 1)
|
||||
return -EINVAL;
|
||||
|
||||
hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
|
||||
reg_value = IXGBE_READ_REG(hw, IXGBE_SRRCTL(vf));
|
||||
if (on)
|
||||
reg_value |= IXGBE_SRRCTL_DROP_EN;
|
||||
else
|
||||
reg_value &= ~IXGBE_SRRCTL_DROP_EN;
|
||||
|
||||
IXGBE_WRITE_REG(hw, IXGBE_SRRCTL(vf), reg_value);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
rte_pmd_ixgbe_set_vf_vlan_stripq(uint8_t port, uint16_t vf, uint8_t on)
|
||||
{
|
||||
struct rte_eth_dev *dev;
|
||||
struct rte_eth_dev_info dev_info;
|
||||
uint16_t queues_per_pool;
|
||||
uint32_t q;
|
||||
|
||||
RTE_ETH_VALID_PORTID_OR_ERR_RET(port, -ENODEV);
|
||||
|
||||
dev = &rte_eth_devices[port];
|
||||
rte_eth_dev_info_get(port, &dev_info);
|
||||
|
||||
if (vf >= dev_info.max_vfs)
|
||||
return -EINVAL;
|
||||
|
||||
if (on > 1)
|
||||
return -EINVAL;
|
||||
|
||||
RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->vlan_strip_queue_set, -ENOTSUP);
|
||||
|
||||
/* The PF has 128 queue pairs and in SRIOV configuration
|
||||
* those queues will be assigned to VF's, so RXDCTL
|
||||
* registers will be dealing with queues which will be
|
||||
* assigned to VF's.
|
||||
* Let's say we have SRIOV configured with 31 VF's then the
|
||||
* first 124 queues 0-123 will be allocated to VF's and only
|
||||
* the last 4 queues 123-127 will be assigned to the PF.
|
||||
*/
|
||||
|
||||
queues_per_pool = dev_info.vmdq_queue_num / dev_info.max_vmdq_pools;
|
||||
|
||||
for (q = 0; q < queues_per_pool; q++)
|
||||
(*dev->dev_ops->vlan_strip_queue_set)(dev,
|
||||
q + vf * queues_per_pool, on);
|
||||
return 0;
|
||||
}
|
||||
|
||||
#define IXGBE_MRCTL_VPME 0x01 /* Virtual Pool Mirroring. */
|
||||
#define IXGBE_MRCTL_UPME 0x02 /* Uplink Port Mirroring. */
|
||||
#define IXGBE_MRCTL_DPME 0x04 /* Downlink Port Mirroring. */
|
||||
|
183
drivers/net/ixgbe/rte_pmd_ixgbe.h
Normal file
183
drivers/net/ixgbe/rte_pmd_ixgbe.h
Normal file
@ -0,0 +1,183 @@
|
||||
/*-
|
||||
* BSD LICENSE
|
||||
*
|
||||
* Copyright (c) 2016 Intel Corporation. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in
|
||||
* the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
* * Neither the name of Intel Corporation nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @file rte_pmd_ixgbe.h
|
||||
* ixgbe PMD specific functions.
|
||||
*
|
||||
**/
|
||||
|
||||
#ifndef _PMD_IXGBE_H_
|
||||
#define _PMD_IXGBE_H_
|
||||
|
||||
#include <rte_ethdev.h>
|
||||
|
||||
/**
|
||||
* Set the VF MAC address.
|
||||
*
|
||||
* @param port
|
||||
* The port identifier of the Ethernet device.
|
||||
* @param vf
|
||||
* VF id.
|
||||
* @param mac_addr
|
||||
* VF MAC address.
|
||||
* @return
|
||||
* - (0) if successful.
|
||||
* - (-ENODEV) if *port* invalid.
|
||||
* - (-EINVAL) if *vf* or *mac_addr* is invalid.
|
||||
*/
|
||||
int rte_pmd_ixgbe_set_vf_mac_addr(uint8_t port, uint16_t vf,
|
||||
struct ether_addr *mac_addr);
|
||||
|
||||
/**
|
||||
* Enable/Disable VF VLAN anti spoofing.
|
||||
*
|
||||
* @param port
|
||||
* The port identifier of the Ethernet device.
|
||||
* @param vf
|
||||
* VF on which to set VLAN anti spoofing.
|
||||
* @param on
|
||||
* 1 - Enable VFs VLAN anti spoofing.
|
||||
* 0 - Disable VFs VLAN anti spoofing.
|
||||
* @return
|
||||
* - (0) if successful.
|
||||
* - (-ENODEV) if *port* invalid.
|
||||
* - (-EINVAL) if bad parameter.
|
||||
*/
|
||||
int rte_pmd_ixgbe_set_vf_vlan_anti_spoof(uint8_t port, uint16_t vf, uint8_t on);
|
||||
|
||||
/**
|
||||
* Enable/Disable VF MAC anti spoofing.
|
||||
*
|
||||
* @param port
|
||||
* The port identifier of the Ethernet device.
|
||||
* @param vf
|
||||
* VF on which to set MAC anti spoofing.
|
||||
* @param on
|
||||
* 1 - Enable VFs MAC anti spoofing.
|
||||
* 0 - Disable VFs MAC anti spoofing.
|
||||
* @return
|
||||
* - (0) if successful.
|
||||
* - (-ENODEV) if *port* invalid.
|
||||
* - (-EINVAL) if bad parameter.
|
||||
*/
|
||||
int rte_pmd_ixgbe_set_vf_mac_anti_spoof(uint8_t port, uint16_t vf, uint8_t on);
|
||||
|
||||
/**
|
||||
* Enable/Disable vf vlan insert
|
||||
*
|
||||
* @param port
|
||||
* The port identifier of the Ethernet device.
|
||||
* @param vf
|
||||
* ID specifying VF.
|
||||
* @param on
|
||||
* 1 - Enable VF's vlan insert.
|
||||
* 0 - Disable VF's vlan insert
|
||||
*
|
||||
* @return
|
||||
* - (0) if successful.
|
||||
* - (-ENODEV) if *port* invalid.
|
||||
* - (-EINVAL) if bad parameter.
|
||||
*/
|
||||
int rte_pmd_ixgbe_set_vf_vlan_insert(uint8_t port, uint16_t vf, uint8_t on);
|
||||
|
||||
/**
|
||||
* Enable/Disable tx loopback
|
||||
*
|
||||
* @param port
|
||||
* The port identifier of the Ethernet device.
|
||||
* @param on
|
||||
* 1 - Enable tx loopback.
|
||||
* 0 - Disable tx loopback.
|
||||
*
|
||||
* @return
|
||||
* - (0) if successful.
|
||||
* - (-ENODEV) if *port* invalid.
|
||||
* - (-EINVAL) if bad parameter.
|
||||
*/
|
||||
int rte_pmd_ixgbe_set_tx_loopback(uint8_t port, uint8_t on);
|
||||
|
||||
/**
|
||||
* set all queues drop enable bit
|
||||
*
|
||||
* @param port
|
||||
* The port identifier of the Ethernet device.
|
||||
* @param on
|
||||
* 1 - set the queue drop enable bit for all pools.
|
||||
* 0 - reset the queue drop enable bit for all pools.
|
||||
*
|
||||
* @return
|
||||
* - (0) if successful.
|
||||
* - (-ENODEV) if *port* invalid.
|
||||
* - (-EINVAL) if bad parameter.
|
||||
*/
|
||||
int rte_pmd_ixgbe_set_all_queues_drop_en(uint8_t port, uint8_t on);
|
||||
|
||||
/**
|
||||
* set drop enable bit in the VF split rx control register
|
||||
*
|
||||
* @param port
|
||||
* The port identifier of the Ethernet device.
|
||||
* @param vf
|
||||
* ID specifying VF.
|
||||
* @param on
|
||||
* 1 - set the drop enable bit in the split rx control register.
|
||||
* 0 - reset the drop enable bit in the split rx control register.
|
||||
*
|
||||
* @return
|
||||
* - (0) if successful.
|
||||
* - (-ENODEV) if *port* invalid.
|
||||
* - (-EINVAL) if bad parameter.
|
||||
*/
|
||||
|
||||
int rte_pmd_ixgbe_set_vf_split_drop_en(uint8_t port, uint16_t vf, uint8_t on);
|
||||
|
||||
/**
|
||||
* Enable/Disable vf vlan strip for all queues in a pool
|
||||
*
|
||||
* @param port
|
||||
* The port identifier of the Ethernet device.
|
||||
* @param vf
|
||||
* ID specifying VF.
|
||||
* @param on
|
||||
* 1 - Enable VF's vlan strip on RX queues.
|
||||
* 0 - Disable VF's vlan strip on RX queues.
|
||||
*
|
||||
* @return
|
||||
* - (0) if successful.
|
||||
* - (-ENOTSUP) if hardware doesn't support this feature.
|
||||
* - (-ENODEV) if *port* invalid.
|
||||
* - (-EINVAL) if bad parameter.
|
||||
*/
|
||||
int
|
||||
rte_pmd_ixgbe_set_vf_vlan_stripq(uint8_t port, uint16_t vf, uint8_t on);
|
||||
#endif /* _PMD_IXGBE_H_ */
|
@ -2,3 +2,16 @@ DPDK_2.0 {
|
||||
|
||||
local: *;
|
||||
};
|
||||
|
||||
DPDK_16.11 {
|
||||
global:
|
||||
|
||||
rte_pmd_ixgbe_set_all_queues_drop_en;
|
||||
rte_pmd_ixgbe_set_tx_loopback;
|
||||
rte_pmd_ixgbe_set_vf_mac_addr;
|
||||
rte_pmd_ixgbe_set_vf_mac_anti_spoof;
|
||||
rte_pmd_ixgbe_set_vf_split_drop_en;
|
||||
rte_pmd_ixgbe_set_vf_vlan_anti_spoof;
|
||||
rte_pmd_ixgbe_set_vf_vlan_insert;
|
||||
rte_pmd_ixgbe_set_vf_vlan_stripq;
|
||||
} DPDK_2.0;
|
||||
|
Loading…
Reference in New Issue
Block a user