123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233 |
- /* SPDX-License-Identifier: GPL-2.0 */
- /*
- * Copyright (C) 2020 Marvell International Ltd.
- *
- * Interface to the hardware Input Packet Data unit.
- */
- #ifndef __CVMX_IPD_H__
- #define __CVMX_IPD_H__
- #include "cvmx-pki.h"
- /* CSR typedefs have been moved to cvmx-ipd-defs.h */
- typedef cvmx_ipd_1st_mbuff_skip_t cvmx_ipd_mbuff_not_first_skip_t;
- typedef cvmx_ipd_1st_next_ptr_back_t cvmx_ipd_second_next_ptr_back_t;
- typedef struct cvmx_ipd_tag_fields {
- u64 ipv6_src_ip : 1;
- u64 ipv6_dst_ip : 1;
- u64 ipv6_src_port : 1;
- u64 ipv6_dst_port : 1;
- u64 ipv6_next_header : 1;
- u64 ipv4_src_ip : 1;
- u64 ipv4_dst_ip : 1;
- u64 ipv4_src_port : 1;
- u64 ipv4_dst_port : 1;
- u64 ipv4_protocol : 1;
- u64 input_port : 1;
- } cvmx_ipd_tag_fields_t;
- typedef struct cvmx_pip_port_config {
- u64 parse_mode;
- u64 tag_type;
- u64 tag_mode;
- cvmx_ipd_tag_fields_t tag_fields;
- } cvmx_pip_port_config_t;
- typedef struct cvmx_ipd_config_struct {
- u64 first_mbuf_skip;
- u64 not_first_mbuf_skip;
- u64 ipd_enable;
- u64 enable_len_M8_fix;
- u64 cache_mode;
- cvmx_fpa_pool_config_t packet_pool;
- cvmx_fpa_pool_config_t wqe_pool;
- cvmx_pip_port_config_t port_config;
- } cvmx_ipd_config_t;
- extern cvmx_ipd_config_t cvmx_ipd_cfg;
- /**
- * Gets the fpa pool number of packet pool
- */
- static inline s64 cvmx_fpa_get_packet_pool(void)
- {
- return (cvmx_ipd_cfg.packet_pool.pool_num);
- }
- /**
- * Gets the buffer size of packet pool buffer
- */
- static inline u64 cvmx_fpa_get_packet_pool_block_size(void)
- {
- return (cvmx_ipd_cfg.packet_pool.buffer_size);
- }
- /**
- * Gets the buffer count of packet pool
- */
- static inline u64 cvmx_fpa_get_packet_pool_buffer_count(void)
- {
- return (cvmx_ipd_cfg.packet_pool.buffer_count);
- }
- /**
- * Gets the fpa pool number of wqe pool
- */
- static inline s64 cvmx_fpa_get_wqe_pool(void)
- {
- return (cvmx_ipd_cfg.wqe_pool.pool_num);
- }
- /**
- * Gets the buffer size of wqe pool buffer
- */
- static inline u64 cvmx_fpa_get_wqe_pool_block_size(void)
- {
- return (cvmx_ipd_cfg.wqe_pool.buffer_size);
- }
- /**
- * Gets the buffer count of wqe pool
- */
- static inline u64 cvmx_fpa_get_wqe_pool_buffer_count(void)
- {
- return (cvmx_ipd_cfg.wqe_pool.buffer_count);
- }
- /**
- * Sets the ipd related configuration in internal structure which is then used
- * for seting IPD hardware block
- */
- int cvmx_ipd_set_config(cvmx_ipd_config_t ipd_config);
- /**
- * Gets the ipd related configuration from internal structure.
- */
- void cvmx_ipd_get_config(cvmx_ipd_config_t *ipd_config);
- /**
- * Sets the internal FPA pool data structure for packet buffer pool.
- * @param pool fpa pool number yo use
- * @param buffer_size buffer size of pool
- * @param buffer_count number of buufers to allocate to pool
- */
- void cvmx_ipd_set_packet_pool_config(s64 pool, u64 buffer_size, u64 buffer_count);
- /**
- * Sets the internal FPA pool data structure for wqe pool.
- * @param pool fpa pool number yo use
- * @param buffer_size buffer size of pool
- * @param buffer_count number of buufers to allocate to pool
- */
- void cvmx_ipd_set_wqe_pool_config(s64 pool, u64 buffer_size, u64 buffer_count);
- /**
- * Gets the FPA packet buffer pool parameters.
- */
- static inline void cvmx_fpa_get_packet_pool_config(s64 *pool, u64 *buffer_size, u64 *buffer_count)
- {
- if (pool)
- *pool = cvmx_ipd_cfg.packet_pool.pool_num;
- if (buffer_size)
- *buffer_size = cvmx_ipd_cfg.packet_pool.buffer_size;
- if (buffer_count)
- *buffer_count = cvmx_ipd_cfg.packet_pool.buffer_count;
- }
- /**
- * Sets the FPA packet buffer pool parameters.
- */
- static inline void cvmx_fpa_set_packet_pool_config(s64 pool, u64 buffer_size, u64 buffer_count)
- {
- cvmx_ipd_set_packet_pool_config(pool, buffer_size, buffer_count);
- }
- /**
- * Gets the FPA WQE pool parameters.
- */
- static inline void cvmx_fpa_get_wqe_pool_config(s64 *pool, u64 *buffer_size, u64 *buffer_count)
- {
- if (pool)
- *pool = cvmx_ipd_cfg.wqe_pool.pool_num;
- if (buffer_size)
- *buffer_size = cvmx_ipd_cfg.wqe_pool.buffer_size;
- if (buffer_count)
- *buffer_count = cvmx_ipd_cfg.wqe_pool.buffer_count;
- }
- /**
- * Sets the FPA WQE pool parameters.
- */
- static inline void cvmx_fpa_set_wqe_pool_config(s64 pool, u64 buffer_size, u64 buffer_count)
- {
- cvmx_ipd_set_wqe_pool_config(pool, buffer_size, buffer_count);
- }
- /**
- * Configure IPD
- *
- * @param mbuff_size Packets buffer size in 8 byte words
- * @param first_mbuff_skip
- * Number of 8 byte words to skip in the first buffer
- * @param not_first_mbuff_skip
- * Number of 8 byte words to skip in each following buffer
- * @param first_back Must be same as first_mbuff_skip / 128
- * @param second_back
- * Must be same as not_first_mbuff_skip / 128
- * @param wqe_fpa_pool
- * FPA pool to get work entries from
- * @param cache_mode
- * @param back_pres_enable_flag
- * Enable or disable port back pressure at a global level.
- * This should always be 1 as more accurate control can be
- * found in IPD_PORTX_BP_PAGE_CNT[BP_ENB].
- */
- void cvmx_ipd_config(u64 mbuff_size, u64 first_mbuff_skip, u64 not_first_mbuff_skip, u64 first_back,
- u64 second_back, u64 wqe_fpa_pool, cvmx_ipd_mode_t cache_mode,
- u64 back_pres_enable_flag);
- /**
- * Enable IPD
- */
- void cvmx_ipd_enable(void);
- /**
- * Disable IPD
- */
- void cvmx_ipd_disable(void);
- void __cvmx_ipd_free_ptr(void);
- void cvmx_ipd_set_packet_pool_buffer_count(u64 buffer_count);
- void cvmx_ipd_set_wqe_pool_buffer_count(u64 buffer_count);
- /**
- * Setup Random Early Drop on a specific input queue
- *
- * @param queue Input queue to setup RED on (0-7)
- * @param pass_thresh
- * Packets will begin slowly dropping when there are less than
- * this many packet buffers free in FPA 0.
- * @param drop_thresh
- * All incoming packets will be dropped when there are less
- * than this many free packet buffers in FPA 0.
- * Return: Zero on success. Negative on failure
- */
- int cvmx_ipd_setup_red_queue(int queue, int pass_thresh, int drop_thresh);
- /**
- * Setup Random Early Drop to automatically begin dropping packets.
- *
- * @param pass_thresh
- * Packets will begin slowly dropping when there are less than
- * this many packet buffers free in FPA 0.
- * @param drop_thresh
- * All incoming packets will be dropped when there are less
- * than this many free packet buffers in FPA 0.
- * Return: Zero on success. Negative on failure
- */
- int cvmx_ipd_setup_red(int pass_thresh, int drop_thresh);
- #endif /* __CVMX_IPD_H__ */
|