1d30ea906Sjfb8856606 /* SPDX-License-Identifier: BSD-3-Clause 22bfe3f2eSlogwang * 32bfe3f2eSlogwang * Copyright (c) 2015-2016 Freescale Semiconductor, Inc. All rights reserved. 4*2d9fd380Sjfb8856606 * Copyright 2016-2020 NXP 52bfe3f2eSlogwang * 62bfe3f2eSlogwang */ 72bfe3f2eSlogwang 82bfe3f2eSlogwang #ifndef _DPAA2_ETHDEV_H 92bfe3f2eSlogwang #define _DPAA2_ETHDEV_H 102bfe3f2eSlogwang 112bfe3f2eSlogwang #include <rte_event_eth_rx_adapter.h> 124418919fSjohnjiang #include <rte_pmd_dpaa2.h> 134418919fSjohnjiang 144418919fSjohnjiang #include <dpaa2_hw_pvt.h> 152bfe3f2eSlogwang 162bfe3f2eSlogwang #include <mc/fsl_dpni.h> 172bfe3f2eSlogwang #include <mc/fsl_mc_sys.h> 182bfe3f2eSlogwang 192bfe3f2eSlogwang #define DPAA2_MIN_RX_BUF_SIZE 512 202bfe3f2eSlogwang #define DPAA2_MAX_RX_PKT_LEN 10240 /*WRIOP support*/ 212bfe3f2eSlogwang 222bfe3f2eSlogwang #define MAX_TCS DPNI_MAX_TC 234418919fSjohnjiang #define MAX_RX_QUEUES 128 242bfe3f2eSlogwang #define MAX_TX_QUEUES 16 254418919fSjohnjiang #define MAX_DPNI 8 262bfe3f2eSlogwang 27*2d9fd380Sjfb8856606 #define DPAA2_RX_DEFAULT_NBDESC 512 28*2d9fd380Sjfb8856606 292bfe3f2eSlogwang /*default tc to be used for ,congestion, distribution etc configuration. */ 302bfe3f2eSlogwang #define DPAA2_DEF_TC 0 312bfe3f2eSlogwang 322bfe3f2eSlogwang /* Threshold for a Tx queue to *Enter* Congestion state. 332bfe3f2eSlogwang */ 342bfe3f2eSlogwang #define CONG_ENTER_TX_THRESHOLD 512 352bfe3f2eSlogwang 362bfe3f2eSlogwang /* Threshold for a queue to *Exit* Congestion state. 372bfe3f2eSlogwang */ 382bfe3f2eSlogwang #define CONG_EXIT_TX_THRESHOLD 480 392bfe3f2eSlogwang 402bfe3f2eSlogwang #define CONG_RETRY_COUNT 18000 412bfe3f2eSlogwang 422bfe3f2eSlogwang /* RX queue tail drop threshold 434418919fSjohnjiang * currently considering 64 KB packets 442bfe3f2eSlogwang */ 454418919fSjohnjiang #define CONG_THRESHOLD_RX_BYTES_Q (64 * 1024) 462bfe3f2eSlogwang #define CONG_RX_OAL 128 472bfe3f2eSlogwang 482bfe3f2eSlogwang /* Size of the input SMMU mapped memory required by MC */ 492bfe3f2eSlogwang #define DIST_PARAM_IOVA_SIZE 256 502bfe3f2eSlogwang 512bfe3f2eSlogwang /* Enable TX Congestion control support 522bfe3f2eSlogwang * default is disable 532bfe3f2eSlogwang */ 542bfe3f2eSlogwang #define DPAA2_TX_CGR_OFF 0x01 552bfe3f2eSlogwang 562bfe3f2eSlogwang /* Disable RX tail drop, default is enable */ 572bfe3f2eSlogwang #define DPAA2_RX_TAILDROP_OFF 0x04 582bfe3f2eSlogwang 59d30ea906Sjfb8856606 #define DPAA2_RSS_OFFLOAD_ALL ( \ 604418919fSjohnjiang ETH_RSS_L2_PAYLOAD | \ 61d30ea906Sjfb8856606 ETH_RSS_IP | \ 62d30ea906Sjfb8856606 ETH_RSS_UDP | \ 63d30ea906Sjfb8856606 ETH_RSS_TCP | \ 64d30ea906Sjfb8856606 ETH_RSS_SCTP) 65d30ea906Sjfb8856606 66d30ea906Sjfb8856606 /* LX2 FRC Parsed values (Little Endian) */ 67d30ea906Sjfb8856606 #define DPAA2_PKT_TYPE_ETHER 0x0060 68d30ea906Sjfb8856606 #define DPAA2_PKT_TYPE_IPV4 0x0000 69d30ea906Sjfb8856606 #define DPAA2_PKT_TYPE_IPV6 0x0020 70d30ea906Sjfb8856606 #define DPAA2_PKT_TYPE_IPV4_EXT \ 71d30ea906Sjfb8856606 (0x0001 | DPAA2_PKT_TYPE_IPV4) 72d30ea906Sjfb8856606 #define DPAA2_PKT_TYPE_IPV6_EXT \ 73d30ea906Sjfb8856606 (0x0001 | DPAA2_PKT_TYPE_IPV6) 74d30ea906Sjfb8856606 #define DPAA2_PKT_TYPE_IPV4_TCP \ 75d30ea906Sjfb8856606 (0x000e | DPAA2_PKT_TYPE_IPV4) 76d30ea906Sjfb8856606 #define DPAA2_PKT_TYPE_IPV6_TCP \ 77d30ea906Sjfb8856606 (0x000e | DPAA2_PKT_TYPE_IPV6) 78d30ea906Sjfb8856606 #define DPAA2_PKT_TYPE_IPV4_UDP \ 79d30ea906Sjfb8856606 (0x0010 | DPAA2_PKT_TYPE_IPV4) 80d30ea906Sjfb8856606 #define DPAA2_PKT_TYPE_IPV6_UDP \ 81d30ea906Sjfb8856606 (0x0010 | DPAA2_PKT_TYPE_IPV6) 82d30ea906Sjfb8856606 #define DPAA2_PKT_TYPE_IPV4_SCTP \ 83d30ea906Sjfb8856606 (0x000f | DPAA2_PKT_TYPE_IPV4) 84d30ea906Sjfb8856606 #define DPAA2_PKT_TYPE_IPV6_SCTP \ 85d30ea906Sjfb8856606 (0x000f | DPAA2_PKT_TYPE_IPV6) 86d30ea906Sjfb8856606 #define DPAA2_PKT_TYPE_IPV4_ICMP \ 87d30ea906Sjfb8856606 (0x0003 | DPAA2_PKT_TYPE_IPV4_EXT) 88d30ea906Sjfb8856606 #define DPAA2_PKT_TYPE_IPV6_ICMP \ 89d30ea906Sjfb8856606 (0x0003 | DPAA2_PKT_TYPE_IPV6_EXT) 90d30ea906Sjfb8856606 #define DPAA2_PKT_TYPE_VLAN_1 0x0160 91d30ea906Sjfb8856606 #define DPAA2_PKT_TYPE_VLAN_2 0x0260 92d30ea906Sjfb8856606 934418919fSjohnjiang /* enable timestamp in mbuf*/ 94*2d9fd380Sjfb8856606 extern bool dpaa2_enable_ts[]; 95*2d9fd380Sjfb8856606 extern uint64_t dpaa2_timestamp_rx_dynflag; 96*2d9fd380Sjfb8856606 extern int dpaa2_timestamp_dynfield_offset; 974418919fSjohnjiang 984418919fSjohnjiang #define DPAA2_QOS_TABLE_RECONFIGURE 1 994418919fSjohnjiang #define DPAA2_FS_TABLE_RECONFIGURE 2 1004418919fSjohnjiang 101*2d9fd380Sjfb8856606 #define DPAA2_QOS_TABLE_IPADDR_EXTRACT 4 102*2d9fd380Sjfb8856606 #define DPAA2_FS_TABLE_IPADDR_EXTRACT 8 103*2d9fd380Sjfb8856606 104*2d9fd380Sjfb8856606 #define DPAA2_FLOW_MAX_KEY_SIZE 16 105*2d9fd380Sjfb8856606 1064418919fSjohnjiang /*Externaly defined*/ 1074418919fSjohnjiang extern const struct rte_flow_ops dpaa2_flow_ops; 1084418919fSjohnjiang extern enum rte_filter_type dpaa2_filter_type; 1094418919fSjohnjiang 110*2d9fd380Sjfb8856606 #define IP_ADDRESS_OFFSET_INVALID (-1) 111*2d9fd380Sjfb8856606 112*2d9fd380Sjfb8856606 struct dpaa2_key_info { 113*2d9fd380Sjfb8856606 uint8_t key_offset[DPKG_MAX_NUM_OF_EXTRACTS]; 114*2d9fd380Sjfb8856606 uint8_t key_size[DPKG_MAX_NUM_OF_EXTRACTS]; 115*2d9fd380Sjfb8856606 /* Special for IP address. */ 116*2d9fd380Sjfb8856606 int ipv4_src_offset; 117*2d9fd380Sjfb8856606 int ipv4_dst_offset; 118*2d9fd380Sjfb8856606 int ipv6_src_offset; 119*2d9fd380Sjfb8856606 int ipv6_dst_offset; 120*2d9fd380Sjfb8856606 uint8_t key_total_size; 121*2d9fd380Sjfb8856606 }; 122*2d9fd380Sjfb8856606 123*2d9fd380Sjfb8856606 struct dpaa2_key_extract { 124*2d9fd380Sjfb8856606 struct dpkg_profile_cfg dpkg; 125*2d9fd380Sjfb8856606 struct dpaa2_key_info key_info; 126*2d9fd380Sjfb8856606 }; 127*2d9fd380Sjfb8856606 128*2d9fd380Sjfb8856606 struct extract_s { 129*2d9fd380Sjfb8856606 struct dpaa2_key_extract qos_key_extract; 130*2d9fd380Sjfb8856606 struct dpaa2_key_extract tc_key_extract[MAX_TCS]; 131*2d9fd380Sjfb8856606 uint64_t qos_extract_param; 132*2d9fd380Sjfb8856606 uint64_t tc_extract_param[MAX_TCS]; 133*2d9fd380Sjfb8856606 }; 134*2d9fd380Sjfb8856606 1352bfe3f2eSlogwang struct dpaa2_dev_priv { 1362bfe3f2eSlogwang void *hw; 1372bfe3f2eSlogwang int32_t hw_id; 1382bfe3f2eSlogwang int32_t qdid; 1392bfe3f2eSlogwang uint16_t token; 1402bfe3f2eSlogwang uint8_t nb_tx_queues; 1412bfe3f2eSlogwang uint8_t nb_rx_queues; 1424418919fSjohnjiang uint32_t options; 1432bfe3f2eSlogwang void *rx_vq[MAX_RX_QUEUES]; 1442bfe3f2eSlogwang void *tx_vq[MAX_TX_QUEUES]; 1452bfe3f2eSlogwang struct dpaa2_bp_list *bp_list; /**<Attached buffer pool list */ 1464418919fSjohnjiang void *tx_conf_vq[MAX_TX_QUEUES]; 1474418919fSjohnjiang uint8_t tx_conf_en; 1482bfe3f2eSlogwang uint8_t max_mac_filters; 1492bfe3f2eSlogwang uint8_t max_vlan_filters; 1502bfe3f2eSlogwang uint8_t num_rx_tc; 151*2d9fd380Sjfb8856606 uint16_t qos_entries; 152*2d9fd380Sjfb8856606 uint16_t fs_entries; 153*2d9fd380Sjfb8856606 uint8_t dist_queues; 1542bfe3f2eSlogwang uint8_t flags; /*dpaa2 config flags */ 1554418919fSjohnjiang uint8_t en_ordered; 1564418919fSjohnjiang uint8_t en_loose_ordered; 1574418919fSjohnjiang uint8_t max_cgs; 1584418919fSjohnjiang uint8_t cgid_in_use[MAX_RX_QUEUES]; 1594418919fSjohnjiang 160*2d9fd380Sjfb8856606 struct extract_s extract; 1614418919fSjohnjiang 1624418919fSjohnjiang uint16_t ss_offset; 1634418919fSjohnjiang uint64_t ss_iova; 1644418919fSjohnjiang uint64_t ss_param_iova; 1654418919fSjohnjiang /*stores timestamp of last received packet on dev*/ 1664418919fSjohnjiang uint64_t rx_timestamp; 1674418919fSjohnjiang /*stores timestamp of last received tx confirmation packet on dev*/ 1684418919fSjohnjiang uint64_t tx_timestamp; 1694418919fSjohnjiang /* stores pointer to next tx_conf queue that should be processed, 1704418919fSjohnjiang * it corresponds to last packet transmitted 1714418919fSjohnjiang */ 1724418919fSjohnjiang struct dpaa2_queue *next_tx_conf_queue; 1734418919fSjohnjiang 1744418919fSjohnjiang struct rte_eth_dev *eth_dev; /**< Pointer back to holding ethdev */ 1754418919fSjohnjiang 1764418919fSjohnjiang LIST_HEAD(, rte_flow) flows; /**< Configured flow rule handles. */ 1772bfe3f2eSlogwang }; 1782bfe3f2eSlogwang 1794418919fSjohnjiang int dpaa2_distset_to_dpkg_profile_cfg(uint64_t req_dist_set, 1804418919fSjohnjiang struct dpkg_profile_cfg *kg_cfg); 1814418919fSjohnjiang 1822bfe3f2eSlogwang int dpaa2_setup_flow_dist(struct rte_eth_dev *eth_dev, 183*2d9fd380Sjfb8856606 uint64_t req_dist_set, int tc_index); 1842bfe3f2eSlogwang 1852bfe3f2eSlogwang int dpaa2_remove_flow_dist(struct rte_eth_dev *eth_dev, 1862bfe3f2eSlogwang uint8_t tc_index); 1872bfe3f2eSlogwang 1882bfe3f2eSlogwang int dpaa2_attach_bp_list(struct dpaa2_dev_priv *priv, void *blist); 1892bfe3f2eSlogwang 190*2d9fd380Sjfb8856606 __rte_internal 1912bfe3f2eSlogwang int dpaa2_eth_eventq_attach(const struct rte_eth_dev *dev, 1922bfe3f2eSlogwang int eth_rx_queue_id, 1934418919fSjohnjiang struct dpaa2_dpcon_dev *dpcon, 1942bfe3f2eSlogwang const struct rte_event_eth_rx_adapter_queue_conf *queue_conf); 1952bfe3f2eSlogwang 196*2d9fd380Sjfb8856606 __rte_internal 1972bfe3f2eSlogwang int dpaa2_eth_eventq_detach(const struct rte_eth_dev *dev, 1982bfe3f2eSlogwang int eth_rx_queue_id); 1992bfe3f2eSlogwang 2004418919fSjohnjiang uint16_t dpaa2_dev_rx(void *queue, struct rte_mbuf **bufs, uint16_t nb_pkts); 2014418919fSjohnjiang 2024418919fSjohnjiang uint16_t dpaa2_dev_loopback_rx(void *queue, struct rte_mbuf **bufs, 2034418919fSjohnjiang uint16_t nb_pkts); 2044418919fSjohnjiang 2052bfe3f2eSlogwang uint16_t dpaa2_dev_prefetch_rx(void *queue, struct rte_mbuf **bufs, 2062bfe3f2eSlogwang uint16_t nb_pkts); 2072bfe3f2eSlogwang void dpaa2_dev_process_parallel_event(struct qbman_swp *swp, 2082bfe3f2eSlogwang const struct qbman_fd *fd, 2092bfe3f2eSlogwang const struct qbman_result *dq, 2102bfe3f2eSlogwang struct dpaa2_queue *rxq, 2112bfe3f2eSlogwang struct rte_event *ev); 212d30ea906Sjfb8856606 void dpaa2_dev_process_atomic_event(struct qbman_swp *swp, 213d30ea906Sjfb8856606 const struct qbman_fd *fd, 214d30ea906Sjfb8856606 const struct qbman_result *dq, 215d30ea906Sjfb8856606 struct dpaa2_queue *rxq, 216d30ea906Sjfb8856606 struct rte_event *ev); 2174418919fSjohnjiang void dpaa2_dev_process_ordered_event(struct qbman_swp *swp, 2184418919fSjohnjiang const struct qbman_fd *fd, 2194418919fSjohnjiang const struct qbman_result *dq, 2204418919fSjohnjiang struct dpaa2_queue *rxq, 2214418919fSjohnjiang struct rte_event *ev); 2222bfe3f2eSlogwang uint16_t dpaa2_dev_tx(void *queue, struct rte_mbuf **bufs, uint16_t nb_pkts); 2234418919fSjohnjiang uint16_t dpaa2_dev_tx_ordered(void *queue, struct rte_mbuf **bufs, 2244418919fSjohnjiang uint16_t nb_pkts); 2252bfe3f2eSlogwang uint16_t dummy_dev_tx(void *queue, struct rte_mbuf **bufs, uint16_t nb_pkts); 2264418919fSjohnjiang void dpaa2_dev_free_eqresp_buf(uint16_t eqresp_ci); 2274418919fSjohnjiang void dpaa2_flow_clean(struct rte_eth_dev *dev); 228*2d9fd380Sjfb8856606 uint16_t dpaa2_dev_tx_conf(void *queue) __rte_unused; 2294418919fSjohnjiang 2304418919fSjohnjiang int dpaa2_timesync_enable(struct rte_eth_dev *dev); 2314418919fSjohnjiang int dpaa2_timesync_disable(struct rte_eth_dev *dev); 2324418919fSjohnjiang int dpaa2_timesync_read_time(struct rte_eth_dev *dev, 2334418919fSjohnjiang struct timespec *timestamp); 2344418919fSjohnjiang int dpaa2_timesync_write_time(struct rte_eth_dev *dev, 2354418919fSjohnjiang const struct timespec *timestamp); 2364418919fSjohnjiang int dpaa2_timesync_adjust_time(struct rte_eth_dev *dev, int64_t delta); 2374418919fSjohnjiang int dpaa2_timesync_read_rx_timestamp(struct rte_eth_dev *dev, 2384418919fSjohnjiang struct timespec *timestamp, 2394418919fSjohnjiang uint32_t flags __rte_unused); 2404418919fSjohnjiang int dpaa2_timesync_read_tx_timestamp(struct rte_eth_dev *dev, 2414418919fSjohnjiang struct timespec *timestamp); 2422bfe3f2eSlogwang #endif /* _DPAA2_ETHDEV_H */ 243