| /******************************************************************************* |
| 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 __mvPmt_h__ |
| #define __mvPmt_h__ |
| |
| #ifdef __cplusplus |
| extern "C" { |
| #endif /* __cplusplus */ |
| |
| #include "mvTypes.h" |
| #include "mvCommon.h" |
| #include "mvOs.h" |
| |
| #define PMT_TEXT 16 |
| |
| #define PMT_PRINT_VALID_FLAG 0x01 |
| |
| |
| typedef union mv_neta_pmt_t { |
| MV_U32 word; |
| |
| } MV_NETA_PMT; |
| |
| #define MV_NETA_PMT_DATA_OFFS 0 |
| #define MV_NETA_PMT_DATA_BITS 16 |
| #define MV_NETA_PMT_DATA_MASK (((1 << MV_NETA_PMT_DATA_BITS) - 1) << MV_NETA_PMT_DATA_OFFS) |
| |
| #define MV_NETA_PMT_CTRL_OFFS 16 |
| #define MV_NETA_PMT_CTRL_BITS 16 |
| #define MV_NETA_PMT_CTRL_MASK (((1 << MV_NETA_PMT_CTRL_BITS) - 1) << MV_NETA_PMT_CTRL_OFFS) |
| |
| #define MV_NETA_PMT_CMD_OFFS 16 |
| #define MV_NETA_PMT_CMD_BITS 5 |
| #define MV_NETA_PMT_CMD_ALL_MASK (((1 << MV_NETA_PMT_CMD_BITS) - 1) << MV_NETA_PMT_CMD_OFFS) |
| #define MV_NETA_PMT_CMD_MASK(cmd) ((cmd) << MV_NETA_PMT_CMD_OFFS) |
| |
| enum { |
| MV_NETA_CMD_NONE = 0, |
| MV_NETA_CMD_ADD_2B, |
| MV_NETA_CMD_CFG_VLAN, |
| MV_NETA_CMD_ADD_VLAN, |
| MV_NETA_CMD_CFG_DSA_1, |
| MV_NETA_CMD_CFG_DSA_2, |
| MV_NETA_CMD_ADD_DSA, |
| MV_NETA_CMD_DEL_BYTES, |
| MV_NETA_CMD_REPLACE_2B, |
| MV_NETA_CMD_REPLACE_LSB, |
| MV_NETA_CMD_REPLACE_MSB, |
| MV_NETA_CMD_REPLACE_VLAN, |
| MV_NETA_CMD_DEC_LSB, |
| MV_NETA_CMD_DEC_MSB, |
| MV_NETA_CMD_ADD_CALC_LEN, |
| MV_NETA_CMD_REPLACE_LEN, |
| MV_NETA_CMD_IPV4_CSUM, |
| MV_NETA_CMD_L4_CSUM, |
| MV_NETA_CMD_SKIP, |
| MV_NETA_CMD_JUMP, |
| MV_NETA_CMD_JUMP_SKIP, |
| MV_NETA_CMD_JUMP_SUB, |
| MV_NETA_CMD_PPPOE, |
| MV_NETA_CMD_STORE, |
| }; |
| |
| #define MV_NETA_PMT_IP4_CSUM_BIT 21 |
| #define MV_NETA_PMT_IP4_CSUM_MASK (1 << MV_NETA_PMT_IP4_CSUM_BIT) |
| |
| #define MV_NETA_PMT_L4_CSUM_BIT 22 |
| #define MV_NETA_PMT_L4_CSUM_MASK (1 << MV_NETA_PMT_L4_CSUM_BIT) |
| |
| #define MV_NETA_PMT_LAST_BIT 23 |
| #define MV_NETA_PMT_LAST_MASK (1 << MV_NETA_PMT_LAST_BIT) |
| |
| |
| /*********** Command special defines ************/ |
| |
| /* Bits for MV_NETA_CMD_DEL_BYTES command */ |
| /* [7:0] - number of words (2 bytes) to delete */ |
| #define MV_NETA_PMT_DEL_SHORTS_OFFS 0 |
| #define MV_NETA_PMT_DEL_SHORTS_MASK (0xFF << MV_NETA_PMT_DEL_SHORTS_OFFS) |
| #define MV_NETA_PMT_DEL_SHORTS(size) (((size) << MV_NETA_PMT_DEL_SHORTS_OFFS) & MV_NETA_PMT_DEL_SHORTS_MASK) |
| |
| /* [11:8] - number of words (2 bytes) to skip before the delete command */ |
| #define MV_NETA_PMT_DEL_SKIP_B_OFFS 8 |
| #define MV_NETA_PMT_DEL_SKIP_B_MASK (0xF << MV_NETA_PMT_DEL_SKIP_B_OFFS) |
| #define MV_NETA_PMT_DEL_SKIP_B(size) (((size) << MV_NETA_PMT_DEL_SKIP_B_OFFS) & MV_NETA_PMT_DEL_SKIP_B_MASK) |
| |
| /* [15:12] - number of words (2 bytes) to skip after the delete command */ |
| #define MV_NETA_PMT_DEL_SKIP_A_OFFS 12 |
| #define MV_NETA_PMT_DEL_SKIP_A_MASK (0xF << MV_NETA_PMT_DEL_SKIP_A_OFFS) |
| #define MV_NETA_PMT_DEL_SKIP_A(size) (((size) << MV_NETA_PMT_DEL_SKIP_A_OFFS) & MV_NETA_PMT_DEL_SKIP_A_MASK) |
| /*-----------------------------------------------------------------------------------------------------------------*/ |
| |
| /* Bits for Add Calculated length operation */ |
| /* Used for commands: Add Calculated length, Replace length, Skip, */ |
| #define MV_NETA_PMT_ZERO_ADD 0 |
| #define MV_NETA_PMT_DATA_ADD 2 |
| #define MV_NETA_PMT_DATA_SUB 3 |
| |
| #define MV_NETA_PMT_CALC_LEN_0_OFFS 14 |
| #define MV_NETA_PMT_CALC_LEN_0_MASK (3 << MV_NETA_PMT_CALC_LEN_0_OFFS) |
| #define MV_NETA_PMT_CALC_LEN_0_ZERO (0 << MV_NETA_PMT_CALC_LEN_0_OFFS) |
| #define MV_NETA_PMT_CALC_LEN_0_TX_DESC (1 << MV_NETA_PMT_CALC_LEN_0_OFFS) |
| #define MV_NETA_PMT_CALC_LEN_0_TX_PKT (2 << MV_NETA_PMT_CALC_LEN_0_OFFS) |
| #define MV_NETA_PMT_CALC_LEN_0_STORE (3 << MV_NETA_PMT_CALC_LEN_0_OFFS) |
| |
| #define MV_NETA_PMT_CALC_LEN_1_OFFS 12 |
| #define MV_NETA_PMT_CALC_LEN_1_MASK (3 << MV_NETA_PMT_CALC_LEN_1_OFFS) |
| #define MV_NETA_PMT_CALC_LEN_1(op) ((op) << MV_NETA_PMT_CALC_LEN_1_OFFS) |
| |
| #define MV_NETA_PMT_CALC_LEN_2_OFFS 10 |
| #define MV_NETA_PMT_CALC_LEN_2_MASK (3 << MV_NETA_PMT_CALC_LEN_2_OFFS) |
| #define MV_NETA_PMT_CALC_LEN_2(op) ((op) << MV_NETA_PMT_CALC_LEN_2_OFFS) |
| |
| #define MV_NETA_PMT_CALC_LEN_3_BIT 9 |
| #define MV_NETA_PMT_CALC_LEN_3_ADD_MASK (0 << MV_NETA_PMT_CALC_LEN_3_BIT) |
| #define MV_NETA_PMT_CALC_LEN_3_SUB_MASK (1 << MV_NETA_PMT_CALC_LEN_3_BIT) |
| |
| #define MV_NETA_PMT_CALC_LEN_DATA_OFFS 0 |
| #define MV_NETA_PMT_CALC_LEN_DATA_MASK (0x1FF << MV_NETA_PMT_CALC_LEN_DATA_OFFS) |
| #define MV_NETA_PMT_CALC_LEN_DATA(data) ((data) << MV_NETA_PMT_CALC_LEN_DATA_OFFS) |
| /*-----------------------------------------------------------------------------------------------------------------*/ |
| |
| /* Bits for MV_NETA_CMD_DEC_LSB and MV_NETA_CMD_DEC_MSB commands */ |
| #define MV_NETA_PMT_DEC_SKIP_A_OFFS 0 |
| #define MV_NETA_PMT_DEC_SKIP_A_MASK (0xFF << MV_NETA_PMT_DEC_SKIP_A_OFFS) |
| #define MV_NETA_PMT_DEC_SKIP_A(size) (((size) << MV_NETA_PMT_DEC_SKIP_A_OFFS) & MV_NETA_PMT_DEC_SKIP_A_MASK) |
| |
| #define MV_NETA_PMT_DEC_SKIP_B_OFFS 8 |
| #define MV_NETA_PMT_DEC_SKIP_B_MASK (0xFF << MV_NETA_PMT_DEC_SKIP_B_OFFS) |
| #define MV_NETA_PMT_DEC_SKIP_B(size) (((size) << MV_NETA_PMT_DEC_SKIP_B_OFFS) & MV_NETA_PMT_DEC_SKIP_B_MASK) |
| /*-----------------------------------------------------------------------------------------------------------------*/ |
| |
| #define MV_NETA_PMT_CLEAR(pmt) \ |
| (pmt)->word = 0; |
| |
| #define MV_NETA_PMT_IS_VALID(pmt) \ |
| ((((pmt)->word & MV_NETA_PMT_CMD_ALL_MASK) >> MV_NETA_PMT_CMD_OFFS) != MV_NETA_CMD_NONE) |
| |
| #define MV_NETA_PMT_INVALID_SET(pmt) \ |
| ((pmt)->word = MV_NETA_PMT_CMD_MASK(MV_NETA_CMD_NONE) | MV_NETA_PMT_LAST_MASK); |
| |
| #define MV_NETA_PMT_CTRL_GET(pmt) \ |
| (MV_U16)(((pmt)->word & MV_NETA_PMT_CTRL_MASK) >> MV_NETA_PMT_CTRL_OFFS) |
| |
| #define MV_NETA_PMT_CMD_GET(pmt) \ |
| (((pmt)->word & MV_NETA_PMT_CMD_ALL_MASK) >> MV_NETA_PMT_CMD_OFFS) |
| |
| #define MV_NETA_PMT_DATA_GET(pmt) \ |
| (MV_U16)(((pmt)->word & MV_NETA_PMT_DATA_MASK) >> MV_NETA_PMT_DATA_OFFS) |
| |
| #define MV_NETA_PMT_CMD_SET(pmt, cmd) \ |
| (pmt)->word &= ~MV_NETA_PMT_CMD_ALL_MASK; \ |
| (pmt)->word |= MV_NETA_PMT_CMD_MASK(cmd); |
| |
| #define MV_NETA_PMT_DATA_SET(pmt, data) \ |
| (pmt)->word &= ~MV_NETA_PMT_DATA_MASK; \ |
| (pmt)->word |= ((data) << MV_NETA_PMT_DATA_OFFS); |
| |
| |
| MV_STATUS mvNetaPmtWrite(int port, int idx, MV_NETA_PMT *pEntry); |
| MV_STATUS mvNetaPmtRead(int port, int idx, MV_NETA_PMT *pEntry); |
| MV_STATUS mvNetaPmtClear(int port); |
| MV_STATUS mvNetaPmtInit(int port, MV_NETA_PMT *pBase); |
| MV_VOID mvNetaPmtDestroy(MV_VOID); |
| MV_VOID mvNetaPmtDump(int port, int flags); |
| MV_VOID mvNetaPmtRegs(int port, int txp); |
| |
| MV_VOID mvNetaPmtEntryPrint(MV_NETA_PMT *pEntry); |
| |
| MV_VOID mvNetaPmtAdd2Bytes(MV_NETA_PMT *pEntry, MV_U16 data); |
| MV_VOID mvNetaPmtReplace2Bytes(MV_NETA_PMT *pEntry, MV_U16 data); |
| MV_VOID mvNetaPmtDelShorts(MV_NETA_PMT *pEntry, MV_U8 bDelete, |
| MV_U8 skipBefore, MV_U8 skipAfter); |
| MV_VOID mvNetaPmtReplaceLSB(MV_NETA_PMT *pEntry, MV_U8 value, MV_U8 mask); |
| MV_VOID mvNetaPmtReplaceMSB(MV_NETA_PMT *pEntry, MV_U8 value, MV_U8 mask); |
| |
| MV_VOID mvNetaPmtDecLSB(MV_NETA_PMT *pEntry, MV_U8 skipBefore, MV_U8 skipAfter); |
| MV_VOID mvNetaPmtDecMSB(MV_NETA_PMT *pEntry, MV_U8 skipBefore, MV_U8 skipAfter); |
| |
| MV_VOID mvNetaPmtLastFlag(MV_NETA_PMT *pEntry, int last); |
| MV_VOID mvNetaPmtFlags(MV_NETA_PMT *pEntry, int last, int ipv4, int l4); |
| MV_VOID mvNetaPmtSkip(MV_NETA_PMT *pEntry, MV_U16 shorts); |
| MV_VOID mvNetaPmtReplaceIPv4csum(MV_NETA_PMT *pEntry, MV_U16 data); |
| MV_VOID mvNetaPmtReplaceL4csum(MV_NETA_PMT *pEntry, MV_U16 data); |
| MV_VOID mvNetaPmtJump(MV_NETA_PMT *pEntry, MV_U16 target, int type, int cond); |
| |
| /* High level PMT configurations */ |
| int mvNetaPmtTtlDec(int port, int idx, int ip_offs, int isLast); |
| int mvNetaPmtDataReplace(int port, int idx, int offset, |
| MV_U8 *data, int bytes, int isLast); |
| |
| |
| |
| #ifdef __cplusplus |
| } |
| #endif /* __cplusplus */ |
| |
| #endif /* __mvPmt_h__ */ |