blob: 27e1380a2a099e87a0d798a1b798992c6d62fae9 [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_PP2_GBE_REGS_H__
#define __MV_PP2_GBE_REGS_H__
#ifdef CONFIG_ARCH_MVEBU
#include "mvNetConfig.h"
#else
#include "mvSysEthConfig.h"
#endif
/************************** PPv2 HW Configuration ***********************/
/************************** TX General Registers ******************************/
#define MV_PP2_TX_SNOOP_REG (MV_PP2_REG_BASE + 0x8800)
#define MV_PP2_TX_FIFO_THRESH_REG (MV_PP2_REG_BASE + 0x8804)
/* Indirect access */
#define MV_PP2_TX_PKT_LEN_IDX_REG (MV_PP2_REG_BASE + 0x8808)
#define MV_PP2_TX_PKT_LEN_CHANGE_REG (MV_PP2_REG_BASE + 0x880C)
#define MV_PP2_TX_PORT_FLUSH_REG (MV_PP2_REG_BASE + 0x8810)
#define MV_PP2_TX_PORT_FLUSH_OFFS 0
#define MV_PP2_TX_PORT_FLUSH_BITS 7
#define MV_PP2_TX_PORT_FLUSH_ALL_MASK (((1 << MV_PP2_TX_PORT_FLUSH_BITS) - 1) << MV_PP2_TX_PORT_FLUSH_OFFS)
#define MV_PP2_TX_PORT_FLUSH_MASK(p) ((1 << (p)) << MV_PP2_TX_PORT_FLUSH_OFFS)
/* Registers per egress port */
#define MV_PP2_TXP_BAD_CRC_CNTR_REG(txp) (MV_PP2_REG_BASE + 0x8900)
#define MV_PP2_TXP_DROP_CNTR_REG(txp) (MV_PP2_REG_BASE + 0x8980)
#define MV_PP2_TXP_DEQUEUE_THRESH_REG(txp) (MV_PP2_REG_BASE + 0x88A0)
/************************** RX Fifo Registers ******************************/
#define MV_PP2_RX_DATA_FIFO_SIZE_REG(port) (MV_PP2_REG_BASE + 0x00 + 4 * (port))
#define MV_PP2_RX_ATTR_FIFO_SIZE_REG(port) (MV_PP2_REG_BASE + 0x20 + 4 * (port))
#define MV_PP2_RX_MIN_PKT_SIZE_REG (MV_PP2_REG_BASE + 0x60)
#define MV_PP2_RX_FIFO_INIT_REG (MV_PP2_REG_BASE + 0x64)
/************************** Top Reg file ******************************/
#define MV_PP2_MH_REG(port) (MV_PP2_REG_BASE + 0x5040 + 4 * (port))
#define MV_PP2_MH_EN_OFFS 0
#define MV_PP2_MH_EN_MASK (1 << MV_PP2_MH_EN_OFFS)
#define MV_PP2_DSA_EN_OFFS 4
#define MV_PP2_DSA_EN_MASK (0x3 << MV_PP2_DSA_EN_OFFS)
#define MV_PP2_DSA_DISABLE 0
#define MV_PP2_DSA_NON_EXTENDED (0x1 << MV_PP2_DSA_EN_OFFS)
#define MV_PP2_DSA_EXTENDED (0x2 << MV_PP2_DSA_EN_OFFS)
/************************** RX DMA Top Registers ******************************/
#define MV_PP2_RX_CTRL_REG(port) (MV_PP2_REG_BASE + 0x140 + 4 * (port))
#define MV_PP2_POOL_BUF_SIZE_REG(pool) (MV_PP2_REG_BASE + 0x180 + 4 * (pool))
#define MV_PP2_POOL_BUF_SIZE_OFFSET 5
#define MV_PP2_POOL_BUF_SIZE_MASK (0xFFFE)
/*-------------------------------------------------------------------------------*/
#define MV_PP2_RX_STATUS (MV_PP2_REG_BASE + 0x174)
#define MV_PP2_DISABLE_IN_PROG_OFFS 0
#define MV_PP2_DISABLE_IN_PROG_MASK (0x1 << MV_PP2_DISABLE_IN_PROG_OFFS)
/*-------------------------------------------------------------------------------*/
#define MV_PP2_RXQ_CONFIG_REG(rxq) (MV_PP2_REG_BASE + 0x800 + 4 * (rxq))
#define MV_PP2_SNOOP_PKT_SIZE_OFFS 0
#define MV_PP2_SNOOP_PKT_SIZE_MASK (0x1FF << MV_PP2_SNOOP_PKT_SIZE_OFFS)
#define MV_PP2_SNOOP_BUF_HDR_OFFS 9
#define MV_PP2_SNOOP_BUF_HDR_MASK (0x1 << MV_PP2_SNOOP_BUF_HDR_OFFS)
#define MV_PP2_L2_DEPOSIT_PKT_SIZE_OFFS 12
#define MV_PP2_L2_DEPOSIT_PKT_SIZE_MASK (0xF << MV_PP2_L2_DEPOSIT_PKT_SIZE_OFFS)
#define MV_PP2_L2_DEPOSIT_BUF_HDR_OFFS 16
#define MV_PP2_L2_DEPOSIT_BUF_HDR_MASK (0x1 << MV_PP2_L2_DEPOSIT_BUF_HDR_OFFS)
#define MV_PP2_RXQ_POOL_SHORT_OFFS 20
#define MV_PP2_RXQ_POOL_SHORT_MASK (0x7 << MV_PP2_RXQ_POOL_SHORT_OFFS)
#define MV_PP2_RXQ_POOL_LONG_OFFS 24
#define MV_PP2_RXQ_POOL_LONG_MASK (0x7 << MV_PP2_RXQ_POOL_LONG_OFFS)
#define MV_PP2_RXQ_PACKET_OFFSET_OFFS 28
#define MV_PP2_RXQ_PACKET_OFFSET_MASK (0x7 << MV_PP2_RXQ_PACKET_OFFSET_OFFS)
#define MV_PP2_RXQ_DISABLE_BIT 31
#define MV_PP2_RXQ_DISABLE_MASK (0x1 << MV_PP2_RXQ_DISABLE_BIT)
/*-------------------------------------------------------------------------------*/
#define MV_PP2_HWF_TXQ_CONFIG_REG(txq) (MV_PP2_REG_BASE + 0xc00 + 4 * (txq))
#define MV_PP2_HWF_TXQ_POOL_SHORT_OFFS 0
#define MV_PP2_HWF_TXQ_POOL_SHORT_MASK (0x7 << MV_PP2_HWF_TXQ_POOL_SHORT_OFFS)
#define MV_PP2_HWF_TXQ_POOL_LONG_OFFS 4
#define MV_PP2_HWF_TXQ_POOL_LONG_MASK (0x7 << MV_PP2_HWF_TXQ_POOL_LONG_OFFS)
#define MV_PP2_HWF_TXQ_DISABLE_BIT 31
#define MV_PP2_HWF_TXQ_DISABLE_MASK (0x1 << MV_PP2_HWF_TXQ_DISABLE_BIT)
/*-------------------------------------------------------------------------------*/
#define MV_PP2_RX_GEMPID_SRC_OFFS 8
#define MV_PP2_RX_GEMPID_SRC_MASK (0x7 << MV_PP2_RX_GEMPID_SRC_OFFS)
#define MV_PP2_RX_LOW_LATENCY_PKT_SIZE_OFFS 16
#define MV_PP2_RX_LOW_LATENCY_PKT_SIZE_BITS 12
#define MV_PP2_RX_LOW_LATENCY_PKT_SIZE_MAX ((1 << MV_PP2_RX_LOW_LATENCY_PKT_SIZE_BITS) - 1)
#define MV_PP2_RX_LOW_LATENCY_PKT_SIZE_MASK(s) (((s) & MV_PP2_RX_LOW_LATENCY_PKT_SIZE_MAX) << \
MV_PP2_RX_LOW_LATENCY_PKT_SIZE_OFFS)
#define MV_PP2_RX_DROP_ON_CSUM_ERR_BIT 30
#define MV_PP2_RX_DROP_ON_CSUM_ERR_MASK (1 << MV_PP2_RX_DROP_ON_CSUM_ERR_BIT)
#define MV_PP2_RX_USE_PSEUDO_FOR_CSUM_BIT 31
#define MV_PP2_RX_USE_PSEUDO_FOR_CSUM_MASK (1 << MV_PP2_RX_USE_PSEUDO_FOR_CSUM_BIT)
/*-------------------------------------------------------------------------------*/
/************************** Descriptor Manager Top Registers ******************************/
#define MV_PP2_RXQ_NUM_REG (MV_PP2_REG_BASE + 0x2040)
#define MV_PP2_RXQ_NUM_OFFSET 0
#define MV_PP2_RXQ_NUM_MASK (0xFF << MV_PP2_RXQ_NUM_OFFSET)
/*-------------------------------------------------------------------------------*/
#define MV_PP2_RXQ_DESC_ADDR_REG (MV_PP2_REG_BASE + 0x2044)
#define MV_PP2_RXQ_DESC_SIZE_REG (MV_PP2_REG_BASE + 0x2048)
#define MV_PP2_RXQ_DESC_SIZE_OFFSET 4
#define MV_PP2_RXQ_DESC_SIZE_MASK (0x3FF << MV_PP2_RXQ_DESC_SIZE_OFFSET)
#define MV_PP2_RXQ_L2_DEPOSIT_OFFSET 16
#define MV_PP2_RXQ_L2_DEPOSIT_MASK (0x1 << MV_PP2_RXQ_L2_DEPOSIT_OFFSET)
/*-------------------------------------------------------------------------------*/
#define MV_PP2_RXQ_STATUS_UPDATE_REG(rxq) (MV_PP2_REG_BASE + 0x3000 + 4 * (rxq))
#define MV_PP2_RXQ_NUM_PROCESSED_OFFSET 0
#define MV_PP2_RXQ_NUM_PROCESSED_MASK (0x3FFF << MV_PP2_RXQ_NUM_PROCESSED_OFFSET)
#define MV_PP2_RXQ_NUM_NEW_OFFSET 16
#define MV_PP2_RXQ_NUM_NEW_MASK (0x3FFF << MV_PP2_RXQ_NUM_NEW_OFFSET)
/*-------------------------------------------------------------------------------*/
#define MV_PP2_RXQ_STATUS_REG(rxq) (MV_PP2_REG_BASE + 0x3400 + 4 * (rxq))
#define MV_PP2_RXQ_OCCUPIED_OFFSET 0
#define MV_PP2_RXQ_OCCUPIED_MASK (0x3FFF << MV_PP2_RXQ_OCCUPIED_OFFSET)
#define MV_PP2_RXQ_NON_OCCUPIED_OFFSET 16
#define MV_PP2_RXQ_NON_OCCUPIED_MASK (0x3FFF << MV_PP2_RXQ_NON_OCCUPIED_OFFSET)
/*-------------------------------------------------------------------------------*/
#define MV_PP2_RXQ_THRESH_REG (MV_PP2_REG_BASE + 0x204c)
#define MV_PP2_OCCUPIED_THRESH_OFFSET 0
#define MV_PP2_OCCUPIED_THRESH_MASK (0x3FFF << MV_PP2_OCCUPIED_THRESH_OFFSET)
#define MV_PP2_NON_OCCUPIED_THRESH_OFFSET 16
#define MV_PP2_NON_OCCUPIED_THRESH_MASK (0x3FFF << MV_PP2_NON_OCCUPIED_THRESH_OFFSET)
/*-------------------------------------------------------------------------------*/
#define MV_PP2_RXQ_INDEX_REG (MV_PP2_REG_BASE + 0x2050)
/*-------------------------------------------------------------------------------*/
/*-------------------------------------------------------------------------------*/
#define MV_PP2_TXQ_NUM_REG (MV_PP2_REG_BASE + 0x2080)
#define MV_PP2_TXQ_NUM_OFFSET 0
#define MV_PP2_TXQ_NUM_MASK (0xFF << MV_PP2_RXQ_NUM_OFFSET)
/*-------------------------------------------------------------------------------*/
#define MV_PP2_TXQ_DESC_ADDR_REG (MV_PP2_REG_BASE + 0x2084)
#define MV_PP2_TXQ_DESC_SIZE_REG (MV_PP2_REG_BASE + 0x2088)
#define MV_PP2_TXQ_DESC_SIZE_OFFSET 4
#define MV_PP2_TXQ_DESC_SIZE_MASK (0x3FF << MV_PP2_TXQ_DESC_SIZE_OFFSET)
/*-------------------------------------------------------------------------------*/
#define MV_PP2_TXQ_DESC_HWF_SIZE_REG (MV_PP2_REG_BASE + 0x208c)
#define MV_PP2_TXQ_DESC_HWF_SIZE_OFFSET 4
#define MV_PP2_TXQ_DESC_HWF_SIZE_MASK (0x3FF << MV_PP2_TXQ_DESC_HWF_SIZE_OFFSET)
/*-------------------------------------------------------------------------------*/
/* Aggregated (per CPU) TXQ - WO */
#define MV_PP2_AGGR_TXQ_UPDATE_REG (MV_PP2_REG_BASE + 0x2090)
/*-------------------------------------------------------------------------------*/
/* Each CPU has own copy */
#define MV_PP2_TXQ_THRESH_REG (MV_PP2_REG_BASE + 0x2094)
#define MV_PP2_TRANSMITTED_THRESH_OFFSET 16
#define MV_PP2_TRANSMITTED_THRESH_MASK (0x3FFF << MV_PP2_TRANSMITTED_THRESH_OFFSET)
/*-------------------------------------------------------------------------------*/
#define MV_PP2_TXQ_INDEX_REG (MV_PP2_REG_BASE + 0x2098)
/*-------------------------------------------------------------------------------*/
#define MV_PP2_TXQ_PREF_BUF_REG (MV_PP2_REG_BASE + 0x209c)
#define MV_PP2_PREF_BUF_PTR_OFFS 0
#define MV_PP2_PREF_BUF_PTR_MASK (0xFFF << MV_PP2_PREF_BUF_PTR_OFFS)
#define MV_PP2_PREF_BUF_PTR(desc) (((desc) << MV_PP2_PREF_BUF_PTR_OFFS) & MV_PP2_PREF_BUF_PTR_MASK)
#define MV_PP2_PREF_BUF_SIZE_OFFS 12
#define MV_PP2_PREF_BUF_SIZE_MASK (0x7 << MV_PP2_PREF_BUF_SIZE_OFFS)
#define MV_PP2_PREF_BUF_SIZE_NONE (0 << MV_PP2_PREF_BUF_SIZE_OFFS)
#define MV_PP2_PREF_BUF_SIZE_1 (1 << MV_PP2_PREF_BUF_SIZE_OFFS)
#define MV_PP2_PREF_BUF_SIZE_2 (2 << MV_PP2_PREF_BUF_SIZE_OFFS)
#define MV_PP2_PREF_BUF_SIZE_4 (3 << MV_PP2_PREF_BUF_SIZE_OFFS)
#define MV_PP2_PREF_BUF_SIZE_8 (4 << MV_PP2_PREF_BUF_SIZE_OFFS)
#define MV_PP2_PREF_BUF_SIZE_16 (5 << MV_PP2_PREF_BUF_SIZE_OFFS)
#define MV_PP2_PREF_BUF_SIZE_32 (6 << MV_PP2_PREF_BUF_SIZE_OFFS)
#define MV_PP2_PREF_BUF_SIZE_64 (7 << MV_PP2_PREF_BUF_SIZE_OFFS)
#define MV_PP2_PREF_BUF_THRESH_OFFS 17
#define MV_PP2_PREF_BUF_THRESH_MASK (0xF << MV_PP2_PREF_BUF_THRESH_OFFS)
#define MV_PP2_PREF_BUF_THRESH(val) ((val) << MV_PP2_PREF_BUF_THRESH_OFFS)
/* new field for PPV2.1 - A0 only */
#define MV_PP2_TXQ_DRAIN_EN_BIT 31
#define MV_PP2_TXQ_DRAIN_EN_MASK (1 << MV_PP2_TXQ_DRAIN_EN_BIT)
/*-------------------------------------------------------------------------------*/
#define MV_PP2_TXQ_PENDING_REG (MV_PP2_REG_BASE + 0x20a0)
#define MV_PP2_TXQ_PENDING_OFFSET 0
#define MV_PP2_TXQ_PENDING_MASK (0x3FFF << MV_PP2_TXQ_PENDING_OFFSET)
#define MV_PP2_TXQ_RESERVED_OFFSET 16
#define MV_PP2_TXQ_RESERVED_MASK (0x3FFF << MV_PP2_TXQ_RESERVED_OFFSET)
/*-------------------------------------------------------------------------------*/
/*
ppv2.1 field MV_PP2_TXQ_HWF_PENDING_OFFSET changed to MV_PP2_TXQ_RESERVED_DESC_OFFSET
MAS 3.16
*/
#define MV_PP2_TXQ_HWF_PENDING_OFFSET 16
#define MV_PP2_TXQ_HWF_PENDING_MASK (0x3FFF << MV_PP2_TXQ_HWF_PENDING_OFFSET)
#define MV_PP2_TXQ_RSVD_DESC_OFFSET 16
#define MV_PP2_TXQ_RSVD_DESC_MASK (0x3FFF << MV_PP2_TXQ_RSVD_DESC_MASK)
/*-------------------------------------------------------------------------------*/
#define MV_PP2_TXQ_INT_STATUS_REG (MV_PP2_REG_BASE + 0x20a4)
/*-------------------------------------------------------------------------------*/
/*
ppv2.1- new register 0x20b0, not exist ip ppv2.0
MAS 3.16
*/
#define MV_PP2_TXQ_RSVD_REQ_REG (MV_PP2_REG_BASE + 0x20b0)
#define MV_PP2_TXQ_RSVD_REQ_DESC_OFFSET 0
#define MV_PP2_TXQ_RSVD_REQ_DESC_MASK (0x3FFF << MV_PP2_TXQ_RSVD_REQ_DESC_OFFSET)
#define MV_PP2_TXQ_RSVD_REQ_Q_OFFSET 16
#define MV_PP2_TXQ_RSVD_REQ_Q_MASK (0xFF << MV_PP2_TXQ_RSVD_REQ_Q_OFFSET)
/*-------------------------------------------------------------------------------*/
/*
ppv2.1- new register 0x20b4, not exist ip ppv2.0
MAS 3.16
*/
#define MV_PP2_TXQ_RSVD_RSLT_REG (MV_PP2_REG_BASE + 0x20b4)
#define MV_PP2_TXQ_RSVD_RSLT_OFFSET 0
#define MV_PP2_TXQ_RSVD_RSLT_MASK (0x3FFF << MV_PP2_TXQ_RSVD_RSLT_OFFSET)
/*-------------------------------------------------------------------------------*/
/*
ppv2.1- new register 0x20b8, not exist ip ppv2.0
MAS 3.22
*/
#define MV_PP2_TXQ_RSVD_CLR_REG (MV_PP2_REG_BASE + 0x20b8)
#define MV_PP2_TXQ_RSVD_CLR_Q_OFFSET 16
#define MV_PP2_TXQ_RSVD_CLR_Q_MASK (0xFF << MV_PP2_TXQ_RSVD_CLR_Q_OFFSET)
/*-------------------------------------------------------------------------------*/
/* Direct access - per TXQ, per CPU */
#define MV_PP2_TXQ_SENT_REG(txq) (MV_PP2_REG_BASE + 0x3c00 + 4 * (txq))
#define MV_PP2_TRANSMITTED_COUNT_OFFSET 16
#define MV_PP2_TRANSMITTED_COUNT_MASK (0x3FFF << MV_PP2_TRANSMITTED_COUNT_OFFSET)
/*-------------------------------------------------------------------------------*/
#define MV_PP2_AGGR_TXQ_DESC_ADDR_REG(cpu) (MV_PP2_REG_BASE + 0x2100 + 4 * (cpu))
#define MV_PP2_AGGR_TXQ_DESC_SIZE_REG(cpu) (MV_PP2_REG_BASE + 0x2140 + 4 * (cpu))
#define MV_PP2_AGGR_TXQ_DESC_SIZE_OFFSET 4
#define MV_PP2_AGGR_TXQ_DESC_SIZE_MASK (0x3FF << MV_PP2_AGGR_TXQ_DESC_SIZE_OFFSET)
/*-------------------------------------------------------------------------------*/
#define MV_PP2_AGGR_TXQ_STATUS_REG(cpu) (MV_PP2_REG_BASE + 0x2180 + 4 * (cpu))
#define MV_PP2_AGGR_TXQ_PENDING_OFFSET 0
#define MV_PP2_AGGR_TXQ_PENDING_MASK (0x3FFF << MV_PP2_AGGR_TXQ_PENDING_OFFSET)
/*-------------------------------------------------------------------------------*/
#define MV_PP2_AGGR_TXQ_INDEX_REG(cpu) (MV_PP2_REG_BASE + 0x21c0 + 4 * (cpu))
/*-------------------------------------------------------------------------------*/
/* Registers for HWF to SWF switching */
#define MV_PP2_FWD_SWITCH_FLOW_ID_REG (MV_PP2_REG_BASE + 0x2200)
#define MV_PP2_FWD_SWITCH_CTRL_REG (MV_PP2_REG_BASE + 0x2204)
#define MV_PP2_FWD_SWITCH_TXQ_OFFS 0
#define MV_PP2_FWD_SWITCH_TXQ_MAX 255
#define MV_PP2_FWD_SWITCH_TXQ_MASK (255 << MV_PP2_FWD_SWITCH_TXQ_OFFS)
#define MV_PP2_FWD_SWITCH_TXQ_VAL(txq) (((txq) << MV_PP2_FWD_SWITCH_TXQ_OFFS) & \
MV_PP2_FWD_SWITCH_TXQ_MASK)
#define MV_PP2_FWD_SWITCH_RXQ_OFFS 8
#define MV_PP2_FWD_SWITCH_RXQ_MAX 255
#define MV_PP2_FWD_SWITCH_RXQ_MASK (255 << MV_PP2_FWD_SWITCH_RXQ_OFFS)
#define MV_PP2_FWD_SWITCH_RXQ_VAL(rxq) (((rxq) << MV_PP2_FWD_SWITCH_RXQ_OFFS) & \
MV_PP2_FWD_SWITCH_RXQ_MASK)
#define MV_PP2_FWD_SWITCH_TIMEOUT_OFFS 16
#define MV_PP2_FWD_SWITCH_TIMEOUT_BITS 10
#define MV_PP2_FWD_SWITCH_TIMEOUT_MAX ((1 << MV_PP2_FWD_SWITCH_TIMEOUT_BITS) - 1)
#define MV_PP2_FWD_SWITCH_TIMEOUT_MASK (MV_PP2_FWD_SWITCH_TIMEOUT_MAX << MV_PP2_FWD_SWITCH_TIMEOUT_OFFS)
#define MV_PP2_FWD_SWITCH_TIMEOUT_VAL(time) (((time) << MV_PP2_FWD_SWITCH_TIMEOUT_OFFS) & \
MV_PP2_FWD_SWITCH_TIMEOUT_MASK)
#define MV_PP2_FWD_SWITCH_STATUS_REG (MV_PP2_REG_BASE + 0x2208)
#define MV_PP2_FWD_SWITCH_STATE_OFFS 0
#define MV_PP2_FWD_SWITCH_STATE_MASK (0x7 << MV_PP2_FWD_SWITCH_STATE_OFFS)
#define MV_PP2_FWD_SWITCH_STATUS_OFFS 4
#define MV_PP2_FWD_SWITCH_STATUS_MASK (0x3 << MV_PP2_FWD_SWITCH_STATUS_OFFS)
#define MV_PP2_FWD_SWITCH_TIMER_OFFS 16
#define MV_PP2_FWD_SWITCH_TIMER_BITS 10
#define MV_PP2_FWD_SWITCH_TIMER_MAX ((1 << MV_PP2_FWD_SWITCH_TIMER_BITS) - 1)
#define MV_PP2_FWD_SWITCH_TIMER_MASK (MV_PP2_FWD_SWITCH_TIMER_MAX << MV_PP2_FWD_SWITCH_TIMER_OFFS)
/*-------------------------------------------------------------------------------*/
/* Unused registers */
#define MV_PP2_INTERNAL_BUF_CTRL_REG (MV_PP2_REG_BASE + 0x2220)
/* No CPU access to Physcal TXQ descriptors, so Snoop doesn't needed */
#define MV_PP2_TX_DESC_SNOOP_REG (MV_PP2_REG_BASE + 0x2224)
/*-------------------------------------------------------------------------------*/
/************************** Interrupt Cause and Mask registers ******************/
#define MV_PP2_ISR_RX_THRESHOLD_REG(port) (MV_PP2_REG_BASE + 0x5200 + 4 * (port))
#define MV_PP2_ISR_RX_THRESHOLD_OFFS 4
#define MV_PP2_ISR_RX_THRESHOLD_MASK 0xFFFFF0
#define MV_PP2_ISR_RXQ_GROUP_REG(port) (MV_PP2_REG_BASE + 0x5400 + 4 * (port))
#define MV_PP2_ISR_ENABLE_REG(port) (MV_PP2_REG_BASE + 0x5420 + 4 * (port))
#define MV_PP2_ISR_ENABLE_INTERRUPT_OFFS 0
#define MV_PP2_ISR_ENABLE_INTERRUPT_MASK 0xFFFF
#define MV_PP2_ISR_ENABLE_INTERRUPT(cpuMask) (((cpuMask) << MV_PP2_ISR_ENABLE_INTERRUPT_OFFS)\
& MV_PP2_ISR_ENABLE_INTERRUPT_MASK)
#define MV_PP2_ISR_DISABLE_INTERRUPT_OFFS 16
#define MV_PP2_ISR_DISABLE_INTERRUPT_MASK (0xFFFF << MV_PP2_ISR_DISABLE_INTERRUPT_OFFS)
#define MV_PP2_ISR_DISABLE_INTERRUPT(cpuMask) (((cpuMask) << MV_PP2_ISR_DISABLE_INTERRUPT_OFFS)\
& MV_PP2_ISR_DISABLE_INTERRUPT_MASK)
#define MV_PP2_ISR_RX_TX_CAUSE_REG(port) (MV_PP2_REG_BASE + 0x5480 + 4 * (port))
#define MV_PP2_ISR_RX_TX_MASK_REG(port) (MV_PP2_REG_BASE + 0x54a0 + 4 * (port))
#define MV_PP2_CAUSE_RXQ_OCCUP_DESC_OFFS 0
#define MV_PP2_CAUSE_RXQ_OCCUP_DESC_BIT(q) (MV_PP2_CAUSE_RXQ_OCCUP_DESC_OFFS + (q))
#define MV_PP2_CAUSE_RXQ_OCCUP_DESC_ALL_MASK (0xFFFF << MV_PP2_CAUSE_RXQ_OCCUP_DESC_OFFS)
#define MV_PP2_CAUSE_RXQ_OCCUP_DESC_MASK(q) (1 << (MV_PP2_CAUSE_RXQ_OCCUP_DESC_BIT(q)))
#define MV_PP2_CAUSE_TXQ_OCCUP_DESC_OFFS 16
#define MV_PP2_CAUSE_TXQ_OCCUP_DESC_BIT(q) (MV_PP2_CAUSE_TXQ_OCCUP_DESC_OFFS + (q))
#define MV_PP2_CAUSE_TXQ_OCCUP_DESC_ALL_MASK (0xFF << MV_PP2_CAUSE_TXQ_OCCUP_DESC_OFFS)
#define MV_PP2_CAUSE_TXQ_OCCUP_DESC_MASK(q) (1 << (MV_PP2_CAUSE_TXQ_SENT_DESC_BIT(q)))
#define MV_PP2_CAUSE_RX_FIFO_OVERRUN_BIT 24
#define MV_PP2_CAUSE_RX_FIFO_OVERRUN_MASK (1 << MV_PP2_CAUSE_RX_FIFO_OVERRUN_BIT)
#define MV_PP2_CAUSE_FCS_ERR_BIT 25
#define MV_PP2_CAUSE_FCS_ERR_MASK (1 << MV_PP2_CAUSE_FCS_ERR_BIT)
#define MV_PP2_CAUSE_TX_FIFO_UNDERRUN_BIT 26
#define MV_PP2_CAUSE_TX_FIFO_UNDERRUN_MASK (1 << MV_PP2_CAUSE_TX_FIFO_UNDERRUN_BIT)
#define MV_PP2_CAUSE_TX_EXCEPTION_SUM_BIT 29
#define MV_PP2_CAUSE_TX_EXCEPTION_SUM_MASK (1 << MV_PP2_CAUSE_TX_EXCEPTION_SUM_BIT)
#define MV_PP2_CAUSE_RX_EXCEPTION_SUM_BIT 30
#define MV_PP2_CAUSE_RX_EXCEPTION_SUM_MASK (1 << MV_PP2_CAUSE_RX_EXCEPTION_SUM_BIT)
#define MV_PP2_CAUSE_MISC_SUM_BIT 31
#define MV_PP2_CAUSE_MISC_SUM_MASK (1 << MV_PP2_CAUSE_MISC_SUM_BIT)
#define MV_PP2_CAUSE_MISC_ERR_SUM_MASK (0xE7000000)
#define MV_PP2_ISR_PON_RX_TX_CAUSE_REG (MV_PP2_REG_BASE + 0x549c)
#define MV_PP2_ISR_PON_RX_TX_MASK_REG (MV_PP2_REG_BASE + 0x54bc)
#define MV_PP2_PON_CAUSE_RXQ_OCCUP_DESC_OFFS 0
#define MV_PP2_PON_CAUSE_RXQ_OCCUP_DESC_BIT(q) (MV_PP2_PON_CAUSE_RXQ_OCCUP_DESC_OFFS + (q))
#define MV_PP2_PON_CAUSE_RXQ_OCCUP_DESC_ALL_MASK (0xFFFF << MV_PP2_PON_CAUSE_RXQ_OCCUP_DESC_OFFS)
#define MV_PP2_PON_CAUSE_RXQ_OCCUP_DESC_MASK(q) (1 << (MV_PP2_PON_CAUSE_RXQ_OCCUP_DESC_BIT(q)))
#define MV_PP2_PON_CAUSE_RX_FIFO_OVERRUN_BIT 16
#define MV_PP2_PON_CAUSE_RX_FIFO_OVERRUN_MASK (1 << MV_PP2_CAUSE_RX_FIFO_OVERRUN_BIT)
#define MV_PP2_PON_CAUSE_FCS_ERR_BIT 17
#define MV_PP2_PON_CAUSE_FCS_ERR_MASK (1 << MV_PP2_PON_CAUSE_FCS_ERR_BIT)
#define MV_PP2_PON_BYTE_COUNT_ERR_BIT 18
#define MV_PP2_PON_BYTE_COUNT_ERR_MASK (1 << MV_PP2_PON_BYTE_COUNT_ERR_BIT)
#define MV_PP2_PON_CAUSE_TX_FIFO_UNDERRUN_BIT 21
#define MV_PP2_PON_CAUSE_TX_FIFO_UNDERRUN_MASK (1 << MV_PP2_PON_CAUSE_TX_FIFO_UNDERRUN_BIT)
#define MV_PP2_PON_CAUSE_TXP_OCCUP_DESC_OFFS 22
#define MV_PP2_PON_CAUSE_TXP_OCCUP_DESC_ALL_MASK (0xFF << MV_PP2_PON_CAUSE_TXP_OCCUP_DESC_OFFS)
#define MV_PP2_PON_CAUSE_TX_EXCEPTION_SUM_BIT 29
#define MV_PP2_PON_CAUSE_TX_EXCEPTION_SUM_MASK (1 << MV_PP2_PON_CAUSE_TX_EXCEPTION_SUM_BIT)
#define MV_PP2_PON_CAUSE_RX_EXCEPTION_SUM_BIT 30
#define MV_PP2_PON_CAUSE_RX_EXCEPTION_SUM_MASK (1 << MV_PP2_PON_CAUSE_RX_EXCEPTION_SUM_BIT)
#define MV_PP2_PON_CAUSE_MISC_SUM_BIT 31
#define MV_PP2_PON_CAUSE_MISC_SUM_MASK (1 << MV_PP2_PON_CAUSE_MISC_SUM_BIT)
#define MV_PP2_PON_CAUSE_MISC_ERR_SUM_MASK (0xC0270000)
/* TCONT Cause registers 54c0 - 54cc */
/* TCONT Mask registers 54d0 - 54dc */
#define MV_PP2_ISR_RX_ERR_CAUSE_REG(port) (MV_PP2_REG_BASE + 0x5500 + 4 * (port))
#define MV_PP2_ISR_RX_ERR_MASK_REG(port) (MV_PP2_REG_BASE + 0x5520 + 4 * (port))
#define MV_PP2_ISR_TX_ERR_CAUSE_REG(port) (MV_PP2_REG_BASE + 0x5500 + 4 * (port))
#define MV_PP2_ISR_TX_ERR_MASK_REG(port) (MV_PP2_REG_BASE + 0x5520 + 4 * (port))
/* TCONT TX exception Cause registers 5580 - 558c */
/* TCONT TX exception Mask registers 5590 - 559c */
#define MV_PP2_ISR_PON_TX_UNDR_CAUSE_REG (MV_PP2_REG_BASE + 0x55a0)
#define MV_PP2_ISR_PON_TX_UNDR_MASK_REG (MV_PP2_REG_BASE + 0x55a4)
#define MV_PP2_ISR_MISC_CAUSE_REG (MV_PP2_REG_BASE + 0x55b0)
#define MV_PP2_ISR_MISC_MASK_REG (MV_PP2_REG_BASE + 0x55b4)
/*-------------------------------------------------------------------------------*/
#define MV_PP2_OVERRUN_DROP_REG(port) (MV_PP2_REG_BASE + 0x7000 + 4 * (port))
#define MV_PP2_CLS_DROP_REG(port) (MV_PP2_REG_BASE + 0x7020 + 4 * (port))
/******************************** Port Drop counters ppv2.0*****************************/
#define MV_PP2_V0_POLICER_DROP_REG(plcr) (MV_PP2_REG_BASE + 0x7040 + 4 * (plcr))
#define MV_PP2_V0_TX_EARLY_DROP_REG(eport) (MV_PP2_REG_BASE + 0x7080 + 4 * (eport))
#define MV_PP2_V0_TX_DESC_DROP_REG(eport) (MV_PP2_REG_BASE + 0x7100 + 4 * (eport))
#define MV_PP2_V0_RX_EARLY_DROP_REG(rxq) (MV_PP2_REG_BASE + 0x7200 + 4 * (rxq))
#define MV_PP2_V0_RX_DESC_DROP_REG(rxq) (MV_PP2_REG_BASE + 0x7400 + 4 * (rxq))
/************************************ counters ppv2.1 **********************************/
#define MV_PP2_V1_CNT_IDX_REG (MV_PP2_REG_BASE + 0x7040)
/* TX counters index */
#define TX_CNT_IDX_TXP 3
#define TX_CNT_IDX_TXQ 0
#define TX_CNT_IDX(port, txp, txq) ((MV_PPV2_TXP_PHYS(port, txp) << 3) | (txq))
#define MV_PP2_V1_TX_DESC_ENQ_REG (MV_PP2_REG_BASE + 0x7100)
#define MV_PP2_V1_TX_DESC_ENQ_TO_DRAM_REG (MV_PP2_REG_BASE + 0x7104)
#define MV_PP2_V1_TX_BUF_ENQ_TO_DRAM_REG (MV_PP2_REG_BASE + 0x7108)
#define MV_PP2_V1_TX_DESC_HWF_ENQ_REG (MV_PP2_REG_BASE + 0x710c)
#define MV_PP2_V1_TX_PKT_DQ_REG (MV_PP2_REG_BASE + 0x7130)
#define MV_PP2_V1_TX_PKT_FULLQ_DROP_REG (MV_PP2_REG_BASE + 0x7200)
#define MV_PP2_V1_TX_PKT_EARLY_DROP_REG (MV_PP2_REG_BASE + 0x7204)
#define MV_PP2_V1_TX_PKT_BM_DROP_REG (MV_PP2_REG_BASE + 0x7208)
#define MV_PP2_V1_TX_PKT_BM_MC_DROP_REG (MV_PP2_REG_BASE + 0x720c)
#define MV_PP2_V1_RX_PKT_FULLQ_DROP_REG (MV_PP2_REG_BASE + 0x7220)
#define MV_PP2_V1_RX_PKT_EARLY_DROP_REG (MV_PP2_REG_BASE + 0x7224)
#define MV_PP2_V1_RX_PKT_BM_DROP_REG (MV_PP2_REG_BASE + 0x7228)
#define MV_PP2_V1_RX_DESC_ENQ_REG (MV_PP2_REG_BASE + 0x7120)
#define MV_PP2_V1_OVERFLOW_MC_DROP_REG (MV_PP2_REG_BASE + 0x770c)
/*-------------------------------------------------------------------------------*/
/************************** TX Scheduler Registers ******************************/
/* Indirect access */
#define MV_PP2_TXP_SCHED_PORT_INDEX_REG (MV_PP2_REG_BASE + 0x8000)
#define MV_PP2_TXP_SCHED_Q_CMD_REG (MV_PP2_REG_BASE + 0x8004)
#define MV_PP2_TXP_SCHED_ENQ_OFFSET 0
#define MV_PP2_TXP_SCHED_ENQ_MASK (0xFF << MV_PP2_TXP_SCHED_ENQ_OFFSET)
#define MV_PP2_TXP_SCHED_DISQ_OFFSET 8
#define MV_PP2_TXP_SCHED_DISQ_MASK (0xFF << MV_PP2_TXP_SCHED_DISQ_OFFSET)
/*-----------------------------------------------------------------------------------------------*/
#define MV_PP2_TXP_SCHED_CMD_1_REG (MV_PP2_REG_BASE + 0x8010)
#define MV_PP2_TXP_SCHED_RESET_BIT 0
#define MV_PP2_TXP_SCHED_RESET_MASK (1 << MV_PP2_TXP_SCHED_RESET_BIT)
#define MV_PP2_TXP_SCHED_PTP_SYNC_BIT 1
#define MV_PP2_TXP_SCHED_PTP_SYNC_MASK (1 << MV_PP2_TXP_SCHED_PTP_SYNC_BIT)
#define MV_PP2_TXP_SCHED_EJP_ENABLE_BIT 2
#define MV_PP2_TXP_SCHED_EJP_ENABLE_MASK (1 << MV_PP2_TXP_SCHED_EJP_ENABLE_BIT)
/*-----------------------------------------------------------------------------------------------*/
/* Transmit Queue Fixed Priority Configuration (TQFPC) */
#define MV_PP2_TXP_SCHED_FIXED_PRIO_REG (MV_PP2_REG_BASE + 0x8014)
#define MV_PP2_TXP_FIXED_PRIO_OFFS 0
#define MV_PP2_TXP_FIXED_PRIO_MASK (0xFF << MV_PP2_TX_FIXED_PRIO_OFFS)
/*-----------------------------------------------------------------------------------------------*/
/* Basic Refill No of Clocks (BRC) */
#define MV_PP2_TXP_SCHED_PERIOD_REG (MV_PP2_REG_BASE + 0x8018)
#define MV_PP2_TXP_REFILL_CLOCKS_OFFS 0
#define MV_PP2_TXP_REFILL_CLOCKS_MIN 16
#define MV_PP2_TXP_REFILL_CLOCKS_MASK (0xFFFF << MV_PP2_TXP_REFILL_CLOCKS_OFFS)
/*-----------------------------------------------------------------------------------------------*/
/* Port Maximum Transmit Unit (PMTU) */
#define MV_PP2_TXP_SCHED_MTU_REG (MV_PP2_REG_BASE + 0x801c)
#define MV_PP2_TXP_MTU_OFFS 0
#define MV_PP2_TXP_MTU_MAX 0x7FFFF
#define MV_PP2_TXP_MTU_ALL_MASK (MV_PP2_TXP_MTU_MAX << MV_PP2_TXP_MTU_OFFS)
#define MV_PP2_TXP_MTU_MASK(mtu) ((mtu) << MV_PP2_TXP_MTU_OFFS)
/*-----------------------------------------------------------------------------------------------*/
/* Port Bucket Refill (PRefill) */
#define MV_PP2_TXP_SCHED_REFILL_REG (MV_PP2_REG_BASE + 0x8020)
#define MV_PP2_TXP_REFILL_TOKENS_OFFS 0
#define MV_PP2_TXP_REFILL_TOKENS_MAX 0x7FFFF
#define MV_PP2_TXP_REFILL_TOKENS_ALL_MASK (MV_PP2_TXP_REFILL_TOKENS_MAX << MV_PP2_TXP_REFILL_TOKENS_OFFS)
#define MV_PP2_TXP_REFILL_TOKENS_MASK(val) ((val) << MV_PP2_TXP_REFILL_TOKENS_OFFS)
#define MV_PP2_TXP_REFILL_PERIOD_OFFS 20
#define MV_PP2_TXP_REFILL_PERIOD_MAX 0x3FF
#define MV_PP2_TXP_REFILL_PERIOD_ALL_MASK (MV_PP2_TXP_REFILL_PERIOD_MAX << MV_PP2_TXP_REFILL_PERIOD_OFFS)
#define MV_PP2_TXP_REFILL_PERIOD_MASK(val) ((val) << MV_PP2_TXP_REFILL_PERIOD_OFFS)
/*-----------------------------------------------------------------------------------------------*/
/* Port Maximum Token Bucket Size (PMTBS) */
#define MV_PP2_TXP_SCHED_TOKEN_SIZE_REG (MV_PP2_REG_BASE + 0x8024)
#define MV_PP2_TXP_TOKEN_SIZE_MAX 0xFFFFFFFF
/*-----------------------------------------------------------------------------------------------*/
/* Port Token Bucket Counter (PMTBS) */
#define MV_PP2_TXP_SCHED_TOKEN_CNTR_REG (MV_PP2_REG_BASE + 0x8028)
#define MV_PP2_TXP_TOKEN_CNTR_MAX 0xFFFFFFFF
/*-----------------------------------------------------------------------------------------------*/
/* Queue Bucket Refill (QRefill) */
#define MV_PP2_TXQ_SCHED_REFILL_REG(q) (MV_PP2_REG_BASE + 0x8040 + ((q) << 2))
#define MV_PP2_TXQ_REFILL_TOKENS_OFFS 0
#define MV_PP2_TXQ_REFILL_TOKENS_MAX 0x7FFFF
#define MV_PP2_TXQ_REFILL_TOKENS_ALL_MASK (MV_PP2_TXQ_REFILL_TOKENS_MAX << MV_PP2_TXQ_REFILL_TOKENS_OFFS)
#define MV_PP2_TXQ_REFILL_TOKENS_MASK(val) ((val) << MV_PP2_TXQ_REFILL_TOKENS_OFFS)
#define MV_PP2_TXQ_REFILL_PERIOD_OFFS 20
#define MV_PP2_TXQ_REFILL_PERIOD_MAX 0x3FF
#define MV_PP2_TXQ_REFILL_PERIOD_ALL_MASK (MV_PP2_TXQ_REFILL_PERIOD_MAX << MV_PP2_TXQ_REFILL_PERIOD_OFFS)
#define MV_PP2_TXQ_REFILL_PERIOD_MASK(val) ((val) << MV_PP2_TXQ_REFILL_PERIOD_OFFS)
/*-----------------------------------------------------------------------------------------------*/
/* Queue Maximum Token Bucket Size (QMTBS) */
#define MV_PP2_TXQ_SCHED_TOKEN_SIZE_REG(q) (MV_PP2_REG_BASE + 0x8060 + ((q) << 2))
#define MV_PP2_TXQ_TOKEN_SIZE_MAX 0x7FFFFFFF
/*-----------------------------------------------------------------------------------------------*/
/* Queue Token Bucket Counter (PMTBS) */
#define MV_PP2_TXQ_SCHED_TOKEN_CNTR_REG(q) (MV_PP2_REG_BASE + 0x8080 + ((q) << 2))
#define MV_PP2_TXQ_TOKEN_CNTR_MAX 0xFFFFFFFF
/*-----------------------------------------------------------------------------------------------*/
/* Transmit Queue Arbiter Configuration (TQxAC) */
#define MV_PP2_TXQ_SCHED_WRR_REG(q) (MV_PP2_REG_BASE + 0x80A0 + ((q) << 2))
#define MV_PP2_TXQ_WRR_WEIGHT_OFFS 0
#define MV_PP2_TXQ_WRR_WEIGHT_MAX 0xFF
#define MV_PP2_TXQ_WRR_WEIGHT_ALL_MASK (MV_PP2_TXQ_WRR_WEIGHT_MAX << MV_PP2_TXQ_WRR_WEIGHT_OFFS)
#define MV_PP2_TXQ_WRR_WEIGHT_MASK(weigth) ((weigth) << MV_PP2_TXQ_WRR_WEIGHT_OFFS)
#define MV_PP2_TXQ_WRR_BYTE_COUNT_OFFS 8
#define MV_PP2_TXQ_WRR_BYTE_COUNT_MASK (0x3FFFF << MV_PP2_TXQ_WRR_BYTE_COUNT_OFFS)
/************************** PPv2 HW defines ******************************/
#define MV_PP2_RX_FIFO_PORT_DATA_SIZE 0x2000
#define MV_PP2_RX_FIFO_PORT_ATTR_SIZE 0x80
#define MV_PP2_RX_FIFO_PORT_MIN_PKT 0x80
#define MV_PP2_MAX_PORTS 8 /* Maximum number of ports supported by PPv2 HW */
#define MV_PP2_MAX_RXQS_TOTAL 256 /* Maximum number of RXQs supported by PPv2 HW for all ports */
#define MV_PP2_DESC_ALIGNED_SIZE 32
#define MV_PP2_DESC_Q_ALIGN 512
/************************** RX/TX Descriptor defines and inlines ******************************/
/* RXQ */
typedef struct pp2_rx_desc {
MV_U32 status;
MV_U16 parserInfo;
MV_U16 dataSize;
MV_U32 bufPhysAddr;
MV_U32 bufCookie;
MV_U16 gemPortIdPktColor;
MV_U16 csumL4;
MV_U8 bmQset;
MV_U8 reserved;
MV_U16 classifyInfo;
MV_U32 flowId;
MV_U32 reserved2;
} PP2_RX_DESC;
/* Bits of "status" field */
#define PP2_RX_L3_OFFSET_OFFS 0
#define PP2_RX_L3_OFFSET_MASK (0x7F << PP2_RX_L3_OFFSET_OFFS)
#define PP2_RX_IP_HLEN_OFFS 8
#define PP2_RX_IP_HLEN_MASK (0x1F << PP2_RX_IP_HLEN_OFFS)
#define PP2_RX_ERR_CODE_OFFS 13
#define PP2_RX_ERR_CODE_MASK (3 << PP2_RX_ERR_CODE_OFFS)
#define PP2_RX_ERR_CRC (0 << PP2_RX_ERR_CODE_OFFS)
#define PP2_RX_ERR_OVERRUN (1 << PP2_RX_ERR_CODE_OFFS)
#define PP2_RX_RESERVED (2 << PP2_RX_ERR_CODE_OFFS)
#define PP2_RX_ERR_RESOURCE (3 << PP2_RX_ERR_CODE_OFFS)
#define PP2_RX_ES_BIT 15
#define PP2_RX_ES_MASK (1 << PP2_RX_ES_BIT)
#define PP2_RX_BM_POOL_ID_OFFS 16
#define PP2_RX_BM_POOL_ALL_MASK (0x7 << PP2_RX_BM_POOL_ID_OFFS)
#define PP2_RX_BM_POOL_ID_MASK(pool) ((pool) << PP2_RX_BM_POOL_ID_OFFS)
#define PP2_RX_HWF_SYNC_BIT 21
#define PP2_RX_HWF_SYNC_MASK (1 << PP2_RX_HWF_SYNC_BIT)
#define PP2_RX_L4_CHK_OK_BIT 22
#define PP2_RX_L4_CHK_OK_MASK (1 << PP2_RX_L4_CHK_OK_BIT)
#define PP2_RX_IP_FRAG_BIT 23
#define PP2_RX_IP_FRAG_MASK (1 << PP2_RX_IP_FRAG_BIT)
#define PP2_RX_IP4_HEADER_ERR_BIT 24
#define PP2_RX_IP4_HEADER_ERR_MASK (1 << PP2_RX_IP4_HEADER_ERR_BIT)
#define PP2_RX_L4_OFFS 25
#define PP2_RX_L4_MASK (7 << PP2_RX_L4_OFFS)
/* Value 0 - N/A, 3-7 - User Defined */
#define PP2_RX_L4_TCP (1 << PP2_RX_L4_OFFS)
#define PP2_RX_L4_UDP (2 << PP2_RX_L4_OFFS)
#define PP2_RX_L3_OFFS 28
#define PP2_RX_L3_MASK (7 << PP2_RX_L3_OFFS)
/* Value 0 - N/A, 6-7 - User Defined */
#define PP2_RX_L3_IP4 (1 << PP2_RX_L3_OFFS)
#define PP2_RX_L3_IP4_OPT (2 << PP2_RX_L3_OFFS)
#define PP2_RX_L3_IP4_OTHER (3 << PP2_RX_L3_OFFS)
#define PP2_RX_L3_IP6 (4 << PP2_RX_L3_OFFS)
#define PP2_RX_L3_IP6_EXT (5 << PP2_RX_L3_OFFS)
#define PP2_RX_BUF_HDR_BIT 31
#define PP2_RX_BUF_HDR_MASK (1 << PP2_RX_BUF_HDR_BIT)
/* status field MACROs */
#define PP2_RX_L3_IS_IP4(status) (((status) & PP2_RX_L3_MASK) == PP2_RX_L3_IP4)
#define PP2_RX_L3_IS_IP4_OPT(status) (((status) & PP2_RX_L3_MASK) == PP2_RX_L3_IP4_OPT)
#define PP2_RX_L3_IS_IP4_OTHER(status) (((status) & PP2_RX_L3_MASK) == PP2_RX_L3_IP4_OTHER)
#define PP2_RX_L3_IS_IP6(status) (((status) & PP2_RX_L3_MASK) == PP2_RX_L3_IP6)
#define PP2_RX_L3_IS_IP6_EXT(status) (((status) & PP2_RX_L3_MASK) == PP2_RX_L3_IP6_EXT)
#define PP2_RX_L4_IS_UDP(status) (((status) & PP2_RX_L4_MASK) == PP2_RX_L4_UDP)
#define PP2_RX_L4_IS_TCP(status) (((status) & PP2_RX_L4_MASK) == PP2_RX_L4_TCP)
#define PP2_RX_IP4_HDR_ERR(status) ((status) & PP2_RX_IP4_HEADER_ERR_MASK)
#define PP2_RX_IP4_FRG(status) ((status) & PP2_RX_IP_FRAG_MASK)
#define PP2_RX_L4_CHK_OK(status) ((status) & PP2_RX_L4_CHK_OK_MASK)
/* Sub fields of "parserInfo" field */
#define PP2_RX_LKP_ID_OFFS 0
#define PP2_RX_LKP_ID_BITS 6
#define PP2_RX_LKP_ID_MASK (((1 << PP2_RX_LKP_ID_BITS) - 1) << PP2_RX_LKP_ID_OFFS)
#define PP2_RX_CPU_CODE_OFFS 6
#define PP2_RX_CPU_CODE_BITS 3
#define PP2_RX_CPU_CODE_MASK (((1 << PP2_RX_CPU_CODE_BITS) - 1) << PP2_RX_CPU_CODE_OFFS)
#define PP2_RX_PPPOE_BIT 9
#define PP2_RX_PPPOE_MASK (1 << PP2_RX_PPPOE_BIT)
#define PP2_RX_L3_CAST_OFFS 10
#define PP2_RX_L3_CAST_BITS 2
#define PP2_RX_L3_CAST_MASK (((1 << PP2_RX_L3_CAST_BITS) - 1) << PP2_RX_L3_CAST_OFFS)
#define PP2_RX_L2_CAST_OFFS 12
#define PP2_RX_L2_CAST_BITS 2
#define PP2_RX_L2_CAST_MASK (((1 << PP2_RX_L2_CAST_BITS) - 1) << PP2_RX_L2_CAST_OFFS)
#define PP2_RX_VLAN_INFO_OFFS 14
#define PP2_RX_VLAN_INFO_BITS 2
#define PP2_RX_VLAN_INFO_MASK (((1 << PP2_RX_VLAN_INFO_BITS) - 1) << PP2_RX_VLAN_INFO_OFFS)
/* Bits of "bmQset" field */
#define PP2_RX_BUFF_QSET_NUM_OFFS 0
#define PP2_RX_BUFF_QSET_NUM_MASK (0x7f << PP2_RX_BUFF_QSET_NUM_OFFS)
#define PP2_RX_BUFF_TYPE_OFFS 7
#define PP2_RX_BUFF_TYPE_MASK (0x1 << PP2_RX_BUFF_TYPE_OFFS)
/*-------------------------------------------------------------------------------*/
/* TXQ */
typedef struct pp2_tx_desc {
MV_U32 command;
MV_U8 pktOffset;
MV_U8 physTxq;
MV_U16 dataSize;
MV_U32 bufPhysAddr;
MV_U32 bufCookie;
MV_U32 hwCmd[3];
MV_U32 reserved;
} PP2_TX_DESC;
/* Bits of "command" field */
#define PP2_TX_L3_OFFSET_OFFS 0
#define PP2_TX_L3_OFFSET_MASK (0x7F << PP2_TX_L3_OFFSET_OFFS)
#define PP2_TX_BUF_RELEASE_MODE_BIT 7
#define PP2_TX_BUF_RELEASE_MODE_MASK (1 << PP2_TX_BUF_RELEASE_MODE_BIT)
#define PP2_TX_IP_HLEN_OFFS 8
#define PP2_TX_IP_HLEN_MASK (0x1F << PP2_TX_IP_HLEN_OFFS)
#define PP2_TX_L4_CSUM_OFFS 13
#define PP2_TX_L4_CSUM_MASK (3 << PP2_TX_L4_CSUM_OFFS)
#define PP2_TX_L4_CSUM (0 << PP2_TX_L4_CSUM_OFFS)
#define PP2_TX_L4_CSUM_FRG (1 << PP2_TX_L4_CSUM_OFFS)
#define PP2_TX_L4_CSUM_NOT (2 << PP2_TX_L4_CSUM_OFFS)
#define PP2_TX_IP_CSUM_DISABLE_BIT 15
#define PP2_TX_IP_CSUM_DISABLE_MASK (1 << PP2_TX_IP_CSUM_DISABLE_BIT)
/* 3 bits: 16..18 */
#define PP2_TX_POOL_INDEX_OFFS 16
#define PP2_TX_POOL_INDEX_MASK (7 << PP2_TX_POOL_INDEX_OFFS)
/* bit 19 - Reserved */
#define PP2_TX_PKT_OFFS_9_BIT 20
#define PP2_TX_PKT_OFFS_9_MASK (1 << PP2_TX__PKT_OFFS_9_BIT)
#define PP2_TX_HWF_SYNC_BIT 21
#define PP2_TX_HWF_SYNC_MASK (1 << PP2_TX_HWF_SYNC_BIT)
#define PP2_TX_HWF_BIT 22
#define PP2_TX_HWF_MASK (1 << PP2_TX_HWF_BIT)
#define PP2_TX_PADDING_DISABLE_BIT 23
#define PP2_TX_PADDING_DISABLE_MASK (1 << PP2_TX_PADDING_DISABLE_BIT)
#define PP2_TX_L4_OFFS 24
#define PP2_TX_L4_TCP (0 << PP2_TX_L4_OFFS)
#define PP2_TX_L4_UDP (1 << PP2_TX_L4_OFFS)
#define PP2_TX_L3_OFFS 26
#define PP2_TX_L3_IP4 (0 << PP2_TX_L3_OFFS)
#define PP2_TX_L3_IP6 (1 << PP2_TX_L3_OFFS)
#define PP2_TX_L_DESC_BIT 28
#define PP2_TX_L_DESC_MASK (1 << PP2_TX_L_DESC_BIT)
#define PP2_TX_F_DESC_BIT 29
#define PP2_TX_F_DESC_MASK (1 << PP2_TX_F_DESC_BIT)
#define PP2_TX_DESC_FRMT_BIT 30
#define PP2_TX_DESC_FRMT_MASK (1 << PP2_TX_DESC_FRMT_BIT)
#define PP2_TX_DESC_PER_BUF (0 << PP2_TX_DESC_FRMT_BIT)
#define PP2_TX_DESC_PER_PKT (1 << PP2_TX_DESC_FRMT_BIT)
#define PP2_TX_BUF_HDR_BIT 31
#define PP2_TX_BUF_HDR_MASK (1 << PP2_TX_BUF_HDR_BIT)
/* Bits of "hwCmd[0]" field - offset 0x10 */
#define PP2_TX_GEMPID_OFFS 0
#define PP2_TX_GEMPID_BITS 12
#define PP2_TX_GEMPID_ALL_MASK (((1 << PP2_TX_GEMPID_BITS) - 1) << PP2_TX_GEMPID_OFFS)
#define PP2_TX_GEMPID_MASK(gpid) (((gpid) & PP2_TX_GEMPID_ALL_MASK) << PP2_TX_GEMPID_OFFS)
#define PP2_TX_COLOR_OFFS 12
#define PP2_TX_COLOR_ALL_MASK (0x3 << PP2_TX_COLOR_OFFS)
#define PP2_TX_COLOR_GREEN 0
#define PP2_TX_COLOR_YELLOW 1
#define PP2_TX_COLOR_MASK(col) (((col) & PP2_TX_COLOR_ALL_MASK) << PP2_TX_COLOR_OFFS)
#define PP2_TX_DSA_OFFS 14
#define PP2_TX_DSA_ALL_MASK (0x3 << PP2_TX_DSA_OFFS)
#define PP2_TX_DSA_NONE 0
#define PP2_TX_DSA_TAG 1
#define PP2_TX_EDSA_TAG 2
#define PP2_TX_DSA_MASK(dsa) (((dsa) & PP2_TX_DSA_ALL_MASK) << PP2_TX_DSA_OFFS)
#define PP2_TX_L4_CSUM_INIT_OFFS 16
#define PP2_TX_L4_CSUM_INIT_MASK (0xffff << PP2_TX_L4_CSUM_INIT_OFFS)
/* Bits of "hwCmd[1]" field - offset 0x14 */
#define PP2_TX_MOD_QSET_OFFS 0
#define PP2_TX_MOD_QSET_BITS 7
#define PP2_TX_MOD_QSET_MASK (((1 << PP2_TX_MOD_QSET_BITS) - 1) << PP2_TX_MOD_QSET_OFFS)
#define PP2_TX_MOD_GRNTD_BIT 7
#define PP2_TX_MOD_GRNTD_MASK (1 << PP2_TX_MOD_GRNTD_BIT)
/* bits 8..15 are reserved */
#define PP2_TX_MOD_DSCP_OFFS 16
#define PP2_TX_MOD_DSCP_BITS 6
#define PP2_TX_MOD_DSCP_MASK (((1 << PP2_TX_MOD_DSCP_BITS) - 1) << PP2_TX_MOD_DSCP_OFFS)
#define PP2_TX_MOD_PRIO_OFFS 22
#define PP2_TX_MOD_PRIO_BITS 3
#define PP2_TX_MOD_PRIO_MASK (((1 << PP2_TX_MOD_PRIO_BITS) - 1) << PP2_TX_MOD_PRIO_OFFS)
#define PP2_TX_MOD_DSCP_EN_BIT 25
#define PP2_TX_MOD_DSCP_EN_MASK (1 << PP2_TX_MOD_DSCP_EN_BIT)
#define PP2_TX_MOD_PRIO_EN_BIT 26
#define PP2_TX_MOD_PRIO_EN_MASK (1 << PP2_TX_MOD_PRIO_EN_BIT)
#define PP2_TX_MOD_GEMPID_EN_BIT 27
#define PP2_TX_MOD_GEMPID_EN_MASK (1 << PP2_TX_MOD_GEMPID_EN_BIT)
/* Bits of "hwCmd[2]" field - offset 0x18 */
#define PP2_TX_PME_DPTR_OFFS 0
#define PP2_TX_PME_DPTR_ALL_MASK (0xffff << PP2_TX_PME_DPTR_OFFS)
#define PP2_TX_PME_DPTR_MASK(val) (((val) & PP2_TX_PME_DPTR_ALL_MASK) << PP2_TX_PME_DPTR_OFFS)
#define PP2_TX_PME_IPTR_OFFS 16
#define PP2_TX_PME_IPTR_ALL_MASK (0xff << PP2_TX_PME_IPTR_OFFS)
#define PP2_TX_PME_IPTR_MASK(val) (((val) & PP2_TX_PME_IPTR_ALL_MASK) << PP2_TX_PME_IPTR_OFFS)
/* Bit 24 - HWF_IDB is for HWF usage only */
#define PP2_TX_GEM_OEM_BIT 25
#define PP2_TX_GEM_OEM_MASK (1 << PP2_TX_GEM_OEM_BIT)
/* Bit 26 - ERROR_SUM is for HWF usage only */
#define PP2_TX_PON_FEC_BIT 27
#define PP2_TX_PON_FEC_MASK (1 << PP2_TX_PON_FEC_BIT)
#define PP2_TX_CPU_MAP_OFFS 28
#define PP2_TX_CPU_MAP_BITS 4
#define PP2_TX_CPU_MAP_MASK (((1 << PP2_TX_CPU_MAP_BITS) - 1) << PP2_TX_CPU_MAP_OFFS)
/************************** Buffer Header defines ******************************/
typedef struct pp2_buff_hdr {
MV_U32 nextBuffPhysAddr;
MV_U32 nextBuffVirtAddr;
MV_U16 byteCount;
MV_U16 info;
MV_U8 bmQset;
} PP2_BUFF_HDR;
/* info bits */
#define PP2_BUFF_HDR_INFO_MC_ID_OFFS 0
#define PP2_BUFF_HDR_INFO_MC_ID_MASK (0xfff << PP2_BUFF_HDR_INFO_MC_ID_OFFS)
#define PP2_BUFF_HDR_INFO_MC_ID(info) ((info & PP2_BUFF_HDR_INFO_MC_ID_MASK) >> PP2_BUFF_HDR_INFO_MC_ID_OFFS)
#define PP2_BUFF_HDR_INFO_LAST_OFFS 12
#define PP2_BUFF_HDR_INFO_LAST_MASK (0x1 << PP2_BUFF_HDR_INFO_LAST_OFFS)
#define PP2_BUFF_HDR_INFO_IS_LAST(info) ((info & PP2_BUFF_HDR_INFO_LAST_MASK) >> PP2_BUFF_HDR_INFO_LAST_OFFS)
/* bmQset bits */
#define PP2_BUFF_HDR_BM_QSET_NUM_OFFS 0
#define PP2_BUFF_HDR_BM_QSET_NUM_MASK (0x7f << PP2_BUFF_HDR_BM_QSET_NUM_OFFS)
#define PP2_BUFF_HDR_BM_QSET_TYPE_OFFS 7
#define PP2_BUFF_HDR_BM_QSET_TYPE_MASK (0x1 << PP2_BUFF_HDR_BM_QSET_TYPE_OFFS)
/************************** Ethernet misc ******************************/
#define ETH_MAX_DECODE_WIN 6
#define ETH_MAX_HIGH_ADDR_REMAP_WIN 4
/**** Address decode registers ****/
#define ETH_WIN_BASE_REG(win) (MV_PP2_REG_BASE + 0x4000 + ((win) << 2))
#define ETH_WIN_SIZE_REG(win) (MV_PP2_REG_BASE + 0x4020 + ((win) << 2))
#define ETH_WIN_REMAP_REG(win) (MV_PP2_REG_BASE + 0x4040 + ((win) << 2))
#define ETH_BASE_ADDR_ENABLE_REG (MV_PP2_REG_BASE + 0x4060)
/* The target associated with this window*/
#define ETH_WIN_TARGET_OFFS 0
#define ETH_WIN_TARGET_MASK (0xf << ETH_WIN_TARGET_OFFS)
/* The target attributes associated with window */
#define ETH_WIN_ATTR_OFFS 8
#define ETH_WIN_ATTR_MASK (0xff << ETH_WIN_ATTR_OFFS)
/* The Base address associated with window */
#define ETH_WIN_BASE_OFFS 16
#define ETH_WIN_BASE_MASK (0xFFFF << ETH_WIN_BASE_OFFS)
#define ETH_WIN_SIZE_OFFS 16
#define ETH_WIN_SIZE_MASK (0xFFFF << ETH_WIN_SIZE_OFFS)
/*-----------------------------------------------------------------------------------------------*/
#define ETH_TARGET_DEF_ADDR_REG (MV_PP2_REG_BASE + 0x4064)
#define ETH_TARGET_DEF_ID_REG (MV_PP2_REG_BASE + 0x4068)
/*-----------------------------------------------------------------------------------------------*/
#endif /* __MV_PP2_GBE_REGS_H__ */