blob: e2e2ef7677510b94d598b5a9ed4950564ca5b322 [file] [log] [blame]
/*******************************************************************************
Copyright (C) Marvell International Ltd. and its affiliates
This software file (the "File") is owned and distributed by Marvell
International Ltd. and/or its affiliates ("Marvell") under the following
alternative licensing terms. Once you have made an election to distribute the
File under one of the following license alternatives, please (i) delete this
introductory statement regarding license alternatives, (ii) delete the two
license alternatives that you have not elected to use and (iii) preserve the
Marvell copyright notice above.
********************************************************************************
Marvell Commercial License Option
If you received this File from Marvell and you have entered into a commercial
license agreement (a "Commercial License") with Marvell, the File is licensed
to you under the terms of the applicable Commercial License.
********************************************************************************
Marvell GPL License Option
If you received this File from Marvell, you may opt to use, redistribute and/or
modify this File in accordance with the terms and conditions of the General
Public License Version 2, June 1991 (the "GPL License"), a copy of which is
available along with the File in the license.txt file or by writing to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 or
on the worldwide web at http://www.gnu.org/licenses/gpl.txt.
THE FILE IS DISTRIBUTED AS-IS, WITHOUT WARRANTY OF ANY KIND, AND THE IMPLIED
WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY
DISCLAIMED. The GPL License provides additional details about this warranty
disclaimer.
********************************************************************************
Marvell BSD License Option
If you received this File from Marvell, you may opt to use, redistribute and/or
modify this File under the following licensing terms.
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 Marvell 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.
*******************************************************************************/
#ifndef __MV_PNC_H__
#define __MV_PNC_H__
#include "mvTcam.h"
/*
* Errors
*/
#define ERR_ON_OOR(cond) if (cond) { mvOsPrintf("%s: out of range\n", __func__); return PNC_ERR_OOR; }
#define WARN_ON_OOR(cond) if (cond) { mvOsPrintf("%s: out of range\n", __func__); return; }
#define WARN_ON_OOM(cond) if (cond) { mvOsPrintf("%s: out of memory\n", __func__); return NULL; }
/*
* Errors assigment
*/
#define PNC_ERR_OOR 1 /* out of range error */
#define PNC_ERR_INV 1 /* invalid parameter */
/* Result info bits assigment */
#define RI_DROP (BIT0) /* drop */
#define RI_L4_OFFS 1
#define RI_L4_MASK (3 << RI_L4_OFFS)
#define RI_L4_TCP (0 << RI_L4_OFFS)
#define RI_L4_UDP (1 << RI_L4_OFFS)
#define RI_L4_UN (2 << RI_L4_OFFS)
#define RI_L3_OFFS 3
#define RI_L3_MASK (7 << RI_L3_OFFS)
#define RI_L3_UN (0 << RI_L3_OFFS)
#define RI_L3_IP6 (1 << RI_L3_OFFS)
#define RI_L3_IP4_FRAG (2 << RI_L3_OFFS)
#define RI_L3_IP4 (3 << RI_L3_OFFS)
#define RI_L3_IP4_FRAG_F (6 << RI_L3_OFFS)
#define RI_MCAST_OFFS 6
#define RI_MCAST_MASK (3 << RI_MCAST_OFFS)
#define RI_MCAST_SPEC (0 << RI_MCAST_OFFS)
#define RI_MCAST_PNC_SPEC (1 << RI_MCAST_OFFS)
#define RI_MCAST_OTHER (2 << RI_MCAST_OFFS)
#define RI_MCAST_PNC_OTHER (3 << RI_MCAST_OFFS)
#define RI_MCAST_PNC_ONLY (4 << RI_MCAST_OFFS)
#define RI_MAC_LEARN (BIT9) /*media convert MAC learning*/
#define RI_DA_MC (BIT10) /* multicast */
#define RI_DA_BC (BIT11) /* broadcast */
#define RI_DA_ME (BIT12) /* unicast */
#define RI_PPPOE (BIT13) /* PPPoE */
/* BITS 14-17 are reserved for setting MH field in HWF packets (TXz_MH_reg_1-15) */
#define RI_L3_FLOW (BIT18) /* L3 flow is found */
#define RI_VLAN (BIT19) /* VLAN */
#define RI_RX_SPECIAL (BIT20) /* Packet for special RX processing */
/* Additional info bits assigment */
#define AI_DONE_BIT 0
#define AI_DONE_MASK (1 << AI_DONE_BIT)
/* PnC result info */
#define NETA_PNC_VLAN (RI_VLAN >> 9)
#define NETA_PNC_DA_MC (RI_DA_MC >> 9)
#define NETA_PNC_DA_BC (RI_DA_BC >> 9)
#define NETA_PNC_DA_UC (RI_DA_ME >> 9)
#define NETA_PNC_PPPOE (RI_PPPOE >> 9)
#define NETA_PNC_RX_SPECIAL (RI_RX_SPECIAL >> 9)
#define NETA_PNC_MAC_LEARN (RI_MAC_LEARN >> 9) /*Just for Media convert MAC learn through PNC*/
/*---------------------------------------------------------------------------*/
MV_STATUS mvPncInit(MV_U8 *pncVirtBase);
#ifdef CONFIG_MV_ETH_PNC
/*
* TCAM topology definition.
* The TCAM is divided into sections per protocol encapsulation.
* Usually each section is designed to be to a lookup.
* Change sizes of sections according to the target product.
*/
enum {
/* MAC Lookup including Marvell/PON header */
TE_MH, /* Match marvell header */
TE_MAC_BC, /* broadcast */
TE_MAC_FLOW_CTRL, /* Flow Control PAUSE frames */
TE_MAC_MC_ALL, /* first multicast entry (always reserved for all MCASTs) */
TE_MAC_MC_L = TE_MAC_MC_ALL + CONFIG_MV_ETH_PNC_MCAST_NUM, /* last multicast entry */
TE_MAC_ME, /* mac to me per port */
TE_MAC_ME_END = TE_MAC_ME + CONFIG_MV_ETH_PORTS_NUM - 1,
TE_MAC_EOF,
/* VLAN Lookup */
#if (CONFIG_MV_ETH_PNC_VLAN_PRIO > 0)
TE_VLAN_PRIO,
TE_VLAN_PRIO_END = TE_VLAN_PRIO + CONFIG_MV_ETH_PNC_VLAN_PRIO,
#endif /* (CONFIG_MV_ETH_PNC_VLAN_PRIO > 0) */
TE_VLAN_EOF,
/* Ethertype Lookup */
TE_ETYPE_ARP,
TE_ETYPE_IP4,
TE_ETYPE_IP6,
TE_PPPOE_IP4,
TE_PPPOE_IP6,
TE_ETYPE, /* custom ethertype */
TE_ETYPE_EOF = TE_ETYPE + CONFIG_MV_ETH_PNC_ETYPE,
/* IP4 Lookup */
#if (CONFIG_MV_ETH_PNC_DSCP_PRIO > 0)
TE_IP4_DSCP,
TE_IP4_DSCP_END = TE_IP4_DSCP + CONFIG_MV_ETH_PNC_DSCP_PRIO - 1,
#endif /* CONFIG_MV_ETH_PNC_DSCP_PRIO > 0 */
TE_IP4_TCP,
TE_IP4_TCP_FRAG,
TE_IP4_UDP,
TE_IP4_UDP_FRAG,
TE_IP4_IGMP,
TE_IP4_ESP,
TE_IP4_EOF,
/* IP6 Lookup */
TE_IP6_TCP,
TE_IP6_UDP,
TE_IP6_EOF,
#ifdef CONFIG_MV_ETH_PNC_L3_FLOW
/* Session Lookup for IPv4 and IPv6 */
TE_FLOW_L3,
TE_FLOW_L3_END = TE_FLOW_L3 + CONFIG_MV_PNC_L3_FLOW_LINES - 1,
TE_FLOW_IP4_EOF,
TE_FLOW_IP6_A_EOF,
TE_FLOW_IP6_B_EOF,
#else
TE_L4_EOF,
#endif /* CONFIG_MV_ETH_PNC_L3_FLOW */
#ifdef CONFIG_MV_ETH_PNC_WOL
TE_WOL,
TE_WOL_EOF = CONFIG_MV_PNC_TCAM_LINES - 1,
#endif /* CONFIG_MV_ETH_PNC_WOL */
};
enum {
TCAM_LU_MAC,
TCAM_LU_L2,
TCAM_LU_IP4,
TCAM_LU_IP6,
#ifdef CONFIG_MV_ETH_PNC_L3_FLOW
TCAM_LU_FLOW_IP4,
TCAM_LU_FLOW_IP6_A,
TCAM_LU_FLOW_IP6_B,
#else
TCAM_LU_L4,
#endif /* CONFIG_MV_ETH_PNC_L3_FLOW */
#ifdef CONFIG_MV_ETH_PNC_WOL
TCAM_LU_WOL,
#endif /* CONFIG_MV_ETH_PNC_WOL */
};
/*
* Pre-defined FlowId assigment
*/
#define FLOWID_EOF_LU_MAC 0xFFF0
#define FLOWID_EOF_LU_L2 0xFFF2
#define FLOWID_EOF_LU_IP4 0xFFF4
#define FLOWID_EOF_LU_IP6 0xFFF6
#define FLOWID_EOF_LU_L4 0xFFF7
#define FLOWID_EOF_LU_FLOW_IP4 0xFFF8
#define FLOWID_EOF_LU_FLOW_IP6_A 0xFFFA
#define FLOWID_EOF_LU_FLOW_IP6_B 0xFFFB
#define FLOWID_CTRL_FULL_MASK FLOW_CTRL_MASK
#define FLOWID_CTRL_LOW_HALF_MASK FLOW_CTRL_HALF_MASK
#define FLOWID_CTRL_HIGH_HALF_MASK (FLOW_CTRL_MASK & ~FLOW_CTRL_HALF_MASK)
/************ FlowID field detalization for HWF support ***********************/
/* TXP for HWF: 0 - no HWF, 1 - Giga0, 2 - Giga1, 3..10 PON - TCONTs 0..7 */
#define PNC_FLOWID_HWF_TXP_OFFS 24
#define PNC_FLOWID_HWF_TXP_MASK (0xF << PNC_FLOWID_HWF_TXP_OFFS)
#define PNC_FLOWID_HWF_GEM_OFFS 12
#define PNC_FLOWID_HWF_GEM_MASK (0xFFF << PNC_FLOWID_HWF_GEM_OFFS)
#define PNC_FLOWID_HWF_MOD_OFFS 0
#define PNC_FLOWID_HWF_MOD_MASK (0x3FF << PNC_FLOWID_HWF_MOD_OFFS)
#define PNC_FLOWID_IS_HWF(flowid) (((flowid) & PNC_FLOWID_HWF_TXP_MASK) != 0)
/*---------------------------------------------------------------------------*/
/*
* Export API
*/
int pnc_default_init(void);
int pnc_te_del(unsigned int tid);
struct tcam_entry *pnc_tcam_entry_get(int tid);
int pnc_eth_port_map(int eth_port);
int pnc_port_map(int pnc_port);
unsigned int pnc_port_mask_update(unsigned int mask, int eth_port, int add);
unsigned int pnc_port_mask(int eth_port);
int pnc_tcam_port_update(int tid, int eth_port, int add);
/* Set number of Rx queues */
void pnc_rxq_max(int rxq_max);
/* Assign Rx queue to a protocol */
int pnc_rxq_proto(unsigned int proto, unsigned int rxq);
/* Get availible range on section */
int pnc_rule_range(int sec, int *first, int *last);
/* Get section for specific rule */
int pnc_rule_sec(int tid);
/* Delete rule */
int pnc_rule_del(int tid);
/* Set MAC address of a port, or NULL for promiscuous */
int pnc_mac_me(unsigned int port, unsigned char *mac, int rxq);
/* Set Multicast MAC address to be accepted on the port */
int pnc_mcast_me(unsigned int port, unsigned char *mac);
/* Set VLAN priority entry */
int pnc_vlan_prio_set(int port, int prio, int rxq);
void pnc_vlan_prio_show(int port);
/* match arp */
void pnc_etype_arp(int rxq);
/* TCP/IP header parsing for fragmentation and L4 offset. */
void pnc_ip4_tcp(int rxq);
/* IPv4/UDP header parsing for fragmentation and L4 offset. */
void pnc_ip4_udp(int rxq);
/* Enable / Disable accept ALL Multicast */
int pnc_mcast_all(unsigned int port, int en);
void pnc_mac_show(void);
/* Add TOS priority rule */
int pnc_ip4_dscp(int port, unsigned char dscp, unsigned char mask, int rxq);
void pnc_ipv4_dscp_show(int port);
/* 2 tuple match */
int pnc_ipv4_2_tuples_add(unsigned int tid, unsigned int flow_hi,
unsigned int sip, unsigned int dip, unsigned int rxq);
int pnc_ipv6_2_tuples_add(unsigned int tid1, unsigned int tid2, unsigned int flow_id,
MV_U8 unique, MV_U8 *sip, MV_U8 *dip, unsigned int rxq);
/* 5 tuple match */
int pnc_ipv4_5_tuples_add(unsigned int tid, unsigned int flow_hi,
unsigned int sip, unsigned int dip,
unsigned int proto, unsigned int ports, unsigned int rxq);
#ifdef CONFIG_MV_ETH_PNC_WOL
void mv_pnc_wol_init(void);
int mv_pnc_wol_rule_set(int port, char *data, char *mask, int size);
int mv_pnc_wol_rule_del(int idx);
int mv_pnc_wol_rule_del_all(int port);
int mv_pnc_wol_pkt_match(int port, char *data, int size, int *ruleId);
void mv_pnc_wol_sleep(int port);
void mv_pnc_wol_wakeup(int port);
int mv_pnc_wol_rule_dump(int idx);
void mv_pnc_wol_dump(void);
#endif /* CONFIG_MV_ETH_PNC_WOL */
#ifdef MV_ETH_PNC_AGING
MV_U32 mvPncAgingCntrRead(int tid);
void mvPncAgingCntrWrite(int tid, MV_U32 w32);
void mvPncAgingDump(int all);
void mvPncAgingReset(void);
void mvPncAgingScannerDump(void);
void mvPncAgingCntrClear(int tid);
void mvPncAgingCntrGroupSet(int tid, int gr);
void mvPncAgingCounterClear(int tid, int gr);
void mvPncAgingGroupCntrClear(int group);
MV_U32 mvPncAgingLogEntryRead(int group, int mostly);
void mvPncAgingCntrLuMaskSet(int tid, int mask);
void mvPncAgingLuThreshSet(int group, unsigned int thesh);
void mvPncAgingLuReadClear(int tid);
void mvPncAgingTrigerSet(void);
void mvPncAgingCouterClear(int tid);
#endif /* MV_ETH_PNC_AGING */
int pnc_mh_omci(unsigned short data, unsigned short mask, unsigned int rxq);
int pnc_eoam(unsigned int rxq);
int pnc_default_init(void);
int pnc_def_entry_init(unsigned int tid, unsigned int rxq);
#ifdef MV_ETH_PNC_LB
void mvPncLbDump(void);
int mvPncLbRxqSet(int hash, int rxq);
int mvPncLbModeIp4(int mode);
int mvPncLbModeIp6(int mode);
int mvPncLbModeL4(int mode);
#endif /* MV_ETH_PNC_LB */
#endif /* CONFIG_MV_ETH_PNC */
#endif /*__MV_PNC_H__ */