2020-12-11 16:05:24 +00:00
|
|
|
|
/* SPDX-License-Identifier: GPL-2.0 */
|
|
|
|
|
/*
|
|
|
|
|
* Copyright (C) 2020 Marvell International Ltd.
|
|
|
|
|
*
|
|
|
|
|
* Helper functions for PKI
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
#ifndef __CVMX_HELPER_PKI_H__
|
|
|
|
|
#define __CVMX_HELPER_PKI_H__
|
|
|
|
|
|
|
|
|
|
#include "cvmx-pki.h"
|
|
|
|
|
|
|
|
|
|
/* Modify this if more than 8 ilk channels need to be supported */
|
|
|
|
|
#define CVMX_MAX_PORT_PER_INTERFACE 64
|
|
|
|
|
#define CVMX_MAX_QOS_PRIORITY 64
|
|
|
|
|
#define CVMX_PKI_FIND_AVAILABLE_RSRC (-1)
|
|
|
|
|
|
|
|
|
|
struct cvmx_pki_qos_schd {
|
|
|
|
|
cvmx_fpa3_gaura_t _aura;
|
|
|
|
|
cvmx_fpa3_pool_t _pool;
|
|
|
|
|
bool pool_per_qos;
|
|
|
|
|
int pool_num;
|
|
|
|
|
char *pool_name;
|
|
|
|
|
u64 pool_buff_size;
|
|
|
|
|
u64 pool_max_buff;
|
|
|
|
|
bool aura_per_qos;
|
|
|
|
|
int aura_num;
|
|
|
|
|
char *aura_name;
|
|
|
|
|
u64 aura_buff_cnt;
|
|
|
|
|
bool sso_grp_per_qos;
|
|
|
|
|
int sso_grp;
|
|
|
|
|
u16 port_add;
|
|
|
|
|
int qpg_base;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
struct cvmx_pki_prt_schd {
|
|
|
|
|
cvmx_fpa3_pool_t _pool;
|
|
|
|
|
cvmx_fpa3_gaura_t _aura;
|
|
|
|
|
bool cfg_port;
|
|
|
|
|
int style;
|
|
|
|
|
bool pool_per_prt;
|
|
|
|
|
int pool_num;
|
|
|
|
|
char *pool_name;
|
|
|
|
|
u64 pool_buff_size;
|
|
|
|
|
u64 pool_max_buff;
|
|
|
|
|
bool aura_per_prt;
|
|
|
|
|
int aura_num;
|
|
|
|
|
char *aura_name;
|
|
|
|
|
u64 aura_buff_cnt;
|
|
|
|
|
bool sso_grp_per_prt;
|
|
|
|
|
int sso_grp;
|
|
|
|
|
enum cvmx_pki_qpg_qos qpg_qos;
|
|
|
|
|
int qpg_base;
|
|
|
|
|
struct cvmx_pki_qos_schd qos_s[CVMX_MAX_QOS_PRIORITY];
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
struct cvmx_pki_intf_schd {
|
|
|
|
|
cvmx_fpa3_pool_t _pool;
|
|
|
|
|
cvmx_fpa3_gaura_t _aura;
|
|
|
|
|
bool style_per_intf;
|
|
|
|
|
int style;
|
|
|
|
|
bool pool_per_intf;
|
|
|
|
|
int pool_num;
|
|
|
|
|
char *pool_name;
|
|
|
|
|
u64 pool_buff_size;
|
|
|
|
|
u64 pool_max_buff;
|
|
|
|
|
bool aura_per_intf;
|
|
|
|
|
int aura_num;
|
|
|
|
|
char *aura_name;
|
|
|
|
|
u64 aura_buff_cnt;
|
|
|
|
|
bool sso_grp_per_intf;
|
|
|
|
|
int sso_grp;
|
|
|
|
|
bool qos_share_aura;
|
|
|
|
|
bool qos_share_grp;
|
|
|
|
|
int qpg_base;
|
|
|
|
|
struct cvmx_pki_prt_schd prt_s[CVMX_MAX_PORT_PER_INTERFACE];
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
struct cvmx_pki_global_schd {
|
|
|
|
|
bool setup_pool;
|
|
|
|
|
int pool_num;
|
|
|
|
|
char *pool_name;
|
|
|
|
|
u64 pool_buff_size;
|
|
|
|
|
u64 pool_max_buff;
|
|
|
|
|
bool setup_aura;
|
|
|
|
|
int aura_num;
|
|
|
|
|
char *aura_name;
|
|
|
|
|
u64 aura_buff_cnt;
|
|
|
|
|
bool setup_sso_grp;
|
|
|
|
|
int sso_grp;
|
|
|
|
|
cvmx_fpa3_pool_t _pool;
|
|
|
|
|
cvmx_fpa3_gaura_t _aura;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
struct cvmx_pki_legacy_qos_watcher {
|
|
|
|
|
bool configured;
|
|
|
|
|
enum cvmx_pki_term field;
|
|
|
|
|
u32 data;
|
|
|
|
|
u32 data_mask;
|
|
|
|
|
u8 advance;
|
|
|
|
|
u8 sso_grp;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
extern bool cvmx_pki_dflt_init[CVMX_MAX_NODES];
|
|
|
|
|
|
|
|
|
|
extern struct cvmx_pki_pool_config pki_dflt_pool[CVMX_MAX_NODES];
|
|
|
|
|
extern struct cvmx_pki_aura_config pki_dflt_aura[CVMX_MAX_NODES];
|
|
|
|
|
extern struct cvmx_pki_style_config pki_dflt_style[CVMX_MAX_NODES];
|
|
|
|
|
extern struct cvmx_pki_pkind_config pki_dflt_pkind[CVMX_MAX_NODES];
|
|
|
|
|
extern u64 pkind_style_map[CVMX_MAX_NODES][CVMX_PKI_NUM_PKIND];
|
|
|
|
|
extern struct cvmx_pki_sso_grp_config pki_dflt_sso_grp[CVMX_MAX_NODES];
|
|
|
|
|
extern struct cvmx_pki_legacy_qos_watcher qos_watcher[8];
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* This function Enabled the PKI hardware to
|
|
|
|
|
* start accepting/processing packets.
|
|
|
|
|
* @param node node number
|
|
|
|
|
*/
|
|
|
|
|
void cvmx_helper_pki_enable(int node);
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* This function frees up PKI resources consumed by that port.
|
|
|
|
|
* This function should only be called if port resources
|
|
|
|
|
* (fpa pools aura, style qpg entry pcam entry etc.) are not shared
|
|
|
|
|
* @param xipd_port ipd port number for which resources need to
|
|
|
|
|
* be freed.
|
|
|
|
|
*/
|
|
|
|
|
int cvmx_helper_pki_port_shutdown(int xipd_port);
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* This function shuts down complete PKI hardware
|
|
|
|
|
* and software resources.
|
|
|
|
|
* @param node node number where PKI needs to shutdown.
|
|
|
|
|
*/
|
|
|
|
|
void cvmx_helper_pki_shutdown(int node);
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* This function calculates how mant qpf entries will be needed for
|
|
|
|
|
* a particular QOS.
|
|
|
|
|
* @param qpg_qos qos value for which entries need to be calculated.
|
|
|
|
|
*/
|
|
|
|
|
int cvmx_helper_pki_get_num_qpg_entry(enum cvmx_pki_qpg_qos qpg_qos);
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* This function setups the qos table by allocating qpg entry and writing
|
|
|
|
|
* the provided parameters to that entry (offset).
|
|
|
|
|
* @param node node number.
|
|
|
|
|
* @param qpg_cfg pointer to struct containing qpg configuration
|
|
|
|
|
*/
|
|
|
|
|
int cvmx_helper_pki_set_qpg_entry(int node, struct cvmx_pki_qpg_config *qpg_cfg);
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* This function sets up aura QOS for RED, backpressure and tail-drop.
|
|
|
|
|
*
|
|
|
|
|
* @param node node number.
|
|
|
|
|
* @param aura aura to configure.
|
|
|
|
|
* @param ena_red enable RED based on [DROP] and [PASS] levels
|
|
|
|
|
* 1: enable 0:disable
|
|
|
|
|
* @param pass_thresh pass threshold for RED.
|
|
|
|
|
* @param drop_thresh drop threshold for RED
|
|
|
|
|
* @param ena_bp enable backpressure based on [BP] level.
|
|
|
|
|
* 1:enable 0:disable
|
|
|
|
|
* @param bp_thresh backpressure threshold.
|
|
|
|
|
* @param ena_drop enable tail drop.
|
|
|
|
|
* 1:enable 0:disable
|
2022-01-19 17:05:50 +00:00
|
|
|
|
* Return: Zero on success. Negative on failure
|
2020-12-11 16:05:24 +00:00
|
|
|
|
*/
|
|
|
|
|
int cvmx_helper_setup_aura_qos(int node, int aura, bool ena_red, bool ena_drop, u64 pass_thresh,
|
|
|
|
|
u64 drop_thresh, bool ena_bp, u64 bp_thresh);
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* This function maps specified bpid to all the auras from which it can receive bp and
|
|
|
|
|
* then maps that bpid to all the channels, that bpid can asserrt bp on.
|
|
|
|
|
*
|
|
|
|
|
* @param node node number.
|
|
|
|
|
* @param aura aura number which will back pressure specified bpid.
|
|
|
|
|
* @param bpid bpid to map.
|
|
|
|
|
* @param chl_map array of channels to map to that bpid.
|
|
|
|
|
* @param chl_cnt number of channel/ports to map to that bpid.
|
2022-01-19 17:05:50 +00:00
|
|
|
|
* Return: Zero on success. Negative on failure
|
2020-12-11 16:05:24 +00:00
|
|
|
|
*/
|
|
|
|
|
int cvmx_helper_pki_map_aura_chl_bpid(int node, u16 aura, u16 bpid, u16 chl_map[], u16 chl_cnt);
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* This function sets up the global pool, aura and sso group
|
|
|
|
|
* resources which application can use between any interfaces
|
|
|
|
|
* and ports.
|
|
|
|
|
* @param node node number
|
|
|
|
|
* @param gblsch pointer to struct containing global
|
|
|
|
|
* scheduling parameters.
|
|
|
|
|
*/
|
|
|
|
|
int cvmx_helper_pki_set_gbl_schd(int node, struct cvmx_pki_global_schd *gblsch);
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* This function sets up scheduling parameters (pool, aura, sso group etc)
|
|
|
|
|
* of an ipd port.
|
|
|
|
|
* @param xipd_port ipd port number
|
|
|
|
|
* @param prtsch pointer to struct containing port's
|
|
|
|
|
* scheduling parameters.
|
|
|
|
|
*/
|
|
|
|
|
int cvmx_helper_pki_init_port(int xipd_port, struct cvmx_pki_prt_schd *prtsch);
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* This function sets up scheduling parameters (pool, aura, sso group etc)
|
|
|
|
|
* of an interface (all ports/channels on that interface).
|
|
|
|
|
* @param xiface interface number with node.
|
|
|
|
|
* @param intfsch pointer to struct containing interface
|
|
|
|
|
* scheduling parameters.
|
|
|
|
|
* @param gblsch pointer to struct containing global scheduling parameters
|
|
|
|
|
* (can be NULL if not used)
|
|
|
|
|
*/
|
|
|
|
|
int cvmx_helper_pki_init_interface(const int xiface, struct cvmx_pki_intf_schd *intfsch,
|
|
|
|
|
struct cvmx_pki_global_schd *gblsch);
|
|
|
|
|
/**
|
|
|
|
|
* This function gets all the PKI parameters related to that
|
|
|
|
|
* particular port from hardware.
|
|
|
|
|
* @param xipd_port ipd port number to get parameter of
|
|
|
|
|
* @param port_cfg pointer to structure where to store read parameters
|
|
|
|
|
*/
|
|
|
|
|
void cvmx_pki_get_port_config(int xipd_port, struct cvmx_pki_port_config *port_cfg);
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* This function sets all the PKI parameters related to that
|
|
|
|
|
* particular port in hardware.
|
|
|
|
|
* @param xipd_port ipd port number to get parameter of
|
|
|
|
|
* @param port_cfg pointer to structure containing port parameters
|
|
|
|
|
*/
|
|
|
|
|
void cvmx_pki_set_port_config(int xipd_port, struct cvmx_pki_port_config *port_cfg);
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* This function displays all the PKI parameters related to that
|
|
|
|
|
* particular port.
|
|
|
|
|
* @param xipd_port ipd port number to display parameter of
|
|
|
|
|
*/
|
|
|
|
|
void cvmx_pki_show_port_config(int xipd_port);
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Modifies maximum frame length to check.
|
|
|
|
|
* It modifies the global frame length set used by this port, any other
|
|
|
|
|
* port using the same set will get affected too.
|
|
|
|
|
* @param xipd_port ipd port for which to modify max len.
|
|
|
|
|
* @param max_size maximum frame length
|
|
|
|
|
*/
|
|
|
|
|
void cvmx_pki_set_max_frm_len(int xipd_port, u32 max_size);
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* This function sets up all the ports of particular interface
|
|
|
|
|
* for chosen fcs mode. (only use for backward compatibility).
|
|
|
|
|
* New application can control it via init_interface calls.
|
|
|
|
|
* @param node node number.
|
|
|
|
|
* @param interface interface number.
|
|
|
|
|
* @param nports number of ports
|
|
|
|
|
* @param has_fcs 1 -- enable fcs check and fcs strip.
|
|
|
|
|
* 0 -- disable fcs check.
|
|
|
|
|
*/
|
|
|
|
|
void cvmx_helper_pki_set_fcs_op(int node, int interface, int nports, int has_fcs);
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* This function sets the wqe buffer mode of all ports. First packet data buffer can reside
|
|
|
|
|
* either in same buffer as wqe OR it can go in separate buffer. If used the later mode,
|
|
|
|
|
* make sure software allocate enough buffers to now have wqe separate from packet data.
|
|
|
|
|
* @param node node number.
|
|
|
|
|
* @param pkt_outside_wqe 0 = The packet link pointer will be at word [FIRST_SKIP]
|
|
|
|
|
* immediately followed by packet data, in the same buffer
|
|
|
|
|
* as the work queue entry.
|
|
|
|
|
* 1 = The packet link pointer will be at word [FIRST_SKIP] in a new
|
|
|
|
|
* buffer separate from the work queue entry. Words following the
|
|
|
|
|
* WQE in the same cache line will be zeroed, other lines in the
|
|
|
|
|
* buffer will not be modified and will retain stale data (from the
|
|
|
|
|
* buffer’s previous use). This setting may decrease the peak PKI
|
|
|
|
|
* performance by up to half on small packets.
|
|
|
|
|
*/
|
|
|
|
|
void cvmx_helper_pki_set_wqe_mode(int node, bool pkt_outside_wqe);
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* This function sets the Packet mode of all ports and styles to little-endian.
|
|
|
|
|
* It Changes write operations of packet data to L2C to
|
|
|
|
|
* be in little-endian. Does not change the WQE header format, which is
|
|
|
|
|
* properly endian neutral.
|
|
|
|
|
* @param node node number.
|
|
|
|
|
*/
|
|
|
|
|
void cvmx_helper_pki_set_little_endian(int node);
|
|
|
|
|
|
|
|
|
|
void cvmx_helper_pki_set_dflt_pool(int node, int pool, int buffer_size, int buffer_count);
|
|
|
|
|
void cvmx_helper_pki_set_dflt_aura(int node, int aura, int pool, int buffer_count);
|
|
|
|
|
void cvmx_helper_pki_set_dflt_pool_buffer(int node, int buffer_count);
|
|
|
|
|
|
|
|
|
|
void cvmx_helper_pki_set_dflt_aura_buffer(int node, int buffer_count);
|
|
|
|
|
|
|
|
|
|
void cvmx_helper_pki_set_dflt_pkind_map(int node, int pkind, int style);
|
|
|
|
|
|
|
|
|
|
void cvmx_helper_pki_get_dflt_style(int node, struct cvmx_pki_style_config *style_cfg);
|
|
|
|
|
void cvmx_helper_pki_set_dflt_style(int node, struct cvmx_pki_style_config *style_cfg);
|
|
|
|
|
|
|
|
|
|
void cvmx_helper_pki_get_dflt_qpg(int node, struct cvmx_pki_qpg_config *qpg_cfg);
|
|
|
|
|
void cvmx_helper_pki_set_dflt_qpg(int node, struct cvmx_pki_qpg_config *qpg_cfg);
|
|
|
|
|
|
|
|
|
|
void cvmx_helper_pki_no_dflt_init(int node);
|
|
|
|
|
|
|
|
|
|
void cvmx_helper_pki_set_dflt_bp_en(int node, bool bp_en);
|
|
|
|
|
|
|
|
|
|
void cvmx_pki_dump_wqe(const cvmx_wqe_78xx_t *wqp);
|
|
|
|
|
|
|
|
|
|
int __cvmx_helper_pki_port_setup(int node, int xipd_port);
|
|
|
|
|
|
|
|
|
|
int __cvmx_helper_pki_global_setup(int node);
|
|
|
|
|
void cvmx_helper_pki_show_port_config(int xipd_port);
|
|
|
|
|
|
|
|
|
|
int __cvmx_helper_pki_install_dflt_vlan(int node);
|
|
|
|
|
void __cvmx_helper_pki_set_dflt_ltype_map(int node);
|
|
|
|
|
int cvmx_helper_pki_route_dmac(int node, int style, u64 mac_addr, u64 mac_addr_mask,
|
|
|
|
|
int final_style);
|
|
|
|
|
int cvmx_pki_clone_style(int node, int style, u64 cluster_mask);
|
|
|
|
|
void cvmx_helper_pki_modify_prtgrp(int xipd_port, int grp_ok, int grp_bad);
|
|
|
|
|
int cvmx_helper_pki_route_prt_dmac(int xipd_port, u64 mac_addr, u64 mac_addr_mask, int grp);
|
|
|
|
|
|
|
|
|
|
void cvmx_helper_pki_errata(int node);
|
|
|
|
|
|
|
|
|
|
#endif /* __CVMX_HELPER_PKI_H__ */
|