diff options
Diffstat (limited to 'cvmx-sriox-defs.h')
-rw-r--r-- | cvmx-sriox-defs.h | 3703 |
1 files changed, 3703 insertions, 0 deletions
diff --git a/cvmx-sriox-defs.h b/cvmx-sriox-defs.h new file mode 100644 index 000000000000..0055a54c2fcf --- /dev/null +++ b/cvmx-sriox-defs.h @@ -0,0 +1,3703 @@ +/***********************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-sriox-defs.h + * + * Configuration and status register (CSR) type definitions for + * Octeon sriox. + * + * This file is auto generated. Do not edit. + * + * <hr>$Revision$<hr> + * + */ +#ifndef __CVMX_SRIOX_TYPEDEFS_H__ +#define __CVMX_SRIOX_TYPEDEFS_H__ + +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +static inline uint64_t CVMX_SRIOX_ACC_CTRL(unsigned long block_id) +{ + if (!( + (OCTEON_IS_MODEL(OCTEON_CN63XX) && ((block_id <= 1))))) + cvmx_warn("CVMX_SRIOX_ACC_CTRL(%lu) is invalid on this chip\n", block_id); + return CVMX_ADD_IO_SEG(0x00011800C8000148ull) + ((block_id) & 1) * 0x1000000ull; +} +#else +#define CVMX_SRIOX_ACC_CTRL(block_id) (CVMX_ADD_IO_SEG(0x00011800C8000148ull) + ((block_id) & 1) * 0x1000000ull) +#endif +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +static inline uint64_t CVMX_SRIOX_ASMBLY_ID(unsigned long block_id) +{ + if (!( + (OCTEON_IS_MODEL(OCTEON_CN63XX) && ((block_id <= 1))))) + cvmx_warn("CVMX_SRIOX_ASMBLY_ID(%lu) is invalid on this chip\n", block_id); + return CVMX_ADD_IO_SEG(0x00011800C8000200ull) + ((block_id) & 1) * 0x1000000ull; +} +#else +#define CVMX_SRIOX_ASMBLY_ID(block_id) (CVMX_ADD_IO_SEG(0x00011800C8000200ull) + ((block_id) & 1) * 0x1000000ull) +#endif +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +static inline uint64_t CVMX_SRIOX_ASMBLY_INFO(unsigned long block_id) +{ + if (!( + (OCTEON_IS_MODEL(OCTEON_CN63XX) && ((block_id <= 1))))) + cvmx_warn("CVMX_SRIOX_ASMBLY_INFO(%lu) is invalid on this chip\n", block_id); + return CVMX_ADD_IO_SEG(0x00011800C8000208ull) + ((block_id) & 1) * 0x1000000ull; +} +#else +#define CVMX_SRIOX_ASMBLY_INFO(block_id) (CVMX_ADD_IO_SEG(0x00011800C8000208ull) + ((block_id) & 1) * 0x1000000ull) +#endif +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +static inline uint64_t CVMX_SRIOX_BELL_RESP_CTRL(unsigned long block_id) +{ + if (!( + (OCTEON_IS_MODEL(OCTEON_CN63XX) && ((block_id <= 1))))) + cvmx_warn("CVMX_SRIOX_BELL_RESP_CTRL(%lu) is invalid on this chip\n", block_id); + return CVMX_ADD_IO_SEG(0x00011800C8000310ull) + ((block_id) & 1) * 0x1000000ull; +} +#else +#define CVMX_SRIOX_BELL_RESP_CTRL(block_id) (CVMX_ADD_IO_SEG(0x00011800C8000310ull) + ((block_id) & 1) * 0x1000000ull) +#endif +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +static inline uint64_t CVMX_SRIOX_BIST_STATUS(unsigned long block_id) +{ + if (!( + (OCTEON_IS_MODEL(OCTEON_CN63XX) && ((block_id <= 1))))) + cvmx_warn("CVMX_SRIOX_BIST_STATUS(%lu) is invalid on this chip\n", block_id); + return CVMX_ADD_IO_SEG(0x00011800C8000108ull) + ((block_id) & 1) * 0x1000000ull; +} +#else +#define CVMX_SRIOX_BIST_STATUS(block_id) (CVMX_ADD_IO_SEG(0x00011800C8000108ull) + ((block_id) & 1) * 0x1000000ull) +#endif +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +static inline uint64_t CVMX_SRIOX_IMSG_CTRL(unsigned long block_id) +{ + if (!( + (OCTEON_IS_MODEL(OCTEON_CN63XX) && ((block_id <= 1))))) + cvmx_warn("CVMX_SRIOX_IMSG_CTRL(%lu) is invalid on this chip\n", block_id); + return CVMX_ADD_IO_SEG(0x00011800C8000508ull) + ((block_id) & 1) * 0x1000000ull; +} +#else +#define CVMX_SRIOX_IMSG_CTRL(block_id) (CVMX_ADD_IO_SEG(0x00011800C8000508ull) + ((block_id) & 1) * 0x1000000ull) +#endif +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +static inline uint64_t CVMX_SRIOX_IMSG_INST_HDRX(unsigned long offset, unsigned long block_id) +{ + if (!( + (OCTEON_IS_MODEL(OCTEON_CN63XX) && (((offset <= 1)) && ((block_id <= 1)))))) + cvmx_warn("CVMX_SRIOX_IMSG_INST_HDRX(%lu,%lu) is invalid on this chip\n", offset, block_id); + return CVMX_ADD_IO_SEG(0x00011800C8000510ull) + (((offset) & 1) + ((block_id) & 1) * 0x200000ull) * 8; +} +#else +#define CVMX_SRIOX_IMSG_INST_HDRX(offset, block_id) (CVMX_ADD_IO_SEG(0x00011800C8000510ull) + (((offset) & 1) + ((block_id) & 1) * 0x200000ull) * 8) +#endif +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +static inline uint64_t CVMX_SRIOX_IMSG_QOS_GRPX(unsigned long offset, unsigned long block_id) +{ + if (!( + (OCTEON_IS_MODEL(OCTEON_CN63XX) && (((offset <= 31)) && ((block_id <= 1)))))) + cvmx_warn("CVMX_SRIOX_IMSG_QOS_GRPX(%lu,%lu) is invalid on this chip\n", offset, block_id); + return CVMX_ADD_IO_SEG(0x00011800C8000600ull) + (((offset) & 31) + ((block_id) & 1) * 0x200000ull) * 8; +} +#else +#define CVMX_SRIOX_IMSG_QOS_GRPX(offset, block_id) (CVMX_ADD_IO_SEG(0x00011800C8000600ull) + (((offset) & 31) + ((block_id) & 1) * 0x200000ull) * 8) +#endif +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +static inline uint64_t CVMX_SRIOX_IMSG_STATUSX(unsigned long offset, unsigned long block_id) +{ + if (!( + (OCTEON_IS_MODEL(OCTEON_CN63XX) && (((offset <= 23)) && ((block_id <= 1)))))) + cvmx_warn("CVMX_SRIOX_IMSG_STATUSX(%lu,%lu) is invalid on this chip\n", offset, block_id); + return CVMX_ADD_IO_SEG(0x00011800C8000700ull) + (((offset) & 31) + ((block_id) & 1) * 0x200000ull) * 8; +} +#else +#define CVMX_SRIOX_IMSG_STATUSX(offset, block_id) (CVMX_ADD_IO_SEG(0x00011800C8000700ull) + (((offset) & 31) + ((block_id) & 1) * 0x200000ull) * 8) +#endif +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +static inline uint64_t CVMX_SRIOX_IMSG_VPORT_THR(unsigned long block_id) +{ + if (!( + (OCTEON_IS_MODEL(OCTEON_CN63XX) && ((block_id <= 1))))) + cvmx_warn("CVMX_SRIOX_IMSG_VPORT_THR(%lu) is invalid on this chip\n", block_id); + return CVMX_ADD_IO_SEG(0x00011800C8000500ull) + ((block_id) & 1) * 0x1000000ull; +} +#else +#define CVMX_SRIOX_IMSG_VPORT_THR(block_id) (CVMX_ADD_IO_SEG(0x00011800C8000500ull) + ((block_id) & 1) * 0x1000000ull) +#endif +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +static inline uint64_t CVMX_SRIOX_INT2_ENABLE(unsigned long block_id) +{ + if (!( + (OCTEON_IS_MODEL(OCTEON_CN63XX) && ((block_id <= 1))))) + cvmx_warn("CVMX_SRIOX_INT2_ENABLE(%lu) is invalid on this chip\n", block_id); + return CVMX_ADD_IO_SEG(0x00011800C80003E0ull) + ((block_id) & 1) * 0x1000000ull; +} +#else +#define CVMX_SRIOX_INT2_ENABLE(block_id) (CVMX_ADD_IO_SEG(0x00011800C80003E0ull) + ((block_id) & 1) * 0x1000000ull) +#endif +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +static inline uint64_t CVMX_SRIOX_INT2_REG(unsigned long block_id) +{ + if (!( + (OCTEON_IS_MODEL(OCTEON_CN63XX) && ((block_id <= 1))))) + cvmx_warn("CVMX_SRIOX_INT2_REG(%lu) is invalid on this chip\n", block_id); + return CVMX_ADD_IO_SEG(0x00011800C80003E8ull) + ((block_id) & 1) * 0x1000000ull; +} +#else +#define CVMX_SRIOX_INT2_REG(block_id) (CVMX_ADD_IO_SEG(0x00011800C80003E8ull) + ((block_id) & 1) * 0x1000000ull) +#endif +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +static inline uint64_t CVMX_SRIOX_INT_ENABLE(unsigned long block_id) +{ + if (!( + (OCTEON_IS_MODEL(OCTEON_CN63XX) && ((block_id <= 1))))) + cvmx_warn("CVMX_SRIOX_INT_ENABLE(%lu) is invalid on this chip\n", block_id); + return CVMX_ADD_IO_SEG(0x00011800C8000110ull) + ((block_id) & 1) * 0x1000000ull; +} +#else +#define CVMX_SRIOX_INT_ENABLE(block_id) (CVMX_ADD_IO_SEG(0x00011800C8000110ull) + ((block_id) & 1) * 0x1000000ull) +#endif +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +static inline uint64_t CVMX_SRIOX_INT_INFO0(unsigned long block_id) +{ + if (!( + (OCTEON_IS_MODEL(OCTEON_CN63XX) && ((block_id <= 1))))) + cvmx_warn("CVMX_SRIOX_INT_INFO0(%lu) is invalid on this chip\n", block_id); + return CVMX_ADD_IO_SEG(0x00011800C8000120ull) + ((block_id) & 1) * 0x1000000ull; +} +#else +#define CVMX_SRIOX_INT_INFO0(block_id) (CVMX_ADD_IO_SEG(0x00011800C8000120ull) + ((block_id) & 1) * 0x1000000ull) +#endif +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +static inline uint64_t CVMX_SRIOX_INT_INFO1(unsigned long block_id) +{ + if (!( + (OCTEON_IS_MODEL(OCTEON_CN63XX) && ((block_id <= 1))))) + cvmx_warn("CVMX_SRIOX_INT_INFO1(%lu) is invalid on this chip\n", block_id); + return CVMX_ADD_IO_SEG(0x00011800C8000128ull) + ((block_id) & 1) * 0x1000000ull; +} +#else +#define CVMX_SRIOX_INT_INFO1(block_id) (CVMX_ADD_IO_SEG(0x00011800C8000128ull) + ((block_id) & 1) * 0x1000000ull) +#endif +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +static inline uint64_t CVMX_SRIOX_INT_INFO2(unsigned long block_id) +{ + if (!( + (OCTEON_IS_MODEL(OCTEON_CN63XX) && ((block_id <= 1))))) + cvmx_warn("CVMX_SRIOX_INT_INFO2(%lu) is invalid on this chip\n", block_id); + return CVMX_ADD_IO_SEG(0x00011800C8000130ull) + ((block_id) & 1) * 0x1000000ull; +} +#else +#define CVMX_SRIOX_INT_INFO2(block_id) (CVMX_ADD_IO_SEG(0x00011800C8000130ull) + ((block_id) & 1) * 0x1000000ull) +#endif +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +static inline uint64_t CVMX_SRIOX_INT_INFO3(unsigned long block_id) +{ + if (!( + (OCTEON_IS_MODEL(OCTEON_CN63XX) && ((block_id <= 1))))) + cvmx_warn("CVMX_SRIOX_INT_INFO3(%lu) is invalid on this chip\n", block_id); + return CVMX_ADD_IO_SEG(0x00011800C8000138ull) + ((block_id) & 1) * 0x1000000ull; +} +#else +#define CVMX_SRIOX_INT_INFO3(block_id) (CVMX_ADD_IO_SEG(0x00011800C8000138ull) + ((block_id) & 1) * 0x1000000ull) +#endif +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +static inline uint64_t CVMX_SRIOX_INT_REG(unsigned long block_id) +{ + if (!( + (OCTEON_IS_MODEL(OCTEON_CN63XX) && ((block_id <= 1))))) + cvmx_warn("CVMX_SRIOX_INT_REG(%lu) is invalid on this chip\n", block_id); + return CVMX_ADD_IO_SEG(0x00011800C8000118ull) + ((block_id) & 1) * 0x1000000ull; +} +#else +#define CVMX_SRIOX_INT_REG(block_id) (CVMX_ADD_IO_SEG(0x00011800C8000118ull) + ((block_id) & 1) * 0x1000000ull) +#endif +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +static inline uint64_t CVMX_SRIOX_IP_FEATURE(unsigned long block_id) +{ + if (!( + (OCTEON_IS_MODEL(OCTEON_CN63XX) && ((block_id <= 1))))) + cvmx_warn("CVMX_SRIOX_IP_FEATURE(%lu) is invalid on this chip\n", block_id); + return CVMX_ADD_IO_SEG(0x00011800C80003F8ull) + ((block_id) & 1) * 0x1000000ull; +} +#else +#define CVMX_SRIOX_IP_FEATURE(block_id) (CVMX_ADD_IO_SEG(0x00011800C80003F8ull) + ((block_id) & 1) * 0x1000000ull) +#endif +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +static inline uint64_t CVMX_SRIOX_MAC_BUFFERS(unsigned long block_id) +{ + if (!( + (OCTEON_IS_MODEL(OCTEON_CN63XX) && ((block_id <= 1))))) + cvmx_warn("CVMX_SRIOX_MAC_BUFFERS(%lu) is invalid on this chip\n", block_id); + return CVMX_ADD_IO_SEG(0x00011800C8000390ull) + ((block_id) & 1) * 0x1000000ull; +} +#else +#define CVMX_SRIOX_MAC_BUFFERS(block_id) (CVMX_ADD_IO_SEG(0x00011800C8000390ull) + ((block_id) & 1) * 0x1000000ull) +#endif +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +static inline uint64_t CVMX_SRIOX_MAINT_OP(unsigned long block_id) +{ + if (!( + (OCTEON_IS_MODEL(OCTEON_CN63XX) && ((block_id <= 1))))) + cvmx_warn("CVMX_SRIOX_MAINT_OP(%lu) is invalid on this chip\n", block_id); + return CVMX_ADD_IO_SEG(0x00011800C8000158ull) + ((block_id) & 1) * 0x1000000ull; +} +#else +#define CVMX_SRIOX_MAINT_OP(block_id) (CVMX_ADD_IO_SEG(0x00011800C8000158ull) + ((block_id) & 1) * 0x1000000ull) +#endif +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +static inline uint64_t CVMX_SRIOX_MAINT_RD_DATA(unsigned long block_id) +{ + if (!( + (OCTEON_IS_MODEL(OCTEON_CN63XX) && ((block_id <= 1))))) + cvmx_warn("CVMX_SRIOX_MAINT_RD_DATA(%lu) is invalid on this chip\n", block_id); + return CVMX_ADD_IO_SEG(0x00011800C8000160ull) + ((block_id) & 1) * 0x1000000ull; +} +#else +#define CVMX_SRIOX_MAINT_RD_DATA(block_id) (CVMX_ADD_IO_SEG(0x00011800C8000160ull) + ((block_id) & 1) * 0x1000000ull) +#endif +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +static inline uint64_t CVMX_SRIOX_MCE_TX_CTL(unsigned long block_id) +{ + if (!( + (OCTEON_IS_MODEL(OCTEON_CN63XX) && ((block_id <= 1))))) + cvmx_warn("CVMX_SRIOX_MCE_TX_CTL(%lu) is invalid on this chip\n", block_id); + return CVMX_ADD_IO_SEG(0x00011800C8000240ull) + ((block_id) & 1) * 0x1000000ull; +} +#else +#define CVMX_SRIOX_MCE_TX_CTL(block_id) (CVMX_ADD_IO_SEG(0x00011800C8000240ull) + ((block_id) & 1) * 0x1000000ull) +#endif +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +static inline uint64_t CVMX_SRIOX_MEM_OP_CTRL(unsigned long block_id) +{ + if (!( + (OCTEON_IS_MODEL(OCTEON_CN63XX) && ((block_id <= 1))))) + cvmx_warn("CVMX_SRIOX_MEM_OP_CTRL(%lu) is invalid on this chip\n", block_id); + return CVMX_ADD_IO_SEG(0x00011800C8000168ull) + ((block_id) & 1) * 0x1000000ull; +} +#else +#define CVMX_SRIOX_MEM_OP_CTRL(block_id) (CVMX_ADD_IO_SEG(0x00011800C8000168ull) + ((block_id) & 1) * 0x1000000ull) +#endif +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +static inline uint64_t CVMX_SRIOX_OMSG_CTRLX(unsigned long offset, unsigned long block_id) +{ + if (!( + (OCTEON_IS_MODEL(OCTEON_CN63XX) && (((offset <= 1)) && ((block_id <= 1)))))) + cvmx_warn("CVMX_SRIOX_OMSG_CTRLX(%lu,%lu) is invalid on this chip\n", offset, block_id); + return CVMX_ADD_IO_SEG(0x00011800C8000488ull) + (((offset) & 1) + ((block_id) & 1) * 0x40000ull) * 64; +} +#else +#define CVMX_SRIOX_OMSG_CTRLX(offset, block_id) (CVMX_ADD_IO_SEG(0x00011800C8000488ull) + (((offset) & 1) + ((block_id) & 1) * 0x40000ull) * 64) +#endif +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +static inline uint64_t CVMX_SRIOX_OMSG_DONE_COUNTSX(unsigned long offset, unsigned long block_id) +{ + if (!( + (OCTEON_IS_MODEL(OCTEON_CN63XX) && (((offset <= 1)) && ((block_id <= 1)))))) + cvmx_warn("CVMX_SRIOX_OMSG_DONE_COUNTSX(%lu,%lu) is invalid on this chip\n", offset, block_id); + return CVMX_ADD_IO_SEG(0x00011800C80004B0ull) + (((offset) & 1) + ((block_id) & 1) * 0x40000ull) * 64; +} +#else +#define CVMX_SRIOX_OMSG_DONE_COUNTSX(offset, block_id) (CVMX_ADD_IO_SEG(0x00011800C80004B0ull) + (((offset) & 1) + ((block_id) & 1) * 0x40000ull) * 64) +#endif +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +static inline uint64_t CVMX_SRIOX_OMSG_FMP_MRX(unsigned long offset, unsigned long block_id) +{ + if (!( + (OCTEON_IS_MODEL(OCTEON_CN63XX) && (((offset <= 1)) && ((block_id <= 1)))))) + cvmx_warn("CVMX_SRIOX_OMSG_FMP_MRX(%lu,%lu) is invalid on this chip\n", offset, block_id); + return CVMX_ADD_IO_SEG(0x00011800C8000498ull) + (((offset) & 1) + ((block_id) & 1) * 0x40000ull) * 64; +} +#else +#define CVMX_SRIOX_OMSG_FMP_MRX(offset, block_id) (CVMX_ADD_IO_SEG(0x00011800C8000498ull) + (((offset) & 1) + ((block_id) & 1) * 0x40000ull) * 64) +#endif +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +static inline uint64_t CVMX_SRIOX_OMSG_NMP_MRX(unsigned long offset, unsigned long block_id) +{ + if (!( + (OCTEON_IS_MODEL(OCTEON_CN63XX) && (((offset <= 1)) && ((block_id <= 1)))))) + cvmx_warn("CVMX_SRIOX_OMSG_NMP_MRX(%lu,%lu) is invalid on this chip\n", offset, block_id); + return CVMX_ADD_IO_SEG(0x00011800C80004A0ull) + (((offset) & 1) + ((block_id) & 1) * 0x40000ull) * 64; +} +#else +#define CVMX_SRIOX_OMSG_NMP_MRX(offset, block_id) (CVMX_ADD_IO_SEG(0x00011800C80004A0ull) + (((offset) & 1) + ((block_id) & 1) * 0x40000ull) * 64) +#endif +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +static inline uint64_t CVMX_SRIOX_OMSG_PORTX(unsigned long offset, unsigned long block_id) +{ + if (!( + (OCTEON_IS_MODEL(OCTEON_CN63XX) && (((offset <= 1)) && ((block_id <= 1)))))) + cvmx_warn("CVMX_SRIOX_OMSG_PORTX(%lu,%lu) is invalid on this chip\n", offset, block_id); + return CVMX_ADD_IO_SEG(0x00011800C8000480ull) + (((offset) & 1) + ((block_id) & 1) * 0x40000ull) * 64; +} +#else +#define CVMX_SRIOX_OMSG_PORTX(offset, block_id) (CVMX_ADD_IO_SEG(0x00011800C8000480ull) + (((offset) & 1) + ((block_id) & 1) * 0x40000ull) * 64) +#endif +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +static inline uint64_t CVMX_SRIOX_OMSG_SILO_THR(unsigned long block_id) +{ + if (!( + (OCTEON_IS_MODEL(OCTEON_CN63XX) && ((block_id <= 1))))) + cvmx_warn("CVMX_SRIOX_OMSG_SILO_THR(%lu) is invalid on this chip\n", block_id); + return CVMX_ADD_IO_SEG(0x00011800C80004F8ull) + ((block_id) & 1) * 0x1000000ull; +} +#else +#define CVMX_SRIOX_OMSG_SILO_THR(block_id) (CVMX_ADD_IO_SEG(0x00011800C80004F8ull) + ((block_id) & 1) * 0x1000000ull) +#endif +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +static inline uint64_t CVMX_SRIOX_OMSG_SP_MRX(unsigned long offset, unsigned long block_id) +{ + if (!( + (OCTEON_IS_MODEL(OCTEON_CN63XX) && (((offset <= 1)) && ((block_id <= 1)))))) + cvmx_warn("CVMX_SRIOX_OMSG_SP_MRX(%lu,%lu) is invalid on this chip\n", offset, block_id); + return CVMX_ADD_IO_SEG(0x00011800C8000490ull) + (((offset) & 1) + ((block_id) & 1) * 0x40000ull) * 64; +} +#else +#define CVMX_SRIOX_OMSG_SP_MRX(offset, block_id) (CVMX_ADD_IO_SEG(0x00011800C8000490ull) + (((offset) & 1) + ((block_id) & 1) * 0x40000ull) * 64) +#endif +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +static inline uint64_t CVMX_SRIOX_PRIOX_IN_USE(unsigned long offset, unsigned long block_id) +{ + if (!( + (OCTEON_IS_MODEL(OCTEON_CN63XX) && (((offset <= 3)) && ((block_id <= 1)))))) + cvmx_warn("CVMX_SRIOX_PRIOX_IN_USE(%lu,%lu) is invalid on this chip\n", offset, block_id); + return CVMX_ADD_IO_SEG(0x00011800C80003C0ull) + (((offset) & 3) + ((block_id) & 1) * 0x200000ull) * 8; +} +#else +#define CVMX_SRIOX_PRIOX_IN_USE(offset, block_id) (CVMX_ADD_IO_SEG(0x00011800C80003C0ull) + (((offset) & 3) + ((block_id) & 1) * 0x200000ull) * 8) +#endif +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +static inline uint64_t CVMX_SRIOX_RX_BELL(unsigned long block_id) +{ + if (!( + (OCTEON_IS_MODEL(OCTEON_CN63XX) && ((block_id <= 1))))) + cvmx_warn("CVMX_SRIOX_RX_BELL(%lu) is invalid on this chip\n", block_id); + return CVMX_ADD_IO_SEG(0x00011800C8000308ull) + ((block_id) & 1) * 0x1000000ull; +} +#else +#define CVMX_SRIOX_RX_BELL(block_id) (CVMX_ADD_IO_SEG(0x00011800C8000308ull) + ((block_id) & 1) * 0x1000000ull) +#endif +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +static inline uint64_t CVMX_SRIOX_RX_BELL_SEQ(unsigned long block_id) +{ + if (!( + (OCTEON_IS_MODEL(OCTEON_CN63XX) && ((block_id <= 1))))) + cvmx_warn("CVMX_SRIOX_RX_BELL_SEQ(%lu) is invalid on this chip\n", block_id); + return CVMX_ADD_IO_SEG(0x00011800C8000300ull) + ((block_id) & 1) * 0x1000000ull; +} +#else +#define CVMX_SRIOX_RX_BELL_SEQ(block_id) (CVMX_ADD_IO_SEG(0x00011800C8000300ull) + ((block_id) & 1) * 0x1000000ull) +#endif +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +static inline uint64_t CVMX_SRIOX_RX_STATUS(unsigned long block_id) +{ + if (!( + (OCTEON_IS_MODEL(OCTEON_CN63XX) && ((block_id <= 1))))) + cvmx_warn("CVMX_SRIOX_RX_STATUS(%lu) is invalid on this chip\n", block_id); + return CVMX_ADD_IO_SEG(0x00011800C8000380ull) + ((block_id) & 1) * 0x1000000ull; +} +#else +#define CVMX_SRIOX_RX_STATUS(block_id) (CVMX_ADD_IO_SEG(0x00011800C8000380ull) + ((block_id) & 1) * 0x1000000ull) +#endif +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +static inline uint64_t CVMX_SRIOX_S2M_TYPEX(unsigned long offset, unsigned long block_id) +{ + if (!( + (OCTEON_IS_MODEL(OCTEON_CN63XX) && (((offset <= 15)) && ((block_id <= 1)))))) + cvmx_warn("CVMX_SRIOX_S2M_TYPEX(%lu,%lu) is invalid on this chip\n", offset, block_id); + return CVMX_ADD_IO_SEG(0x00011800C8000180ull) + (((offset) & 15) + ((block_id) & 1) * 0x200000ull) * 8; +} +#else +#define CVMX_SRIOX_S2M_TYPEX(offset, block_id) (CVMX_ADD_IO_SEG(0x00011800C8000180ull) + (((offset) & 15) + ((block_id) & 1) * 0x200000ull) * 8) +#endif +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +static inline uint64_t CVMX_SRIOX_SEQ(unsigned long block_id) +{ + if (!( + (OCTEON_IS_MODEL(OCTEON_CN63XX) && ((block_id <= 1))))) + cvmx_warn("CVMX_SRIOX_SEQ(%lu) is invalid on this chip\n", block_id); + return CVMX_ADD_IO_SEG(0x00011800C8000278ull) + ((block_id) & 1) * 0x1000000ull; +} +#else +#define CVMX_SRIOX_SEQ(block_id) (CVMX_ADD_IO_SEG(0x00011800C8000278ull) + ((block_id) & 1) * 0x1000000ull) +#endif +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +static inline uint64_t CVMX_SRIOX_STATUS_REG(unsigned long block_id) +{ + if (!( + (OCTEON_IS_MODEL(OCTEON_CN63XX) && ((block_id <= 1))))) + cvmx_warn("CVMX_SRIOX_STATUS_REG(%lu) is invalid on this chip\n", block_id); + return CVMX_ADD_IO_SEG(0x00011800C8000100ull) + ((block_id) & 1) * 0x1000000ull; +} +#else +#define CVMX_SRIOX_STATUS_REG(block_id) (CVMX_ADD_IO_SEG(0x00011800C8000100ull) + ((block_id) & 1) * 0x1000000ull) +#endif +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +static inline uint64_t CVMX_SRIOX_TAG_CTRL(unsigned long block_id) +{ + if (!( + (OCTEON_IS_MODEL(OCTEON_CN63XX) && ((block_id <= 1))))) + cvmx_warn("CVMX_SRIOX_TAG_CTRL(%lu) is invalid on this chip\n", block_id); + return CVMX_ADD_IO_SEG(0x00011800C8000178ull) + ((block_id) & 1) * 0x1000000ull; +} +#else +#define CVMX_SRIOX_TAG_CTRL(block_id) (CVMX_ADD_IO_SEG(0x00011800C8000178ull) + ((block_id) & 1) * 0x1000000ull) +#endif +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +static inline uint64_t CVMX_SRIOX_TLP_CREDITS(unsigned long block_id) +{ + if (!( + (OCTEON_IS_MODEL(OCTEON_CN63XX) && ((block_id <= 1))))) + cvmx_warn("CVMX_SRIOX_TLP_CREDITS(%lu) is invalid on this chip\n", block_id); + return CVMX_ADD_IO_SEG(0x00011800C8000150ull) + ((block_id) & 1) * 0x1000000ull; +} +#else +#define CVMX_SRIOX_TLP_CREDITS(block_id) (CVMX_ADD_IO_SEG(0x00011800C8000150ull) + ((block_id) & 1) * 0x1000000ull) +#endif +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +static inline uint64_t CVMX_SRIOX_TX_BELL(unsigned long block_id) +{ + if (!( + (OCTEON_IS_MODEL(OCTEON_CN63XX) && ((block_id <= 1))))) + cvmx_warn("CVMX_SRIOX_TX_BELL(%lu) is invalid on this chip\n", block_id); + return CVMX_ADD_IO_SEG(0x00011800C8000280ull) + ((block_id) & 1) * 0x1000000ull; +} +#else +#define CVMX_SRIOX_TX_BELL(block_id) (CVMX_ADD_IO_SEG(0x00011800C8000280ull) + ((block_id) & 1) * 0x1000000ull) +#endif +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +static inline uint64_t CVMX_SRIOX_TX_BELL_INFO(unsigned long block_id) +{ + if (!( + (OCTEON_IS_MODEL(OCTEON_CN63XX) && ((block_id <= 1))))) + cvmx_warn("CVMX_SRIOX_TX_BELL_INFO(%lu) is invalid on this chip\n", block_id); + return CVMX_ADD_IO_SEG(0x00011800C8000288ull) + ((block_id) & 1) * 0x1000000ull; +} +#else +#define CVMX_SRIOX_TX_BELL_INFO(block_id) (CVMX_ADD_IO_SEG(0x00011800C8000288ull) + ((block_id) & 1) * 0x1000000ull) +#endif +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +static inline uint64_t CVMX_SRIOX_TX_CTRL(unsigned long block_id) +{ + if (!( + (OCTEON_IS_MODEL(OCTEON_CN63XX) && ((block_id <= 1))))) + cvmx_warn("CVMX_SRIOX_TX_CTRL(%lu) is invalid on this chip\n", block_id); + return CVMX_ADD_IO_SEG(0x00011800C8000170ull) + ((block_id) & 1) * 0x1000000ull; +} +#else +#define CVMX_SRIOX_TX_CTRL(block_id) (CVMX_ADD_IO_SEG(0x00011800C8000170ull) + ((block_id) & 1) * 0x1000000ull) +#endif +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +static inline uint64_t CVMX_SRIOX_TX_EMPHASIS(unsigned long block_id) +{ + if (!( + (OCTEON_IS_MODEL(OCTEON_CN63XX) && ((block_id <= 1))))) + cvmx_warn("CVMX_SRIOX_TX_EMPHASIS(%lu) is invalid on this chip\n", block_id); + return CVMX_ADD_IO_SEG(0x00011800C80003F0ull) + ((block_id) & 1) * 0x1000000ull; +} +#else +#define CVMX_SRIOX_TX_EMPHASIS(block_id) (CVMX_ADD_IO_SEG(0x00011800C80003F0ull) + ((block_id) & 1) * 0x1000000ull) +#endif +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +static inline uint64_t CVMX_SRIOX_TX_STATUS(unsigned long block_id) +{ + if (!( + (OCTEON_IS_MODEL(OCTEON_CN63XX) && ((block_id <= 1))))) + cvmx_warn("CVMX_SRIOX_TX_STATUS(%lu) is invalid on this chip\n", block_id); + return CVMX_ADD_IO_SEG(0x00011800C8000388ull) + ((block_id) & 1) * 0x1000000ull; +} +#else +#define CVMX_SRIOX_TX_STATUS(block_id) (CVMX_ADD_IO_SEG(0x00011800C8000388ull) + ((block_id) & 1) * 0x1000000ull) +#endif +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +static inline uint64_t CVMX_SRIOX_WR_DONE_COUNTS(unsigned long block_id) +{ + if (!( + (OCTEON_IS_MODEL(OCTEON_CN63XX) && ((block_id <= 1))))) + cvmx_warn("CVMX_SRIOX_WR_DONE_COUNTS(%lu) is invalid on this chip\n", block_id); + return CVMX_ADD_IO_SEG(0x00011800C8000340ull) + ((block_id) & 1) * 0x1000000ull; +} +#else +#define CVMX_SRIOX_WR_DONE_COUNTS(block_id) (CVMX_ADD_IO_SEG(0x00011800C8000340ull) + ((block_id) & 1) * 0x1000000ull) +#endif + +/** + * cvmx_srio#_acc_ctrl + * + * SRIO_ACC_CTRL = SRIO Access Control + * + * General access control of the incoming BAR registers. + * + * Notes: + * This register controls write access to the BAR registers via SRIO Maintenance Operations. At + * powerup the BAR registers can be accessed via RSL and Maintenance Operations. If the DENY_BAR* + * bits are set then Maintenance Writes to the corresponding BAR registers are ignored. This + * register does not effect read operations. + * + * Clk_Rst: SRIO(0..1)_ACC_CTRL hclk hrst_n + */ +union cvmx_sriox_acc_ctrl +{ + uint64_t u64; + struct cvmx_sriox_acc_ctrl_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_3_63 : 61; + uint64_t deny_bar2 : 1; /**< Deny SRIO Write Access to BAR2 Registers */ + uint64_t deny_bar1 : 1; /**< Deny SRIO Write Access to BAR1 Registers */ + uint64_t deny_bar0 : 1; /**< Deny SRIO Write Access to BAR0 Registers */ +#else + uint64_t deny_bar0 : 1; + uint64_t deny_bar1 : 1; + uint64_t deny_bar2 : 1; + uint64_t reserved_3_63 : 61; +#endif + } s; + struct cvmx_sriox_acc_ctrl_s cn63xx; + struct cvmx_sriox_acc_ctrl_s cn63xxp1; +}; +typedef union cvmx_sriox_acc_ctrl cvmx_sriox_acc_ctrl_t; + +/** + * cvmx_srio#_asmbly_id + * + * SRIO_ASMBLY_ID = SRIO Assembly ID + * + * The Assembly ID register controls the Assembly ID and Vendor + * + * Notes: + * This register specifies the Assembly ID and Vendor visible in SRIOMAINT(0..1)_ASMBLY_ID register. The + * Assembly Vendor ID is typically supplied by the RapidIO Trade Association. This register is only + * reset during COLD boot and may only be modified while SRIO(0..1)_STATUS_REG.ACCESS is zero. + * + * Clk_Rst: SRIO(0..1)_ASMBLY_ID sclk srst_cold_n + */ +union cvmx_sriox_asmbly_id +{ + uint64_t u64; + struct cvmx_sriox_asmbly_id_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_32_63 : 32; + uint64_t assy_id : 16; /**< Assembly Identifer */ + uint64_t assy_ven : 16; /**< Assembly Vendor Identifer */ +#else + uint64_t assy_ven : 16; + uint64_t assy_id : 16; + uint64_t reserved_32_63 : 32; +#endif + } s; + struct cvmx_sriox_asmbly_id_s cn63xx; + struct cvmx_sriox_asmbly_id_s cn63xxp1; +}; +typedef union cvmx_sriox_asmbly_id cvmx_sriox_asmbly_id_t; + +/** + * cvmx_srio#_asmbly_info + * + * SRIO_ASMBLY_INFO = SRIO Assembly Information + * + * The Assembly Info register controls the Assembly Revision + * + * Notes: + * The Assembly Info register controls the Assembly Revision visible in the ASSY_REV field of the + * SRIOMAINT(0..1)_ASMBLY_INFO register. This register is only reset during COLD boot and may only be + * modified while SRIO(0..1)_STATUS_REG.ACCESS is zero. + * + * Clk_Rst: SRIO(0..1)_ASMBLY_INFO sclk srst_cold_n + */ +union cvmx_sriox_asmbly_info +{ + uint64_t u64; + struct cvmx_sriox_asmbly_info_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_32_63 : 32; + uint64_t assy_rev : 16; /**< Assembly Revision */ + uint64_t reserved_0_15 : 16; +#else + uint64_t reserved_0_15 : 16; + uint64_t assy_rev : 16; + uint64_t reserved_32_63 : 32; +#endif + } s; + struct cvmx_sriox_asmbly_info_s cn63xx; + struct cvmx_sriox_asmbly_info_s cn63xxp1; +}; +typedef union cvmx_sriox_asmbly_info cvmx_sriox_asmbly_info_t; + +/** + * cvmx_srio#_bell_resp_ctrl + * + * SRIO_BELL_RESP_CTRL = SRIO Doorbell Response Control + * + * The SRIO Doorbell Response Control Register + * + * Notes: + * This register is used to override the response priority of the outgoing doorbell responses. + * + * Clk_Rst: SRIO(0..1)_BELL_RESP_CTRL hclk hrst_n + */ +union cvmx_sriox_bell_resp_ctrl +{ + uint64_t u64; + struct cvmx_sriox_bell_resp_ctrl_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_6_63 : 58; + uint64_t rp1_sid : 1; /**< Sets response priority for incomimg doorbells + of priority 1 on the secondary ID (0=2, 1=3) */ + uint64_t rp0_sid : 2; /**< Sets response priority for incomimg doorbells + of priority 0 on the secondary ID (0,1=1 2=2, 3=3) */ + uint64_t rp1_pid : 1; /**< Sets response priority for incomimg doorbells + of priority 1 on the primary ID (0=2, 1=3) */ + uint64_t rp0_pid : 2; /**< Sets response priority for incomimg doorbells + of priority 0 on the primary ID (0,1=1 2=2, 3=3) */ +#else + uint64_t rp0_pid : 2; + uint64_t rp1_pid : 1; + uint64_t rp0_sid : 2; + uint64_t rp1_sid : 1; + uint64_t reserved_6_63 : 58; +#endif + } s; + struct cvmx_sriox_bell_resp_ctrl_s cn63xx; + struct cvmx_sriox_bell_resp_ctrl_s cn63xxp1; +}; +typedef union cvmx_sriox_bell_resp_ctrl cvmx_sriox_bell_resp_ctrl_t; + +/** + * cvmx_srio#_bist_status + * + * SRIO_BIST_STATUS = SRIO Bist Status + * + * Results from BIST runs of SRIO's memories. + * + * Notes: + * BIST Results. + * + * Clk_Rst: SRIO(0..1)_BIST_STATUS hclk hrst_n + */ +union cvmx_sriox_bist_status +{ + uint64_t u64; + struct cvmx_sriox_bist_status_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_44_63 : 20; + uint64_t mram : 2; /**< Incoming Message SLI FIFO. */ + uint64_t cram : 2; /**< Incoming Rd/Wr/Response Command FIFO. */ + uint64_t bell : 2; /**< Incoming Doorbell FIFO. */ + uint64_t otag : 2; /**< Outgoing Tag Data. */ + uint64_t itag : 1; /**< Incoming TAG Data. */ + uint64_t ofree : 1; /**< Outgoing Free Pointer RAM (OFIFO) */ + uint64_t rtn : 2; /**< Outgoing Response Return FIFO. */ + uint64_t obulk : 4; /**< Outgoing Bulk Data RAMs (OFIFO) */ + uint64_t optrs : 4; /**< Outgoing Priority Pointer RAMs (OFIFO) */ + uint64_t reserved_22_23 : 2; + uint64_t rxbuf2 : 2; /**< Additional Incoming SRIO MAC Buffers (Pass 2). */ + uint64_t oarb : 2; /**< Outgoing Priority RAMs (OARB) */ + uint64_t ispf : 1; /**< Incoming Soft Packet FIFO */ + uint64_t ospf : 1; /**< Outgoing Soft Packet FIFO */ + uint64_t txbuf : 2; /**< Outgoing SRIO MAC Buffer. */ + uint64_t rxbuf : 2; /**< Incoming SRIO MAC Buffer. */ + uint64_t imsg : 5; /**< Incoming Message RAMs. */ + uint64_t omsg : 7; /**< Outgoing Message RAMs. */ +#else + uint64_t omsg : 7; + uint64_t imsg : 5; + uint64_t rxbuf : 2; + uint64_t txbuf : 2; + uint64_t ospf : 1; + uint64_t ispf : 1; + uint64_t oarb : 2; + uint64_t rxbuf2 : 2; + uint64_t reserved_22_23 : 2; + uint64_t optrs : 4; + uint64_t obulk : 4; + uint64_t rtn : 2; + uint64_t ofree : 1; + uint64_t itag : 1; + uint64_t otag : 2; + uint64_t bell : 2; + uint64_t cram : 2; + uint64_t mram : 2; + uint64_t reserved_44_63 : 20; +#endif + } s; + struct cvmx_sriox_bist_status_s cn63xx; + struct cvmx_sriox_bist_status_cn63xxp1 + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_44_63 : 20; + uint64_t mram : 2; /**< Incoming Message SLI FIFO. */ + uint64_t cram : 2; /**< Incoming Rd/Wr/Response Command FIFO. */ + uint64_t bell : 2; /**< Incoming Doorbell FIFO. */ + uint64_t otag : 2; /**< Outgoing Tag Data. */ + uint64_t itag : 1; /**< Incoming TAG Data. */ + uint64_t ofree : 1; /**< Outgoing Free Pointer RAM (OFIFO) */ + uint64_t rtn : 2; /**< Outgoing Response Return FIFO. */ + uint64_t obulk : 4; /**< Outgoing Bulk Data RAMs (OFIFO) */ + uint64_t optrs : 4; /**< Outgoing Priority Pointer RAMs (OFIFO) */ + uint64_t reserved_20_23 : 4; + uint64_t oarb : 2; /**< Outgoing Priority RAMs (OARB) */ + uint64_t ispf : 1; /**< Incoming Soft Packet FIFO */ + uint64_t ospf : 1; /**< Outgoing Soft Packet FIFO */ + uint64_t txbuf : 2; /**< Outgoing SRIO MAC Buffer. */ + uint64_t rxbuf : 2; /**< Incoming SRIO MAC Buffer. */ + uint64_t imsg : 5; /**< Incoming Message RAMs. */ + uint64_t omsg : 7; /**< Outgoing Message RAMs. */ +#else + uint64_t omsg : 7; + uint64_t imsg : 5; + uint64_t rxbuf : 2; + uint64_t txbuf : 2; + uint64_t ospf : 1; + uint64_t ispf : 1; + uint64_t oarb : 2; + uint64_t reserved_20_23 : 4; + uint64_t optrs : 4; + uint64_t obulk : 4; + uint64_t rtn : 2; + uint64_t ofree : 1; + uint64_t itag : 1; + uint64_t otag : 2; + uint64_t bell : 2; + uint64_t cram : 2; + uint64_t mram : 2; + uint64_t reserved_44_63 : 20; +#endif + } cn63xxp1; +}; +typedef union cvmx_sriox_bist_status cvmx_sriox_bist_status_t; + +/** + * cvmx_srio#_imsg_ctrl + * + * SRIO_IMSG_CTRL = SRIO Incoming Message Control + * + * The SRIO Incoming Message Control Register + * + * Notes: + * RSP_THR should not typically be modified from reset value. + * + * Clk_Rst: SRIO(0..1)_IMSG_CTRL hclk hrst_n + */ +union cvmx_sriox_imsg_ctrl +{ + uint64_t u64; + struct cvmx_sriox_imsg_ctrl_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_32_63 : 32; + uint64_t to_mode : 1; /**< MP message timeout mode: + - 0: The timeout counter gets reset whenever the + next sequential segment is received, regardless + of whether it is accepted + - 1: The timeout counter gets reset only when the + next sequential segment is received and + accepted */ + uint64_t reserved_30_30 : 1; + uint64_t rsp_thr : 6; /**< Sets max number of msg responses in queue before + sending link-layer retries (field value is added + to 16 to create threshold value) */ + uint64_t reserved_22_23 : 2; + uint64_t rp1_sid : 1; /**< Sets msg response priority for incomimg messages + of priority 1 on the secondary ID (0=2, 1=3) */ + uint64_t rp0_sid : 2; /**< Sets msg response priority for incomimg messages + of priority 0 on the secondary ID (0,1=1 2=2, 3=3) */ + uint64_t rp1_pid : 1; /**< Sets msg response priority for incomimg messages + of priority 1 on the primary ID (0=2, 1=3) */ + uint64_t rp0_pid : 2; /**< Sets msg response priority for incomimg messages + of priority 0 on the primary ID (0,1=1 2=2, 3=3) */ + uint64_t reserved_15_15 : 1; + uint64_t prt_sel : 3; /**< Port/Controller selection method: + - 0: Table lookup based on mailbox + - 1: Table lookup based on priority + - 2: Table lookup based on letter + - 3: Size-based (SP to port 0, MP to port 1) + - 4: ID-based (pri ID to port 0, sec ID to port 1) */ + uint64_t lttr : 4; /**< Port/Controller selection letter table */ + uint64_t prio : 4; /**< Port/Controller selection priority table */ + uint64_t mbox : 4; /**< Port/Controller selection mailbox table */ +#else + uint64_t mbox : 4; + uint64_t prio : 4; + uint64_t lttr : 4; + uint64_t prt_sel : 3; + uint64_t reserved_15_15 : 1; + uint64_t rp0_pid : 2; + uint64_t rp1_pid : 1; + uint64_t rp0_sid : 2; + uint64_t rp1_sid : 1; + uint64_t reserved_22_23 : 2; + uint64_t rsp_thr : 6; + uint64_t reserved_30_30 : 1; + uint64_t to_mode : 1; + uint64_t reserved_32_63 : 32; +#endif + } s; + struct cvmx_sriox_imsg_ctrl_s cn63xx; + struct cvmx_sriox_imsg_ctrl_s cn63xxp1; +}; +typedef union cvmx_sriox_imsg_ctrl cvmx_sriox_imsg_ctrl_t; + +/** + * cvmx_srio#_imsg_inst_hdr# + * + * SRIO_IMSG_INST_HDRX = SRIO Incoming Message Packet Instruction Header + * + * The SRIO Port/Controller X Incoming Message Packet Instruction Header Register + * + * Notes: + * SRIO HW generates most of the SRIO_WORD1 fields from these values. SRIO_WORD1 is the 2nd of two + * header words that SRIO inserts in front of all received messages. SRIO_WORD1 may commonly be used + * as a PIP/IPD PKT_INST_HDR. This CSR matches the PIP/IPD PKT_INST_HDR format except for the QOS + * and GRP fields. SRIO*_IMSG_QOS_GRP*[QOS*,GRP*] supply the QOS and GRP fields. + * + * Clk_Rst: SRIO(0..1)_IMSG_INST_HDR[0:1] hclk hrst_n + */ +union cvmx_sriox_imsg_inst_hdrx +{ + uint64_t u64; + struct cvmx_sriox_imsg_inst_hdrx_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t r : 1; /**< Port/Controller X R */ + uint64_t reserved_58_62 : 5; + uint64_t pm : 2; /**< Port/Controller X PM */ + uint64_t reserved_55_55 : 1; + uint64_t sl : 7; /**< Port/Controller X SL */ + uint64_t reserved_46_47 : 2; + uint64_t nqos : 1; /**< Port/Controller X NQOS */ + uint64_t ngrp : 1; /**< Port/Controller X NGRP */ + uint64_t ntt : 1; /**< Port/Controller X NTT */ + uint64_t ntag : 1; /**< Port/Controller X NTAG */ + uint64_t reserved_35_41 : 7; + uint64_t rs : 1; /**< Port/Controller X RS */ + uint64_t tt : 2; /**< Port/Controller X TT */ + uint64_t tag : 32; /**< Port/Controller X TAG */ +#else + uint64_t tag : 32; + uint64_t tt : 2; + uint64_t rs : 1; + uint64_t reserved_35_41 : 7; + uint64_t ntag : 1; + uint64_t ntt : 1; + uint64_t ngrp : 1; + uint64_t nqos : 1; + uint64_t reserved_46_47 : 2; + uint64_t sl : 7; + uint64_t reserved_55_55 : 1; + uint64_t pm : 2; + uint64_t reserved_58_62 : 5; + uint64_t r : 1; +#endif + } s; + struct cvmx_sriox_imsg_inst_hdrx_s cn63xx; + struct cvmx_sriox_imsg_inst_hdrx_s cn63xxp1; +}; +typedef union cvmx_sriox_imsg_inst_hdrx cvmx_sriox_imsg_inst_hdrx_t; + +/** + * cvmx_srio#_imsg_qos_grp# + * + * SRIO_IMSG_QOS_GRPX = SRIO Incoming Message QOS/GRP Table + * + * The SRIO Incoming Message QOS/GRP Table Entry X + * + * Notes: + * The QOS/GRP table contains 32 entries with 8 QOS/GRP pairs per entry - 256 pairs total. + * HW selects the table entry by the concatenation of SRIO_WORD0[PRIO,DIS,MBOX], thus entry 0 is + * used for messages with PRIO=0,DIS=0,MBOX=0, entry 1 is for PRIO=0,DIS=0,MBOX=1, etc. HW + * selects the QOS/GRP pair from the table entry by the concatenation of SRIO_WORD0[ID,LETTER] as + * shown above. HW then inserts the QOS/GRP pair into SRIO_WORD1[QOS,GRP], which may commonly + * be used for the PIP/IPD PKT_INST_HDR[QOS,GRP] fields. + * + * Clk_Rst: SRIO(0..1)_IMSG_QOS_GRP[0:1] hclk hrst_n + */ +union cvmx_sriox_imsg_qos_grpx +{ + uint64_t u64; + struct cvmx_sriox_imsg_qos_grpx_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_63_63 : 1; + uint64_t qos7 : 3; /**< Entry X:7 QOS (ID=1, LETTER=3) */ + uint64_t grp7 : 4; /**< Entry X:7 GRP (ID=1, LETTER=3) */ + uint64_t reserved_55_55 : 1; + uint64_t qos6 : 3; /**< Entry X:6 QOS (ID=1, LETTER=2) */ + uint64_t grp6 : 4; /**< Entry X:6 GRP (ID=1, LETTER=2) */ + uint64_t reserved_47_47 : 1; + uint64_t qos5 : 3; /**< Entry X:5 QOS (ID=1, LETTER=1) */ + uint64_t grp5 : 4; /**< Entry X:5 GRP (ID=1, LETTER=1) */ + uint64_t reserved_39_39 : 1; + uint64_t qos4 : 3; /**< Entry X:4 QOS (ID=1, LETTER=0) */ + uint64_t grp4 : 4; /**< Entry X:4 GRP (ID=1, LETTER=0) */ + uint64_t reserved_31_31 : 1; + uint64_t qos3 : 3; /**< Entry X:3 QOS (ID=0, LETTER=3) */ + uint64_t grp3 : 4; /**< Entry X:3 GRP (ID=0, LETTER=3) */ + uint64_t reserved_23_23 : 1; + uint64_t qos2 : 3; /**< Entry X:2 QOS (ID=0, LETTER=2) */ + uint64_t grp2 : 4; /**< Entry X:2 GRP (ID=0, LETTER=2) */ + uint64_t reserved_15_15 : 1; + uint64_t qos1 : 3; /**< Entry X:1 QOS (ID=0, LETTER=1) */ + uint64_t grp1 : 4; /**< Entry X:1 GRP (ID=0, LETTER=1) */ + uint64_t reserved_7_7 : 1; + uint64_t qos0 : 3; /**< Entry X:0 QOS (ID=0, LETTER=0) */ + uint64_t grp0 : 4; /**< Entry X:0 GRP (ID=0, LETTER=0) */ +#else + uint64_t grp0 : 4; + uint64_t qos0 : 3; + uint64_t reserved_7_7 : 1; + uint64_t grp1 : 4; + uint64_t qos1 : 3; + uint64_t reserved_15_15 : 1; + uint64_t grp2 : 4; + uint64_t qos2 : 3; + uint64_t reserved_23_23 : 1; + uint64_t grp3 : 4; + uint64_t qos3 : 3; + uint64_t reserved_31_31 : 1; + uint64_t grp4 : 4; + uint64_t qos4 : 3; + uint64_t reserved_39_39 : 1; + uint64_t grp5 : 4; + uint64_t qos5 : 3; + uint64_t reserved_47_47 : 1; + uint64_t grp6 : 4; + uint64_t qos6 : 3; + uint64_t reserved_55_55 : 1; + uint64_t grp7 : 4; + uint64_t qos7 : 3; + uint64_t reserved_63_63 : 1; +#endif + } s; + struct cvmx_sriox_imsg_qos_grpx_s cn63xx; + struct cvmx_sriox_imsg_qos_grpx_s cn63xxp1; +}; +typedef union cvmx_sriox_imsg_qos_grpx cvmx_sriox_imsg_qos_grpx_t; + +/** + * cvmx_srio#_imsg_status# + * + * SRIO_IMSG_STATUSX = SRIO Incoming Message Status Table + * + * The SRIO Incoming Message Status Table Entry X + * + * Notes: + * Clk_Rst: SRIO(0..1)_IMSG_STATUS[0:1] hclk hrst_n + * + */ +union cvmx_sriox_imsg_statusx +{ + uint64_t u64; + struct cvmx_sriox_imsg_statusx_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t val1 : 1; /**< Entry X:1 Valid */ + uint64_t err1 : 1; /**< Entry X:1 Error */ + uint64_t toe1 : 1; /**< Entry X:1 Timeout Error */ + uint64_t toc1 : 1; /**< Entry X:1 Timeout Count */ + uint64_t prt1 : 1; /**< Entry X:1 Port */ + uint64_t reserved_58_58 : 1; + uint64_t tt1 : 1; /**< Entry X:1 TT ID */ + uint64_t dis1 : 1; /**< Entry X:1 Dest ID */ + uint64_t seg1 : 4; /**< Entry X:1 Next Segment */ + uint64_t mbox1 : 2; /**< Entry X:1 Mailbox */ + uint64_t lttr1 : 2; /**< Entry X:1 Letter */ + uint64_t sid1 : 16; /**< Entry X:1 Source ID */ + uint64_t val0 : 1; /**< Entry X:0 Valid */ + uint64_t err0 : 1; /**< Entry X:0 Error */ + uint64_t toe0 : 1; /**< Entry X:0 Timeout Error */ + uint64_t toc0 : 1; /**< Entry X:0 Timeout Count */ + uint64_t prt0 : 1; /**< Entry X:0 Port */ + uint64_t reserved_26_26 : 1; + uint64_t tt0 : 1; /**< Entry X:0 TT ID */ + uint64_t dis0 : 1; /**< Entry X:0 Dest ID */ + uint64_t seg0 : 4; /**< Entry X:0 Next Segment */ + uint64_t mbox0 : 2; /**< Entry X:0 Mailbox */ + uint64_t lttr0 : 2; /**< Entry X:0 Letter */ + uint64_t sid0 : 16; /**< Entry X:0 Source ID */ +#else + uint64_t sid0 : 16; + uint64_t lttr0 : 2; + uint64_t mbox0 : 2; + uint64_t seg0 : 4; + uint64_t dis0 : 1; + uint64_t tt0 : 1; + uint64_t reserved_26_26 : 1; + uint64_t prt0 : 1; + uint64_t toc0 : 1; + uint64_t toe0 : 1; + uint64_t err0 : 1; + uint64_t val0 : 1; + uint64_t sid1 : 16; + uint64_t lttr1 : 2; + uint64_t mbox1 : 2; + uint64_t seg1 : 4; + uint64_t dis1 : 1; + uint64_t tt1 : 1; + uint64_t reserved_58_58 : 1; + uint64_t prt1 : 1; + uint64_t toc1 : 1; + uint64_t toe1 : 1; + uint64_t err1 : 1; + uint64_t val1 : 1; +#endif + } s; + struct cvmx_sriox_imsg_statusx_s cn63xx; + struct cvmx_sriox_imsg_statusx_s cn63xxp1; +}; +typedef union cvmx_sriox_imsg_statusx cvmx_sriox_imsg_statusx_t; + +/** + * cvmx_srio#_imsg_vport_thr + * + * SRIO_IMSG_VPORT_THR = SRIO Incoming Message Virtual Port Threshold + * + * The SRIO Incoming Message Virtual Port Threshold Register + * + * Notes: + * SRIO0_IMSG_VPORT_THR.MAX_TOT must be >= SRIO0_IMSG_VPORT_THR.BUF_THR + SRIO1_IMSG_VPORT_THR.BUF_THR + * This register can be accessed regardless of the value in SRIO(0..1)_STATUS_REG.ACCESS and is not + * effected by MAC reset. + * + * Clk_Rst: SRIO(0..1)_IMSG_VPORT_THR sclk srst_n + */ +union cvmx_sriox_imsg_vport_thr +{ + uint64_t u64; + struct cvmx_sriox_imsg_vport_thr_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_54_63 : 10; + uint64_t max_tot : 6; /**< Sets max number of vports available to SRIO0+SRIO1 + This field is only used in SRIO0. + SRIO1 never uses SRIO1_IMSG_VPORT_THR[MAX_TOT]. */ + uint64_t reserved_46_47 : 2; + uint64_t max_s1 : 6; /**< Sets max number of vports available to SRIO1 + This field is only used in SRIO0. + SRIO1 never uses SRIO1_IMSG_VPORT_THR[MAX_S1]. */ + uint64_t reserved_38_39 : 2; + uint64_t max_s0 : 6; /**< Sets max number of vports available to SRIO0 + This field is only used in SRIO0. + SRIO1 never uses SRIO1_IMSG_VPORT_THR[MAX_S0]. */ + uint64_t sp_vport : 1; /**< Single-segment vport pre-allocation. + When set, single-segment messages use pre-allocated + vport slots (that do not count toward thresholds). + When clear, single-segment messages must allocate + vport slots just like multi-segment messages do. */ + uint64_t reserved_20_30 : 11; + uint64_t buf_thr : 4; /**< Sets number of vports to be buffered by this + interface. BUF_THR must not be zero when receiving + messages. The max BUF_THR value is 8. + Recommend BUF_THR values 1-4. If the 46 available + vports are not statically-allocated across the two + SRIO's, smaller BUF_THR values may leave more + vports available for the other SRIO. Lack of a + buffered vport can force a retry for a received + first segment, so, particularly if SP_VPORT=0 + (which is not recommended) or the segment size is + small, larger BUF_THR values may improve + performance. */ + uint64_t reserved_14_15 : 2; + uint64_t max_p1 : 6; /**< Sets max number of open vports in port 1 */ + uint64_t reserved_6_7 : 2; + uint64_t max_p0 : 6; /**< Sets max number of open vports in port 0 */ +#else + uint64_t max_p0 : 6; + uint64_t reserved_6_7 : 2; + uint64_t max_p1 : 6; + uint64_t reserved_14_15 : 2; + uint64_t buf_thr : 4; + uint64_t reserved_20_30 : 11; + uint64_t sp_vport : 1; + uint64_t max_s0 : 6; + uint64_t reserved_38_39 : 2; + uint64_t max_s1 : 6; + uint64_t reserved_46_47 : 2; + uint64_t max_tot : 6; + uint64_t reserved_54_63 : 10; +#endif + } s; + struct cvmx_sriox_imsg_vport_thr_s cn63xx; + struct cvmx_sriox_imsg_vport_thr_s cn63xxp1; +}; +typedef union cvmx_sriox_imsg_vport_thr cvmx_sriox_imsg_vport_thr_t; + +/** + * cvmx_srio#_int2_enable + * + * SRIO_INT2_ENABLE = SRIO Interrupt 2 Enable (Pass 2) + * + * Allows SRIO to generate additional interrupts when corresponding enable bit is set. + * + * Notes: + * This register enables interrupts in SRIO(0..1)_INT2_REG that can be asserted while the MAC is in reset. + * The register can be accessed/modified regardless of the value of SRIO(0..1)_STATUS_REG.ACCESS. + * + * Clk_Rst: SRIO(0..1)_INT2_ENABLE sclk srst_n + */ +union cvmx_sriox_int2_enable +{ + uint64_t u64; + struct cvmx_sriox_int2_enable_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_1_63 : 63; + uint64_t pko_rst : 1; /**< PKO Reset Error Enable */ +#else + uint64_t pko_rst : 1; + uint64_t reserved_1_63 : 63; +#endif + } s; + struct cvmx_sriox_int2_enable_s cn63xx; +}; +typedef union cvmx_sriox_int2_enable cvmx_sriox_int2_enable_t; + +/** + * cvmx_srio#_int2_reg + * + * SRIO_INT2_REG = SRIO Interrupt 2 Register (Pass 2) + * + * Displays and clears which enabled interrupts have occured + * + * Notes: + * This register provides interrupt status. Unlike SRIO*_INT_REG, SRIO*_INT2_REG can be accessed + * whenever the SRIO is present, regardless of whether the corresponding SRIO is in reset or not. + * INT_SUM shows the status of the interrupts in SRIO(0..1)_INT_REG. Any set bits written to this + * register clear the corresponding interrupt. The register can be accessed/modified regardless of + * the value of SRIO(0..1)_STATUS_REG.ACCESS and probably should be the first register read when an SRIO + * interrupt occurs. + * + * Clk_Rst: SRIO(0..1)_INT2_REG sclk srst_n + */ +union cvmx_sriox_int2_reg +{ + uint64_t u64; + struct cvmx_sriox_int2_reg_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_32_63 : 32; + uint64_t int_sum : 1; /**< Interrupt Set and Enabled in SRIO(0..1)_INT_REG */ + uint64_t reserved_1_30 : 30; + uint64_t pko_rst : 1; /**< PKO Reset Error - Message Received from PKO while + MAC in reset. */ +#else + uint64_t pko_rst : 1; + uint64_t reserved_1_30 : 30; + uint64_t int_sum : 1; + uint64_t reserved_32_63 : 32; +#endif + } s; + struct cvmx_sriox_int2_reg_s cn63xx; +}; +typedef union cvmx_sriox_int2_reg cvmx_sriox_int2_reg_t; + +/** + * cvmx_srio#_int_enable + * + * SRIO_INT_ENABLE = SRIO Interrupt Enable + * + * Allows SRIO to generate interrupts when corresponding enable bit is set. + * + * Notes: + * This register enables interrupts. + * + * Clk_Rst: SRIO(0..1)_INT_ENABLE hclk hrst_n + */ +union cvmx_sriox_int_enable +{ + uint64_t u64; + struct cvmx_sriox_int_enable_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_26_63 : 38; + uint64_t ttl_tout : 1; /**< Outgoing Packet Time to Live Timeout (Pass 2) */ + uint64_t fail : 1; /**< ERB Error Rate reached Fail Count (Pass 2) */ + uint64_t degrade : 1; /**< ERB Error Rate reached Degrade Count (Pass 2) */ + uint64_t mac_buf : 1; /**< SRIO MAC Buffer CRC Error (Pass 2) */ + uint64_t f_error : 1; /**< SRIO Fatal Port Error (MAC reset required) */ + uint64_t rtry_err : 1; /**< Outbound Message Retry Threshold Exceeded */ + uint64_t pko_err : 1; /**< Outbound Message Received PKO Error */ + uint64_t omsg_err : 1; /**< Outbound Message Invalid Descriptor Error */ + uint64_t omsg1 : 1; /**< Controller 1 Outbound Message Complete */ + uint64_t omsg0 : 1; /**< Controller 0 Outbound Message Complete */ + uint64_t link_up : 1; /**< Serial Link going from Inactive to Active */ + uint64_t link_dwn : 1; /**< Serial Link going from Active to Inactive */ + uint64_t phy_erb : 1; /**< Physical Layer Error detected in ERB */ + uint64_t log_erb : 1; /**< Logical/Transport Layer Error detected in ERB */ + uint64_t soft_rx : 1; /**< Incoming Packet received by Soft Packet FIFO */ + uint64_t soft_tx : 1; /**< Outgoing Packet sent by Soft Packet FIFO */ + uint64_t mce_rx : 1; /**< Incoming Multicast Event Symbol */ + uint64_t mce_tx : 1; /**< Outgoing Multicast Event Transmit Complete */ + uint64_t wr_done : 1; /**< Outgoing Last Nwrite_R DONE Response Received. */ + uint64_t sli_err : 1; /**< Unsupported S2M Transaction Received. */ + uint64_t deny_wr : 1; /**< Incoming Maint_Wr Access to Denied Bar Registers. */ + uint64_t bar_err : 1; /**< Incoming Access Crossing/Missing BAR Address */ + uint64_t maint_op : 1; /**< Internal Maintenance Operation Complete. */ + uint64_t rxbell : 1; /**< One or more Incoming Doorbells Received. */ + uint64_t bell_err : 1; /**< Outgoing Doorbell Timeout, Retry or Error. */ + uint64_t txbell : 1; /**< Outgoing Doorbell Complete. */ +#else + uint64_t txbell : 1; + uint64_t bell_err : 1; + uint64_t rxbell : 1; + uint64_t maint_op : 1; + uint64_t bar_err : 1; + uint64_t deny_wr : 1; + uint64_t sli_err : 1; + uint64_t wr_done : 1; + uint64_t mce_tx : 1; + uint64_t mce_rx : 1; + uint64_t soft_tx : 1; + uint64_t soft_rx : 1; + uint64_t log_erb : 1; + uint64_t phy_erb : 1; + uint64_t link_dwn : 1; + uint64_t link_up : 1; + uint64_t omsg0 : 1; + uint64_t omsg1 : 1; + uint64_t omsg_err : 1; + uint64_t pko_err : 1; + uint64_t rtry_err : 1; + uint64_t f_error : 1; + uint64_t mac_buf : 1; + uint64_t degrade : 1; + uint64_t fail : 1; + uint64_t ttl_tout : 1; + uint64_t reserved_26_63 : 38; +#endif + } s; + struct cvmx_sriox_int_enable_s cn63xx; + struct cvmx_sriox_int_enable_cn63xxp1 + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_22_63 : 42; + uint64_t f_error : 1; /**< SRIO Fatal Port Error (MAC reset required) */ + uint64_t rtry_err : 1; /**< Outbound Message Retry Threshold Exceeded */ + uint64_t pko_err : 1; /**< Outbound Message Received PKO Error */ + uint64_t omsg_err : 1; /**< Outbound Message Invalid Descriptor Error */ + uint64_t omsg1 : 1; /**< Controller 1 Outbound Message Complete */ + uint64_t omsg0 : 1; /**< Controller 0 Outbound Message Complete */ + uint64_t link_up : 1; /**< Serial Link going from Inactive to Active */ + uint64_t link_dwn : 1; /**< Serial Link going from Active to Inactive */ + uint64_t phy_erb : 1; /**< Physical Layer Error detected in ERB */ + uint64_t log_erb : 1; /**< Logical/Transport Layer Error detected in ERB */ + uint64_t soft_rx : 1; /**< Incoming Packet received by Soft Packet FIFO */ + uint64_t soft_tx : 1; /**< Outgoing Packet sent by Soft Packet FIFO */ + uint64_t mce_rx : 1; /**< Incoming Multicast Event Symbol */ + uint64_t mce_tx : 1; /**< Outgoing Multicast Event Transmit Complete */ + uint64_t wr_done : 1; /**< Outgoing Last Nwrite_R DONE Response Received. */ + uint64_t sli_err : 1; /**< Unsupported S2M Transaction Received. */ + uint64_t deny_wr : 1; /**< Incoming Maint_Wr Access to Denied Bar Registers. */ + uint64_t bar_err : 1; /**< Incoming Access Crossing/Missing BAR Address */ + uint64_t maint_op : 1; /**< Internal Maintenance Operation Complete. */ + uint64_t rxbell : 1; /**< One or more Incoming Doorbells Received. */ + uint64_t bell_err : 1; /**< Outgoing Doorbell Timeout, Retry or Error. */ + uint64_t txbell : 1; /**< Outgoing Doorbell Complete. */ +#else + uint64_t txbell : 1; + uint64_t bell_err : 1; + uint64_t rxbell : 1; + uint64_t maint_op : 1; + uint64_t bar_err : 1; + uint64_t deny_wr : 1; + uint64_t sli_err : 1; + uint64_t wr_done : 1; + uint64_t mce_tx : 1; + uint64_t mce_rx : 1; + uint64_t soft_tx : 1; + uint64_t soft_rx : 1; + uint64_t log_erb : 1; + uint64_t phy_erb : 1; + uint64_t link_dwn : 1; + uint64_t link_up : 1; + uint64_t omsg0 : 1; + uint64_t omsg1 : 1; + uint64_t omsg_err : 1; + uint64_t pko_err : 1; + uint64_t rtry_err : 1; + uint64_t f_error : 1; + uint64_t reserved_22_63 : 42; +#endif + } cn63xxp1; +}; +typedef union cvmx_sriox_int_enable cvmx_sriox_int_enable_t; + +/** + * cvmx_srio#_int_info0 + * + * SRIO_INT_INFO0 = SRIO Interrupt Information + * + * The SRIO Interrupt Information + * + * Notes: + * This register contains the first header word of the illegal s2m transaction associated with the + * SLI_ERR interrupt. The remaining information is located in SRIO(0..1)_INT_INFO1. This register is + * only updated when the SLI_ERR is initially detected. Once the interrupt is cleared then + * additional information can be captured. + * Common Errors Include: + * 1. Load/Stores with Length over 32 + * 2. Load/Stores that translate to Maintenance Ops with a length over 8 + * 3. Load Ops that translate to Atomic Ops with other than 1, 2 and 4 byte accesses + * 4. Load/Store Ops with a Length 0 + * 5. Unexpected Responses + * + * Clk_Rst: SRIO(0..1)_INT_REG hclk hrst_n + */ +union cvmx_sriox_int_info0 +{ + uint64_t u64; + struct cvmx_sriox_int_info0_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t cmd : 4; /**< Command + 0 = Load, Outgoing Read Request + 4 = Store, Outgoing Write Request + 8 = Response, Outgoing Read Response + All Others are reserved and generate errors */ + uint64_t type : 4; /**< Command Type + Load/Store SRIO_S2M_TYPE used + Response (Reserved) */ + uint64_t tag : 8; /**< Internal Transaction Number */ + uint64_t reserved_42_47 : 6; + uint64_t length : 10; /**< Data Length in 64-bit Words (Load/Store Only) */ + uint64_t status : 3; /**< Response Status + 0 = Success + 1 = Error + All others reserved */ + uint64_t reserved_16_28 : 13; + uint64_t be0 : 8; /**< First 64-bit Word Byte Enables (Load/Store Only) */ + uint64_t be1 : 8; /**< Last 64-bit Word Byte Enables (Load/Store Only) */ +#else + uint64_t be1 : 8; + uint64_t be0 : 8; + uint64_t reserved_16_28 : 13; + uint64_t status : 3; + uint64_t length : 10; + uint64_t reserved_42_47 : 6; + uint64_t tag : 8; + uint64_t type : 4; + uint64_t cmd : 4; +#endif + } s; + struct cvmx_sriox_int_info0_s cn63xx; + struct cvmx_sriox_int_info0_s cn63xxp1; +}; +typedef union cvmx_sriox_int_info0 cvmx_sriox_int_info0_t; + +/** + * cvmx_srio#_int_info1 + * + * SRIO_INT_INFO1 = SRIO Interrupt Information + * + * The SRIO Interrupt Information + * + * Notes: + * This register contains the second header word of the illegal s2m transaction associated with the + * SLI_ERR interrupt. The remaining information is located in SRIO(0..1)_INT_INFO0. This register is + * only updated when the SLI_ERR is initially detected. Once the interrupt is cleared then + * additional information can be captured. + * + * Clk_Rst: SRIO(0..1)_INT_REG hclk hrst_n + */ +union cvmx_sriox_int_info1 +{ + uint64_t u64; + struct cvmx_sriox_int_info1_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t info1 : 64; /**< Address (Load/Store) or First 64-bit Word of + Response Data Associated with Interrupt */ +#else + uint64_t info1 : 64; +#endif + } s; + struct cvmx_sriox_int_info1_s cn63xx; + struct cvmx_sriox_int_info1_s cn63xxp1; +}; +typedef union cvmx_sriox_int_info1 cvmx_sriox_int_info1_t; + +/** + * cvmx_srio#_int_info2 + * + * SRIO_INT_INFO2 = SRIO Interrupt Information + * + * The SRIO Interrupt Information + * + * Notes: + * This register contains the invalid outbound message descriptor associated with the OMSG_ERR + * interrupt. This register is only updated when the OMSG_ERR is initially detected. Once the + * interrupt is cleared then additional information can be captured. + * + * Clk_Rst: SRIO(0..1)_INT_REG hclk hrst_n + */ +union cvmx_sriox_int_info2 +{ + uint64_t u64; + struct cvmx_sriox_int_info2_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t prio : 2; /**< PRIO field of outbound message descriptor + associated with the OMSG_ERR interrupt */ + uint64_t tt : 1; /**< TT field of outbound message descriptor + associated with the OMSG_ERR interrupt */ + uint64_t sis : 1; /**< SIS field of outbound message descriptor + associated with the OMSG_ERR interrupt */ + uint64_t ssize : 4; /**< SSIZE field of outbound message descriptor + associated with the OMSG_ERR interrupt */ + uint64_t did : 16; /**< DID field of outbound message descriptor + associated with the OMSG_ERR interrupt */ + uint64_t xmbox : 4; /**< XMBOX field of outbound message descriptor + associated with the OMSG_ERR interrupt */ + uint64_t mbox : 2; /**< MBOX field of outbound message descriptor + associated with the OMSG_ERR interrupt */ + uint64_t letter : 2; /**< LETTER field of outbound message descriptor + associated with the OMSG_ERR interrupt */ + uint64_t rsrvd : 30; /**< RSRVD field of outbound message descriptor + associated with the OMSG_ERR interrupt */ + uint64_t lns : 1; /**< LNS field of outbound message descriptor + associated with the OMSG_ERR interrupt */ + uint64_t intr : 1; /**< INT field of outbound message descriptor + associated with the OMSG_ERR interrupt */ +#else + uint64_t intr : 1; + uint64_t lns : 1; + uint64_t rsrvd : 30; + uint64_t letter : 2; + uint64_t mbox : 2; + uint64_t xmbox : 4; + uint64_t did : 16; + uint64_t ssize : 4; + uint64_t sis : 1; + uint64_t tt : 1; + uint64_t prio : 2; +#endif + } s; + struct cvmx_sriox_int_info2_s cn63xx; + struct cvmx_sriox_int_info2_s cn63xxp1; +}; +typedef union cvmx_sriox_int_info2 cvmx_sriox_int_info2_t; + +/** + * cvmx_srio#_int_info3 + * + * SRIO_INT_INFO3 = SRIO Interrupt Information + * + * The SRIO Interrupt Information + * + * Notes: + * This register contains the retry response associated with the RTRY_ERR interrupt. This register + * is only updated when the RTRY_ERR is initially detected. Once the interrupt is cleared then + * additional information can be captured. + * + * Clk_Rst: SRIO(0..1)_INT_REG hclk hrst_n + */ +union cvmx_sriox_int_info3 +{ + uint64_t u64; + struct cvmx_sriox_int_info3_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t prio : 2; /**< Priority of received retry response message */ + uint64_t tt : 2; /**< TT of received retry response message */ + uint64_t type : 4; /**< Type of received retry response message + (should be 13) */ + uint64_t other : 48; /**< Other fields of received retry response message + If TT==0 (8-bit ID's) + OTHER<47:40> => destination ID + OTHER<39:32> => source ID + OTHER<31:28> => transaction (should be 1 - msg) + OTHER<27:24> => status (should be 3 - retry) + OTHER<23:22> => letter + OTHER<21:20> => mbox + OTHER<19:16> => msgseg + OTHER<15:0> => unused + If TT==1 (16-bit ID's) + OTHER<47:32> => destination ID + OTHER<31:16> => source ID + OTHER<15:12> => transaction (should be 1 - msg) + OTHER<11:8> => status (should be 3 - retry) + OTHER<7:6> => letter + OTHER<5:4> => mbox + OTHER<3:0> => msgseg */ + uint64_t reserved_0_7 : 8; +#else + uint64_t reserved_0_7 : 8; + uint64_t other : 48; + uint64_t type : 4; + uint64_t tt : 2; + uint64_t prio : 2; +#endif + } s; + struct cvmx_sriox_int_info3_s cn63xx; + struct cvmx_sriox_int_info3_s cn63xxp1; +}; +typedef union cvmx_sriox_int_info3 cvmx_sriox_int_info3_t; + +/** + * cvmx_srio#_int_reg + * + * SRIO_INT_REG = SRIO Interrupt Register + * + * Displays and clears which enabled interrupts have occured + * + * Notes: + * This register provides interrupt status. Like most SRIO CSRs, this register can only + * be read/written when the corresponding SRIO is both present and not in reset. (SRIO*_INT2_REG + * can be accessed when SRIO is in reset.) Any set bits written to this register clear the + * corresponding interrupt. The RXBELL interrupt is cleared by reading all the entries in the + * incoming Doorbell FIFO. The LOG_ERB interrupt must be cleared before writing zeroes + * to clear the bits in the SRIOMAINT*_ERB_LT_ERR_DET register. Otherwise a new interrupt may be + * lost. The PHY_ERB interrupt must be cleared before writing a zero to + * SRIOMAINT*_ERB_ATTR_CAPT[VALID]. Otherwise, a new interrupt may be lost. OMSG_ERR is set when an + * invalid outbound message descriptor is received. The descriptor is deemed to be invalid if the + * SSIZE field is set to a reserved value, the SSIZE field combined with the packet length would + * result in more than 16 message segments, or the packet only contains a descriptor (no data). + * + * Clk_Rst: SRIO(0..1)_INT_REG hclk hrst_n + */ +union cvmx_sriox_int_reg +{ + uint64_t u64; + struct cvmx_sriox_int_reg_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_32_63 : 32; + uint64_t int2_sum : 1; /**< Interrupt Set and Enabled in SRIO(0..1)_INT2_REG + (Pass 2) */ + uint64_t reserved_26_30 : 5; + uint64_t ttl_tout : 1; /**< Outgoing Packet Time to Live Timeout (Pass 2) + See SRIOMAINT(0..1)_DROP_PACKET */ + uint64_t fail : 1; /**< ERB Error Rate reached Fail Count (Pass 2) + See SRIOMAINT(0..1)_ERB_ERR_RATE */ + uint64_t degrad : 1; /**< ERB Error Rate reached Degrade Count (Pass 2) + See SRIOMAINT(0..1)_ERB_ERR_RATE */ + uint64_t mac_buf : 1; /**< SRIO MAC Buffer CRC Error (Pass 2) + See SRIO(0..1)_MAC_BUFFERS */ + uint64_t f_error : 1; /**< SRIO Fatal Port Error (MAC reset required) */ + uint64_t rtry_err : 1; /**< Outbound Message Retry Threshold Exceeded + See SRIO(0..1)_INT_INFO3 + When one or more of the segments in an outgoing + message have a RTRY_ERR, SRIO will not set + OMSG* after the message "transfer". */ + uint64_t pko_err : 1; /**< Outbound Message Received PKO Error */ + uint64_t omsg_err : 1; /**< Outbound Message Invalid Descriptor Error + See SRIO(0..1)_INT_INFO2 */ + uint64_t omsg1 : 1; /**< Controller 1 Outbound Message Complete */ + uint64_t omsg0 : 1; /**< Controller 0 Outbound Message Complete */ + uint64_t link_up : 1; /**< Serial Link going from Inactive to Active */ + uint64_t link_dwn : 1; /**< Serial Link going from Active to Inactive */ + uint64_t phy_erb : 1; /**< Physical Layer Error detected in ERB + See SRIOMAINT*_ERB_ATTR_CAPT */ + uint64_t log_erb : 1; /**< Logical/Transport Layer Error detected in ERB + See SRIOMAINT(0..1)_ERB_LT_ERR_DET */ + uint64_t soft_rx : 1; /**< Incoming Packet received by Soft Packet FIFO */ + uint64_t soft_tx : 1; /**< Outgoing Packet sent by Soft Packet FIFO */ + uint64_t mce_rx : 1; /**< Incoming Multicast Event Symbol */ + uint64_t mce_tx : 1; /**< Outgoing Multicast Event Transmit Complete */ + uint64_t wr_done : 1; /**< Outgoing Last Nwrite_R DONE Response Received. */ + uint64_t sli_err : 1; /**< Unsupported S2M Transaction Received. + See SRIO(0..1)_INT_INFO[1:0] */ + uint64_t deny_wr : 1; /**< Incoming Maint_Wr Access to Denied Bar Registers. */ + uint64_t bar_err : 1; /**< Incoming Access Crossing/Missing BAR Address */ + uint64_t maint_op : 1; /**< Internal Maintenance Operation Complete. + See SRIO(0..1)_MAINT_OP and SRIO(0..1)_MAINT_RD_DATA */ + uint64_t rxbell : 1; /**< One or more Incoming Doorbells Received. + Read SRIO(0..1)_RX_BELL to empty FIFO */ + uint64_t bell_err : 1; /**< Outgoing Doorbell Timeout, Retry or Error. + See SRIO(0..1)_TX_BELL_INFO */ + uint64_t txbell : 1; /**< Outgoing Doorbell Complete. + TXBELL will not be asserted if a Timeout, Retry or + Error occurs. */ +#else + uint64_t txbell : 1; + uint64_t bell_err : 1; + uint64_t rxbell : 1; + uint64_t maint_op : 1; + uint64_t bar_err : 1; + uint64_t deny_wr : 1; + uint64_t sli_err : 1; + uint64_t wr_done : 1; + uint64_t mce_tx : 1; + uint64_t mce_rx : 1; + uint64_t soft_tx : 1; + uint64_t soft_rx : 1; + uint64_t log_erb : 1; + uint64_t phy_erb : 1; + uint64_t link_dwn : 1; + uint64_t link_up : 1; + uint64_t omsg0 : 1; + uint64_t omsg1 : 1; + uint64_t omsg_err : 1; + uint64_t pko_err : 1; + uint64_t rtry_err : 1; + uint64_t f_error : 1; + uint64_t mac_buf : 1; + uint64_t degrad : 1; + uint64_t fail : 1; + uint64_t ttl_tout : 1; + uint64_t reserved_26_30 : 5; + uint64_t int2_sum : 1; + uint64_t reserved_32_63 : 32; +#endif + } s; + struct cvmx_sriox_int_reg_s cn63xx; + struct cvmx_sriox_int_reg_cn63xxp1 + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_22_63 : 42; + uint64_t f_error : 1; /**< SRIO Fatal Port Error (MAC reset required) */ + uint64_t rtry_err : 1; /**< Outbound Message Retry Threshold Exceeded + See SRIO(0..1)_INT_INFO3 + When one or more of the segments in an outgoing + message have a RTRY_ERR, SRIO will not set + OMSG* after the message "transfer". */ + uint64_t pko_err : 1; /**< Outbound Message Received PKO Error */ + uint64_t omsg_err : 1; /**< Outbound Message Invalid Descriptor Error + See SRIO(0..1)_INT_INFO2 */ + uint64_t omsg1 : 1; /**< Controller 1 Outbound Message Complete */ + uint64_t omsg0 : 1; /**< Controller 0 Outbound Message Complete */ + uint64_t link_up : 1; /**< Serial Link going from Inactive to Active */ + uint64_t link_dwn : 1; /**< Serial Link going from Active to Inactive */ + uint64_t phy_erb : 1; /**< Physical Layer Error detected in ERB + See SRIOMAINT*_ERB_ATTR_CAPT */ + uint64_t log_erb : 1; /**< Logical/Transport Layer Error detected in ERB + See SRIOMAINT(0..1)_ERB_LT_ERR_DET */ + uint64_t soft_rx : 1; /**< Incoming Packet received by Soft Packet FIFO */ + uint64_t soft_tx : 1; /**< Outgoing Packet sent by Soft Packet FIFO */ + uint64_t mce_rx : 1; /**< Incoming Multicast Event Symbol */ + uint64_t mce_tx : 1; /**< Outgoing Multicast Event Transmit Complete */ + uint64_t wr_done : 1; /**< Outgoing Last Nwrite_R DONE Response Received. */ + uint64_t sli_err : 1; /**< Unsupported S2M Transaction Received. + See SRIO(0..1)_INT_INFO[1:0] */ + uint64_t deny_wr : 1; /**< Incoming Maint_Wr Access to Denied Bar Registers. */ + uint64_t bar_err : 1; /**< Incoming Access Crossing/Missing BAR Address */ + uint64_t maint_op : 1; /**< Internal Maintenance Operation Complete. + See SRIO(0..1)_MAINT_OP and SRIO(0..1)_MAINT_RD_DATA */ + uint64_t rxbell : 1; /**< One or more Incoming Doorbells Received. + Read SRIO(0..1)_RX_BELL to empty FIFO */ + uint64_t bell_err : 1; /**< Outgoing Doorbell Timeout, Retry or Error. + See SRIO(0..1)_TX_BELL_INFO */ + uint64_t txbell : 1; /**< Outgoing Doorbell Complete. + TXBELL will not be asserted if a Timeout, Retry or + Error occurs. */ +#else + uint64_t txbell : 1; + uint64_t bell_err : 1; + uint64_t rxbell : 1; + uint64_t maint_op : 1; + uint64_t bar_err : 1; + uint64_t deny_wr : 1; + uint64_t sli_err : 1; + uint64_t wr_done : 1; + uint64_t mce_tx : 1; + uint64_t mce_rx : 1; + uint64_t soft_tx : 1; + uint64_t soft_rx : 1; + uint64_t log_erb : 1; + uint64_t phy_erb : 1; + uint64_t link_dwn : 1; + uint64_t link_up : 1; + uint64_t omsg0 : 1; + uint64_t omsg1 : 1; + uint64_t omsg_err : 1; + uint64_t pko_err : 1; + uint64_t rtry_err : 1; + uint64_t f_error : 1; + uint64_t reserved_22_63 : 42; +#endif + } cn63xxp1; +}; +typedef union cvmx_sriox_int_reg cvmx_sriox_int_reg_t; + +/** + * cvmx_srio#_ip_feature + * + * SRIO_IP_FEATURE = SRIO IP Feature Select + * + * Debug Register used to enable IP Core Features + * + * Notes: + * This register is used to override powerup values used by the SRIOMAINT Registers and QLM + * configuration. The register is only reset during COLD boot. It should only be modified only + * while SRIO(0..1)_STATUS_REG.ACCESS is zero. + * + * Clk_Rst: SRIO(0..1)_IP_FEATURE sclk srst_cold_n + */ +union cvmx_sriox_ip_feature +{ + uint64_t u64; + struct cvmx_sriox_ip_feature_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t ops : 32; /**< Reset Value for the OPs fields in both the + SRIOMAINT(0..1)_SRC_OPS and SRIOMAINT(0..1)_DST_OPS + registers. */ + uint64_t reserved_14_31 : 18; + uint64_t a66 : 1; /**< 66-bit Address Support. Value for bit 2 of the + EX_ADDR field in the SRIOMAINT(0..1)_PE_FEAT register. */ + uint64_t a50 : 1; /**< 50-bit Address Support. Value for bit 1 of the + EX_ADDR field in the SRIOMAINT(0..1)_PE_FEAT register. */ + uint64_t reserved_11_11 : 1; + uint64_t tx_flow : 1; /**< Reset Value for the TX_FLOW field in the + SRIOMAINT(0..1)_IR_BUFFER_CONFIG register. */ + uint64_t pt_width : 2; /**< Value for the PT_WIDTH field in the + SRIOMAINT(0..1)_PORT_0_CTL register. */ + uint64_t tx_pol : 4; /**< TX Serdes Polarity Lanes 3-0 + 0 = Normal Operation + 1 = Invert, Swap +/- Tx SERDES Pins */ + uint64_t rx_pol : 4; /**< RX Serdes Polarity Lanes 3-0 + 0 = Normal Operation + 1 = Invert, Swap +/- Rx SERDES Pins */ +#else + uint64_t rx_pol : 4; + uint64_t tx_pol : 4; + uint64_t pt_width : 2; + uint64_t tx_flow : 1; + uint64_t reserved_11_11 : 1; + uint64_t a50 : 1; + uint64_t a66 : 1; + uint64_t reserved_14_31 : 18; + uint64_t ops : 32; +#endif + } s; + struct cvmx_sriox_ip_feature_s cn63xx; + struct cvmx_sriox_ip_feature_s cn63xxp1; +}; +typedef union cvmx_sriox_ip_feature cvmx_sriox_ip_feature_t; + +/** + * cvmx_srio#_mac_buffers + * + * SRIO_MAC_BUFFERS = SRIO MAC Buffer Control (Pass 2) + * + * Reports errors and controls buffer usage on the main MAC buffers + * + * Notes: + * Register displays errors status for each of the eight RX and TX buffers and controls use of the + * buffer in future operations. It also displays the number of RX and TX buffers currently used by + * the MAC. + * + * Clk_Rst: SRIO(0..1)_MAC_BUFFERS hclk hrst_n + */ +union cvmx_sriox_mac_buffers +{ + uint64_t u64; + struct cvmx_sriox_mac_buffers_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_56_63 : 8; + uint64_t tx_enb : 8; /**< TX Buffer Enable. Each bit enables a specific TX + Buffer. At least 2 of these bits must be set for + proper operation. These bits must be cleared to + and then set again to reuese the buffer after an + error occurs. */ + uint64_t reserved_44_47 : 4; + uint64_t tx_inuse : 4; /**< Number of TX buffers containing packets waiting + to be transmitted or to be acknowledged. */ + uint64_t tx_stat : 8; /**< Errors detected in main SRIO Transmit Buffers. + CRC error detected in buffer sets bit of buffer \# + until the corresponding TX_ENB is disabled. Each + bit set causes the SRIO(0..1)_INT_REG.MAC_BUF + interrupt. */ + uint64_t reserved_24_31 : 8; + uint64_t rx_enb : 8; /**< RX Buffer Enable. Each bit enables a specific RX + Buffer. At least 2 of these bits must be set for + proper operation. These bits must be cleared to + and then set again to reuese the buffer after an + error occurs. */ + uint64_t reserved_12_15 : 4; + uint64_t rx_inuse : 4; /**< Number of RX buffers containing valid packets + waiting to be processed by the logical layer. */ + uint64_t rx_stat : 8; /**< Errors detected in main SRIO Receive Buffers. CRC + error detected in buffer sets bit of buffer \# + until the corresponding RX_ENB is disabled. Each + bit set causes the SRIO(0..1)_INT_REG.MAC_BUF + interrupt. */ +#else + uint64_t rx_stat : 8; + uint64_t rx_inuse : 4; + uint64_t reserved_12_15 : 4; + uint64_t rx_enb : 8; + uint64_t reserved_24_31 : 8; + uint64_t tx_stat : 8; + uint64_t tx_inuse : 4; + uint64_t reserved_44_47 : 4; + uint64_t tx_enb : 8; + uint64_t reserved_56_63 : 8; +#endif + } s; + struct cvmx_sriox_mac_buffers_s cn63xx; +}; +typedef union cvmx_sriox_mac_buffers cvmx_sriox_mac_buffers_t; + +/** + * cvmx_srio#_maint_op + * + * SRIO_MAINT_OP = SRIO Maintenance Operation + * + * Allows access to maintenance registers. + * + * Notes: + * This register allows write access to the local SRIOMAINT registers. A write to this register + * posts a read or write operation selected by the OP bit to the local SRIOMAINT register selected by + * ADDR. This write also sets the PENDING bit. The PENDING bit is cleared by hardware when the + * operation is complete. The MAINT_OP Interrupt is also set as the PENDING bit is cleared. While + * this bit is set, additional writes to this register stall the RSL. The FAIL bit is set with the + * clearing of the PENDING bit when an illegal address is selected. WR_DATA is used only during write + * operations. Only 32-bit Maintenance Operations are supported. + * + * Clk_Rst: SRIO(0..1)_MAINT_OP hclk hrst_n + */ +union cvmx_sriox_maint_op +{ + uint64_t u64; + struct cvmx_sriox_maint_op_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t wr_data : 32; /**< Write Data[31:0]. */ + uint64_t reserved_27_31 : 5; + uint64_t fail : 1; /**< Maintenance Operation Address Error */ + uint64_t pending : 1; /**< Maintenance Operation Pending */ + uint64_t op : 1; /**< Operation. 0=Read, 1=Write */ + uint64_t addr : 24; /**< Address. Addr[1:0] are ignored. */ +#else + uint64_t addr : 24; + uint64_t op : 1; + uint64_t pending : 1; + uint64_t fail : 1; + uint64_t reserved_27_31 : 5; + uint64_t wr_data : 32; +#endif + } s; + struct cvmx_sriox_maint_op_s cn63xx; + struct cvmx_sriox_maint_op_s cn63xxp1; +}; +typedef union cvmx_sriox_maint_op cvmx_sriox_maint_op_t; + +/** + * cvmx_srio#_maint_rd_data + * + * SRIO_MAINT_RD_DATA = SRIO Maintenance Read Data + * + * Allows read access of maintenance registers. + * + * Notes: + * This register allows read access of the local SRIOMAINT registers. A write to the SRIO(0..1)_MAINT_OP + * register with the OP bit set to zero initiates a read request and clears the VALID bit. The + * resulting read is returned here and the VALID bit is set. Access to the register will not stall + * the RSL but the VALID bit should be read. + * + * Clk_Rst: SRIO(0..1)_MAINT_RD_DATA hclk hrst_n + */ +union cvmx_sriox_maint_rd_data +{ + uint64_t u64; + struct cvmx_sriox_maint_rd_data_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_33_63 : 31; + uint64_t valid : 1; /**< Read Data Valid. */ + uint64_t rd_data : 32; /**< Read Data[31:0]. */ +#else + uint64_t rd_data : 32; + uint64_t valid : 1; + uint64_t reserved_33_63 : 31; +#endif + } s; + struct cvmx_sriox_maint_rd_data_s cn63xx; + struct cvmx_sriox_maint_rd_data_s cn63xxp1; +}; +typedef union cvmx_sriox_maint_rd_data cvmx_sriox_maint_rd_data_t; + +/** + * cvmx_srio#_mce_tx_ctl + * + * SRIO_MCE_TX_CTL = SRIO Multicast Event Transmit Control + * + * Multicast Event TX Control + * + * Notes: + * Writes to this register cause the SRIO device to generate a Multicast Event. Setting the MCE bit + * requests the logic to generate the Multicast Event Symbol. Reading the MCS bit shows the status + * of the transmit event. The hardware will clear the bit when the event has been transmitted and + * set the MCS_TX Interrupt. + * + * Clk_Rst: SRIO(0..1)_MCE_TX_CTL hclk hrst_n + */ +union cvmx_sriox_mce_tx_ctl +{ + uint64_t u64; + struct cvmx_sriox_mce_tx_ctl_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_1_63 : 63; + uint64_t mce : 1; /**< Multicast Event Transmit. */ +#else + uint64_t mce : 1; + uint64_t reserved_1_63 : 63; +#endif + } s; + struct cvmx_sriox_mce_tx_ctl_s cn63xx; + struct cvmx_sriox_mce_tx_ctl_s cn63xxp1; +}; +typedef union cvmx_sriox_mce_tx_ctl cvmx_sriox_mce_tx_ctl_t; + +/** + * cvmx_srio#_mem_op_ctrl + * + * SRIO_MEM_OP_CTRL = SRIO Memory Operation Control + * + * The SRIO Memory Operation Control + * + * Notes: + * This register is used to control memory operations. Bits are provided to override the priority of + * the outgoing responses to memory operations. The memory operations with responses include NREAD, + * NWRITE_R, ATOMIC_INC, ATOMIC_DEC, ATOMIC_SET and ATOMIC_CLR. + * + * Clk_Rst: SRIO(0..1)_MEM_OP_CTRL hclk hrst_n + */ +union cvmx_sriox_mem_op_ctrl +{ + uint64_t u64; + struct cvmx_sriox_mem_op_ctrl_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_10_63 : 54; + uint64_t rr_ro : 1; /**< Read Response Relaxed Ordering. Controls ordering + rules for incoming memory operations + 0 = Normal Ordering + 1 = Relaxed Ordering */ + uint64_t w_ro : 1; /**< Write Relaxed Ordering. Controls ordering rules + for incoming memory operations + 0 = Normal Ordering + 1 = Relaxed Ordering */ + uint64_t reserved_6_7 : 2; + uint64_t rp1_sid : 1; /**< Sets response priority for incomimg memory ops + of priority 1 on the secondary ID (0=2, 1=3) */ + uint64_t rp0_sid : 2; /**< Sets response priority for incomimg memory ops + of priority 0 on the secondary ID (0,1=1 2=2, 3=3) */ + uint64_t rp1_pid : 1; /**< Sets response priority for incomimg memory ops + of priority 1 on the primary ID (0=2, 1=3) */ + uint64_t rp0_pid : 2; /**< Sets response priority for incomimg memory ops + of priority 0 on the primary ID (0,1=1 2=2, 3=3) */ +#else + uint64_t rp0_pid : 2; + uint64_t rp1_pid : 1; + uint64_t rp0_sid : 2; + uint64_t rp1_sid : 1; + uint64_t reserved_6_7 : 2; + uint64_t w_ro : 1; + uint64_t rr_ro : 1; + uint64_t reserved_10_63 : 54; +#endif + } s; + struct cvmx_sriox_mem_op_ctrl_s cn63xx; + struct cvmx_sriox_mem_op_ctrl_s cn63xxp1; +}; +typedef union cvmx_sriox_mem_op_ctrl cvmx_sriox_mem_op_ctrl_t; + +/** + * cvmx_srio#_omsg_ctrl# + * + * SRIO_OMSG_CTRLX = SRIO Outbound Message Control + * + * The SRIO Controller X Outbound Message Control Register + * + * Notes: + * 1) If IDM_TT, IDM_SIS, and IDM_DID are all clear, then the "ID match" will always be false. + * 2) LTTR_SP and LTTR_MP must be non-zero at all times, otherwise the message output queue can + * get blocked + * 3) TESTMODE has no function on controller 1 + * 4) When IDM_TT=0, it is possible for an ID match to match an 8-bit DID with a 16-bit DID - SRIO + * zero-extends all 8-bit DID's, and the DID comparisons are always 16-bits. + * + * Clk_Rst: SRIO(0..1)_OMSG_CTRL[0:1] hclk hrst_n + */ +union cvmx_sriox_omsg_ctrlx +{ + uint64_t u64; + struct cvmx_sriox_omsg_ctrlx_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t testmode : 1; /**< Controller X test mode (keep as RSVD in HRM) */ + uint64_t reserved_37_62 : 26; + uint64_t silo_max : 5; /**< Sets max number outgoing segments for controller X + (Pass 2) */ + uint64_t rtry_thr : 16; /**< Controller X Retry threshold */ + uint64_t rtry_en : 1; /**< Controller X Retry threshold enable */ + uint64_t reserved_11_14 : 4; + uint64_t idm_tt : 1; /**< Controller X ID match includes TT ID */ + uint64_t idm_sis : 1; /**< Controller X ID match includes SIS */ + uint64_t idm_did : 1; /**< Controller X ID match includes DID */ + uint64_t lttr_sp : 4; /**< Controller X SP allowable letters in dynamic + letter select mode (LNS) */ + uint64_t lttr_mp : 4; /**< Controller X MP allowable letters in dynamic + letter select mode (LNS) */ +#else + uint64_t lttr_mp : 4; + uint64_t lttr_sp : 4; + uint64_t idm_did : 1; + uint64_t idm_sis : 1; + uint64_t idm_tt : 1; + uint64_t reserved_11_14 : 4; + uint64_t rtry_en : 1; + uint64_t rtry_thr : 16; + uint64_t silo_max : 5; + uint64_t reserved_37_62 : 26; + uint64_t testmode : 1; +#endif + } s; + struct cvmx_sriox_omsg_ctrlx_s cn63xx; + struct cvmx_sriox_omsg_ctrlx_cn63xxp1 + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t testmode : 1; /**< Controller X test mode (keep as RSVD in HRM) */ + uint64_t reserved_32_62 : 31; + uint64_t rtry_thr : 16; /**< Controller X Retry threshold */ + uint64_t rtry_en : 1; /**< Controller X Retry threshold enable */ + uint64_t reserved_11_14 : 4; + uint64_t idm_tt : 1; /**< Controller X ID match includes TT ID */ + uint64_t idm_sis : 1; /**< Controller X ID match includes SIS */ + uint64_t idm_did : 1; /**< Controller X ID match includes DID */ + uint64_t lttr_sp : 4; /**< Controller X SP allowable letters in dynamic + letter select mode (LNS) */ + uint64_t lttr_mp : 4; /**< Controller X MP allowable letters in dynamic + letter select mode (LNS) */ +#else + uint64_t lttr_mp : 4; + uint64_t lttr_sp : 4; + uint64_t idm_did : 1; + uint64_t idm_sis : 1; + uint64_t idm_tt : 1; + uint64_t reserved_11_14 : 4; + uint64_t rtry_en : 1; + uint64_t rtry_thr : 16; + uint64_t reserved_32_62 : 31; + uint64_t testmode : 1; +#endif + } cn63xxp1; +}; +typedef union cvmx_sriox_omsg_ctrlx cvmx_sriox_omsg_ctrlx_t; + +/** + * cvmx_srio#_omsg_done_counts# + * + * SRIO_OMSG_DONE_COUNTSX = SRIO Outbound Message Complete Counts (Pass 2) + * + * The SRIO Controller X Outbound Message Complete Counts Register + * + * Notes: + * This register shows the number of successful and unsuccessful Outgoing Messages issued through + * this controller. The only messages considered are the ones with the INT field set in the PKO + * message header. This register is typically not written while Outbound SRIO Memory traffic is + * enabled. The sum of the GOOD and BAD counts should equal the number of messages sent unless + * the MAC has been reset. + * + * Clk_Rst: SRIO(0..1)_OMSG_DONE_COUNTS[0:1] hclk hrst_n + */ +union cvmx_sriox_omsg_done_countsx +{ + uint64_t u64; + struct cvmx_sriox_omsg_done_countsx_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_32_63 : 32; + uint64_t bad : 16; /**< Number of Outbound Messages requesting an INT that + did not increment GOOD. (One or more segment of the + message either timed out, reached the retry limit, + or received an ERROR response.) */ + uint64_t good : 16; /**< Number of Outbound Messages requesting an INT that + received a DONE response for every segment. */ +#else + uint64_t good : 16; + uint64_t bad : 16; + uint64_t reserved_32_63 : 32; +#endif + } s; + struct cvmx_sriox_omsg_done_countsx_s cn63xx; +}; +typedef union cvmx_sriox_omsg_done_countsx cvmx_sriox_omsg_done_countsx_t; + +/** + * cvmx_srio#_omsg_fmp_mr# + * + * SRIO_OMSG_FMP_MRX = SRIO Outbound Message FIRSTMP Message Restriction + * + * The SRIO Controller X Outbound Message FIRSTMP Message Restriction Register + * + * Notes: + * This CSR controls when FMP candidate message segments (from the two different controllers) can enter + * the message segment silo to be sent out. A segment remains in the silo until after is has + * been transmitted and either acknowledged or errored out. + * + * Candidates and silo entries are one of 4 types: + * SP - a single-segment message + * FMP - the first segment of a multi-segment message + * NMP - the other segments in a multi-segment message + * PSD - the silo psuedo-entry that is valid only while a controller is in the middle of pushing + * a multi-segment message into the silo and can match against segments generated by + * the other controller + * + * When a candidate "matches" against a silo entry or pseudo entry, it cannot enter the silo. + * By default (i.e. zeroes in this CSR), the FMP candidate matches against all entries in the + * silo. When fields in this CSR are set, FMP candidate segments will match fewer silo entries and + * can enter the silo more freely, probably providing better performance. + * + * Clk_Rst: SRIO(0..1)_OMSG_FMP_MR[0:1] hclk hrst_n + */ +union cvmx_sriox_omsg_fmp_mrx +{ + uint64_t u64; + struct cvmx_sriox_omsg_fmp_mrx_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_15_63 : 49; + uint64_t ctlr_sp : 1; /**< Controller X FIRSTMP enable controller SP + When set, the FMP candidate message segment can + only match siloed SP segments that were created + by the same controller. When clear, this FMP-SP + match can also occur when the segments were + created by the other controller. + Not used by the hardware when ALL_SP is set. */ + uint64_t ctlr_fmp : 1; /**< Controller X FIRSTMP enable controller FIRSTMP + When set, the FMP candidate message segment can + only match siloed FMP segments that were created + by the same controller. When clear, this FMP-FMP + match can also occur when the segments were + created by the other controller. + Not used by the hardware when ALL_FMP is set. */ + uint64_t ctlr_nmp : 1; /**< Controller X FIRSTMP enable controller NFIRSTMP + When set, the FMP candidate message segment can + only match siloed NMP segments that were created + by the same controller. When clear, this FMP-NMP + match can also occur when the segments were + created by the other controller. + Not used by the hardware when ALL_NMP is set. */ + uint64_t id_sp : 1; /**< Controller X FIRSTMP enable ID SP + When set, the FMP candidate message segment can + only match siloed SP segments that "ID match" the + candidate. When clear, this FMP-SP match can occur + with any ID values. + Not used by the hardware when ALL_SP is set. */ + uint64_t id_fmp : 1; /**< Controller X FIRSTMP enable ID FIRSTMP + When set, the FMP candidate message segment can + only match siloed FMP segments that "ID match" the + candidate. When clear, this FMP-FMP match can occur + with any ID values. + Not used by the hardware when ALL_FMP is set. */ + uint64_t id_nmp : 1; /**< Controller X FIRSTMP enable ID NFIRSTMP + When set, the FMP candidate message segment can + only match siloed NMP segments that "ID match" the + candidate. When clear, this FMP-NMP match can occur + with any ID values. + Not used by the hardware when ALL_NMP is set. */ + uint64_t id_psd : 1; /**< Controller X FIRSTMP enable ID PSEUDO + When set, the FMP candidate message segment can + only match the silo pseudo (for the other + controller) when it is an "ID match". When clear, + this FMP-PSD match can occur with any ID values. + Not used by the hardware when ALL_PSD is set. */ + uint64_t mbox_sp : 1; /**< Controller X FIRSTMP enable MBOX SP + When set, the FMP candidate message segment can + only match siloed SP segments with the same 2-bit + mbox value as the candidate. When clear, this + FMP-SP match can occur with any mbox values. + Not used by the hardware when ALL_SP is set. */ + uint64_t mbox_fmp : 1; /**< Controller X FIRSTMP enable MBOX FIRSTMP + When set, the FMP candidate message segment can + only match siloed FMP segments with the same 2-bit + mbox value as the candidate. When clear, this + FMP-FMP match can occur with any mbox values. + Not used by the hardware when ALL_FMP is set. */ + uint64_t mbox_nmp : 1; /**< Controller X FIRSTMP enable MBOX NFIRSTMP + When set, the FMP candidate message segment can + only match siloed NMP segments with the same 2-bit + mbox value as the candidate. When clear, this + FMP-NMP match can occur with any mbox values. + Not used by the hardware when ALL_NMP is set. */ + uint64_t mbox_psd : 1; /**< Controller X FIRSTMP enable MBOX PSEUDO + When set, the FMP candidate message segment can + only match the silo pseudo (for the other + controller) if the pseudo has the same 2-bit mbox + value as the candidate. When clear, this FMP-PSD + match can occur with any mbox values. + Not used by the hardware when ALL_PSD is set. */ + uint64_t all_sp : 1; /**< Controller X FIRSTMP enable all SP + When set, no FMP candidate message segments ever + match siloed SP segments and ID_SP + and MBOX_SP are not used. When clear, FMP-SP + matches can occur. */ + uint64_t all_fmp : 1; /**< Controller X FIRSTMP enable all FIRSTMP + When set, no FMP candidate message segments ever + match siloed FMP segments and ID_FMP and MBOX_FMP + are not used. When clear, FMP-FMP matches can + occur. */ + uint64_t all_nmp : 1; /**< Controller X FIRSTMP enable all NFIRSTMP + When set, no FMP candidate message segments ever + match siloed NMP segments and ID_NMP and MBOX_NMP + are not used. When clear, FMP-NMP matches can + occur. */ + uint64_t all_psd : 1; /**< Controller X FIRSTMP enable all PSEUDO + When set, no FMP candidate message segments ever + match the silo pseudo (for the other controller) + and ID_PSD and MBOX_PSD are not used. When clear, + FMP-PSD matches can occur. */ +#else + uint64_t all_psd : 1; + uint64_t all_nmp : 1; + uint64_t all_fmp : 1; + uint64_t all_sp : 1; + uint64_t mbox_psd : 1; + uint64_t mbox_nmp : 1; + uint64_t mbox_fmp : 1; + uint64_t mbox_sp : 1; + uint64_t id_psd : 1; + uint64_t id_nmp : 1; + uint64_t id_fmp : 1; + uint64_t id_sp : 1; + uint64_t ctlr_nmp : 1; + uint64_t ctlr_fmp : 1; + uint64_t ctlr_sp : 1; + uint64_t reserved_15_63 : 49; +#endif + } s; + struct cvmx_sriox_omsg_fmp_mrx_s cn63xx; + struct cvmx_sriox_omsg_fmp_mrx_s cn63xxp1; +}; +typedef union cvmx_sriox_omsg_fmp_mrx cvmx_sriox_omsg_fmp_mrx_t; + +/** + * cvmx_srio#_omsg_nmp_mr# + * + * SRIO_OMSG_NMP_MRX = SRIO Outbound Message NFIRSTMP Message Restriction + * + * The SRIO Controller X Outbound Message NFIRSTMP Message Restriction Register + * + * Notes: + * This CSR controls when NMP candidate message segments (from the two different controllers) can enter + * the message segment silo to be sent out. A segment remains in the silo until after is has + * been transmitted and either acknowledged or errored out. + * + * Candidates and silo entries are one of 4 types: + * SP - a single-segment message + * FMP - the first segment of a multi-segment message + * NMP - the other segments in a multi-segment message + * PSD - the silo psuedo-entry that is valid only while a controller is in the middle of pushing + * a multi-segment message into the silo and can match against segments generated by + * the other controller + * + * When a candidate "matches" against a silo entry or pseudo entry, it cannot enter the silo. + * By default (i.e. zeroes in this CSR), the NMP candidate matches against all entries in the + * silo. When fields in this CSR are set, NMP candidate segments will match fewer silo entries and + * can enter the silo more freely, probably providing better performance. + * + * Clk_Rst: SRIO(0..1)_OMSG_NMP_MR[0:1] hclk hrst_n + */ +union cvmx_sriox_omsg_nmp_mrx +{ + uint64_t u64; + struct cvmx_sriox_omsg_nmp_mrx_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_15_63 : 49; + uint64_t ctlr_sp : 1; /**< Controller X NFIRSTMP enable controller SP + When set, the NMP candidate message segment can + only match siloed SP segments that were created + by the same controller. When clear, this NMP-SP + match can also occur when the segments were + created by the other controller. + Not used by the hardware when ALL_SP is set. */ + uint64_t ctlr_fmp : 1; /**< Controller X NFIRSTMP enable controller FIRSTMP + When set, the NMP candidate message segment can + only match siloed FMP segments that were created + by the same controller. When clear, this NMP-FMP + match can also occur when the segments were + created by the other controller. + Not used by the hardware when ALL_FMP is set. */ + uint64_t ctlr_nmp : 1; /**< Controller X NFIRSTMP enable controller NFIRSTMP + When set, the NMP candidate message segment can + only match siloed NMP segments that were created + by the same controller. When clear, this NMP-NMP + match can also occur when the segments were + created by the other controller. + Not used by the hardware when ALL_NMP is set. */ + uint64_t id_sp : 1; /**< Controller X NFIRSTMP enable ID SP + When set, the NMP candidate message segment can + only match siloed SP segments that "ID match" the + candidate. When clear, this NMP-SP match can occur + with any ID values. + Not used by the hardware when ALL_SP is set. */ + uint64_t id_fmp : 1; /**< Controller X NFIRSTMP enable ID FIRSTMP + When set, the NMP candidate message segment can + only match siloed FMP segments that "ID match" the + candidate. When clear, this NMP-FMP match can occur + with any ID values. + Not used by the hardware when ALL_FMP is set. */ + uint64_t id_nmp : 1; /**< Controller X NFIRSTMP enable ID NFIRSTMP + When set, the NMP candidate message segment can + only match siloed NMP segments that "ID match" the + candidate. When clear, this NMP-NMP match can occur + with any ID values. + Not used by the hardware when ALL_NMP is set. */ + uint64_t reserved_8_8 : 1; + uint64_t mbox_sp : 1; /**< Controller X NFIRSTMP enable MBOX SP + When set, the NMP candidate message segment can + only match siloed SP segments with the same 2-bit + mbox value as the candidate. When clear, this + NMP-SP match can occur with any mbox values. + Not used by the hardware when ALL_SP is set. */ + uint64_t mbox_fmp : 1; /**< Controller X NFIRSTMP enable MBOX FIRSTMP + When set, the NMP candidate message segment can + only match siloed FMP segments with the same 2-bit + mbox value as the candidate. When clear, this + NMP-FMP match can occur with any mbox values. + Not used by the hardware when ALL_FMP is set. */ + uint64_t mbox_nmp : 1; /**< Controller X NFIRSTMP enable MBOX NFIRSTMP + When set, the NMP candidate message segment can + only match siloed NMP segments with the same 2-bit + mbox value as the candidate. When clear, this + NMP-NMP match can occur with any mbox values. + Not used by the hardware when ALL_NMP is set. */ + uint64_t reserved_4_4 : 1; + uint64_t all_sp : 1; /**< Controller X NFIRSTMP enable all SP + When set, no NMP candidate message segments ever + match siloed SP segments and ID_SP + and MBOX_SP are not used. When clear, NMP-SP + matches can occur. */ + uint64_t all_fmp : 1; /**< Controller X NFIRSTMP enable all FIRSTMP + When set, no NMP candidate message segments ever + match siloed FMP segments and ID_FMP and MBOX_FMP + are not used. When clear, NMP-FMP matches can + occur. */ + uint64_t all_nmp : 1; /**< Controller X NFIRSTMP enable all NFIRSTMP + When set, no NMP candidate message segments ever + match siloed NMP segments and ID_NMP and MBOX_NMP + are not used. When clear, NMP-NMP matches can + occur. */ + uint64_t reserved_0_0 : 1; +#else + uint64_t reserved_0_0 : 1; + uint64_t all_nmp : 1; + uint64_t all_fmp : 1; + uint64_t all_sp : 1; + uint64_t reserved_4_4 : 1; + uint64_t mbox_nmp : 1; + uint64_t mbox_fmp : 1; + uint64_t mbox_sp : 1; + uint64_t reserved_8_8 : 1; + uint64_t id_nmp : 1; + uint64_t id_fmp : 1; + uint64_t id_sp : 1; + uint64_t ctlr_nmp : 1; + uint64_t ctlr_fmp : 1; + uint64_t ctlr_sp : 1; + uint64_t reserved_15_63 : 49; +#endif + } s; + struct cvmx_sriox_omsg_nmp_mrx_s cn63xx; + struct cvmx_sriox_omsg_nmp_mrx_s cn63xxp1; +}; +typedef union cvmx_sriox_omsg_nmp_mrx cvmx_sriox_omsg_nmp_mrx_t; + +/** + * cvmx_srio#_omsg_port# + * + * SRIO_OMSG_PORTX = SRIO Outbound Message Port + * + * The SRIO Controller X Outbound Message Port Register + * + * Notes: + * PORT maps the PKO port to SRIO interface \# / controller X as follows: + * + * 00 == PKO port 40 + * 01 == PKO port 41 + * 10 == PKO port 42 + * 11 == PKO port 43 + * + * No two PORT fields among the enabled controllers (ENABLE == 1) may be set to the same value. + * The register is only reset during COLD boot. The register can be accessed/modified regardless of + * the value in SRIO(0..1)_STATUS_REG.ACCESS. + * + * Clk_Rst: SRIO(0..1)_OMSG_PORT[0:1] sclk srst_n + */ +union cvmx_sriox_omsg_portx +{ + uint64_t u64; + struct cvmx_sriox_omsg_portx_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_32_63 : 32; + uint64_t enable : 1; /**< Controller X enable */ + uint64_t reserved_2_30 : 29; + uint64_t port : 2; /**< Controller X PKO port */ +#else + uint64_t port : 2; + uint64_t reserved_2_30 : 29; + uint64_t enable : 1; + uint64_t reserved_32_63 : 32; +#endif + } s; + struct cvmx_sriox_omsg_portx_s cn63xx; + struct cvmx_sriox_omsg_portx_s cn63xxp1; +}; +typedef union cvmx_sriox_omsg_portx cvmx_sriox_omsg_portx_t; + +/** + * cvmx_srio#_omsg_silo_thr + * + * SRIO_OMSG_SILO_THR = SRIO Outgoing Message SILO Thresholds (Pass 2) + * + * The SRIO Outgoing Message SILO Thresholds + * + * Notes: + * Limits the number of Outgoing Message Segments in flight at a time. This register is reserved in + * pass 1 and the threshold is set to 16. + * + * Clk_Rst: SRIO(0..1)_OMSG_SILO_THR hclk hrst_n + */ +union cvmx_sriox_omsg_silo_thr +{ + uint64_t u64; + struct cvmx_sriox_omsg_silo_thr_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_5_63 : 59; + uint64_t tot_silo : 5; /**< Sets max number segments in flight for all + controllers. */ +#else + uint64_t tot_silo : 5; + uint64_t reserved_5_63 : 59; +#endif + } s; + struct cvmx_sriox_omsg_silo_thr_s cn63xx; +}; +typedef union cvmx_sriox_omsg_silo_thr cvmx_sriox_omsg_silo_thr_t; + +/** + * cvmx_srio#_omsg_sp_mr# + * + * SRIO_OMSG_SP_MRX = SRIO Outbound Message SP Message Restriction + * + * The SRIO Controller X Outbound Message SP Message Restriction Register + * + * Notes: + * This CSR controls when SP candidate message segments (from the two different controllers) can enter + * the message segment silo to be sent out. A segment remains in the silo until after is has + * been transmitted and either acknowledged or errored out. + * + * Candidates and silo entries are one of 4 types: + * SP - a single-segment message + * FMP - the first segment of a multi-segment message + * NMP - the other segments in a multi-segment message + * PSD - the silo psuedo-entry that is valid only while a controller is in the middle of pushing + * a multi-segment message into the silo and can match against segments generated by + * the other controller + * + * When a candidate "matches" against a silo entry or pseudo entry, it cannot enter the silo. + * By default (i.e. zeroes in this CSR), the SP candidate matches against all entries in the + * silo. When fields in this CSR are set, SP candidate segments will match fewer silo entries and + * can enter the silo more freely, probably providing better performance. + * + * Clk_Rst: SRIO(0..1)_OMSG_SP_MR[0:1] hclk hrst_n + */ +union cvmx_sriox_omsg_sp_mrx +{ + uint64_t u64; + struct cvmx_sriox_omsg_sp_mrx_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_16_63 : 48; + uint64_t xmbox_sp : 1; /**< Controller X SP enable XMBOX SP + When set, the SP candidate message can only + match siloed SP segments with the same 4-bit xmbox + value as the candidate. When clear, this SP-SP + match can occur with any xmbox values. + When XMBOX_SP is set, MBOX_SP will commonly be set. + Not used by the hardware when ALL_SP is set. */ + uint64_t ctlr_sp : 1; /**< Controller X SP enable controller SP + When set, the SP candidate message can + only match siloed SP segments that were created + by the same controller. When clear, this SP-SP + match can also occur when the segments were + created by the other controller. + Not used by the hardware when ALL_SP is set. */ + uint64_t ctlr_fmp : 1; /**< Controller X SP enable controller FIRSTMP + When set, the SP candidate message can + only match siloed FMP segments that were created + by the same controller. When clear, this SP-FMP + match can also occur when the segments were + created by the other controller. + Not used by the hardware when ALL_FMP is set. */ + uint64_t ctlr_nmp : 1; /**< Controller X SP enable controller NFIRSTMP + When set, the SP candidate message can + only match siloed NMP segments that were created + by the same controller. When clear, this SP-NMP + match can also occur when the segments were + created by the other controller. + Not used by the hardware when ALL_NMP is set. */ + uint64_t id_sp : 1; /**< Controller X SP enable ID SP + When set, the SP candidate message can + only match siloed SP segments that "ID match" the + candidate. When clear, this SP-SP match can occur + with any ID values. + Not used by the hardware when ALL_SP is set. */ + uint64_t id_fmp : 1; /**< Controller X SP enable ID FIRSTMP + When set, the SP candidate message can + only match siloed FMP segments that "ID match" the + candidate. When clear, this SP-FMP match can occur + with any ID values. + Not used by the hardware when ALL_FMP is set. */ + uint64_t id_nmp : 1; /**< Controller X SP enable ID NFIRSTMP + When set, the SP candidate message can + only match siloed NMP segments that "ID match" the + candidate. When clear, this SP-NMP match can occur + with any ID values. + Not used by the hardware when ALL_NMP is set. */ + uint64_t id_psd : 1; /**< Controller X SP enable ID PSEUDO + When set, the SP candidate message can + only match the silo pseudo (for the other + controller) when it is an "ID match". When clear, + this SP-PSD match can occur with any ID values. + Not used by the hardware when ALL_PSD is set. */ + uint64_t mbox_sp : 1; /**< Controller X SP enable MBOX SP + When set, the SP candidate message can only + match siloed SP segments with the same 2-bit mbox + value as the candidate. When clear, this SP-SP + match can occur with any mbox values. + Not used by the hardware when ALL_SP is set. */ + uint64_t mbox_fmp : 1; /**< Controller X SP enable MBOX FIRSTMP + When set, the SP candidate message can only + match siloed FMP segments with the same 2-bit mbox + value as the candidate. When clear, this SP-FMP + match can occur with any mbox values. + Not used by the hardware when ALL_FMP is set. */ + uint64_t mbox_nmp : 1; /**< Controller X SP enable MBOX NFIRSTMP + When set, the SP candidate message can only + match siloed NMP segments with the same 2-bit mbox + value as the candidate. When clear, this SP-NMP + match can occur with any mbox values. + Not used by the hardware when ALL_NMP is set. */ + uint64_t mbox_psd : 1; /**< Controller X SP enable MBOX PSEUDO + When set, the SP candidate message can only + match the silo pseudo (for the other controller) + if the pseudo has the same 2-bit mbox value as the + candidate. When clear, this SP-PSD match can occur + with any mbox values. + Not used by the hardware when ALL_PSD is set. */ + uint64_t all_sp : 1; /**< Controller X SP enable all SP + When set, no SP candidate messages ever + match siloed SP segments, and XMBOX_SP, ID_SP, + and MBOX_SP are not used. When clear, SP-SP + matches can occur. */ + uint64_t all_fmp : 1; /**< Controller X SP enable all FIRSTMP + When set, no SP candidate messages ever + match siloed FMP segments and ID_FMP and MBOX_FMP + are not used. When clear, SP-FMP matches can + occur. */ + uint64_t all_nmp : 1; /**< Controller X SP enable all NFIRSTMP + When set, no SP candidate messages ever + match siloed NMP segments and ID_NMP and MBOX_NMP + are not used. When clear, SP-NMP matches can + occur. */ + uint64_t all_psd : 1; /**< Controller X SP enable all PSEUDO + When set, no SP candidate messages ever + match the silo pseudo (for the other controller) + and ID_PSD and MBOX_PSD are not used. When clear, + SP-PSD matches can occur. */ +#else + uint64_t all_psd : 1; + uint64_t all_nmp : 1; + uint64_t all_fmp : 1; + uint64_t all_sp : 1; + uint64_t mbox_psd : 1; + uint64_t mbox_nmp : 1; + uint64_t mbox_fmp : 1; + uint64_t mbox_sp : 1; + uint64_t id_psd : 1; + uint64_t id_nmp : 1; + uint64_t id_fmp : 1; + uint64_t id_sp : 1; + uint64_t ctlr_nmp : 1; + uint64_t ctlr_fmp : 1; + uint64_t ctlr_sp : 1; + uint64_t xmbox_sp : 1; + uint64_t reserved_16_63 : 48; +#endif + } s; + struct cvmx_sriox_omsg_sp_mrx_s cn63xx; + struct cvmx_sriox_omsg_sp_mrx_s cn63xxp1; +}; +typedef union cvmx_sriox_omsg_sp_mrx cvmx_sriox_omsg_sp_mrx_t; + +/** + * cvmx_srio#_prio#_in_use + * + * SRIO_PRIO[0:3]_IN_USE = S2M PRIORITY FIFO IN USE COUNTS (Pass 2) + * + * SRIO S2M Priority X FIFO Inuse counts + * + * Notes: + * These registers provide status information on the number of read/write requests pending in the S2M + * Priority FIFOs. The information can be used to help determine when an S2M_TYPE register can be + * reallocated. For example, if an S2M_TYPE is used N times in a DMA write operation and the DMA has + * completed. The register corresponding to the RD/WR_PRIOR of the S2M_TYPE can be read to determine + * the START_CNT and then can be polled to see if the END_CNT equals the START_CNT or at least + * START_CNT+N. These registers can be accessed regardless of the value of SRIO(0..1)_STATUS_REG.ACCESS + * but are reset by either the MAC or Core being reset. + * + * Clk_Rst: SRIO(0..1)_PRIO[0:3]_IN_USE sclk srst_n, hrst_n + */ +union cvmx_sriox_priox_in_use +{ + uint64_t u64; + struct cvmx_sriox_priox_in_use_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_32_63 : 32; + uint64_t end_cnt : 16; /**< Count of Packets with S2M_TYPES completed for this + Priority X FIFO */ + uint64_t start_cnt : 16; /**< Count of Packets with S2M_TYPES started for this + Priority X FIFO */ +#else + uint64_t start_cnt : 16; + uint64_t end_cnt : 16; + uint64_t reserved_32_63 : 32; +#endif + } s; + struct cvmx_sriox_priox_in_use_s cn63xx; +}; +typedef union cvmx_sriox_priox_in_use cvmx_sriox_priox_in_use_t; + +/** + * cvmx_srio#_rx_bell + * + * SRIO_RX_BELL = SRIO Receive Doorbell + * + * The SRIO Incoming (RX) Doorbell + * + * Notes: + * This register contains the SRIO Information, Device ID, Transaction Type and Priority of the + * incoming Doorbell Transaction as well as the number of transactions waiting to be read. Reading + * this register causes a Doorbell to be removed from the RX Bell FIFO and the COUNT to be + * decremented. If the COUNT is zero then the FIFO is empty and the other fields should be + * considered invalid. When the FIFO is full an ERROR is automatically issued. The RXBELL Interrupt + * can be used to detect posts to this FIFO. + * + * Clk_Rst: SRIO(0..1)_RX_BELL hclk hrst_n + */ +union cvmx_sriox_rx_bell +{ + uint64_t u64; + struct cvmx_sriox_rx_bell_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_48_63 : 16; + uint64_t data : 16; /**< Information field from received doorbell */ + uint64_t src_id : 16; /**< Doorbell Source Device ID[15:0] */ + uint64_t count : 8; /**< RX Bell FIFO Count + Note: Count must be > 0 for entry to be valid. */ + uint64_t reserved_5_7 : 3; + uint64_t dest_id : 1; /**< Destination Device ID 0=Primary, 1=Secondary */ + uint64_t id16 : 1; /**< Transaction Type, 0=use ID[7:0], 1=use ID[15:0] */ + uint64_t reserved_2_2 : 1; + uint64_t priority : 2; /**< Doorbell Priority */ +#else + uint64_t priority : 2; + uint64_t reserved_2_2 : 1; + uint64_t id16 : 1; + uint64_t dest_id : 1; + uint64_t reserved_5_7 : 3; + uint64_t count : 8; + uint64_t src_id : 16; + uint64_t data : 16; + uint64_t reserved_48_63 : 16; +#endif + } s; + struct cvmx_sriox_rx_bell_s cn63xx; + struct cvmx_sriox_rx_bell_s cn63xxp1; +}; +typedef union cvmx_sriox_rx_bell cvmx_sriox_rx_bell_t; + +/** + * cvmx_srio#_rx_bell_seq + * + * SRIO_RX_BELL_SEQ = SRIO Receive Doorbell Sequence Count + * + * The SRIO Incoming (RX) Doorbell Sequence Count + * + * Notes: + * This register contains the value of the sequence counter when the doorbell was received and a + * shadow copy of the Bell FIFO Count that can be read without emptying the FIFO. This register must + * be read prior to SRIO(0..1)_RX_BELL to guarantee that the information corresponds to the correct + * doorbell. + * + * Clk_Rst: SRIO(0..1)_RX_BELL_SEQ hclk hrst_n + */ +union cvmx_sriox_rx_bell_seq +{ + uint64_t u64; + struct cvmx_sriox_rx_bell_seq_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_40_63 : 24; + uint64_t count : 8; /**< RX Bell FIFO Count + Note: Count must be > 0 for entry to be valid. */ + uint64_t seq : 32; /**< 32-bit Sequence \# associated with Doorbell Message */ +#else + uint64_t seq : 32; + uint64_t count : 8; + uint64_t reserved_40_63 : 24; +#endif + } s; + struct cvmx_sriox_rx_bell_seq_s cn63xx; + struct cvmx_sriox_rx_bell_seq_s cn63xxp1; +}; +typedef union cvmx_sriox_rx_bell_seq cvmx_sriox_rx_bell_seq_t; + +/** + * cvmx_srio#_rx_status + * + * SRIO_RX_STATUS = SRIO Inbound Credits/Response Status + * + * Specifies the current number of credits/responses by SRIO for Inbound Traffic + * + * Notes: + * Debug Register specifying the number of credits/responses currently in use for Inbound Traffic. + * The maximum value for COMP, N_POST and POST is set in SRIO(0..1)_TLP_CREDITS. When all inbound traffic + * has stopped the values should eventually return to the maximum values. The RTN_PR[3:1] entry + * counts should eventually return to the reset values. + * + * Clk_Rst: SRIO(0..1)_RX_STATUS hclk hrst_n + */ +union cvmx_sriox_rx_status +{ + uint64_t u64; + struct cvmx_sriox_rx_status_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t rtn_pr3 : 8; /**< Number of pending Priority 3 Response Entries. */ + uint64_t rtn_pr2 : 8; /**< Number of pending Priority 2 Response Entries. */ + uint64_t rtn_pr1 : 8; /**< Number of pending Priority 1 Response Entries. */ + uint64_t reserved_28_39 : 12; + uint64_t mbox : 4; /**< Credits for Mailbox Data used in M2S. */ + uint64_t comp : 8; /**< Credits for Read Completions used in M2S. */ + uint64_t reserved_13_15 : 3; + uint64_t n_post : 5; /**< Credits for Read Requests used in M2S. */ + uint64_t post : 8; /**< Credits for Write Request Postings used in M2S. */ +#else + uint64_t post : 8; + uint64_t n_post : 5; + uint64_t reserved_13_15 : 3; + uint64_t comp : 8; + uint64_t mbox : 4; + uint64_t reserved_28_39 : 12; + uint64_t rtn_pr1 : 8; + uint64_t rtn_pr2 : 8; + uint64_t rtn_pr3 : 8; +#endif + } s; + struct cvmx_sriox_rx_status_s cn63xx; + struct cvmx_sriox_rx_status_s cn63xxp1; +}; +typedef union cvmx_sriox_rx_status cvmx_sriox_rx_status_t; + +/** + * cvmx_srio#_s2m_type# + * + * SRIO_S2M_TYPE[0:15] = SLI to SRIO MAC Operation Type + * + * SRIO Operation Type selected by PP or DMA Accesses + * + * Notes: + * This CSR table specifies how to convert a SLI/DPI MAC read or write into sRIO operations. + * Each SLI/DPI read or write access supplies a 64-bit address (MACADD[63:0]), 2-bit ADDRTYPE, and + * 2-bit endian-swap. This SRIO*_S2M_TYPE* CSR description specifies a table with 16 CSRs. SRIO + * selects one of the table entries with TYPEIDX[3:0], which it creates from the SLI/DPI MAC memory + * space read or write as follows: + * TYPEIDX[1:0] = ADDRTYPE[1:0] (ADDRTYPE[1] is no-snoop to the PCIe MAC, + * ADDRTYPE[0] is relaxed-ordering to the PCIe MAC) + * TYPEIDX[2] = MACADD[50] + * TYPEIDX[3] = MACADD[59] + * + * Clk_Rst: SRIO(0..1)_S2M_TYPE[0:15] hclk hrst_n + */ +union cvmx_sriox_s2m_typex +{ + uint64_t u64; + struct cvmx_sriox_s2m_typex_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_19_63 : 45; + uint64_t wr_op : 3; /**< sRIO operation for SLI/DPI writes + + SLI/DPI hardware break MAC memory space writes + that they generate into pieces of maximum size + 256B. For NWRITE/NWRITE_R/SWRITE WR_OP variants + below, SRIO will, if necessary to obey sRIO + requirements, automatically break the write into + even smaller writes. The same is not true for + MAINTENANCE writes and port-writes. Additional + SW/usage restrictions are required for these + MAINTENANCE WR_OP's to work correctly. SW must + restrict the alignment and length of DPI pointers, + limit the store sizes that the cores issue, and + possibly also set SLI_MEM_ACCESS_SUBID*[NMERGE] + so that all MAC memory space writes with + MAINTENANCE write and port-write WR_OP's can be + serviced in a single sRIO operation. + + SRIO always sends the write data (64-bit) words + out in order. + + WR_OP = 0 = Normal Write (NWRITE) + SRIO breaks a MAC memory space write into + the minimum number of required sRIO NWRITE + operations. This will be 1-5 total NWRITEs, + depending on endian-swap, alignment, and + length. + + WR_OP = 1 = Normal Write w/Response (NWRITE_R) + SRIO breaks a MAC memory space write into + the minimum number of required sRIO + NWRITE_R operations. This will be 1-5 total + NWRITE_R's, depending on endian-swap, + alignment, and length. + + SRIO sets SRIO*_INT_REG[WR_DONE] after it + receives the DONE response for the last + NWRITE_R sent. + + WR_OP = 2 = NWRITE, Streaming write (SWRITE), + NWRITE + SRIO attempts to turn the MAC memory space + write into an SWRITE operation. There will + be 1-5 total sRIO operations (0-2 NWRITE's + followed by 0-1 SWRITE's followed by 0-2 + NWRITE's) generated to complete the MAC + memory space write, depending on + endian-swap, alignment, and length. + + If the starting address is not 64-bit + aligned, SRIO first creates 1-4 NWRITE's to + either align it or complete the write. Then + SRIO creates a SWRITE including all aligned + 64-bit words. (SRIO won't create an SWRITE + when there are none.) If store data + remains, SRIO finally creates another 1 or + 2 NWRITE's. + + WR_OP = 3 = NWRITE, SWRITE, NWRITE_R + SRIO attempts to turn the MAC memory space + write into an SWRITE operation followed by + a NWRITE_R operation. The last operation + is always NWRITE_R. There will be 1-5 + total sRIO operations (0-2 NWRITE's, + followed by 0-1 SWRITE, followed by 1-4 + NWRITE_R's) generated to service the MAC + memory space write, depending on + endian-swap, alignment, and length. + + If the write is contained in one aligned + 64-bit word, SRIO will completely service + the MAC memory space write with 1-4 + NWRITE_R's. + + Otherwise, if the write spans multiple + words, SRIO services the write as follows. + First, if the start of the write is not + word-aligned, SRIO creates 1 or 2 NWRITE's + to align it. Then SRIO creates an SWRITE + that includes all aligned 64-bit words, + leaving data for the final NWRITE_R(s). + (SRIO won't create the SWRITE when there is + no data for it.) Then SRIO finally creates + 1 or 2 NWRITE_R's. + + In any case, SRIO sets + SRIO*_INT_REG[WR_DONE] after it receives + the DONE response for the last NWRITE_R + sent. + + WR_OP = 4 = NWRITE, NWRITE_R + SRIO attempts to turn the MAC memory space + write into an NWRITE operation followed by + a NWRITE_R operation. The last operation + is always NWRITE_R. There will be 1-5 + total sRIO operations (0-3 NWRITE's + followed by 1-4 NWRITE_R's) generated to + service the MAC memory space write, + depending on endian-swap, alignment, and + length. + + If the write is contained in one aligned + 64-bit word, SRIO will completely service + the MAC memory space write with 1-4 + NWRITE_R's. + + Otherwise, if the write spans multiple + words, SRIO services the write as follows. + First, if the start of the write is not + word-aligned, SRIO creates 1 or 2 NWRITE's + to align it. Then SRIO creates an NWRITE + that includes all aligned 64-bit words, + leaving data for the final NWRITE_R(s). + (SRIO won't create this NWRITE when there + is no data for it.) Then SRIO finally + creates 1 or 2 NWRITE_R's. + + In any case, SRIO sets + SRIO*_INT_REG[WR_DONE] after it receives + the DONE response for the last NWRITE_R + sent. + + WR_OP = 5 = Reserved + + WR_OP = 6 = Maintenance Write + - SRIO will create one sRIO MAINTENANCE write + operation to service the MAC memory space + write + - IAOW_SEL must be zero. (see description + below.) + - MDS must be zero. (MDS is MACADD[63:62] - + see IAOW_SEL description below.) + - Hop Cnt is MACADD[31:24]/SRIOAddress[31:24] + - MACADD[23:0]/SRIOAddress[23:0] selects + maintenance register (i.e. config_offset) + - sRIODestID[15:0] is MACADD[49:34]. + (MACADD[49:42] unused when ID16=0) + - Write size/alignment must obey sRIO rules + (4, 8, 16, 24, 32, 40, 48, 56 and 64 byte + lengths allowed) + + WR_OP = 7 = Maintenance Port Write + - SRIO will create one sRIO MAINTENANCE port + write operation to service the MAC memory + space write + - IAOW_SEL must be zero. (see description + below.) + - MDS must be zero. (MDS is MACADD[63:62] - + see IAOW_SEL description below.) + - Hop Cnt is MACADD[31:24]/sRIOAddress[31:24] + - MACADD[23:0]/sRIOAddress[23:0] MBZ + (config_offset field reserved by sRIO) + - sRIODestID[15:0] is MACADD[49:34]. + (MACADD[49:42] unused when ID16=0) + - Write size/alignment must obey sRIO rules + (4, 8, 16, 24, 32, 40, 48, 56 and 64 byte + lengths allowed) */ + uint64_t reserved_15_15 : 1; + uint64_t rd_op : 3; /**< sRIO operation for SLI/DPI reads + + SLI/DPI hardware and sRIO configuration + restrictions guarantee that SRIO can service any + MAC memory space read that it receives from SLI/DPI + with a single NREAD, assuming that RD_OP selects + NREAD. DPI will break a read into multiple MAC + memory space reads to ensure this holds. The same + is not true for the ATOMIC and MAINTENANCE RD_OP + values. Additional SW/usage restrictions are + required for ATOMIC and MAINTENANCE RD_OP to work + correctly. SW must restrict the alignment and + length of DPI pointers and limit the load sizes + that the cores issue such that all MAC memory space + reads with ATOMIC and MAINTENANCE RD_OP's can be + serviced in a single sRIO operation. + + RD_OP = 0 = Normal Read (NREAD) + - SRIO will create one sRIO NREAD + operation to service the MAC memory + space read + - Read size/alignment must obey sRIO rules + (up to 256 byte lengths). (This requirement + is guaranteed by SLI/DPI usage restrictions + and configuration.) + + RD_OP = 1 = Reserved + + RD_OP = 2 = Atomic Set + - SRIO will create one sRIO ATOMIC set + operation to service the MAC memory + space read + - Read size/alignment must obey sRIO rules + (1, 2, and 4 byte lengths allowed) + + RD_OP = 3 = Atomic Clear + - SRIO will create one sRIO ATOMIC clr + operation to service the MAC memory + space read + - Read size/alignment must obey sRIO rules + (1, 2, and 4 byte lengths allowed) + + RD_OP = 4 = Atomic Increment + - SRIO will create one sRIO ATOMIC inc + operation to service the MAC memory + space read + - Read size/alignment must obey sRIO rules + (1, 2, and 4 byte lengths allowed) + + RD_OP = 5 = Atomic Decrement + - SRIO will create one sRIO ATOMIC dec + operation to service the MAC memory + space read + - Read size/alignment must obey sRIO rules + (1, 2, and 4 byte lengths allowed) + + RD_OP = 6 = Maintenance Read + - SRIO will create one sRIO MAINTENANCE read + operation to service the MAC memory + space read + - IAOW_SEL must be zero. (see description + below.) + - MDS must be zero. (MDS is MACADD[63:62] - + see IAOW_SEL description below.) + - Hop Cnt is MACADD[31:24]/sRIOAddress[31:24] + - MACADD[23:0]/sRIOAddress[23:0] selects + maintenance register (i.e. config_offset) + - sRIODestID[15:0] is MACADD[49:34]. + (MACADD[49:42] unused when ID16=0) + - Read size/alignment must obey sRIO rules + (4, 8, 16, 32 and 64 byte lengths allowed) + + RD_OP = 7 = Reserved */ + uint64_t wr_prior : 2; /**< Transaction Priority 0-3 used for writes */ + uint64_t rd_prior : 2; /**< Transaction Priority 0-3 used for reads/ATOMICs */ + uint64_t reserved_6_7 : 2; + uint64_t src_id : 1; /**< Source ID + + 0 = Use Primary ID as Source ID + (SRIOMAINT*_PRI_DEV_ID[ID16 or ID8], depending + on SRIO TT ID (i.e. ID16 below)) + + 1 = Use Secondary ID as Source ID + (SRIOMAINT*_SEC_DEV_ID[ID16 or ID8], depending + on SRIO TT ID (i.e. ID16 below)) */ + uint64_t id16 : 1; /**< SRIO TT ID 0=8bit, 1=16-bit + IAOW_SEL must not be 2 when ID16=1. */ + uint64_t reserved_2_3 : 2; + uint64_t iaow_sel : 2; /**< Internal Address Offset Width Select + + IAOW_SEL determines how to convert the + MACADD[63:62,58:51,49:0] recieved from SLI/DPI with + read/write into an sRIO address (sRIOAddress[...]) + and sRIO destination ID (sRIODestID[...]). The sRIO + address width mode (SRIOMAINT_PE_LLC[EX_ADDR]) and + ID16, determine the width of the sRIO address and + ID in the outgoing request(s), respectively. + + MACADD[61:60] is always unused. + + MACADD[59] is always TYPEIDX[3] + MACADD[50] is always TYPEIDX[2] + (TYPEIDX[3:0] selects one of these + SRIO*_S2M_TYPE* table entries.) + + MACADD[17:0] always becomes sRIOAddress[17:0]. + + IAOW_SEL = 0 = 34-bit Address Offset + + Must be used when sRIO link is in 34-bit + address width mode. + When sRIO is in 50-bit address width mode, + sRIOAddress[49:34]=0 in the outgoing request. + When sRIO is in 66-bit address width mode, + sRIOAddress[65:34]=0 in the outgoing request. + + Usage of the SLI/DPI MAC address when + IAOW_SEL = 0: + MACADD[63:62] = Multi-Device Swap (MDS) + MDS value affects MACADD[49:18] usage + MACADD[58:51] => unused + MACADD[49:18] usage depends on MDS value + MDS = 0 + MACADD[49:34] => sRIODestID[15:0] + (MACADD[49:42] unused when ID16=0) + MACADD[33:18] => sRIOAddress[33:18] + MDS = 1 + MACADD[49:42] => sRIODestID[15:8] + (MACADD[49:42] unused when ID16 = 0) + MACADD[41:34] => sRIOAddress[33:26] + MACADD[33:26] => sRIODestID[7:0] + MACADD[25:18] => sRIOAddress[25:18] + MDS = 2 + ID16 must be one. + MACADD[49:34] => sRIOAddress[33:18] + MACADD[33:18] => sRIODestID[15:0] + MDS = 3 = Reserved + + IAOW_SEL = 1 = 42-bit Address Offset + + Must not be used when sRIO link is in 34-bit + address width mode. + When sRIO is in 50-bit address width mode, + sRIOAddress[49:42]=0 in the outgoing request. + When sRIO is in 66-bit address width mode, + sRIOAddress[65:42]=0 in the outgoing request. + + Usage of the SLI/DPI MAC address when + IAOW_SEL = 1: + MACADD[63:62] => Multi-Device Swap (MDS) + MDS value affects MACADD[58:51,49:42,33:18] + use + MACADD[41:34] => sRIOAddress[41:34] + MACADD[58:51,49:42,33:18] usage depends on + MDS value: + MDS = 0 + MACADD[58:51] => sRIODestID[15:8] + MACADD[49:42] => sRIODestID[7:0] + (MACADD[58:51] unused when ID16=0) + MACADD[33:18] => sRIOAddress[33:18] + MDS = 1 + MACADD[58:51] => sRIODestID[15:8] + (MACADD[58:51] unused when ID16 = 0) + MACADD[49:42] => sRIOAddress[33:26] + MACADD[33:26] => sRIODestID[7:0] + MACADD[25:18] => sRIOAddress[25:18] + MDS = 2 + ID16 must be one. + MACADD[58:51] => sRIOAddress[33:26] + MACADD[49:42] => sRIOAddress[25:18] + MACADD[33:18] => sRIODestID[15:0] + MDS = 3 = Reserved + + IAOW_SEL = 2 = 50-bit Address Offset + + Must not be used when sRIO link is in 34-bit + address width mode. + Must not be used when ID16=1. + When sRIO is in 66-bit address width mode, + sRIOAddress[65:50]=0 in the outgoing request. + + Usage of the SLI/DPI MAC address when + IAOW_SEL = 2: + MACADD[63:62] => Multi-Device Swap (MDS) + MDS value affects MACADD[58:51,33:26] use + MDS value 3 is reserved + MACADD[49:34] => sRIOAddress[49:34] + MACADD[25:18] => sRIOAddress[25:18] + MACADD[58:51,33:26] usage depends on + MDS value: + MDS = 0 + MACADD[58:51] => sRIODestID[7:0] + MACADD[33:26] => sRIOAddress[33:26] + MDS = 1 + MACADD[58:51] => sRIOAddress[33:26] + MACADD[33:26] => sRIODestID[7:0] + MDS = 2 = Reserved + MDS = 3 = Reserved + + IAOW_SEL = 3 = Reserved */ +#else + uint64_t iaow_sel : 2; + uint64_t reserved_2_3 : 2; + uint64_t id16 : 1; + uint64_t src_id : 1; + uint64_t reserved_6_7 : 2; + uint64_t rd_prior : 2; + uint64_t wr_prior : 2; + uint64_t rd_op : 3; + uint64_t reserved_15_15 : 1; + uint64_t wr_op : 3; + uint64_t reserved_19_63 : 45; +#endif + } s; + struct cvmx_sriox_s2m_typex_s cn63xx; + struct cvmx_sriox_s2m_typex_s cn63xxp1; +}; +typedef union cvmx_sriox_s2m_typex cvmx_sriox_s2m_typex_t; + +/** + * cvmx_srio#_seq + * + * SRIO_SEQ = SRIO Sequence Count + * + * The SRIO Sequence Count + * + * Notes: + * This register contains the current value of the sequence counter. This counter increments every + * time a doorbell or the first segment of a message is accepted. + * + * Clk_Rst: SRIO(0..1)_SEQ hclk hrst_n + */ +union cvmx_sriox_seq +{ + uint64_t u64; + struct cvmx_sriox_seq_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_32_63 : 32; + uint64_t seq : 32; /**< 32-bit Sequence \# */ +#else + uint64_t seq : 32; + uint64_t reserved_32_63 : 32; +#endif + } s; + struct cvmx_sriox_seq_s cn63xx; + struct cvmx_sriox_seq_s cn63xxp1; +}; +typedef union cvmx_sriox_seq cvmx_sriox_seq_t; + +/** + * cvmx_srio#_status_reg + * + * SRIO_STATUS_REG = SRIO Status Register + * + * General status of the SRIO. + * + * Notes: + * The SRIO field displays if the port has been configured for SRIO operation. This register can be + * read regardless of whether the SRIO is selected or being reset. Although some other registers can + * be accessed while the ACCESS bit is zero (see individual registers for details), the majority of + * SRIO registers and all the SRIOMAINT registers can be used only when the ACCESS bit is asserted. + * + * Clk_Rst: SRIO(0..1)_STATUS_REG sclk srst_n + */ +union cvmx_sriox_status_reg +{ + uint64_t u64; + struct cvmx_sriox_status_reg_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_2_63 : 62; + uint64_t access : 1; /**< SRIO and SRIOMAINT Register Access. + 0 - Register Access Disabled. + 1 - Register Access Enabled. */ + uint64_t srio : 1; /**< SRIO Port Enabled. + 0 - All SRIO functions disabled. + 1 - All SRIO Operations permitted. */ +#else + uint64_t srio : 1; + uint64_t access : 1; + uint64_t reserved_2_63 : 62; +#endif + } s; + struct cvmx_sriox_status_reg_s cn63xx; + struct cvmx_sriox_status_reg_s cn63xxp1; +}; +typedef union cvmx_sriox_status_reg cvmx_sriox_status_reg_t; + +/** + * cvmx_srio#_tag_ctrl + * + * SRIO_TAG_CTRL = SRIO TAG Control + * + * The SRIO TAG Control + * + * Notes: + * This register is used to show the state of the internal transaction tags and provides a manual + * reset of the outgoing tags. + * + * Clk_Rst: SRIO(0..1)_TAG_CTRL hclk hrst_n + */ +union cvmx_sriox_tag_ctrl +{ + uint64_t u64; + struct cvmx_sriox_tag_ctrl_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_17_63 : 47; + uint64_t o_clr : 1; /**< Manual OTAG Clear. This bit manually resets the + number of OTAGs back to 16 and loses track of any + outgoing packets. This function is automatically + performed when the SRIO MAC is reset but it may be + necessary after a chip reset while the MAC is in + operation. This bit must be set then cleared to + return to normal operation. Typically, Outgoing + SRIO packets must be halted 6 seconds prior to + this bit is set to avoid generating duplicate tags + and unexpected response errors. */ + uint64_t reserved_13_15 : 3; + uint64_t otag : 5; /**< Number of Available Outbound Tags. Tags are + required for all outgoing memory and maintenance + operations that require a response. (Max 16) */ + uint64_t reserved_5_7 : 3; + uint64_t itag : 5; /**< Number of Available Inbound Tags. Tags are + required for all incoming memory operations that + require a response. (Max 16) */ +#else + uint64_t itag : 5; + uint64_t reserved_5_7 : 3; + uint64_t otag : 5; + uint64_t reserved_13_15 : 3; + uint64_t o_clr : 1; + uint64_t reserved_17_63 : 47; +#endif + } s; + struct cvmx_sriox_tag_ctrl_s cn63xx; + struct cvmx_sriox_tag_ctrl_s cn63xxp1; +}; +typedef union cvmx_sriox_tag_ctrl cvmx_sriox_tag_ctrl_t; + +/** + * cvmx_srio#_tlp_credits + * + * SRIO_TLP_CREDITS = SRIO TLP Credits + * + * Specifies the number of credits the SRIO can use for incoming Commands and Messages. + * + * Notes: + * Specifies the number of maximum credits the SRIO can use for incoming Commands and Messages. + * + * Clk_Rst: SRIO(0..1)_TLP_CREDITS hclk hrst_n + */ +union cvmx_sriox_tlp_credits +{ + uint64_t u64; + struct cvmx_sriox_tlp_credits_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_28_63 : 36; + uint64_t mbox : 4; /**< Credits for Mailbox Data used in M2S. + Legal values are 0x2 to 0x8. */ + uint64_t comp : 8; /**< Credits for Read Completions used in M2S. + Legal values are 0x22 to 0x80. */ + uint64_t reserved_13_15 : 3; + uint64_t n_post : 5; /**< Credits for Read Requests used in M2S. + Legal values are 0x4 to 0x10. */ + uint64_t post : 8; /**< Credits for Write Request Postings used in M2S. + Legal values are 0x22 to 0x80. */ +#else + uint64_t post : 8; + uint64_t n_post : 5; + uint64_t reserved_13_15 : 3; + uint64_t comp : 8; + uint64_t mbox : 4; + uint64_t reserved_28_63 : 36; +#endif + } s; + struct cvmx_sriox_tlp_credits_s cn63xx; + struct cvmx_sriox_tlp_credits_s cn63xxp1; +}; +typedef union cvmx_sriox_tlp_credits cvmx_sriox_tlp_credits_t; + +/** + * cvmx_srio#_tx_bell + * + * SRIO_TX_BELL = SRIO Transmit Doorbell + * + * The SRIO Outgoing (TX) Doorbell + * + * Notes: + * This register specifies SRIO Information, Device ID, Transaction Type and Priority of the outgoing + * Doorbell Transaction. Writes to this register causes the Doorbell to be issued using these bits. + * The write also causes the PENDING bit to be set. The hardware automatically clears bit when the + * Doorbell operation has been acknowledged. A write to this register while the PENDING bit is set + * should be avoided as it will stall the RSL until the first Doorbell has completed. + * + * Clk_Rst: SRIO(0..1)_TX_BELL hclk hrst_n + */ +union cvmx_sriox_tx_bell +{ + uint64_t u64; + struct cvmx_sriox_tx_bell_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_48_63 : 16; + uint64_t data : 16; /**< Information field for next doorbell operation */ + uint64_t dest_id : 16; /**< Doorbell Destination Device ID[15:0] */ + uint64_t reserved_9_15 : 7; + uint64_t pending : 1; /**< Doorbell Transmit in Progress */ + uint64_t reserved_5_7 : 3; + uint64_t src_id : 1; /**< Source Device ID 0=Primary, 1=Secondary */ + uint64_t id16 : 1; /**< Transaction Type, 0=use ID[7:0], 1=use ID[15:0] */ + uint64_t reserved_2_2 : 1; + uint64_t priority : 2; /**< Doorbell Priority */ +#else + uint64_t priority : 2; + uint64_t reserved_2_2 : 1; + uint64_t id16 : 1; + uint64_t src_id : 1; + uint64_t reserved_5_7 : 3; + uint64_t pending : 1; + uint64_t reserved_9_15 : 7; + uint64_t dest_id : 16; + uint64_t data : 16; + uint64_t reserved_48_63 : 16; +#endif + } s; + struct cvmx_sriox_tx_bell_s cn63xx; + struct cvmx_sriox_tx_bell_s cn63xxp1; +}; +typedef union cvmx_sriox_tx_bell cvmx_sriox_tx_bell_t; + +/** + * cvmx_srio#_tx_bell_info + * + * SRIO_TX_BELL_INFO = SRIO Transmit Doorbell Interrupt Information + * + * The SRIO Outgoing (TX) Doorbell Interrupt Information + * + * Notes: + * This register is only updated if the BELL_ERR bit is clear in SRIO(0..1)_INT_REG. This register + * displays SRIO Information, Device ID, Transaction Type and Priority of the Doorbell Transaction + * that generated the BELL_ERR Interrupt. The register includes either a RETRY, ERROR or TIMEOUT + * Status. + * + * Clk_Rst: SRIO(0..1)_TX_BELL_INFO hclk hrst_n + */ +union cvmx_sriox_tx_bell_info +{ + uint64_t u64; + struct cvmx_sriox_tx_bell_info_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_48_63 : 16; + uint64_t data : 16; /**< Information field from last doorbell operation */ + uint64_t dest_id : 16; /**< Doorbell Destination Device ID[15:0] */ + uint64_t reserved_8_15 : 8; + uint64_t timeout : 1; /**< Transmit Doorbell Failed with Timeout. */ + uint64_t error : 1; /**< Transmit Doorbell Destination returned Error. */ + uint64_t retry : 1; /**< Transmit Doorbell Requests a retransmission. */ + uint64_t src_id : 1; /**< Source Device ID 0=Primary, 1=Secondary */ + uint64_t id16 : 1; /**< Transaction Type, 0=use ID[7:0], 1=use ID[15:0] */ + uint64_t reserved_2_2 : 1; + uint64_t priority : 2; /**< Doorbell Priority */ +#else + uint64_t priority : 2; + uint64_t reserved_2_2 : 1; + uint64_t id16 : 1; + uint64_t src_id : 1; + uint64_t retry : 1; + uint64_t error : 1; + uint64_t timeout : 1; + uint64_t reserved_8_15 : 8; + uint64_t dest_id : 16; + uint64_t data : 16; + uint64_t reserved_48_63 : 16; +#endif + } s; + struct cvmx_sriox_tx_bell_info_s cn63xx; + struct cvmx_sriox_tx_bell_info_s cn63xxp1; +}; +typedef union cvmx_sriox_tx_bell_info cvmx_sriox_tx_bell_info_t; + +/** + * cvmx_srio#_tx_ctrl + * + * SRIO_TX_CTRL = SRIO Transmit Control + * + * The SRIO Transmit Control + * + * Notes: + * This register is used to control SRIO Outgoing Packet Allocation. TX_TH[2:0] set the thresholds + * to allow each priority traffic to be queued for transmission. 8 TX Buffer are available. A + * threshold greater than 8 stops all traffic on that priority and should be avoided. TAG_TH[2:0] + * set the thresholds to allow priority traffic requiring responses to be queued based on the number + * of outgoing tags (TIDs) available. 16 Tags are available. If a priority is blocked for lack of + * tags then all lower priority packets are also blocked irregardless of whether they require tags. + * + * Clk_Rst: SRIO(0..1)_TX_CTRL hclk hrst_n + */ +union cvmx_sriox_tx_ctrl +{ + uint64_t u64; + struct cvmx_sriox_tx_ctrl_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_53_63 : 11; + uint64_t tag_th2 : 5; /**< Sets threshold for minimum number of OTAGs + required before a packet of priority 2 requiring a + response will be queued for transmission. (Max 16) + There generally should be no priority 3 request + packets which require a response/tag, so a TAG_THR + value as low as 0 is allowed. */ + uint64_t reserved_45_47 : 3; + uint64_t tag_th1 : 5; /**< Sets threshold for minimum number of OTAGs + required before a packet of priority 1 requiring a + response will be queued for transmission. (Max 16) + Generally, TAG_TH1 must be > TAG_TH2 to leave OTAGs + for outgoing priority 2 (or 3) requests. */ + uint64_t reserved_37_39 : 3; + uint64_t tag_th0 : 5; /**< Sets threshold for minimum number of OTAGs + required before a packet of priority 0 requiring a + response will be queued for transmission. (Max 16) + Generally, TAG_TH0 must be > TAG_TH1 to leave OTAGs + for outgoing priority 1 or 2 (or 3) requests. */ + uint64_t reserved_20_31 : 12; + uint64_t tx_th2 : 4; /**< Sets threshold for minimum number of TX buffers + before a Priority 2 Packet will be queued for + transmission. (Max 8) + Generally, TX_TH2 must be > 0 to leave space for + outgoing priority 3 packets. */ + uint64_t reserved_12_15 : 4; + uint64_t tx_th1 : 4; /**< Sets threshold for minimum number of TX buffers + before a Priority 1 Packet will be queued for + transmission. (Max 8) + Generally, TX_TH1 must be > TX_TH2 to leave space + for outgoing priority 2 or 3 packets. */ + uint64_t reserved_4_7 : 4; + uint64_t tx_th0 : 4; /**< Sets threshold for minimum number of TX buffers + before a Priority 0 Packet will be queued for + transmission. (Max 8) + Generally, TX_TH0 must be > TX_TH1 to leave space + for outgoing priority 1 or 2 or 3 packets. */ +#else + uint64_t tx_th0 : 4; + uint64_t reserved_4_7 : 4; + uint64_t tx_th1 : 4; + uint64_t reserved_12_15 : 4; + uint64_t tx_th2 : 4; + uint64_t reserved_20_31 : 12; + uint64_t tag_th0 : 5; + uint64_t reserved_37_39 : 3; + uint64_t tag_th1 : 5; + uint64_t reserved_45_47 : 3; + uint64_t tag_th2 : 5; + uint64_t reserved_53_63 : 11; +#endif + } s; + struct cvmx_sriox_tx_ctrl_s cn63xx; + struct cvmx_sriox_tx_ctrl_s cn63xxp1; +}; +typedef union cvmx_sriox_tx_ctrl cvmx_sriox_tx_ctrl_t; + +/** + * cvmx_srio#_tx_emphasis + * + * SRIO_TX_EMPHASIS = SRIO TX Lane Emphasis (Pass 2) + * + * Controls TX Emphasis used by the SRIO SERDES + * + * Notes: + * This controls the emphasis value used by the SRIO SERDES. This register is only reset during COLD + * boot and may be modified regardless of the value in SRIO(0..1)_STATUS_REG.ACCESS. + * + * Clk_Rst: SRIO(0..1)_TX_EMPHASIS sclk srst_cold_n + */ +union cvmx_sriox_tx_emphasis +{ + uint64_t u64; + struct cvmx_sriox_tx_emphasis_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_4_63 : 60; + uint64_t emph : 4; /**< Emphasis Value used for all lanes. Default value + is 0x0 for 1.25G b/s and 0xA for all other rates. */ +#else + uint64_t emph : 4; + uint64_t reserved_4_63 : 60; +#endif + } s; + struct cvmx_sriox_tx_emphasis_s cn63xx; +}; +typedef union cvmx_sriox_tx_emphasis cvmx_sriox_tx_emphasis_t; + +/** + * cvmx_srio#_tx_status + * + * SRIO_TX_STATUS = SRIO Outbound Credits/Ops Status + * + * Specifies the current number of credits/ops by SRIO for Outbound Traffic + * + * Notes: + * Debug Register specifying the number of credits/ops currently in use for Outbound Traffic. + * When all outbound traffic has stopped the values should eventually return to the reset values. + * + * Clk_Rst: SRIO(0..1)_TX_STATUS hclk hrst_n + */ +union cvmx_sriox_tx_status +{ + uint64_t u64; + struct cvmx_sriox_tx_status_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_32_63 : 32; + uint64_t s2m_pr3 : 8; /**< Number of pending S2M Priority 3 Entries. */ + uint64_t s2m_pr2 : 8; /**< Number of pending S2M Priority 2 Entries. */ + uint64_t s2m_pr1 : 8; /**< Number of pending S2M Priority 1 Entries. */ + uint64_t s2m_pr0 : 8; /**< Number of pending S2M Priority 0 Entries. */ +#else + uint64_t s2m_pr0 : 8; + uint64_t s2m_pr1 : 8; + uint64_t s2m_pr2 : 8; + uint64_t s2m_pr3 : 8; + uint64_t reserved_32_63 : 32; +#endif + } s; + struct cvmx_sriox_tx_status_s cn63xx; + struct cvmx_sriox_tx_status_s cn63xxp1; +}; +typedef union cvmx_sriox_tx_status cvmx_sriox_tx_status_t; + +/** + * cvmx_srio#_wr_done_counts + * + * SRIO_WR_DONE_COUNTS = SRIO Outgoing Write Done Counts (Pass 2) + * + * The SRIO Outbound Write Done Counts + * + * Notes: + * This register shows the number of successful and unsuccessful NwriteRs issued through this MAC. + * These count only considers the last NwriteR generated by each Store Instruction. If any NwriteR + * in the series receives an ERROR Status then it is reported in SRIOMAINT(0..1)_ERB_LT_ERR_DET.IO_ERR. + * If any NwriteR does not receive a response within the timeout period then it is reported in + * SRIOMAINT(0..1)_ERB_LT_ERR_DET.PKT_TOUT. Only errors on the last NwriteR's are counted as BAD. This + * register is typically not written while Outbound SRIO Memory traffic is enabled. + * + * Clk_Rst: SRIO(0..1)_WR_DONE_COUNTS hclk hrst_n + */ +union cvmx_sriox_wr_done_counts +{ + uint64_t u64; + struct cvmx_sriox_wr_done_counts_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_32_63 : 32; + uint64_t bad : 16; /**< Count of the final outbound NwriteR in the series + associated with a Store Operation that have timed + out or received a response with an ERROR status. */ + uint64_t good : 16; /**< Count of the final outbound NwriteR in the series + associated with a Store operation that has + received a response with a DONE status. */ +#else + uint64_t good : 16; + uint64_t bad : 16; + uint64_t reserved_32_63 : 32; +#endif + } s; + struct cvmx_sriox_wr_done_counts_s cn63xx; +}; +typedef union cvmx_sriox_wr_done_counts cvmx_sriox_wr_done_counts_t; + +#endif |