From 7a1e830cbcd5d33aa7fcdd8732e6ea26510508fd Mon Sep 17 00:00:00 2001 From: Juli Mallett Date: Sun, 28 Nov 2010 06:20:41 +0000 Subject: Import Cavium Octeon SDK 2.0 Simple Executive from cnusers.org. --- cvmx-pip-defs.h | 3926 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 3926 insertions(+) create mode 100644 cvmx-pip-defs.h (limited to 'cvmx-pip-defs.h') diff --git a/cvmx-pip-defs.h b/cvmx-pip-defs.h new file mode 100644 index 000000000000..c11038fdd490 --- /dev/null +++ b/cvmx-pip-defs.h @@ -0,0 +1,3926 @@ +/***********************license start*************** + * Copyright (c) 2003-2010 Cavium Networks (support@cavium.com). All rights + * reserved. + * + * + * 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 Cavium Networks 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, including technical data, may be subject to U.S. export control + * laws, including the U.S. Export Administration Act and its associated + * regulations, and may be subject to export or import regulations in other + * countries. + + * TO THE MAXIMUM EXTENT PERMITTED BY LAW, THE SOFTWARE IS PROVIDED "AS IS" + * AND WITH ALL FAULTS AND CAVIUM NETWORKS MAKES NO PROMISES, REPRESENTATIONS OR + * WARRANTIES, EITHER EXPRESS, IMPLIED, STATUTORY, OR OTHERWISE, WITH RESPECT TO + * THE SOFTWARE, INCLUDING ITS CONDITION, ITS CONFORMITY TO ANY REPRESENTATION OR + * DESCRIPTION, OR THE EXISTENCE OF ANY LATENT OR PATENT DEFECTS, AND CAVIUM + * SPECIFICALLY DISCLAIMS ALL IMPLIED (IF ANY) WARRANTIES OF TITLE, + * MERCHANTABILITY, NONINFRINGEMENT, FITNESS FOR A PARTICULAR PURPOSE, LACK OF + * VIRUSES, ACCURACY OR COMPLETENESS, QUIET ENJOYMENT, QUIET POSSESSION OR + * CORRESPONDENCE TO DESCRIPTION. THE ENTIRE RISK ARISING OUT OF USE OR + * PERFORMANCE OF THE SOFTWARE LIES WITH YOU. + ***********************license end**************************************/ + + +/** + * cvmx-pip-defs.h + * + * Configuration and status register (CSR) type definitions for + * Octeon pip. + * + * This file is auto generated. Do not edit. + * + *
$Revision$
+ * + */ +#ifndef __CVMX_PIP_TYPEDEFS_H__ +#define __CVMX_PIP_TYPEDEFS_H__ + +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +#define CVMX_PIP_BCK_PRS CVMX_PIP_BCK_PRS_FUNC() +static inline uint64_t CVMX_PIP_BCK_PRS_FUNC(void) +{ + if (!(OCTEON_IS_MODEL(OCTEON_CN38XX) || OCTEON_IS_MODEL(OCTEON_CN56XX) || OCTEON_IS_MODEL(OCTEON_CN58XX) || OCTEON_IS_MODEL(OCTEON_CN63XX))) + cvmx_warn("CVMX_PIP_BCK_PRS not supported on this chip\n"); + return CVMX_ADD_IO_SEG(0x00011800A0000038ull); +} +#else +#define CVMX_PIP_BCK_PRS (CVMX_ADD_IO_SEG(0x00011800A0000038ull)) +#endif +#define CVMX_PIP_BIST_STATUS (CVMX_ADD_IO_SEG(0x00011800A0000000ull)) +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +#define CVMX_PIP_CLKEN CVMX_PIP_CLKEN_FUNC() +static inline uint64_t CVMX_PIP_CLKEN_FUNC(void) +{ + if (!(OCTEON_IS_MODEL(OCTEON_CN63XX))) + cvmx_warn("CVMX_PIP_CLKEN not supported on this chip\n"); + return CVMX_ADD_IO_SEG(0x00011800A0000040ull); +} +#else +#define CVMX_PIP_CLKEN (CVMX_ADD_IO_SEG(0x00011800A0000040ull)) +#endif +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +static inline uint64_t CVMX_PIP_CRC_CTLX(unsigned long offset) +{ + if (!( + (OCTEON_IS_MODEL(OCTEON_CN38XX) && ((offset <= 1))) || + (OCTEON_IS_MODEL(OCTEON_CN58XX) && ((offset <= 1))))) + cvmx_warn("CVMX_PIP_CRC_CTLX(%lu) is invalid on this chip\n", offset); + return CVMX_ADD_IO_SEG(0x00011800A0000040ull) + ((offset) & 1) * 8; +} +#else +#define CVMX_PIP_CRC_CTLX(offset) (CVMX_ADD_IO_SEG(0x00011800A0000040ull) + ((offset) & 1) * 8) +#endif +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +static inline uint64_t CVMX_PIP_CRC_IVX(unsigned long offset) +{ + if (!( + (OCTEON_IS_MODEL(OCTEON_CN38XX) && ((offset <= 1))) || + (OCTEON_IS_MODEL(OCTEON_CN58XX) && ((offset <= 1))))) + cvmx_warn("CVMX_PIP_CRC_IVX(%lu) is invalid on this chip\n", offset); + return CVMX_ADD_IO_SEG(0x00011800A0000050ull) + ((offset) & 1) * 8; +} +#else +#define CVMX_PIP_CRC_IVX(offset) (CVMX_ADD_IO_SEG(0x00011800A0000050ull) + ((offset) & 1) * 8) +#endif +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +static inline uint64_t CVMX_PIP_DEC_IPSECX(unsigned long offset) +{ + if (!( + (OCTEON_IS_MODEL(OCTEON_CN30XX) && ((offset <= 3))) || + (OCTEON_IS_MODEL(OCTEON_CN31XX) && ((offset <= 3))) || + (OCTEON_IS_MODEL(OCTEON_CN38XX) && ((offset <= 3))) || + (OCTEON_IS_MODEL(OCTEON_CN50XX) && ((offset <= 3))) || + (OCTEON_IS_MODEL(OCTEON_CN52XX) && ((offset <= 3))) || + (OCTEON_IS_MODEL(OCTEON_CN56XX) && ((offset <= 3))) || + (OCTEON_IS_MODEL(OCTEON_CN58XX) && ((offset <= 3))) || + (OCTEON_IS_MODEL(OCTEON_CN63XX) && ((offset <= 3))))) + cvmx_warn("CVMX_PIP_DEC_IPSECX(%lu) is invalid on this chip\n", offset); + return CVMX_ADD_IO_SEG(0x00011800A0000080ull) + ((offset) & 3) * 8; +} +#else +#define CVMX_PIP_DEC_IPSECX(offset) (CVMX_ADD_IO_SEG(0x00011800A0000080ull) + ((offset) & 3) * 8) +#endif +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +#define CVMX_PIP_DSA_SRC_GRP CVMX_PIP_DSA_SRC_GRP_FUNC() +static inline uint64_t CVMX_PIP_DSA_SRC_GRP_FUNC(void) +{ + if (!(OCTEON_IS_MODEL(OCTEON_CN52XX) || OCTEON_IS_MODEL(OCTEON_CN56XX) || OCTEON_IS_MODEL(OCTEON_CN63XX))) + cvmx_warn("CVMX_PIP_DSA_SRC_GRP not supported on this chip\n"); + return CVMX_ADD_IO_SEG(0x00011800A0000190ull); +} +#else +#define CVMX_PIP_DSA_SRC_GRP (CVMX_ADD_IO_SEG(0x00011800A0000190ull)) +#endif +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +#define CVMX_PIP_DSA_VID_GRP CVMX_PIP_DSA_VID_GRP_FUNC() +static inline uint64_t CVMX_PIP_DSA_VID_GRP_FUNC(void) +{ + if (!(OCTEON_IS_MODEL(OCTEON_CN52XX) || OCTEON_IS_MODEL(OCTEON_CN56XX) || OCTEON_IS_MODEL(OCTEON_CN63XX))) + cvmx_warn("CVMX_PIP_DSA_VID_GRP not supported on this chip\n"); + return CVMX_ADD_IO_SEG(0x00011800A0000198ull); +} +#else +#define CVMX_PIP_DSA_VID_GRP (CVMX_ADD_IO_SEG(0x00011800A0000198ull)) +#endif +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +static inline uint64_t CVMX_PIP_FRM_LEN_CHKX(unsigned long offset) +{ + if (!( + (OCTEON_IS_MODEL(OCTEON_CN50XX) && ((offset <= 1))) || + (OCTEON_IS_MODEL(OCTEON_CN52XX) && ((offset <= 1))) || + (OCTEON_IS_MODEL(OCTEON_CN56XX) && ((offset <= 1))) || + (OCTEON_IS_MODEL(OCTEON_CN63XX) && ((offset == 0))))) + cvmx_warn("CVMX_PIP_FRM_LEN_CHKX(%lu) is invalid on this chip\n", offset); + return CVMX_ADD_IO_SEG(0x00011800A0000180ull) + ((offset) & 1) * 8; +} +#else +#define CVMX_PIP_FRM_LEN_CHKX(offset) (CVMX_ADD_IO_SEG(0x00011800A0000180ull) + ((offset) & 1) * 8) +#endif +#define CVMX_PIP_GBL_CFG (CVMX_ADD_IO_SEG(0x00011800A0000028ull)) +#define CVMX_PIP_GBL_CTL (CVMX_ADD_IO_SEG(0x00011800A0000020ull)) +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +#define CVMX_PIP_HG_PRI_QOS CVMX_PIP_HG_PRI_QOS_FUNC() +static inline uint64_t CVMX_PIP_HG_PRI_QOS_FUNC(void) +{ + if (!(OCTEON_IS_MODEL(OCTEON_CN52XX) || OCTEON_IS_MODEL(OCTEON_CN56XX) || OCTEON_IS_MODEL(OCTEON_CN63XX))) + cvmx_warn("CVMX_PIP_HG_PRI_QOS not supported on this chip\n"); + return CVMX_ADD_IO_SEG(0x00011800A00001A0ull); +} +#else +#define CVMX_PIP_HG_PRI_QOS (CVMX_ADD_IO_SEG(0x00011800A00001A0ull)) +#endif +#define CVMX_PIP_INT_EN (CVMX_ADD_IO_SEG(0x00011800A0000010ull)) +#define CVMX_PIP_INT_REG (CVMX_ADD_IO_SEG(0x00011800A0000008ull)) +#define CVMX_PIP_IP_OFFSET (CVMX_ADD_IO_SEG(0x00011800A0000060ull)) +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +static inline uint64_t CVMX_PIP_PRT_CFGX(unsigned long offset) +{ + if (!( + (OCTEON_IS_MODEL(OCTEON_CN30XX) && ((offset <= 2) || ((offset >= 32) && (offset <= 33)))) || + (OCTEON_IS_MODEL(OCTEON_CN31XX) && ((offset <= 2) || ((offset >= 32) && (offset <= 33)))) || + (OCTEON_IS_MODEL(OCTEON_CN38XX) && ((offset <= 35))) || + (OCTEON_IS_MODEL(OCTEON_CN50XX) && ((offset <= 2) || ((offset >= 32) && (offset <= 33)))) || + (OCTEON_IS_MODEL(OCTEON_CN52XX) && ((offset <= 3) || ((offset >= 32) && (offset <= 35)) || ((offset >= 36) && (offset <= 39)))) || + (OCTEON_IS_MODEL(OCTEON_CN56XX) && ((offset <= 3) || ((offset >= 16) && (offset <= 19)) || ((offset >= 32) && (offset <= 35)) || ((offset >= 36) && (offset <= 39)))) || + (OCTEON_IS_MODEL(OCTEON_CN58XX) && ((offset <= 35))) || + (OCTEON_IS_MODEL(OCTEON_CN63XX) && ((offset <= 3) || ((offset >= 32) && (offset <= 35)) || ((offset >= 36) && (offset <= 39)) || ((offset >= 40) && (offset <= 43)))))) + cvmx_warn("CVMX_PIP_PRT_CFGX(%lu) is invalid on this chip\n", offset); + return CVMX_ADD_IO_SEG(0x00011800A0000200ull) + ((offset) & 63) * 8; +} +#else +#define CVMX_PIP_PRT_CFGX(offset) (CVMX_ADD_IO_SEG(0x00011800A0000200ull) + ((offset) & 63) * 8) +#endif +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +static inline uint64_t CVMX_PIP_PRT_TAGX(unsigned long offset) +{ + if (!( + (OCTEON_IS_MODEL(OCTEON_CN30XX) && ((offset <= 2) || ((offset >= 32) && (offset <= 33)))) || + (OCTEON_IS_MODEL(OCTEON_CN31XX) && ((offset <= 2) || ((offset >= 32) && (offset <= 33)))) || + (OCTEON_IS_MODEL(OCTEON_CN38XX) && ((offset <= 35))) || + (OCTEON_IS_MODEL(OCTEON_CN50XX) && ((offset <= 2) || ((offset >= 32) && (offset <= 33)))) || + (OCTEON_IS_MODEL(OCTEON_CN52XX) && ((offset <= 3) || ((offset >= 32) && (offset <= 35)) || ((offset >= 36) && (offset <= 39)))) || + (OCTEON_IS_MODEL(OCTEON_CN56XX) && ((offset <= 3) || ((offset >= 16) && (offset <= 19)) || ((offset >= 32) && (offset <= 35)) || ((offset >= 36) && (offset <= 39)))) || + (OCTEON_IS_MODEL(OCTEON_CN58XX) && ((offset <= 35))) || + (OCTEON_IS_MODEL(OCTEON_CN63XX) && ((offset <= 3) || ((offset >= 32) && (offset <= 35)) || ((offset >= 36) && (offset <= 39)) || ((offset >= 40) && (offset <= 43)))))) + cvmx_warn("CVMX_PIP_PRT_TAGX(%lu) is invalid on this chip\n", offset); + return CVMX_ADD_IO_SEG(0x00011800A0000400ull) + ((offset) & 63) * 8; +} +#else +#define CVMX_PIP_PRT_TAGX(offset) (CVMX_ADD_IO_SEG(0x00011800A0000400ull) + ((offset) & 63) * 8) +#endif +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +static inline uint64_t CVMX_PIP_QOS_DIFFX(unsigned long offset) +{ + if (!( + (OCTEON_IS_MODEL(OCTEON_CN30XX) && ((offset <= 63))) || + (OCTEON_IS_MODEL(OCTEON_CN31XX) && ((offset <= 63))) || + (OCTEON_IS_MODEL(OCTEON_CN38XX) && ((offset <= 63))) || + (OCTEON_IS_MODEL(OCTEON_CN50XX) && ((offset <= 63))) || + (OCTEON_IS_MODEL(OCTEON_CN52XX) && ((offset <= 63))) || + (OCTEON_IS_MODEL(OCTEON_CN56XX) && ((offset <= 63))) || + (OCTEON_IS_MODEL(OCTEON_CN58XX) && ((offset <= 63))) || + (OCTEON_IS_MODEL(OCTEON_CN63XX) && ((offset <= 63))))) + cvmx_warn("CVMX_PIP_QOS_DIFFX(%lu) is invalid on this chip\n", offset); + return CVMX_ADD_IO_SEG(0x00011800A0000600ull) + ((offset) & 63) * 8; +} +#else +#define CVMX_PIP_QOS_DIFFX(offset) (CVMX_ADD_IO_SEG(0x00011800A0000600ull) + ((offset) & 63) * 8) +#endif +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +static inline uint64_t CVMX_PIP_QOS_VLANX(unsigned long offset) +{ + if (!( + (OCTEON_IS_MODEL(OCTEON_CN30XX) && ((offset <= 7))) || + (OCTEON_IS_MODEL(OCTEON_CN31XX) && ((offset <= 7))) || + (OCTEON_IS_MODEL(OCTEON_CN38XX) && ((offset <= 7))) || + (OCTEON_IS_MODEL(OCTEON_CN50XX) && ((offset <= 7))) || + (OCTEON_IS_MODEL(OCTEON_CN52XX) && ((offset <= 7))) || + (OCTEON_IS_MODEL(OCTEON_CN56XX) && ((offset <= 7))) || + (OCTEON_IS_MODEL(OCTEON_CN58XX) && ((offset <= 7))) || + (OCTEON_IS_MODEL(OCTEON_CN63XX) && ((offset <= 7))))) + cvmx_warn("CVMX_PIP_QOS_VLANX(%lu) is invalid on this chip\n", offset); + return CVMX_ADD_IO_SEG(0x00011800A00000C0ull) + ((offset) & 7) * 8; +} +#else +#define CVMX_PIP_QOS_VLANX(offset) (CVMX_ADD_IO_SEG(0x00011800A00000C0ull) + ((offset) & 7) * 8) +#endif +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +static inline uint64_t CVMX_PIP_QOS_WATCHX(unsigned long offset) +{ + if (!( + (OCTEON_IS_MODEL(OCTEON_CN30XX) && ((offset <= 3))) || + (OCTEON_IS_MODEL(OCTEON_CN31XX) && ((offset <= 3))) || + (OCTEON_IS_MODEL(OCTEON_CN38XX) && ((offset <= 3))) || + (OCTEON_IS_MODEL(OCTEON_CN50XX) && ((offset <= 7))) || + (OCTEON_IS_MODEL(OCTEON_CN52XX) && ((offset <= 7))) || + (OCTEON_IS_MODEL(OCTEON_CN56XX) && ((offset <= 7))) || + (OCTEON_IS_MODEL(OCTEON_CN58XX) && ((offset <= 3))) || + (OCTEON_IS_MODEL(OCTEON_CN63XX) && ((offset <= 7))))) + cvmx_warn("CVMX_PIP_QOS_WATCHX(%lu) is invalid on this chip\n", offset); + return CVMX_ADD_IO_SEG(0x00011800A0000100ull) + ((offset) & 7) * 8; +} +#else +#define CVMX_PIP_QOS_WATCHX(offset) (CVMX_ADD_IO_SEG(0x00011800A0000100ull) + ((offset) & 7) * 8) +#endif +#define CVMX_PIP_RAW_WORD (CVMX_ADD_IO_SEG(0x00011800A00000B0ull)) +#define CVMX_PIP_SFT_RST (CVMX_ADD_IO_SEG(0x00011800A0000030ull)) +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +static inline uint64_t CVMX_PIP_STAT0_PRTX(unsigned long offset) +{ + if (!( + (OCTEON_IS_MODEL(OCTEON_CN30XX) && ((offset <= 2) || ((offset >= 32) && (offset <= 33)))) || + (OCTEON_IS_MODEL(OCTEON_CN31XX) && ((offset <= 2) || ((offset >= 32) && (offset <= 33)))) || + (OCTEON_IS_MODEL(OCTEON_CN38XX) && ((offset <= 35))) || + (OCTEON_IS_MODEL(OCTEON_CN50XX) && ((offset <= 2) || ((offset >= 32) && (offset <= 33)))) || + (OCTEON_IS_MODEL(OCTEON_CN52XX) && ((offset <= 3) || ((offset >= 32) && (offset <= 35)) || ((offset >= 36) && (offset <= 39)))) || + (OCTEON_IS_MODEL(OCTEON_CN56XX) && ((offset <= 3) || ((offset >= 16) && (offset <= 19)) || ((offset >= 32) && (offset <= 35)) || ((offset >= 36) && (offset <= 39)))) || + (OCTEON_IS_MODEL(OCTEON_CN58XX) && ((offset <= 35))) || + (OCTEON_IS_MODEL(OCTEON_CN63XX) && ((offset <= 3) || ((offset >= 32) && (offset <= 35)) || ((offset >= 36) && (offset <= 39)))))) + cvmx_warn("CVMX_PIP_STAT0_PRTX(%lu) is invalid on this chip\n", offset); + return CVMX_ADD_IO_SEG(0x00011800A0000800ull) + ((offset) & 63) * 80; +} +#else +#define CVMX_PIP_STAT0_PRTX(offset) (CVMX_ADD_IO_SEG(0x00011800A0000800ull) + ((offset) & 63) * 80) +#endif +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +static inline uint64_t CVMX_PIP_STAT1_PRTX(unsigned long offset) +{ + if (!( + (OCTEON_IS_MODEL(OCTEON_CN30XX) && ((offset <= 2) || ((offset >= 32) && (offset <= 33)))) || + (OCTEON_IS_MODEL(OCTEON_CN31XX) && ((offset <= 2) || ((offset >= 32) && (offset <= 33)))) || + (OCTEON_IS_MODEL(OCTEON_CN38XX) && ((offset <= 35))) || + (OCTEON_IS_MODEL(OCTEON_CN50XX) && ((offset <= 2) || ((offset >= 32) && (offset <= 33)))) || + (OCTEON_IS_MODEL(OCTEON_CN52XX) && ((offset <= 3) || ((offset >= 32) && (offset <= 35)) || ((offset >= 36) && (offset <= 39)))) || + (OCTEON_IS_MODEL(OCTEON_CN56XX) && ((offset <= 3) || ((offset >= 16) && (offset <= 19)) || ((offset >= 32) && (offset <= 35)) || ((offset >= 36) && (offset <= 39)))) || + (OCTEON_IS_MODEL(OCTEON_CN58XX) && ((offset <= 35))) || + (OCTEON_IS_MODEL(OCTEON_CN63XX) && ((offset <= 3) || ((offset >= 32) && (offset <= 35)) || ((offset >= 36) && (offset <= 39)))))) + cvmx_warn("CVMX_PIP_STAT1_PRTX(%lu) is invalid on this chip\n", offset); + return CVMX_ADD_IO_SEG(0x00011800A0000808ull) + ((offset) & 63) * 80; +} +#else +#define CVMX_PIP_STAT1_PRTX(offset) (CVMX_ADD_IO_SEG(0x00011800A0000808ull) + ((offset) & 63) * 80) +#endif +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +static inline uint64_t CVMX_PIP_STAT2_PRTX(unsigned long offset) +{ + if (!( + (OCTEON_IS_MODEL(OCTEON_CN30XX) && ((offset <= 2) || ((offset >= 32) && (offset <= 33)))) || + (OCTEON_IS_MODEL(OCTEON_CN31XX) && ((offset <= 2) || ((offset >= 32) && (offset <= 33)))) || + (OCTEON_IS_MODEL(OCTEON_CN38XX) && ((offset <= 35))) || + (OCTEON_IS_MODEL(OCTEON_CN50XX) && ((offset <= 2) || ((offset >= 32) && (offset <= 33)))) || + (OCTEON_IS_MODEL(OCTEON_CN52XX) && ((offset <= 3) || ((offset >= 32) && (offset <= 35)) || ((offset >= 36) && (offset <= 39)))) || + (OCTEON_IS_MODEL(OCTEON_CN56XX) && ((offset <= 3) || ((offset >= 16) && (offset <= 19)) || ((offset >= 32) && (offset <= 35)) || ((offset >= 36) && (offset <= 39)))) || + (OCTEON_IS_MODEL(OCTEON_CN58XX) && ((offset <= 35))) || + (OCTEON_IS_MODEL(OCTEON_CN63XX) && ((offset <= 3) || ((offset >= 32) && (offset <= 35)) || ((offset >= 36) && (offset <= 39)))))) + cvmx_warn("CVMX_PIP_STAT2_PRTX(%lu) is invalid on this chip\n", offset); + return CVMX_ADD_IO_SEG(0x00011800A0000810ull) + ((offset) & 63) * 80; +} +#else +#define CVMX_PIP_STAT2_PRTX(offset) (CVMX_ADD_IO_SEG(0x00011800A0000810ull) + ((offset) & 63) * 80) +#endif +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +static inline uint64_t CVMX_PIP_STAT3_PRTX(unsigned long offset) +{ + if (!( + (OCTEON_IS_MODEL(OCTEON_CN30XX) && ((offset <= 2) || ((offset >= 32) && (offset <= 33)))) || + (OCTEON_IS_MODEL(OCTEON_CN31XX) && ((offset <= 2) || ((offset >= 32) && (offset <= 33)))) || + (OCTEON_IS_MODEL(OCTEON_CN38XX) && ((offset <= 35))) || + (OCTEON_IS_MODEL(OCTEON_CN50XX) && ((offset <= 2) || ((offset >= 32) && (offset <= 33)))) || + (OCTEON_IS_MODEL(OCTEON_CN52XX) && ((offset <= 3) || ((offset >= 32) && (offset <= 35)) || ((offset >= 36) && (offset <= 39)))) || + (OCTEON_IS_MODEL(OCTEON_CN56XX) && ((offset <= 3) || ((offset >= 16) && (offset <= 19)) || ((offset >= 32) && (offset <= 35)) || ((offset >= 36) && (offset <= 39)))) || + (OCTEON_IS_MODEL(OCTEON_CN58XX) && ((offset <= 35))) || + (OCTEON_IS_MODEL(OCTEON_CN63XX) && ((offset <= 3) || ((offset >= 32) && (offset <= 35)) || ((offset >= 36) && (offset <= 39)))))) + cvmx_warn("CVMX_PIP_STAT3_PRTX(%lu) is invalid on this chip\n", offset); + return CVMX_ADD_IO_SEG(0x00011800A0000818ull) + ((offset) & 63) * 80; +} +#else +#define CVMX_PIP_STAT3_PRTX(offset) (CVMX_ADD_IO_SEG(0x00011800A0000818ull) + ((offset) & 63) * 80) +#endif +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +static inline uint64_t CVMX_PIP_STAT4_PRTX(unsigned long offset) +{ + if (!( + (OCTEON_IS_MODEL(OCTEON_CN30XX) && ((offset <= 2) || ((offset >= 32) && (offset <= 33)))) || + (OCTEON_IS_MODEL(OCTEON_CN31XX) && ((offset <= 2) || ((offset >= 32) && (offset <= 33)))) || + (OCTEON_IS_MODEL(OCTEON_CN38XX) && ((offset <= 35))) || + (OCTEON_IS_MODEL(OCTEON_CN50XX) && ((offset <= 2) || ((offset >= 32) && (offset <= 33)))) || + (OCTEON_IS_MODEL(OCTEON_CN52XX) && ((offset <= 3) || ((offset >= 32) && (offset <= 35)) || ((offset >= 36) && (offset <= 39)))) || + (OCTEON_IS_MODEL(OCTEON_CN56XX) && ((offset <= 3) || ((offset >= 16) && (offset <= 19)) || ((offset >= 32) && (offset <= 35)) || ((offset >= 36) && (offset <= 39)))) || + (OCTEON_IS_MODEL(OCTEON_CN58XX) && ((offset <= 35))) || + (OCTEON_IS_MODEL(OCTEON_CN63XX) && ((offset <= 3) || ((offset >= 32) && (offset <= 35)) || ((offset >= 36) && (offset <= 39)))))) + cvmx_warn("CVMX_PIP_STAT4_PRTX(%lu) is invalid on this chip\n", offset); + return CVMX_ADD_IO_SEG(0x00011800A0000820ull) + ((offset) & 63) * 80; +} +#else +#define CVMX_PIP_STAT4_PRTX(offset) (CVMX_ADD_IO_SEG(0x00011800A0000820ull) + ((offset) & 63) * 80) +#endif +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +static inline uint64_t CVMX_PIP_STAT5_PRTX(unsigned long offset) +{ + if (!( + (OCTEON_IS_MODEL(OCTEON_CN30XX) && ((offset <= 2) || ((offset >= 32) && (offset <= 33)))) || + (OCTEON_IS_MODEL(OCTEON_CN31XX) && ((offset <= 2) || ((offset >= 32) && (offset <= 33)))) || + (OCTEON_IS_MODEL(OCTEON_CN38XX) && ((offset <= 35))) || + (OCTEON_IS_MODEL(OCTEON_CN50XX) && ((offset <= 2) || ((offset >= 32) && (offset <= 33)))) || + (OCTEON_IS_MODEL(OCTEON_CN52XX) && ((offset <= 3) || ((offset >= 32) && (offset <= 35)) || ((offset >= 36) && (offset <= 39)))) || + (OCTEON_IS_MODEL(OCTEON_CN56XX) && ((offset <= 3) || ((offset >= 16) && (offset <= 19)) || ((offset >= 32) && (offset <= 35)) || ((offset >= 36) && (offset <= 39)))) || + (OCTEON_IS_MODEL(OCTEON_CN58XX) && ((offset <= 35))) || + (OCTEON_IS_MODEL(OCTEON_CN63XX) && ((offset <= 3) || ((offset >= 32) && (offset <= 35)) || ((offset >= 36) && (offset <= 39)))))) + cvmx_warn("CVMX_PIP_STAT5_PRTX(%lu) is invalid on this chip\n", offset); + return CVMX_ADD_IO_SEG(0x00011800A0000828ull) + ((offset) & 63) * 80; +} +#else +#define CVMX_PIP_STAT5_PRTX(offset) (CVMX_ADD_IO_SEG(0x00011800A0000828ull) + ((offset) & 63) * 80) +#endif +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +static inline uint64_t CVMX_PIP_STAT6_PRTX(unsigned long offset) +{ + if (!( + (OCTEON_IS_MODEL(OCTEON_CN30XX) && ((offset <= 2) || ((offset >= 32) && (offset <= 33)))) || + (OCTEON_IS_MODEL(OCTEON_CN31XX) && ((offset <= 2) || ((offset >= 32) && (offset <= 33)))) || + (OCTEON_IS_MODEL(OCTEON_CN38XX) && ((offset <= 35))) || + (OCTEON_IS_MODEL(OCTEON_CN50XX) && ((offset <= 2) || ((offset >= 32) && (offset <= 33)))) || + (OCTEON_IS_MODEL(OCTEON_CN52XX) && ((offset <= 3) || ((offset >= 32) && (offset <= 35)) || ((offset >= 36) && (offset <= 39)))) || + (OCTEON_IS_MODEL(OCTEON_CN56XX) && ((offset <= 3) || ((offset >= 16) && (offset <= 19)) || ((offset >= 32) && (offset <= 35)) || ((offset >= 36) && (offset <= 39)))) || + (OCTEON_IS_MODEL(OCTEON_CN58XX) && ((offset <= 35))) || + (OCTEON_IS_MODEL(OCTEON_CN63XX) && ((offset <= 3) || ((offset >= 32) && (offset <= 35)) || ((offset >= 36) && (offset <= 39)))))) + cvmx_warn("CVMX_PIP_STAT6_PRTX(%lu) is invalid on this chip\n", offset); + return CVMX_ADD_IO_SEG(0x00011800A0000830ull) + ((offset) & 63) * 80; +} +#else +#define CVMX_PIP_STAT6_PRTX(offset) (CVMX_ADD_IO_SEG(0x00011800A0000830ull) + ((offset) & 63) * 80) +#endif +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +static inline uint64_t CVMX_PIP_STAT7_PRTX(unsigned long offset) +{ + if (!( + (OCTEON_IS_MODEL(OCTEON_CN30XX) && ((offset <= 2) || ((offset >= 32) && (offset <= 33)))) || + (OCTEON_IS_MODEL(OCTEON_CN31XX) && ((offset <= 2) || ((offset >= 32) && (offset <= 33)))) || + (OCTEON_IS_MODEL(OCTEON_CN38XX) && ((offset <= 35))) || + (OCTEON_IS_MODEL(OCTEON_CN50XX) && ((offset <= 2) || ((offset >= 32) && (offset <= 33)))) || + (OCTEON_IS_MODEL(OCTEON_CN52XX) && ((offset <= 3) || ((offset >= 32) && (offset <= 35)) || ((offset >= 36) && (offset <= 39)))) || + (OCTEON_IS_MODEL(OCTEON_CN56XX) && ((offset <= 3) || ((offset >= 16) && (offset <= 19)) || ((offset >= 32) && (offset <= 35)) || ((offset >= 36) && (offset <= 39)))) || + (OCTEON_IS_MODEL(OCTEON_CN58XX) && ((offset <= 35))) || + (OCTEON_IS_MODEL(OCTEON_CN63XX) && ((offset <= 3) || ((offset >= 32) && (offset <= 35)) || ((offset >= 36) && (offset <= 39)))))) + cvmx_warn("CVMX_PIP_STAT7_PRTX(%lu) is invalid on this chip\n", offset); + return CVMX_ADD_IO_SEG(0x00011800A0000838ull) + ((offset) & 63) * 80; +} +#else +#define CVMX_PIP_STAT7_PRTX(offset) (CVMX_ADD_IO_SEG(0x00011800A0000838ull) + ((offset) & 63) * 80) +#endif +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +static inline uint64_t CVMX_PIP_STAT8_PRTX(unsigned long offset) +{ + if (!( + (OCTEON_IS_MODEL(OCTEON_CN30XX) && ((offset <= 2) || ((offset >= 32) && (offset <= 33)))) || + (OCTEON_IS_MODEL(OCTEON_CN31XX) && ((offset <= 2) || ((offset >= 32) && (offset <= 33)))) || + (OCTEON_IS_MODEL(OCTEON_CN38XX) && ((offset <= 35))) || + (OCTEON_IS_MODEL(OCTEON_CN50XX) && ((offset <= 2) || ((offset >= 32) && (offset <= 33)))) || + (OCTEON_IS_MODEL(OCTEON_CN52XX) && ((offset <= 3) || ((offset >= 32) && (offset <= 35)) || ((offset >= 36) && (offset <= 39)))) || + (OCTEON_IS_MODEL(OCTEON_CN56XX) && ((offset <= 3) || ((offset >= 16) && (offset <= 19)) || ((offset >= 32) && (offset <= 35)) || ((offset >= 36) && (offset <= 39)))) || + (OCTEON_IS_MODEL(OCTEON_CN58XX) && ((offset <= 35))) || + (OCTEON_IS_MODEL(OCTEON_CN63XX) && ((offset <= 3) || ((offset >= 32) && (offset <= 35)) || ((offset >= 36) && (offset <= 39)))))) + cvmx_warn("CVMX_PIP_STAT8_PRTX(%lu) is invalid on this chip\n", offset); + return CVMX_ADD_IO_SEG(0x00011800A0000840ull) + ((offset) & 63) * 80; +} +#else +#define CVMX_PIP_STAT8_PRTX(offset) (CVMX_ADD_IO_SEG(0x00011800A0000840ull) + ((offset) & 63) * 80) +#endif +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +static inline uint64_t CVMX_PIP_STAT9_PRTX(unsigned long offset) +{ + if (!( + (OCTEON_IS_MODEL(OCTEON_CN30XX) && ((offset <= 2) || ((offset >= 32) && (offset <= 33)))) || + (OCTEON_IS_MODEL(OCTEON_CN31XX) && ((offset <= 2) || ((offset >= 32) && (offset <= 33)))) || + (OCTEON_IS_MODEL(OCTEON_CN38XX) && ((offset <= 35))) || + (OCTEON_IS_MODEL(OCTEON_CN50XX) && ((offset <= 2) || ((offset >= 32) && (offset <= 33)))) || + (OCTEON_IS_MODEL(OCTEON_CN52XX) && ((offset <= 3) || ((offset >= 32) && (offset <= 35)) || ((offset >= 36) && (offset <= 39)))) || + (OCTEON_IS_MODEL(OCTEON_CN56XX) && ((offset <= 3) || ((offset >= 16) && (offset <= 19)) || ((offset >= 32) && (offset <= 35)) || ((offset >= 36) && (offset <= 39)))) || + (OCTEON_IS_MODEL(OCTEON_CN58XX) && ((offset <= 35))) || + (OCTEON_IS_MODEL(OCTEON_CN63XX) && ((offset <= 3) || ((offset >= 32) && (offset <= 35)) || ((offset >= 36) && (offset <= 39)))))) + cvmx_warn("CVMX_PIP_STAT9_PRTX(%lu) is invalid on this chip\n", offset); + return CVMX_ADD_IO_SEG(0x00011800A0000848ull) + ((offset) & 63) * 80; +} +#else +#define CVMX_PIP_STAT9_PRTX(offset) (CVMX_ADD_IO_SEG(0x00011800A0000848ull) + ((offset) & 63) * 80) +#endif +#define CVMX_PIP_STAT_CTL (CVMX_ADD_IO_SEG(0x00011800A0000018ull)) +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +static inline uint64_t CVMX_PIP_STAT_INB_ERRSX(unsigned long offset) +{ + if (!( + (OCTEON_IS_MODEL(OCTEON_CN30XX) && ((offset <= 2) || ((offset >= 32) && (offset <= 33)))) || + (OCTEON_IS_MODEL(OCTEON_CN31XX) && ((offset <= 2) || ((offset >= 32) && (offset <= 33)))) || + (OCTEON_IS_MODEL(OCTEON_CN38XX) && ((offset <= 35))) || + (OCTEON_IS_MODEL(OCTEON_CN50XX) && ((offset <= 2) || ((offset >= 32) && (offset <= 33)))) || + (OCTEON_IS_MODEL(OCTEON_CN52XX) && ((offset <= 3) || ((offset >= 32) && (offset <= 35)) || ((offset >= 36) && (offset <= 39)))) || + (OCTEON_IS_MODEL(OCTEON_CN56XX) && ((offset <= 3) || ((offset >= 16) && (offset <= 19)) || ((offset >= 32) && (offset <= 35)) || ((offset >= 36) && (offset <= 39)))) || + (OCTEON_IS_MODEL(OCTEON_CN58XX) && ((offset <= 35))) || + (OCTEON_IS_MODEL(OCTEON_CN63XX) && ((offset <= 3) || ((offset >= 32) && (offset <= 35)) || ((offset >= 36) && (offset <= 39)) || ((offset >= 40) && (offset <= 43)))))) + cvmx_warn("CVMX_PIP_STAT_INB_ERRSX(%lu) is invalid on this chip\n", offset); + return CVMX_ADD_IO_SEG(0x00011800A0001A10ull) + ((offset) & 63) * 32; +} +#else +#define CVMX_PIP_STAT_INB_ERRSX(offset) (CVMX_ADD_IO_SEG(0x00011800A0001A10ull) + ((offset) & 63) * 32) +#endif +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +static inline uint64_t CVMX_PIP_STAT_INB_OCTSX(unsigned long offset) +{ + if (!( + (OCTEON_IS_MODEL(OCTEON_CN30XX) && ((offset <= 2) || ((offset >= 32) && (offset <= 33)))) || + (OCTEON_IS_MODEL(OCTEON_CN31XX) && ((offset <= 2) || ((offset >= 32) && (offset <= 33)))) || + (OCTEON_IS_MODEL(OCTEON_CN38XX) && ((offset <= 35))) || + (OCTEON_IS_MODEL(OCTEON_CN50XX) && ((offset <= 2) || ((offset >= 32) && (offset <= 33)))) || + (OCTEON_IS_MODEL(OCTEON_CN52XX) && ((offset <= 3) || ((offset >= 32) && (offset <= 35)) || ((offset >= 36) && (offset <= 39)))) || + (OCTEON_IS_MODEL(OCTEON_CN56XX) && ((offset <= 3) || ((offset >= 16) && (offset <= 19)) || ((offset >= 32) && (offset <= 35)) || ((offset >= 36) && (offset <= 39)))) || + (OCTEON_IS_MODEL(OCTEON_CN58XX) && ((offset <= 35))) || + (OCTEON_IS_MODEL(OCTEON_CN63XX) && ((offset <= 3) || ((offset >= 32) && (offset <= 35)) || ((offset >= 36) && (offset <= 39)) || ((offset >= 40) && (offset <= 43)))))) + cvmx_warn("CVMX_PIP_STAT_INB_OCTSX(%lu) is invalid on this chip\n", offset); + return CVMX_ADD_IO_SEG(0x00011800A0001A08ull) + ((offset) & 63) * 32; +} +#else +#define CVMX_PIP_STAT_INB_OCTSX(offset) (CVMX_ADD_IO_SEG(0x00011800A0001A08ull) + ((offset) & 63) * 32) +#endif +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +static inline uint64_t CVMX_PIP_STAT_INB_PKTSX(unsigned long offset) +{ + if (!( + (OCTEON_IS_MODEL(OCTEON_CN30XX) && ((offset <= 2) || ((offset >= 32) && (offset <= 33)))) || + (OCTEON_IS_MODEL(OCTEON_CN31XX) && ((offset <= 2) || ((offset >= 32) && (offset <= 33)))) || + (OCTEON_IS_MODEL(OCTEON_CN38XX) && ((offset <= 35))) || + (OCTEON_IS_MODEL(OCTEON_CN50XX) && ((offset <= 2) || ((offset >= 32) && (offset <= 33)))) || + (OCTEON_IS_MODEL(OCTEON_CN52XX) && ((offset <= 3) || ((offset >= 32) && (offset <= 35)) || ((offset >= 36) && (offset <= 39)))) || + (OCTEON_IS_MODEL(OCTEON_CN56XX) && ((offset <= 3) || ((offset >= 16) && (offset <= 19)) || ((offset >= 32) && (offset <= 35)) || ((offset >= 36) && (offset <= 39)))) || + (OCTEON_IS_MODEL(OCTEON_CN58XX) && ((offset <= 35))) || + (OCTEON_IS_MODEL(OCTEON_CN63XX) && ((offset <= 3) || ((offset >= 32) && (offset <= 35)) || ((offset >= 36) && (offset <= 39)) || ((offset >= 40) && (offset <= 43)))))) + cvmx_warn("CVMX_PIP_STAT_INB_PKTSX(%lu) is invalid on this chip\n", offset); + return CVMX_ADD_IO_SEG(0x00011800A0001A00ull) + ((offset) & 63) * 32; +} +#else +#define CVMX_PIP_STAT_INB_PKTSX(offset) (CVMX_ADD_IO_SEG(0x00011800A0001A00ull) + ((offset) & 63) * 32) +#endif +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +static inline uint64_t CVMX_PIP_TAG_INCX(unsigned long offset) +{ + if (!( + (OCTEON_IS_MODEL(OCTEON_CN30XX) && ((offset <= 63))) || + (OCTEON_IS_MODEL(OCTEON_CN31XX) && ((offset <= 63))) || + (OCTEON_IS_MODEL(OCTEON_CN38XX) && ((offset <= 63))) || + (OCTEON_IS_MODEL(OCTEON_CN50XX) && ((offset <= 63))) || + (OCTEON_IS_MODEL(OCTEON_CN52XX) && ((offset <= 63))) || + (OCTEON_IS_MODEL(OCTEON_CN56XX) && ((offset <= 63))) || + (OCTEON_IS_MODEL(OCTEON_CN58XX) && ((offset <= 63))) || + (OCTEON_IS_MODEL(OCTEON_CN63XX) && ((offset <= 63))))) + cvmx_warn("CVMX_PIP_TAG_INCX(%lu) is invalid on this chip\n", offset); + return CVMX_ADD_IO_SEG(0x00011800A0001800ull) + ((offset) & 63) * 8; +} +#else +#define CVMX_PIP_TAG_INCX(offset) (CVMX_ADD_IO_SEG(0x00011800A0001800ull) + ((offset) & 63) * 8) +#endif +#define CVMX_PIP_TAG_MASK (CVMX_ADD_IO_SEG(0x00011800A0000070ull)) +#define CVMX_PIP_TAG_SECRET (CVMX_ADD_IO_SEG(0x00011800A0000068ull)) +#define CVMX_PIP_TODO_ENTRY (CVMX_ADD_IO_SEG(0x00011800A0000078ull)) +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +static inline uint64_t CVMX_PIP_XSTAT0_PRTX(unsigned long offset) +{ + if (!( + (OCTEON_IS_MODEL(OCTEON_CN63XX) && (((offset >= 40) && (offset <= 43)))))) + cvmx_warn("CVMX_PIP_XSTAT0_PRTX(%lu) is invalid on this chip\n", offset); + return CVMX_ADD_IO_SEG(0x00011800A0002000ull) + ((offset) & 63) * 80 - 80*40; +} +#else +#define CVMX_PIP_XSTAT0_PRTX(offset) (CVMX_ADD_IO_SEG(0x00011800A0002000ull) + ((offset) & 63) * 80 - 80*40) +#endif +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +static inline uint64_t CVMX_PIP_XSTAT1_PRTX(unsigned long offset) +{ + if (!( + (OCTEON_IS_MODEL(OCTEON_CN63XX) && (((offset >= 40) && (offset <= 43)))))) + cvmx_warn("CVMX_PIP_XSTAT1_PRTX(%lu) is invalid on this chip\n", offset); + return CVMX_ADD_IO_SEG(0x00011800A0002008ull) + ((offset) & 63) * 80 - 80*40; +} +#else +#define CVMX_PIP_XSTAT1_PRTX(offset) (CVMX_ADD_IO_SEG(0x00011800A0002008ull) + ((offset) & 63) * 80 - 80*40) +#endif +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +static inline uint64_t CVMX_PIP_XSTAT2_PRTX(unsigned long offset) +{ + if (!( + (OCTEON_IS_MODEL(OCTEON_CN63XX) && (((offset >= 40) && (offset <= 43)))))) + cvmx_warn("CVMX_PIP_XSTAT2_PRTX(%lu) is invalid on this chip\n", offset); + return CVMX_ADD_IO_SEG(0x00011800A0002010ull) + ((offset) & 63) * 80 - 80*40; +} +#else +#define CVMX_PIP_XSTAT2_PRTX(offset) (CVMX_ADD_IO_SEG(0x00011800A0002010ull) + ((offset) & 63) * 80 - 80*40) +#endif +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +static inline uint64_t CVMX_PIP_XSTAT3_PRTX(unsigned long offset) +{ + if (!( + (OCTEON_IS_MODEL(OCTEON_CN63XX) && (((offset >= 40) && (offset <= 43)))))) + cvmx_warn("CVMX_PIP_XSTAT3_PRTX(%lu) is invalid on this chip\n", offset); + return CVMX_ADD_IO_SEG(0x00011800A0002018ull) + ((offset) & 63) * 80 - 80*40; +} +#else +#define CVMX_PIP_XSTAT3_PRTX(offset) (CVMX_ADD_IO_SEG(0x00011800A0002018ull) + ((offset) & 63) * 80 - 80*40) +#endif +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +static inline uint64_t CVMX_PIP_XSTAT4_PRTX(unsigned long offset) +{ + if (!( + (OCTEON_IS_MODEL(OCTEON_CN63XX) && (((offset >= 40) && (offset <= 43)))))) + cvmx_warn("CVMX_PIP_XSTAT4_PRTX(%lu) is invalid on this chip\n", offset); + return CVMX_ADD_IO_SEG(0x00011800A0002020ull) + ((offset) & 63) * 80 - 80*40; +} +#else +#define CVMX_PIP_XSTAT4_PRTX(offset) (CVMX_ADD_IO_SEG(0x00011800A0002020ull) + ((offset) & 63) * 80 - 80*40) +#endif +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +static inline uint64_t CVMX_PIP_XSTAT5_PRTX(unsigned long offset) +{ + if (!( + (OCTEON_IS_MODEL(OCTEON_CN63XX) && (((offset >= 40) && (offset <= 43)))))) + cvmx_warn("CVMX_PIP_XSTAT5_PRTX(%lu) is invalid on this chip\n", offset); + return CVMX_ADD_IO_SEG(0x00011800A0002028ull) + ((offset) & 63) * 80 - 80*40; +} +#else +#define CVMX_PIP_XSTAT5_PRTX(offset) (CVMX_ADD_IO_SEG(0x00011800A0002028ull) + ((offset) & 63) * 80 - 80*40) +#endif +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +static inline uint64_t CVMX_PIP_XSTAT6_PRTX(unsigned long offset) +{ + if (!( + (OCTEON_IS_MODEL(OCTEON_CN63XX) && (((offset >= 40) && (offset <= 43)))))) + cvmx_warn("CVMX_PIP_XSTAT6_PRTX(%lu) is invalid on this chip\n", offset); + return CVMX_ADD_IO_SEG(0x00011800A0002030ull) + ((offset) & 63) * 80 - 80*40; +} +#else +#define CVMX_PIP_XSTAT6_PRTX(offset) (CVMX_ADD_IO_SEG(0x00011800A0002030ull) + ((offset) & 63) * 80 - 80*40) +#endif +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +static inline uint64_t CVMX_PIP_XSTAT7_PRTX(unsigned long offset) +{ + if (!( + (OCTEON_IS_MODEL(OCTEON_CN63XX) && (((offset >= 40) && (offset <= 43)))))) + cvmx_warn("CVMX_PIP_XSTAT7_PRTX(%lu) is invalid on this chip\n", offset); + return CVMX_ADD_IO_SEG(0x00011800A0002038ull) + ((offset) & 63) * 80 - 80*40; +} +#else +#define CVMX_PIP_XSTAT7_PRTX(offset) (CVMX_ADD_IO_SEG(0x00011800A0002038ull) + ((offset) & 63) * 80 - 80*40) +#endif +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +static inline uint64_t CVMX_PIP_XSTAT8_PRTX(unsigned long offset) +{ + if (!( + (OCTEON_IS_MODEL(OCTEON_CN63XX) && (((offset >= 40) && (offset <= 43)))))) + cvmx_warn("CVMX_PIP_XSTAT8_PRTX(%lu) is invalid on this chip\n", offset); + return CVMX_ADD_IO_SEG(0x00011800A0002040ull) + ((offset) & 63) * 80 - 80*40; +} +#else +#define CVMX_PIP_XSTAT8_PRTX(offset) (CVMX_ADD_IO_SEG(0x00011800A0002040ull) + ((offset) & 63) * 80 - 80*40) +#endif +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +static inline uint64_t CVMX_PIP_XSTAT9_PRTX(unsigned long offset) +{ + if (!( + (OCTEON_IS_MODEL(OCTEON_CN63XX) && (((offset >= 40) && (offset <= 43)))))) + cvmx_warn("CVMX_PIP_XSTAT9_PRTX(%lu) is invalid on this chip\n", offset); + return CVMX_ADD_IO_SEG(0x00011800A0002048ull) + ((offset) & 63) * 80 - 80*40; +} +#else +#define CVMX_PIP_XSTAT9_PRTX(offset) (CVMX_ADD_IO_SEG(0x00011800A0002048ull) + ((offset) & 63) * 80 - 80*40) +#endif + +/** + * cvmx_pip_bck_prs + * + * PIP_BCK_PRS = PIP's Back Pressure Register + * + * When to assert backpressure based on the todo list filling up + */ +union cvmx_pip_bck_prs +{ + uint64_t u64; + struct cvmx_pip_bck_prs_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t bckprs : 1; /**< PIP is currently asserting backpressure to IOB + Backpressure from PIP will assert when the + entries to the todo list exceed HIWATER. + Backpressure will be held until the todo entries + is less than or equal to LOWATER. */ + uint64_t reserved_13_62 : 50; + uint64_t hiwater : 5; /**< Water mark in the todo list to assert backpressure + Legal values are 1-26. A 0 value will deadlock + the machine. A value > 26, will trash memory */ + uint64_t reserved_5_7 : 3; + uint64_t lowater : 5; /**< Water mark in the todo list to release backpressure + The LOWATER value should be < HIWATER. */ +#else + uint64_t lowater : 5; + uint64_t reserved_5_7 : 3; + uint64_t hiwater : 5; + uint64_t reserved_13_62 : 50; + uint64_t bckprs : 1; +#endif + } s; + struct cvmx_pip_bck_prs_s cn38xx; + struct cvmx_pip_bck_prs_s cn38xxp2; + struct cvmx_pip_bck_prs_s cn56xx; + struct cvmx_pip_bck_prs_s cn56xxp1; + struct cvmx_pip_bck_prs_s cn58xx; + struct cvmx_pip_bck_prs_s cn58xxp1; + struct cvmx_pip_bck_prs_s cn63xx; + struct cvmx_pip_bck_prs_s cn63xxp1; +}; +typedef union cvmx_pip_bck_prs cvmx_pip_bck_prs_t; + +/** + * cvmx_pip_bist_status + * + * PIP_BIST_STATUS = PIP's BIST Results + * + */ +union cvmx_pip_bist_status +{ + uint64_t u64; + struct cvmx_pip_bist_status_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_18_63 : 46; + uint64_t bist : 18; /**< BIST Results. + HW sets a bit in BIST for for memory that fails + BIST. */ +#else + uint64_t bist : 18; + uint64_t reserved_18_63 : 46; +#endif + } s; + struct cvmx_pip_bist_status_s cn30xx; + struct cvmx_pip_bist_status_s cn31xx; + struct cvmx_pip_bist_status_s cn38xx; + struct cvmx_pip_bist_status_s cn38xxp2; + struct cvmx_pip_bist_status_cn50xx + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_17_63 : 47; + uint64_t bist : 17; /**< BIST Results. + HW sets a bit in BIST for for memory that fails + BIST. */ +#else + uint64_t bist : 17; + uint64_t reserved_17_63 : 47; +#endif + } cn50xx; + struct cvmx_pip_bist_status_s cn52xx; + struct cvmx_pip_bist_status_s cn52xxp1; + struct cvmx_pip_bist_status_s cn56xx; + struct cvmx_pip_bist_status_s cn56xxp1; + struct cvmx_pip_bist_status_s cn58xx; + struct cvmx_pip_bist_status_s cn58xxp1; + struct cvmx_pip_bist_status_s cn63xx; + struct cvmx_pip_bist_status_s cn63xxp1; +}; +typedef union cvmx_pip_bist_status cvmx_pip_bist_status_t; + +/** + * cvmx_pip_clken + */ +union cvmx_pip_clken +{ + uint64_t u64; + struct cvmx_pip_clken_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_1_63 : 63; + uint64_t clken : 1; /**< Controls the conditional clocking within PIP + 0=Allow HW to control the clocks + 1=Force the clocks to be always on */ +#else + uint64_t clken : 1; + uint64_t reserved_1_63 : 63; +#endif + } s; + struct cvmx_pip_clken_s cn63xx; + struct cvmx_pip_clken_s cn63xxp1; +}; +typedef union cvmx_pip_clken cvmx_pip_clken_t; + +/** + * cvmx_pip_crc_ctl# + * + * PIP_CRC_CTL = PIP CRC Control Register + * + * Controls datapath reflection when calculating CRC + */ +union cvmx_pip_crc_ctlx +{ + uint64_t u64; + struct cvmx_pip_crc_ctlx_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_2_63 : 62; + uint64_t invres : 1; /**< Invert the result */ + uint64_t reflect : 1; /**< Reflect the bits in each byte. + Byte order does not change. + - 0: CRC is calculated MSB to LSB + - 1: CRC is calculated LSB to MSB */ +#else + uint64_t reflect : 1; + uint64_t invres : 1; + uint64_t reserved_2_63 : 62; +#endif + } s; + struct cvmx_pip_crc_ctlx_s cn38xx; + struct cvmx_pip_crc_ctlx_s cn38xxp2; + struct cvmx_pip_crc_ctlx_s cn58xx; + struct cvmx_pip_crc_ctlx_s cn58xxp1; +}; +typedef union cvmx_pip_crc_ctlx cvmx_pip_crc_ctlx_t; + +/** + * cvmx_pip_crc_iv# + * + * PIP_CRC_IV = PIP CRC IV Register + * + * Determines the IV used by the CRC algorithm + * + * Notes: + * * PIP_CRC_IV + * PIP_CRC_IV controls the initial state of the CRC algorithm. Octane can + * support a wide range of CRC algorithms and as such, the IV must be + * carefully constructed to meet the specific algorithm. The code below + * determines the value to program into Octane based on the algorthim's IV + * and width. In the case of Octane, the width should always be 32. + * + * PIP_CRC_IV0 sets the IV for ports 0-15 while PIP_CRC_IV1 sets the IV for + * ports 16-31. + * + * unsigned octane_crc_iv(unsigned algorithm_iv, unsigned poly, unsigned w) + * [ + * int i; + * int doit; + * unsigned int current_val = algorithm_iv; + * + * for(i = 0; i < w; i++) [ + * doit = current_val & 0x1; + * + * if(doit) current_val ^= poly; + * assert(!(current_val & 0x1)); + * + * current_val = (current_val >> 1) | (doit << (w-1)); + * ] + * + * return current_val; + * ] + */ +union cvmx_pip_crc_ivx +{ + uint64_t u64; + struct cvmx_pip_crc_ivx_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_32_63 : 32; + uint64_t iv : 32; /**< IV used by the CRC algorithm. Default is FCS32. */ +#else + uint64_t iv : 32; + uint64_t reserved_32_63 : 32; +#endif + } s; + struct cvmx_pip_crc_ivx_s cn38xx; + struct cvmx_pip_crc_ivx_s cn38xxp2; + struct cvmx_pip_crc_ivx_s cn58xx; + struct cvmx_pip_crc_ivx_s cn58xxp1; +}; +typedef union cvmx_pip_crc_ivx cvmx_pip_crc_ivx_t; + +/** + * cvmx_pip_dec_ipsec# + * + * PIP_DEC_IPSEC = UDP or TCP ports to watch for DEC IPSEC + * + * PIP sets the dec_ipsec based on TCP or UDP destination port. + */ +union cvmx_pip_dec_ipsecx +{ + uint64_t u64; + struct cvmx_pip_dec_ipsecx_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_18_63 : 46; + uint64_t tcp : 1; /**< This DPRT should be used for TCP packets */ + uint64_t udp : 1; /**< This DPRT should be used for UDP packets */ + uint64_t dprt : 16; /**< UDP or TCP destination port to match on */ +#else + uint64_t dprt : 16; + uint64_t udp : 1; + uint64_t tcp : 1; + uint64_t reserved_18_63 : 46; +#endif + } s; + struct cvmx_pip_dec_ipsecx_s cn30xx; + struct cvmx_pip_dec_ipsecx_s cn31xx; + struct cvmx_pip_dec_ipsecx_s cn38xx; + struct cvmx_pip_dec_ipsecx_s cn38xxp2; + struct cvmx_pip_dec_ipsecx_s cn50xx; + struct cvmx_pip_dec_ipsecx_s cn52xx; + struct cvmx_pip_dec_ipsecx_s cn52xxp1; + struct cvmx_pip_dec_ipsecx_s cn56xx; + struct cvmx_pip_dec_ipsecx_s cn56xxp1; + struct cvmx_pip_dec_ipsecx_s cn58xx; + struct cvmx_pip_dec_ipsecx_s cn58xxp1; + struct cvmx_pip_dec_ipsecx_s cn63xx; + struct cvmx_pip_dec_ipsecx_s cn63xxp1; +}; +typedef union cvmx_pip_dec_ipsecx cvmx_pip_dec_ipsecx_t; + +/** + * cvmx_pip_dsa_src_grp + */ +union cvmx_pip_dsa_src_grp +{ + uint64_t u64; + struct cvmx_pip_dsa_src_grp_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t map15 : 4; /**< DSA Group Algorithm */ + uint64_t map14 : 4; /**< DSA Group Algorithm */ + uint64_t map13 : 4; /**< DSA Group Algorithm */ + uint64_t map12 : 4; /**< DSA Group Algorithm */ + uint64_t map11 : 4; /**< DSA Group Algorithm */ + uint64_t map10 : 4; /**< DSA Group Algorithm */ + uint64_t map9 : 4; /**< DSA Group Algorithm */ + uint64_t map8 : 4; /**< DSA Group Algorithm */ + uint64_t map7 : 4; /**< DSA Group Algorithm */ + uint64_t map6 : 4; /**< DSA Group Algorithm */ + uint64_t map5 : 4; /**< DSA Group Algorithm */ + uint64_t map4 : 4; /**< DSA Group Algorithm */ + uint64_t map3 : 4; /**< DSA Group Algorithm */ + uint64_t map2 : 4; /**< DSA Group Algorithm */ + uint64_t map1 : 4; /**< DSA Group Algorithm */ + uint64_t map0 : 4; /**< DSA Group Algorithm + Use the DSA source id to compute GRP */ +#else + uint64_t map0 : 4; + uint64_t map1 : 4; + uint64_t map2 : 4; + uint64_t map3 : 4; + uint64_t map4 : 4; + uint64_t map5 : 4; + uint64_t map6 : 4; + uint64_t map7 : 4; + uint64_t map8 : 4; + uint64_t map9 : 4; + uint64_t map10 : 4; + uint64_t map11 : 4; + uint64_t map12 : 4; + uint64_t map13 : 4; + uint64_t map14 : 4; + uint64_t map15 : 4; +#endif + } s; + struct cvmx_pip_dsa_src_grp_s cn52xx; + struct cvmx_pip_dsa_src_grp_s cn52xxp1; + struct cvmx_pip_dsa_src_grp_s cn56xx; + struct cvmx_pip_dsa_src_grp_s cn63xx; + struct cvmx_pip_dsa_src_grp_s cn63xxp1; +}; +typedef union cvmx_pip_dsa_src_grp cvmx_pip_dsa_src_grp_t; + +/** + * cvmx_pip_dsa_vid_grp + */ +union cvmx_pip_dsa_vid_grp +{ + uint64_t u64; + struct cvmx_pip_dsa_vid_grp_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t map15 : 4; /**< DSA Group Algorithm */ + uint64_t map14 : 4; /**< DSA Group Algorithm */ + uint64_t map13 : 4; /**< DSA Group Algorithm */ + uint64_t map12 : 4; /**< DSA Group Algorithm */ + uint64_t map11 : 4; /**< DSA Group Algorithm */ + uint64_t map10 : 4; /**< DSA Group Algorithm */ + uint64_t map9 : 4; /**< DSA Group Algorithm */ + uint64_t map8 : 4; /**< DSA Group Algorithm */ + uint64_t map7 : 4; /**< DSA Group Algorithm */ + uint64_t map6 : 4; /**< DSA Group Algorithm */ + uint64_t map5 : 4; /**< DSA Group Algorithm */ + uint64_t map4 : 4; /**< DSA Group Algorithm */ + uint64_t map3 : 4; /**< DSA Group Algorithm */ + uint64_t map2 : 4; /**< DSA Group Algorithm */ + uint64_t map1 : 4; /**< DSA Group Algorithm */ + uint64_t map0 : 4; /**< DSA Group Algorithm + Use the DSA source id to compute GRP */ +#else + uint64_t map0 : 4; + uint64_t map1 : 4; + uint64_t map2 : 4; + uint64_t map3 : 4; + uint64_t map4 : 4; + uint64_t map5 : 4; + uint64_t map6 : 4; + uint64_t map7 : 4; + uint64_t map8 : 4; + uint64_t map9 : 4; + uint64_t map10 : 4; + uint64_t map11 : 4; + uint64_t map12 : 4; + uint64_t map13 : 4; + uint64_t map14 : 4; + uint64_t map15 : 4; +#endif + } s; + struct cvmx_pip_dsa_vid_grp_s cn52xx; + struct cvmx_pip_dsa_vid_grp_s cn52xxp1; + struct cvmx_pip_dsa_vid_grp_s cn56xx; + struct cvmx_pip_dsa_vid_grp_s cn63xx; + struct cvmx_pip_dsa_vid_grp_s cn63xxp1; +}; +typedef union cvmx_pip_dsa_vid_grp cvmx_pip_dsa_vid_grp_t; + +/** + * cvmx_pip_frm_len_chk# + * + * Notes: + * PIP_FRM_LEN_CHK0 is used for packets on packet interface0, PCI, PCI RAW, and PKO loopback ports. + * PIP_FRM_LEN_CHK1 is unused. + */ +union cvmx_pip_frm_len_chkx +{ + uint64_t u64; + struct cvmx_pip_frm_len_chkx_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_32_63 : 32; + uint64_t maxlen : 16; /**< Byte count for Max-sized frame check + PIP_PRT_CFGn[MAXERR_EN] enables the check for + port n. + If enabled, failing packets set the MAXERR + interrupt and work-queue entry WORD2[opcode] is + set to OVER_FCS (0x3, if packet has bad FCS) or + OVER_ERR (0x4, if packet has good FCS). + The effective MAXLEN used by HW is + PIP_PRT_CFG[DSA_EN] == 0, + PIP_FRM_LEN_CHK[MAXLEN] + 4*VV + 4*VS + PIP_PRT_CFG[DSA_EN] == 1, + PIP_FRM_LEN_CHK[MAXLEN] + PIP_PRT_CFG[SKIP]+4*VS + If PTP_MODE, the 8B timestamp is prepended to the + packet. MAXLEN should be increased by 8 to + compensate for the additional timestamp field. */ + uint64_t minlen : 16; /**< Byte count for Min-sized frame check + PIP_PRT_CFGn[MINERR_EN] enables the check for + port n. + If enabled, failing packets set the MINERR + interrupt and work-queue entry WORD2[opcode] is + set to UNDER_FCS (0x6, if packet has bad FCS) or + UNDER_ERR (0x8, if packet has good FCS). + If PTP_MODE, the 8B timestamp is prepended to the + packet. MINLEN should be increased by 8 to + compensate for the additional timestamp field. */ +#else + uint64_t minlen : 16; + uint64_t maxlen : 16; + uint64_t reserved_32_63 : 32; +#endif + } s; + struct cvmx_pip_frm_len_chkx_s cn50xx; + struct cvmx_pip_frm_len_chkx_s cn52xx; + struct cvmx_pip_frm_len_chkx_s cn52xxp1; + struct cvmx_pip_frm_len_chkx_s cn56xx; + struct cvmx_pip_frm_len_chkx_s cn56xxp1; + struct cvmx_pip_frm_len_chkx_s cn63xx; + struct cvmx_pip_frm_len_chkx_s cn63xxp1; +}; +typedef union cvmx_pip_frm_len_chkx cvmx_pip_frm_len_chkx_t; + +/** + * cvmx_pip_gbl_cfg + * + * PIP_GBL_CFG = PIP's Global Config Register + * + * Global config information that applies to all ports. + * + * Notes: + * * IP6_UDP + * IPv4 allows optional UDP checksum by sending the all 0's patterns. IPv6 + * outlaws this and the spec says to always check UDP checksum. This mode + * bit allows the user to treat IPv6 as IPv4, meaning that the all 0's + * pattern will cause a UDP checksum pass. + */ +union cvmx_pip_gbl_cfg +{ + uint64_t u64; + struct cvmx_pip_gbl_cfg_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_19_63 : 45; + uint64_t tag_syn : 1; /**< Do not include src_crc for TCP/SYN&!ACK packets + 0 = include src_crc + 1 = tag hash is dst_crc for TCP/SYN&!ACK packets */ + uint64_t ip6_udp : 1; /**< IPv6/UDP checksum is not optional + 0 = Allow optional checksum code + 1 = Do not allow optional checksum code */ + uint64_t max_l2 : 1; /**< Config bit to choose the largest L2 frame size + Chooses the value of the L2 Type/Length field + to classify the frame as length. + 0 = 1500 / 0x5dc + 1 = 1535 / 0x5ff */ + uint64_t reserved_11_15 : 5; + uint64_t raw_shf : 3; /**< RAW Packet shift amount + Number of bytes to pad a RAW packet. */ + uint64_t reserved_3_7 : 5; + uint64_t nip_shf : 3; /**< Non-IP shift amount + Number of bytes to pad a packet that has been + classified as not IP. */ +#else + uint64_t nip_shf : 3; + uint64_t reserved_3_7 : 5; + uint64_t raw_shf : 3; + uint64_t reserved_11_15 : 5; + uint64_t max_l2 : 1; + uint64_t ip6_udp : 1; + uint64_t tag_syn : 1; + uint64_t reserved_19_63 : 45; +#endif + } s; + struct cvmx_pip_gbl_cfg_s cn30xx; + struct cvmx_pip_gbl_cfg_s cn31xx; + struct cvmx_pip_gbl_cfg_s cn38xx; + struct cvmx_pip_gbl_cfg_s cn38xxp2; + struct cvmx_pip_gbl_cfg_s cn50xx; + struct cvmx_pip_gbl_cfg_s cn52xx; + struct cvmx_pip_gbl_cfg_s cn52xxp1; + struct cvmx_pip_gbl_cfg_s cn56xx; + struct cvmx_pip_gbl_cfg_s cn56xxp1; + struct cvmx_pip_gbl_cfg_s cn58xx; + struct cvmx_pip_gbl_cfg_s cn58xxp1; + struct cvmx_pip_gbl_cfg_s cn63xx; + struct cvmx_pip_gbl_cfg_s cn63xxp1; +}; +typedef union cvmx_pip_gbl_cfg cvmx_pip_gbl_cfg_t; + +/** + * cvmx_pip_gbl_ctl + * + * PIP_GBL_CTL = PIP's Global Control Register + * + * Global control information. These are the global checker enables for + * IPv4/IPv6 and TCP/UDP parsing. The enables effect all ports. + * + * Notes: + * The following text describes the conditions in which each checker will + * assert and flag an exception. By disabling the checker, the exception will + * not be flagged and the packet will be parsed as best it can. Note, by + * disabling conditions, packets can be parsed incorrectly (.i.e. IP_MAL and + * L4_MAL could cause bits to be seen in the wrong place. IP_CHK and L4_CHK + * means that the packet was corrupted). + * + * * IP_CHK + * Indicates that an IPv4 packet contained an IPv4 header checksum + * violations. Only applies to packets classified as IPv4. + * + * * IP_MAL + * Indicates that the packet was malformed. Malformed packets are defined as + * packets that are not long enough to cover the IP header or not long enough + * to cover the length in the IP header. + * + * * IP_HOP + * Indicates that the IPv4 TTL field or IPv6 HOP field is zero. + * + * * IP4_OPTS + * Indicates the presence of IPv4 options. It is set when the length != 5. + * This only applies to packets classified as IPv4. + * + * * IP6_EEXT + * Indicate the presence of IPv6 early extension headers. These bits only + * apply to packets classified as IPv6. Bit 0 will flag early extensions + * when next_header is any one of the following... + * + * - hop-by-hop (0) + * - destination (60) + * - routing (43) + * + * Bit 1 will flag early extentions when next_header is NOT any of the + * following... + * + * - TCP (6) + * - UDP (17) + * - fragmentation (44) + * - ICMP (58) + * - IPSEC ESP (50) + * - IPSEC AH (51) + * - IPCOMP + * + * * L4_MAL + * Indicates that a TCP or UDP packet is not long enough to cover the TCP or + * UDP header. + * + * * L4_PRT + * Indicates that a TCP or UDP packet has an illegal port number - either the + * source or destination port is zero. + * + * * L4_CHK + * Indicates that a packet classified as either TCP or UDP contains an L4 + * checksum failure + * + * * L4_LEN + * Indicates that the TCP or UDP length does not match the the IP length. + * + * * TCP_FLAG + * Indicates any of the following conditions... + * + * [URG, ACK, PSH, RST, SYN, FIN] : tcp_flag + * 6'b000001: (FIN only) + * 6'b000000: (0) + * 6'bxxx1x1: (RST+FIN+*) + * 6'b1xxx1x: (URG+SYN+*) + * 6'bxxx11x: (RST+SYN+*) + * 6'bxxxx11: (SYN+FIN+*) + */ +union cvmx_pip_gbl_ctl +{ + uint64_t u64; + struct cvmx_pip_gbl_ctl_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_28_63 : 36; + uint64_t ihmsk_dis : 1; /**< Instruction Header Mask Disable + 0=Allow NTAG,NTT,NGRP,NQOS bits in the + instruction header to control which fields from + the instruction header are used for WQE WORD2. + 1=Ignore the NTAG,NTT,NGRP,NQOS bits in the + instruction header and act as if these fields + were zero. Thus always use the TAG,TT,GRP,QOS + (depending on the instruction header length) + from the instruction header for the WQE WORD2. */ + uint64_t dsa_grp_tvid : 1; /**< DSA Group Algorithm + Use the DSA source id to compute GRP */ + uint64_t dsa_grp_scmd : 1; /**< DSA Group Algorithm + Use the DSA source id to compute GRP when the + DSA tag command to TO_CPU */ + uint64_t dsa_grp_sid : 1; /**< DSA Group Algorithm + Use the DSA VLAN id to compute GRP */ + uint64_t reserved_21_23 : 3; + uint64_t ring_en : 1; /**< Enable PCIe ring information in WQE */ + uint64_t reserved_17_19 : 3; + uint64_t ignrs : 1; /**< Ignore the PKT_INST_HDR[RS] bit when set + Does not apply to PCI ports (32-35) + When using 2-byte instruction header words, + either PIP_PRT_CFG[DYN_RS] or IGNRS should be set */ + uint64_t vs_wqe : 1; /**< Which DSA/VLAN CFI/ID to use when VLAN Stacking + 0=use the 1st (network order) VLAN + 1=use the 2nd (network order) VLAN */ + uint64_t vs_qos : 1; /**< Which DSA/VLAN priority to use when VLAN Stacking + 0=use the 1st (network order) VLAN + 1=use the 2nd (network order) VLAN */ + uint64_t l2_mal : 1; /**< Enable L2 malformed packet check */ + uint64_t tcp_flag : 1; /**< Enable TCP flags checks */ + uint64_t l4_len : 1; /**< Enable TCP/UDP length check */ + uint64_t l4_chk : 1; /**< Enable TCP/UDP checksum check */ + uint64_t l4_prt : 1; /**< Enable TCP/UDP illegal port check */ + uint64_t l4_mal : 1; /**< Enable TCP/UDP malformed packet check */ + uint64_t reserved_6_7 : 2; + uint64_t ip6_eext : 2; /**< Enable IPv6 early extension headers */ + uint64_t ip4_opts : 1; /**< Enable IPv4 options check */ + uint64_t ip_hop : 1; /**< Enable TTL (IPv4) / hop (IPv6) check */ + uint64_t ip_mal : 1; /**< Enable malformed check */ + uint64_t ip_chk : 1; /**< Enable IPv4 header checksum check */ +#else + uint64_t ip_chk : 1; + uint64_t ip_mal : 1; + uint64_t ip_hop : 1; + uint64_t ip4_opts : 1; + uint64_t ip6_eext : 2; + uint64_t reserved_6_7 : 2; + uint64_t l4_mal : 1; + uint64_t l4_prt : 1; + uint64_t l4_chk : 1; + uint64_t l4_len : 1; + uint64_t tcp_flag : 1; + uint64_t l2_mal : 1; + uint64_t vs_qos : 1; + uint64_t vs_wqe : 1; + uint64_t ignrs : 1; + uint64_t reserved_17_19 : 3; + uint64_t ring_en : 1; + uint64_t reserved_21_23 : 3; + uint64_t dsa_grp_sid : 1; + uint64_t dsa_grp_scmd : 1; + uint64_t dsa_grp_tvid : 1; + uint64_t ihmsk_dis : 1; + uint64_t reserved_28_63 : 36; +#endif + } s; + struct cvmx_pip_gbl_ctl_cn30xx + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_17_63 : 47; + uint64_t ignrs : 1; /**< Ignore the PKT_INST_HDR[RS] bit when set + Only applies to the packet interface prts (0-31) + When using 2-byte instruction header words, + either PIP_PRT_CFG[DYN_RS] or IGNRS should be set */ + uint64_t vs_wqe : 1; /**< Which VLAN CFI and ID to use when VLAN Stacking + 0=use the 1st (network order) VLAN + 1=use the 2nd (network order) VLAN */ + uint64_t vs_qos : 1; /**< Which VLAN priority to use when VLAN Stacking + 0=use the 1st (network order) VLAN + 1=use the 2nd (network order) VLAN */ + uint64_t l2_mal : 1; /**< Enable L2 malformed packet check */ + uint64_t tcp_flag : 1; /**< Enable TCP flags checks */ + uint64_t l4_len : 1; /**< Enable TCP/UDP length check */ + uint64_t l4_chk : 1; /**< Enable TCP/UDP checksum check */ + uint64_t l4_prt : 1; /**< Enable TCP/UDP illegal port check */ + uint64_t l4_mal : 1; /**< Enable TCP/UDP malformed packet check */ + uint64_t reserved_6_7 : 2; + uint64_t ip6_eext : 2; /**< Enable IPv6 early extension headers */ + uint64_t ip4_opts : 1; /**< Enable IPv4 options check */ + uint64_t ip_hop : 1; /**< Enable TTL (IPv4) / hop (IPv6) check */ + uint64_t ip_mal : 1; /**< Enable malformed check */ + uint64_t ip_chk : 1; /**< Enable IPv4 header checksum check */ +#else + uint64_t ip_chk : 1; + uint64_t ip_mal : 1; + uint64_t ip_hop : 1; + uint64_t ip4_opts : 1; + uint64_t ip6_eext : 2; + uint64_t reserved_6_7 : 2; + uint64_t l4_mal : 1; + uint64_t l4_prt : 1; + uint64_t l4_chk : 1; + uint64_t l4_len : 1; + uint64_t tcp_flag : 1; + uint64_t l2_mal : 1; + uint64_t vs_qos : 1; + uint64_t vs_wqe : 1; + uint64_t ignrs : 1; + uint64_t reserved_17_63 : 47; +#endif + } cn30xx; + struct cvmx_pip_gbl_ctl_cn30xx cn31xx; + struct cvmx_pip_gbl_ctl_cn30xx cn38xx; + struct cvmx_pip_gbl_ctl_cn30xx cn38xxp2; + struct cvmx_pip_gbl_ctl_cn30xx cn50xx; + struct cvmx_pip_gbl_ctl_cn52xx + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_27_63 : 37; + uint64_t dsa_grp_tvid : 1; /**< DSA Group Algorithm + Use the DSA source id to compute GRP */ + uint64_t dsa_grp_scmd : 1; /**< DSA Group Algorithm + Use the DSA source id to compute GRP when the + DSA tag command to TO_CPU */ + uint64_t dsa_grp_sid : 1; /**< DSA Group Algorithm + Use the DSA VLAN id to compute GRP */ + uint64_t reserved_21_23 : 3; + uint64_t ring_en : 1; /**< Enable PCIe ring information in WQE */ + uint64_t reserved_17_19 : 3; + uint64_t ignrs : 1; /**< Ignore the PKT_INST_HDR[RS] bit when set + Does not apply to PCI ports (32-35) + When using 2-byte instruction header words, + either PIP_PRT_CFG[DYN_RS] or IGNRS should be set */ + uint64_t vs_wqe : 1; /**< Which DSA/VLAN CFI/ID to use when VLAN Stacking + 0=use the 1st (network order) VLAN + 1=use the 2nd (network order) VLAN */ + uint64_t vs_qos : 1; /**< Which DSA/VLAN priority to use when VLAN Stacking + 0=use the 1st (network order) VLAN + 1=use the 2nd (network order) VLAN */ + uint64_t l2_mal : 1; /**< Enable L2 malformed packet check */ + uint64_t tcp_flag : 1; /**< Enable TCP flags checks */ + uint64_t l4_len : 1; /**< Enable TCP/UDP length check */ + uint64_t l4_chk : 1; /**< Enable TCP/UDP checksum check */ + uint64_t l4_prt : 1; /**< Enable TCP/UDP illegal port check */ + uint64_t l4_mal : 1; /**< Enable TCP/UDP malformed packet check */ + uint64_t reserved_6_7 : 2; + uint64_t ip6_eext : 2; /**< Enable IPv6 early extension headers */ + uint64_t ip4_opts : 1; /**< Enable IPv4 options check */ + uint64_t ip_hop : 1; /**< Enable TTL (IPv4) / hop (IPv6) check */ + uint64_t ip_mal : 1; /**< Enable malformed check */ + uint64_t ip_chk : 1; /**< Enable IPv4 header checksum check */ +#else + uint64_t ip_chk : 1; + uint64_t ip_mal : 1; + uint64_t ip_hop : 1; + uint64_t ip4_opts : 1; + uint64_t ip6_eext : 2; + uint64_t reserved_6_7 : 2; + uint64_t l4_mal : 1; + uint64_t l4_prt : 1; + uint64_t l4_chk : 1; + uint64_t l4_len : 1; + uint64_t tcp_flag : 1; + uint64_t l2_mal : 1; + uint64_t vs_qos : 1; + uint64_t vs_wqe : 1; + uint64_t ignrs : 1; + uint64_t reserved_17_19 : 3; + uint64_t ring_en : 1; + uint64_t reserved_21_23 : 3; + uint64_t dsa_grp_sid : 1; + uint64_t dsa_grp_scmd : 1; + uint64_t dsa_grp_tvid : 1; + uint64_t reserved_27_63 : 37; +#endif + } cn52xx; + struct cvmx_pip_gbl_ctl_cn52xx cn52xxp1; + struct cvmx_pip_gbl_ctl_cn52xx cn56xx; + struct cvmx_pip_gbl_ctl_cn56xxp1 + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_21_63 : 43; + uint64_t ring_en : 1; /**< Enable PCIe ring information in WQE */ + uint64_t reserved_17_19 : 3; + uint64_t ignrs : 1; /**< Ignore the PKT_INST_HDR[RS] bit when set + Does not apply to PCI ports (32-35) + When using 2-byte instruction header words, + either PIP_PRT_CFG[DYN_RS] or IGNRS should be set */ + uint64_t vs_wqe : 1; /**< Which VLAN CFI and ID to use when VLAN Stacking + 0=use the 1st (network order) VLAN + 1=use the 2nd (network order) VLAN */ + uint64_t vs_qos : 1; /**< Which VLAN priority to use when VLAN Stacking + 0=use the 1st (network order) VLAN + 1=use the 2nd (network order) VLAN */ + uint64_t l2_mal : 1; /**< Enable L2 malformed packet check */ + uint64_t tcp_flag : 1; /**< Enable TCP flags checks */ + uint64_t l4_len : 1; /**< Enable TCP/UDP length check */ + uint64_t l4_chk : 1; /**< Enable TCP/UDP checksum check */ + uint64_t l4_prt : 1; /**< Enable TCP/UDP illegal port check */ + uint64_t l4_mal : 1; /**< Enable TCP/UDP malformed packet check */ + uint64_t reserved_6_7 : 2; + uint64_t ip6_eext : 2; /**< Enable IPv6 early extension headers */ + uint64_t ip4_opts : 1; /**< Enable IPv4 options check */ + uint64_t ip_hop : 1; /**< Enable TTL (IPv4) / hop (IPv6) check */ + uint64_t ip_mal : 1; /**< Enable malformed check */ + uint64_t ip_chk : 1; /**< Enable IPv4 header checksum check */ +#else + uint64_t ip_chk : 1; + uint64_t ip_mal : 1; + uint64_t ip_hop : 1; + uint64_t ip4_opts : 1; + uint64_t ip6_eext : 2; + uint64_t reserved_6_7 : 2; + uint64_t l4_mal : 1; + uint64_t l4_prt : 1; + uint64_t l4_chk : 1; + uint64_t l4_len : 1; + uint64_t tcp_flag : 1; + uint64_t l2_mal : 1; + uint64_t vs_qos : 1; + uint64_t vs_wqe : 1; + uint64_t ignrs : 1; + uint64_t reserved_17_19 : 3; + uint64_t ring_en : 1; + uint64_t reserved_21_63 : 43; +#endif + } cn56xxp1; + struct cvmx_pip_gbl_ctl_cn30xx cn58xx; + struct cvmx_pip_gbl_ctl_cn30xx cn58xxp1; + struct cvmx_pip_gbl_ctl_s cn63xx; + struct cvmx_pip_gbl_ctl_s cn63xxp1; +}; +typedef union cvmx_pip_gbl_ctl cvmx_pip_gbl_ctl_t; + +/** + * cvmx_pip_hg_pri_qos + * + * Notes: + * This register controls accesses to the HG_QOS_TABLE. To write an entry of + * the table, write PIP_HG_PRI_QOS with PRI=table address, QOS=priority level, + * UP_QOS=1. To read an entry of the table, write PIP_HG_PRI_QOS with + * PRI=table address, QOS=dont_carepriority level, UP_QOS=0 and then read + * PIP_HG_PRI_QOS. The table data will be in PIP_HG_PRI_QOS[QOS]. + */ +union cvmx_pip_hg_pri_qos +{ + uint64_t u64; + struct cvmx_pip_hg_pri_qos_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_13_63 : 51; + uint64_t up_qos : 1; /**< When written to '1', updates the entry in the + HG_QOS_TABLE as specified by PRI to a value of + QOS as follows + HG_QOS_TABLE[PRI] = QOS */ + uint64_t reserved_11_11 : 1; + uint64_t qos : 3; /**< QOS Map level to priority */ + uint64_t reserved_6_7 : 2; + uint64_t pri : 6; /**< The priority level from HiGig header + HiGig/HiGig+ PRI = [1'b0, CNG[1:0], COS[2:0]] + HiGig2 PRI = [DP[1:0], TC[3:0]] */ +#else + uint64_t pri : 6; + uint64_t reserved_6_7 : 2; + uint64_t qos : 3; + uint64_t reserved_11_11 : 1; + uint64_t up_qos : 1; + uint64_t reserved_13_63 : 51; +#endif + } s; + struct cvmx_pip_hg_pri_qos_s cn52xx; + struct cvmx_pip_hg_pri_qos_s cn52xxp1; + struct cvmx_pip_hg_pri_qos_s cn56xx; + struct cvmx_pip_hg_pri_qos_s cn63xx; + struct cvmx_pip_hg_pri_qos_s cn63xxp1; +}; +typedef union cvmx_pip_hg_pri_qos cvmx_pip_hg_pri_qos_t; + +/** + * cvmx_pip_int_en + * + * PIP_INT_EN = PIP's Interrupt Enable Register + * + * Determines if hardward should raise an interrupt to software + * when an exception event occurs. + */ +union cvmx_pip_int_en +{ + uint64_t u64; + struct cvmx_pip_int_en_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_13_63 : 51; + uint64_t punyerr : 1; /**< Frame was received with length <=4B when CRC + stripping in IPD is enable */ + uint64_t lenerr : 1; /**< Frame was received with length error */ + uint64_t maxerr : 1; /**< Frame was received with length > max_length */ + uint64_t minerr : 1; /**< Frame was received with length < min_length */ + uint64_t beperr : 1; /**< Parity Error in back end memory */ + uint64_t feperr : 1; /**< Parity Error in front end memory */ + uint64_t todoovr : 1; /**< Todo list overflow (see PIP_BCK_PRS[HIWATER]) */ + uint64_t skprunt : 1; /**< Packet was engulfed by skipper */ + uint64_t badtag : 1; /**< A bad tag was sent from IPD */ + uint64_t prtnxa : 1; /**< Non-existent port */ + uint64_t bckprs : 1; /**< PIP asserted backpressure */ + uint64_t crcerr : 1; /**< PIP calculated bad CRC */ + uint64_t pktdrp : 1; /**< Packet Dropped due to QOS */ +#else + uint64_t pktdrp : 1; + uint64_t crcerr : 1; + uint64_t bckprs : 1; + uint64_t prtnxa : 1; + uint64_t badtag : 1; + uint64_t skprunt : 1; + uint64_t todoovr : 1; + uint64_t feperr : 1; + uint64_t beperr : 1; + uint64_t minerr : 1; + uint64_t maxerr : 1; + uint64_t lenerr : 1; + uint64_t punyerr : 1; + uint64_t reserved_13_63 : 51; +#endif + } s; + struct cvmx_pip_int_en_cn30xx + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_9_63 : 55; + uint64_t beperr : 1; /**< Parity Error in back end memory */ + uint64_t feperr : 1; /**< Parity Error in front end memory */ + uint64_t todoovr : 1; /**< Todo list overflow + (not used in O2P) */ + uint64_t skprunt : 1; /**< Packet was engulfed by skipper */ + uint64_t badtag : 1; /**< A bad tag was sent from IPD */ + uint64_t prtnxa : 1; /**< Non-existent port */ + uint64_t bckprs : 1; /**< PIP asserted backpressure + (not used in O2P) */ + uint64_t crcerr : 1; /**< PIP calculated bad CRC + (not used in O2P) */ + uint64_t pktdrp : 1; /**< Packet Dropped due to QOS */ +#else + uint64_t pktdrp : 1; + uint64_t crcerr : 1; + uint64_t bckprs : 1; + uint64_t prtnxa : 1; + uint64_t badtag : 1; + uint64_t skprunt : 1; + uint64_t todoovr : 1; + uint64_t feperr : 1; + uint64_t beperr : 1; + uint64_t reserved_9_63 : 55; +#endif + } cn30xx; + struct cvmx_pip_int_en_cn30xx cn31xx; + struct cvmx_pip_int_en_cn30xx cn38xx; + struct cvmx_pip_int_en_cn30xx cn38xxp2; + struct cvmx_pip_int_en_cn50xx + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_12_63 : 52; + uint64_t lenerr : 1; /**< Frame was received with length error */ + uint64_t maxerr : 1; /**< Frame was received with length > max_length */ + uint64_t minerr : 1; /**< Frame was received with length < min_length */ + uint64_t beperr : 1; /**< Parity Error in back end memory */ + uint64_t feperr : 1; /**< Parity Error in front end memory */ + uint64_t todoovr : 1; /**< Todo list overflow */ + uint64_t skprunt : 1; /**< Packet was engulfed by skipper */ + uint64_t badtag : 1; /**< A bad tag was sent from IPD */ + uint64_t prtnxa : 1; /**< Non-existent port */ + uint64_t bckprs : 1; /**< PIP asserted backpressure */ + uint64_t reserved_1_1 : 1; + uint64_t pktdrp : 1; /**< Packet Dropped due to QOS */ +#else + uint64_t pktdrp : 1; + uint64_t reserved_1_1 : 1; + uint64_t bckprs : 1; + uint64_t prtnxa : 1; + uint64_t badtag : 1; + uint64_t skprunt : 1; + uint64_t todoovr : 1; + uint64_t feperr : 1; + uint64_t beperr : 1; + uint64_t minerr : 1; + uint64_t maxerr : 1; + uint64_t lenerr : 1; + uint64_t reserved_12_63 : 52; +#endif + } cn50xx; + struct cvmx_pip_int_en_cn52xx + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_13_63 : 51; + uint64_t punyerr : 1; /**< Frame was received with length <=4B when CRC + stripping in IPD is enable */ + uint64_t lenerr : 1; /**< Frame was received with length error */ + uint64_t maxerr : 1; /**< Frame was received with length > max_length */ + uint64_t minerr : 1; /**< Frame was received with length < min_length */ + uint64_t beperr : 1; /**< Parity Error in back end memory */ + uint64_t feperr : 1; /**< Parity Error in front end memory */ + uint64_t todoovr : 1; /**< Todo list overflow */ + uint64_t skprunt : 1; /**< Packet was engulfed by skipper */ + uint64_t badtag : 1; /**< A bad tag was sent from IPD */ + uint64_t prtnxa : 1; /**< Non-existent port */ + uint64_t bckprs : 1; /**< PIP asserted backpressure */ + uint64_t reserved_1_1 : 1; + uint64_t pktdrp : 1; /**< Packet Dropped due to QOS */ +#else + uint64_t pktdrp : 1; + uint64_t reserved_1_1 : 1; + uint64_t bckprs : 1; + uint64_t prtnxa : 1; + uint64_t badtag : 1; + uint64_t skprunt : 1; + uint64_t todoovr : 1; + uint64_t feperr : 1; + uint64_t beperr : 1; + uint64_t minerr : 1; + uint64_t maxerr : 1; + uint64_t lenerr : 1; + uint64_t punyerr : 1; + uint64_t reserved_13_63 : 51; +#endif + } cn52xx; + struct cvmx_pip_int_en_cn52xx cn52xxp1; + struct cvmx_pip_int_en_s cn56xx; + struct cvmx_pip_int_en_cn56xxp1 + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_12_63 : 52; + uint64_t lenerr : 1; /**< Frame was received with length error */ + uint64_t maxerr : 1; /**< Frame was received with length > max_length */ + uint64_t minerr : 1; /**< Frame was received with length < min_length */ + uint64_t beperr : 1; /**< Parity Error in back end memory */ + uint64_t feperr : 1; /**< Parity Error in front end memory */ + uint64_t todoovr : 1; /**< Todo list overflow (see PIP_BCK_PRS[HIWATER]) */ + uint64_t skprunt : 1; /**< Packet was engulfed by skipper */ + uint64_t badtag : 1; /**< A bad tag was sent from IPD */ + uint64_t prtnxa : 1; /**< Non-existent port */ + uint64_t bckprs : 1; /**< PIP asserted backpressure */ + uint64_t crcerr : 1; /**< PIP calculated bad CRC + (Disabled in 56xx) */ + uint64_t pktdrp : 1; /**< Packet Dropped due to QOS */ +#else + uint64_t pktdrp : 1; + uint64_t crcerr : 1; + uint64_t bckprs : 1; + uint64_t prtnxa : 1; + uint64_t badtag : 1; + uint64_t skprunt : 1; + uint64_t todoovr : 1; + uint64_t feperr : 1; + uint64_t beperr : 1; + uint64_t minerr : 1; + uint64_t maxerr : 1; + uint64_t lenerr : 1; + uint64_t reserved_12_63 : 52; +#endif + } cn56xxp1; + struct cvmx_pip_int_en_cn58xx + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_13_63 : 51; + uint64_t punyerr : 1; /**< Frame was received with length <=4B when CRC + stripping in IPD is enable */ + uint64_t reserved_9_11 : 3; + uint64_t beperr : 1; /**< Parity Error in back end memory */ + uint64_t feperr : 1; /**< Parity Error in front end memory */ + uint64_t todoovr : 1; /**< Todo list overflow (see PIP_BCK_PRS[HIWATER]) */ + uint64_t skprunt : 1; /**< Packet was engulfed by skipper */ + uint64_t badtag : 1; /**< A bad tag was sent from IPD */ + uint64_t prtnxa : 1; /**< Non-existent port */ + uint64_t bckprs : 1; /**< PIP asserted backpressure */ + uint64_t crcerr : 1; /**< PIP calculated bad CRC */ + uint64_t pktdrp : 1; /**< Packet Dropped due to QOS */ +#else + uint64_t pktdrp : 1; + uint64_t crcerr : 1; + uint64_t bckprs : 1; + uint64_t prtnxa : 1; + uint64_t badtag : 1; + uint64_t skprunt : 1; + uint64_t todoovr : 1; + uint64_t feperr : 1; + uint64_t beperr : 1; + uint64_t reserved_9_11 : 3; + uint64_t punyerr : 1; + uint64_t reserved_13_63 : 51; +#endif + } cn58xx; + struct cvmx_pip_int_en_cn30xx cn58xxp1; + struct cvmx_pip_int_en_s cn63xx; + struct cvmx_pip_int_en_s cn63xxp1; +}; +typedef union cvmx_pip_int_en cvmx_pip_int_en_t; + +/** + * cvmx_pip_int_reg + * + * PIP_INT_REG = PIP's Interrupt Register + * + * Any exception event that occurs is captured in the PIP_INT_REG. + * PIP_INT_REG will set the exception bit regardless of the value + * of PIP_INT_EN. PIP_INT_EN only controls if an interrupt is + * raised to software. + * + * Notes: + * * TODOOVR + * The PIP Todo list stores packets that have been received and require work + * queue entry generation. PIP will normally assert backpressure when the + * list fills up such that any error is normally is result of a programming + * the PIP_BCK_PRS[HIWATER] incorrectly. PIP itself can handle 29M + * packets/sec X500MHz or 15Gbs X 64B packets. + * + * * SKPRUNT + * If a packet size is less then the amount programmed in the per port + * skippers, then there will be nothing to parse and the entire packet will + * basically be skipped over. This is probably not what the user desired, so + * there is an indication to software. + * + * * BADTAG + * A tag is considered bad when it is resued by a new packet before it was + * released by PIP. PIP considers a tag released by one of two methods. + * . QOS dropped so that it is released over the pip__ipd_release bus. + * . WorkQ entry is validated by the pip__ipd_done signal + * + * * PRTNXA + * If PIP receives a packet that is not in the valid port range, the port + * processed will be mapped into the valid port space (the mapping is + * currently unpredictable) and the PRTNXA bit will be set. PRTNXA will be + * set for packets received under the following conditions: + * + * * packet ports (ports 0-31) + * - GMX_INF_MODE[TYPE]==0 (SGMII), received port is 4-15 or 20-31 + * - GMX_INF_MODE[TYPE]==1 (XAUI), received port is 1-15 or 17-31 + * * upper ports (pci and loopback ports 32-63) + * - received port is 40-47 or 52-63 + * + * * BCKPRS + * PIP can assert backpressure to the receive logic when the todo list + * exceeds a high-water mark (see PIP_BCK_PRS for more details). When this + * occurs, PIP can raise an interrupt to software. + * + * * CRCERR + * Octane can compute CRC in two places. Each RGMII port will compute its + * own CRC, but PIP can provide an additional check or check loopback or + * PCI ports. If PIP computes a bad CRC, then PIP will raise an interrupt. + * + * * PKTDRP + * PIP can drop packets based on QOS results received from IPD. If the QOS + * algorithm decides to drop a packet, PIP will assert an interrupt. + */ +union cvmx_pip_int_reg +{ + uint64_t u64; + struct cvmx_pip_int_reg_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_13_63 : 51; + uint64_t punyerr : 1; /**< Frame was received with length <=4B when CRC + stripping in IPD is enable */ + uint64_t lenerr : 1; /**< Frame was received with length error */ + uint64_t maxerr : 1; /**< Frame was received with length > max_length */ + uint64_t minerr : 1; /**< Frame was received with length < min_length */ + uint64_t beperr : 1; /**< Parity Error in back end memory */ + uint64_t feperr : 1; /**< Parity Error in front end memory */ + uint64_t todoovr : 1; /**< Todo list overflow (see PIP_BCK_PRS[HIWATER]) */ + uint64_t skprunt : 1; /**< Packet was engulfed by skipper + This interrupt can occur with received PARTIAL + packets that are truncated to SKIP bytes or + smaller. */ + uint64_t badtag : 1; /**< A bad tag was sent from IPD */ + uint64_t prtnxa : 1; /**< Non-existent port */ + uint64_t bckprs : 1; /**< PIP asserted backpressure */ + uint64_t crcerr : 1; /**< PIP calculated bad CRC */ + uint64_t pktdrp : 1; /**< Packet Dropped due to QOS */ +#else + uint64_t pktdrp : 1; + uint64_t crcerr : 1; + uint64_t bckprs : 1; + uint64_t prtnxa : 1; + uint64_t badtag : 1; + uint64_t skprunt : 1; + uint64_t todoovr : 1; + uint64_t feperr : 1; + uint64_t beperr : 1; + uint64_t minerr : 1; + uint64_t maxerr : 1; + uint64_t lenerr : 1; + uint64_t punyerr : 1; + uint64_t reserved_13_63 : 51; +#endif + } s; + struct cvmx_pip_int_reg_cn30xx + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_9_63 : 55; + uint64_t beperr : 1; /**< Parity Error in back end memory */ + uint64_t feperr : 1; /**< Parity Error in front end memory */ + uint64_t todoovr : 1; /**< Todo list overflow + (not used in O2P) */ + uint64_t skprunt : 1; /**< Packet was engulfed by skipper + This interrupt can occur with received PARTIAL + packets that are truncated to SKIP bytes or + smaller. */ + uint64_t badtag : 1; /**< A bad tag was sent from IPD */ + uint64_t prtnxa : 1; /**< Non-existent port */ + uint64_t bckprs : 1; /**< PIP asserted backpressure + (not used in O2P) */ + uint64_t crcerr : 1; /**< PIP calculated bad CRC + (not used in O2P) */ + uint64_t pktdrp : 1; /**< Packet Dropped due to QOS */ +#else + uint64_t pktdrp : 1; + uint64_t crcerr : 1; + uint64_t bckprs : 1; + uint64_t prtnxa : 1; + uint64_t badtag : 1; + uint64_t skprunt : 1; + uint64_t todoovr : 1; + uint64_t feperr : 1; + uint64_t beperr : 1; + uint64_t reserved_9_63 : 55; +#endif + } cn30xx; + struct cvmx_pip_int_reg_cn30xx cn31xx; + struct cvmx_pip_int_reg_cn30xx cn38xx; + struct cvmx_pip_int_reg_cn30xx cn38xxp2; + struct cvmx_pip_int_reg_cn50xx + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_12_63 : 52; + uint64_t lenerr : 1; /**< Frame was received with length error */ + uint64_t maxerr : 1; /**< Frame was received with length > max_length */ + uint64_t minerr : 1; /**< Frame was received with length < min_length */ + uint64_t beperr : 1; /**< Parity Error in back end memory */ + uint64_t feperr : 1; /**< Parity Error in front end memory */ + uint64_t todoovr : 1; /**< Todo list overflow */ + uint64_t skprunt : 1; /**< Packet was engulfed by skipper + This interrupt can occur with received PARTIAL + packets that are truncated to SKIP bytes or + smaller. */ + uint64_t badtag : 1; /**< A bad tag was sent from IPD */ + uint64_t prtnxa : 1; /**< Non-existent port */ + uint64_t bckprs : 1; /**< PIP asserted backpressure */ + uint64_t reserved_1_1 : 1; + uint64_t pktdrp : 1; /**< Packet Dropped due to QOS */ +#else + uint64_t pktdrp : 1; + uint64_t reserved_1_1 : 1; + uint64_t bckprs : 1; + uint64_t prtnxa : 1; + uint64_t badtag : 1; + uint64_t skprunt : 1; + uint64_t todoovr : 1; + uint64_t feperr : 1; + uint64_t beperr : 1; + uint64_t minerr : 1; + uint64_t maxerr : 1; + uint64_t lenerr : 1; + uint64_t reserved_12_63 : 52; +#endif + } cn50xx; + struct cvmx_pip_int_reg_cn52xx + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_13_63 : 51; + uint64_t punyerr : 1; /**< Frame was received with length <=4B when CRC + stripping in IPD is enable */ + uint64_t lenerr : 1; /**< Frame was received with length error */ + uint64_t maxerr : 1; /**< Frame was received with length > max_length */ + uint64_t minerr : 1; /**< Frame was received with length < min_length */ + uint64_t beperr : 1; /**< Parity Error in back end memory */ + uint64_t feperr : 1; /**< Parity Error in front end memory */ + uint64_t todoovr : 1; /**< Todo list overflow */ + uint64_t skprunt : 1; /**< Packet was engulfed by skipper + This interrupt can occur with received PARTIAL + packets that are truncated to SKIP bytes or + smaller. */ + uint64_t badtag : 1; /**< A bad tag was sent from IPD */ + uint64_t prtnxa : 1; /**< Non-existent port */ + uint64_t bckprs : 1; /**< PIP asserted backpressure */ + uint64_t reserved_1_1 : 1; + uint64_t pktdrp : 1; /**< Packet Dropped due to QOS */ +#else + uint64_t pktdrp : 1; + uint64_t reserved_1_1 : 1; + uint64_t bckprs : 1; + uint64_t prtnxa : 1; + uint64_t badtag : 1; + uint64_t skprunt : 1; + uint64_t todoovr : 1; + uint64_t feperr : 1; + uint64_t beperr : 1; + uint64_t minerr : 1; + uint64_t maxerr : 1; + uint64_t lenerr : 1; + uint64_t punyerr : 1; + uint64_t reserved_13_63 : 51; +#endif + } cn52xx; + struct cvmx_pip_int_reg_cn52xx cn52xxp1; + struct cvmx_pip_int_reg_s cn56xx; + struct cvmx_pip_int_reg_cn56xxp1 + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_12_63 : 52; + uint64_t lenerr : 1; /**< Frame was received with length error */ + uint64_t maxerr : 1; /**< Frame was received with length > max_length */ + uint64_t minerr : 1; /**< Frame was received with length < min_length */ + uint64_t beperr : 1; /**< Parity Error in back end memory */ + uint64_t feperr : 1; /**< Parity Error in front end memory */ + uint64_t todoovr : 1; /**< Todo list overflow (see PIP_BCK_PRS[HIWATER]) */ + uint64_t skprunt : 1; /**< Packet was engulfed by skipper + This interrupt can occur with received PARTIAL + packets that are truncated to SKIP bytes or + smaller. */ + uint64_t badtag : 1; /**< A bad tag was sent from IPD */ + uint64_t prtnxa : 1; /**< Non-existent port */ + uint64_t bckprs : 1; /**< PIP asserted backpressure */ + uint64_t crcerr : 1; /**< PIP calculated bad CRC + (Disabled in 56xx) */ + uint64_t pktdrp : 1; /**< Packet Dropped due to QOS */ +#else + uint64_t pktdrp : 1; + uint64_t crcerr : 1; + uint64_t bckprs : 1; + uint64_t prtnxa : 1; + uint64_t badtag : 1; + uint64_t skprunt : 1; + uint64_t todoovr : 1; + uint64_t feperr : 1; + uint64_t beperr : 1; + uint64_t minerr : 1; + uint64_t maxerr : 1; + uint64_t lenerr : 1; + uint64_t reserved_12_63 : 52; +#endif + } cn56xxp1; + struct cvmx_pip_int_reg_cn58xx + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_13_63 : 51; + uint64_t punyerr : 1; /**< Frame was received with length <=4B when CRC + stripping in IPD is enable */ + uint64_t reserved_9_11 : 3; + uint64_t beperr : 1; /**< Parity Error in back end memory */ + uint64_t feperr : 1; /**< Parity Error in front end memory */ + uint64_t todoovr : 1; /**< Todo list overflow (see PIP_BCK_PRS[HIWATER]) */ + uint64_t skprunt : 1; /**< Packet was engulfed by skipper + This interrupt can occur with received PARTIAL + packets that are truncated to SKIP bytes or + smaller. */ + uint64_t badtag : 1; /**< A bad tag was sent from IPD */ + uint64_t prtnxa : 1; /**< Non-existent port */ + uint64_t bckprs : 1; /**< PIP asserted backpressure */ + uint64_t crcerr : 1; /**< PIP calculated bad CRC */ + uint64_t pktdrp : 1; /**< Packet Dropped due to QOS */ +#else + uint64_t pktdrp : 1; + uint64_t crcerr : 1; + uint64_t bckprs : 1; + uint64_t prtnxa : 1; + uint64_t badtag : 1; + uint64_t skprunt : 1; + uint64_t todoovr : 1; + uint64_t feperr : 1; + uint64_t beperr : 1; + uint64_t reserved_9_11 : 3; + uint64_t punyerr : 1; + uint64_t reserved_13_63 : 51; +#endif + } cn58xx; + struct cvmx_pip_int_reg_cn30xx cn58xxp1; + struct cvmx_pip_int_reg_s cn63xx; + struct cvmx_pip_int_reg_s cn63xxp1; +}; +typedef union cvmx_pip_int_reg cvmx_pip_int_reg_t; + +/** + * cvmx_pip_ip_offset + * + * PIP_IP_OFFSET = Location of the IP in the workQ entry + * + * An 8-byte offset to find the start of the IP header in the data portion of IP workQ entires + * + * Notes: + * In normal configurations, OFFSET must be set in the 0..4 range to allow the + * entire IP and TCP/UDP headers to be buffered in HW and calculate the L4 + * checksum for TCP/UDP packets. + * + * The MAX value of OFFSET is determined by the the types of packets that can + * be sent to PIP as follows... + * + * Packet Type MAX OFFSET + * IPv4/TCP/UDP 7 + * IPv6/TCP/UDP 5 + * IPv6/without L4 parsing 6 + * + * If the L4 can be ignored, then the MAX OFFSET for IPv6 packets can increase + * to 6. Here are the following programming restrictions for IPv6 packets and + * OFFSET==6: + * + * . PIP_GBL_CTL[TCP_FLAG] == 0 + * . PIP_GBL_CTL[L4_LEN] == 0 + * . PIP_GBL_CTL[L4_CHK] == 0 + * . PIP_GBL_CTL[L4_PRT] == 0 + * . PIP_GBL_CTL[L4_MAL] == 0 + * . PIP_DEC_IPSEC[TCP] == 0 + * . PIP_DEC_IPSEC[UDP] == 0 + * . PIP_PRT_TAG[IP6_DPRT] == 0 + * . PIP_PRT_TAG[IP6_SPRT] == 0 + * . PIP_PRT_TAG[TCP6_TAG] == 0 + * . PIP_GBL_CFG[TAG_SYN] == 0 + */ +union cvmx_pip_ip_offset +{ + uint64_t u64; + struct cvmx_pip_ip_offset_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_3_63 : 61; + uint64_t offset : 3; /**< Number of 8B ticks to include in workQ entry + prior to IP data + - 0: 0 Bytes / IP start at WORD4 of workQ entry + - 1: 8 Bytes / IP start at WORD5 of workQ entry + - 2: 16 Bytes / IP start at WORD6 of workQ entry + - 3: 24 Bytes / IP start at WORD7 of workQ entry + - 4: 32 Bytes / IP start at WORD8 of workQ entry + - 5: 40 Bytes / IP start at WORD9 of workQ entry + - 6: 48 Bytes / IP start at WORD10 of workQ entry + - 7: 56 Bytes / IP start at WORD11 of workQ entry */ +#else + uint64_t offset : 3; + uint64_t reserved_3_63 : 61; +#endif + } s; + struct cvmx_pip_ip_offset_s cn30xx; + struct cvmx_pip_ip_offset_s cn31xx; + struct cvmx_pip_ip_offset_s cn38xx; + struct cvmx_pip_ip_offset_s cn38xxp2; + struct cvmx_pip_ip_offset_s cn50xx; + struct cvmx_pip_ip_offset_s cn52xx; + struct cvmx_pip_ip_offset_s cn52xxp1; + struct cvmx_pip_ip_offset_s cn56xx; + struct cvmx_pip_ip_offset_s cn56xxp1; + struct cvmx_pip_ip_offset_s cn58xx; + struct cvmx_pip_ip_offset_s cn58xxp1; + struct cvmx_pip_ip_offset_s cn63xx; + struct cvmx_pip_ip_offset_s cn63xxp1; +}; +typedef union cvmx_pip_ip_offset cvmx_pip_ip_offset_t; + +/** + * cvmx_pip_prt_cfg# + * + * PIP_PRT_CFGX = Per port config information + * + */ +union cvmx_pip_prt_cfgx +{ + uint64_t u64; + struct cvmx_pip_prt_cfgx_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_53_63 : 11; + uint64_t pad_len : 1; /**< When set, disables the length check for pkts with + padding in the client data */ + uint64_t vlan_len : 1; /**< When set, disables the length check for DSA/VLAN + pkts */ + uint64_t lenerr_en : 1; /**< L2 length error check enable + Frame was received with length error + Typically, this check will not be enabled for + incoming packets on the PCIe ports. */ + uint64_t maxerr_en : 1; /**< Max frame error check enable + Frame was received with length > max_length */ + uint64_t minerr_en : 1; /**< Min frame error check enable + Frame was received with length < min_length + Typically, this check will not be enabled for + incoming packets on the PCIe ports. */ + uint64_t grp_wat_47 : 4; /**< GRP Watcher enable + (Watchers 4-7) */ + uint64_t qos_wat_47 : 4; /**< QOS Watcher enable + (Watchers 4-7) */ + uint64_t reserved_37_39 : 3; + uint64_t rawdrp : 1; /**< Allow the IPD to RED drop a packet. + Normally, IPD will never drop a packet that PIP + indicates is RAW. + 0=never drop RAW packets based on RED algorithm + 1=allow RAW packet drops based on RED algorithm */ + uint64_t tag_inc : 2; /**< Which of the 4 PIP_TAG_INC to use when + calculating mask tag hash */ + uint64_t dyn_rs : 1; /**< Dynamically calculate RS based on pkt size and + configuration. If DYN_RS is set then + PKT_INST_HDR[RS] is not used. When using 2-byte + instruction header words, either DYN_RS or + PIP_GBL_CTL[IGNRS] should be set. */ + uint64_t inst_hdr : 1; /**< 8-byte INST_HDR is present on all packets + (not for PCI prts, 32-35) + Must be zero in DSA mode */ + uint64_t grp_wat : 4; /**< GRP Watcher enable */ + uint64_t hg_qos : 1; /**< When set, uses the HiGig priority bits as a + lookup into the HG_QOS_TABLE (PIP_HG_PRI_QOS) + to determine the QOS value + HG_QOS must not be set when HIGIG_EN=0 */ + uint64_t qos : 3; /**< Default QOS level of the port */ + uint64_t qos_wat : 4; /**< QOS Watcher enable + (Watchers 0-3) */ + uint64_t qos_vsel : 1; /**< Which QOS in PIP_QOS_VLAN to use + 0 = PIP_QOS_VLAN[QOS] + 1 = PIP_QOS_VLAN[QOS1] */ + uint64_t qos_vod : 1; /**< QOS VLAN over Diffserv + if DSA/VLAN exists, it is used + else if IP exists, Diffserv is used + else the per port default is used + Watchers are still highest priority */ + uint64_t qos_diff : 1; /**< QOS Diffserv */ + uint64_t qos_vlan : 1; /**< QOS VLAN */ + uint64_t reserved_13_15 : 3; + uint64_t crc_en : 1; /**< CRC Checking enabled */ + uint64_t higig_en : 1; /**< Enable HiGig parsing + Should not be set for PCIe ports (ports 32-35) + Should not be set for ports in which PTP_MODE=1 + When HIGIG_EN=1: + DSA_EN field below must be zero + SKIP field below is both Skip I size and the + size of the HiGig* header (12 or 16 bytes) */ + uint64_t dsa_en : 1; /**< Enable DSA tag parsing + When DSA_EN=1: + HIGIG_EN field above must be zero + SKIP field below is size of DSA tag (4, 8, or + 12 bytes) rather than the size of Skip I + total SKIP (Skip I + header + Skip II + must be zero + INST_HDR field above must be zero (non-PCIe + ports) + For PCIe ports, NPEI_PKT*_INSTR_HDR[USE_IHDR] + and PCIE_INST_HDR[R] should be clear + MODE field below must be "skip to L2" */ + cvmx_pip_port_parse_mode_t mode : 2; /**< Parse Mode + 0 = no packet inspection (Uninterpreted) + 1 = L2 parsing / skip to L2 + 2 = IP parsing / skip to L3 + 3 = (illegal) + Must be 2 ("skip to L2") when in DSA mode. */ + uint64_t reserved_7_7 : 1; + uint64_t skip : 7; /**< Optional Skip I amount for packets. Does not + apply to packets on PCI ports when a PKT_INST_HDR + is present. See section 7.2.7 - Legal Skip + Values for further details. + In DSA mode, indicates the DSA header length, not + Skip I size. (Must be 4,8,or 12) + In HIGIG mode, indicates both the Skip I size and + the HiGig header size (Must be 12 or 16). + If PTP_MODE, the 8B timestamp is prepended to the + packet. SKIP should be increased by 8 to + compensate for the additional timestamp field. */ +#else + uint64_t skip : 7; + uint64_t reserved_7_7 : 1; + cvmx_pip_port_parse_mode_t mode : 2; + uint64_t dsa_en : 1; + uint64_t higig_en : 1; + uint64_t crc_en : 1; + uint64_t reserved_13_15 : 3; + uint64_t qos_vlan : 1; + uint64_t qos_diff : 1; + uint64_t qos_vod : 1; + uint64_t qos_vsel : 1; + uint64_t qos_wat : 4; + uint64_t qos : 3; + uint64_t hg_qos : 1; + uint64_t grp_wat : 4; + uint64_t inst_hdr : 1; + uint64_t dyn_rs : 1; + uint64_t tag_inc : 2; + uint64_t rawdrp : 1; + uint64_t reserved_37_39 : 3; + uint64_t qos_wat_47 : 4; + uint64_t grp_wat_47 : 4; + uint64_t minerr_en : 1; + uint64_t maxerr_en : 1; + uint64_t lenerr_en : 1; + uint64_t vlan_len : 1; + uint64_t pad_len : 1; + uint64_t reserved_53_63 : 11; +#endif + } s; + struct cvmx_pip_prt_cfgx_cn30xx + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_37_63 : 27; + uint64_t rawdrp : 1; /**< Allow the IPD to RED drop a packet. + Normally, IPD will never drop a packet that PIP + indicates is RAW. + 0=never drop RAW packets based on RED algorithm + 1=allow RAW packet drops based on RED algorithm */ + uint64_t tag_inc : 2; /**< Which of the 4 PIP_TAG_INC to use when + calculating mask tag hash */ + uint64_t dyn_rs : 1; /**< Dynamically calculate RS based on pkt size and + configuration. If DYN_RS is set then + PKT_INST_HDR[RS] is not used. When using 2-byte + instruction header words, either DYN_RS or + PIP_GBL_CTL[IGNRS] should be set. */ + uint64_t inst_hdr : 1; /**< 8-byte INST_HDR is present on all packets + (not for PCI prts, 32-35) */ + uint64_t grp_wat : 4; /**< GRP Watcher enable */ + uint64_t reserved_27_27 : 1; + uint64_t qos : 3; /**< Default QOS level of the port */ + uint64_t qos_wat : 4; /**< QOS Watcher enable */ + uint64_t reserved_18_19 : 2; + uint64_t qos_diff : 1; /**< QOS Diffserv */ + uint64_t qos_vlan : 1; /**< QOS VLAN */ + uint64_t reserved_10_15 : 6; + cvmx_pip_port_parse_mode_t mode : 2; /**< Parse Mode + 0 = no packet inspection (Uninterpreted) + 1 = L2 parsing / skip to L2 + 2 = IP parsing / skip to L3 + 3 = PCI Raw (illegal for software to set) */ + uint64_t reserved_7_7 : 1; + uint64_t skip : 7; /**< Optional Skip I amount for packets. Does not + apply to packets on PCI ports when a PKT_INST_HDR + is present. See section 7.2.7 - Legal Skip + Values for further details. */ +#else + uint64_t skip : 7; + uint64_t reserved_7_7 : 1; + cvmx_pip_port_parse_mode_t mode : 2; + uint64_t reserved_10_15 : 6; + uint64_t qos_vlan : 1; + uint64_t qos_diff : 1; + uint64_t reserved_18_19 : 2; + uint64_t qos_wat : 4; + uint64_t qos : 3; + uint64_t reserved_27_27 : 1; + uint64_t grp_wat : 4; + uint64_t inst_hdr : 1; + uint64_t dyn_rs : 1; + uint64_t tag_inc : 2; + uint64_t rawdrp : 1; + uint64_t reserved_37_63 : 27; +#endif + } cn30xx; + struct cvmx_pip_prt_cfgx_cn30xx cn31xx; + struct cvmx_pip_prt_cfgx_cn38xx + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_37_63 : 27; + uint64_t rawdrp : 1; /**< Allow the IPD to RED drop a packet. + Normally, IPD will never drop a packet that PIP + indicates is RAW. + 0=never drop RAW packets based on RED algorithm + 1=allow RAW packet drops based on RED algorithm */ + uint64_t tag_inc : 2; /**< Which of the 4 PIP_TAG_INC to use when + calculating mask tag hash */ + uint64_t dyn_rs : 1; /**< Dynamically calculate RS based on pkt size and + configuration. If DYN_RS is set then + PKT_INST_HDR[RS] is not used. When using 2-byte + instruction header words, either DYN_RS or + PIP_GBL_CTL[IGNRS] should be set. */ + uint64_t inst_hdr : 1; /**< 8-byte INST_HDR is present on all packets + (not for PCI prts, 32-35) */ + uint64_t grp_wat : 4; /**< GRP Watcher enable */ + uint64_t reserved_27_27 : 1; + uint64_t qos : 3; /**< Default QOS level of the port */ + uint64_t qos_wat : 4; /**< QOS Watcher enable */ + uint64_t reserved_18_19 : 2; + uint64_t qos_diff : 1; /**< QOS Diffserv */ + uint64_t qos_vlan : 1; /**< QOS VLAN */ + uint64_t reserved_13_15 : 3; + uint64_t crc_en : 1; /**< CRC Checking enabled (for ports 0-31 only) */ + uint64_t reserved_10_11 : 2; + cvmx_pip_port_parse_mode_t mode : 2; /**< Parse Mode + 0 = no packet inspection (Uninterpreted) + 1 = L2 parsing / skip to L2 + 2 = IP parsing / skip to L3 + 3 = PCI Raw (illegal for software to set) */ + uint64_t reserved_7_7 : 1; + uint64_t skip : 7; /**< Optional Skip I amount for packets. Does not + apply to packets on PCI ports when a PKT_INST_HDR + is present. See section 7.2.7 - Legal Skip + Values for further details. */ +#else + uint64_t skip : 7; + uint64_t reserved_7_7 : 1; + cvmx_pip_port_parse_mode_t mode : 2; + uint64_t reserved_10_11 : 2; + uint64_t crc_en : 1; + uint64_t reserved_13_15 : 3; + uint64_t qos_vlan : 1; + uint64_t qos_diff : 1; + uint64_t reserved_18_19 : 2; + uint64_t qos_wat : 4; + uint64_t qos : 3; + uint64_t reserved_27_27 : 1; + uint64_t grp_wat : 4; + uint64_t inst_hdr : 1; + uint64_t dyn_rs : 1; + uint64_t tag_inc : 2; + uint64_t rawdrp : 1; + uint64_t reserved_37_63 : 27; +#endif + } cn38xx; + struct cvmx_pip_prt_cfgx_cn38xx cn38xxp2; + struct cvmx_pip_prt_cfgx_cn50xx + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_53_63 : 11; + uint64_t pad_len : 1; /**< When set, disables the length check for pkts with + padding in the client data */ + uint64_t vlan_len : 1; /**< When set, disables the length check for VLAN pkts */ + uint64_t lenerr_en : 1; /**< L2 length error check enable + Frame was received with length error */ + uint64_t maxerr_en : 1; /**< Max frame error check enable + Frame was received with length > max_length */ + uint64_t minerr_en : 1; /**< Min frame error check enable + Frame was received with length < min_length */ + uint64_t grp_wat_47 : 4; /**< GRP Watcher enable + (Watchers 4-7) */ + uint64_t qos_wat_47 : 4; /**< QOS Watcher enable + (Watchers 4-7) */ + uint64_t reserved_37_39 : 3; + uint64_t rawdrp : 1; /**< Allow the IPD to RED drop a packet. + Normally, IPD will never drop a packet that PIP + indicates is RAW. + 0=never drop RAW packets based on RED algorithm + 1=allow RAW packet drops based on RED algorithm */ + uint64_t tag_inc : 2; /**< Which of the 4 PIP_TAG_INC to use when + calculating mask tag hash */ + uint64_t dyn_rs : 1; /**< Dynamically calculate RS based on pkt size and + configuration. If DYN_RS is set then + PKT_INST_HDR[RS] is not used. When using 2-byte + instruction header words, either DYN_RS or + PIP_GBL_CTL[IGNRS] should be set. */ + uint64_t inst_hdr : 1; /**< 8-byte INST_HDR is present on all packets + (not for PCI prts, 32-35) */ + uint64_t grp_wat : 4; /**< GRP Watcher enable */ + uint64_t reserved_27_27 : 1; + uint64_t qos : 3; /**< Default QOS level of the port */ + uint64_t qos_wat : 4; /**< QOS Watcher enable + (Watchers 0-3) */ + uint64_t reserved_19_19 : 1; + uint64_t qos_vod : 1; /**< QOS VLAN over Diffserv + if VLAN exists, it is used + else if IP exists, Diffserv is used + else the per port default is used + Watchers are still highest priority */ + uint64_t qos_diff : 1; /**< QOS Diffserv */ + uint64_t qos_vlan : 1; /**< QOS VLAN */ + uint64_t reserved_13_15 : 3; + uint64_t crc_en : 1; /**< CRC Checking enabled + (Disabled in 5020) */ + uint64_t reserved_10_11 : 2; + cvmx_pip_port_parse_mode_t mode : 2; /**< Parse Mode + 0 = no packet inspection (Uninterpreted) + 1 = L2 parsing / skip to L2 + 2 = IP parsing / skip to L3 + 3 = PCI Raw (illegal for software to set) */ + uint64_t reserved_7_7 : 1; + uint64_t skip : 7; /**< Optional Skip I amount for packets. Does not + apply to packets on PCI ports when a PKT_INST_HDR + is present. See section 7.2.7 - Legal Skip + Values for further details. */ +#else + uint64_t skip : 7; + uint64_t reserved_7_7 : 1; + cvmx_pip_port_parse_mode_t mode : 2; + uint64_t reserved_10_11 : 2; + uint64_t crc_en : 1; + uint64_t reserved_13_15 : 3; + uint64_t qos_vlan : 1; + uint64_t qos_diff : 1; + uint64_t qos_vod : 1; + uint64_t reserved_19_19 : 1; + uint64_t qos_wat : 4; + uint64_t qos : 3; + uint64_t reserved_27_27 : 1; + uint64_t grp_wat : 4; + uint64_t inst_hdr : 1; + uint64_t dyn_rs : 1; + uint64_t tag_inc : 2; + uint64_t rawdrp : 1; + uint64_t reserved_37_39 : 3; + uint64_t qos_wat_47 : 4; + uint64_t grp_wat_47 : 4; + uint64_t minerr_en : 1; + uint64_t maxerr_en : 1; + uint64_t lenerr_en : 1; + uint64_t vlan_len : 1; + uint64_t pad_len : 1; + uint64_t reserved_53_63 : 11; +#endif + } cn50xx; + struct cvmx_pip_prt_cfgx_s cn52xx; + struct cvmx_pip_prt_cfgx_s cn52xxp1; + struct cvmx_pip_prt_cfgx_s cn56xx; + struct cvmx_pip_prt_cfgx_cn50xx cn56xxp1; + struct cvmx_pip_prt_cfgx_cn58xx + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_37_63 : 27; + uint64_t rawdrp : 1; /**< Allow the IPD to RED drop a packet. + Normally, IPD will never drop a packet that PIP + indicates is RAW. + 0=never drop RAW packets based on RED algorithm + 1=allow RAW packet drops based on RED algorithm */ + uint64_t tag_inc : 2; /**< Which of the 4 PIP_TAG_INC to use when + calculating mask tag hash */ + uint64_t dyn_rs : 1; /**< Dynamically calculate RS based on pkt size and + configuration. If DYN_RS is set then + PKT_INST_HDR[RS] is not used. When using 2-byte + instruction header words, either DYN_RS or + PIP_GBL_CTL[IGNRS] should be set. */ + uint64_t inst_hdr : 1; /**< 8-byte INST_HDR is present on all packets + (not for PCI prts, 32-35) */ + uint64_t grp_wat : 4; /**< GRP Watcher enable */ + uint64_t reserved_27_27 : 1; + uint64_t qos : 3; /**< Default QOS level of the port */ + uint64_t qos_wat : 4; /**< QOS Watcher enable */ + uint64_t reserved_19_19 : 1; + uint64_t qos_vod : 1; /**< QOS VLAN over Diffserv + if VLAN exists, it is used + else if IP exists, Diffserv is used + else the per port default is used + Watchers are still highest priority */ + uint64_t qos_diff : 1; /**< QOS Diffserv */ + uint64_t qos_vlan : 1; /**< QOS VLAN */ + uint64_t reserved_13_15 : 3; + uint64_t crc_en : 1; /**< CRC Checking enabled (for ports 0-31 only) */ + uint64_t reserved_10_11 : 2; + cvmx_pip_port_parse_mode_t mode : 2; /**< Parse Mode + 0 = no packet inspection (Uninterpreted) + 1 = L2 parsing / skip to L2 + 2 = IP parsing / skip to L3 + 3 = PCI Raw (illegal for software to set) */ + uint64_t reserved_7_7 : 1; + uint64_t skip : 7; /**< Optional Skip I amount for packets. Does not + apply to packets on PCI ports when a PKT_INST_HDR + is present. See section 7.2.7 - Legal Skip + Values for further details. */ +#else + uint64_t skip : 7; + uint64_t reserved_7_7 : 1; + cvmx_pip_port_parse_mode_t mode : 2; + uint64_t reserved_10_11 : 2; + uint64_t crc_en : 1; + uint64_t reserved_13_15 : 3; + uint64_t qos_vlan : 1; + uint64_t qos_diff : 1; + uint64_t qos_vod : 1; + uint64_t reserved_19_19 : 1; + uint64_t qos_wat : 4; + uint64_t qos : 3; + uint64_t reserved_27_27 : 1; + uint64_t grp_wat : 4; + uint64_t inst_hdr : 1; + uint64_t dyn_rs : 1; + uint64_t tag_inc : 2; + uint64_t rawdrp : 1; + uint64_t reserved_37_63 : 27; +#endif + } cn58xx; + struct cvmx_pip_prt_cfgx_cn58xx cn58xxp1; + struct cvmx_pip_prt_cfgx_s cn63xx; + struct cvmx_pip_prt_cfgx_s cn63xxp1; +}; +typedef union cvmx_pip_prt_cfgx cvmx_pip_prt_cfgx_t; + +/** + * cvmx_pip_prt_tag# + * + * PIP_PRT_TAGX = Per port config information + * + */ +union cvmx_pip_prt_tagx +{ + uint64_t u64; + struct cvmx_pip_prt_tagx_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_40_63 : 24; + uint64_t grptagbase : 4; /**< Offset to use when computing group from tag bits + when GRPTAG is set. */ + uint64_t grptagmask : 4; /**< Which bits of the tag to exclude when computing + group when GRPTAG is set. */ + uint64_t grptag : 1; /**< When set, use the lower bit of the tag to compute + the group in the work queue entry + GRP = WQE[TAG[3:0]] & ~GRPTAGMASK + GRPTAGBASE */ + uint64_t grptag_mskip : 1; /**< When set, GRPTAG will be used regardless if the + packet IS_IP. */ + uint64_t tag_mode : 2; /**< Which tag algorithm to use + 0 = always use tuple tag algorithm + 1 = always use mask tag algorithm + 2 = if packet is IP, use tuple else use mask + 3 = tuple XOR mask */ + uint64_t inc_vs : 2; /**< determines the DSA/VLAN ID (VID) to be included in + tuple tag when VLAN stacking is detected + 0 = do not include VID in tuple tag generation + 1 = include VID (VLAN0) in hash + 2 = include VID (VLAN1) in hash + 3 = include VID ([VLAN0,VLAN1]) in hash */ + uint64_t inc_vlan : 1; /**< when set, the DSA/VLAN ID is included in tuple tag + when VLAN stacking is not detected + 0 = do not include VID in tuple tag generation + 1 = include VID in hash */ + uint64_t inc_prt_flag : 1; /**< sets whether the port is included in tuple tag */ + uint64_t ip6_dprt_flag : 1; /**< sets whether the TCP/UDP dst port is + included in tuple tag for IPv6 packets */ + uint64_t ip4_dprt_flag : 1; /**< sets whether the TCP/UDP dst port is + included in tuple tag for IPv4 */ + uint64_t ip6_sprt_flag : 1; /**< sets whether the TCP/UDP src port is + included in tuple tag for IPv6 packets */ + uint64_t ip4_sprt_flag : 1; /**< sets whether the TCP/UDP src port is + included in tuple tag for IPv4 */ + uint64_t ip6_nxth_flag : 1; /**< sets whether ipv6 includes next header in tuple + tag hash */ + uint64_t ip4_pctl_flag : 1; /**< sets whether ipv4 includes protocol in tuple + tag hash */ + uint64_t ip6_dst_flag : 1; /**< sets whether ipv6 includes dst address in tuple + tag hash */ + uint64_t ip4_dst_flag : 1; /**< sets whether ipv4 includes dst address in tuple + tag hash */ + uint64_t ip6_src_flag : 1; /**< sets whether ipv6 includes src address in tuple + tag hash */ + uint64_t ip4_src_flag : 1; /**< sets whether ipv4 includes src address in tuple + tag hash */ + cvmx_pow_tag_type_t tcp6_tag_type : 2; /**< sets the tag_type of a TCP packet (IPv6) + 0 = ordered tags + 1 = atomic tags + 2 = Null tags */ + cvmx_pow_tag_type_t tcp4_tag_type : 2; /**< sets the tag_type of a TCP packet (IPv4) + 0 = ordered tags + 1 = atomic tags + 2 = Null tags */ + cvmx_pow_tag_type_t ip6_tag_type : 2; /**< sets whether IPv6 packet tag type + 0 = ordered tags + 1 = atomic tags + 2 = Null tags */ + cvmx_pow_tag_type_t ip4_tag_type : 2; /**< sets whether IPv4 packet tag type + 0 = ordered tags + 1 = atomic tags + 2 = Null tags */ + cvmx_pow_tag_type_t non_tag_type : 2; /**< sets whether non-IP packet tag type + 0 = ordered tags + 1 = atomic tags + 2 = Null tags */ + uint64_t grp : 4; /**< 4-bit value indicating the group to schedule to */ +#else + uint64_t grp : 4; + cvmx_pow_tag_type_t non_tag_type : 2; + cvmx_pow_tag_type_t ip4_tag_type : 2; + cvmx_pow_tag_type_t ip6_tag_type : 2; + cvmx_pow_tag_type_t tcp4_tag_type : 2; + cvmx_pow_tag_type_t tcp6_tag_type : 2; + uint64_t ip4_src_flag : 1; + uint64_t ip6_src_flag : 1; + uint64_t ip4_dst_flag : 1; + uint64_t ip6_dst_flag : 1; + uint64_t ip4_pctl_flag : 1; + uint64_t ip6_nxth_flag : 1; + uint64_t ip4_sprt_flag : 1; + uint64_t ip6_sprt_flag : 1; + uint64_t ip4_dprt_flag : 1; + uint64_t ip6_dprt_flag : 1; + uint64_t inc_prt_flag : 1; + uint64_t inc_vlan : 1; + uint64_t inc_vs : 2; + uint64_t tag_mode : 2; + uint64_t grptag_mskip : 1; + uint64_t grptag : 1; + uint64_t grptagmask : 4; + uint64_t grptagbase : 4; + uint64_t reserved_40_63 : 24; +#endif + } s; + struct cvmx_pip_prt_tagx_cn30xx + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_40_63 : 24; + uint64_t grptagbase : 4; /**< Offset to use when computing group from tag bits + when GRPTAG is set. */ + uint64_t grptagmask : 4; /**< Which bits of the tag to exclude when computing + group when GRPTAG is set. */ + uint64_t grptag : 1; /**< When set, use the lower bit of the tag to compute + the group in the work queue entry + GRP = WQE[TAG[3:0]] & ~GRPTAGMASK + GRPTAGBASE */ + uint64_t reserved_30_30 : 1; + uint64_t tag_mode : 2; /**< Which tag algorithm to use + 0 = always use tuple tag algorithm + 1 = always use mask tag algorithm + 2 = if packet is IP, use tuple else use mask + 3 = tuple XOR mask */ + uint64_t inc_vs : 2; /**< determines the VLAN ID (VID) to be included in + tuple tag when VLAN stacking is detected + 0 = do not include VID in tuple tag generation + 1 = include VID (VLAN0) in hash + 2 = include VID (VLAN1) in hash + 3 = include VID ([VLAN0,VLAN1]) in hash */ + uint64_t inc_vlan : 1; /**< when set, the VLAN ID is included in tuple tag + when VLAN stacking is not detected + 0 = do not include VID in tuple tag generation + 1 = include VID in hash */ + uint64_t inc_prt_flag : 1; /**< sets whether the port is included in tuple tag */ + uint64_t ip6_dprt_flag : 1; /**< sets whether the TCP/UDP dst port is + included in tuple tag for IPv6 packets */ + uint64_t ip4_dprt_flag : 1; /**< sets whether the TCP/UDP dst port is + included in tuple tag for IPv4 */ + uint64_t ip6_sprt_flag : 1; /**< sets whether the TCP/UDP src port is + included in tuple tag for IPv6 packets */ + uint64_t ip4_sprt_flag : 1; /**< sets whether the TCP/UDP src port is + included in tuple tag for IPv4 */ + uint64_t ip6_nxth_flag : 1; /**< sets whether ipv6 includes next header in tuple + tag hash */ + uint64_t ip4_pctl_flag : 1; /**< sets whether ipv4 includes protocol in tuple + tag hash */ + uint64_t ip6_dst_flag : 1; /**< sets whether ipv6 includes dst address in tuple + tag hash */ + uint64_t ip4_dst_flag : 1; /**< sets whether ipv4 includes dst address in tuple + tag hash */ + uint64_t ip6_src_flag : 1; /**< sets whether ipv6 includes src address in tuple + tag hash */ + uint64_t ip4_src_flag : 1; /**< sets whether ipv4 includes src address in tuple + tag hash */ + cvmx_pow_tag_type_t tcp6_tag_type : 2; /**< sets the tag_type of a TCP packet (IPv6) + 0 = ordered tags + 1 = atomic tags + 2 = Null tags */ + cvmx_pow_tag_type_t tcp4_tag_type : 2; /**< sets the tag_type of a TCP packet (IPv4) + 0 = ordered tags + 1 = atomic tags + 2 = Null tags */ + cvmx_pow_tag_type_t ip6_tag_type : 2; /**< sets whether IPv6 packet tag type + 0 = ordered tags + 1 = atomic tags + 2 = Null tags */ + cvmx_pow_tag_type_t ip4_tag_type : 2; /**< sets whether IPv4 packet tag type + 0 = ordered tags + 1 = atomic tags + 2 = Null tags */ + cvmx_pow_tag_type_t non_tag_type : 2; /**< sets whether non-IP packet tag type + 0 = ordered tags + 1 = atomic tags + 2 = Null tags */ + uint64_t grp : 4; /**< 4-bit value indicating the group to schedule to */ +#else + uint64_t grp : 4; + cvmx_pow_tag_type_t non_tag_type : 2; + cvmx_pow_tag_type_t ip4_tag_type : 2; + cvmx_pow_tag_type_t ip6_tag_type : 2; + cvmx_pow_tag_type_t tcp4_tag_type : 2; + cvmx_pow_tag_type_t tcp6_tag_type : 2; + uint64_t ip4_src_flag : 1; + uint64_t ip6_src_flag : 1; + uint64_t ip4_dst_flag : 1; + uint64_t ip6_dst_flag : 1; + uint64_t ip4_pctl_flag : 1; + uint64_t ip6_nxth_flag : 1; + uint64_t ip4_sprt_flag : 1; + uint64_t ip6_sprt_flag : 1; + uint64_t ip4_dprt_flag : 1; + uint64_t ip6_dprt_flag : 1; + uint64_t inc_prt_flag : 1; + uint64_t inc_vlan : 1; + uint64_t inc_vs : 2; + uint64_t tag_mode : 2; + uint64_t reserved_30_30 : 1; + uint64_t grptag : 1; + uint64_t grptagmask : 4; + uint64_t grptagbase : 4; + uint64_t reserved_40_63 : 24; +#endif + } cn30xx; + struct cvmx_pip_prt_tagx_cn30xx cn31xx; + struct cvmx_pip_prt_tagx_cn30xx cn38xx; + struct cvmx_pip_prt_tagx_cn30xx cn38xxp2; + struct cvmx_pip_prt_tagx_s cn50xx; + struct cvmx_pip_prt_tagx_s cn52xx; + struct cvmx_pip_prt_tagx_s cn52xxp1; + struct cvmx_pip_prt_tagx_s cn56xx; + struct cvmx_pip_prt_tagx_s cn56xxp1; + struct cvmx_pip_prt_tagx_cn30xx cn58xx; + struct cvmx_pip_prt_tagx_cn30xx cn58xxp1; + struct cvmx_pip_prt_tagx_s cn63xx; + struct cvmx_pip_prt_tagx_s cn63xxp1; +}; +typedef union cvmx_pip_prt_tagx cvmx_pip_prt_tagx_t; + +/** + * cvmx_pip_qos_diff# + * + * PIP_QOS_DIFFX = QOS Diffserv Tables + * + */ +union cvmx_pip_qos_diffx +{ + uint64_t u64; + struct cvmx_pip_qos_diffx_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_3_63 : 61; + uint64_t qos : 3; /**< Diffserv QOS level */ +#else + uint64_t qos : 3; + uint64_t reserved_3_63 : 61; +#endif + } s; + struct cvmx_pip_qos_diffx_s cn30xx; + struct cvmx_pip_qos_diffx_s cn31xx; + struct cvmx_pip_qos_diffx_s cn38xx; + struct cvmx_pip_qos_diffx_s cn38xxp2; + struct cvmx_pip_qos_diffx_s cn50xx; + struct cvmx_pip_qos_diffx_s cn52xx; + struct cvmx_pip_qos_diffx_s cn52xxp1; + struct cvmx_pip_qos_diffx_s cn56xx; + struct cvmx_pip_qos_diffx_s cn56xxp1; + struct cvmx_pip_qos_diffx_s cn58xx; + struct cvmx_pip_qos_diffx_s cn58xxp1; + struct cvmx_pip_qos_diffx_s cn63xx; + struct cvmx_pip_qos_diffx_s cn63xxp1; +}; +typedef union cvmx_pip_qos_diffx cvmx_pip_qos_diffx_t; + +/** + * cvmx_pip_qos_vlan# + * + * PIP_QOS_VLANX = QOS VLAN Tables + * + * If the PIP indentifies a packet is DSA/VLAN tagged, then the QOS + * can be set based on the DSA/VLAN user priority. These eight register + * comprise the QOS values for all DSA/VLAN user priority values. + */ +union cvmx_pip_qos_vlanx +{ + uint64_t u64; + struct cvmx_pip_qos_vlanx_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_7_63 : 57; + uint64_t qos1 : 3; /**< DSA/VLAN QOS level + Selected when PIP_PRT_CFGx[QOS_VSEL] = 1 */ + uint64_t reserved_3_3 : 1; + uint64_t qos : 3; /**< DSA/VLAN QOS level + Selected when PIP_PRT_CFGx[QOS_VSEL] = 0 */ +#else + uint64_t qos : 3; + uint64_t reserved_3_3 : 1; + uint64_t qos1 : 3; + uint64_t reserved_7_63 : 57; +#endif + } s; + struct cvmx_pip_qos_vlanx_cn30xx + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_3_63 : 61; + uint64_t qos : 3; /**< VLAN QOS level */ +#else + uint64_t qos : 3; + uint64_t reserved_3_63 : 61; +#endif + } cn30xx; + struct cvmx_pip_qos_vlanx_cn30xx cn31xx; + struct cvmx_pip_qos_vlanx_cn30xx cn38xx; + struct cvmx_pip_qos_vlanx_cn30xx cn38xxp2; + struct cvmx_pip_qos_vlanx_cn30xx cn50xx; + struct cvmx_pip_qos_vlanx_s cn52xx; + struct cvmx_pip_qos_vlanx_s cn52xxp1; + struct cvmx_pip_qos_vlanx_s cn56xx; + struct cvmx_pip_qos_vlanx_cn30xx cn56xxp1; + struct cvmx_pip_qos_vlanx_cn30xx cn58xx; + struct cvmx_pip_qos_vlanx_cn30xx cn58xxp1; + struct cvmx_pip_qos_vlanx_s cn63xx; + struct cvmx_pip_qos_vlanx_s cn63xxp1; +}; +typedef union cvmx_pip_qos_vlanx cvmx_pip_qos_vlanx_t; + +/** + * cvmx_pip_qos_watch# + * + * PIP_QOS_WATCHX = QOS Watcher Tables + * + * Sets up the Configuration CSRs for the four QOS Watchers. + * Each Watcher can be set to look for a specific protocol, + * TCP/UDP destination port, or Ethertype to override the + * default QOS value. + */ +union cvmx_pip_qos_watchx +{ + uint64_t u64; + struct cvmx_pip_qos_watchx_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_48_63 : 16; + uint64_t mask : 16; /**< Mask off a range of values */ + uint64_t reserved_28_31 : 4; + uint64_t grp : 4; /**< The GRP number of the watcher */ + uint64_t reserved_23_23 : 1; + uint64_t qos : 3; /**< The QOS level of the watcher */ + uint64_t reserved_19_19 : 1; + cvmx_pip_qos_watch_types match_type : 3; /**< The field for the watcher match against + 0 = disable across all ports + 1 = protocol (ipv4) + = next_header (ipv6) + 2 = TCP destination port + 3 = UDP destination port + 4 = Ether type + 5-7 = Reserved */ + uint64_t match_value : 16; /**< The value to watch for */ +#else + uint64_t match_value : 16; + cvmx_pip_qos_watch_types match_type : 3; + uint64_t reserved_19_19 : 1; + uint64_t qos : 3; + uint64_t reserved_23_23 : 1; + uint64_t grp : 4; + uint64_t reserved_28_31 : 4; + uint64_t mask : 16; + uint64_t reserved_48_63 : 16; +#endif + } s; + struct cvmx_pip_qos_watchx_cn30xx + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_48_63 : 16; + uint64_t mask : 16; /**< Mask off a range of values */ + uint64_t reserved_28_31 : 4; + uint64_t grp : 4; /**< The GRP number of the watcher */ + uint64_t reserved_23_23 : 1; + uint64_t qos : 3; /**< The QOS level of the watcher */ + uint64_t reserved_18_19 : 2; + cvmx_pip_qos_watch_types match_type : 2; /**< The field for the watcher match against + 0 = disable across all ports + 1 = protocol (ipv4) + = next_header (ipv6) + 2 = TCP destination port + 3 = UDP destination port */ + uint64_t match_value : 16; /**< The value to watch for */ +#else + uint64_t match_value : 16; + cvmx_pip_qos_watch_types match_type : 2; + uint64_t reserved_18_19 : 2; + uint64_t qos : 3; + uint64_t reserved_23_23 : 1; + uint64_t grp : 4; + uint64_t reserved_28_31 : 4; + uint64_t mask : 16; + uint64_t reserved_48_63 : 16; +#endif + } cn30xx; + struct cvmx_pip_qos_watchx_cn30xx cn31xx; + struct cvmx_pip_qos_watchx_cn30xx cn38xx; + struct cvmx_pip_qos_watchx_cn30xx cn38xxp2; + struct cvmx_pip_qos_watchx_s cn50xx; + struct cvmx_pip_qos_watchx_s cn52xx; + struct cvmx_pip_qos_watchx_s cn52xxp1; + struct cvmx_pip_qos_watchx_s cn56xx; + struct cvmx_pip_qos_watchx_s cn56xxp1; + struct cvmx_pip_qos_watchx_cn30xx cn58xx; + struct cvmx_pip_qos_watchx_cn30xx cn58xxp1; + struct cvmx_pip_qos_watchx_s cn63xx; + struct cvmx_pip_qos_watchx_s cn63xxp1; +}; +typedef union cvmx_pip_qos_watchx cvmx_pip_qos_watchx_t; + +/** + * cvmx_pip_raw_word + * + * PIP_RAW_WORD = The RAW Word2 of the workQ entry. + * + * The RAW Word2 to be inserted into the workQ entry of RAWFULL packets. + */ +union cvmx_pip_raw_word +{ + uint64_t u64; + struct cvmx_pip_raw_word_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_56_63 : 8; + uint64_t word : 56; /**< Word2 of the workQ entry + The 8-bit bufs field is still set by HW (IPD) */ +#else + uint64_t word : 56; + uint64_t reserved_56_63 : 8; +#endif + } s; + struct cvmx_pip_raw_word_s cn30xx; + struct cvmx_pip_raw_word_s cn31xx; + struct cvmx_pip_raw_word_s cn38xx; + struct cvmx_pip_raw_word_s cn38xxp2; + struct cvmx_pip_raw_word_s cn50xx; + struct cvmx_pip_raw_word_s cn52xx; + struct cvmx_pip_raw_word_s cn52xxp1; + struct cvmx_pip_raw_word_s cn56xx; + struct cvmx_pip_raw_word_s cn56xxp1; + struct cvmx_pip_raw_word_s cn58xx; + struct cvmx_pip_raw_word_s cn58xxp1; + struct cvmx_pip_raw_word_s cn63xx; + struct cvmx_pip_raw_word_s cn63xxp1; +}; +typedef union cvmx_pip_raw_word cvmx_pip_raw_word_t; + +/** + * cvmx_pip_sft_rst + * + * PIP_SFT_RST = PIP Soft Reset + * + * When written to a '1', resets the pip block + * + * Notes: + * When RST is set to a '1' by SW, PIP will get a short reset pulse (3 cycles + * in duration). Although this will reset much of PIP's internal state, some + * CSRs will not reset. + * + * . PIP_BIST_STATUS + * . PIP_STAT0_PRT* + * . PIP_STAT1_PRT* + * . PIP_STAT2_PRT* + * . PIP_STAT3_PRT* + * . PIP_STAT4_PRT* + * . PIP_STAT5_PRT* + * . PIP_STAT6_PRT* + * . PIP_STAT7_PRT* + * . PIP_STAT8_PRT* + * . PIP_STAT9_PRT* + * . PIP_XSTAT0_PRT* + * . PIP_XSTAT1_PRT* + * . PIP_XSTAT2_PRT* + * . PIP_XSTAT3_PRT* + * . PIP_XSTAT4_PRT* + * . PIP_XSTAT5_PRT* + * . PIP_XSTAT6_PRT* + * . PIP_XSTAT7_PRT* + * . PIP_XSTAT8_PRT* + * . PIP_XSTAT9_PRT* + * . PIP_STAT_INB_PKTS* + * . PIP_STAT_INB_OCTS* + * . PIP_STAT_INB_ERRS* + * . PIP_TAG_INC* + */ +union cvmx_pip_sft_rst +{ + uint64_t u64; + struct cvmx_pip_sft_rst_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_1_63 : 63; + uint64_t rst : 1; /**< Soft Reset */ +#else + uint64_t rst : 1; + uint64_t reserved_1_63 : 63; +#endif + } s; + struct cvmx_pip_sft_rst_s cn30xx; + struct cvmx_pip_sft_rst_s cn31xx; + struct cvmx_pip_sft_rst_s cn38xx; + struct cvmx_pip_sft_rst_s cn50xx; + struct cvmx_pip_sft_rst_s cn52xx; + struct cvmx_pip_sft_rst_s cn52xxp1; + struct cvmx_pip_sft_rst_s cn56xx; + struct cvmx_pip_sft_rst_s cn56xxp1; + struct cvmx_pip_sft_rst_s cn58xx; + struct cvmx_pip_sft_rst_s cn58xxp1; + struct cvmx_pip_sft_rst_s cn63xx; + struct cvmx_pip_sft_rst_s cn63xxp1; +}; +typedef union cvmx_pip_sft_rst cvmx_pip_sft_rst_t; + +/** + * cvmx_pip_stat0_prt# + * + * PIP Statistics Counters + * + * Note: special stat counter behavior + * + * 1) Read and write operations must arbitrate for the statistics resources + * along with the packet engines which are incrementing the counters. + * In order to not drop packet information, the packet HW is always a + * higher priority and the CSR requests will only be satisified when + * there are idle cycles. This can potentially cause long delays if the + * system becomes full. + * + * 2) stat counters can be cleared in two ways. If PIP_STAT_CTL[RDCLR] is + * set, then all read accesses will clear the register. In addition, + * any write to a stats register will also reset the register to zero. + * Please note that the clearing operations must obey rule \#1 above. + * + * 3) all counters are wrapping - software must ensure they are read periodically + * + * 4) The counters accumulate statistics for packets that are sent to PKI. If + * PTP_MODE is enabled, the 8B timestamp is prepended to the packet. This + * additional 8B of data is captured in the octet counts. + * PIP_STAT0_PRT = PIP_STAT_DRP_PKTS / PIP_STAT_DRP_OCTS + */ +union cvmx_pip_stat0_prtx +{ + uint64_t u64; + struct cvmx_pip_stat0_prtx_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t drp_pkts : 32; /**< Inbound packets marked to be dropped by the IPD + QOS widget per port */ + uint64_t drp_octs : 32; /**< Inbound octets marked to be dropped by the IPD + QOS widget per port */ +#else + uint64_t drp_octs : 32; + uint64_t drp_pkts : 32; +#endif + } s; + struct cvmx_pip_stat0_prtx_s cn30xx; + struct cvmx_pip_stat0_prtx_s cn31xx; + struct cvmx_pip_stat0_prtx_s cn38xx; + struct cvmx_pip_stat0_prtx_s cn38xxp2; + struct cvmx_pip_stat0_prtx_s cn50xx; + struct cvmx_pip_stat0_prtx_s cn52xx; + struct cvmx_pip_stat0_prtx_s cn52xxp1; + struct cvmx_pip_stat0_prtx_s cn56xx; + struct cvmx_pip_stat0_prtx_s cn56xxp1; + struct cvmx_pip_stat0_prtx_s cn58xx; + struct cvmx_pip_stat0_prtx_s cn58xxp1; + struct cvmx_pip_stat0_prtx_s cn63xx; + struct cvmx_pip_stat0_prtx_s cn63xxp1; +}; +typedef union cvmx_pip_stat0_prtx cvmx_pip_stat0_prtx_t; + +/** + * cvmx_pip_stat1_prt# + * + * PIP_STAT1_PRTX = PIP_STAT_OCTS + * + */ +union cvmx_pip_stat1_prtx +{ + uint64_t u64; + struct cvmx_pip_stat1_prtx_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_48_63 : 16; + uint64_t octs : 48; /**< Number of octets received by PIP (good and bad) */ +#else + uint64_t octs : 48; + uint64_t reserved_48_63 : 16; +#endif + } s; + struct cvmx_pip_stat1_prtx_s cn30xx; + struct cvmx_pip_stat1_prtx_s cn31xx; + struct cvmx_pip_stat1_prtx_s cn38xx; + struct cvmx_pip_stat1_prtx_s cn38xxp2; + struct cvmx_pip_stat1_prtx_s cn50xx; + struct cvmx_pip_stat1_prtx_s cn52xx; + struct cvmx_pip_stat1_prtx_s cn52xxp1; + struct cvmx_pip_stat1_prtx_s cn56xx; + struct cvmx_pip_stat1_prtx_s cn56xxp1; + struct cvmx_pip_stat1_prtx_s cn58xx; + struct cvmx_pip_stat1_prtx_s cn58xxp1; + struct cvmx_pip_stat1_prtx_s cn63xx; + struct cvmx_pip_stat1_prtx_s cn63xxp1; +}; +typedef union cvmx_pip_stat1_prtx cvmx_pip_stat1_prtx_t; + +/** + * cvmx_pip_stat2_prt# + * + * PIP_STAT2_PRTX = PIP_STAT_PKTS / PIP_STAT_RAW + * + */ +union cvmx_pip_stat2_prtx +{ + uint64_t u64; + struct cvmx_pip_stat2_prtx_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t pkts : 32; /**< Number of packets processed by PIP */ + uint64_t raw : 32; /**< RAWFULL + RAWSCH Packets without an L1/L2 error + received by PIP per port */ +#else + uint64_t raw : 32; + uint64_t pkts : 32; +#endif + } s; + struct cvmx_pip_stat2_prtx_s cn30xx; + struct cvmx_pip_stat2_prtx_s cn31xx; + struct cvmx_pip_stat2_prtx_s cn38xx; + struct cvmx_pip_stat2_prtx_s cn38xxp2; + struct cvmx_pip_stat2_prtx_s cn50xx; + struct cvmx_pip_stat2_prtx_s cn52xx; + struct cvmx_pip_stat2_prtx_s cn52xxp1; + struct cvmx_pip_stat2_prtx_s cn56xx; + struct cvmx_pip_stat2_prtx_s cn56xxp1; + struct cvmx_pip_stat2_prtx_s cn58xx; + struct cvmx_pip_stat2_prtx_s cn58xxp1; + struct cvmx_pip_stat2_prtx_s cn63xx; + struct cvmx_pip_stat2_prtx_s cn63xxp1; +}; +typedef union cvmx_pip_stat2_prtx cvmx_pip_stat2_prtx_t; + +/** + * cvmx_pip_stat3_prt# + * + * PIP_STAT3_PRTX = PIP_STAT_BCST / PIP_STAT_MCST + * + */ +union cvmx_pip_stat3_prtx +{ + uint64_t u64; + struct cvmx_pip_stat3_prtx_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t bcst : 32; /**< Number of indentified L2 broadcast packets + Does not include multicast packets + Only includes packets whose parse mode is + SKIP_TO_L2. */ + uint64_t mcst : 32; /**< Number of indentified L2 multicast packets + Does not include broadcast packets + Only includes packets whose parse mode is + SKIP_TO_L2. */ +#else + uint64_t mcst : 32; + uint64_t bcst : 32; +#endif + } s; + struct cvmx_pip_stat3_prtx_s cn30xx; + struct cvmx_pip_stat3_prtx_s cn31xx; + struct cvmx_pip_stat3_prtx_s cn38xx; + struct cvmx_pip_stat3_prtx_s cn38xxp2; + struct cvmx_pip_stat3_prtx_s cn50xx; + struct cvmx_pip_stat3_prtx_s cn52xx; + struct cvmx_pip_stat3_prtx_s cn52xxp1; + struct cvmx_pip_stat3_prtx_s cn56xx; + struct cvmx_pip_stat3_prtx_s cn56xxp1; + struct cvmx_pip_stat3_prtx_s cn58xx; + struct cvmx_pip_stat3_prtx_s cn58xxp1; + struct cvmx_pip_stat3_prtx_s cn63xx; + struct cvmx_pip_stat3_prtx_s cn63xxp1; +}; +typedef union cvmx_pip_stat3_prtx cvmx_pip_stat3_prtx_t; + +/** + * cvmx_pip_stat4_prt# + * + * PIP_STAT4_PRTX = PIP_STAT_HIST1 / PIP_STAT_HIST0 + * + */ +union cvmx_pip_stat4_prtx +{ + uint64_t u64; + struct cvmx_pip_stat4_prtx_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t h65to127 : 32; /**< Number of 65-127B packets */ + uint64_t h64 : 32; /**< Number of 1-64B packets */ +#else + uint64_t h64 : 32; + uint64_t h65to127 : 32; +#endif + } s; + struct cvmx_pip_stat4_prtx_s cn30xx; + struct cvmx_pip_stat4_prtx_s cn31xx; + struct cvmx_pip_stat4_prtx_s cn38xx; + struct cvmx_pip_stat4_prtx_s cn38xxp2; + struct cvmx_pip_stat4_prtx_s cn50xx; + struct cvmx_pip_stat4_prtx_s cn52xx; + struct cvmx_pip_stat4_prtx_s cn52xxp1; + struct cvmx_pip_stat4_prtx_s cn56xx; + struct cvmx_pip_stat4_prtx_s cn56xxp1; + struct cvmx_pip_stat4_prtx_s cn58xx; + struct cvmx_pip_stat4_prtx_s cn58xxp1; + struct cvmx_pip_stat4_prtx_s cn63xx; + struct cvmx_pip_stat4_prtx_s cn63xxp1; +}; +typedef union cvmx_pip_stat4_prtx cvmx_pip_stat4_prtx_t; + +/** + * cvmx_pip_stat5_prt# + * + * PIP_STAT5_PRTX = PIP_STAT_HIST3 / PIP_STAT_HIST2 + * + */ +union cvmx_pip_stat5_prtx +{ + uint64_t u64; + struct cvmx_pip_stat5_prtx_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t h256to511 : 32; /**< Number of 256-511B packets */ + uint64_t h128to255 : 32; /**< Number of 128-255B packets */ +#else + uint64_t h128to255 : 32; + uint64_t h256to511 : 32; +#endif + } s; + struct cvmx_pip_stat5_prtx_s cn30xx; + struct cvmx_pip_stat5_prtx_s cn31xx; + struct cvmx_pip_stat5_prtx_s cn38xx; + struct cvmx_pip_stat5_prtx_s cn38xxp2; + struct cvmx_pip_stat5_prtx_s cn50xx; + struct cvmx_pip_stat5_prtx_s cn52xx; + struct cvmx_pip_stat5_prtx_s cn52xxp1; + struct cvmx_pip_stat5_prtx_s cn56xx; + struct cvmx_pip_stat5_prtx_s cn56xxp1; + struct cvmx_pip_stat5_prtx_s cn58xx; + struct cvmx_pip_stat5_prtx_s cn58xxp1; + struct cvmx_pip_stat5_prtx_s cn63xx; + struct cvmx_pip_stat5_prtx_s cn63xxp1; +}; +typedef union cvmx_pip_stat5_prtx cvmx_pip_stat5_prtx_t; + +/** + * cvmx_pip_stat6_prt# + * + * PIP_STAT6_PRTX = PIP_STAT_HIST5 / PIP_STAT_HIST4 + * + */ +union cvmx_pip_stat6_prtx +{ + uint64_t u64; + struct cvmx_pip_stat6_prtx_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t h1024to1518 : 32; /**< Number of 1024-1518B packets */ + uint64_t h512to1023 : 32; /**< Number of 512-1023B packets */ +#else + uint64_t h512to1023 : 32; + uint64_t h1024to1518 : 32; +#endif + } s; + struct cvmx_pip_stat6_prtx_s cn30xx; + struct cvmx_pip_stat6_prtx_s cn31xx; + struct cvmx_pip_stat6_prtx_s cn38xx; + struct cvmx_pip_stat6_prtx_s cn38xxp2; + struct cvmx_pip_stat6_prtx_s cn50xx; + struct cvmx_pip_stat6_prtx_s cn52xx; + struct cvmx_pip_stat6_prtx_s cn52xxp1; + struct cvmx_pip_stat6_prtx_s cn56xx; + struct cvmx_pip_stat6_prtx_s cn56xxp1; + struct cvmx_pip_stat6_prtx_s cn58xx; + struct cvmx_pip_stat6_prtx_s cn58xxp1; + struct cvmx_pip_stat6_prtx_s cn63xx; + struct cvmx_pip_stat6_prtx_s cn63xxp1; +}; +typedef union cvmx_pip_stat6_prtx cvmx_pip_stat6_prtx_t; + +/** + * cvmx_pip_stat7_prt# + * + * PIP_STAT7_PRTX = PIP_STAT_FCS / PIP_STAT_HIST6 + * + * + * Notes: + * Note: FCS is not checked on the PCI ports 32..35. + * + */ +union cvmx_pip_stat7_prtx +{ + uint64_t u64; + struct cvmx_pip_stat7_prtx_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t fcs : 32; /**< Number of packets with FCS or Align opcode errors */ + uint64_t h1519 : 32; /**< Number of 1519-max packets */ +#else + uint64_t h1519 : 32; + uint64_t fcs : 32; +#endif + } s; + struct cvmx_pip_stat7_prtx_s cn30xx; + struct cvmx_pip_stat7_prtx_s cn31xx; + struct cvmx_pip_stat7_prtx_s cn38xx; + struct cvmx_pip_stat7_prtx_s cn38xxp2; + struct cvmx_pip_stat7_prtx_s cn50xx; + struct cvmx_pip_stat7_prtx_s cn52xx; + struct cvmx_pip_stat7_prtx_s cn52xxp1; + struct cvmx_pip_stat7_prtx_s cn56xx; + struct cvmx_pip_stat7_prtx_s cn56xxp1; + struct cvmx_pip_stat7_prtx_s cn58xx; + struct cvmx_pip_stat7_prtx_s cn58xxp1; + struct cvmx_pip_stat7_prtx_s cn63xx; + struct cvmx_pip_stat7_prtx_s cn63xxp1; +}; +typedef union cvmx_pip_stat7_prtx cvmx_pip_stat7_prtx_t; + +/** + * cvmx_pip_stat8_prt# + * + * PIP_STAT8_PRTX = PIP_STAT_FRAG / PIP_STAT_UNDER + * + * + * Notes: + * Note: FCS is not checked on the PCI ports 32..35. + * + */ +union cvmx_pip_stat8_prtx +{ + uint64_t u64; + struct cvmx_pip_stat8_prtx_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t frag : 32; /**< Number of packets with length < min and FCS error */ + uint64_t undersz : 32; /**< Number of packets with length < min */ +#else + uint64_t undersz : 32; + uint64_t frag : 32; +#endif + } s; + struct cvmx_pip_stat8_prtx_s cn30xx; + struct cvmx_pip_stat8_prtx_s cn31xx; + struct cvmx_pip_stat8_prtx_s cn38xx; + struct cvmx_pip_stat8_prtx_s cn38xxp2; + struct cvmx_pip_stat8_prtx_s cn50xx; + struct cvmx_pip_stat8_prtx_s cn52xx; + struct cvmx_pip_stat8_prtx_s cn52xxp1; + struct cvmx_pip_stat8_prtx_s cn56xx; + struct cvmx_pip_stat8_prtx_s cn56xxp1; + struct cvmx_pip_stat8_prtx_s cn58xx; + struct cvmx_pip_stat8_prtx_s cn58xxp1; + struct cvmx_pip_stat8_prtx_s cn63xx; + struct cvmx_pip_stat8_prtx_s cn63xxp1; +}; +typedef union cvmx_pip_stat8_prtx cvmx_pip_stat8_prtx_t; + +/** + * cvmx_pip_stat9_prt# + * + * PIP_STAT9_PRTX = PIP_STAT_JABBER / PIP_STAT_OVER + * + * + * Notes: + * Note: FCS is not checked on the PCI ports 32..35. + * + */ +union cvmx_pip_stat9_prtx +{ + uint64_t u64; + struct cvmx_pip_stat9_prtx_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t jabber : 32; /**< Number of packets with length > max and FCS error */ + uint64_t oversz : 32; /**< Number of packets with length > max */ +#else + uint64_t oversz : 32; + uint64_t jabber : 32; +#endif + } s; + struct cvmx_pip_stat9_prtx_s cn30xx; + struct cvmx_pip_stat9_prtx_s cn31xx; + struct cvmx_pip_stat9_prtx_s cn38xx; + struct cvmx_pip_stat9_prtx_s cn38xxp2; + struct cvmx_pip_stat9_prtx_s cn50xx; + struct cvmx_pip_stat9_prtx_s cn52xx; + struct cvmx_pip_stat9_prtx_s cn52xxp1; + struct cvmx_pip_stat9_prtx_s cn56xx; + struct cvmx_pip_stat9_prtx_s cn56xxp1; + struct cvmx_pip_stat9_prtx_s cn58xx; + struct cvmx_pip_stat9_prtx_s cn58xxp1; + struct cvmx_pip_stat9_prtx_s cn63xx; + struct cvmx_pip_stat9_prtx_s cn63xxp1; +}; +typedef union cvmx_pip_stat9_prtx cvmx_pip_stat9_prtx_t; + +/** + * cvmx_pip_stat_ctl + * + * PIP_STAT_CTL = PIP's Stat Control Register + * + * Controls how the PIP statistics counters are handled. + */ +union cvmx_pip_stat_ctl +{ + uint64_t u64; + struct cvmx_pip_stat_ctl_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_1_63 : 63; + uint64_t rdclr : 1; /**< Stat registers are read and clear + 0 = stat registers hold value when read + 1 = stat registers are cleared when read */ +#else + uint64_t rdclr : 1; + uint64_t reserved_1_63 : 63; +#endif + } s; + struct cvmx_pip_stat_ctl_s cn30xx; + struct cvmx_pip_stat_ctl_s cn31xx; + struct cvmx_pip_stat_ctl_s cn38xx; + struct cvmx_pip_stat_ctl_s cn38xxp2; + struct cvmx_pip_stat_ctl_s cn50xx; + struct cvmx_pip_stat_ctl_s cn52xx; + struct cvmx_pip_stat_ctl_s cn52xxp1; + struct cvmx_pip_stat_ctl_s cn56xx; + struct cvmx_pip_stat_ctl_s cn56xxp1; + struct cvmx_pip_stat_ctl_s cn58xx; + struct cvmx_pip_stat_ctl_s cn58xxp1; + struct cvmx_pip_stat_ctl_s cn63xx; + struct cvmx_pip_stat_ctl_s cn63xxp1; +}; +typedef union cvmx_pip_stat_ctl cvmx_pip_stat_ctl_t; + +/** + * cvmx_pip_stat_inb_errs# + * + * PIP_STAT_INB_ERRSX = Inbound error packets received by PIP per port + * + * Inbound stats collect all data sent to PIP from all packet interfaces. + * Its the raw counts of everything that comes into the block. The counts + * will reflect all error packets and packets dropped by the PKI RED engine. + * These counts are intended for system debug, but could convey useful + * information in production systems. + */ +union cvmx_pip_stat_inb_errsx +{ + uint64_t u64; + struct cvmx_pip_stat_inb_errsx_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_16_63 : 48; + uint64_t errs : 16; /**< Number of packets with errors + received by PIP */ +#else + uint64_t errs : 16; + uint64_t reserved_16_63 : 48; +#endif + } s; + struct cvmx_pip_stat_inb_errsx_s cn30xx; + struct cvmx_pip_stat_inb_errsx_s cn31xx; + struct cvmx_pip_stat_inb_errsx_s cn38xx; + struct cvmx_pip_stat_inb_errsx_s cn38xxp2; + struct cvmx_pip_stat_inb_errsx_s cn50xx; + struct cvmx_pip_stat_inb_errsx_s cn52xx; + struct cvmx_pip_stat_inb_errsx_s cn52xxp1; + struct cvmx_pip_stat_inb_errsx_s cn56xx; + struct cvmx_pip_stat_inb_errsx_s cn56xxp1; + struct cvmx_pip_stat_inb_errsx_s cn58xx; + struct cvmx_pip_stat_inb_errsx_s cn58xxp1; + struct cvmx_pip_stat_inb_errsx_s cn63xx; + struct cvmx_pip_stat_inb_errsx_s cn63xxp1; +}; +typedef union cvmx_pip_stat_inb_errsx cvmx_pip_stat_inb_errsx_t; + +/** + * cvmx_pip_stat_inb_octs# + * + * PIP_STAT_INB_OCTSX = Inbound octets received by PIP per port + * + * Inbound stats collect all data sent to PIP from all packet interfaces. + * Its the raw counts of everything that comes into the block. The counts + * will reflect all error packets and packets dropped by the PKI RED engine. + * These counts are intended for system debug, but could convey useful + * information in production systems. The OCTS will include the bytes from + * timestamp fields in PTP_MODE. + */ +union cvmx_pip_stat_inb_octsx +{ + uint64_t u64; + struct cvmx_pip_stat_inb_octsx_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_48_63 : 16; + uint64_t octs : 48; /**< Total number of octets from all packets received + by PIP */ +#else + uint64_t octs : 48; + uint64_t reserved_48_63 : 16; +#endif + } s; + struct cvmx_pip_stat_inb_octsx_s cn30xx; + struct cvmx_pip_stat_inb_octsx_s cn31xx; + struct cvmx_pip_stat_inb_octsx_s cn38xx; + struct cvmx_pip_stat_inb_octsx_s cn38xxp2; + struct cvmx_pip_stat_inb_octsx_s cn50xx; + struct cvmx_pip_stat_inb_octsx_s cn52xx; + struct cvmx_pip_stat_inb_octsx_s cn52xxp1; + struct cvmx_pip_stat_inb_octsx_s cn56xx; + struct cvmx_pip_stat_inb_octsx_s cn56xxp1; + struct cvmx_pip_stat_inb_octsx_s cn58xx; + struct cvmx_pip_stat_inb_octsx_s cn58xxp1; + struct cvmx_pip_stat_inb_octsx_s cn63xx; + struct cvmx_pip_stat_inb_octsx_s cn63xxp1; +}; +typedef union cvmx_pip_stat_inb_octsx cvmx_pip_stat_inb_octsx_t; + +/** + * cvmx_pip_stat_inb_pkts# + * + * PIP_STAT_INB_PKTSX = Inbound packets received by PIP per port + * + * Inbound stats collect all data sent to PIP from all packet interfaces. + * Its the raw counts of everything that comes into the block. The counts + * will reflect all error packets and packets dropped by the PKI RED engine. + * These counts are intended for system debug, but could convey useful + * information in production systems. + */ +union cvmx_pip_stat_inb_pktsx +{ + uint64_t u64; + struct cvmx_pip_stat_inb_pktsx_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_32_63 : 32; + uint64_t pkts : 32; /**< Number of packets without errors + received by PIP */ +#else + uint64_t pkts : 32; + uint64_t reserved_32_63 : 32; +#endif + } s; + struct cvmx_pip_stat_inb_pktsx_s cn30xx; + struct cvmx_pip_stat_inb_pktsx_s cn31xx; + struct cvmx_pip_stat_inb_pktsx_s cn38xx; + struct cvmx_pip_stat_inb_pktsx_s cn38xxp2; + struct cvmx_pip_stat_inb_pktsx_s cn50xx; + struct cvmx_pip_stat_inb_pktsx_s cn52xx; + struct cvmx_pip_stat_inb_pktsx_s cn52xxp1; + struct cvmx_pip_stat_inb_pktsx_s cn56xx; + struct cvmx_pip_stat_inb_pktsx_s cn56xxp1; + struct cvmx_pip_stat_inb_pktsx_s cn58xx; + struct cvmx_pip_stat_inb_pktsx_s cn58xxp1; + struct cvmx_pip_stat_inb_pktsx_s cn63xx; + struct cvmx_pip_stat_inb_pktsx_s cn63xxp1; +}; +typedef union cvmx_pip_stat_inb_pktsx cvmx_pip_stat_inb_pktsx_t; + +/** + * cvmx_pip_tag_inc# + * + * PIP_TAG_INC = Which bytes to include in the new tag hash algorithm + * + * # $PIP_TAG_INCX = 0x300+X X=(0..63) RegType=(RSL) RtlReg=(pip_tag_inc_csr_direct_TestbuilderTask) + */ +union cvmx_pip_tag_incx +{ + uint64_t u64; + struct cvmx_pip_tag_incx_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_8_63 : 56; + uint64_t en : 8; /**< Which bytes to include in mask tag algorithm + Broken into 4, 16-entry masks to cover 128B + PIP_PRT_CFG[TAG_INC] selects 1 of 4 to use + registers 0-15 map to PIP_PRT_CFG[TAG_INC] == 0 + registers 16-31 map to PIP_PRT_CFG[TAG_INC] == 1 + registers 32-47 map to PIP_PRT_CFG[TAG_INC] == 2 + registers 48-63 map to PIP_PRT_CFG[TAG_INC] == 3 + [7] coresponds to the MSB of the 8B word + [0] coresponds to the LSB of the 8B word + If PTP_MODE, the 8B timestamp is prepended to the + packet. The EN byte masks should be adjusted to + compensate for the additional timestamp field. */ +#else + uint64_t en : 8; + uint64_t reserved_8_63 : 56; +#endif + } s; + struct cvmx_pip_tag_incx_s cn30xx; + struct cvmx_pip_tag_incx_s cn31xx; + struct cvmx_pip_tag_incx_s cn38xx; + struct cvmx_pip_tag_incx_s cn38xxp2; + struct cvmx_pip_tag_incx_s cn50xx; + struct cvmx_pip_tag_incx_s cn52xx; + struct cvmx_pip_tag_incx_s cn52xxp1; + struct cvmx_pip_tag_incx_s cn56xx; + struct cvmx_pip_tag_incx_s cn56xxp1; + struct cvmx_pip_tag_incx_s cn58xx; + struct cvmx_pip_tag_incx_s cn58xxp1; + struct cvmx_pip_tag_incx_s cn63xx; + struct cvmx_pip_tag_incx_s cn63xxp1; +}; +typedef union cvmx_pip_tag_incx cvmx_pip_tag_incx_t; + +/** + * cvmx_pip_tag_mask + * + * PIP_TAG_MASK = Mask bit in the tag generation + * + */ +union cvmx_pip_tag_mask +{ + uint64_t u64; + struct cvmx_pip_tag_mask_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_16_63 : 48; + uint64_t mask : 16; /**< When set, MASK clears individual bits of lower 16 + bits of the computed tag. Does not effect RAW + or INSTR HDR packets. */ +#else + uint64_t mask : 16; + uint64_t reserved_16_63 : 48; +#endif + } s; + struct cvmx_pip_tag_mask_s cn30xx; + struct cvmx_pip_tag_mask_s cn31xx; + struct cvmx_pip_tag_mask_s cn38xx; + struct cvmx_pip_tag_mask_s cn38xxp2; + struct cvmx_pip_tag_mask_s cn50xx; + struct cvmx_pip_tag_mask_s cn52xx; + struct cvmx_pip_tag_mask_s cn52xxp1; + struct cvmx_pip_tag_mask_s cn56xx; + struct cvmx_pip_tag_mask_s cn56xxp1; + struct cvmx_pip_tag_mask_s cn58xx; + struct cvmx_pip_tag_mask_s cn58xxp1; + struct cvmx_pip_tag_mask_s cn63xx; + struct cvmx_pip_tag_mask_s cn63xxp1; +}; +typedef union cvmx_pip_tag_mask cvmx_pip_tag_mask_t; + +/** + * cvmx_pip_tag_secret + * + * PIP_TAG_SECRET = Initial value in tag generation + * + * The source and destination IV's provide a mechanism for each Octeon to be unique. + */ +union cvmx_pip_tag_secret +{ + uint64_t u64; + struct cvmx_pip_tag_secret_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_32_63 : 32; + uint64_t dst : 16; /**< Secret for the destination tuple tag CRC calc */ + uint64_t src : 16; /**< Secret for the source tuple tag CRC calc */ +#else + uint64_t src : 16; + uint64_t dst : 16; + uint64_t reserved_32_63 : 32; +#endif + } s; + struct cvmx_pip_tag_secret_s cn30xx; + struct cvmx_pip_tag_secret_s cn31xx; + struct cvmx_pip_tag_secret_s cn38xx; + struct cvmx_pip_tag_secret_s cn38xxp2; + struct cvmx_pip_tag_secret_s cn50xx; + struct cvmx_pip_tag_secret_s cn52xx; + struct cvmx_pip_tag_secret_s cn52xxp1; + struct cvmx_pip_tag_secret_s cn56xx; + struct cvmx_pip_tag_secret_s cn56xxp1; + struct cvmx_pip_tag_secret_s cn58xx; + struct cvmx_pip_tag_secret_s cn58xxp1; + struct cvmx_pip_tag_secret_s cn63xx; + struct cvmx_pip_tag_secret_s cn63xxp1; +}; +typedef union cvmx_pip_tag_secret cvmx_pip_tag_secret_t; + +/** + * cvmx_pip_todo_entry + * + * PIP_TODO_ENTRY = Head entry of the Todo list (debug only) + * + * Summary of the current packet that has completed and waiting to be processed + */ +union cvmx_pip_todo_entry +{ + uint64_t u64; + struct cvmx_pip_todo_entry_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t val : 1; /**< Entry is valid */ + uint64_t reserved_62_62 : 1; + uint64_t entry : 62; /**< Todo list entry summary */ +#else + uint64_t entry : 62; + uint64_t reserved_62_62 : 1; + uint64_t val : 1; +#endif + } s; + struct cvmx_pip_todo_entry_s cn30xx; + struct cvmx_pip_todo_entry_s cn31xx; + struct cvmx_pip_todo_entry_s cn38xx; + struct cvmx_pip_todo_entry_s cn38xxp2; + struct cvmx_pip_todo_entry_s cn50xx; + struct cvmx_pip_todo_entry_s cn52xx; + struct cvmx_pip_todo_entry_s cn52xxp1; + struct cvmx_pip_todo_entry_s cn56xx; + struct cvmx_pip_todo_entry_s cn56xxp1; + struct cvmx_pip_todo_entry_s cn58xx; + struct cvmx_pip_todo_entry_s cn58xxp1; + struct cvmx_pip_todo_entry_s cn63xx; + struct cvmx_pip_todo_entry_s cn63xxp1; +}; +typedef union cvmx_pip_todo_entry cvmx_pip_todo_entry_t; + +/** + * cvmx_pip_xstat0_prt# + * + * PIP_XSTAT0_PRT = PIP_XSTAT_DRP_PKTS / PIP_XSTAT_DRP_OCTS + * + */ +union cvmx_pip_xstat0_prtx +{ + uint64_t u64; + struct cvmx_pip_xstat0_prtx_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t drp_pkts : 32; /**< Inbound packets marked to be dropped by the IPD + QOS widget per port */ + uint64_t drp_octs : 32; /**< Inbound octets marked to be dropped by the IPD + QOS widget per port */ +#else + uint64_t drp_octs : 32; + uint64_t drp_pkts : 32; +#endif + } s; + struct cvmx_pip_xstat0_prtx_s cn63xx; + struct cvmx_pip_xstat0_prtx_s cn63xxp1; +}; +typedef union cvmx_pip_xstat0_prtx cvmx_pip_xstat0_prtx_t; + +/** + * cvmx_pip_xstat1_prt# + * + * PIP_XSTAT1_PRTX = PIP_XSTAT_OCTS + * + */ +union cvmx_pip_xstat1_prtx +{ + uint64_t u64; + struct cvmx_pip_xstat1_prtx_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_48_63 : 16; + uint64_t octs : 48; /**< Number of octets received by PIP (good and bad) */ +#else + uint64_t octs : 48; + uint64_t reserved_48_63 : 16; +#endif + } s; + struct cvmx_pip_xstat1_prtx_s cn63xx; + struct cvmx_pip_xstat1_prtx_s cn63xxp1; +}; +typedef union cvmx_pip_xstat1_prtx cvmx_pip_xstat1_prtx_t; + +/** + * cvmx_pip_xstat2_prt# + * + * PIP_XSTAT2_PRTX = PIP_XSTAT_PKTS / PIP_XSTAT_RAW + * + */ +union cvmx_pip_xstat2_prtx +{ + uint64_t u64; + struct cvmx_pip_xstat2_prtx_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t pkts : 32; /**< Number of packets processed by PIP */ + uint64_t raw : 32; /**< RAWFULL + RAWSCH Packets without an L1/L2 error + received by PIP per port */ +#else + uint64_t raw : 32; + uint64_t pkts : 32; +#endif + } s; + struct cvmx_pip_xstat2_prtx_s cn63xx; + struct cvmx_pip_xstat2_prtx_s cn63xxp1; +}; +typedef union cvmx_pip_xstat2_prtx cvmx_pip_xstat2_prtx_t; + +/** + * cvmx_pip_xstat3_prt# + * + * PIP_XSTAT3_PRTX = PIP_XSTAT_BCST / PIP_XSTAT_MCST + * + */ +union cvmx_pip_xstat3_prtx +{ + uint64_t u64; + struct cvmx_pip_xstat3_prtx_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t bcst : 32; /**< Number of indentified L2 broadcast packets + Does not include multicast packets + Only includes packets whose parse mode is + SKIP_TO_L2. */ + uint64_t mcst : 32; /**< Number of indentified L2 multicast packets + Does not include broadcast packets + Only includes packets whose parse mode is + SKIP_TO_L2. */ +#else + uint64_t mcst : 32; + uint64_t bcst : 32; +#endif + } s; + struct cvmx_pip_xstat3_prtx_s cn63xx; + struct cvmx_pip_xstat3_prtx_s cn63xxp1; +}; +typedef union cvmx_pip_xstat3_prtx cvmx_pip_xstat3_prtx_t; + +/** + * cvmx_pip_xstat4_prt# + * + * PIP_XSTAT4_PRTX = PIP_XSTAT_HIST1 / PIP_XSTAT_HIST0 + * + */ +union cvmx_pip_xstat4_prtx +{ + uint64_t u64; + struct cvmx_pip_xstat4_prtx_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t h65to127 : 32; /**< Number of 65-127B packets */ + uint64_t h64 : 32; /**< Number of 1-64B packets */ +#else + uint64_t h64 : 32; + uint64_t h65to127 : 32; +#endif + } s; + struct cvmx_pip_xstat4_prtx_s cn63xx; + struct cvmx_pip_xstat4_prtx_s cn63xxp1; +}; +typedef union cvmx_pip_xstat4_prtx cvmx_pip_xstat4_prtx_t; + +/** + * cvmx_pip_xstat5_prt# + * + * PIP_XSTAT5_PRTX = PIP_XSTAT_HIST3 / PIP_XSTAT_HIST2 + * + */ +union cvmx_pip_xstat5_prtx +{ + uint64_t u64; + struct cvmx_pip_xstat5_prtx_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t h256to511 : 32; /**< Number of 256-511B packets */ + uint64_t h128to255 : 32; /**< Number of 128-255B packets */ +#else + uint64_t h128to255 : 32; + uint64_t h256to511 : 32; +#endif + } s; + struct cvmx_pip_xstat5_prtx_s cn63xx; + struct cvmx_pip_xstat5_prtx_s cn63xxp1; +}; +typedef union cvmx_pip_xstat5_prtx cvmx_pip_xstat5_prtx_t; + +/** + * cvmx_pip_xstat6_prt# + * + * PIP_XSTAT6_PRTX = PIP_XSTAT_HIST5 / PIP_XSTAT_HIST4 + * + */ +union cvmx_pip_xstat6_prtx +{ + uint64_t u64; + struct cvmx_pip_xstat6_prtx_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t h1024to1518 : 32; /**< Number of 1024-1518B packets */ + uint64_t h512to1023 : 32; /**< Number of 512-1023B packets */ +#else + uint64_t h512to1023 : 32; + uint64_t h1024to1518 : 32; +#endif + } s; + struct cvmx_pip_xstat6_prtx_s cn63xx; + struct cvmx_pip_xstat6_prtx_s cn63xxp1; +}; +typedef union cvmx_pip_xstat6_prtx cvmx_pip_xstat6_prtx_t; + +/** + * cvmx_pip_xstat7_prt# + * + * PIP_XSTAT7_PRTX = PIP_XSTAT_FCS / PIP_XSTAT_HIST6 + * + * + * Notes: + * Note: FCS is not checked on the PCI ports 32..35. + * + */ +union cvmx_pip_xstat7_prtx +{ + uint64_t u64; + struct cvmx_pip_xstat7_prtx_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t fcs : 32; /**< Number of packets with FCS or Align opcode errors */ + uint64_t h1519 : 32; /**< Number of 1519-max packets */ +#else + uint64_t h1519 : 32; + uint64_t fcs : 32; +#endif + } s; + struct cvmx_pip_xstat7_prtx_s cn63xx; + struct cvmx_pip_xstat7_prtx_s cn63xxp1; +}; +typedef union cvmx_pip_xstat7_prtx cvmx_pip_xstat7_prtx_t; + +/** + * cvmx_pip_xstat8_prt# + * + * PIP_XSTAT8_PRTX = PIP_XSTAT_FRAG / PIP_XSTAT_UNDER + * + * + * Notes: + * Note: FCS is not checked on the PCI ports 32..35. + * + */ +union cvmx_pip_xstat8_prtx +{ + uint64_t u64; + struct cvmx_pip_xstat8_prtx_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t frag : 32; /**< Number of packets with length < min and FCS error */ + uint64_t undersz : 32; /**< Number of packets with length < min */ +#else + uint64_t undersz : 32; + uint64_t frag : 32; +#endif + } s; + struct cvmx_pip_xstat8_prtx_s cn63xx; + struct cvmx_pip_xstat8_prtx_s cn63xxp1; +}; +typedef union cvmx_pip_xstat8_prtx cvmx_pip_xstat8_prtx_t; + +/** + * cvmx_pip_xstat9_prt# + * + * PIP_XSTAT9_PRTX = PIP_XSTAT_JABBER / PIP_XSTAT_OVER + * + * + * Notes: + * Note: FCS is not checked on the PCI ports 32..35. + * + */ +union cvmx_pip_xstat9_prtx +{ + uint64_t u64; + struct cvmx_pip_xstat9_prtx_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t jabber : 32; /**< Number of packets with length > max and FCS error */ + uint64_t oversz : 32; /**< Number of packets with length > max */ +#else + uint64_t oversz : 32; + uint64_t jabber : 32; +#endif + } s; + struct cvmx_pip_xstat9_prtx_s cn63xx; + struct cvmx_pip_xstat9_prtx_s cn63xxp1; +}; +typedef union cvmx_pip_xstat9_prtx cvmx_pip_xstat9_prtx_t; + +#endif -- cgit v1.2.3