summaryrefslogtreecommitdiffstats
path: root/vnet/vnet/devices
diff options
context:
space:
mode:
authorDave Barach <dave@barachs.net>2016-01-22 08:23:09 -0500
committerDave Barach <dave@barachs.net>2016-01-22 08:23:27 -0500
commit61efa140b1f44e0c568697fbc31cf3f430131ab2 (patch)
tree780880f2fce0882840b204eb26bd7465ed7c7e09 /vnet/vnet/devices
parentbfdedbd5a3ba7e6fdc036d212253aa55c9062211 (diff)
aarch64 CPU arch / ThunderX platform initial support
Change-Id: Ia2edd3cee2c25c26c7c47a9023744b97226434c7 Signed-off-by: Dave Barach <dave@barachs.net>
Diffstat (limited to 'vnet/vnet/devices')
-rw-r--r--vnet/vnet/devices/dpdk/dpdk.h1
-rw-r--r--vnet/vnet/devices/dpdk/init.c17
-rw-r--r--vnet/vnet/devices/dpdk/node.c12
3 files changed, 30 insertions, 0 deletions
diff --git a/vnet/vnet/devices/dpdk/dpdk.h b/vnet/vnet/devices/dpdk/dpdk.h
index fd984e4d4df..bb3ef4ffba8 100644
--- a/vnet/vnet/devices/dpdk/dpdk.h
+++ b/vnet/vnet/devices/dpdk/dpdk.h
@@ -75,6 +75,7 @@ typedef enum {
} dpdk_device_type_t;
#define foreach_dpdk_pmd \
+ _ ("rte_nicvf_pmd", THUNDERX) \
_ ("rte_em_pmd", E1000EM) \
_ ("rte_igb_pmd", IGB) \
_ ("rte_igbvf_pmd", IGBVF) \
diff --git a/vnet/vnet/devices/dpdk/init.c b/vnet/vnet/devices/dpdk/init.c
index a4b0f01475f..a8e84949a52 100644
--- a/vnet/vnet/devices/dpdk/init.c
+++ b/vnet/vnet/devices/dpdk/init.c
@@ -341,6 +341,7 @@ dpdk_lib_init (dpdk_main_t * dm)
/* 10G adapters */
case VNET_DPDK_PMD_IXGBE:
case VNET_DPDK_PMD_IXGBEVF:
+ case VNET_DPDK_PMD_THUNDERX:
xd->port_type = VNET_DPDK_PORT_TYPE_ETH_10G;
xd->nb_rx_desc = DPDK_NB_RX_DESC_10GE;
xd->nb_tx_desc = DPDK_NB_TX_DESC_10GE;
@@ -1686,6 +1687,22 @@ do { \
#undef _
+/*
+ * At the moment, the ThunderX NIC driver doesn't have
+ * an entry point named "devinitfn_rte_xxx_driver"
+ */
+#define _(d) \
+do { \
+ void d(void); \
+ __attribute__((unused)) void (* volatile pf)(void); \
+ pf = d; \
+} while(0);
+
+#ifdef RTE_LIBRTE_THUNDERVNIC_PMD
+_(rte_nicvf_pmd_init)
+#endif
+#undef _
+
dm->vlib_main = vm;
dm->vnet_main = vnet_get_main();
diff --git a/vnet/vnet/devices/dpdk/node.c b/vnet/vnet/devices/dpdk/node.c
index f05c37fed52..770af2a04ac 100644
--- a/vnet/vnet/devices/dpdk/node.c
+++ b/vnet/vnet/devices/dpdk/node.c
@@ -541,6 +541,7 @@ static inline u32 dpdk_device_input ( dpdk_main_t * dm,
u32 n_trace, trace_cnt __attribute__((unused));
vlib_buffer_free_list_t * fl;
u8 efd_discard_burst = 0;
+ u16 ip_align_offset = 0;
if (xd->admin_up == 0)
return 0;
@@ -559,6 +560,9 @@ static inline u32 dpdk_device_input ( dpdk_main_t * dm,
return 0;
}
+ if (xd->pmd == VNET_DPDK_PMD_THUNDERX)
+ ip_align_offset = 6;
+
vec_reset_length (xd->d_trace_buffers);
trace_cnt = n_trace = vlib_get_trace_count (vm, node);
@@ -706,6 +710,14 @@ static inline u32 dpdk_device_input ( dpdk_main_t * dm,
b0->current_data = l3_offset0;
b0->current_length = mb->data_len - l3_offset0;
+
+ if (PREDICT_FALSE (ip_align_offset != 0))
+ {
+ if (next0 == DPDK_RX_NEXT_IP4_INPUT ||
+ next0 == DPDK_RX_NEXT_IP6_INPUT)
+ b0->current_data += ip_align_offset;
+ }
+
b0->flags = VLIB_BUFFER_TOTAL_LENGTH_VALID;
if (VMWARE_LENGTH_BUG_WORKAROUND)