summaryrefslogtreecommitdiff
path: root/cvmx-l2c-defs.h
diff options
context:
space:
mode:
Diffstat (limited to 'cvmx-l2c-defs.h')
-rw-r--r--cvmx-l2c-defs.h5889
1 files changed, 5889 insertions, 0 deletions
diff --git a/cvmx-l2c-defs.h b/cvmx-l2c-defs.h
new file mode 100644
index 0000000000000..f0dd6d4f85d54
--- /dev/null
+++ b/cvmx-l2c-defs.h
@@ -0,0 +1,5889 @@
+/***********************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-l2c-defs.h
+ *
+ * Configuration and status register (CSR) type definitions for
+ * Octeon l2c.
+ *
+ * This file is auto generated. Do not edit.
+ *
+ * <hr>$Revision$<hr>
+ *
+ */
+#ifndef __CVMX_L2C_TYPEDEFS_H__
+#define __CVMX_L2C_TYPEDEFS_H__
+
+#if CVMX_ENABLE_CSR_ADDRESS_CHECKING
+#define CVMX_L2C_BIG_CTL CVMX_L2C_BIG_CTL_FUNC()
+static inline uint64_t CVMX_L2C_BIG_CTL_FUNC(void)
+{
+ if (!(OCTEON_IS_MODEL(OCTEON_CN63XX)))
+ cvmx_warn("CVMX_L2C_BIG_CTL not supported on this chip\n");
+ return CVMX_ADD_IO_SEG(0x0001180080800030ull);
+}
+#else
+#define CVMX_L2C_BIG_CTL (CVMX_ADD_IO_SEG(0x0001180080800030ull))
+#endif
+#if CVMX_ENABLE_CSR_ADDRESS_CHECKING
+#define CVMX_L2C_BST CVMX_L2C_BST_FUNC()
+static inline uint64_t CVMX_L2C_BST_FUNC(void)
+{
+ if (!(OCTEON_IS_MODEL(OCTEON_CN63XX)))
+ cvmx_warn("CVMX_L2C_BST not supported on this chip\n");
+ return CVMX_ADD_IO_SEG(0x00011800808007F8ull);
+}
+#else
+#define CVMX_L2C_BST (CVMX_ADD_IO_SEG(0x00011800808007F8ull))
+#endif
+#if CVMX_ENABLE_CSR_ADDRESS_CHECKING
+#define CVMX_L2C_BST0 CVMX_L2C_BST0_FUNC()
+static inline uint64_t CVMX_L2C_BST0_FUNC(void)
+{
+ if (!(OCTEON_IS_MODEL(OCTEON_CN3XXX) || OCTEON_IS_MODEL(OCTEON_CN5XXX)))
+ cvmx_warn("CVMX_L2C_BST0 not supported on this chip\n");
+ return CVMX_ADD_IO_SEG(0x00011800800007F8ull);
+}
+#else
+#define CVMX_L2C_BST0 (CVMX_ADD_IO_SEG(0x00011800800007F8ull))
+#endif
+#if CVMX_ENABLE_CSR_ADDRESS_CHECKING
+#define CVMX_L2C_BST1 CVMX_L2C_BST1_FUNC()
+static inline uint64_t CVMX_L2C_BST1_FUNC(void)
+{
+ if (!(OCTEON_IS_MODEL(OCTEON_CN3XXX) || OCTEON_IS_MODEL(OCTEON_CN5XXX)))
+ cvmx_warn("CVMX_L2C_BST1 not supported on this chip\n");
+ return CVMX_ADD_IO_SEG(0x00011800800007F0ull);
+}
+#else
+#define CVMX_L2C_BST1 (CVMX_ADD_IO_SEG(0x00011800800007F0ull))
+#endif
+#if CVMX_ENABLE_CSR_ADDRESS_CHECKING
+#define CVMX_L2C_BST2 CVMX_L2C_BST2_FUNC()
+static inline uint64_t CVMX_L2C_BST2_FUNC(void)
+{
+ if (!(OCTEON_IS_MODEL(OCTEON_CN3XXX) || OCTEON_IS_MODEL(OCTEON_CN5XXX)))
+ cvmx_warn("CVMX_L2C_BST2 not supported on this chip\n");
+ return CVMX_ADD_IO_SEG(0x00011800800007E8ull);
+}
+#else
+#define CVMX_L2C_BST2 (CVMX_ADD_IO_SEG(0x00011800800007E8ull))
+#endif
+#if CVMX_ENABLE_CSR_ADDRESS_CHECKING
+static inline uint64_t CVMX_L2C_BST_MEMX(unsigned long block_id)
+{
+ if (!(
+ (OCTEON_IS_MODEL(OCTEON_CN63XX) && ((block_id == 0)))))
+ cvmx_warn("CVMX_L2C_BST_MEMX(%lu) is invalid on this chip\n", block_id);
+ return CVMX_ADD_IO_SEG(0x0001180080C007F8ull);
+}
+#else
+#define CVMX_L2C_BST_MEMX(block_id) (CVMX_ADD_IO_SEG(0x0001180080C007F8ull))
+#endif
+#if CVMX_ENABLE_CSR_ADDRESS_CHECKING
+static inline uint64_t CVMX_L2C_BST_TDTX(unsigned long block_id)
+{
+ if (!(
+ (OCTEON_IS_MODEL(OCTEON_CN63XX) && ((block_id == 0)))))
+ cvmx_warn("CVMX_L2C_BST_TDTX(%lu) is invalid on this chip\n", block_id);
+ return CVMX_ADD_IO_SEG(0x0001180080A007F0ull);
+}
+#else
+#define CVMX_L2C_BST_TDTX(block_id) (CVMX_ADD_IO_SEG(0x0001180080A007F0ull))
+#endif
+#if CVMX_ENABLE_CSR_ADDRESS_CHECKING
+static inline uint64_t CVMX_L2C_BST_TTGX(unsigned long block_id)
+{
+ if (!(
+ (OCTEON_IS_MODEL(OCTEON_CN63XX) && ((block_id == 0)))))
+ cvmx_warn("CVMX_L2C_BST_TTGX(%lu) is invalid on this chip\n", block_id);
+ return CVMX_ADD_IO_SEG(0x0001180080A007F8ull);
+}
+#else
+#define CVMX_L2C_BST_TTGX(block_id) (CVMX_ADD_IO_SEG(0x0001180080A007F8ull))
+#endif
+#if CVMX_ENABLE_CSR_ADDRESS_CHECKING
+#define CVMX_L2C_CFG CVMX_L2C_CFG_FUNC()
+static inline uint64_t CVMX_L2C_CFG_FUNC(void)
+{
+ if (!(OCTEON_IS_MODEL(OCTEON_CN3XXX) || OCTEON_IS_MODEL(OCTEON_CN5XXX)))
+ cvmx_warn("CVMX_L2C_CFG not supported on this chip\n");
+ return CVMX_ADD_IO_SEG(0x0001180080000000ull);
+}
+#else
+#define CVMX_L2C_CFG (CVMX_ADD_IO_SEG(0x0001180080000000ull))
+#endif
+#if CVMX_ENABLE_CSR_ADDRESS_CHECKING
+static inline uint64_t CVMX_L2C_COP0_MAPX(unsigned long offset)
+{
+ if (!(
+ (OCTEON_IS_MODEL(OCTEON_CN63XX) && ((offset <= 1535) || ((offset >= 16128) && (offset <= 16383))))))
+ cvmx_warn("CVMX_L2C_COP0_MAPX(%lu) is invalid on this chip\n", offset);
+ return CVMX_ADD_IO_SEG(0x0001180080940000ull) + ((offset) & 16383) * 8;
+}
+#else
+#define CVMX_L2C_COP0_MAPX(offset) (CVMX_ADD_IO_SEG(0x0001180080940000ull) + ((offset) & 16383) * 8)
+#endif
+#if CVMX_ENABLE_CSR_ADDRESS_CHECKING
+#define CVMX_L2C_CTL CVMX_L2C_CTL_FUNC()
+static inline uint64_t CVMX_L2C_CTL_FUNC(void)
+{
+ if (!(OCTEON_IS_MODEL(OCTEON_CN63XX)))
+ cvmx_warn("CVMX_L2C_CTL not supported on this chip\n");
+ return CVMX_ADD_IO_SEG(0x0001180080800000ull);
+}
+#else
+#define CVMX_L2C_CTL (CVMX_ADD_IO_SEG(0x0001180080800000ull))
+#endif
+#if CVMX_ENABLE_CSR_ADDRESS_CHECKING
+#define CVMX_L2C_DBG CVMX_L2C_DBG_FUNC()
+static inline uint64_t CVMX_L2C_DBG_FUNC(void)
+{
+ if (!(OCTEON_IS_MODEL(OCTEON_CN3XXX) || OCTEON_IS_MODEL(OCTEON_CN5XXX)))
+ cvmx_warn("CVMX_L2C_DBG not supported on this chip\n");
+ return CVMX_ADD_IO_SEG(0x0001180080000030ull);
+}
+#else
+#define CVMX_L2C_DBG (CVMX_ADD_IO_SEG(0x0001180080000030ull))
+#endif
+#if CVMX_ENABLE_CSR_ADDRESS_CHECKING
+#define CVMX_L2C_DUT CVMX_L2C_DUT_FUNC()
+static inline uint64_t CVMX_L2C_DUT_FUNC(void)
+{
+ if (!(OCTEON_IS_MODEL(OCTEON_CN3XXX) || OCTEON_IS_MODEL(OCTEON_CN5XXX)))
+ cvmx_warn("CVMX_L2C_DUT not supported on this chip\n");
+ return CVMX_ADD_IO_SEG(0x0001180080000050ull);
+}
+#else
+#define CVMX_L2C_DUT (CVMX_ADD_IO_SEG(0x0001180080000050ull))
+#endif
+#if CVMX_ENABLE_CSR_ADDRESS_CHECKING
+static inline uint64_t CVMX_L2C_DUT_MAPX(unsigned long offset)
+{
+ if (!(
+ (OCTEON_IS_MODEL(OCTEON_CN63XX) && ((offset <= 1535)))))
+ cvmx_warn("CVMX_L2C_DUT_MAPX(%lu) is invalid on this chip\n", offset);
+ return CVMX_ADD_IO_SEG(0x0001180080E00000ull) + ((offset) & 2047) * 8;
+}
+#else
+#define CVMX_L2C_DUT_MAPX(offset) (CVMX_ADD_IO_SEG(0x0001180080E00000ull) + ((offset) & 2047) * 8)
+#endif
+#if CVMX_ENABLE_CSR_ADDRESS_CHECKING
+static inline uint64_t CVMX_L2C_ERR_TDTX(unsigned long block_id)
+{
+ if (!(
+ (OCTEON_IS_MODEL(OCTEON_CN63XX) && ((block_id == 0)))))
+ cvmx_warn("CVMX_L2C_ERR_TDTX(%lu) is invalid on this chip\n", block_id);
+ return CVMX_ADD_IO_SEG(0x0001180080A007E0ull);
+}
+#else
+#define CVMX_L2C_ERR_TDTX(block_id) (CVMX_ADD_IO_SEG(0x0001180080A007E0ull))
+#endif
+#if CVMX_ENABLE_CSR_ADDRESS_CHECKING
+static inline uint64_t CVMX_L2C_ERR_TTGX(unsigned long block_id)
+{
+ if (!(
+ (OCTEON_IS_MODEL(OCTEON_CN63XX) && ((block_id == 0)))))
+ cvmx_warn("CVMX_L2C_ERR_TTGX(%lu) is invalid on this chip\n", block_id);
+ return CVMX_ADD_IO_SEG(0x0001180080A007E8ull);
+}
+#else
+#define CVMX_L2C_ERR_TTGX(block_id) (CVMX_ADD_IO_SEG(0x0001180080A007E8ull))
+#endif
+#if CVMX_ENABLE_CSR_ADDRESS_CHECKING
+static inline uint64_t CVMX_L2C_ERR_VBFX(unsigned long block_id)
+{
+ if (!(
+ (OCTEON_IS_MODEL(OCTEON_CN63XX) && ((block_id == 0)))))
+ cvmx_warn("CVMX_L2C_ERR_VBFX(%lu) is invalid on this chip\n", block_id);
+ return CVMX_ADD_IO_SEG(0x0001180080C007F0ull);
+}
+#else
+#define CVMX_L2C_ERR_VBFX(block_id) (CVMX_ADD_IO_SEG(0x0001180080C007F0ull))
+#endif
+#if CVMX_ENABLE_CSR_ADDRESS_CHECKING
+#define CVMX_L2C_ERR_XMC CVMX_L2C_ERR_XMC_FUNC()
+static inline uint64_t CVMX_L2C_ERR_XMC_FUNC(void)
+{
+ if (!(OCTEON_IS_MODEL(OCTEON_CN63XX)))
+ cvmx_warn("CVMX_L2C_ERR_XMC not supported on this chip\n");
+ return CVMX_ADD_IO_SEG(0x00011800808007D8ull);
+}
+#else
+#define CVMX_L2C_ERR_XMC (CVMX_ADD_IO_SEG(0x00011800808007D8ull))
+#endif
+#if CVMX_ENABLE_CSR_ADDRESS_CHECKING
+#define CVMX_L2C_GRPWRR0 CVMX_L2C_GRPWRR0_FUNC()
+static inline uint64_t CVMX_L2C_GRPWRR0_FUNC(void)
+{
+ if (!(OCTEON_IS_MODEL(OCTEON_CN52XX) || OCTEON_IS_MODEL(OCTEON_CN56XX)))
+ cvmx_warn("CVMX_L2C_GRPWRR0 not supported on this chip\n");
+ return CVMX_ADD_IO_SEG(0x00011800800000C8ull);
+}
+#else
+#define CVMX_L2C_GRPWRR0 (CVMX_ADD_IO_SEG(0x00011800800000C8ull))
+#endif
+#if CVMX_ENABLE_CSR_ADDRESS_CHECKING
+#define CVMX_L2C_GRPWRR1 CVMX_L2C_GRPWRR1_FUNC()
+static inline uint64_t CVMX_L2C_GRPWRR1_FUNC(void)
+{
+ if (!(OCTEON_IS_MODEL(OCTEON_CN52XX) || OCTEON_IS_MODEL(OCTEON_CN56XX)))
+ cvmx_warn("CVMX_L2C_GRPWRR1 not supported on this chip\n");
+ return CVMX_ADD_IO_SEG(0x00011800800000D0ull);
+}
+#else
+#define CVMX_L2C_GRPWRR1 (CVMX_ADD_IO_SEG(0x00011800800000D0ull))
+#endif
+#if CVMX_ENABLE_CSR_ADDRESS_CHECKING
+#define CVMX_L2C_INT_EN CVMX_L2C_INT_EN_FUNC()
+static inline uint64_t CVMX_L2C_INT_EN_FUNC(void)
+{
+ if (!(OCTEON_IS_MODEL(OCTEON_CN52XX) || OCTEON_IS_MODEL(OCTEON_CN56XX)))
+ cvmx_warn("CVMX_L2C_INT_EN not supported on this chip\n");
+ return CVMX_ADD_IO_SEG(0x0001180080000100ull);
+}
+#else
+#define CVMX_L2C_INT_EN (CVMX_ADD_IO_SEG(0x0001180080000100ull))
+#endif
+#if CVMX_ENABLE_CSR_ADDRESS_CHECKING
+#define CVMX_L2C_INT_ENA CVMX_L2C_INT_ENA_FUNC()
+static inline uint64_t CVMX_L2C_INT_ENA_FUNC(void)
+{
+ if (!(OCTEON_IS_MODEL(OCTEON_CN63XX)))
+ cvmx_warn("CVMX_L2C_INT_ENA not supported on this chip\n");
+ return CVMX_ADD_IO_SEG(0x0001180080800020ull);
+}
+#else
+#define CVMX_L2C_INT_ENA (CVMX_ADD_IO_SEG(0x0001180080800020ull))
+#endif
+#if CVMX_ENABLE_CSR_ADDRESS_CHECKING
+#define CVMX_L2C_INT_REG CVMX_L2C_INT_REG_FUNC()
+static inline uint64_t CVMX_L2C_INT_REG_FUNC(void)
+{
+ if (!(OCTEON_IS_MODEL(OCTEON_CN63XX)))
+ cvmx_warn("CVMX_L2C_INT_REG not supported on this chip\n");
+ return CVMX_ADD_IO_SEG(0x0001180080800018ull);
+}
+#else
+#define CVMX_L2C_INT_REG (CVMX_ADD_IO_SEG(0x0001180080800018ull))
+#endif
+#if CVMX_ENABLE_CSR_ADDRESS_CHECKING
+#define CVMX_L2C_INT_STAT CVMX_L2C_INT_STAT_FUNC()
+static inline uint64_t CVMX_L2C_INT_STAT_FUNC(void)
+{
+ if (!(OCTEON_IS_MODEL(OCTEON_CN52XX) || OCTEON_IS_MODEL(OCTEON_CN56XX)))
+ cvmx_warn("CVMX_L2C_INT_STAT not supported on this chip\n");
+ return CVMX_ADD_IO_SEG(0x00011800800000F8ull);
+}
+#else
+#define CVMX_L2C_INT_STAT (CVMX_ADD_IO_SEG(0x00011800800000F8ull))
+#endif
+#if CVMX_ENABLE_CSR_ADDRESS_CHECKING
+static inline uint64_t CVMX_L2C_IOCX_PFC(unsigned long block_id)
+{
+ if (!(
+ (OCTEON_IS_MODEL(OCTEON_CN63XX) && ((block_id == 0)))))
+ cvmx_warn("CVMX_L2C_IOCX_PFC(%lu) is invalid on this chip\n", block_id);
+ return CVMX_ADD_IO_SEG(0x0001180080800420ull);
+}
+#else
+#define CVMX_L2C_IOCX_PFC(block_id) (CVMX_ADD_IO_SEG(0x0001180080800420ull))
+#endif
+#if CVMX_ENABLE_CSR_ADDRESS_CHECKING
+static inline uint64_t CVMX_L2C_IORX_PFC(unsigned long block_id)
+{
+ if (!(
+ (OCTEON_IS_MODEL(OCTEON_CN63XX) && ((block_id == 0)))))
+ cvmx_warn("CVMX_L2C_IORX_PFC(%lu) is invalid on this chip\n", block_id);
+ return CVMX_ADD_IO_SEG(0x0001180080800428ull);
+}
+#else
+#define CVMX_L2C_IORX_PFC(block_id) (CVMX_ADD_IO_SEG(0x0001180080800428ull))
+#endif
+#if CVMX_ENABLE_CSR_ADDRESS_CHECKING
+#define CVMX_L2C_LCKBASE CVMX_L2C_LCKBASE_FUNC()
+static inline uint64_t CVMX_L2C_LCKBASE_FUNC(void)
+{
+ if (!(OCTEON_IS_MODEL(OCTEON_CN3XXX) || OCTEON_IS_MODEL(OCTEON_CN5XXX)))
+ cvmx_warn("CVMX_L2C_LCKBASE not supported on this chip\n");
+ return CVMX_ADD_IO_SEG(0x0001180080000058ull);
+}
+#else
+#define CVMX_L2C_LCKBASE (CVMX_ADD_IO_SEG(0x0001180080000058ull))
+#endif
+#if CVMX_ENABLE_CSR_ADDRESS_CHECKING
+#define CVMX_L2C_LCKOFF CVMX_L2C_LCKOFF_FUNC()
+static inline uint64_t CVMX_L2C_LCKOFF_FUNC(void)
+{
+ if (!(OCTEON_IS_MODEL(OCTEON_CN3XXX) || OCTEON_IS_MODEL(OCTEON_CN5XXX)))
+ cvmx_warn("CVMX_L2C_LCKOFF not supported on this chip\n");
+ return CVMX_ADD_IO_SEG(0x0001180080000060ull);
+}
+#else
+#define CVMX_L2C_LCKOFF (CVMX_ADD_IO_SEG(0x0001180080000060ull))
+#endif
+#if CVMX_ENABLE_CSR_ADDRESS_CHECKING
+#define CVMX_L2C_LFB0 CVMX_L2C_LFB0_FUNC()
+static inline uint64_t CVMX_L2C_LFB0_FUNC(void)
+{
+ if (!(OCTEON_IS_MODEL(OCTEON_CN3XXX) || OCTEON_IS_MODEL(OCTEON_CN5XXX)))
+ cvmx_warn("CVMX_L2C_LFB0 not supported on this chip\n");
+ return CVMX_ADD_IO_SEG(0x0001180080000038ull);
+}
+#else
+#define CVMX_L2C_LFB0 (CVMX_ADD_IO_SEG(0x0001180080000038ull))
+#endif
+#if CVMX_ENABLE_CSR_ADDRESS_CHECKING
+#define CVMX_L2C_LFB1 CVMX_L2C_LFB1_FUNC()
+static inline uint64_t CVMX_L2C_LFB1_FUNC(void)
+{
+ if (!(OCTEON_IS_MODEL(OCTEON_CN3XXX) || OCTEON_IS_MODEL(OCTEON_CN5XXX)))
+ cvmx_warn("CVMX_L2C_LFB1 not supported on this chip\n");
+ return CVMX_ADD_IO_SEG(0x0001180080000040ull);
+}
+#else
+#define CVMX_L2C_LFB1 (CVMX_ADD_IO_SEG(0x0001180080000040ull))
+#endif
+#if CVMX_ENABLE_CSR_ADDRESS_CHECKING
+#define CVMX_L2C_LFB2 CVMX_L2C_LFB2_FUNC()
+static inline uint64_t CVMX_L2C_LFB2_FUNC(void)
+{
+ if (!(OCTEON_IS_MODEL(OCTEON_CN3XXX) || OCTEON_IS_MODEL(OCTEON_CN5XXX)))
+ cvmx_warn("CVMX_L2C_LFB2 not supported on this chip\n");
+ return CVMX_ADD_IO_SEG(0x0001180080000048ull);
+}
+#else
+#define CVMX_L2C_LFB2 (CVMX_ADD_IO_SEG(0x0001180080000048ull))
+#endif
+#if CVMX_ENABLE_CSR_ADDRESS_CHECKING
+#define CVMX_L2C_LFB3 CVMX_L2C_LFB3_FUNC()
+static inline uint64_t CVMX_L2C_LFB3_FUNC(void)
+{
+ if (!(OCTEON_IS_MODEL(OCTEON_CN3XXX) || OCTEON_IS_MODEL(OCTEON_CN5XXX)))
+ cvmx_warn("CVMX_L2C_LFB3 not supported on this chip\n");
+ return CVMX_ADD_IO_SEG(0x00011800800000B8ull);
+}
+#else
+#define CVMX_L2C_LFB3 (CVMX_ADD_IO_SEG(0x00011800800000B8ull))
+#endif
+#if CVMX_ENABLE_CSR_ADDRESS_CHECKING
+#define CVMX_L2C_OOB CVMX_L2C_OOB_FUNC()
+static inline uint64_t CVMX_L2C_OOB_FUNC(void)
+{
+ if (!(OCTEON_IS_MODEL(OCTEON_CN52XX) || OCTEON_IS_MODEL(OCTEON_CN56XX)))
+ cvmx_warn("CVMX_L2C_OOB not supported on this chip\n");
+ return CVMX_ADD_IO_SEG(0x00011800800000D8ull);
+}
+#else
+#define CVMX_L2C_OOB (CVMX_ADD_IO_SEG(0x00011800800000D8ull))
+#endif
+#if CVMX_ENABLE_CSR_ADDRESS_CHECKING
+#define CVMX_L2C_OOB1 CVMX_L2C_OOB1_FUNC()
+static inline uint64_t CVMX_L2C_OOB1_FUNC(void)
+{
+ if (!(OCTEON_IS_MODEL(OCTEON_CN52XX) || OCTEON_IS_MODEL(OCTEON_CN56XX)))
+ cvmx_warn("CVMX_L2C_OOB1 not supported on this chip\n");
+ return CVMX_ADD_IO_SEG(0x00011800800000E0ull);
+}
+#else
+#define CVMX_L2C_OOB1 (CVMX_ADD_IO_SEG(0x00011800800000E0ull))
+#endif
+#if CVMX_ENABLE_CSR_ADDRESS_CHECKING
+#define CVMX_L2C_OOB2 CVMX_L2C_OOB2_FUNC()
+static inline uint64_t CVMX_L2C_OOB2_FUNC(void)
+{
+ if (!(OCTEON_IS_MODEL(OCTEON_CN52XX) || OCTEON_IS_MODEL(OCTEON_CN56XX)))
+ cvmx_warn("CVMX_L2C_OOB2 not supported on this chip\n");
+ return CVMX_ADD_IO_SEG(0x00011800800000E8ull);
+}
+#else
+#define CVMX_L2C_OOB2 (CVMX_ADD_IO_SEG(0x00011800800000E8ull))
+#endif
+#if CVMX_ENABLE_CSR_ADDRESS_CHECKING
+#define CVMX_L2C_OOB3 CVMX_L2C_OOB3_FUNC()
+static inline uint64_t CVMX_L2C_OOB3_FUNC(void)
+{
+ if (!(OCTEON_IS_MODEL(OCTEON_CN52XX) || OCTEON_IS_MODEL(OCTEON_CN56XX)))
+ cvmx_warn("CVMX_L2C_OOB3 not supported on this chip\n");
+ return CVMX_ADD_IO_SEG(0x00011800800000F0ull);
+}
+#else
+#define CVMX_L2C_OOB3 (CVMX_ADD_IO_SEG(0x00011800800000F0ull))
+#endif
+#define CVMX_L2C_PFC0 CVMX_L2C_PFCX(0)
+#define CVMX_L2C_PFC1 CVMX_L2C_PFCX(1)
+#define CVMX_L2C_PFC2 CVMX_L2C_PFCX(2)
+#define CVMX_L2C_PFC3 CVMX_L2C_PFCX(3)
+#if CVMX_ENABLE_CSR_ADDRESS_CHECKING
+#define CVMX_L2C_PFCTL CVMX_L2C_PFCTL_FUNC()
+static inline uint64_t CVMX_L2C_PFCTL_FUNC(void)
+{
+ if (!(OCTEON_IS_MODEL(OCTEON_CN3XXX) || OCTEON_IS_MODEL(OCTEON_CN5XXX)))
+ cvmx_warn("CVMX_L2C_PFCTL not supported on this chip\n");
+ return CVMX_ADD_IO_SEG(0x0001180080000090ull);
+}
+#else
+#define CVMX_L2C_PFCTL (CVMX_ADD_IO_SEG(0x0001180080000090ull))
+#endif
+#if CVMX_ENABLE_CSR_ADDRESS_CHECKING
+static inline uint64_t CVMX_L2C_PFCX(unsigned long offset)
+{
+ if (!(
+ (OCTEON_IS_MODEL(OCTEON_CN30XX) && ((offset <= 3))) ||
+ (OCTEON_IS_MODEL(OCTEON_CN31XX) && ((offset <= 3))) ||
+ (OCTEON_IS_MODEL(OCTEON_CN38XX) && ((offset <= 3))) ||
+ (OCTEON_IS_MODEL(OCTEON_CN50XX) && ((offset <= 3))) ||
+ (OCTEON_IS_MODEL(OCTEON_CN52XX) && ((offset <= 3))) ||
+ (OCTEON_IS_MODEL(OCTEON_CN56XX) && ((offset <= 3))) ||
+ (OCTEON_IS_MODEL(OCTEON_CN58XX) && ((offset <= 3)))))
+ cvmx_warn("CVMX_L2C_PFCX(%lu) is invalid on this chip\n", offset);
+ return CVMX_ADD_IO_SEG(0x0001180080000098ull) + ((offset) & 3) * 8;
+}
+#else
+#define CVMX_L2C_PFCX(offset) (CVMX_ADD_IO_SEG(0x0001180080000098ull) + ((offset) & 3) * 8)
+#endif
+#if CVMX_ENABLE_CSR_ADDRESS_CHECKING
+#define CVMX_L2C_PPGRP CVMX_L2C_PPGRP_FUNC()
+static inline uint64_t CVMX_L2C_PPGRP_FUNC(void)
+{
+ if (!(OCTEON_IS_MODEL(OCTEON_CN52XX) || OCTEON_IS_MODEL(OCTEON_CN56XX)))
+ cvmx_warn("CVMX_L2C_PPGRP not supported on this chip\n");
+ return CVMX_ADD_IO_SEG(0x00011800800000C0ull);
+}
+#else
+#define CVMX_L2C_PPGRP (CVMX_ADD_IO_SEG(0x00011800800000C0ull))
+#endif
+#if CVMX_ENABLE_CSR_ADDRESS_CHECKING
+static inline uint64_t CVMX_L2C_QOS_IOBX(unsigned long block_id)
+{
+ if (!(
+ (OCTEON_IS_MODEL(OCTEON_CN63XX) && ((block_id == 0)))))
+ cvmx_warn("CVMX_L2C_QOS_IOBX(%lu) is invalid on this chip\n", block_id);
+ return CVMX_ADD_IO_SEG(0x0001180080880200ull);
+}
+#else
+#define CVMX_L2C_QOS_IOBX(block_id) (CVMX_ADD_IO_SEG(0x0001180080880200ull))
+#endif
+#if CVMX_ENABLE_CSR_ADDRESS_CHECKING
+static inline uint64_t CVMX_L2C_QOS_PPX(unsigned long offset)
+{
+ if (!(
+ (OCTEON_IS_MODEL(OCTEON_CN63XX) && ((offset <= 5)))))
+ cvmx_warn("CVMX_L2C_QOS_PPX(%lu) is invalid on this chip\n", offset);
+ return CVMX_ADD_IO_SEG(0x0001180080880000ull) + ((offset) & 7) * 8;
+}
+#else
+#define CVMX_L2C_QOS_PPX(offset) (CVMX_ADD_IO_SEG(0x0001180080880000ull) + ((offset) & 7) * 8)
+#endif
+#if CVMX_ENABLE_CSR_ADDRESS_CHECKING
+#define CVMX_L2C_QOS_WGT CVMX_L2C_QOS_WGT_FUNC()
+static inline uint64_t CVMX_L2C_QOS_WGT_FUNC(void)
+{
+ if (!(OCTEON_IS_MODEL(OCTEON_CN63XX)))
+ cvmx_warn("CVMX_L2C_QOS_WGT not supported on this chip\n");
+ return CVMX_ADD_IO_SEG(0x0001180080800008ull);
+}
+#else
+#define CVMX_L2C_QOS_WGT (CVMX_ADD_IO_SEG(0x0001180080800008ull))
+#endif
+#if CVMX_ENABLE_CSR_ADDRESS_CHECKING
+static inline uint64_t CVMX_L2C_RSCX_PFC(unsigned long block_id)
+{
+ if (!(
+ (OCTEON_IS_MODEL(OCTEON_CN63XX) && ((block_id == 0)))))
+ cvmx_warn("CVMX_L2C_RSCX_PFC(%lu) is invalid on this chip\n", block_id);
+ return CVMX_ADD_IO_SEG(0x0001180080800410ull);
+}
+#else
+#define CVMX_L2C_RSCX_PFC(block_id) (CVMX_ADD_IO_SEG(0x0001180080800410ull))
+#endif
+#if CVMX_ENABLE_CSR_ADDRESS_CHECKING
+static inline uint64_t CVMX_L2C_RSDX_PFC(unsigned long block_id)
+{
+ if (!(
+ (OCTEON_IS_MODEL(OCTEON_CN63XX) && ((block_id == 0)))))
+ cvmx_warn("CVMX_L2C_RSDX_PFC(%lu) is invalid on this chip\n", block_id);
+ return CVMX_ADD_IO_SEG(0x0001180080800418ull);
+}
+#else
+#define CVMX_L2C_RSDX_PFC(block_id) (CVMX_ADD_IO_SEG(0x0001180080800418ull))
+#endif
+#if CVMX_ENABLE_CSR_ADDRESS_CHECKING
+#define CVMX_L2C_SPAR0 CVMX_L2C_SPAR0_FUNC()
+static inline uint64_t CVMX_L2C_SPAR0_FUNC(void)
+{
+ if (!(OCTEON_IS_MODEL(OCTEON_CN3XXX) || OCTEON_IS_MODEL(OCTEON_CN5XXX)))
+ cvmx_warn("CVMX_L2C_SPAR0 not supported on this chip\n");
+ return CVMX_ADD_IO_SEG(0x0001180080000068ull);
+}
+#else
+#define CVMX_L2C_SPAR0 (CVMX_ADD_IO_SEG(0x0001180080000068ull))
+#endif
+#if CVMX_ENABLE_CSR_ADDRESS_CHECKING
+#define CVMX_L2C_SPAR1 CVMX_L2C_SPAR1_FUNC()
+static inline uint64_t CVMX_L2C_SPAR1_FUNC(void)
+{
+ if (!(OCTEON_IS_MODEL(OCTEON_CN38XX) || OCTEON_IS_MODEL(OCTEON_CN56XX) || OCTEON_IS_MODEL(OCTEON_CN58XX)))
+ cvmx_warn("CVMX_L2C_SPAR1 not supported on this chip\n");
+ return CVMX_ADD_IO_SEG(0x0001180080000070ull);
+}
+#else
+#define CVMX_L2C_SPAR1 (CVMX_ADD_IO_SEG(0x0001180080000070ull))
+#endif
+#if CVMX_ENABLE_CSR_ADDRESS_CHECKING
+#define CVMX_L2C_SPAR2 CVMX_L2C_SPAR2_FUNC()
+static inline uint64_t CVMX_L2C_SPAR2_FUNC(void)
+{
+ if (!(OCTEON_IS_MODEL(OCTEON_CN38XX) || OCTEON_IS_MODEL(OCTEON_CN56XX) || OCTEON_IS_MODEL(OCTEON_CN58XX)))
+ cvmx_warn("CVMX_L2C_SPAR2 not supported on this chip\n");
+ return CVMX_ADD_IO_SEG(0x0001180080000078ull);
+}
+#else
+#define CVMX_L2C_SPAR2 (CVMX_ADD_IO_SEG(0x0001180080000078ull))
+#endif
+#if CVMX_ENABLE_CSR_ADDRESS_CHECKING
+#define CVMX_L2C_SPAR3 CVMX_L2C_SPAR3_FUNC()
+static inline uint64_t CVMX_L2C_SPAR3_FUNC(void)
+{
+ if (!(OCTEON_IS_MODEL(OCTEON_CN38XX) || OCTEON_IS_MODEL(OCTEON_CN58XX)))
+ cvmx_warn("CVMX_L2C_SPAR3 not supported on this chip\n");
+ return CVMX_ADD_IO_SEG(0x0001180080000080ull);
+}
+#else
+#define CVMX_L2C_SPAR3 (CVMX_ADD_IO_SEG(0x0001180080000080ull))
+#endif
+#if CVMX_ENABLE_CSR_ADDRESS_CHECKING
+#define CVMX_L2C_SPAR4 CVMX_L2C_SPAR4_FUNC()
+static inline uint64_t CVMX_L2C_SPAR4_FUNC(void)
+{
+ if (!(OCTEON_IS_MODEL(OCTEON_CN3XXX) || OCTEON_IS_MODEL(OCTEON_CN5XXX)))
+ cvmx_warn("CVMX_L2C_SPAR4 not supported on this chip\n");
+ return CVMX_ADD_IO_SEG(0x0001180080000088ull);
+}
+#else
+#define CVMX_L2C_SPAR4 (CVMX_ADD_IO_SEG(0x0001180080000088ull))
+#endif
+#if CVMX_ENABLE_CSR_ADDRESS_CHECKING
+static inline uint64_t CVMX_L2C_TADX_ECC0(unsigned long block_id)
+{
+ if (!(
+ (OCTEON_IS_MODEL(OCTEON_CN63XX) && ((block_id == 0)))))
+ cvmx_warn("CVMX_L2C_TADX_ECC0(%lu) is invalid on this chip\n", block_id);
+ return CVMX_ADD_IO_SEG(0x0001180080A00018ull);
+}
+#else
+#define CVMX_L2C_TADX_ECC0(block_id) (CVMX_ADD_IO_SEG(0x0001180080A00018ull))
+#endif
+#if CVMX_ENABLE_CSR_ADDRESS_CHECKING
+static inline uint64_t CVMX_L2C_TADX_ECC1(unsigned long block_id)
+{
+ if (!(
+ (OCTEON_IS_MODEL(OCTEON_CN63XX) && ((block_id == 0)))))
+ cvmx_warn("CVMX_L2C_TADX_ECC1(%lu) is invalid on this chip\n", block_id);
+ return CVMX_ADD_IO_SEG(0x0001180080A00020ull);
+}
+#else
+#define CVMX_L2C_TADX_ECC1(block_id) (CVMX_ADD_IO_SEG(0x0001180080A00020ull))
+#endif
+#if CVMX_ENABLE_CSR_ADDRESS_CHECKING
+static inline uint64_t CVMX_L2C_TADX_IEN(unsigned long block_id)
+{
+ if (!(
+ (OCTEON_IS_MODEL(OCTEON_CN63XX) && ((block_id == 0)))))
+ cvmx_warn("CVMX_L2C_TADX_IEN(%lu) is invalid on this chip\n", block_id);
+ return CVMX_ADD_IO_SEG(0x0001180080A00000ull);
+}
+#else
+#define CVMX_L2C_TADX_IEN(block_id) (CVMX_ADD_IO_SEG(0x0001180080A00000ull))
+#endif
+#if CVMX_ENABLE_CSR_ADDRESS_CHECKING
+static inline uint64_t CVMX_L2C_TADX_INT(unsigned long block_id)
+{
+ if (!(
+ (OCTEON_IS_MODEL(OCTEON_CN63XX) && ((block_id == 0)))))
+ cvmx_warn("CVMX_L2C_TADX_INT(%lu) is invalid on this chip\n", block_id);
+ return CVMX_ADD_IO_SEG(0x0001180080A00028ull);
+}
+#else
+#define CVMX_L2C_TADX_INT(block_id) (CVMX_ADD_IO_SEG(0x0001180080A00028ull))
+#endif
+#if CVMX_ENABLE_CSR_ADDRESS_CHECKING
+static inline uint64_t CVMX_L2C_TADX_PFC0(unsigned long block_id)
+{
+ if (!(
+ (OCTEON_IS_MODEL(OCTEON_CN63XX) && ((block_id == 0)))))
+ cvmx_warn("CVMX_L2C_TADX_PFC0(%lu) is invalid on this chip\n", block_id);
+ return CVMX_ADD_IO_SEG(0x0001180080A00400ull);
+}
+#else
+#define CVMX_L2C_TADX_PFC0(block_id) (CVMX_ADD_IO_SEG(0x0001180080A00400ull))
+#endif
+#if CVMX_ENABLE_CSR_ADDRESS_CHECKING
+static inline uint64_t CVMX_L2C_TADX_PFC1(unsigned long block_id)
+{
+ if (!(
+ (OCTEON_IS_MODEL(OCTEON_CN63XX) && ((block_id == 0)))))
+ cvmx_warn("CVMX_L2C_TADX_PFC1(%lu) is invalid on this chip\n", block_id);
+ return CVMX_ADD_IO_SEG(0x0001180080A00408ull);
+}
+#else
+#define CVMX_L2C_TADX_PFC1(block_id) (CVMX_ADD_IO_SEG(0x0001180080A00408ull))
+#endif
+#if CVMX_ENABLE_CSR_ADDRESS_CHECKING
+static inline uint64_t CVMX_L2C_TADX_PFC2(unsigned long block_id)
+{
+ if (!(
+ (OCTEON_IS_MODEL(OCTEON_CN63XX) && ((block_id == 0)))))
+ cvmx_warn("CVMX_L2C_TADX_PFC2(%lu) is invalid on this chip\n", block_id);
+ return CVMX_ADD_IO_SEG(0x0001180080A00410ull);
+}
+#else
+#define CVMX_L2C_TADX_PFC2(block_id) (CVMX_ADD_IO_SEG(0x0001180080A00410ull))
+#endif
+#if CVMX_ENABLE_CSR_ADDRESS_CHECKING
+static inline uint64_t CVMX_L2C_TADX_PFC3(unsigned long block_id)
+{
+ if (!(
+ (OCTEON_IS_MODEL(OCTEON_CN63XX) && ((block_id == 0)))))
+ cvmx_warn("CVMX_L2C_TADX_PFC3(%lu) is invalid on this chip\n", block_id);
+ return CVMX_ADD_IO_SEG(0x0001180080A00418ull);
+}
+#else
+#define CVMX_L2C_TADX_PFC3(block_id) (CVMX_ADD_IO_SEG(0x0001180080A00418ull))
+#endif
+#if CVMX_ENABLE_CSR_ADDRESS_CHECKING
+static inline uint64_t CVMX_L2C_TADX_PRF(unsigned long block_id)
+{
+ if (!(
+ (OCTEON_IS_MODEL(OCTEON_CN63XX) && ((block_id == 0)))))
+ cvmx_warn("CVMX_L2C_TADX_PRF(%lu) is invalid on this chip\n", block_id);
+ return CVMX_ADD_IO_SEG(0x0001180080A00008ull);
+}
+#else
+#define CVMX_L2C_TADX_PRF(block_id) (CVMX_ADD_IO_SEG(0x0001180080A00008ull))
+#endif
+#if CVMX_ENABLE_CSR_ADDRESS_CHECKING
+static inline uint64_t CVMX_L2C_TADX_TAG(unsigned long block_id)
+{
+ if (!(
+ (OCTEON_IS_MODEL(OCTEON_CN63XX) && ((block_id == 0)))))
+ cvmx_warn("CVMX_L2C_TADX_TAG(%lu) is invalid on this chip\n", block_id);
+ return CVMX_ADD_IO_SEG(0x0001180080A00010ull);
+}
+#else
+#define CVMX_L2C_TADX_TAG(block_id) (CVMX_ADD_IO_SEG(0x0001180080A00010ull))
+#endif
+#if CVMX_ENABLE_CSR_ADDRESS_CHECKING
+#define CVMX_L2C_VER_ID CVMX_L2C_VER_ID_FUNC()
+static inline uint64_t CVMX_L2C_VER_ID_FUNC(void)
+{
+ if (!(OCTEON_IS_MODEL(OCTEON_CN63XX)))
+ cvmx_warn("CVMX_L2C_VER_ID not supported on this chip\n");
+ return CVMX_ADD_IO_SEG(0x00011800808007E0ull);
+}
+#else
+#define CVMX_L2C_VER_ID (CVMX_ADD_IO_SEG(0x00011800808007E0ull))
+#endif
+#if CVMX_ENABLE_CSR_ADDRESS_CHECKING
+#define CVMX_L2C_VER_IOB CVMX_L2C_VER_IOB_FUNC()
+static inline uint64_t CVMX_L2C_VER_IOB_FUNC(void)
+{
+ if (!(OCTEON_IS_MODEL(OCTEON_CN63XX)))
+ cvmx_warn("CVMX_L2C_VER_IOB not supported on this chip\n");
+ return CVMX_ADD_IO_SEG(0x00011800808007F0ull);
+}
+#else
+#define CVMX_L2C_VER_IOB (CVMX_ADD_IO_SEG(0x00011800808007F0ull))
+#endif
+#if CVMX_ENABLE_CSR_ADDRESS_CHECKING
+#define CVMX_L2C_VER_MSC CVMX_L2C_VER_MSC_FUNC()
+static inline uint64_t CVMX_L2C_VER_MSC_FUNC(void)
+{
+ if (!(OCTEON_IS_MODEL(OCTEON_CN63XX)))
+ cvmx_warn("CVMX_L2C_VER_MSC not supported on this chip\n");
+ return CVMX_ADD_IO_SEG(0x00011800808007D0ull);
+}
+#else
+#define CVMX_L2C_VER_MSC (CVMX_ADD_IO_SEG(0x00011800808007D0ull))
+#endif
+#if CVMX_ENABLE_CSR_ADDRESS_CHECKING
+#define CVMX_L2C_VER_PP CVMX_L2C_VER_PP_FUNC()
+static inline uint64_t CVMX_L2C_VER_PP_FUNC(void)
+{
+ if (!(OCTEON_IS_MODEL(OCTEON_CN63XX)))
+ cvmx_warn("CVMX_L2C_VER_PP not supported on this chip\n");
+ return CVMX_ADD_IO_SEG(0x00011800808007E8ull);
+}
+#else
+#define CVMX_L2C_VER_PP (CVMX_ADD_IO_SEG(0x00011800808007E8ull))
+#endif
+#if CVMX_ENABLE_CSR_ADDRESS_CHECKING
+static inline uint64_t CVMX_L2C_VIRTID_IOBX(unsigned long block_id)
+{
+ if (!(
+ (OCTEON_IS_MODEL(OCTEON_CN63XX) && ((block_id == 0)))))
+ cvmx_warn("CVMX_L2C_VIRTID_IOBX(%lu) is invalid on this chip\n", block_id);
+ return CVMX_ADD_IO_SEG(0x00011800808C0200ull);
+}
+#else
+#define CVMX_L2C_VIRTID_IOBX(block_id) (CVMX_ADD_IO_SEG(0x00011800808C0200ull))
+#endif
+#if CVMX_ENABLE_CSR_ADDRESS_CHECKING
+static inline uint64_t CVMX_L2C_VIRTID_PPX(unsigned long offset)
+{
+ if (!(
+ (OCTEON_IS_MODEL(OCTEON_CN63XX) && ((offset <= 5)))))
+ cvmx_warn("CVMX_L2C_VIRTID_PPX(%lu) is invalid on this chip\n", offset);
+ return CVMX_ADD_IO_SEG(0x00011800808C0000ull) + ((offset) & 7) * 8;
+}
+#else
+#define CVMX_L2C_VIRTID_PPX(offset) (CVMX_ADD_IO_SEG(0x00011800808C0000ull) + ((offset) & 7) * 8)
+#endif
+#if CVMX_ENABLE_CSR_ADDRESS_CHECKING
+#define CVMX_L2C_VRT_CTL CVMX_L2C_VRT_CTL_FUNC()
+static inline uint64_t CVMX_L2C_VRT_CTL_FUNC(void)
+{
+ if (!(OCTEON_IS_MODEL(OCTEON_CN63XX)))
+ cvmx_warn("CVMX_L2C_VRT_CTL not supported on this chip\n");
+ return CVMX_ADD_IO_SEG(0x0001180080800010ull);
+}
+#else
+#define CVMX_L2C_VRT_CTL (CVMX_ADD_IO_SEG(0x0001180080800010ull))
+#endif
+#if CVMX_ENABLE_CSR_ADDRESS_CHECKING
+static inline uint64_t CVMX_L2C_VRT_MEMX(unsigned long offset)
+{
+ if (!(
+ (OCTEON_IS_MODEL(OCTEON_CN63XX) && ((offset <= 1023)))))
+ cvmx_warn("CVMX_L2C_VRT_MEMX(%lu) is invalid on this chip\n", offset);
+ return CVMX_ADD_IO_SEG(0x0001180080900000ull) + ((offset) & 1023) * 8;
+}
+#else
+#define CVMX_L2C_VRT_MEMX(offset) (CVMX_ADD_IO_SEG(0x0001180080900000ull) + ((offset) & 1023) * 8)
+#endif
+#if CVMX_ENABLE_CSR_ADDRESS_CHECKING
+static inline uint64_t CVMX_L2C_WPAR_IOBX(unsigned long block_id)
+{
+ if (!(
+ (OCTEON_IS_MODEL(OCTEON_CN63XX) && ((block_id == 0)))))
+ cvmx_warn("CVMX_L2C_WPAR_IOBX(%lu) is invalid on this chip\n", block_id);
+ return CVMX_ADD_IO_SEG(0x0001180080840200ull);
+}
+#else
+#define CVMX_L2C_WPAR_IOBX(block_id) (CVMX_ADD_IO_SEG(0x0001180080840200ull))
+#endif
+#if CVMX_ENABLE_CSR_ADDRESS_CHECKING
+static inline uint64_t CVMX_L2C_WPAR_PPX(unsigned long offset)
+{
+ if (!(
+ (OCTEON_IS_MODEL(OCTEON_CN63XX) && ((offset <= 5)))))
+ cvmx_warn("CVMX_L2C_WPAR_PPX(%lu) is invalid on this chip\n", offset);
+ return CVMX_ADD_IO_SEG(0x0001180080840000ull) + ((offset) & 7) * 8;
+}
+#else
+#define CVMX_L2C_WPAR_PPX(offset) (CVMX_ADD_IO_SEG(0x0001180080840000ull) + ((offset) & 7) * 8)
+#endif
+#if CVMX_ENABLE_CSR_ADDRESS_CHECKING
+static inline uint64_t CVMX_L2C_XMCX_PFC(unsigned long block_id)
+{
+ if (!(
+ (OCTEON_IS_MODEL(OCTEON_CN63XX) && ((block_id == 0)))))
+ cvmx_warn("CVMX_L2C_XMCX_PFC(%lu) is invalid on this chip\n", block_id);
+ return CVMX_ADD_IO_SEG(0x0001180080800400ull);
+}
+#else
+#define CVMX_L2C_XMCX_PFC(block_id) (CVMX_ADD_IO_SEG(0x0001180080800400ull))
+#endif
+#if CVMX_ENABLE_CSR_ADDRESS_CHECKING
+#define CVMX_L2C_XMC_CMD CVMX_L2C_XMC_CMD_FUNC()
+static inline uint64_t CVMX_L2C_XMC_CMD_FUNC(void)
+{
+ if (!(OCTEON_IS_MODEL(OCTEON_CN63XX)))
+ cvmx_warn("CVMX_L2C_XMC_CMD not supported on this chip\n");
+ return CVMX_ADD_IO_SEG(0x0001180080800028ull);
+}
+#else
+#define CVMX_L2C_XMC_CMD (CVMX_ADD_IO_SEG(0x0001180080800028ull))
+#endif
+#if CVMX_ENABLE_CSR_ADDRESS_CHECKING
+static inline uint64_t CVMX_L2C_XMDX_PFC(unsigned long block_id)
+{
+ if (!(
+ (OCTEON_IS_MODEL(OCTEON_CN63XX) && ((block_id == 0)))))
+ cvmx_warn("CVMX_L2C_XMDX_PFC(%lu) is invalid on this chip\n", block_id);
+ return CVMX_ADD_IO_SEG(0x0001180080800408ull);
+}
+#else
+#define CVMX_L2C_XMDX_PFC(block_id) (CVMX_ADD_IO_SEG(0x0001180080800408ull))
+#endif
+
+/**
+ * cvmx_l2c_big_ctl
+ *
+ * L2C_BIG_CTL = L2C Big memory control register
+ *
+ *
+ * Notes:
+ * (1) BIGRD interrupts can occur during normal operation as the PP's are allowed to prefetch to
+ * non-existent memory locations. Therefore, BIGRD is for informational purposes only.
+ *
+ * (2) When HOLEWR/BIGWR blocks a store L2C_VER_ID, L2C_VER_PP, L2C_VER_IOB, and L2C_VER_MSC will be
+ * loaded just like a store which is blocked by VRTWR. Additionally, L2C_ERR_XMC will be loaded.
+ */
+union cvmx_l2c_big_ctl
+{
+ uint64_t u64;
+ struct cvmx_l2c_big_ctl_s
+ {
+#if __BYTE_ORDER == __BIG_ENDIAN
+ uint64_t reserved_8_63 : 56;
+ uint64_t maxdram : 4; /**< Amount of configured DRAM
+ 0 = reserved
+ 1 = 512MB
+ 2 = 1GB
+ 3 = 2GB
+ 4 = 4GB
+ 5 = 8GB
+ 6 = 16GB
+ 7 = 32GB
+ 8 = 64GB (**reserved in 63xx**)
+ 9 = 128GB (**reserved in 63xx**)
+ 10-15 reserved
+ Violations of this limit causes
+ L2C to set L2C_INT_REG[BIGRD/BIGWR]. */
+ uint64_t reserved_1_3 : 3;
+ uint64_t disable : 1; /**< When set, disables the BIGWR/BIGRD logic completely
+ and reverts HOLEWR to 63xx pass 1.x behavior.
+ When clear, BIGWR and HOLEWR block stores in the same
+ same manner as the VRT logic, and BIGRD is reported. */
+#else
+ uint64_t disable : 1;
+ uint64_t reserved_1_3 : 3;
+ uint64_t maxdram : 4;
+ uint64_t reserved_8_63 : 56;
+#endif
+ } s;
+ struct cvmx_l2c_big_ctl_s cn63xx;
+};
+typedef union cvmx_l2c_big_ctl cvmx_l2c_big_ctl_t;
+
+/**
+ * cvmx_l2c_bst
+ *
+ * L2C_BST = L2C BIST Status
+ *
+ */
+union cvmx_l2c_bst
+{
+ uint64_t u64;
+ struct cvmx_l2c_bst_s
+ {
+#if __BYTE_ORDER == __BIG_ENDIAN
+ uint64_t reserved_38_63 : 26;
+ uint64_t dutfl : 6; /**< BIST failure status for PP0-5 DUT */
+ uint64_t reserved_17_31 : 15;
+ uint64_t ioccmdfl : 1; /**< BIST failure status for IOCCMD */
+ uint64_t reserved_13_15 : 3;
+ uint64_t iocdatfl : 1; /**< BIST failure status for IOCDAT */
+ uint64_t reserved_9_11 : 3;
+ uint64_t dutresfl : 1; /**< BIST failure status for DUTRES */
+ uint64_t reserved_5_7 : 3;
+ uint64_t vrtfl : 1; /**< BIST failure status for VRT0 */
+ uint64_t reserved_1_3 : 3;
+ uint64_t tdffl : 1; /**< BIST failure status for TDF0 */
+#else
+ uint64_t tdffl : 1;
+ uint64_t reserved_1_3 : 3;
+ uint64_t vrtfl : 1;
+ uint64_t reserved_5_7 : 3;
+ uint64_t dutresfl : 1;
+ uint64_t reserved_9_11 : 3;
+ uint64_t iocdatfl : 1;
+ uint64_t reserved_13_15 : 3;
+ uint64_t ioccmdfl : 1;
+ uint64_t reserved_17_31 : 15;
+ uint64_t dutfl : 6;
+ uint64_t reserved_38_63 : 26;
+#endif
+ } s;
+ struct cvmx_l2c_bst_s cn63xx;
+ struct cvmx_l2c_bst_s cn63xxp1;
+};
+typedef union cvmx_l2c_bst cvmx_l2c_bst_t;
+
+/**
+ * cvmx_l2c_bst0
+ *
+ * L2C_BST0 = L2C BIST 0 CTL/STAT
+ *
+ */
+union cvmx_l2c_bst0
+{
+ uint64_t u64;
+ struct cvmx_l2c_bst0_s
+ {
+#if __BYTE_ORDER == __BIG_ENDIAN
+ uint64_t reserved_24_63 : 40;
+ uint64_t dtbnk : 1; /**< DuTag Bank#
+ When DT=1(BAD), this field provides additional information
+ about which DuTag Bank (0/1) failed. */
+ uint64_t wlb_msk : 4; /**< Bist Results for WLB-MSK RAM [DP0-3]
+ - 0: GOOD (or bist in progress/never run)
+ - 1: BAD */
+ uint64_t dtcnt : 13; /**< DuTag BiST Counter (used to help isolate the failure)
+ [12]: i (0=FORWARD/1=REVERSE pass)
+ [11:10]: j (Pattern# 1 of 4)
+ [9:4]: k (DT Index 1 of 64)
+ [3:0]: l (DT# 1 of 16 DTs) */
+ uint64_t dt : 1; /**< Bist Results for DuTAG RAM(s)
+ - 0: GOOD (or bist in progress/never run)
+ - 1: BAD */
+ uint64_t stin_msk : 1; /**< Bist Results for STIN-MSK RAM
+ - 0: GOOD (or bist in progress/never run)
+ - 1: BAD */
+ uint64_t wlb_dat : 4; /**< Bist Results for WLB-DAT RAM [DP0-3]
+ - 0: GOOD (or bist in progress/never run)
+ - 1: BAD */
+#else
+ uint64_t wlb_dat : 4;
+ uint64_t stin_msk : 1;
+ uint64_t dt : 1;
+ uint64_t dtcnt : 13;
+ uint64_t wlb_msk : 4;
+ uint64_t dtbnk : 1;
+ uint64_t reserved_24_63 : 40;
+#endif
+ } s;
+ struct cvmx_l2c_bst0_cn30xx
+ {
+#if __BYTE_ORDER == __BIG_ENDIAN
+ uint64_t reserved_23_63 : 41;
+ uint64_t wlb_msk : 4; /**< Bist Results for WLB-MSK RAM [DP0-3]
+ - 0: GOOD (or bist in progress/never run)
+ - 1: BAD */
+ uint64_t reserved_15_18 : 4;
+ uint64_t dtcnt : 9; /**< DuTag BiST Counter (used to help isolate the failure)
+ [8]: i (0=FORWARD/1=REVERSE pass)
+ [7:6]: j (Pattern# 1 of 4)
+ [5:0]: k (DT Index 1 of 64) */
+ uint64_t dt : 1; /**< Bist Results for DuTAG RAM(s)
+ - 0: GOOD (or bist in progress/never run)
+ - 1: BAD */
+ uint64_t reserved_4_4 : 1;
+ uint64_t wlb_dat : 4; /**< Bist Results for WLB-DAT RAM [DP0-3]
+ - 0: GOOD (or bist in progress/never run)
+ - 1: BAD */
+#else
+ uint64_t wlb_dat : 4;
+ uint64_t reserved_4_4 : 1;
+ uint64_t dt : 1;
+ uint64_t dtcnt : 9;
+ uint64_t reserved_15_18 : 4;
+ uint64_t wlb_msk : 4;
+ uint64_t reserved_23_63 : 41;
+#endif
+ } cn30xx;
+ struct cvmx_l2c_bst0_cn31xx
+ {
+#if __BYTE_ORDER == __BIG_ENDIAN
+ uint64_t reserved_23_63 : 41;
+ uint64_t wlb_msk : 4; /**< Bist Results for WLB-MSK RAM [DP0-3]
+ - 0: GOOD (or bist in progress/never run)
+ - 1: BAD */
+ uint64_t reserved_16_18 : 3;
+ uint64_t dtcnt : 10; /**< DuTag BiST Counter (used to help isolate the failure)
+ [9]: i (0=FORWARD/1=REVERSE pass)
+ [8:7]: j (Pattern# 1 of 4)
+ [6:1]: k (DT Index 1 of 64)
+ [0]: l (DT# 1 of 2 DTs) */
+ uint64_t dt : 1; /**< Bist Results for DuTAG RAM(s)
+ - 0: GOOD (or bist in progress/never run)
+ - 1: BAD */
+ uint64_t stin_msk : 1; /**< Bist Results for STIN-MSK RAM
+ - 0: GOOD (or bist in progress/never run)
+ - 1: BAD */
+ uint64_t wlb_dat : 4; /**< Bist Results for WLB-DAT RAM [DP0-3]
+ - 0: GOOD (or bist in progress/never run)
+ - 1: BAD */
+#else
+ uint64_t wlb_dat : 4;
+ uint64_t stin_msk : 1;
+ uint64_t dt : 1;
+ uint64_t dtcnt : 10;
+ uint64_t reserved_16_18 : 3;
+ uint64_t wlb_msk : 4;
+ uint64_t reserved_23_63 : 41;
+#endif
+ } cn31xx;
+ struct cvmx_l2c_bst0_cn38xx
+ {
+#if __BYTE_ORDER == __BIG_ENDIAN
+ uint64_t reserved_19_63 : 45;
+ uint64_t dtcnt : 13; /**< DuTag BiST Counter (used to help isolate the failure)
+ [12]: i (0=FORWARD/1=REVERSE pass)
+ [11:10]: j (Pattern# 1 of 4)
+ [9:4]: k (DT Index 1 of 64)
+ [3:0]: l (DT# 1 of 16 DTs) */
+ uint64_t dt : 1; /**< Bist Results for DuTAG RAM(s)
+ - 0: GOOD (or bist in progress/never run)
+ - 1: BAD */
+ uint64_t stin_msk : 1; /**< Bist Results for STIN-MSK RAM
+ - 0: GOOD (or bist in progress/never run)
+ - 1: BAD */
+ uint64_t wlb_dat : 4; /**< Bist Results for WLB-DAT RAM [DP0-3]
+ - 0: GOOD (or bist in progress/never run)
+ - 1: BAD */
+#else
+ uint64_t wlb_dat : 4;
+ uint64_t stin_msk : 1;
+ uint64_t dt : 1;
+ uint64_t dtcnt : 13;
+ uint64_t reserved_19_63 : 45;
+#endif
+ } cn38xx;
+ struct cvmx_l2c_bst0_cn38xx cn38xxp2;
+ struct cvmx_l2c_bst0_cn50xx
+ {
+#if __BYTE_ORDER == __BIG_ENDIAN
+ uint64_t reserved_24_63 : 40;
+ uint64_t dtbnk : 1; /**< DuTag Bank#
+ When DT=1(BAD), this field provides additional information
+ about which DuTag Bank (0/1) failed. */
+ uint64_t wlb_msk : 4; /**< Bist Results for WLB-MSK RAM [DP0-3]
+ - 0: GOOD (or bist in progress/never run)
+ - 1: BAD */
+ uint64_t reserved_16_18 : 3;
+ uint64_t dtcnt : 10; /**< DuTag BiST Counter (used to help isolate the failure)
+ [9]: i (0=FORWARD/1=REVERSE pass)
+ [8:7]: j (Pattern# 1 of 4)
+ [6:1]: k (DT Index 1 of 64)
+ [0]: l (DT# 1 of 2 DTs) */
+ uint64_t dt : 1; /**< Bist Results for DuTAG RAM(s)
+ - 0: GOOD (or bist in progress/never run)
+ - 1: BAD */
+ uint64_t stin_msk : 1; /**< Bist Results for STIN-MSK RAM
+ - 0: GOOD (or bist in progress/never run)
+ - 1: BAD */
+ uint64_t wlb_dat : 4; /**< Bist Results for WLB-DAT RAM [DP0-3]
+ - 0: GOOD (or bist in progress/never run)
+ - 1: BAD */
+#else
+ uint64_t wlb_dat : 4;
+ uint64_t stin_msk : 1;
+ uint64_t dt : 1;
+ uint64_t dtcnt : 10;
+ uint64_t reserved_16_18 : 3;
+ uint64_t wlb_msk : 4;
+ uint64_t dtbnk : 1;
+ uint64_t reserved_24_63 : 40;
+#endif
+ } cn50xx;
+ struct cvmx_l2c_bst0_cn50xx cn52xx;
+ struct cvmx_l2c_bst0_cn50xx cn52xxp1;
+ struct cvmx_l2c_bst0_s cn56xx;
+ struct cvmx_l2c_bst0_s cn56xxp1;
+ struct cvmx_l2c_bst0_s cn58xx;
+ struct cvmx_l2c_bst0_s cn58xxp1;
+};
+typedef union cvmx_l2c_bst0 cvmx_l2c_bst0_t;
+
+/**
+ * cvmx_l2c_bst1
+ *
+ * L2C_BST1 = L2C BIST 1 CTL/STAT
+ *
+ */
+union cvmx_l2c_bst1
+{
+ uint64_t u64;
+ struct cvmx_l2c_bst1_s
+ {
+#if __BYTE_ORDER == __BIG_ENDIAN
+ uint64_t reserved_9_63 : 55;
+ uint64_t l2t : 9; /**< Bist Results for L2T (USE+8SET RAMs)
+ - 0: GOOD (or bist in progress/never run)
+ - 1: BAD */
+#else
+ uint64_t l2t : 9;
+ uint64_t reserved_9_63 : 55;
+#endif
+ } s;
+ struct cvmx_l2c_bst1_cn30xx
+ {
+#if __BYTE_ORDER == __BIG_ENDIAN
+ uint64_t reserved_16_63 : 48;
+ uint64_t vwdf : 4; /**< Bist Results for VWDF RAMs
+ - 0: GOOD (or bist in progress/never run)
+ - 1: BAD */
+ uint64_t lrf : 2; /**< Bist Results for LRF RAMs (PLC+ILC)
+ - 0: GOOD (or bist in progress/never run)
+ - 1: BAD */
+ uint64_t vab_vwcf : 1; /**< Bist Results for VAB VWCF_MEM
+ - 0: GOOD (or bist in progress/never run)
+ - 1: BAD */
+ uint64_t reserved_5_8 : 4;
+ uint64_t l2t : 5; /**< Bist Results for L2T (USE+4SET RAMs)
+ - 0: GOOD (or bist in progress/never run)
+ - 1: BAD */
+#else
+ uint64_t l2t : 5;
+ uint64_t reserved_5_8 : 4;
+ uint64_t vab_vwcf : 1;
+ uint64_t lrf : 2;
+ uint64_t vwdf : 4;
+ uint64_t reserved_16_63 : 48;
+#endif
+ } cn30xx;
+ struct cvmx_l2c_bst1_cn30xx cn31xx;
+ struct cvmx_l2c_bst1_cn38xx
+ {
+#if __BYTE_ORDER == __BIG_ENDIAN
+ uint64_t reserved_16_63 : 48;
+ uint64_t vwdf : 4; /**< Bist Results for VWDF RAMs
+ - 0: GOOD (or bist in progress/never run)
+ - 1: BAD */
+ uint64_t lrf : 2; /**< Bist Results for LRF RAMs (PLC+ILC)
+ - 0: GOOD (or bist in progress/never run)
+ - 1: BAD */
+ uint64_t vab_vwcf : 1; /**< Bist Results for VAB VWCF_MEM
+ - 0: GOOD (or bist in progress/never run)
+ - 1: BAD */
+ uint64_t l2t : 9; /**< Bist Results for L2T (USE+8SET RAMs)
+ - 0: GOOD (or bist in progress/never run)
+ - 1: BAD */
+#else
+ uint64_t l2t : 9;
+ uint64_t vab_vwcf : 1;
+ uint64_t lrf : 2;
+ uint64_t vwdf : 4;
+ uint64_t reserved_16_63 : 48;
+#endif
+ } cn38xx;
+ struct cvmx_l2c_bst1_cn38xx cn38xxp2;
+ struct cvmx_l2c_bst1_cn38xx cn50xx;
+ struct cvmx_l2c_bst1_cn52xx
+ {
+#if __BYTE_ORDER == __BIG_ENDIAN
+ uint64_t reserved_19_63 : 45;
+ uint64_t plc2 : 1; /**< Bist Results for PLC2 RAM
+ - 0: GOOD (or bist in progress/never run)
+ - 1: BAD */
+ uint64_t plc1 : 1; /**< Bist Results for PLC1 RAM
+ - 0: GOOD (or bist in progress/never run)
+ - 1: BAD */
+ uint64_t plc0 : 1; /**< Bist Results for PLC0 RAM
+ - 0: GOOD (or bist in progress/never run)
+ - 1: BAD */
+ uint64_t vwdf : 4; /**< Bist Results for VWDF RAMs
+ - 0: GOOD (or bist in progress/never run)
+ - 1: BAD */
+ uint64_t reserved_11_11 : 1;
+ uint64_t ilc : 1; /**< Bist Results for ILC RAM
+ - 0: GOOD (or bist in progress/never run)
+ - 1: BAD */
+ uint64_t vab_vwcf : 1; /**< Bist Results for VAB VWCF_MEM
+ - 0: GOOD (or bist in progress/never run)
+ - 1: BAD */
+ uint64_t l2t : 9; /**< Bist Results for L2T (USE+8SET RAMs)
+ - 0: GOOD (or bist in progress/never run)
+ - 1: BAD */
+#else
+ uint64_t l2t : 9;
+ uint64_t vab_vwcf : 1;
+ uint64_t ilc : 1;
+ uint64_t reserved_11_11 : 1;
+ uint64_t vwdf : 4;
+ uint64_t plc0 : 1;
+ uint64_t plc1 : 1;
+ uint64_t plc2 : 1;
+ uint64_t reserved_19_63 : 45;
+#endif
+ } cn52xx;
+ struct cvmx_l2c_bst1_cn52xx cn52xxp1;
+ struct cvmx_l2c_bst1_cn56xx
+ {
+#if __BYTE_ORDER == __BIG_ENDIAN
+ uint64_t reserved_24_63 : 40;
+ uint64_t plc2 : 1; /**< Bist Results for LRF RAMs (ILC)
+ - 0: GOOD (or bist in progress/never run)
+ - 1: BAD */
+ uint64_t plc1 : 1; /**< Bist Results for LRF RAMs (ILC)
+ - 0: GOOD (or bist in progress/never run)
+ - 1: BAD */
+ uint64_t plc0 : 1; /**< Bist Results for LRF RAMs (ILC)
+ - 0: GOOD (or bist in progress/never run)
+ - 1: BAD */
+ uint64_t ilc : 1; /**< Bist Results for LRF RAMs (ILC)
+ - 0: GOOD (or bist in progress/never run)
+ - 1: BAD */
+ uint64_t vwdf1 : 4; /**< Bist Results for VWDF1 RAMs
+ - 0: GOOD (or bist in progress/never run)
+ - 1: BAD */
+ uint64_t vwdf0 : 4; /**< Bist Results for VWDF0 RAMs
+ - 0: GOOD (or bist in progress/never run)
+ - 1: BAD */
+ uint64_t vab_vwcf1 : 1; /**< Bist Results for VAB VWCF1_MEM */
+ uint64_t reserved_10_10 : 1;
+ uint64_t vab_vwcf0 : 1; /**< Bist Results for VAB VWCF0_MEM
+ - 0: GOOD (or bist in progress/never run)
+ - 1: BAD */
+ uint64_t l2t : 9; /**< Bist Results for L2T (USE+8SET RAMs)
+ - 0: GOOD (or bist in progress/never run)
+ - 1: BAD */
+#else
+ uint64_t l2t : 9;
+ uint64_t vab_vwcf0 : 1;
+ uint64_t reserved_10_10 : 1;
+ uint64_t vab_vwcf1 : 1;
+ uint64_t vwdf0 : 4;
+ uint64_t vwdf1 : 4;
+ uint64_t ilc : 1;
+ uint64_t plc0 : 1;
+ uint64_t plc1 : 1;
+ uint64_t plc2 : 1;
+ uint64_t reserved_24_63 : 40;
+#endif
+ } cn56xx;
+ struct cvmx_l2c_bst1_cn56xx cn56xxp1;
+ struct cvmx_l2c_bst1_cn38xx cn58xx;
+ struct cvmx_l2c_bst1_cn38xx cn58xxp1;
+};
+typedef union cvmx_l2c_bst1 cvmx_l2c_bst1_t;
+
+/**
+ * cvmx_l2c_bst2
+ *
+ * L2C_BST2 = L2C BIST 2 CTL/STAT
+ *
+ */
+union cvmx_l2c_bst2
+{
+ uint64_t u64;
+ struct cvmx_l2c_bst2_s
+ {
+#if __BYTE_ORDER == __BIG_ENDIAN
+ uint64_t reserved_16_63 : 48;
+ uint64_t mrb : 4; /**< Bist Results for MRB RAMs
+ - 0: GOOD (or bist in progress/never run)
+ - 1: BAD */
+ uint64_t reserved_4_11 : 8;
+ uint64_t ipcbst : 1; /**< Bist Results for RFB IPC RAM
+ - 1: BAD */
+ uint64_t picbst : 1; /**< Bist Results for RFB PIC RAM
+ - 1: BAD */
+ uint64_t xrdmsk : 1; /**< Bist Results for RFB XRD-MSK RAM
+ - 0: GOOD (or bist in progress/never run)
+ - 1: BAD */
+ uint64_t xrddat : 1; /**< Bist Results for RFB XRD-DAT RAM
+ - 0: GOOD (or bist in progress/never run)
+ - 1: BAD */
+#else
+ uint64_t xrddat : 1;
+ uint64_t xrdmsk : 1;
+ uint64_t picbst : 1;
+ uint64_t ipcbst : 1;
+ uint64_t reserved_4_11 : 8;
+ uint64_t mrb : 4;
+ uint64_t reserved_16_63 : 48;
+#endif
+ } s;
+ struct cvmx_l2c_bst2_cn30xx
+ {
+#if __BYTE_ORDER == __BIG_ENDIAN
+ uint64_t reserved_16_63 : 48;
+ uint64_t mrb : 4; /**< Bist Results for MRB RAMs
+ - 0: GOOD (or bist in progress/never run)
+ - 1: BAD */
+ uint64_t rmdf : 4; /**< Bist Results for RMDF RAMs
+ - 0: GOOD (or bist in progress/never run)
+ - 1: BAD */
+ uint64_t reserved_4_7 : 4;
+ uint64_t ipcbst : 1; /**< Bist Results for RFB IPC RAM
+ - 0: GOOD (or bist in progress/never run)
+ - 1: BAD */
+ uint64_t reserved_2_2 : 1;
+ uint64_t xrdmsk : 1; /**< Bist Results for RFB XRD-MSK RAM
+ - 0: GOOD (or bist in progress/never run)
+ - 1: BAD */
+ uint64_t xrddat : 1; /**< Bist Results for RFB XRD-DAT RAM
+ - 0: GOOD (or bist in progress/never run)
+ - 1: BAD */
+#else
+ uint64_t xrddat : 1;
+ uint64_t xrdmsk : 1;
+ uint64_t reserved_2_2 : 1;
+ uint64_t ipcbst : 1;
+ uint64_t reserved_4_7 : 4;
+ uint64_t rmdf : 4;
+ uint64_t mrb : 4;
+ uint64_t reserved_16_63 : 48;
+#endif
+ } cn30xx;
+ struct cvmx_l2c_bst2_cn30xx cn31xx;
+ struct cvmx_l2c_bst2_cn38xx
+ {
+#if __BYTE_ORDER == __BIG_ENDIAN
+ uint64_t reserved_16_63 : 48;
+ uint64_t mrb : 4; /**< Bist Results for MRB RAMs
+ - 0: GOOD (or bist in progress/never run)
+ - 1: BAD */
+ uint64_t rmdf : 4; /**< Bist Results for RMDF RAMs
+ - 0: GOOD (or bist in progress/never run)
+ - 1: BAD */
+ uint64_t rhdf : 4; /**< Bist Results for RHDF RAMs
+ - 0: GOOD (or bist in progress/never run)
+ - 1: BAD */
+ uint64_t ipcbst : 1; /**< Bist Results for RFB IPC RAM
+ - 1: BAD */
+ uint64_t picbst : 1; /**< Bist Results for RFB PIC RAM
+ - 1: BAD */
+ uint64_t xrdmsk : 1; /**< Bist Results for RFB XRD-MSK RAM
+ - 0: GOOD (or bist in progress/never run)
+ - 1: BAD */
+ uint64_t xrddat : 1; /**< Bist Results for RFB XRD-DAT RAM
+ - 0: GOOD (or bist in progress/never run)
+ - 1: BAD */
+#else
+ uint64_t xrddat : 1;
+ uint64_t xrdmsk : 1;
+ uint64_t picbst : 1;
+ uint64_t ipcbst : 1;
+ uint64_t rhdf : 4;
+ uint64_t rmdf : 4;
+ uint64_t mrb : 4;
+ uint64_t reserved_16_63 : 48;
+#endif
+ } cn38xx;
+ struct cvmx_l2c_bst2_cn38xx cn38xxp2;
+ struct cvmx_l2c_bst2_cn30xx cn50xx;
+ struct cvmx_l2c_bst2_cn30xx cn52xx;
+ struct cvmx_l2c_bst2_cn30xx cn52xxp1;
+ struct cvmx_l2c_bst2_cn56xx
+ {
+#if __BYTE_ORDER == __BIG_ENDIAN
+ uint64_t reserved_16_63 : 48;
+ uint64_t mrb : 4; /**< Bist Results for MRB RAMs
+ - 0: GOOD (or bist in progress/never run)
+ - 1: BAD */
+ uint64_t rmdb : 4; /**< Bist Results for RMDB RAMs
+ - 0: GOOD (or bist in progress/never run)
+ - 1: BAD */
+ uint64_t rhdb : 4; /**< Bist Results for RHDB RAMs
+ - 0: GOOD (or bist in progress/never run)
+ - 1: BAD */
+ uint64_t ipcbst : 1; /**< Bist Results for RFB IPC RAM
+ - 1: BAD */
+ uint64_t picbst : 1; /**< Bist Results for RFB PIC RAM
+ - 1: BAD */
+ uint64_t xrdmsk : 1; /**< Bist Results for RFB XRD-MSK RAM
+ - 0: GOOD (or bist in progress/never run)
+ - 1: BAD */
+ uint64_t xrddat : 1; /**< Bist Results for RFB XRD-DAT RAM
+ - 0: GOOD (or bist in progress/never run)
+ - 1: BAD */
+#else
+ uint64_t xrddat : 1;
+ uint64_t xrdmsk : 1;
+ uint64_t picbst : 1;
+ uint64_t ipcbst : 1;
+ uint64_t rhdb : 4;
+ uint64_t rmdb : 4;
+ uint64_t mrb : 4;
+ uint64_t reserved_16_63 : 48;
+#endif
+ } cn56xx;
+ struct cvmx_l2c_bst2_cn56xx cn56xxp1;
+ struct cvmx_l2c_bst2_cn56xx cn58xx;
+ struct cvmx_l2c_bst2_cn56xx cn58xxp1;
+};
+typedef union cvmx_l2c_bst2 cvmx_l2c_bst2_t;
+
+/**
+ * cvmx_l2c_bst_mem#
+ *
+ * L2C_BST_MEM = L2C MEM BIST Status
+ *
+ *
+ * Notes:
+ * (1) CLEAR_BIST must be written to 1 before START_BIST is written to 1 using a separate CSR write.
+ *
+ * (2) CLEAR_BIST must not be changed after writing START_BIST to 1 until the BIST operation completes
+ * (indicated by START_BIST returning to 0) or operation is undefined.
+ */
+union cvmx_l2c_bst_memx
+{
+ uint64_t u64;
+ struct cvmx_l2c_bst_memx_s
+ {
+#if __BYTE_ORDER == __BIG_ENDIAN
+ uint64_t start_bist : 1; /**< When written to 1, starts BIST. Will read 1 until
+ BIST is complete (see Note). */
+ uint64_t clear_bist : 1; /**< When BIST is triggered, run clear BIST (see Note) */
+ uint64_t reserved_5_61 : 57;
+ uint64_t rdffl : 1; /**< BIST failure status for RDF */
+ uint64_t vbffl : 4; /**< BIST failure status for VBF0-3 */
+#else
+ uint64_t vbffl : 4;
+ uint64_t rdffl : 1;
+ uint64_t reserved_5_61 : 57;
+ uint64_t clear_bist : 1;
+ uint64_t start_bist : 1;
+#endif
+ } s;
+ struct cvmx_l2c_bst_memx_s cn63xx;
+ struct cvmx_l2c_bst_memx_s cn63xxp1;
+};
+typedef union cvmx_l2c_bst_memx cvmx_l2c_bst_memx_t;
+
+/**
+ * cvmx_l2c_bst_tdt#
+ *
+ * L2C_BST_TDT = L2C TAD DaTa BIST Status
+ *
+ */
+union cvmx_l2c_bst_tdtx
+{
+ uint64_t u64;
+ struct cvmx_l2c_bst_tdtx_s
+ {
+#if __BYTE_ORDER == __BIG_ENDIAN
+ uint64_t reserved_32_63 : 32;
+ uint64_t fbfrspfl : 8; /**< BIST failure status for quad 0-7 FBF RSP read port */
+ uint64_t sbffl : 8; /**< BIST failure status for quad 0-7 SBF */
+ uint64_t fbffl : 8; /**< BIST failure status for quad 0-7 FBF */
+ uint64_t l2dfl : 8; /**< BIST failure status for quad 0-7 L2D */
+#else
+ uint64_t l2dfl : 8;
+ uint64_t fbffl : 8;
+ uint64_t sbffl : 8;
+ uint64_t fbfrspfl : 8;
+ uint64_t reserved_32_63 : 32;
+#endif
+ } s;
+ struct cvmx_l2c_bst_tdtx_s cn63xx;
+ struct cvmx_l2c_bst_tdtx_cn63xxp1
+ {
+#if __BYTE_ORDER == __BIG_ENDIAN
+ uint64_t reserved_24_63 : 40;
+ uint64_t sbffl : 8; /**< BIST failure status for quad 0-7 SBF */
+ uint64_t fbffl : 8; /**< BIST failure status for quad 0-7 FBF */
+ uint64_t l2dfl : 8; /**< BIST failure status for quad 0-7 L2D */
+#else
+ uint64_t l2dfl : 8;
+ uint64_t fbffl : 8;
+ uint64_t sbffl : 8;
+ uint64_t reserved_24_63 : 40;
+#endif
+ } cn63xxp1;
+};
+typedef union cvmx_l2c_bst_tdtx cvmx_l2c_bst_tdtx_t;
+
+/**
+ * cvmx_l2c_bst_ttg#
+ *
+ * L2C_BST_TTG = L2C TAD TaG BIST Status
+ *
+ */
+union cvmx_l2c_bst_ttgx
+{
+ uint64_t u64;
+ struct cvmx_l2c_bst_ttgx_s
+ {
+#if __BYTE_ORDER == __BIG_ENDIAN
+ uint64_t reserved_17_63 : 47;
+ uint64_t lrufl : 1; /**< BIST failure status for tag LRU */
+ uint64_t tagfl : 16; /**< BIST failure status for tag ways 0-15 */
+#else
+ uint64_t tagfl : 16;
+ uint64_t lrufl : 1;
+ uint64_t reserved_17_63 : 47;
+#endif
+ } s;
+ struct cvmx_l2c_bst_ttgx_s cn63xx;
+ struct cvmx_l2c_bst_ttgx_s cn63xxp1;
+};
+typedef union cvmx_l2c_bst_ttgx cvmx_l2c_bst_ttgx_t;
+
+/**
+ * cvmx_l2c_cfg
+ *
+ * Specify the RSL base addresses for the block
+ *
+ * L2C_CFG = L2C Configuration
+ *
+ * Description:
+ */
+union cvmx_l2c_cfg
+{
+ uint64_t u64;
+ struct cvmx_l2c_cfg_s
+ {
+#if __BYTE_ORDER == __BIG_ENDIAN
+ uint64_t reserved_20_63 : 44;
+ uint64_t bstrun : 1; /**< L2 Data Store Bist Running
+ Indicates when the L2C HW Bist sequence(short or long) is
+ running. [L2C ECC Bist FSM is not in the RESET/DONE state] */
+ uint64_t lbist : 1; /**< L2C Data Store Long Bist Sequence
+ When the previous state was '0' and SW writes a '1',
+ the long bist sequence (enhanced 13N March) is performed.
+ SW can then read the L2C_CFG[BSTRUN] which will indicate
+ that the long bist sequence is running. When BSTRUN-=0,
+ the state of the L2D_BST[0-3] registers contain information
+ which reflects the status of the recent long bist sequence.
+ NOTE: SW must never write LBIST=0 while Long Bist is running
+ (ie: when BSTRUN=1 never write LBIST=0).
+ NOTE: LBIST is disabled if the MIO_FUS_DAT2.BIST_DIS
+ Fuse is blown. */
+ uint64_t xor_bank : 1; /**< L2C XOR Bank Bit
+ When both LMC's are enabled(DPRES1=1/DPRES0=1), this
+ bit determines how addresses are assigned to
+ LMC port(s).
+ XOR_BANK| LMC#
+ ----------+---------------------------------
+ 0 | byte address[7]
+ 1 | byte address[7] XOR byte address[12]
+ Example: If both LMC ports are enabled (DPRES1=1/DPRES0=1)
+ and XOR_BANK=1, then addr[7] XOR addr[12] is used to determine
+ which LMC Port# a reference is directed to. */
+ uint64_t dpres1 : 1; /**< DDR1 Present/LMC1 Enable
+ When DPRES1 is set, LMC#1 is enabled(DDR1 pins at
+ the BOTTOM of the chip are active).
+ NOTE: When both LMC ports are enabled(DPRES1=1/DPRES0=1),
+ see XOR_BANK bit to determine how a reference is
+ assigned to a DDR/LMC port. (Also, in dual-LMC configuration,
+ the address sent to the targeted LMC port is the
+ address shifted right by one).
+ NOTE: For power-savings, the DPRES1 is also used to
+ disable DDR1/LMC1 clocks. */
+ uint64_t dpres0 : 1; /**< DDR0 Present/LMC0 Enable
+ When DPRES0 is set, LMC#0 is enabled(DDR0 pins at
+ the BOTTOM of the chip are active).
+ NOTE: When both LMC ports are enabled(DPRES1=1/DPRES0=1),
+ see XOR_BANK bit to determine how a reference is
+ assigned to a DDR/LMC port. (Also, in dual-LMC configuration,
+ the address sent to the targeted LMC port is the
+ address shifted right by one).
+ NOTE: For power-savings, the DPRES0 is also used to
+ disable DDR0/LMC0 clocks. */
+ uint64_t dfill_dis : 1; /**< L2C Dual Fill Disable
+ When set, the L2C dual-fill performance feature is
+ disabled.
+ NOTE: This bit is only intended to evaluate the
+ effectiveness of the dual-fill feature. For OPTIMAL
+ performance, this bit should ALWAYS be zero. */
+ uint64_t fpexp : 4; /**< [CYA] Forward Progress Counter Exponent
+ NOTE: Should NOT be exposed to customer! [FOR DEBUG ONLY]
+ When FPEN is enabled and the LFB is empty, the
+ forward progress counter (FPCNT) is initialized to:
+ FPCNT[24:0] = 2^(9+FPEXP)
+ When the LFB is non-empty the FPCNT is decremented
+ (every eclk interval). If the FPCNT reaches zero,
+ the LFB no longer accepts new requests until either
+ a) all of the current LFB entries have completed
+ (to ensure forward progress).
+ b) FPEMPTY=0 and another forward progress count
+ interval timeout expires.
+ EXAMPLE USE: If FPEXP=2, the FPCNT = 2048 eclks.
+ (For eclk=500MHz(2ns), this would be ~4us). */
+ uint64_t fpempty : 1; /**< [CYA] Forward Progress Counter Empty
+ NOTE: Should NOT be exposed to customer! [FOR DEBUG ONLY]
+ When set, if the forward progress counter expires,
+ all new LFB-NQs are stopped UNTIL all current LFB
+ entries have completed.
+ When clear, if the forward progress counter expires,
+ all new LFB-NQs are stopped UNTIL either
+ a) all current LFB entries have completed.
+ b) another forward progress interval expires
+ NOTE: We may want to FREEZE/HANG the system when
+ we encounter an LFB entry cannot complete, and there
+ may be times when we want to allow further LFB-NQs
+ to be permitted to help in further analyzing the
+ source */
+ uint64_t fpen : 1; /**< [CYA] Forward Progress Counter Enable
+ NOTE: Should NOT be exposed to customer! [FOR DEBUG ONLY]
+ When set, enables the Forward Progress Counter to
+ prevent new LFB entries from enqueueing until ALL
+ current LFB entries have completed. */
+ uint64_t idxalias : 1; /**< L2C Index Alias Enable
+ When set, the L2 Tag/Data Store will alias the 11-bit
+ index with the low order 11-bits of the tag.
+ index[17:7] = (tag[28:18] ^ index[17:7])
+ NOTE: This bit must only be modified at boot time,
+ when it can be guaranteed that no blocks have been
+ loaded into the L2 Cache.
+ The index aliasing is a performance enhancement feature
+ which reduces the L2 cache thrashing experienced for
+ regular stride references.
+ NOTE: The index alias is stored in the LFB and VAB, and
+ its effects are reversed for memory references (Victims,
+ STT-Misses and Read-Misses) */
+ uint64_t mwf_crd : 4; /**< MWF Credit Threshold: When the remaining MWF credits
+ become less than or equal to the MWF_CRD, the L2C will
+ assert l2c__lmi_mwd_hiwater_a to signal the LMC to give
+ writes (victims) higher priority. */
+ uint64_t rsp_arb_mode : 1; /**< RSP Arbitration Mode:
+ - 0: Fixed Priority [HP=RFB, RMCF, RHCF, STRSP, LP=STRSC]
+ - 1: Round Robin: [RFB(reflected I/O), RMCF(RdMiss),
+ RHCF(RdHit), STRSP(ST RSP w/ invalidate),
+ STRSC(ST RSP no invalidate)] */
+ uint64_t rfb_arb_mode : 1; /**< RFB Arbitration Mode:
+ - 0: Fixed Priority -
+ IOB->PP requests are higher priority than
+ PP->IOB requests
+ - 1: Round Robin -
+ I/O requests from PP and IOB are serviced in
+ round robin */
+ uint64_t lrf_arb_mode : 1; /**< RF Arbitration Mode:
+ - 0: Fixed Priority -
+ IOB memory requests are higher priority than PP
+ memory requests.
+ - 1: Round Robin -
+ Memory requests from PP and IOB are serviced in
+ round robin. */
+#else
+ uint64_t lrf_arb_mode : 1;
+ uint64_t rfb_arb_mode : 1;
+ uint64_t rsp_arb_mode : 1;
+ uint64_t mwf_crd : 4;
+ uint64_t idxalias : 1;
+ uint64_t fpen : 1;
+ uint64_t fpempty : 1;
+ uint64_t fpexp : 4;
+ uint64_t dfill_dis : 1;
+ uint64_t dpres0 : 1;
+ uint64_t dpres1 : 1;
+ uint64_t xor_bank : 1;
+ uint64_t lbist : 1;
+ uint64_t bstrun : 1;
+ uint64_t reserved_20_63 : 44;
+#endif
+ } s;
+ struct cvmx_l2c_cfg_cn30xx
+ {
+#if __BYTE_ORDER == __BIG_ENDIAN
+ uint64_t reserved_14_63 : 50;
+ uint64_t fpexp : 4; /**< [CYA] Forward Progress Counter Exponent
+ NOTE: Should NOT be exposed to customer! [FOR DEBUG ONLY]
+ When FPEN is enabled and the LFB is empty, the
+ forward progress counter (FPCNT) is initialized to:
+ FPCNT[24:0] = 2^(9+FPEXP)
+ When the LFB is non-empty the FPCNT is decremented
+ (every eclk interval). If the FPCNT reaches zero,
+ the LFB no longer accepts new requests until either
+ a) all of the current LFB entries have completed
+ (to ensure forward progress).
+ b) FPEMPTY=0 and another forward progress count
+ interval timeout expires.
+ EXAMPLE USE: If FPEXP=2, the FPCNT = 2048 eclks.
+ (For eclk=500MHz(2ns), this would be ~4us). */
+ uint64_t fpempty : 1; /**< [CYA] Forward Progress Counter Empty
+ NOTE: Should NOT be exposed to customer! [FOR DEBUG ONLY]
+ When set, if the forward progress counter expires,
+ all new LFB-NQs are stopped UNTIL all current LFB
+ entries have completed.
+ When clear, if the forward progress counter expires,
+ all new LFB-NQs are stopped UNTIL either
+ a) all current LFB entries have completed.
+ b) another forward progress interval expires
+ NOTE: We may want to FREEZE/HANG the system when
+ we encounter an LFB entry cannot complete, and there
+ may be times when we want to allow further LFB-NQs
+ to be permitted to help in further analyzing the
+ source */
+ uint64_t fpen : 1; /**< [CYA] Forward Progress Counter Enable
+ NOTE: Should NOT be exposed to customer! [FOR DEBUG ONLY]
+ When set, enables the Forward Progress Counter to
+ prevent new LFB entries from enqueueing until ALL
+ current LFB entries have completed. */
+ uint64_t idxalias : 1; /**< L2C Index Alias Enable
+ When set, the L2 Tag/Data Store will alias the 8-bit
+ index with the low order 8-bits of the tag.
+ index[14:7] = (tag[22:15] ^ index[14:7])
+ NOTE: This bit must only be modified at boot time,
+ when it can be guaranteed that no blocks have been
+ loaded into the L2 Cache.
+ The index aliasing is a performance enhancement feature
+ which reduces the L2 cache thrashing experienced for
+ regular stride references.
+ NOTE: The index alias is stored in the LFB and VAB, and
+ its effects are reversed for memory references (Victims,
+ STT-Misses and Read-Misses) */
+ uint64_t mwf_crd : 4; /**< MWF Credit Threshold: When the remaining MWF credits
+ become less than or equal to the MWF_CRD, the L2C will
+ assert l2c__lmi_mwd_hiwater_a to signal the LMC to give
+ writes (victims) higher priority. */
+ uint64_t rsp_arb_mode : 1; /**< RSP Arbitration Mode:
+ - 0: Fixed Priority [HP=RFB, RMCF, RHCF, STRSP, LP=STRSC]
+ - 1: Round Robin: [RFB(reflected I/O), RMCF(RdMiss),
+ RHCF(RdHit), STRSP(ST RSP w/ invalidate),
+ STRSC(ST RSP no invalidate)] */
+ uint64_t rfb_arb_mode : 1; /**< RFB Arbitration Mode:
+ - 0: Fixed Priority -
+ IOB->PP requests are higher priority than
+ PP->IOB requests
+ - 1: Round Robin -
+ I/O requests from PP and IOB are serviced in
+ round robin */
+ uint64_t lrf_arb_mode : 1; /**< RF Arbitration Mode:
+ - 0: Fixed Priority -
+ IOB memory requests are higher priority than PP
+ memory requests.
+ - 1: Round Robin -
+ Memory requests from PP and IOB are serviced in
+ round robin. */
+#else
+ uint64_t lrf_arb_mode : 1;
+ uint64_t rfb_arb_mode : 1;
+ uint64_t rsp_arb_mode : 1;
+ uint64_t mwf_crd : 4;
+ uint64_t idxalias : 1;
+ uint64_t fpen : 1;
+ uint64_t fpempty : 1;
+ uint64_t fpexp : 4;
+ uint64_t reserved_14_63 : 50;
+#endif
+ } cn30xx;
+ struct cvmx_l2c_cfg_cn30xx cn31xx;
+ struct cvmx_l2c_cfg_cn30xx cn38xx;
+ struct cvmx_l2c_cfg_cn30xx cn38xxp2;
+ struct cvmx_l2c_cfg_cn50xx
+ {
+#if __BYTE_ORDER == __BIG_ENDIAN
+ uint64_t reserved_20_63 : 44;
+ uint64_t bstrun : 1; /**< L2 Data Store Bist Running
+ Indicates when the L2C HW Bist sequence(short or long) is
+ running. [L2C ECC Bist FSM is not in the RESET/DONE state] */
+ uint64_t lbist : 1; /**< L2C Data Store Long Bist Sequence
+ When the previous state was '0' and SW writes a '1',
+ the long bist sequence (enhanced 13N March) is performed.
+ SW can then read the L2C_CFG[BSTRUN] which will indicate
+ that the long bist sequence is running. When BSTRUN-=0,
+ the state of the L2D_BST[0-3] registers contain information
+ which reflects the status of the recent long bist sequence.
+ NOTE: SW must never write LBIST=0 while Long Bist is running
+ (ie: when BSTRUN=1 never write LBIST=0). */
+ uint64_t reserved_14_17 : 4;
+ uint64_t fpexp : 4; /**< [CYA] Forward Progress Counter Exponent
+ NOTE: Should NOT be exposed to customer! [FOR DEBUG ONLY]
+ When FPEN is enabled and the LFB is empty, the
+ forward progress counter (FPCNT) is initialized to:
+ FPCNT[24:0] = 2^(9+FPEXP)
+ When the LFB is non-empty the FPCNT is decremented
+ (every eclk interval). If the FPCNT reaches zero,
+ the LFB no longer accepts new requests until either
+ a) all of the current LFB entries have completed
+ (to ensure forward progress).
+ b) FPEMPTY=0 and another forward progress count
+ interval timeout expires.
+ EXAMPLE USE: If FPEXP=2, the FPCNT = 2048 eclks.
+ (For eclk=500MHz(2ns), this would be ~4us). */
+ uint64_t fpempty : 1; /**< [CYA] Forward Progress Counter Empty
+ NOTE: Should NOT be exposed to customer! [FOR DEBUG ONLY]
+ When set, if the forward progress counter expires,
+ all new LFB-NQs are stopped UNTIL all current LFB
+ entries have completed.
+ When clear, if the forward progress counter expires,
+ all new LFB-NQs are stopped UNTIL either
+ a) all current LFB entries have completed.
+ b) another forward progress interval expires
+ NOTE: We may want to FREEZE/HANG the system when
+ we encounter an LFB entry cannot complete, and there
+ may be times when we want to allow further LFB-NQs
+ to be permitted to help in further analyzing the
+ source */
+ uint64_t fpen : 1; /**< [CYA] Forward Progress Counter Enable
+ NOTE: Should NOT be exposed to customer! [FOR DEBUG ONLY]
+ When set, enables the Forward Progress Counter to
+ prevent new LFB entries from enqueueing until ALL
+ current LFB entries have completed. */
+ uint64_t idxalias : 1; /**< L2C Index Alias Enable
+ When set, the L2 Tag/Data Store will alias the 7-bit
+ index with the low order 7-bits of the tag.
+ index[13:7] = (tag[20:14] ^ index[13:7])
+ NOTE: This bit must only be modified at boot time,
+ when it can be guaranteed that no blocks have been
+ loaded into the L2 Cache.
+ The index aliasing is a performance enhancement feature
+ which reduces the L2 cache thrashing experienced for
+ regular stride references.
+ NOTE: The index alias is stored in the LFB and VAB, and
+ its effects are reversed for memory references (Victims,
+ STT-Misses and Read-Misses) */
+ uint64_t mwf_crd : 4; /**< MWF Credit Threshold: When the remaining MWF credits
+ become less than or equal to the MWF_CRD, the L2C will
+ assert l2c__lmi_mwd_hiwater_a to signal the LMC to give
+ writes (victims) higher priority. */
+ uint64_t rsp_arb_mode : 1; /**< RSP Arbitration Mode:
+ - 0: Fixed Priority [HP=RFB, RMCF, RHCF, STRSP, LP=STRSC]
+ - 1: Round Robin: [RFB(reflected I/O), RMCF(RdMiss),
+ RHCF(RdHit), STRSP(ST RSP w/ invalidate),
+ STRSC(ST RSP no invalidate)] */
+ uint64_t rfb_arb_mode : 1; /**< RFB Arbitration Mode:
+ - 0: Fixed Priority -
+ IOB->PP requests are higher priority than
+ PP->IOB requests
+ - 1: Round Robin -
+ I/O requests from PP and IOB are serviced in
+ round robin */
+ uint64_t lrf_arb_mode : 1; /**< RF Arbitration Mode:
+ - 0: Fixed Priority -
+ IOB memory requests are higher priority than PP
+ memory requests.
+ - 1: Round Robin -
+ Memory requests from PP and IOB are serviced in
+ round robin. */
+#else
+ uint64_t lrf_arb_mode : 1;
+ uint64_t rfb_arb_mode : 1;
+ uint64_t rsp_arb_mode : 1;
+ uint64_t mwf_crd : 4;
+ uint64_t idxalias : 1;
+ uint64_t fpen : 1;
+ uint64_t fpempty : 1;
+ uint64_t fpexp : 4;
+ uint64_t reserved_14_17 : 4;
+ uint64_t lbist : 1;
+ uint64_t bstrun : 1;
+ uint64_t reserved_20_63 : 44;
+#endif
+ } cn50xx;
+ struct cvmx_l2c_cfg_cn50xx cn52xx;
+ struct cvmx_l2c_cfg_cn50xx cn52xxp1;
+ struct cvmx_l2c_cfg_s cn56xx;
+ struct cvmx_l2c_cfg_s cn56xxp1;
+ struct cvmx_l2c_cfg_cn58xx
+ {
+#if __BYTE_ORDER == __BIG_ENDIAN
+ uint64_t reserved_20_63 : 44;
+ uint64_t bstrun : 1; /**< L2 Data Store Bist Running
+ Indicates when the L2C HW Bist sequence(short or long) is
+ running. [L2C ECC Bist FSM is not in the RESET/DONE state] */
+ uint64_t lbist : 1; /**< L2C Data Store Long Bist Sequence
+ When the previous state was '0' and SW writes a '1',
+ the long bist sequence (enhanced 13N March) is performed.
+ SW can then read the L2C_CFG[BSTRUN] which will indicate
+ that the long bist sequence is running. When BSTRUN-=0,
+ the state of the L2D_BST[0-3] registers contain information
+ which reflects the status of the recent long bist sequence.
+ NOTE: SW must never write LBIST=0 while Long Bist is running
+ (ie: when BSTRUN=1 never write LBIST=0).
+ NOTE: LBIST is disabled if the MIO_FUS_DAT2.BIST_DIS
+ Fuse is blown. */
+ uint64_t reserved_15_17 : 3;
+ uint64_t dfill_dis : 1; /**< L2C Dual Fill Disable
+ When set, the L2C dual-fill performance feature is
+ disabled.
+ NOTE: This bit is only intended to evaluate the
+ effectiveness of the dual-fill feature. For OPTIMAL
+ performance, this bit should ALWAYS be zero. */
+ uint64_t fpexp : 4; /**< [CYA] Forward Progress Counter Exponent
+ NOTE: Should NOT be exposed to customer! [FOR DEBUG ONLY]
+ When FPEN is enabled and the LFB is empty, the
+ forward progress counter (FPCNT) is initialized to:
+ FPCNT[24:0] = 2^(9+FPEXP)
+ When the LFB is non-empty the FPCNT is decremented
+ (every eclk interval). If the FPCNT reaches zero,
+ the LFB no longer accepts new requests until either
+ a) all of the current LFB entries have completed
+ (to ensure forward progress).
+ b) FPEMPTY=0 and another forward progress count
+ interval timeout expires.
+ EXAMPLE USE: If FPEXP=2, the FPCNT = 2048 eclks.
+ (For eclk=500MHz(2ns), this would be ~4us). */
+ uint64_t fpempty : 1; /**< [CYA] Forward Progress Counter Empty
+ NOTE: Should NOT be exposed to customer! [FOR DEBUG ONLY]
+ When set, if the forward progress counter expires,
+ all new LFB-NQs are stopped UNTIL all current LFB
+ entries have completed.
+ When clear, if the forward progress counter expires,
+ all new LFB-NQs are stopped UNTIL either
+ a) all current LFB entries have completed.
+ b) another forward progress interval expires
+ NOTE: We may want to FREEZE/HANG the system when
+ we encounter an LFB entry cannot complete, and there
+ may be times when we want to allow further LFB-NQs
+ to be permitted to help in further analyzing the
+ source */
+ uint64_t fpen : 1; /**< [CYA] Forward Progress Counter Enable
+ NOTE: Should NOT be exposed to customer! [FOR DEBUG ONLY]
+ When set, enables the Forward Progress Counter to
+ prevent new LFB entries from enqueueing until ALL
+ current LFB entries have completed. */
+ uint64_t idxalias : 1; /**< L2C Index Alias Enable
+ When set, the L2 Tag/Data Store will alias the 11-bit
+ index with the low order 11-bits of the tag.
+ index[17:7] = (tag[28:18] ^ index[17:7])
+ NOTE: This bit must only be modified at boot time,
+ when it can be guaranteed that no blocks have been
+ loaded into the L2 Cache.
+ The index aliasing is a performance enhancement feature
+ which reduces the L2 cache thrashing experienced for
+ regular stride references.
+ NOTE: The index alias is stored in the LFB and VAB, and
+ its effects are reversed for memory references (Victims,
+ STT-Misses and Read-Misses) */
+ uint64_t mwf_crd : 4; /**< MWF Credit Threshold: When the remaining MWF credits
+ become less than or equal to the MWF_CRD, the L2C will
+ assert l2c__lmi_mwd_hiwater_a to signal the LMC to give
+ writes (victims) higher priority. */
+ uint64_t rsp_arb_mode : 1; /**< RSP Arbitration Mode:
+ - 0: Fixed Priority [HP=RFB, RMCF, RHCF, STRSP, LP=STRSC]
+ - 1: Round Robin: [RFB(reflected I/O), RMCF(RdMiss),
+ RHCF(RdHit), STRSP(ST RSP w/ invalidate),
+ STRSC(ST RSP no invalidate)] */
+ uint64_t rfb_arb_mode : 1; /**< RFB Arbitration Mode:
+ - 0: Fixed Priority -
+ IOB->PP requests are higher priority than
+ PP->IOB requests
+ - 1: Round Robin -
+ I/O requests from PP and IOB are serviced in
+ round robin */
+ uint64_t lrf_arb_mode : 1; /**< RF Arbitration Mode:
+ - 0: Fixed Priority -
+ IOB memory requests are higher priority than PP
+ memory requests.
+ - 1: Round Robin -
+ Memory requests from PP and IOB are serviced in
+ round robin. */
+#else
+ uint64_t lrf_arb_mode : 1;
+ uint64_t rfb_arb_mode : 1;
+ uint64_t rsp_arb_mode : 1;
+ uint64_t mwf_crd : 4;
+ uint64_t idxalias : 1;
+ uint64_t fpen : 1;
+ uint64_t fpempty : 1;
+ uint64_t fpexp : 4;
+ uint64_t dfill_dis : 1;
+ uint64_t reserved_15_17 : 3;
+ uint64_t lbist : 1;
+ uint64_t bstrun : 1;
+ uint64_t reserved_20_63 : 44;
+#endif
+ } cn58xx;
+ struct cvmx_l2c_cfg_cn58xxp1
+ {
+#if __BYTE_ORDER == __BIG_ENDIAN
+ uint64_t reserved_15_63 : 49;
+ uint64_t dfill_dis : 1; /**< L2C Dual Fill Disable
+ When set, the L2C dual-fill performance feature is
+ disabled.
+ NOTE: This bit is only intended to evaluate the
+ effectiveness of the dual-fill feature. For OPTIMAL
+ performance, this bit should ALWAYS be zero. */
+ uint64_t fpexp : 4; /**< [CYA] Forward Progress Counter Exponent
+ NOTE: Should NOT be exposed to customer! [FOR DEBUG ONLY]
+ When FPEN is enabled and the LFB is empty, the
+ forward progress counter (FPCNT) is initialized to:
+ FPCNT[24:0] = 2^(9+FPEXP)
+ When the LFB is non-empty the FPCNT is decremented
+ (every eclk interval). If the FPCNT reaches zero,
+ the LFB no longer accepts new requests until either
+ a) all of the current LFB entries have completed
+ (to ensure forward progress).
+ b) FPEMPTY=0 and another forward progress count
+ interval timeout expires.
+ EXAMPLE USE: If FPEXP=2, the FPCNT = 2048 eclks.
+ (For eclk=500MHz(2ns), this would be ~4us). */
+ uint64_t fpempty : 1; /**< [CYA] Forward Progress Counter Empty
+ NOTE: Should NOT be exposed to customer! [FOR DEBUG ONLY]
+ When set, if the forward progress counter expires,
+ all new LFB-NQs are stopped UNTIL all current LFB
+ entries have completed.
+ When clear, if the forward progress counter expires,
+ all new LFB-NQs are stopped UNTIL either
+ a) all current LFB entries have completed.
+ b) another forward progress interval expires
+ NOTE: We may want to FREEZE/HANG the system when
+ we encounter an LFB entry cannot complete, and there
+ may be times when we want to allow further LFB-NQs
+ to be permitted to help in further analyzing the
+ source */
+ uint64_t fpen : 1; /**< [CYA] Forward Progress Counter Enable
+ NOTE: Should NOT be exposed to customer! [FOR DEBUG ONLY]
+ When set, enables the Forward Progress Counter to
+ prevent new LFB entries from enqueueing until ALL
+ current LFB entries have completed. */
+ uint64_t idxalias : 1; /**< L2C Index Alias Enable
+ When set, the L2 Tag/Data Store will alias the 11-bit
+ index with the low order 11-bits of the tag.
+ index[17:7] = (tag[28:18] ^ index[17:7])
+ NOTE: This bit must only be modified at boot time,
+ when it can be guaranteed that no blocks have been
+ loaded into the L2 Cache.
+ The index aliasing is a performance enhancement feature
+ which reduces the L2 cache thrashing experienced for
+ regular stride references.
+ NOTE: The index alias is stored in the LFB and VAB, and
+ its effects are reversed for memory references (Victims,
+ STT-Misses and Read-Misses) */
+ uint64_t mwf_crd : 4; /**< MWF Credit Threshold: When the remaining MWF credits
+ become less than or equal to the MWF_CRD, the L2C will
+ assert l2c__lmi_mwd_hiwater_a to signal the LMC to give
+ writes (victims) higher priority. */
+ uint64_t rsp_arb_mode : 1; /**< RSP Arbitration Mode:
+ - 0: Fixed Priority [HP=RFB, RMCF, RHCF, STRSP, LP=STRSC]
+ - 1: Round Robin: [RFB(reflected I/O), RMCF(RdMiss),
+ RHCF(RdHit), STRSP(ST RSP w/ invalidate),
+ STRSC(ST RSP no invalidate)] */
+ uint64_t rfb_arb_mode : 1; /**< RFB Arbitration Mode:
+ - 0: Fixed Priority -
+ IOB->PP requests are higher priority than
+ PP->IOB requests
+ - 1: Round Robin -
+ I/O requests from PP and IOB are serviced in
+ round robin */
+ uint64_t lrf_arb_mode : 1; /**< RF Arbitration Mode:
+ - 0: Fixed Priority -
+ IOB memory requests are higher priority than PP
+ memory requests.
+ - 1: Round Robin -
+ Memory requests from PP and IOB are serviced in
+ round robin. */
+#else
+ uint64_t lrf_arb_mode : 1;
+ uint64_t rfb_arb_mode : 1;
+ uint64_t rsp_arb_mode : 1;
+ uint64_t mwf_crd : 4;
+ uint64_t idxalias : 1;
+ uint64_t fpen : 1;
+ uint64_t fpempty : 1;
+ uint64_t fpexp : 4;
+ uint64_t dfill_dis : 1;
+ uint64_t reserved_15_63 : 49;
+#endif
+ } cn58xxp1;
+};
+typedef union cvmx_l2c_cfg cvmx_l2c_cfg_t;
+
+/**
+ * cvmx_l2c_cop0_map#
+ *
+ * L2C_COP0_MAP = PP COP0 register memory mapped region
+ *
+ * Description: PP COP0 register mapped region.
+ *
+ * NOTE: for 63xx, if the PPID is outside the range of 0-5,63 the write will be ignored and reads
+ * will return 0x2bad2bad2bad2bad
+ *
+ * Notes:
+ * (1) There are 256 COP0 registers per PP. Registers 0-255 map to PP0's COP0 registers, 256-511 are
+ * mapped to PP1's, etc. A special set X PP63 (registers 16128-16383) are for broadcast writes.
+ * Any write done to these registers will take effect in ALL PPs. Note the means the L2C_COP0_MAP
+ * register to access can be gotten by:
+ *
+ * REGNUM = [ PPID[5:0], rd[4:0], sel[2:0] ]
+ *
+ * where rd and sel are as defined in the HRM description of Core Coprocessor 0 registers
+ * and note 4 below.
+ *
+ * (2) if a COP0 register cannot be accessed by this mechanism the write be silently ignored and the
+ * read data will be 0xBADDEED.
+ *
+ * (3) for 63xx, if the PPID is outside the range of 0-5,63 or if the PP in question is in reset a
+ * write will be ignored and reads will timeout the RSL bus.
+ *
+ * (4) Referring to note (1) above, the following rd/sel values are supported:
+ *
+ * NOTE: Put only the "Customer type" in HRM. do not put the "Real type" in HRM.
+ *
+ * Customer Real
+ * rd sel type Description type
+ * ======+=======+==========+==============================================+=========
+ * 4 2 RO COP0 UserLocal RW
+ * 7 0 RO COP0 HWREna RW
+ * 9 0 RO COP0 Count RW
+ * 9 6 RO COP0 CvmCount RW
+ * 9 7 RO COP0 CvmCtl RW
+ * 11 0 RO COP0 Compare RW
+ * 11 6 RW COP0 PowThrottle RW
+ * 12 0 RO COP0 Status RW
+ * 12 1 RO COP0 IntCtl RO
+ * 12 2 RO COP0 SRSCtl RO
+ * 13 0 RO COP0 Cause RW
+ * 14 0 RO COP0 EPC RW
+ * 15 0 RO COP0 PrID RO
+ * 15 1 RO COP0 EBase RW
+ * 16 0 RO PC Issue Debug Info (see details below) RO
+ * 16 1 RO PC Fetch Debug Info (see details below) RO
+ * 16 2 RO PC Fill Debug Info (see details below) RO
+ * 16 3 RO PC Misc Debug Info (see details below) RO
+ * 18 0 RO COP0 WatchLo0 RW
+ * 19 0 RO COP0 WatchHi0 RW
+ * 22 0 RO COP0 MultiCoreDebug RW
+ * 23 0 RO COP0 Debug RW
+ * 23 6 RO COP0 Debug2 RO
+ * 24 0 RO COP0 DEPC RW
+ * 25 0 RO COP0 PerfCnt Control0 RW
+ * 25 1 RO COP0 PerfCnt Counter0 RW
+ * 25 2 RO COP0 PerfCnt Control1 RW
+ * 25 3 RO COP0 PerfCnt Counter1 RW
+ * 27 0 RO COP0 CacheErr (icache) RW
+ * 28 0 RO COP0 TagLo (icache) RW
+ * 28 1 RO COP0 DataLo (icache) RW
+ * 29 1 RO COP0 DataHi (icache) RW
+ * 30 0 RO COP0 ErrorEPC RW
+ * 31 0 RO COP0 DESAVE RW
+ * 31 2 RO COP0 Scratch RW
+ * 31 3 RO COP0 Scratch1 RW
+ * 31 4 RO COP0 Scratch2 RW
+ *
+ * - PC Issue Debug Info
+ *
+ * - 63:2 pc0_5a<63:2> // often VA<63:2> of the next instruction to issue
+ * // but can also be the VA of an instruction executing/replaying on pipe 0
+ * // or can also be a VA being filled into the instruction cache
+ * // or can also be unpredictable
+ * // <61:49> RAZ
+ * 1 illegal // set when illegal VA
+ * 0 delayslot // set when VA is delayslot (prior branch may be either taken or not taken)
+ *
+ * - PC Fetch Debug Info
+ *
+ * - 63:0 fetch_address_3a // VA being fetched from the instruction cache
+ * // <61:49>, <1:0> RAZ
+ *
+ * - PC Fill Debug Info
+ *
+ * - 63:0 fill_address_4a<63:2> // VA<63:2> being filled into instruction cache
+ * // valid when waiting_for_ifill_4a is set (see PC Misc Debug Info below)
+ * // <61:49> RAZ
+ * 1 illegal // set when illegal VA
+ * 0 RAZ
+ *
+ * - PC Misc Debug Info
+ *
+ * - 63:3 RAZ
+ * 2 mem_stall_3a // stall term from L1 memory system
+ * 1 waiting_for_pfill_4a // when waiting_for_ifill_4a is set, indicates whether instruction cache fill is due to a prefetch
+ * 0 waiting_for_ifill_4a // set when there is an outstanding instruction cache fill
+ */
+union cvmx_l2c_cop0_mapx
+{
+ uint64_t u64;
+ struct cvmx_l2c_cop0_mapx_s
+ {
+#if __BYTE_ORDER == __BIG_ENDIAN
+ uint64_t data : 64; /**< Data to write to/read from designated PP's COP0
+ register. */
+#else
+ uint64_t data : 64;
+#endif
+ } s;
+ struct cvmx_l2c_cop0_mapx_s cn63xx;
+ struct cvmx_l2c_cop0_mapx_s cn63xxp1;
+};
+typedef union cvmx_l2c_cop0_mapx cvmx_l2c_cop0_mapx_t;
+
+/**
+ * cvmx_l2c_ctl
+ *
+ * L2C_CTL = L2C Control
+ *
+ *
+ * Notes:
+ * (1) If MAXVAB is != 0, VAB_THRESH should be less than MAXVAB.
+ *
+ * (2) L2DFDBE and L2DFSBE allows software to generate L2DSBE, L2DDBE, VBFSBE, and VBFDBE errors for
+ * the purposes of testing error handling code. When one (or both) of these bits are set a PL2
+ * which misses in the L2 will fill with the appropriate error in the first 2 OWs of the fill.
+ * Software can determine which OW pair gets the error by choosing the desired fill order
+ * (address<6:5>). A PL2 which hits in the L2 will not inject any errors. Therefore sending a
+ * WBIL2 prior to the PL2 is recommended to make a miss likely (if multiple processors are involved
+ * software must be careful to be sure no other processor or IO device can bring the block into the
+ * L2).
+ *
+ * To generate a VBFSBE or VBFDBE, software must first get the cache block into the cache with an
+ * error using a PL2 which misses the L2. Then a store partial to a portion of the cache block
+ * without the error must change the block to dirty. Then, a subsequent WBL2/WBIL2/victim will
+ * trigger the VBFSBE/VBFDBE error.
+ */
+union cvmx_l2c_ctl
+{
+ uint64_t u64;
+ struct cvmx_l2c_ctl_s
+ {
+#if __BYTE_ORDER == __BIG_ENDIAN
+ uint64_t reserved_28_63 : 36;
+ uint64_t disstgl2i : 1; /**< Disable STGL2I's from changing the tags */
+ uint64_t l2dfsbe : 1; /**< Force single bit ECC error on PL2 allocates (2) */
+ uint64_t l2dfdbe : 1; /**< Force double bit ECC error on PL2 allocates (2) */
+ uint64_t discclk : 1; /**< Disable conditional clocking in L2C PNR blocks */
+ uint64_t maxvab : 4; /**< Maximum VABs in use at once
+ (0 means 16, 1-15 as expected) */
+ uint64_t maxlfb : 4; /**< Maximum LFBs in use at once
+ (0 means 16, 1-15 as expected) */
+ uint64_t rsp_arb_mode : 1; /**< Arbitration mode for RSC/RSD bus
+ == 0, round-robin
+ == 1, static priority
+ 1. IOR data
+ 2. STIN/FILLs
+ 3. STDN/SCDN/SCFL */
+ uint64_t xmc_arb_mode : 1; /**< Arbitration mode for XMC QOS queues
+ == 0, fully determined through QOS
+ == 1, QOS0 highest priority, QOS1-3 use normal mode */
+ uint64_t ef_ena : 1; /**< LMC early fill enable */
+ uint64_t ef_cnt : 7; /**< LMC early fill count
+ Specifies the number of cycles after the first LMC
+ fill cycle to wait before requesting a fill on the
+ RSC/RSD bus.
+ // 7 dclks (we've received 1st out of 8
+ // by the time we start counting)
+ ef_cnt = (7 * dclk0_period) / rclk_period;
+ // + 1 rclk if the dclk and rclk edges don't
+ // stay in the same position
+ if ((dclk0_gen.period % rclk_gen.period) != 0)
+ ef_cnt = ef_cnt + 1;
+ // + 2 rclk synchronization uncertainty
+ ef_cnt = ef_cnt + 2;
+ // - 3 rclks to recognize first write
+ ef_cnt = ef_cnt - 3;
+ // + 3 rclks to perform first write
+ ef_cnt = ef_cnt + 3;
+ // - 9 rclks minimum latency from counter expire
+ // to final fbf read
+ ef_cnt = ef_cnt - 9; */
+ uint64_t vab_thresh : 4; /**< VAB Threshold
+ When the number of valid VABs exceeds this number the
+ L2C increases the priority of all writes in the LMC. */
+ uint64_t disecc : 1; /**< Tag and Data ECC Disable */
+ uint64_t disidxalias : 1; /**< Index Alias Disable */
+#else
+ uint64_t disidxalias : 1;
+ uint64_t disecc : 1;
+ uint64_t vab_thresh : 4;
+ uint64_t ef_cnt : 7;
+ uint64_t ef_ena : 1;
+ uint64_t xmc_arb_mode : 1;
+ uint64_t rsp_arb_mode : 1;
+ uint64_t maxlfb : 4;
+ uint64_t maxvab : 4;
+ uint64_t discclk : 1;
+ uint64_t l2dfdbe : 1;
+ uint64_t l2dfsbe : 1;
+ uint64_t disstgl2i : 1;
+ uint64_t reserved_28_63 : 36;
+#endif
+ } s;
+ struct cvmx_l2c_ctl_s cn63xx;
+ struct cvmx_l2c_ctl_cn63xxp1
+ {
+#if __BYTE_ORDER == __BIG_ENDIAN
+ uint64_t reserved_25_63 : 39;
+ uint64_t discclk : 1; /**< Disable conditional clocking in L2C PNR blocks */
+ uint64_t maxvab : 4; /**< Maximum VABs in use at once
+ (0 means 16, 1-15 as expected) */
+ uint64_t maxlfb : 4; /**< Maximum LFBs in use at once
+ (0 means 16, 1-15 as expected) */
+ uint64_t rsp_arb_mode : 1; /**< Arbitration mode for RSC/RSD bus
+ == 0, round-robin
+ == 1, static priority
+ 1. IOR data
+ 2. STIN/FILLs
+ 3. STDN/SCDN/SCFL */
+ uint64_t xmc_arb_mode : 1; /**< Arbitration mode for XMC QOS queues
+ == 0, fully determined through QOS
+ == 1, QOS0 highest priority, QOS1-3 use normal mode */
+ uint64_t ef_ena : 1; /**< LMC early fill enable */
+ uint64_t ef_cnt : 7; /**< LMC early fill count
+ Specifies the number of cycles after the first LMC
+ fill cycle to wait before requesting a fill on the
+ RSC/RSD bus.
+ // 7 dclks (we've received 1st out of 8
+ // by the time we start counting)
+ ef_cnt = (7 * dclk0_period) / rclk_period;
+ // + 1 rclk if the dclk and rclk edges don't
+ // stay in the same position
+ if ((dclk0_gen.period % rclk_gen.period) != 0)
+ ef_cnt = ef_cnt + 1;
+ // + 2 rclk synchronization uncertainty
+ ef_cnt = ef_cnt + 2;
+ // - 3 rclks to recognize first write
+ ef_cnt = ef_cnt - 3;
+ // + 3 rclks to perform first write
+ ef_cnt = ef_cnt + 3;
+ // - 9 rclks minimum latency from counter expire
+ // to final fbf read
+ ef_cnt = ef_cnt - 9; */
+ uint64_t vab_thresh : 4; /**< VAB Threshold
+ When the number of valid VABs exceeds this number the
+ L2C increases the priority of all writes in the LMC. */
+ uint64_t disecc : 1; /**< Tag and Data ECC Disable */
+ uint64_t disidxalias : 1; /**< Index Alias Disable */
+#else
+ uint64_t disidxalias : 1;
+ uint64_t disecc : 1;
+ uint64_t vab_thresh : 4;
+ uint64_t ef_cnt : 7;
+ uint64_t ef_ena : 1;
+ uint64_t xmc_arb_mode : 1;
+ uint64_t rsp_arb_mode : 1;
+ uint64_t maxlfb : 4;
+ uint64_t maxvab : 4;
+ uint64_t discclk : 1;
+ uint64_t reserved_25_63 : 39;
+#endif
+ } cn63xxp1;
+};
+typedef union cvmx_l2c_ctl cvmx_l2c_ctl_t;
+
+/**
+ * cvmx_l2c_dbg
+ *
+ * L2C_DBG = L2C DEBUG Register
+ *
+ * Description: L2C Tag/Data Store Debug Register
+ *
+ * Notes:
+ * (1) When using the L2T, L2D or FINV Debug probe feature, the LDD command WILL NOT update the DuTags.
+ * (2) L2T, L2D, FINV MUST BE mutually exclusive (only one set)
+ * (3) Force Invalidate is intended as a means for SW to invalidate the L2 Cache while also writing back
+ * dirty data to memory to maintain coherency.
+ * (4) L2 Cache Lock Down feature MUST BE disabled (L2C_LCKBASE[LCK_ENA]=0) if ANY of the L2C debug
+ * features (L2T, L2D, FINV) are enabled.
+ */
+union cvmx_l2c_dbg
+{
+ uint64_t u64;
+ struct cvmx_l2c_dbg_s
+ {
+#if __BYTE_ORDER == __BIG_ENDIAN
+ uint64_t reserved_15_63 : 49;
+ uint64_t lfb_enum : 4; /**< Specifies the LFB Entry# which is to be captured. */
+ uint64_t lfb_dmp : 1; /**< LFB Dump Enable: When written(=1), the contents of
+ the LFB specified by LFB_ENUM[3:0] are captured
+ into the L2C_LFB(0/1/2) registers.
+ NOTE: Some fields of the LFB entry are unpredictable
+ and dependent on usage. This is only intended to be
+ used for HW debug. */
+ uint64_t ppnum : 4; /**< When L2C_DBG[L2T] or L2C_DBG[L2D] or L2C_DBG[FINV]
+ is enabled, this field determines which one-of-16
+ PPs is selected as the diagnostic PP. */
+ uint64_t set : 3; /**< When L2C_DBG[L2T] or L2C_DBG[L2D] or L2C_DBG[FINV]
+ is enabled, this field determines 1-of-n targeted
+ sets to act upon.
+ NOTE: L2C_DBG[SET] must never equal a crippled or
+ unusable set (see UMSK* registers and Cripple mode
+ fuses). */
+ uint64_t finv : 1; /**< Flush-Invalidate.
+ When flush-invalidate is enable (FINV=1), all STF
+ (L1 store-miss) commands generated from the diagnostic PP
+ (L2C_DBG[PPNUM]) will invalidate the specified set
+ (L2C_DBG[SET]) at the index specified in the STF
+ address[17:7]. If a dirty block is detected (D=1), it is
+ written back to memory. The contents of the invalid
+ L2 Cache line is also 'scrubbed' with the STF write data.
+ NOTE: If L2C_CFG[IDXALIAS]=1, the index specified in
+ STF address[17:7] refers to the 'aliased' address.
+ NOTE: An STF command with write data=ZEROES can be
+ generated by SW using the Prefetch instruction with
+ Hint=30d "prepare for Store", followed by a SYNCW.
+ What is seen at the L2C as an STF w/wrdcnt=0 with all
+ of its mask bits clear (indicates zero-fill data).
+ A flush-invalidate will 'force-hit' the L2 cache at
+ [index,set] and invalidate the entry (V=0/D=0/L=0/U=0).
+ If the cache block is dirty, it is also written back
+ to memory. The DuTag state is probed/updated as normal
+ for an STF request.
+ TYPICAL APPLICATIONS:
+ 1) L2 Tag/Data ECC SW Recovery
+ 2) Cache Unlocking
+ NOTE: If the cacheline had been previously LOCKED(L=1),
+ a flush-invalidate operation will explicitly UNLOCK
+ (L=0) the set/index specified.
+ NOTE: The diagnostic PP cores can generate STF
+ commands to the L2 Cache whenever all 128 bytes in a
+ block are written. SW must take this into consideration
+ to avoid 'errant' Flush-Invalidates. */
+ uint64_t l2d : 1; /**< When enabled (and L2C_DBG[L2T]=0), fill data is
+ returned directly from the L2 Data Store
+ (regardless of hit/miss) when an LDD(L1 load-miss) command
+ is issued from a PP determined by the L2C_DBG[PPNUM]
+ field. The selected set# is determined by the
+ L2C_DBG[SET] field, and the index is determined
+ from the address[17:7] associated with the LDD
+ command.
+ This 'force-hit' will NOT alter the current L2 Tag
+ state OR the DuTag state. */
+ uint64_t l2t : 1; /**< When enabled, L2 Tag information [V,D,L,U,phys_addr[33:18]]
+ is returned on the data bus starting at +32(and +96) bytes
+ offset from the beginning of cacheline when an LDD
+ (L1 load-miss) command is issued from a PP determined by
+ the L2C_DBG[PPNUM] field.
+ The selected L2 set# is determined by the L2C_DBG[SET]
+ field, and the L2 index is determined from the
+ phys_addr[17:7] associated with the LDD command.
+ This 'L2 force-hit' will NOT alter the current L2 Tag
+ state OR the DuTag state.
+ NOTE: The diagnostic PP should issue a d-stream load
+ to an aligned cacheline+0x20(+0x60) in order to have the
+ return VDLUTAG information (in OW2/OW6) written directly
+ into the proper PP register. The diagnostic PP should also
+ flush it's local L1 cache after use(to ensure data
+ coherency).
+ NOTE: The position of the VDLUTAG data in the destination
+ register is dependent on the endian mode(big/little).
+ NOTE: N3K-Pass2 modification. (This bit's functionality
+ has changed since Pass1-in the following way).
+ NOTE: (For L2C BitMap testing of L2 Data Store OW ECC):
+ If L2D_ERR[ECC_ENA]=0, the OW ECC from the selected
+ half cacheline (see: L2D_ERR[BMHCLSEL] is also
+ conditionally latched into the L2D_FSYN0/1 CSRs if an
+ LDD command is detected from the diagnostic PP(L2C_DBG[PPNUM]). */
+#else
+ uint64_t l2t : 1;
+ uint64_t l2d : 1;
+ uint64_t finv : 1;
+ uint64_t set : 3;
+ uint64_t ppnum : 4;
+ uint64_t lfb_dmp : 1;
+ uint64_t lfb_enum : 4;
+ uint64_t reserved_15_63 : 49;
+#endif
+ } s;
+ struct cvmx_l2c_dbg_cn30xx
+ {
+#if __BYTE_ORDER == __BIG_ENDIAN
+ uint64_t reserved_13_63 : 51;
+ uint64_t lfb_enum : 2; /**< Specifies the LFB Entry# which is to be captured. */
+ uint64_t lfb_dmp : 1; /**< LFB Dump Enable: When written(=1), the contents of
+ the LFB specified by LFB_ENUM are captured
+ into the L2C_LFB(0/1/2) registers.
+ NOTE: Some fields of the LFB entry are unpredictable
+ and dependent on usage. This is only intended to be
+ used for HW debug. */
+ uint64_t reserved_7_9 : 3;
+ uint64_t ppnum : 1; /**< When L2C_DBG[L2T] or L2C_DBG[L2D] or L2C_DBG[FINV]
+ is enabled, this field determines which
+ PP is selected as the diagnostic PP.
+ NOTE: For CN30XX single core PPNUM=0 (MBZ) */
+ uint64_t reserved_5_5 : 1;
+ uint64_t set : 2; /**< When L2C_DBG[L2T] or L2C_DBG[L2D] or L2C_DBG[FINV]
+ is enabled, this field determines 1-of-n targeted
+ sets to act upon.
+ NOTE: L2C_DBG[SET] must never equal a crippled or
+ unusable set (see UMSK* registers and Cripple mode
+ fuses). */
+ uint64_t finv : 1; /**< Flush-Invalidate.
+ When flush-invalidate is enable (FINV=1), all STF
+ (L1 store-miss) commands generated from the PP will invalidate
+ the specified set(L2C_DBG[SET]) at the index specified
+ in the STF address[14:7]. If a dirty block is detected(D=1),
+ it is written back to memory. The contents of the invalid
+ L2 Cache line is also 'scrubbed' with the STF write data.
+ NOTE: If L2C_CFG[IDXALIAS]=1, the index specified in
+ STF address[14:7] refers to the 'aliased' address.
+ NOTE: An STF command with write data=ZEROES can be
+ generated by SW using the Prefetch instruction with
+ Hint=30d "prepare for Store", followed by a SYNCW.
+ What is seen at the L2C as an STF w/wrdcnt=0 with all
+ of its mask bits clear (indicates zero-fill data).
+ A flush-invalidate will 'force-hit' the L2 cache at
+ [index,set] and invalidate the entry (V=0/D=0/L=0/U=0).
+ If the cache block is dirty, it is also written back
+ to memory. The DuTag state is probed/updated as normal
+ for an STF request.
+ TYPICAL APPLICATIONS:
+ 1) L2 Tag/Data ECC SW Recovery
+ 2) Cache Unlocking
+ NOTE: If the cacheline had been previously LOCKED(L=1),
+ a flush-invalidate operation will explicitly UNLOCK
+ (L=0) the set/index specified.
+ NOTE: The PP can generate STF(L1 store-miss)
+ commands to the L2 Cache whenever all 128 bytes in a
+ block are written. SW must take this into consideration
+ to avoid 'errant' Flush-Invalidates. */
+ uint64_t l2d : 1; /**< When enabled (and L2C_DBG[L2T]=0), fill data is
+ returned directly from the L2 Data Store
+ (regardless of hit/miss) when an LDD(L1 load-miss)
+ command is issued from the PP.
+ The selected set# is determined by the
+ L2C_DBG[SET] field, and the index is determined
+ from the address[14:7] associated with the LDD
+ command.
+ This 'force-hit' will NOT alter the current L2 Tag
+ state OR the DuTag state. */
+ uint64_t l2t : 1; /**< When enabled, L2 Tag information [V,D,L,U,phys_addr[33:15]]
+ is returned on the data bus starting at +32(and +96) bytes
+ offset from the beginning of cacheline when an LDD
+ (L1 load-miss) command is issued from the PP.
+ The selected L2 set# is determined by the L2C_DBG[SET]
+ field, and the L2 index is determined from the
+ phys_addr[14:7] associated with the LDD command.
+ This 'L2 force-hit' will NOT alter the current L2 Tag
+ state OR the DuTag state.
+ NOTE: The diagnostic PP should issue a d-stream load
+ to an aligned cacheline+0x20(+0x60) in order to have the
+ return VDLUTAG information (in OW2/OW6) written directly
+ into the proper PP register. The diagnostic PP should also
+ flush it's local L1 cache after use(to ensure data
+ coherency).
+ NOTE: The position of the VDLUTAG data in the destination
+ register is dependent on the endian mode(big/little).
+ NOTE: (For L2C BitMap testing of L2 Data Store OW ECC):
+ If L2D_ERR[ECC_ENA]=0, the OW ECC from the selected
+ half cacheline (see: L2D_ERR[BMHCLSEL] is also
+ conditionally latched into the L2D_FSYN0/1 CSRs if an
+ LDD(L1 load-miss) is detected. */
+#else
+ uint64_t l2t : 1;
+ uint64_t l2d : 1;
+ uint64_t finv : 1;
+ uint64_t set : 2;
+ uint64_t reserved_5_5 : 1;
+ uint64_t ppnum : 1;
+ uint64_t reserved_7_9 : 3;
+ uint64_t lfb_dmp : 1;
+ uint64_t lfb_enum : 2;
+ uint64_t reserved_13_63 : 51;
+#endif
+ } cn30xx;
+ struct cvmx_l2c_dbg_cn31xx
+ {
+#if __BYTE_ORDER == __BIG_ENDIAN
+ uint64_t reserved_14_63 : 50;
+ uint64_t lfb_enum : 3; /**< Specifies the LFB Entry# which is to be captured. */
+ uint64_t lfb_dmp : 1; /**< LFB Dump Enable: When written(=1), the contents of
+ the LFB specified by LFB_ENUM are captured
+ into the L2C_LFB(0/1/2) registers.
+ NOTE: Some fields of the LFB entry are unpredictable
+ and dependent on usage. This is only intended to be
+ used for HW debug. */
+ uint64_t reserved_7_9 : 3;
+ uint64_t ppnum : 1; /**< When L2C_DBG[L2T] or L2C_DBG[L2D] or L2C_DBG[FINV]
+ is enabled, this field determines which
+ PP is selected as the diagnostic PP. */
+ uint64_t reserved_5_5 : 1;
+ uint64_t set : 2; /**< When L2C_DBG[L2T] or L2C_DBG[L2D] or L2C_DBG[FINV]
+ is enabled, this field determines 1-of-n targeted
+ sets to act upon.
+ NOTE: L2C_DBG[SET] must never equal a crippled or
+ unusable set (see UMSK* registers and Cripple mode
+ fuses). */
+ uint64_t finv : 1; /**< Flush-Invalidate.
+ When flush-invalidate is enable (FINV=1), all STF
+ (L1 store-miss) commands generated from the diagnostic PP
+ (L2C_DBG[PPNUM]) will invalidate the specified set
+ (L2C_DBG[SET]) at the index specified in the STF
+ address[15:7]. If a dirty block is detected (D=1), it is
+ written back to memory. The contents of the invalid
+ L2 Cache line is also 'scrubbed' with the STF write data.
+ NOTE: If L2C_CFG[IDXALIAS]=1, the index specified in
+ STF address[15:7] refers to the 'aliased' address.
+ NOTE: An STF command with write data=ZEROES can be
+ generated by SW using the Prefetch instruction with
+ Hint=30d "prepare for Store", followed by a SYNCW.
+ What is seen at the L2C as an STF w/wrdcnt=0 with all
+ of its mask bits clear (indicates zero-fill data).
+ A flush-invalidate will 'force-hit' the L2 cache at
+ [index,set] and invalidate the entry (V=0/D=0/L=0/U=0).
+ If the cache block is dirty, it is also written back
+ to memory. The DuTag state is probed/updated as normal
+ for an STF request.
+ TYPICAL APPLICATIONS:
+ 1) L2 Tag/Data ECC SW Recovery
+ 2) Cache Unlocking
+ NOTE: If the cacheline had been previously LOCKED(L=1),
+ a flush-invalidate operation will explicitly UNLOCK
+ (L=0) the set/index specified.
+ NOTE: The diagnostic PP cores can generate STF(L1 store-miss)
+ commands to the L2 Cache whenever all 128 bytes in a
+ block are written. SW must take this into consideration
+ to avoid 'errant' Flush-Invalidates. */
+ uint64_t l2d : 1; /**< When enabled (and L2C_DBG[L2T]=0), fill data is
+ returned directly from the L2 Data Store
+ (regardless of hit/miss) when an LDD(L1 load-miss)
+ command is issued from a PP determined by the
+ L2C_DBG[PPNUM] field. The selected set# is determined
+ by the L2C_DBG[SET] field, and the index is determined
+ from the address[15:7] associated with the LDD command.
+ This 'L2 force-hit' will NOT alter the current L2 Tag
+ state OR the DuTag state. */
+ uint64_t l2t : 1; /**< When enabled, L2 Tag information [V,D,L,U,phys_addr[33:16]]
+ is returned on the data bus starting at +32(and +96) bytes
+ offset from the beginning of cacheline when an LDD
+ (L1 load-miss) command is issued from a PP determined by
+ the L2C_DBG[PPNUM] field.
+ The selected L2 set# is determined by the L2C_DBG[SET]
+ field, and the L2 index is determined from the
+ phys_addr[15:7] associated with the LDD command.
+ This 'L2 force-hit' will NOT alter the current L2 Tag
+ state OR the DuTag state.
+ NOTE: The diagnostic PP should issue a d-stream load
+ to an aligned cacheline+0x20(+0x60) in order to have the
+ return VDLUTAG information (in OW2/OW6) written directly
+ into the proper PP register. The diagnostic PP should also
+ flush it's local L1 cache after use(to ensure data
+ coherency).
+ NOTE: The position of the VDLUTAG data in the destination
+ register is dependent on the endian mode(big/little).
+ NOTE: (For L2C BitMap testing of L2 Data Store OW ECC):
+ If L2D_ERR[ECC_ENA]=0, the OW ECC from the selected
+ half cacheline (see: L2D_ERR[BMHCLSEL] is also
+ conditionally latched into the L2D_FSYN0/1 CSRs if an
+ LDD(L1 load-miss) is detected from the diagnostic PP
+ (L2C_DBG[PPNUM]). */
+#else
+ uint64_t l2t : 1;
+ uint64_t l2d : 1;
+ uint64_t finv : 1;
+ uint64_t set : 2;
+ uint64_t reserved_5_5 : 1;
+ uint64_t ppnum : 1;
+ uint64_t reserved_7_9 : 3;
+ uint64_t lfb_dmp : 1;
+ uint64_t lfb_enum : 3;
+ uint64_t reserved_14_63 : 50;
+#endif
+ } cn31xx;
+ struct cvmx_l2c_dbg_s cn38xx;
+ struct cvmx_l2c_dbg_s cn38xxp2;
+ struct cvmx_l2c_dbg_cn50xx
+ {
+#if __BYTE_ORDER == __BIG_ENDIAN
+ uint64_t reserved_14_63 : 50;
+ uint64_t lfb_enum : 3; /**< Specifies the LFB Entry# which is to be captured. */
+ uint64_t lfb_dmp : 1; /**< LFB Dump Enable: When written(=1), the contents of
+ the LFB specified by LFB_ENUM[2:0] are captured
+ into the L2C_LFB(0/1/2) registers.
+ NOTE: Some fields of the LFB entry are unpredictable
+ and dependent on usage. This is only intended to be
+ used for HW debug. */
+ uint64_t reserved_7_9 : 3;
+ uint64_t ppnum : 1; /**< When L2C_DBG[L2T] or L2C_DBG[L2D] or L2C_DBG[FINV]
+ is enabled, this field determines which 1-of-2
+ PPs is selected as the diagnostic PP. */
+ uint64_t set : 3; /**< When L2C_DBG[L2T] or L2C_DBG[L2D] or L2C_DBG[FINV]
+ is enabled, this field determines 1-of-n targeted
+ sets to act upon.
+ NOTE: L2C_DBG[SET] must never equal a crippled or
+ unusable set (see UMSK* registers and Cripple mode
+ fuses). */
+ uint64_t finv : 1; /**< Flush-Invalidate.
+ When flush-invalidate is enable (FINV=1), all STF
+ (L1 store-miss) commands generated from the diagnostic PP
+ (L2C_DBG[PPNUM]) will invalidate the specified set
+ (L2C_DBG[SET]) at the index specified in the STF
+ address[13:7]. If a dirty block is detected (D=1), it is
+ written back to memory. The contents of the invalid
+ L2 Cache line is also 'scrubbed' with the STF write data.
+ NOTE: If L2C_CFG[IDXALIAS]=1, the index specified in
+ STF address[13:7] refers to the 'aliased' address.
+ NOTE: An STF command with write data=ZEROES can be
+ generated by SW using the Prefetch instruction with
+ Hint=30d "prepare for Store", followed by a SYNCW.
+ What is seen at the L2C as an STF w/wrdcnt=0 with all
+ of its mask bits clear (indicates zero-fill data).
+ A flush-invalidate will 'force-hit' the L2 cache at
+ [index,set] and invalidate the entry (V=0/D=0/L=0/U=0).
+ If the cache block is dirty, it is also written back
+ to memory. The DuTag state is probed/updated as normal
+ for an STF request.
+ TYPICAL APPLICATIONS:
+ 1) L2 Tag/Data ECC SW Recovery
+ 2) Cache Unlocking
+ NOTE: If the cacheline had been previously LOCKED(L=1),
+ a flush-invalidate operation will explicitly UNLOCK
+ (L=0) the set/index specified.
+ NOTE: The diagnostic PP cores can generate STF
+ commands to the L2 Cache whenever all 128 bytes in a
+ block are written. SW must take this into consideration
+ to avoid 'errant' Flush-Invalidates. */
+ uint64_t l2d : 1; /**< When enabled (and L2C_DBG[L2T]=0), fill data is
+ returned directly from the L2 Data Store
+ (regardless of hit/miss) when an LDD(L1 load-miss) command
+ is issued from a PP determined by the L2C_DBG[PPNUM]
+ field. The selected set# is determined by the
+ L2C_DBG[SET] field, and the index is determined
+ from the address[13:7] associated with the LDD
+ command.
+ This 'force-hit' will NOT alter the current L2 Tag
+ state OR the DuTag state. */
+ uint64_t l2t : 1; /**< When enabled, L2 Tag information [V,D,L,U,phys_addr[33:14]]
+ is returned on the data bus starting at +32(and +96) bytes
+ offset from the beginning of cacheline when an LDD
+ (L1 load-miss) command is issued from a PP determined by
+ the L2C_DBG[PPNUM] field.
+ The selected L2 set# is determined by the L2C_DBG[SET]
+ field, and the L2 index is determined from the
+ phys_addr[13:7] associated with the LDD command.
+ This 'L2 force-hit' will NOT alter the current L2 Tag
+ state OR the DuTag state.
+ NOTE: The diagnostic PP should issue a d-stream load
+ to an aligned cacheline+0x20(+0x60) in order to have the
+ return VDLUTAG information (in OW2/OW6) written directly
+ into the proper PP register. The diagnostic PP should also
+ flush it's local L1 cache after use(to ensure data
+ coherency).
+ NOTE: The position of the VDLUTAG data in the destination
+ register is dependent on the endian mode(big/little).
+ NOTE: (For L2C BitMap testing of L2 Data Store OW ECC):
+ If L2D_ERR[ECC_ENA]=0, the OW ECC from the selected
+ half cacheline (see: L2D_ERR[BMHCLSEL] is also
+ conditionally latched into the L2D_FSYN0/1 CSRs if an
+ LDD command is detected from the diagnostic PP(L2C_DBG[PPNUM]). */
+#else
+ uint64_t l2t : 1;
+ uint64_t l2d : 1;
+ uint64_t finv : 1;
+ uint64_t set : 3;
+ uint64_t ppnum : 1;
+ uint64_t reserved_7_9 : 3;
+ uint64_t lfb_dmp : 1;
+ uint64_t lfb_enum : 3;
+ uint64_t reserved_14_63 : 50;
+#endif
+ } cn50xx;
+ struct cvmx_l2c_dbg_cn52xx
+ {
+#if __BYTE_ORDER == __BIG_ENDIAN
+ uint64_t reserved_14_63 : 50;
+ uint64_t lfb_enum : 3; /**< Specifies the LFB Entry# which is to be captured. */
+ uint64_t lfb_dmp : 1; /**< LFB Dump Enable: When written(=1), the contents of
+ the LFB specified by LFB_ENUM[2:0] are captured
+ into the L2C_LFB(0/1/2) registers.
+ NOTE: Some fields of the LFB entry are unpredictable
+ and dependent on usage. This is only intended to be
+ used for HW debug. */
+ uint64_t reserved_8_9 : 2;
+ uint64_t ppnum : 2; /**< When L2C_DBG[L2T] or L2C_DBG[L2D] or L2C_DBG[FINV]
+ is enabled, this field determines which 1-of-4
+ PPs is selected as the diagnostic PP. */
+ uint64_t set : 3; /**< When L2C_DBG[L2T] or L2C_DBG[L2D] or L2C_DBG[FINV]
+ is enabled, this field determines 1-of-n targeted
+ sets to act upon.
+ NOTE: L2C_DBG[SET] must never equal a crippled or
+ unusable set (see UMSK* registers and Cripple mode
+ fuses). */
+ uint64_t finv : 1; /**< Flush-Invalidate.
+ When flush-invalidate is enable (FINV=1), all STF
+ (L1 store-miss) commands generated from the diagnostic PP
+ (L2C_DBG[PPNUM]) will invalidate the specified set
+ (L2C_DBG[SET]) at the index specified in the STF
+ address[15:7]. If a dirty block is detected (D=1), it is
+ written back to memory. The contents of the invalid
+ L2 Cache line is also 'scrubbed' with the STF write data.
+ NOTE: If L2C_CFG[IDXALIAS]=1, the index specified in
+ STF address[15:7] refers to the 'aliased' address.
+ NOTE: An STF command with write data=ZEROES can be
+ generated by SW using the Prefetch instruction with
+ Hint=30d "prepare for Store", followed by a SYNCW.
+ What is seen at the L2C as an STF w/wrdcnt=0 with all
+ of its mask bits clear (indicates zero-fill data).
+ A flush-invalidate will 'force-hit' the L2 cache at
+ [index,set] and invalidate the entry (V=0/D=0/L=0/U=0).
+ If the cache block is dirty, it is also written back
+ to memory. The DuTag state is probed/updated as normal
+ for an STF request.
+ TYPICAL APPLICATIONS:
+ 1) L2 Tag/Data ECC SW Recovery
+ 2) Cache Unlocking
+ NOTE: If the cacheline had been previously LOCKED(L=1),
+ a flush-invalidate operation will explicitly UNLOCK
+ (L=0) the set/index specified.
+ NOTE: The diagnostic PP cores can generate STF
+ commands to the L2 Cache whenever all 128 bytes in a
+ block are written. SW must take this into consideration
+ to avoid 'errant' Flush-Invalidates. */
+ uint64_t l2d : 1; /**< When enabled (and L2C_DBG[L2T]=0), fill data is
+ returned directly from the L2 Data Store
+ (regardless of hit/miss) when an LDD(L1 load-miss) command
+ is issued from a PP determined by the L2C_DBG[PPNUM]
+ field. The selected set# is determined by the
+ L2C_DBG[SET] field, and the index is determined
+ from the address[15:7] associated with the LDD
+ command.
+ This 'force-hit' will NOT alter the current L2 Tag
+ state OR the DuTag state. */
+ uint64_t l2t : 1; /**< When enabled, L2 Tag information [V,D,L,U,phys_addr[33:16]]
+ is returned on the data bus starting at +32(and +96) bytes
+ offset from the beginning of cacheline when an LDD
+ (L1 load-miss) command is issued from a PP determined by
+ the L2C_DBG[PPNUM] field.
+ The selected L2 set# is determined by the L2C_DBG[SET]
+ field, and the L2 index is determined from the
+ phys_addr[15:7] associated with the LDD command.
+ This 'L2 force-hit' will NOT alter the current L2 Tag
+ state OR the DuTag state.
+ NOTE: The diagnostic PP should issue a d-stream load
+ to an aligned cacheline+0x20(+0x60) in order to have the
+ return VDLUTAG information (in OW2/OW6) written directly
+ into the proper PP register. The diagnostic PP should also
+ flush it's local L1 cache after use(to ensure data
+ coherency).
+ NOTE: The position of the VDLUTAG data in the destination
+ register is dependent on the endian mode(big/little).
+ NOTE: (For L2C BitMap testing of L2 Data Store OW ECC):
+ If L2D_ERR[ECC_ENA]=0, the OW ECC from the selected
+ half cacheline (see: L2D_ERR[BMHCLSEL] is also
+ conditionally latched into the L2D_FSYN0/1 CSRs if an
+ LDD command is detected from the diagnostic PP(L2C_DBG[PPNUM]). */
+#else
+ uint64_t l2t : 1;
+ uint64_t l2d : 1;
+ uint64_t finv : 1;
+ uint64_t set : 3;
+ uint64_t ppnum : 2;
+ uint64_t reserved_8_9 : 2;
+ uint64_t lfb_dmp : 1;
+ uint64_t lfb_enum : 3;
+ uint64_t reserved_14_63 : 50;
+#endif
+ } cn52xx;
+ struct cvmx_l2c_dbg_cn52xx cn52xxp1;
+ struct cvmx_l2c_dbg_s cn56xx;
+ struct cvmx_l2c_dbg_s cn56xxp1;
+ struct cvmx_l2c_dbg_s cn58xx;
+ struct cvmx_l2c_dbg_s cn58xxp1;
+};
+typedef union cvmx_l2c_dbg cvmx_l2c_dbg_t;
+
+/**
+ * cvmx_l2c_dut
+ *
+ * L2C_DUT = L2C DUTAG Register
+ *
+ * Description: L2C Duplicate Tag State Register
+ *
+ * Notes:
+ * (1) When using the L2T, L2D or FINV Debug probe feature, an LDD command issued by the diagnostic PP
+ * WILL NOT update the DuTags.
+ * (2) L2T, L2D, FINV MUST BE mutually exclusive (only one enabled at a time).
+ * (3) Force Invalidate is intended as a means for SW to invalidate the L2 Cache while also writing back
+ * dirty data to memory to maintain coherency. (A side effect of FINV is that an LDD L2 fill is
+ * launched which fills data into the L2 DS).
+ */
+union cvmx_l2c_dut
+{
+ uint64_t u64;
+ struct cvmx_l2c_dut_s
+ {
+#if __BYTE_ORDER == __BIG_ENDIAN
+ uint64_t reserved_32_63 : 32;
+ uint64_t dtena : 1; /**< DuTag Diagnostic read enable.
+ When L2C_DUT[DTENA]=1, all LDD(L1 load-miss)
+ commands issued from the diagnostic PP
+ (L2C_DBG[PPNUM]) will capture the DuTag state (V|L1TAG)
+ of the PP#(specified in the LDD address[29:26] into
+ the L2C_DUT CSR register. This allows the diagPP to
+ read ALL DuTags (from any PP).
+ The DuTag Set# to capture is extracted from the LDD
+ address[25:20]. The diagnostic PP would issue the
+ LDD then read the L2C_DUT register (one at a time).
+ This LDD 'L2 force-hit' will NOT alter the current L2
+ Tag State OR the DuTag state.
+ NOTE: For CN58XX the DuTag SIZE has doubled (to 16KB)
+ where each DuTag is organized as 2x 64-way entries.
+ The LDD address[7] determines which 1(of-2) internal
+ 64-ways to select.
+ The fill data is returned directly from the L2 Data
+ Store(regardless of hit/miss) when an LDD command
+ is issued from a PP determined by the L2C_DBG[PPNUM]
+ field. The selected L2 Set# is determined by the
+ L2C_DBG[SET] field, and the index is determined
+ from the address[17:7] associated with the LDD
+ command.
+ This 'L2 force-hit' will NOT alter the current L2 Tag
+ state OR the DuTag state.
+ NOTE: In order for the DiagPP to generate an LDD command
+ to the L2C, it must first force an L1 Dcache flush. */
+ uint64_t reserved_30_30 : 1;
+ uint64_t dt_vld : 1; /**< Duplicate L1 Tag Valid bit latched in for previous
+ LDD(L1 load-miss) command sourced by diagnostic PP. */
+ uint64_t dt_tag : 29; /**< Duplicate L1 Tag[35:7] latched in for previous
+ LDD(L1 load-miss) command sourced by diagnostic PP. */
+#else
+ uint64_t dt_tag : 29;
+ uint64_t dt_vld : 1;
+ uint64_t reserved_30_30 : 1;
+ uint64_t dtena : 1;
+ uint64_t reserved_32_63 : 32;
+#endif
+ } s;
+ struct cvmx_l2c_dut_s cn30xx;
+ struct cvmx_l2c_dut_s cn31xx;
+ struct cvmx_l2c_dut_s cn38xx;
+ struct cvmx_l2c_dut_s cn38xxp2;
+ struct cvmx_l2c_dut_s cn50xx;
+ struct cvmx_l2c_dut_s cn52xx;
+ struct cvmx_l2c_dut_s cn52xxp1;
+ struct cvmx_l2c_dut_s cn56xx;
+ struct cvmx_l2c_dut_s cn56xxp1;
+ struct cvmx_l2c_dut_s cn58xx;
+ struct cvmx_l2c_dut_s cn58xxp1;
+};
+typedef union cvmx_l2c_dut cvmx_l2c_dut_t;
+
+/**
+ * cvmx_l2c_dut_map#
+ *
+ * L2C_DUT_MAP = L2C DUT memory map region
+ *
+ * Description: Address of the start of the region mapped to the duplicate tag. Can be used to read
+ * and write the raw duplicate tag CAM. Writes should be used only with great care as they can easily
+ * destroy the coherency of the memory system. In any case this region is expected to only be used
+ * for debug.
+ *
+ * This base address should be combined with PP virtual ID, L1 way and L1 set to produce the final
+ * address as follows:
+ * addr<63:14> L2C_DUT_MAP<63:14>
+ * addr<13:11> PP VID
+ * addr<10:6> L1 way
+ * addr<5:3> L1 set
+ * addr<2:0> UNUSED
+ *
+ * Notes:
+ * (1) The tag is 37:10 from the 38-bit OCTEON physical address after hole removal. (The hole is between DR0
+ * and DR1. Remove the hole by subtracting 256MB from 38-bit OCTEON L2/DRAM physical addresses >= 512 MB.)
+ */
+union cvmx_l2c_dut_mapx
+{
+ uint64_t u64;
+ struct cvmx_l2c_dut_mapx_s
+ {
+#if __BYTE_ORDER == __BIG_ENDIAN
+ uint64_t reserved_38_63 : 26;
+ uint64_t tag : 28; /**< The tag value (see Note 1) */
+ uint64_t reserved_1_9 : 9;
+ uint64_t valid : 1; /**< The valid bit */
+#else
+ uint64_t valid : 1;
+ uint64_t reserved_1_9 : 9;
+ uint64_t tag : 28;
+ uint64_t reserved_38_63 : 26;
+#endif
+ } s;
+ struct cvmx_l2c_dut_mapx_s cn63xx;
+ struct cvmx_l2c_dut_mapx_s cn63xxp1;
+};
+typedef union cvmx_l2c_dut_mapx cvmx_l2c_dut_mapx_t;
+
+/**
+ * cvmx_l2c_err_tdt#
+ *
+ * L2C_ERR_TDT = L2C TAD DaTa Error Info
+ *
+ *
+ * Notes:
+ * (1) If the status bit corresponding to the value of the TYPE field is not set the WAYIDX/SYN fields
+ * are not associated with the errors currently logged by the status bits and should be ignored.
+ * This can occur, for example, because of a race between a write to clear a DBE and a new, lower
+ * priority, SBE error occuring. If the SBE arrives prior to the DBE clear the WAYIDX/SYN fields
+ * will still be locked, but the new SBE error status bit will still be set.
+ *
+ * (2) The four types of errors have differing priorities. Priority (from lowest to highest) is SBE,
+ * VSBE, DBE, VDBE. A error will lock the WAYIDX, and SYN fields for other errors of equal or
+ * lower priority until cleared by software. This means that the error information is always
+ * (assuming the TYPE field matches) for the highest priority error logged in the status bits.
+ *
+ * (3) If VSBE or VDBE are set (and the TYPE field matches), the WAYIDX fields are valid and the
+ * syndrome can be found in L2C_ERR_VBF.
+ *
+ * (4) The syndrome is recorded for DBE errors, though the utility of the value is not clear.
+ */
+union cvmx_l2c_err_tdtx
+{
+ uint64_t u64;
+ struct cvmx_l2c_err_tdtx_s
+ {
+#if __BYTE_ORDER == __BIG_ENDIAN
+ uint64_t dbe : 1; /**< L2D Double-Bit error has occurred */
+ uint64_t sbe : 1; /**< L2D Single-Bit error has occurred */
+ uint64_t vdbe : 1; /**< VBF Double-Bit error has occurred */
+ uint64_t vsbe : 1; /**< VBF Single-Bit error has occurred */
+ uint64_t syn : 10; /**< L2D syndrome (valid only for SBE/DBE, not VSBE/VDBE) */
+ uint64_t reserved_21_49 : 29;
+ uint64_t wayidx : 17; /**< Way, index, OW of the L2 block containing the error */
+ uint64_t reserved_2_3 : 2;
+ uint64_t type : 2; /**< The type of error the WAYIDX,SYN were latched for.
+ 0 - VSBE
+ 1 - VDBE
+ 2 - SBE
+ 3 - DBE */
+#else
+ uint64_t type : 2;
+ uint64_t reserved_2_3 : 2;
+ uint64_t wayidx : 17;
+ uint64_t reserved_21_49 : 29;
+ uint64_t syn : 10;
+ uint64_t vsbe : 1;
+ uint64_t vdbe : 1;
+ uint64_t sbe : 1;
+ uint64_t dbe : 1;
+#endif
+ } s;
+ struct cvmx_l2c_err_tdtx_s cn63xx;
+ struct cvmx_l2c_err_tdtx_s cn63xxp1;
+};
+typedef union cvmx_l2c_err_tdtx cvmx_l2c_err_tdtx_t;
+
+/**
+ * cvmx_l2c_err_ttg#
+ *
+ * L2C_ERR_TTG = L2C TAD TaG Error Info
+ *
+ *
+ * Notes:
+ * (1) The priority of errors (highest to lowest) is DBE, SBE, NOWAY. An error will lock the SYN, and
+ * WAYIDX fields for equal or lower priority errors until cleared by software.
+ *
+ * (2) The syndrome is recorded for DBE errors, though the utility of the value is not clear.
+ *
+ * (3) A NOWAY error does not change the value of the SYN field, and leaves WAYIDX[20:17]
+ * unpredictable. WAYIDX[16:7] is the L2 block index associated with the command which had no way
+ * to allocate.
+ *
+ * (4) If the status bit corresponding to the value of the TYPE field is not set the WAYIDX/SYN fields
+ * are not associated with the errors currently logged by the status bits and should be ignored.
+ * This can occur, for example, because of a race between a write to clear a DBE and a new, lower
+ * priority, SBE error occuring. If the SBE arrives prior to the DBE clear the WAYIDX/SYN fields
+ * will still be locked, but the new SBE error status bit will still be set.
+ */
+union cvmx_l2c_err_ttgx
+{
+ uint64_t u64;
+ struct cvmx_l2c_err_ttgx_s
+ {
+#if __BYTE_ORDER == __BIG_ENDIAN
+ uint64_t dbe : 1; /**< Double-Bit ECC error */
+ uint64_t sbe : 1; /**< Single-Bit ECC error */
+ uint64_t noway : 1; /**< No way was available for allocation.
+ L2C sets NOWAY during its processing of a
+ transaction whenever it needed/wanted to allocate
+ a WAY in the L2 cache, but was unable to. NOWAY==1
+ is (generally) not an indication that L2C failed to
+ complete transactions. Rather, it is a hint of
+ possible performance degradation. (For example, L2C
+ must read-modify-write DRAM for every transaction
+ that updates some, but not all, of the bytes in a
+ cache block, misses in the L2 cache, and cannot
+ allocate a WAY.) There is one "failure" case where
+ L2C will set NOWAY: when it cannot leave a block
+ locked in the L2 cache as part of a LCKL2
+ transaction. */
+ uint64_t reserved_56_60 : 5;
+ uint64_t syn : 6; /**< Syndrome for the single-bit error */
+ uint64_t reserved_21_49 : 29;
+ uint64_t wayidx : 14; /**< Way and index of the L2 block containing the error */
+ uint64_t reserved_2_6 : 5;
+ uint64_t type : 2; /**< The type of error the WAYIDX,SYN were latched for.
+ 0 - not valid
+ 1 - NOWAY
+ 2 - SBE
+ 3 - DBE */
+#else
+ uint64_t type : 2;
+ uint64_t reserved_2_6 : 5;
+ uint64_t wayidx : 14;
+ uint64_t reserved_21_49 : 29;
+ uint64_t syn : 6;
+ uint64_t reserved_56_60 : 5;
+ uint64_t noway : 1;
+ uint64_t sbe : 1;
+ uint64_t dbe : 1;
+#endif
+ } s;
+ struct cvmx_l2c_err_ttgx_s cn63xx;
+ struct cvmx_l2c_err_ttgx_s cn63xxp1;
+};
+typedef union cvmx_l2c_err_ttgx cvmx_l2c_err_ttgx_t;
+
+/**
+ * cvmx_l2c_err_vbf#
+ *
+ * L2C_ERR_VBF = L2C VBF Error Info
+ *
+ *
+ * Notes:
+ * (1) The way/index information is stored in L2C_ERR_TDT, assuming no later interrupt occurred to
+ * overwrite the information. See the notes associated with L2C_ERR_TDT for full details.
+ *
+ * (2) The first VSBE will lock the register for other VSBE's. A VDBE, however, will overwrite a
+ * previously logged VSBE. Once a VDBE has been logged all later errors will not be logged. This
+ * means that if VDBE is set the information in the register is for the VDBE, if VDBE is clear and
+ * VSBE is set the register contains information about the VSBE.
+ *
+ * (3) The syndrome is recorded for VDBE errors, though the utility of the value is not clear.
+ *
+ * (4) If the status bit corresponding to the value of the TYPE field is not set the SYN field is not
+ * associated with the errors currently logged by the status bits and should be ignored. This can
+ * occur, for example, because of a race between a write to clear a VDBE and a new, lower priority,
+ * VSBE error occuring. If the VSBE arrives prior to the VDBE clear the SYN field will still be
+ * locked, but the new VSBE error status bit will still be set.
+ */
+union cvmx_l2c_err_vbfx
+{
+ uint64_t u64;
+ struct cvmx_l2c_err_vbfx_s
+ {
+#if __BYTE_ORDER == __BIG_ENDIAN
+ uint64_t reserved_62_63 : 2;
+ uint64_t vdbe : 1; /**< VBF Double-Bit error has occurred */
+ uint64_t vsbe : 1; /**< VBF Single-Bit error has occurred */
+ uint64_t vsyn : 10; /**< VBF syndrome (valid only if VSBE/VDBE is set) */
+ uint64_t reserved_2_49 : 48;
+ uint64_t type : 2; /**< The type of error the SYN were latched for.
+ 0 - VSBE
+ 1 - VDBE */
+#else
+ uint64_t type : 2;
+ uint64_t reserved_2_49 : 48;
+ uint64_t vsyn : 10;
+ uint64_t vsbe : 1;
+ uint64_t vdbe : 1;
+ uint64_t reserved_62_63 : 2;
+#endif
+ } s;
+ struct cvmx_l2c_err_vbfx_s cn63xx;
+ struct cvmx_l2c_err_vbfx_s cn63xxp1;
+};
+typedef union cvmx_l2c_err_vbfx cvmx_l2c_err_vbfx_t;
+
+/**
+ * cvmx_l2c_err_xmc
+ *
+ * L2C_ERR_XMC = L2C XMC request error
+ *
+ * Description: records error information for HOLE*, BIG* and VRT* interrupts.
+ *
+ * Notes:
+ * (1) The first BIGWR/HOLEWR/VRT* interrupt will lock the register until L2C_INT_REG[6:1] are
+ * cleared.
+ *
+ * (2) ADDR<15:0> will always be zero for VRT* interrupts.
+ *
+ * (3) ADDR is the 38-bit OCTEON physical address after hole removal. (The hole is between DR0
+ * and DR1. Remove the hole by subtracting 256MB from all 38-bit OCTEON L2/DRAM physical addresses
+ * >= 512 MB.)
+ *
+ * (4) For 63xx pass 2.0 and all 68xx ADDR<15:0> will ALWAYS be zero.
+ */
+union cvmx_l2c_err_xmc
+{
+ uint64_t u64;
+ struct cvmx_l2c_err_xmc_s
+ {
+#if __BYTE_ORDER == __BIG_ENDIAN
+ uint64_t cmd : 6; /**< XMC command or request causing error */
+ uint64_t reserved_52_57 : 6;
+ uint64_t sid : 4; /**< XMC sid of request causing error */
+ uint64_t reserved_38_47 : 10;
+ uint64_t addr : 38; /**< XMC address causing the error (see Notes 2 and 3) */
+#else
+ uint64_t addr : 38;
+ uint64_t reserved_38_47 : 10;
+ uint64_t sid : 4;
+ uint64_t reserved_52_57 : 6;
+ uint64_t cmd : 6;
+#endif
+ } s;
+ struct cvmx_l2c_err_xmc_s cn63xx;
+ struct cvmx_l2c_err_xmc_s cn63xxp1;
+};
+typedef union cvmx_l2c_err_xmc cvmx_l2c_err_xmc_t;
+
+/**
+ * cvmx_l2c_grpwrr0
+ *
+ * L2C_GRPWRR0 = L2C PP Weighted Round \#0 Register
+ *
+ * Description: Defines Weighted rounds(32) for Group PLC0,PLC1
+ *
+ * Notes:
+ * - Starvation of a group 'could' occur, unless SW takes the precaution to ensure that each GROUP
+ * participates in at least 1(of 32) rounds (ie: At least 1 bit(of 32) should be clear).
+ */
+union cvmx_l2c_grpwrr0
+{
+ uint64_t u64;
+ struct cvmx_l2c_grpwrr0_s
+ {
+#if __BYTE_ORDER == __BIG_ENDIAN
+ uint64_t plc1rmsk : 32; /**< PLC1 Group#1 Weighted Round Mask
+ Each bit represents 1 of 32 rounds
+ for Group \#1's participation. When a 'round' bit is
+ set, Group#1 is 'masked' and DOES NOT participate.
+ When a 'round' bit is clear, Group#1 WILL
+ participate in the arbitration for this round. */
+ uint64_t plc0rmsk : 32; /**< PLC Group#0 Weighted Round Mask
+ Each bit represents 1 of 32 rounds
+ for Group \#0's participation. When a 'round' bit is
+ set, Group#0 is 'masked' and DOES NOT participate.
+ When a 'round' bit is clear, Group#0 WILL
+ participate in the arbitration for this round. */
+#else
+ uint64_t plc0rmsk : 32;
+ uint64_t plc1rmsk : 32;
+#endif
+ } s;
+ struct cvmx_l2c_grpwrr0_s cn52xx;
+ struct cvmx_l2c_grpwrr0_s cn52xxp1;
+ struct cvmx_l2c_grpwrr0_s cn56xx;
+ struct cvmx_l2c_grpwrr0_s cn56xxp1;
+};
+typedef union cvmx_l2c_grpwrr0 cvmx_l2c_grpwrr0_t;
+
+/**
+ * cvmx_l2c_grpwrr1
+ *
+ * L2C_GRPWRR1 = L2C PP Weighted Round \#1 Register
+ *
+ * Description: Defines Weighted Rounds(32) for Group PLC2,ILC
+ *
+ * Notes:
+ * - Starvation of a group 'could' occur, unless SW takes the precaution to ensure that each GROUP
+ * participates in at least 1(of 32) rounds (ie: At least 1 bit(of 32) should be clear).
+ */
+union cvmx_l2c_grpwrr1
+{
+ uint64_t u64;
+ struct cvmx_l2c_grpwrr1_s
+ {
+#if __BYTE_ORDER == __BIG_ENDIAN
+ uint64_t ilcrmsk : 32; /**< ILC (IOB) Weighted Round Mask
+ Each bit represents 1 of 32 rounds
+ for IOB participation. When a 'round' bit is
+ set, IOB is 'masked' and DOES NOT participate.
+ When a 'round' bit is clear, IOB WILL
+ participate in the arbitration for this round. */
+ uint64_t plc2rmsk : 32; /**< PLC Group#2 Weighted Round Mask
+ Each bit represents 1 of 32 rounds
+ for Group \#2's participation. When a 'round' bit is
+ set, Group#2 is 'masked' and DOES NOT participate.
+ When a 'round' bit is clear, Group#2 WILL
+ participate in the arbitration for this round. */
+#else
+ uint64_t plc2rmsk : 32;
+ uint64_t ilcrmsk : 32;
+#endif
+ } s;
+ struct cvmx_l2c_grpwrr1_s cn52xx;
+ struct cvmx_l2c_grpwrr1_s cn52xxp1;
+ struct cvmx_l2c_grpwrr1_s cn56xx;
+ struct cvmx_l2c_grpwrr1_s cn56xxp1;
+};
+typedef union cvmx_l2c_grpwrr1 cvmx_l2c_grpwrr1_t;
+
+/**
+ * cvmx_l2c_int_en
+ *
+ * L2C_INT_EN = L2C Global Interrupt Enable Register
+ *
+ * Description:
+ */
+union cvmx_l2c_int_en
+{
+ uint64_t u64;
+ struct cvmx_l2c_int_en_s
+ {
+#if __BYTE_ORDER == __BIG_ENDIAN
+ uint64_t reserved_9_63 : 55;
+ uint64_t lck2ena : 1; /**< L2 Tag Lock Error2 Interrupt Enable bit
+ NOTE: This is the 'same' bit as L2T_ERR[LCK_INTENA2] */
+ uint64_t lckena : 1; /**< L2 Tag Lock Error Interrupt Enable bit
+ NOTE: This is the 'same' bit as L2T_ERR[LCK_INTENA] */
+ uint64_t l2ddeden : 1; /**< L2 Data ECC Double Error Detect(DED) Interrupt Enable bit
+ When set, allows interrupts to be reported on double bit
+ (uncorrectable) errors from the L2 Data Arrays.
+ NOTE: This is the 'same' bit as L2D_ERR[DED_INTENA] */
+ uint64_t l2dsecen : 1; /**< L2 Data ECC Single Error Correct(SEC) Interrupt Enable bit
+ When set, allows interrupts to be reported on single bit
+ (correctable) errors from the L2 Data Arrays.
+ NOTE: This is the 'same' bit as L2D_ERR[SEC_INTENA] */
+ uint64_t l2tdeden : 1; /**< L2 Tag ECC Double Error Detect(DED) Interrupt
+ NOTE: This is the 'same' bit as L2T_ERR[DED_INTENA] */
+ uint64_t l2tsecen : 1; /**< L2 Tag ECC Single Error Correct(SEC) Interrupt
+ Enable bit. When set, allows interrupts to be
+ reported on single bit (correctable) errors from
+ the L2 Tag Arrays.
+ NOTE: This is the 'same' bit as L2T_ERR[SEC_INTENA] */
+ uint64_t oob3en : 1; /**< DMA Out of Bounds Interrupt Enable Range#3 */
+ uint64_t oob2en : 1; /**< DMA Out of Bounds Interrupt Enable Range#2 */
+ uint64_t oob1en : 1; /**< DMA Out of Bounds Interrupt Enable Range#1 */
+#else
+ uint64_t oob1en : 1;
+ uint64_t oob2en : 1;
+ uint64_t oob3en : 1;
+ uint64_t l2tsecen : 1;
+ uint64_t l2tdeden : 1;
+ uint64_t l2dsecen : 1;
+ uint64_t l2ddeden : 1;
+ uint64_t lckena : 1;
+ uint64_t lck2ena : 1;
+ uint64_t reserved_9_63 : 55;
+#endif
+ } s;
+ struct cvmx_l2c_int_en_s cn52xx;
+ struct cvmx_l2c_int_en_s cn52xxp1;
+ struct cvmx_l2c_int_en_s cn56xx;
+ struct cvmx_l2c_int_en_s cn56xxp1;
+};
+typedef union cvmx_l2c_int_en cvmx_l2c_int_en_t;
+
+/**
+ * cvmx_l2c_int_ena
+ *
+ * L2C_INT_ENA = L2C Interrupt Enable
+ *
+ */
+union cvmx_l2c_int_ena
+{
+ uint64_t u64;
+ struct cvmx_l2c_int_ena_s
+ {
+#if __BYTE_ORDER == __BIG_ENDIAN
+ uint64_t reserved_8_63 : 56;
+ uint64_t bigrd : 1; /**< Read reference past MAXDRAM enable */
+ uint64_t bigwr : 1; /**< Write reference past MAXDRAM enable */
+ uint64_t vrtpe : 1; /**< Virtualization memory parity error */
+ uint64_t vrtadrng : 1; /**< Address outside of virtualization range enable */
+ uint64_t vrtidrng : 1; /**< Virtualization ID out of range enable */
+ uint64_t vrtwr : 1; /**< Virtualization ID prevented a write enable */
+ uint64_t holewr : 1; /**< Write reference to 256MB hole enable */
+ uint64_t holerd : 1; /**< Read reference to 256MB hole enable */
+#else
+ uint64_t holerd : 1;
+ uint64_t holewr : 1;
+ uint64_t vrtwr : 1;
+ uint64_t vrtidrng : 1;
+ uint64_t vrtadrng : 1;
+ uint64_t vrtpe : 1;
+ uint64_t bigwr : 1;
+ uint64_t bigrd : 1;
+ uint64_t reserved_8_63 : 56;
+#endif
+ } s;
+ struct cvmx_l2c_int_ena_s cn63xx;
+ struct cvmx_l2c_int_ena_cn63xxp1
+ {
+#if __BYTE_ORDER == __BIG_ENDIAN
+ uint64_t reserved_6_63 : 58;
+ uint64_t vrtpe : 1; /**< Virtualization memory parity error */
+ uint64_t vrtadrng : 1; /**< Address outside of virtualization range enable */
+ uint64_t vrtidrng : 1; /**< Virtualization ID out of range enable */
+ uint64_t vrtwr : 1; /**< Virtualization ID prevented a write enable */
+ uint64_t holewr : 1; /**< Write reference to 256MB hole enable */
+ uint64_t holerd : 1; /**< Read reference to 256MB hole enable */
+#else
+ uint64_t holerd : 1;
+ uint64_t holewr : 1;
+ uint64_t vrtwr : 1;
+ uint64_t vrtidrng : 1;
+ uint64_t vrtadrng : 1;
+ uint64_t vrtpe : 1;
+ uint64_t reserved_6_63 : 58;
+#endif
+ } cn63xxp1;
+};
+typedef union cvmx_l2c_int_ena cvmx_l2c_int_ena_t;
+
+/**
+ * cvmx_l2c_int_reg
+ *
+ * L2C_INT_REG = L2C Interrupt Register
+ *
+ */
+union cvmx_l2c_int_reg
+{
+ uint64_t u64;
+ struct cvmx_l2c_int_reg_s
+ {
+#if __BYTE_ORDER == __BIG_ENDIAN
+ uint64_t reserved_17_63 : 47;
+ uint64_t tad0 : 1; /**< When set, the enabled interrupt is in either
+ the L2C_ERR_TDT0 or L2C_ERR_TTG0 CSR */
+ uint64_t reserved_8_15 : 8;
+ uint64_t bigrd : 1; /**< Read reference past L2C_BIG_CTL[MAXDRAM] occurred */
+ uint64_t bigwr : 1; /**< Write reference past L2C_BIG_CTL[MAXDRAM] occurred */
+ uint64_t vrtpe : 1; /**< L2C_VRT_MEM read found a parity error
+ Whenever an L2C_VRT_MEM read finds a parity error,
+ that L2C_VRT_MEM cannot cause stores to be blocked.
+ Software should correct the error. */
+ uint64_t vrtadrng : 1; /**< Address outside of virtualization range
+ Set when a L2C_VRT_CTL[MEMSZ] violation blocked a
+ store.
+ L2C_VRT_CTL[OOBERR] must be set for L2C to set this. */
+ uint64_t vrtidrng : 1; /**< Virtualization ID out of range
+ Set when a L2C_VRT_CTL[NUMID] violation blocked a
+ store. */
+ uint64_t vrtwr : 1; /**< Virtualization ID prevented a write
+ Set when L2C_VRT_MEM blocked a store. */
+ uint64_t holewr : 1; /**< Write reference to 256MB hole occurred */
+ uint64_t holerd : 1; /**< Read reference to 256MB hole occurred */
+#else
+ uint64_t holerd : 1;
+ uint64_t holewr : 1;
+ uint64_t vrtwr : 1;
+ uint64_t vrtidrng : 1;
+ uint64_t vrtadrng : 1;
+ uint64_t vrtpe : 1;
+ uint64_t bigwr : 1;
+ uint64_t bigrd : 1;
+ uint64_t reserved_8_15 : 8;
+ uint64_t tad0 : 1;
+ uint64_t reserved_17_63 : 47;
+#endif
+ } s;
+ struct cvmx_l2c_int_reg_s cn63xx;
+ struct cvmx_l2c_int_reg_cn63xxp1
+ {
+#if __BYTE_ORDER == __BIG_ENDIAN
+ uint64_t reserved_17_63 : 47;
+ uint64_t tad0 : 1; /**< When set, the enabled interrupt is in either
+ the L2C_ERR_TDT0 or L2C_ERR_TTG0 CSR */
+ uint64_t reserved_6_15 : 10;
+ uint64_t vrtpe : 1; /**< L2C_VRT_MEM read found a parity error
+ Whenever an L2C_VRT_MEM read finds a parity error,
+ that L2C_VRT_MEM cannot cause stores to be blocked.
+ Software should correct the error. */
+ uint64_t vrtadrng : 1; /**< Address outside of virtualization range
+ Set when a L2C_VRT_CTL[MEMSZ] violation blocked a
+ store.
+ L2C_VRT_CTL[OOBERR] must be set for L2C to set this. */
+ uint64_t vrtidrng : 1; /**< Virtualization ID out of range
+ Set when a L2C_VRT_CTL[NUMID] violation blocked a
+ store. */
+ uint64_t vrtwr : 1; /**< Virtualization ID prevented a write
+ Set when L2C_VRT_MEM blocked a store. */
+ uint64_t holewr : 1; /**< Write reference to 256MB hole occurred */
+ uint64_t holerd : 1; /**< Read reference to 256MB hole occurred */
+#else
+ uint64_t holerd : 1;
+ uint64_t holewr : 1;
+ uint64_t vrtwr : 1;
+ uint64_t vrtidrng : 1;
+ uint64_t vrtadrng : 1;
+ uint64_t vrtpe : 1;
+ uint64_t reserved_6_15 : 10;
+ uint64_t tad0 : 1;
+ uint64_t reserved_17_63 : 47;
+#endif
+ } cn63xxp1;
+};
+typedef union cvmx_l2c_int_reg cvmx_l2c_int_reg_t;
+
+/**
+ * cvmx_l2c_int_stat
+ *
+ * L2C_INT_STAT = L2C Global Interrupt Status Register
+ *
+ * Description:
+ */
+union cvmx_l2c_int_stat
+{
+ uint64_t u64;
+ struct cvmx_l2c_int_stat_s
+ {
+#if __BYTE_ORDER == __BIG_ENDIAN
+ uint64_t reserved_9_63 : 55;
+ uint64_t lck2 : 1; /**< HW detected a case where a Rd/Wr Miss from PP#n
+ could not find an available/unlocked set (for
+ replacement).
+ Most likely, this is a result of SW mixing SET
+ PARTITIONING with ADDRESS LOCKING. If SW allows
+ another PP to LOCKDOWN all SETs available to PP#n,
+ then a Rd/Wr Miss from PP#n will be unable
+ to determine a 'valid' replacement set (since LOCKED
+ addresses should NEVER be replaced).
+ If such an event occurs, the HW will select the smallest
+ available SET(specified by UMSK'x)' as the replacement
+ set, and the address is unlocked.
+ NOTE: This is the 'same' bit as L2T_ERR[LCKERR2] */
+ uint64_t lck : 1; /**< SW attempted to LOCK DOWN the last available set of
+ the INDEX (which is ignored by HW - but reported to SW).
+ The LDD(L1 load-miss) for the LOCK operation is completed
+ successfully, however the address is NOT locked.
+ NOTE: 'Available' sets takes the L2C_SPAR*[UMSK*]
+ into account. For example, if diagnostic PPx has
+ UMSKx defined to only use SETs [1:0], and SET1 had
+ been previously LOCKED, then an attempt to LOCK the
+ last available SET0 would result in a LCKERR. (This
+ is to ensure that at least 1 SET at each INDEX is
+ not LOCKED for general use by other PPs).
+ NOTE: This is the 'same' bit as L2T_ERR[LCKERR] */
+ uint64_t l2dded : 1; /**< L2D Double Error detected (DED)
+ NOTE: This is the 'same' bit as L2D_ERR[DED_ERR] */
+ uint64_t l2dsec : 1; /**< L2D Single Error corrected (SEC)
+ NOTE: This is the 'same' bit as L2D_ERR[SEC_ERR] */
+ uint64_t l2tded : 1; /**< L2T Double Bit Error detected (DED)
+ During every L2 Tag Probe, all 8 sets Tag's (at a
+ given index) are checked for double bit errors(DBEs).
+ This bit is set if ANY of the 8 sets contains a DBE.
+ DBEs also generated an interrupt(if enabled).
+ NOTE: This is the 'same' bit as L2T_ERR[DED_ERR] */
+ uint64_t l2tsec : 1; /**< L2T Single Bit Error corrected (SEC) status
+ During every L2 Tag Probe, all 8 sets Tag's (at a
+ given index) are checked for single bit errors(SBEs).
+ This bit is set if ANY of the 8 sets contains an SBE.
+ SBEs are auto corrected in HW and generate an
+ interrupt(if enabled).
+ NOTE: This is the 'same' bit as L2T_ERR[SEC_ERR] */
+ uint64_t oob3 : 1; /**< DMA Out of Bounds Interrupt Status Range#3 */
+ uint64_t oob2 : 1; /**< DMA Out of Bounds Interrupt Status Range#2 */
+ uint64_t oob1 : 1; /**< DMA Out of Bounds Interrupt Status Range#1 */
+#else
+ uint64_t oob1 : 1;
+ uint64_t oob2 : 1;
+ uint64_t oob3 : 1;
+ uint64_t l2tsec : 1;
+ uint64_t l2tded : 1;
+ uint64_t l2dsec : 1;
+ uint64_t l2dded : 1;
+ uint64_t lck : 1;
+ uint64_t lck2 : 1;
+ uint64_t reserved_9_63 : 55;
+#endif
+ } s;
+ struct cvmx_l2c_int_stat_s cn52xx;
+ struct cvmx_l2c_int_stat_s cn52xxp1;
+ struct cvmx_l2c_int_stat_s cn56xx;
+ struct cvmx_l2c_int_stat_s cn56xxp1;
+};
+typedef union cvmx_l2c_int_stat cvmx_l2c_int_stat_t;
+
+/**
+ * cvmx_l2c_ioc#_pfc
+ *
+ * L2C_IOC_PFC = L2C IOC Performance Counter(s)
+ *
+ */
+union cvmx_l2c_iocx_pfc
+{
+ uint64_t u64;
+ struct cvmx_l2c_iocx_pfc_s
+ {
+#if __BYTE_ORDER == __BIG_ENDIAN
+ uint64_t count : 64; /**< Current counter value */
+#else
+ uint64_t count : 64;
+#endif
+ } s;
+ struct cvmx_l2c_iocx_pfc_s cn63xx;
+ struct cvmx_l2c_iocx_pfc_s cn63xxp1;
+};
+typedef union cvmx_l2c_iocx_pfc cvmx_l2c_iocx_pfc_t;
+
+/**
+ * cvmx_l2c_ior#_pfc
+ *
+ * L2C_IOR_PFC = L2C IOR Performance Counter(s)
+ *
+ */
+union cvmx_l2c_iorx_pfc
+{
+ uint64_t u64;
+ struct cvmx_l2c_iorx_pfc_s
+ {
+#if __BYTE_ORDER == __BIG_ENDIAN
+ uint64_t count : 64; /**< Current counter value */
+#else
+ uint64_t count : 64;
+#endif
+ } s;
+ struct cvmx_l2c_iorx_pfc_s cn63xx;
+ struct cvmx_l2c_iorx_pfc_s cn63xxp1;
+};
+typedef union cvmx_l2c_iorx_pfc cvmx_l2c_iorx_pfc_t;
+
+/**
+ * cvmx_l2c_lckbase
+ *
+ * L2C_LCKBASE = L2C LockDown Base Register
+ *
+ * Description: L2C LockDown Base Register
+ *
+ * Notes:
+ * (1) SW RESTRICTION \#1: SW must manage the L2 Data Store lockdown space such that at least 1
+ * set per cache line remains in the 'unlocked' (normal) state to allow general caching operations.
+ * If SW violates this restriction, a status bit is set (LCK_ERR) and an interrupt is posted.
+ * [this limits the total lockdown space to 7/8ths of the total L2 data store = 896KB]
+ * (2) IOB initiated LDI commands are ignored (only PP initiated LDI/LDD commands are considered
+ * for lockdown).
+ * (3) To 'unlock' a locked cache line, SW can use the FLUSH-INVAL CSR mechanism (see L2C_DBG[FINV]).
+ * (4) LCK_ENA MUST only be activated when debug modes are disabled (L2C_DBG[L2T], L2C_DBG[L2D], L2C_DBG[FINV]).
+ */
+union cvmx_l2c_lckbase
+{
+ uint64_t u64;
+ struct cvmx_l2c_lckbase_s
+ {
+#if __BYTE_ORDER == __BIG_ENDIAN
+ uint64_t reserved_31_63 : 33;
+ uint64_t lck_base : 27; /**< Base Memory block address[33:7]. Specifies the
+ starting address of the lockdown region. */
+ uint64_t reserved_1_3 : 3;
+ uint64_t lck_ena : 1; /**< L2 Cache Lock Enable
+ When the LCK_ENA=1, all LDI(I-stream Load) or
+ LDD(L1 load-miss) commands issued from the
+ diagnostic PP (specified by the L2C_DBG[PPNUM]),
+ which fall within a predefined lockdown address
+ range (specified by: [lck_base:lck_base+lck_offset])
+ are LOCKED in the L2 cache. The LOCKED state is
+ denoted using an explicit L2 Tag bit (L=1).
+ If the LOCK request L2-Hits (on ANY SET), then data is
+ returned from the L2 and the hit set is updated to the
+ LOCKED state. NOTE: If the Hit Set# is outside the
+ available sets for a given PP (see UMSK'x'), the
+ the LOCK bit is still SET. If the programmer's intent
+ is to explicitly LOCK addresses into 'available' sets,
+ care must be taken to flush-invalidate the cache first
+ (to avoid such situations). Not following this procedure
+ can lead to LCKERR2 interrupts.
+ If the LOCK request L2-Misses, a replacment set is
+ chosen(from the available sets (UMSK'x').
+ If the replacement set contains a dirty-victim it is
+ written back to memory. Memory read data is then written
+ into the replacement set, and the replacment SET is
+ updated to the LOCKED state(L=1).
+ NOTE: SETs that contain LOCKED addresses are
+ excluded from the replacement set selection algorithm.
+ NOTE: The LDD command will allocate the DuTag as normal.
+ NOTE: If L2C_CFG[IDXALIAS]=1, the address is 'aliased' first
+ before being checked against the lockdown address
+ range. To ensure an 'aliased' address is properly locked,
+ it is recommmended that SW preload the 'aliased' locked adddress
+ into the L2C_LCKBASE[LCK_BASE] register (while keeping
+ L2C_LCKOFF[LCK_OFFSET]=0).
+ NOTE: The OCTEON(N3) implementation only supports 16GB(MAX) of
+ physical memory. Therefore, only byte address[33:0] are used
+ (ie: address[35:34] are ignored). */
+#else
+ uint64_t lck_ena : 1;
+ uint64_t reserved_1_3 : 3;
+ uint64_t lck_base : 27;
+ uint64_t reserved_31_63 : 33;
+#endif
+ } s;
+ struct cvmx_l2c_lckbase_s cn30xx;
+ struct cvmx_l2c_lckbase_s cn31xx;
+ struct cvmx_l2c_lckbase_s cn38xx;
+ struct cvmx_l2c_lckbase_s cn38xxp2;
+ struct cvmx_l2c_lckbase_s cn50xx;
+ struct cvmx_l2c_lckbase_s cn52xx;
+ struct cvmx_l2c_lckbase_s cn52xxp1;
+ struct cvmx_l2c_lckbase_s cn56xx;
+ struct cvmx_l2c_lckbase_s cn56xxp1;
+ struct cvmx_l2c_lckbase_s cn58xx;
+ struct cvmx_l2c_lckbase_s cn58xxp1;
+};
+typedef union cvmx_l2c_lckbase cvmx_l2c_lckbase_t;
+
+/**
+ * cvmx_l2c_lckoff
+ *
+ * L2C_LCKOFF = L2C LockDown OFFSET Register
+ *
+ * Description: L2C LockDown OFFSET Register
+ *
+ * Notes:
+ * (1) The generation of the end lockdown block address will 'wrap'.
+ * (2) The minimum granularity for lockdown is 1 cache line (= 128B block)
+ */
+union cvmx_l2c_lckoff
+{
+ uint64_t u64;
+ struct cvmx_l2c_lckoff_s
+ {
+#if __BYTE_ORDER == __BIG_ENDIAN
+ uint64_t reserved_10_63 : 54;
+ uint64_t lck_offset : 10; /**< LockDown block Offset. Used in determining
+ the ending block address of the lockdown
+ region:
+ End Lockdown block Address[33:7] =
+ LCK_BASE[33:7]+LCK_OFFSET[9:0] */
+#else
+ uint64_t lck_offset : 10;
+ uint64_t reserved_10_63 : 54;
+#endif
+ } s;
+ struct cvmx_l2c_lckoff_s cn30xx;
+ struct cvmx_l2c_lckoff_s cn31xx;
+ struct cvmx_l2c_lckoff_s cn38xx;
+ struct cvmx_l2c_lckoff_s cn38xxp2;
+ struct cvmx_l2c_lckoff_s cn50xx;
+ struct cvmx_l2c_lckoff_s cn52xx;
+ struct cvmx_l2c_lckoff_s cn52xxp1;
+ struct cvmx_l2c_lckoff_s cn56xx;
+ struct cvmx_l2c_lckoff_s cn56xxp1;
+ struct cvmx_l2c_lckoff_s cn58xx;
+ struct cvmx_l2c_lckoff_s cn58xxp1;
+};
+typedef union cvmx_l2c_lckoff cvmx_l2c_lckoff_t;
+
+/**
+ * cvmx_l2c_lfb0
+ *
+ * L2C_LFB0 = L2C LFB DEBUG 0 Register
+ *
+ * Description: L2C LFB Contents (Status Bits)
+ */
+union cvmx_l2c_lfb0
+{
+ uint64_t u64;
+ struct cvmx_l2c_lfb0_s
+ {
+#if __BYTE_ORDER == __BIG_ENDIAN
+ uint64_t reserved_32_63 : 32;
+ uint64_t stcpnd : 1; /**< LFB STC Pending Status */
+ uint64_t stpnd : 1; /**< LFB ST* Pending Status */
+ uint64_t stinv : 1; /**< LFB ST* Invalidate Status */
+ uint64_t stcfl : 1; /**< LFB STC=FAIL Status */
+ uint64_t vam : 1; /**< Valid Full Address Match Status */
+ uint64_t inxt : 4; /**< Next LFB Pointer(invalid if ITL=1) */
+ uint64_t itl : 1; /**< LFB Tail of List Indicator */
+ uint64_t ihd : 1; /**< LFB Head of List Indicator */
+ uint64_t set : 3; /**< SET# used for DS-OP (hit=hset/miss=rset) */
+ uint64_t vabnum : 4; /**< VAB# used for LMC Miss Launch(valid only if VAM=1) */
+ uint64_t sid : 9; /**< LFB Source ID */
+ uint64_t cmd : 4; /**< LFB Command */
+ uint64_t vld : 1; /**< LFB Valid */
+#else
+ uint64_t vld : 1;
+ uint64_t cmd : 4;
+ uint64_t sid : 9;
+ uint64_t vabnum : 4;
+ uint64_t set : 3;
+ uint64_t ihd : 1;
+ uint64_t itl : 1;
+ uint64_t inxt : 4;
+ uint64_t vam : 1;
+ uint64_t stcfl : 1;
+ uint64_t stinv : 1;
+ uint64_t stpnd : 1;
+ uint64_t stcpnd : 1;
+ uint64_t reserved_32_63 : 32;
+#endif
+ } s;
+ struct cvmx_l2c_lfb0_cn30xx
+ {
+#if __BYTE_ORDER == __BIG_ENDIAN
+ uint64_t reserved_32_63 : 32;
+ uint64_t stcpnd : 1; /**< LFB STC Pending Status */
+ uint64_t stpnd : 1; /**< LFB ST* Pending Status */
+ uint64_t stinv : 1; /**< LFB ST* Invalidate Status */
+ uint64_t stcfl : 1; /**< LFB STC=FAIL Status */
+ uint64_t vam : 1; /**< Valid Full Address Match Status */
+ uint64_t reserved_25_26 : 2;
+ uint64_t inxt : 2; /**< Next LFB Pointer(invalid if ITL=1) */
+ uint64_t itl : 1; /**< LFB Tail of List Indicator */
+ uint64_t ihd : 1; /**< LFB Head of List Indicator */
+ uint64_t reserved_20_20 : 1;
+ uint64_t set : 2; /**< SET# used for DS-OP (hit=hset/miss=rset) */
+ uint64_t reserved_16_17 : 2;
+ uint64_t vabnum : 2; /**< VAB# used for LMC Miss Launch(valid only if VAM=1) */
+ uint64_t sid : 9; /**< LFB Source ID */
+ uint64_t cmd : 4; /**< LFB Command */
+ uint64_t vld : 1; /**< LFB Valid */
+#else
+ uint64_t vld : 1;
+ uint64_t cmd : 4;
+ uint64_t sid : 9;
+ uint64_t vabnum : 2;
+ uint64_t reserved_16_17 : 2;
+ uint64_t set : 2;
+ uint64_t reserved_20_20 : 1;
+ uint64_t ihd : 1;
+ uint64_t itl : 1;
+ uint64_t inxt : 2;
+ uint64_t reserved_25_26 : 2;
+ uint64_t vam : 1;
+ uint64_t stcfl : 1;
+ uint64_t stinv : 1;
+ uint64_t stpnd : 1;
+ uint64_t stcpnd : 1;
+ uint64_t reserved_32_63 : 32;
+#endif
+ } cn30xx;
+ struct cvmx_l2c_lfb0_cn31xx
+ {
+#if __BYTE_ORDER == __BIG_ENDIAN
+ uint64_t reserved_32_63 : 32;
+ uint64_t stcpnd : 1; /**< LFB STC Pending Status */
+ uint64_t stpnd : 1; /**< LFB ST* Pending Status */
+ uint64_t stinv : 1; /**< LFB ST* Invalidate Status */
+ uint64_t stcfl : 1; /**< LFB STC=FAIL Status */
+ uint64_t vam : 1; /**< Valid Full Address Match Status */
+ uint64_t reserved_26_26 : 1;
+ uint64_t inxt : 3; /**< Next LFB Pointer(invalid if ITL=1) */
+ uint64_t itl : 1; /**< LFB Tail of List Indicator */
+ uint64_t ihd : 1; /**< LFB Head of List Indicator */
+ uint64_t reserved_20_20 : 1;
+ uint64_t set : 2; /**< SET# used for DS-OP (hit=hset/miss=rset) */
+ uint64_t reserved_17_17 : 1;
+ uint64_t vabnum : 3; /**< VAB# used for LMC Miss Launch(valid only if VAM=1) */
+ uint64_t sid : 9; /**< LFB Source ID */
+ uint64_t cmd : 4; /**< LFB Command */
+ uint64_t vld : 1; /**< LFB Valid */
+#else
+ uint64_t vld : 1;
+ uint64_t cmd : 4;
+ uint64_t sid : 9;
+ uint64_t vabnum : 3;
+ uint64_t reserved_17_17 : 1;
+ uint64_t set : 2;
+ uint64_t reserved_20_20 : 1;
+ uint64_t ihd : 1;
+ uint64_t itl : 1;
+ uint64_t inxt : 3;
+ uint64_t reserved_26_26 : 1;
+ uint64_t vam : 1;
+ uint64_t stcfl : 1;
+ uint64_t stinv : 1;
+ uint64_t stpnd : 1;
+ uint64_t stcpnd : 1;
+ uint64_t reserved_32_63 : 32;
+#endif
+ } cn31xx;
+ struct cvmx_l2c_lfb0_s cn38xx;
+ struct cvmx_l2c_lfb0_s cn38xxp2;
+ struct cvmx_l2c_lfb0_cn50xx
+ {
+#if __BYTE_ORDER == __BIG_ENDIAN
+ uint64_t reserved_32_63 : 32;
+ uint64_t stcpnd : 1; /**< LFB STC Pending Status */
+ uint64_t stpnd : 1; /**< LFB ST* Pending Status */
+ uint64_t stinv : 1; /**< LFB ST* Invalidate Status */
+ uint64_t stcfl : 1; /**< LFB STC=FAIL Status */
+ uint64_t vam : 1; /**< Valid Full Address Match Status */
+ uint64_t reserved_26_26 : 1;
+ uint64_t inxt : 3; /**< Next LFB Pointer(invalid if ITL=1) */
+ uint64_t itl : 1; /**< LFB Tail of List Indicator */
+ uint64_t ihd : 1; /**< LFB Head of List Indicator */
+ uint64_t set : 3; /**< SET# used for DS-OP (hit=hset/miss=rset) */
+ uint64_t reserved_17_17 : 1;
+ uint64_t vabnum : 3; /**< VAB# used for LMC Miss Launch(valid only if VAM=1) */
+ uint64_t sid : 9; /**< LFB Source ID */
+ uint64_t cmd : 4; /**< LFB Command */
+ uint64_t vld : 1; /**< LFB Valid */
+#else
+ uint64_t vld : 1;
+ uint64_t cmd : 4;
+ uint64_t sid : 9;
+ uint64_t vabnum : 3;
+ uint64_t reserved_17_17 : 1;
+ uint64_t set : 3;
+ uint64_t ihd : 1;
+ uint64_t itl : 1;
+ uint64_t inxt : 3;
+ uint64_t reserved_26_26 : 1;
+ uint64_t vam : 1;
+ uint64_t stcfl : 1;
+ uint64_t stinv : 1;
+ uint64_t stpnd : 1;
+ uint64_t stcpnd : 1;
+ uint64_t reserved_32_63 : 32;
+#endif
+ } cn50xx;
+ struct cvmx_l2c_lfb0_cn50xx cn52xx;
+ struct cvmx_l2c_lfb0_cn50xx cn52xxp1;
+ struct cvmx_l2c_lfb0_s cn56xx;
+ struct cvmx_l2c_lfb0_s cn56xxp1;
+ struct cvmx_l2c_lfb0_s cn58xx;
+ struct cvmx_l2c_lfb0_s cn58xxp1;
+};
+typedef union cvmx_l2c_lfb0 cvmx_l2c_lfb0_t;
+
+/**
+ * cvmx_l2c_lfb1
+ *
+ * L2C_LFB1 = L2C LFB DEBUG 1 Register
+ *
+ * Description: L2C LFB Contents (Wait Bits)
+ */
+union cvmx_l2c_lfb1
+{
+ uint64_t u64;
+ struct cvmx_l2c_lfb1_s
+ {
+#if __BYTE_ORDER == __BIG_ENDIAN
+ uint64_t reserved_19_63 : 45;
+ uint64_t dsgoing : 1; /**< LFB DS Going (in flight) */
+ uint64_t bid : 2; /**< LFB DS Bid# */
+ uint64_t wtrsp : 1; /**< LFB Waiting for RSC Response [FILL,STRSP] completion */
+ uint64_t wtdw : 1; /**< LFB Waiting for DS-WR completion */
+ uint64_t wtdq : 1; /**< LFB Waiting for LFB-DQ */
+ uint64_t wtwhp : 1; /**< LFB Waiting for Write-Hit Partial L2 DS-WR completion */
+ uint64_t wtwhf : 1; /**< LFB Waiting for Write-Hit Full L2 DS-WR completion */
+ uint64_t wtwrm : 1; /**< LFB Waiting for Write-Miss L2 DS-WR completion */
+ uint64_t wtstm : 1; /**< LFB Waiting for Write-Miss L2 DS-WR completion */
+ uint64_t wtrda : 1; /**< LFB Waiting for Read-Miss L2 DS-WR completion */
+ uint64_t wtstdt : 1; /**< LFB Waiting for all ST write Data to arrive on XMD bus */
+ uint64_t wtstrsp : 1; /**< LFB Waiting for ST RSC/RSD to be issued on RSP
+ (with invalidates) */
+ uint64_t wtstrsc : 1; /**< LFB Waiting for ST RSC-Only to be issued on RSP
+ (no-invalidates) */
+ uint64_t wtvtm : 1; /**< LFB Waiting for Victim Read L2 DS-RD completion */
+ uint64_t wtmfl : 1; /**< LFB Waiting for Memory Fill completion to MRB */
+ uint64_t prbrty : 1; /**< Probe-Retry Detected - waiting for probe completion */
+ uint64_t wtprb : 1; /**< LFB Waiting for Probe */
+ uint64_t vld : 1; /**< LFB Valid */
+#else
+ uint64_t vld : 1;
+ uint64_t wtprb : 1;
+ uint64_t prbrty : 1;
+ uint64_t wtmfl : 1;
+ uint64_t wtvtm : 1;
+ uint64_t wtstrsc : 1;
+ uint64_t wtstrsp : 1;
+ uint64_t wtstdt : 1;
+ uint64_t wtrda : 1;
+ uint64_t wtstm : 1;
+ uint64_t wtwrm : 1;
+ uint64_t wtwhf : 1;
+ uint64_t wtwhp : 1;
+ uint64_t wtdq : 1;
+ uint64_t wtdw : 1;
+ uint64_t wtrsp : 1;
+ uint64_t bid : 2;
+ uint64_t dsgoing : 1;
+ uint64_t reserved_19_63 : 45;
+#endif
+ } s;
+ struct cvmx_l2c_lfb1_s cn30xx;
+ struct cvmx_l2c_lfb1_s cn31xx;
+ struct cvmx_l2c_lfb1_s cn38xx;
+ struct cvmx_l2c_lfb1_s cn38xxp2;
+ struct cvmx_l2c_lfb1_s cn50xx;
+ struct cvmx_l2c_lfb1_s cn52xx;
+ struct cvmx_l2c_lfb1_s cn52xxp1;
+ struct cvmx_l2c_lfb1_s cn56xx;
+ struct cvmx_l2c_lfb1_s cn56xxp1;
+ struct cvmx_l2c_lfb1_s cn58xx;
+ struct cvmx_l2c_lfb1_s cn58xxp1;
+};
+typedef union cvmx_l2c_lfb1 cvmx_l2c_lfb1_t;
+
+/**
+ * cvmx_l2c_lfb2
+ *
+ * L2C_LFB2 = L2C LFB DEBUG 2 Register
+ *
+ * Description: L2C LFB Contents Tag/Index
+ */
+union cvmx_l2c_lfb2
+{
+ uint64_t u64;
+ struct cvmx_l2c_lfb2_s
+ {
+#if __BYTE_ORDER == __BIG_ENDIAN
+ uint64_t reserved_0_63 : 64;
+#else
+ uint64_t reserved_0_63 : 64;
+#endif
+ } s;
+ struct cvmx_l2c_lfb2_cn30xx
+ {
+#if __BYTE_ORDER == __BIG_ENDIAN
+ uint64_t reserved_27_63 : 37;
+ uint64_t lfb_tag : 19; /**< LFB TAG[33:15] */
+ uint64_t lfb_idx : 8; /**< LFB IDX[14:7] */
+#else
+ uint64_t lfb_idx : 8;
+ uint64_t lfb_tag : 19;
+ uint64_t reserved_27_63 : 37;
+#endif
+ } cn30xx;
+ struct cvmx_l2c_lfb2_cn31xx
+ {
+#if __BYTE_ORDER == __BIG_ENDIAN
+ uint64_t reserved_27_63 : 37;
+ uint64_t lfb_tag : 17; /**< LFB TAG[33:16] */
+ uint64_t lfb_idx : 10; /**< LFB IDX[15:7] */
+#else
+ uint64_t lfb_idx : 10;
+ uint64_t lfb_tag : 17;
+ uint64_t reserved_27_63 : 37;
+#endif
+ } cn31xx;
+ struct cvmx_l2c_lfb2_cn31xx cn38xx;
+ struct cvmx_l2c_lfb2_cn31xx cn38xxp2;
+ struct cvmx_l2c_lfb2_cn50xx
+ {
+#if __BYTE_ORDER == __BIG_ENDIAN
+ uint64_t reserved_27_63 : 37;
+ uint64_t lfb_tag : 20; /**< LFB TAG[33:14] */
+ uint64_t lfb_idx : 7; /**< LFB IDX[13:7] */
+#else
+ uint64_t lfb_idx : 7;
+ uint64_t lfb_tag : 20;
+ uint64_t reserved_27_63 : 37;
+#endif
+ } cn50xx;
+ struct cvmx_l2c_lfb2_cn52xx
+ {
+#if __BYTE_ORDER == __BIG_ENDIAN
+ uint64_t reserved_27_63 : 37;
+ uint64_t lfb_tag : 18; /**< LFB TAG[33:16] */
+ uint64_t lfb_idx : 9; /**< LFB IDX[15:7] */
+#else
+ uint64_t lfb_idx : 9;
+ uint64_t lfb_tag : 18;
+ uint64_t reserved_27_63 : 37;
+#endif
+ } cn52xx;
+ struct cvmx_l2c_lfb2_cn52xx cn52xxp1;
+ struct cvmx_l2c_lfb2_cn56xx
+ {
+#if __BYTE_ORDER == __BIG_ENDIAN
+ uint64_t reserved_27_63 : 37;
+ uint64_t lfb_tag : 16; /**< LFB TAG[33:18] */
+ uint64_t lfb_idx : 11; /**< LFB IDX[17:7] */
+#else
+ uint64_t lfb_idx : 11;
+ uint64_t lfb_tag : 16;
+ uint64_t reserved_27_63 : 37;
+#endif
+ } cn56xx;
+ struct cvmx_l2c_lfb2_cn56xx cn56xxp1;
+ struct cvmx_l2c_lfb2_cn56xx cn58xx;
+ struct cvmx_l2c_lfb2_cn56xx cn58xxp1;
+};
+typedef union cvmx_l2c_lfb2 cvmx_l2c_lfb2_t;
+
+/**
+ * cvmx_l2c_lfb3
+ *
+ * L2C_LFB3 = L2C LFB DEBUG 3 Register
+ *
+ * Description: LFB High Water Mark Register
+ */
+union cvmx_l2c_lfb3
+{
+ uint64_t u64;
+ struct cvmx_l2c_lfb3_s
+ {
+#if __BYTE_ORDER == __BIG_ENDIAN
+ uint64_t reserved_5_63 : 59;
+ uint64_t stpartdis : 1; /**< STP/C Performance Enhancement Disable
+ When clear, all STP/C(store partials) will take 2 cycles
+ to complete (power-on default).
+ When set, all STP/C(store partials) will take 4 cycles
+ to complete.
+ NOTE: It is recommended to keep this bit ALWAYS ZERO. */
+ uint64_t lfb_hwm : 4; /**< LFB High Water Mark
+ Determines \#of LFB Entries in use before backpressure
+ is asserted.
+ HWM=0: 1 LFB Entry available
+ - ...
+ HWM=15: 16 LFB Entries available */
+#else
+ uint64_t lfb_hwm : 4;
+ uint64_t stpartdis : 1;
+ uint64_t reserved_5_63 : 59;
+#endif
+ } s;
+ struct cvmx_l2c_lfb3_cn30xx
+ {
+#if __BYTE_ORDER == __BIG_ENDIAN
+ uint64_t reserved_5_63 : 59;
+ uint64_t stpartdis : 1; /**< STP/C Performance Enhancement Disable
+ When clear, all STP/C(store partials) will take 2 cycles
+ to complete (power-on default).
+ When set, all STP/C(store partials) will take 4 cycles
+ to complete.
+ NOTE: It is recommended to keep this bit ALWAYS ZERO. */
+ uint64_t reserved_2_3 : 2;
+ uint64_t lfb_hwm : 2; /**< LFB High Water Mark
+ Determines \#of LFB Entries in use before backpressure
+ is asserted.
+ HWM=0: 1 LFB Entry available
+ - ...
+ HWM=3: 4 LFB Entries available */
+#else
+ uint64_t lfb_hwm : 2;
+ uint64_t reserved_2_3 : 2;
+ uint64_t stpartdis : 1;
+ uint64_t reserved_5_63 : 59;
+#endif
+ } cn30xx;
+ struct cvmx_l2c_lfb3_cn31xx
+ {
+#if __BYTE_ORDER == __BIG_ENDIAN
+ uint64_t reserved_5_63 : 59;
+ uint64_t stpartdis : 1; /**< STP/C Performance Enhancement Disable
+ When clear, all STP/C(store partials) will take 2 cycles
+ to complete (power-on default).
+ When set, all STP/C(store partials) will take 4 cycles
+ to complete.
+ NOTE: It is recommended to keep this bit ALWAYS ZERO. */
+ uint64_t reserved_3_3 : 1;
+ uint64_t lfb_hwm : 3; /**< LFB High Water Mark
+ Determines \#of LFB Entries in use before backpressure
+ is asserted.
+ HWM=0: 1 LFB Entry available
+ - ...
+ HWM=7: 8 LFB Entries available */
+#else
+ uint64_t lfb_hwm : 3;
+ uint64_t reserved_3_3 : 1;
+ uint64_t stpartdis : 1;
+ uint64_t reserved_5_63 : 59;
+#endif
+ } cn31xx;
+ struct cvmx_l2c_lfb3_s cn38xx;
+ struct cvmx_l2c_lfb3_s cn38xxp2;
+ struct cvmx_l2c_lfb3_cn31xx cn50xx;
+ struct cvmx_l2c_lfb3_cn31xx cn52xx;
+ struct cvmx_l2c_lfb3_cn31xx cn52xxp1;
+ struct cvmx_l2c_lfb3_s cn56xx;
+ struct cvmx_l2c_lfb3_s cn56xxp1;
+ struct cvmx_l2c_lfb3_s cn58xx;
+ struct cvmx_l2c_lfb3_s cn58xxp1;
+};
+typedef union cvmx_l2c_lfb3 cvmx_l2c_lfb3_t;
+
+/**
+ * cvmx_l2c_oob
+ *
+ * L2C_OOB = L2C Out of Bounds Global Enables
+ *
+ * Description: Defines DMA "Out of Bounds" global enables.
+ */
+union cvmx_l2c_oob
+{
+ uint64_t u64;
+ struct cvmx_l2c_oob_s
+ {
+#if __BYTE_ORDER == __BIG_ENDIAN
+ uint64_t reserved_2_63 : 62;
+ uint64_t dwbena : 1; /**< DMA Out of Bounds Range Checker for DMA DWB
+ commands (Don't WriteBack).
+ When enabled, any DMA DWB commands which hit 1-of-3
+ out of bounds regions will be logged into
+ L2C_INT_STAT[OOB*] CSRs and the DMA store WILL
+ NOT occur. If the corresponding L2C_INT_EN[OOB*]
+ is enabled, an interrupt will also be reported. */
+ uint64_t stena : 1; /**< DMA Out of Bounds Range Checker for DMA store
+ commands (STF/P/T).
+ When enabled, any DMA store commands (STF/P/T) which
+ hit 1-of-3 out of bounds regions will be logged into
+ L2C_INT_STAT[OOB*] CSRs and the DMA store WILL
+ NOT occur. If the corresponding L2C_INT_EN[OOB*]
+ is enabled, an interrupt will also be reported. */
+#else
+ uint64_t stena : 1;
+ uint64_t dwbena : 1;
+ uint64_t reserved_2_63 : 62;
+#endif
+ } s;
+ struct cvmx_l2c_oob_s cn52xx;
+ struct cvmx_l2c_oob_s cn52xxp1;
+ struct cvmx_l2c_oob_s cn56xx;
+ struct cvmx_l2c_oob_s cn56xxp1;
+};
+typedef union cvmx_l2c_oob cvmx_l2c_oob_t;
+
+/**
+ * cvmx_l2c_oob1
+ *
+ * L2C_OOB1 = L2C Out of Bounds Range Checker
+ *
+ * Description: Defines DMA "Out of Bounds" region \#1. If a DMA initiated write transaction generates an address
+ * within the specified region, the write is 'ignored' and an interrupt is generated to alert software.
+ */
+union cvmx_l2c_oob1
+{
+ uint64_t u64;
+ struct cvmx_l2c_oob1_s
+ {
+#if __BYTE_ORDER == __BIG_ENDIAN
+ uint64_t fadr : 27; /**< DMA initated Memory Range Checker Failing Address
+ When L2C_INT_STAT[OOB1]=1, this field indicates the
+ DMA cacheline address.
+ (addr[33:7] = full cacheline address captured)
+ NOTE: FADR is locked down until L2C_INT_STAT[OOB1]
+ is cleared. */
+ uint64_t fsrc : 1; /**< DMA Out of Bounds Failing Source Command
+ When L2C_INT_STAT[OOB1]=1, this field indicates the
+ type of DMA command.
+ - 0: ST* (STF/P/T)
+ - 1: DWB (Don't WriteBack)
+ NOTE: FSRC is locked down until L2C_INT_STAT[OOB1]
+ is cleared. */
+ uint64_t reserved_34_35 : 2;
+ uint64_t sadr : 14; /**< DMA initated Memory Range Checker Starting Address
+ (1MB granularity) */
+ uint64_t reserved_14_19 : 6;
+ uint64_t size : 14; /**< DMA Out of Bounds Range Checker Size
+ (1MB granularity)
+ Example: 0: 0MB / 1: 1MB
+ The range check is for:
+ (SADR<<20) <= addr[33:0] < (((SADR+SIZE) & 0x3FFF)<<20)
+ SW NOTE: SADR+SIZE could be setup to potentially wrap
+ the 34bit ending bounds address. */
+#else
+ uint64_t size : 14;
+ uint64_t reserved_14_19 : 6;
+ uint64_t sadr : 14;
+ uint64_t reserved_34_35 : 2;
+ uint64_t fsrc : 1;
+ uint64_t fadr : 27;
+#endif
+ } s;
+ struct cvmx_l2c_oob1_s cn52xx;
+ struct cvmx_l2c_oob1_s cn52xxp1;
+ struct cvmx_l2c_oob1_s cn56xx;
+ struct cvmx_l2c_oob1_s cn56xxp1;
+};
+typedef union cvmx_l2c_oob1 cvmx_l2c_oob1_t;
+
+/**
+ * cvmx_l2c_oob2
+ *
+ * L2C_OOB2 = L2C Out of Bounds Range Checker
+ *
+ * Description: Defines DMA "Out of Bounds" region \#2. If a DMA initiated write transaction generates an address
+ * within the specified region, the write is 'ignored' and an interrupt is generated to alert software.
+ */
+union cvmx_l2c_oob2
+{
+ uint64_t u64;
+ struct cvmx_l2c_oob2_s
+ {
+#if __BYTE_ORDER == __BIG_ENDIAN
+ uint64_t fadr : 27; /**< DMA initated Memory Range Checker Failing Address
+ When L2C_INT_STAT[OOB2]=1, this field indicates the
+ DMA cacheline address.
+ (addr[33:7] = full cacheline address captured)
+ NOTE: FADR is locked down until L2C_INT_STAT[OOB2]
+ is cleared. */
+ uint64_t fsrc : 1; /**< DMA Out of Bounds Failing Source Command
+ When L2C_INT_STAT[OOB2]=1, this field indicates the
+ type of DMA command.
+ - 0: ST* (STF/P/T)
+ - 1: DWB (Don't WriteBack)
+ NOTE: FSRC is locked down until L2C_INT_STAT[OOB2]
+ is cleared. */
+ uint64_t reserved_34_35 : 2;
+ uint64_t sadr : 14; /**< DMA initated Memory Range Checker Starting Address
+ (1MB granularity) */
+ uint64_t reserved_14_19 : 6;
+ uint64_t size : 14; /**< DMA Out of Bounds Range Checker Size
+ (1MB granularity)
+ Example: 0: 0MB / 1: 1MB
+ The range check is for:
+ (SADR<<20) <= addr[33:0] < (((SADR+SIZE) & 0x3FFF)<<20)
+ SW NOTE: SADR+SIZE could be setup to potentially wrap
+ the 34bit ending bounds address. */
+#else
+ uint64_t size : 14;
+ uint64_t reserved_14_19 : 6;
+ uint64_t sadr : 14;
+ uint64_t reserved_34_35 : 2;
+ uint64_t fsrc : 1;
+ uint64_t fadr : 27;
+#endif
+ } s;
+ struct cvmx_l2c_oob2_s cn52xx;
+ struct cvmx_l2c_oob2_s cn52xxp1;
+ struct cvmx_l2c_oob2_s cn56xx;
+ struct cvmx_l2c_oob2_s cn56xxp1;
+};
+typedef union cvmx_l2c_oob2 cvmx_l2c_oob2_t;
+
+/**
+ * cvmx_l2c_oob3
+ *
+ * L2C_OOB3 = L2C Out of Bounds Range Checker
+ *
+ * Description: Defines DMA "Out of Bounds" region \#3. If a DMA initiated write transaction generates an address
+ * within the specified region, the write is 'ignored' and an interrupt is generated to alert software.
+ */
+union cvmx_l2c_oob3
+{
+ uint64_t u64;
+ struct cvmx_l2c_oob3_s
+ {
+#if __BYTE_ORDER == __BIG_ENDIAN
+ uint64_t fadr : 27; /**< DMA initated Memory Range Checker Failing Address
+ When L2C_INT_STAT[OOB3]=1, this field indicates the
+ DMA cacheline address.
+ (addr[33:7] = full cacheline address captured)
+ NOTE: FADR is locked down until L2C_INT_STAT[00B3]
+ is cleared. */
+ uint64_t fsrc : 1; /**< DMA Out of Bounds Failing Source Command
+ When L2C_INT_STAT[OOB3]=1, this field indicates the
+ type of DMA command.
+ - 0: ST* (STF/P/T)
+ - 1: DWB (Don't WriteBack)
+ NOTE: FSRC is locked down until L2C_INT_STAT[00B3]
+ is cleared. */
+ uint64_t reserved_34_35 : 2;
+ uint64_t sadr : 14; /**< DMA initated Memory Range Checker Starting Address
+ (1MB granularity) */
+ uint64_t reserved_14_19 : 6;
+ uint64_t size : 14; /**< DMA Out of Bounds Range Checker Size
+ (1MB granularity)
+ Example: 0: 0MB / 1: 1MB
+ The range check is for:
+ (SADR<<20) <= addr[33:0] < (((SADR+SIZE) & 0x3FFF)<<20)
+ SW NOTE: SADR+SIZE could be setup to potentially wrap
+ the 34bit ending bounds address. */
+#else
+ uint64_t size : 14;
+ uint64_t reserved_14_19 : 6;
+ uint64_t sadr : 14;
+ uint64_t reserved_34_35 : 2;
+ uint64_t fsrc : 1;
+ uint64_t fadr : 27;
+#endif
+ } s;
+ struct cvmx_l2c_oob3_s cn52xx;
+ struct cvmx_l2c_oob3_s cn52xxp1;
+ struct cvmx_l2c_oob3_s cn56xx;
+ struct cvmx_l2c_oob3_s cn56xxp1;
+};
+typedef union cvmx_l2c_oob3 cvmx_l2c_oob3_t;
+
+/**
+ * cvmx_l2c_pfc#
+ *
+ * L2C_PFC0 = L2 Performance Counter \#0
+ *
+ * Description:
+ */
+union cvmx_l2c_pfcx
+{
+ uint64_t u64;
+ struct cvmx_l2c_pfcx_s
+ {
+#if __BYTE_ORDER == __BIG_ENDIAN
+ uint64_t reserved_36_63 : 28;
+ uint64_t pfcnt0 : 36; /**< Performance Counter \#0 */
+#else
+ uint64_t pfcnt0 : 36;
+ uint64_t reserved_36_63 : 28;
+#endif
+ } s;
+ struct cvmx_l2c_pfcx_s cn30xx;
+ struct cvmx_l2c_pfcx_s cn31xx;
+ struct cvmx_l2c_pfcx_s cn38xx;
+ struct cvmx_l2c_pfcx_s cn38xxp2;
+ struct cvmx_l2c_pfcx_s cn50xx;
+ struct cvmx_l2c_pfcx_s cn52xx;
+ struct cvmx_l2c_pfcx_s cn52xxp1;
+ struct cvmx_l2c_pfcx_s cn56xx;
+ struct cvmx_l2c_pfcx_s cn56xxp1;
+ struct cvmx_l2c_pfcx_s cn58xx;
+ struct cvmx_l2c_pfcx_s cn58xxp1;
+};
+typedef union cvmx_l2c_pfcx cvmx_l2c_pfcx_t;
+
+/**
+ * cvmx_l2c_pfctl
+ *
+ * L2C_PFCTL = L2 Performance Counter Control Register
+ *
+ * Description: Controls the actions of the 4 Performance Counters
+ *
+ * Notes:
+ * - There are four 36b performance counter registers which can simultaneously count events.
+ * Each Counter's event is programmably selected via the corresponding CNTxSEL field:
+ * CNTxSEL[5:0] Event
+ * -----------------+-----------------------
+ * 0 | Cycles
+ * 1 | L2 LDI Command Miss (NOTE: Both PP and IOB are cabable of generating LDI)
+ * 2 | L2 LDI Command Hit (NOTE: Both PP and IOB are cabable of generating LDI)
+ * 3 | L2 non-LDI Command Miss
+ * 4 | L2 non-LDI Command Hit
+ * 5 | L2 Miss (total)
+ * 6 | L2 Hit (total)
+ * 7 | L2 Victim Buffer Hit (Retry Probe)
+ * 8 | LFB-NQ Index Conflict
+ * 9 | L2 Tag Probe (issued - could be VB-Retried)
+ * 10 | L2 Tag Update (completed - note: some CMD types do not update)
+ * 11 | L2 Tag Probe Completed (beyond VB-RTY window)
+ * 12 | L2 Tag Dirty Victim
+ * 13 | L2 Data Store NOP
+ * 14 | L2 Data Store READ
+ * 15 | L2 Data Store WRITE
+ * 16 | Memory Fill Data valid (1 strobe/32B)
+ * 17 | Memory Write Request
+ * 18 | Memory Read Request
+ * 19 | Memory Write Data valid (1 strobe/32B)
+ * 20 | XMC NOP (XMC Bus Idle)
+ * 21 | XMC LDT (Load-Through Request)
+ * 22 | XMC LDI (L2 Load I-Stream Request)
+ * 23 | XMC LDD (L2 Load D-stream Request)
+ * 24 | XMC STF (L2 Store Full cacheline Request)
+ * 25 | XMC STT (L2 Store Through Request)
+ * 26 | XMC STP (L2 Store Partial Request)
+ * 27 | XMC STC (L2 Store Conditional Request)
+ * 28 | XMC DWB (L2 Don't WriteBack Request)
+ * 29 | XMC PL2 (L2 Prefetch Request)
+ * 30 | XMC PSL1 (L1 Prefetch Request)
+ * 31 | XMC IOBLD
+ * 32 | XMC IOBST
+ * 33 | XMC IOBDMA
+ * 34 | XMC IOBRSP
+ * 35 | XMD Bus valid (all)
+ * 36 | XMD Bus valid (DST=L2C) Memory Data
+ * 37 | XMD Bus valid (DST=IOB) REFL Data
+ * 38 | XMD Bus valid (DST=PP) IOBRSP Data
+ * 39 | RSC NOP
+ * 40 | RSC STDN
+ * 41 | RSC FILL
+ * 42 | RSC REFL
+ * 43 | RSC STIN
+ * 44 | RSC SCIN
+ * 45 | RSC SCFL
+ * 46 | RSC SCDN
+ * 47 | RSD Data Valid
+ * 48 | RSD Data Valid (FILL)
+ * 49 | RSD Data Valid (STRSP)
+ * 50 | RSD Data Valid (REFL)
+ * 51 | LRF-REQ (LFB-NQ)
+ * 52 | DT RD-ALLOC (LDD/PSL1 Commands)
+ * 53 | DT WR-INVAL (ST* Commands)
+ */
+union cvmx_l2c_pfctl
+{
+ uint64_t u64;
+ struct cvmx_l2c_pfctl_s
+ {
+#if __BYTE_ORDER == __BIG_ENDIAN
+ uint64_t reserved_36_63 : 28;
+ uint64_t cnt3rdclr : 1; /**< Performance Counter 3 Read Clear
+ When set, all CSR reads of the L2C_PFC3
+ register will auto-clear the counter. This allows
+ SW to maintain 'cumulative' counters in SW.
+ NOTE: If the CSR read occurs in the same cycle as
+ the 'event' to be counted, the counter will
+ properly reflect the event. */
+ uint64_t cnt2rdclr : 1; /**< Performance Counter 2 Read Clear
+ When set, all CSR reads of the L2C_PFC2
+ register will auto-clear the counter. This allows
+ SW to maintain 'cumulative' counters in SW.
+ NOTE: If the CSR read occurs in the same cycle as
+ the 'event' to be counted, the counter will
+ properly reflect the event. */
+ uint64_t cnt1rdclr : 1; /**< Performance Counter 1 Read Clear
+ When set, all CSR reads of the L2C_PFC1
+ register will auto-clear the counter. This allows
+ SW to maintain 'cumulative' counters in SW.
+ NOTE: If the CSR read occurs in the same cycle as
+ the 'event' to be counted, the counter will
+ properly reflect the event. */
+ uint64_t cnt0rdclr : 1; /**< Performance Counter 0 Read Clear
+ When set, all CSR reads of the L2C_PFC0
+ register will 'auto-clear' the counter. This allows
+ SW to maintain accurate 'cumulative' counters.
+ NOTE: If the CSR read occurs in the same cycle as
+ the 'event' to be counted, the counter will
+ properly reflect the event. */
+ uint64_t cnt3ena : 1; /**< Performance Counter 3 Enable
+ When this bit is set, the performance counter
+ is enabled. */
+ uint64_t cnt3clr : 1; /**< Performance Counter 3 Clear
+ When the CSR write occurs, if this bit is set,
+ the performance counter is cleared. Otherwise,
+ it will resume counting from its current value. */
+ uint64_t cnt3sel : 6; /**< Performance Counter 3 Event Selector
+ (see list of selectable events to count in NOTES) */
+ uint64_t cnt2ena : 1; /**< Performance Counter 2 Enable
+ When this bit is set, the performance counter
+ is enabled. */
+ uint64_t cnt2clr : 1; /**< Performance Counter 2 Clear
+ When the CSR write occurs, if this bit is set,
+ the performance counter is cleared. Otherwise,
+ it will resume counting from its current value. */
+ uint64_t cnt2sel : 6; /**< Performance Counter 2 Event Selector
+ (see list of selectable events to count in NOTES) */
+ uint64_t cnt1ena : 1; /**< Performance Counter 1 Enable
+ When this bit is set, the performance counter
+ is enabled. */
+ uint64_t cnt1clr : 1; /**< Performance Counter 1 Clear
+ When the CSR write occurs, if this bit is set,
+ the performance counter is cleared. Otherwise,
+ it will resume counting from its current value. */
+ uint64_t cnt1sel : 6; /**< Performance Counter 1 Event Selector
+ (see list of selectable events to count in NOTES) */
+ uint64_t cnt0ena : 1; /**< Performance Counter 0 Enable
+ When this bit is set, the performance counter
+ is enabled. */
+ uint64_t cnt0clr : 1; /**< Performance Counter 0 Clear
+ When the CSR write occurs, if this bit is set,
+ the performance counter is cleared. Otherwise,
+ it will resume counting from its current value. */
+ uint64_t cnt0sel : 6; /**< Performance Counter 0 Event Selector
+ (see list of selectable events to count in NOTES) */
+#else
+ uint64_t cnt0sel : 6;
+ uint64_t cnt0clr : 1;
+ uint64_t cnt0ena : 1;
+ uint64_t cnt1sel : 6;
+ uint64_t cnt1clr : 1;
+ uint64_t cnt1ena : 1;
+ uint64_t cnt2sel : 6;
+ uint64_t cnt2clr : 1;
+ uint64_t cnt2ena : 1;
+ uint64_t cnt3sel : 6;
+ uint64_t cnt3clr : 1;
+ uint64_t cnt3ena : 1;
+ uint64_t cnt0rdclr : 1;
+ uint64_t cnt1rdclr : 1;
+ uint64_t cnt2rdclr : 1;
+ uint64_t cnt3rdclr : 1;
+ uint64_t reserved_36_63 : 28;
+#endif
+ } s;
+ struct cvmx_l2c_pfctl_s cn30xx;
+ struct cvmx_l2c_pfctl_s cn31xx;
+ struct cvmx_l2c_pfctl_s cn38xx;
+ struct cvmx_l2c_pfctl_s cn38xxp2;
+ struct cvmx_l2c_pfctl_s cn50xx;
+ struct cvmx_l2c_pfctl_s cn52xx;
+ struct cvmx_l2c_pfctl_s cn52xxp1;
+ struct cvmx_l2c_pfctl_s cn56xx;
+ struct cvmx_l2c_pfctl_s cn56xxp1;
+ struct cvmx_l2c_pfctl_s cn58xx;
+ struct cvmx_l2c_pfctl_s cn58xxp1;
+};
+typedef union cvmx_l2c_pfctl cvmx_l2c_pfctl_t;
+
+/**
+ * cvmx_l2c_ppgrp
+ *
+ * L2C_PPGRP = L2C PP Group Number
+ *
+ * Description: Defines the PP(Packet Processor) PLC Group \# (0,1,2)
+ */
+union cvmx_l2c_ppgrp
+{
+ uint64_t u64;
+ struct cvmx_l2c_ppgrp_s
+ {
+#if __BYTE_ORDER == __BIG_ENDIAN
+ uint64_t reserved_24_63 : 40;
+ uint64_t pp11grp : 2; /**< PP11 PLC Group# (0,1,2) */
+ uint64_t pp10grp : 2; /**< PP10 PLC Group# (0,1,2) */
+ uint64_t pp9grp : 2; /**< PP9 PLC Group# (0,1,2) */
+ uint64_t pp8grp : 2; /**< PP8 PLC Group# (0,1,2) */
+ uint64_t pp7grp : 2; /**< PP7 PLC Group# (0,1,2) */
+ uint64_t pp6grp : 2; /**< PP6 PLC Group# (0,1,2) */
+ uint64_t pp5grp : 2; /**< PP5 PLC Group# (0,1,2) */
+ uint64_t pp4grp : 2; /**< PP4 PLC Group# (0,1,2) */
+ uint64_t pp3grp : 2; /**< PP3 PLC Group# (0,1,2) */
+ uint64_t pp2grp : 2; /**< PP2 PLC Group# (0,1,2) */
+ uint64_t pp1grp : 2; /**< PP1 PLC Group# (0,1,2) */
+ uint64_t pp0grp : 2; /**< PP0 PLC Group# (0,1,2) */
+#else
+ uint64_t pp0grp : 2;
+ uint64_t pp1grp : 2;
+ uint64_t pp2grp : 2;
+ uint64_t pp3grp : 2;
+ uint64_t pp4grp : 2;
+ uint64_t pp5grp : 2;
+ uint64_t pp6grp : 2;
+ uint64_t pp7grp : 2;
+ uint64_t pp8grp : 2;
+ uint64_t pp9grp : 2;
+ uint64_t pp10grp : 2;
+ uint64_t pp11grp : 2;
+ uint64_t reserved_24_63 : 40;
+#endif
+ } s;
+ struct cvmx_l2c_ppgrp_cn52xx
+ {
+#if __BYTE_ORDER == __BIG_ENDIAN
+ uint64_t reserved_8_63 : 56;
+ uint64_t pp3grp : 2; /**< PP3 PLC Group# (0,1,2) */
+ uint64_t pp2grp : 2; /**< PP2 PLC Group# (0,1,2) */
+ uint64_t pp1grp : 2; /**< PP1 PLC Group# (0,1,2) */
+ uint64_t pp0grp : 2; /**< PP0 PLC Group# (0,1,2) */
+#else
+ uint64_t pp0grp : 2;
+ uint64_t pp1grp : 2;
+ uint64_t pp2grp : 2;
+ uint64_t pp3grp : 2;
+ uint64_t reserved_8_63 : 56;
+#endif
+ } cn52xx;
+ struct cvmx_l2c_ppgrp_cn52xx cn52xxp1;
+ struct cvmx_l2c_ppgrp_s cn56xx;
+ struct cvmx_l2c_ppgrp_s cn56xxp1;
+};
+typedef union cvmx_l2c_ppgrp cvmx_l2c_ppgrp_t;
+
+/**
+ * cvmx_l2c_qos_iob#
+ *
+ * L2C_QOS_IOB = L2C IOB QOS level
+ *
+ * Description:
+ */
+union cvmx_l2c_qos_iobx
+{
+ uint64_t u64;
+ struct cvmx_l2c_qos_iobx_s
+ {
+#if __BYTE_ORDER == __BIG_ENDIAN
+ uint64_t reserved_6_63 : 58;
+ uint64_t dwblvl : 2; /**< QOS level for DWB commands. */
+ uint64_t reserved_2_3 : 2;
+ uint64_t lvl : 2; /**< QOS level for non-DWB commands. */
+#else
+ uint64_t lvl : 2;
+ uint64_t reserved_2_3 : 2;
+ uint64_t dwblvl : 2;
+ uint64_t reserved_6_63 : 58;
+#endif
+ } s;
+ struct cvmx_l2c_qos_iobx_s cn63xx;
+ struct cvmx_l2c_qos_iobx_s cn63xxp1;
+};
+typedef union cvmx_l2c_qos_iobx cvmx_l2c_qos_iobx_t;
+
+/**
+ * cvmx_l2c_qos_pp#
+ *
+ * L2C_QOS_PP = L2C PP QOS level
+ *
+ * Description:
+ */
+union cvmx_l2c_qos_ppx
+{
+ uint64_t u64;
+ struct cvmx_l2c_qos_ppx_s
+ {
+#if __BYTE_ORDER == __BIG_ENDIAN
+ uint64_t reserved_2_63 : 62;
+ uint64_t lvl : 2; /**< QOS level to use for this PP. */
+#else
+ uint64_t lvl : 2;
+ uint64_t reserved_2_63 : 62;
+#endif
+ } s;
+ struct cvmx_l2c_qos_ppx_s cn63xx;
+ struct cvmx_l2c_qos_ppx_s cn63xxp1;
+};
+typedef union cvmx_l2c_qos_ppx cvmx_l2c_qos_ppx_t;
+
+/**
+ * cvmx_l2c_qos_wgt
+ *
+ * L2C_QOS_WGT = L2C QOS weights
+ *
+ */
+union cvmx_l2c_qos_wgt
+{
+ uint64_t u64;
+ struct cvmx_l2c_qos_wgt_s
+ {
+#if __BYTE_ORDER == __BIG_ENDIAN
+ uint64_t reserved_32_63 : 32;
+ uint64_t wgt3 : 8; /**< Weight for QOS level 3 */
+ uint64_t wgt2 : 8; /**< Weight for QOS level 2 */
+ uint64_t wgt1 : 8; /**< Weight for QOS level 1 */
+ uint64_t wgt0 : 8; /**< Weight for QOS level 0 */
+#else
+ uint64_t wgt0 : 8;
+ uint64_t wgt1 : 8;
+ uint64_t wgt2 : 8;
+ uint64_t wgt3 : 8;
+ uint64_t reserved_32_63 : 32;
+#endif
+ } s;
+ struct cvmx_l2c_qos_wgt_s cn63xx;
+ struct cvmx_l2c_qos_wgt_s cn63xxp1;
+};
+typedef union cvmx_l2c_qos_wgt cvmx_l2c_qos_wgt_t;
+
+/**
+ * cvmx_l2c_rsc#_pfc
+ *
+ * L2C_RSC_PFC = L2C RSC Performance Counter(s)
+ *
+ */
+union cvmx_l2c_rscx_pfc
+{
+ uint64_t u64;
+ struct cvmx_l2c_rscx_pfc_s
+ {
+#if __BYTE_ORDER == __BIG_ENDIAN
+ uint64_t count : 64; /**< Current counter value */
+#else
+ uint64_t count : 64;
+#endif
+ } s;
+ struct cvmx_l2c_rscx_pfc_s cn63xx;
+ struct cvmx_l2c_rscx_pfc_s cn63xxp1;
+};
+typedef union cvmx_l2c_rscx_pfc cvmx_l2c_rscx_pfc_t;
+
+/**
+ * cvmx_l2c_rsd#_pfc
+ *
+ * L2C_RSD_PFC = L2C RSD Performance Counter(s)
+ *
+ */
+union cvmx_l2c_rsdx_pfc
+{
+ uint64_t u64;
+ struct cvmx_l2c_rsdx_pfc_s
+ {
+#if __BYTE_ORDER == __BIG_ENDIAN
+ uint64_t count : 64; /**< Current counter value */
+#else
+ uint64_t count : 64;
+#endif
+ } s;
+ struct cvmx_l2c_rsdx_pfc_s cn63xx;
+ struct cvmx_l2c_rsdx_pfc_s cn63xxp1;
+};
+typedef union cvmx_l2c_rsdx_pfc cvmx_l2c_rsdx_pfc_t;
+
+/**
+ * cvmx_l2c_spar0
+ *
+ * L2C_SPAR0 = L2 Set Partitioning Register (PP0-3)
+ *
+ * Description: L2 Set Partitioning Register
+ *
+ * Notes:
+ * - When a bit is set in the UMSK'x' register, a memory command issued from PP='x' will NOT select that
+ * set for replacement.
+ * - There MUST ALWAYS BE at least 1 bit clear in each UMSK'x' register for proper L2 cache operation
+ * - NOTES: When L2C FUSE[136] is blown(CRIP_256K), then SETS#7-4 are SET in all UMSK'x' registers
+ * When L2C FUSE[137] is blown(CRIP_128K), then SETS#7-2 are SET in all UMSK'x' registers
+ */
+union cvmx_l2c_spar0
+{
+ uint64_t u64;
+ struct cvmx_l2c_spar0_s
+ {
+#if __BYTE_ORDER == __BIG_ENDIAN
+ uint64_t reserved_32_63 : 32;
+ uint64_t umsk3 : 8; /**< PP[3] L2 'DO NOT USE' set partition mask */
+ uint64_t umsk2 : 8; /**< PP[2] L2 'DO NOT USE' set partition mask */
+ uint64_t umsk1 : 8; /**< PP[1] L2 'DO NOT USE' set partition mask */
+ uint64_t umsk0 : 8; /**< PP[0] L2 'DO NOT USE' set partition mask */
+#else
+ uint64_t umsk0 : 8;
+ uint64_t umsk1 : 8;
+ uint64_t umsk2 : 8;
+ uint64_t umsk3 : 8;
+ uint64_t reserved_32_63 : 32;
+#endif
+ } s;
+ struct cvmx_l2c_spar0_cn30xx
+ {
+#if __BYTE_ORDER == __BIG_ENDIAN
+ uint64_t reserved_4_63 : 60;
+ uint64_t umsk0 : 4; /**< PP[0] L2 'DO NOT USE' set partition mask */
+#else
+ uint64_t umsk0 : 4;
+ uint64_t reserved_4_63 : 60;
+#endif
+ } cn30xx;
+ struct cvmx_l2c_spar0_cn31xx
+ {
+#if __BYTE_ORDER == __BIG_ENDIAN
+ uint64_t reserved_12_63 : 52;
+ uint64_t umsk1 : 4; /**< PP[1] L2 'DO NOT USE' set partition mask */
+ uint64_t reserved_4_7 : 4;
+ uint64_t umsk0 : 4; /**< PP[0] L2 'DO NOT USE' set partition mask */
+#else
+ uint64_t umsk0 : 4;
+ uint64_t reserved_4_7 : 4;
+ uint64_t umsk1 : 4;
+ uint64_t reserved_12_63 : 52;
+#endif
+ } cn31xx;
+ struct cvmx_l2c_spar0_s cn38xx;
+ struct cvmx_l2c_spar0_s cn38xxp2;
+ struct cvmx_l2c_spar0_cn50xx
+ {
+#if __BYTE_ORDER == __BIG_ENDIAN
+ uint64_t reserved_16_63 : 48;
+ uint64_t umsk1 : 8; /**< PP[1] L2 'DO NOT USE' set partition mask */
+ uint64_t umsk0 : 8; /**< PP[0] L2 'DO NOT USE' set partition mask */
+#else
+ uint64_t umsk0 : 8;
+ uint64_t umsk1 : 8;
+ uint64_t reserved_16_63 : 48;
+#endif
+ } cn50xx;
+ struct cvmx_l2c_spar0_s cn52xx;
+ struct cvmx_l2c_spar0_s cn52xxp1;
+ struct cvmx_l2c_spar0_s cn56xx;
+ struct cvmx_l2c_spar0_s cn56xxp1;
+ struct cvmx_l2c_spar0_s cn58xx;
+ struct cvmx_l2c_spar0_s cn58xxp1;
+};
+typedef union cvmx_l2c_spar0 cvmx_l2c_spar0_t;
+
+/**
+ * cvmx_l2c_spar1
+ *
+ * L2C_SPAR1 = L2 Set Partitioning Register (PP4-7)
+ *
+ * Description: L2 Set Partitioning Register
+ *
+ * Notes:
+ * - When a bit is set in the UMSK'x' register, a memory command issued from PP='x' will NOT select that
+ * set for replacement.
+ * - There should ALWAYS BE at least 1 bit clear in each UMSK'x' register for proper L2 cache operation
+ * - NOTES: When L2C FUSE[136] is blown(CRIP_1024K), then SETS#7-4 are SET in all UMSK'x' registers
+ * When L2C FUSE[137] is blown(CRIP_512K), then SETS#7-2 are SET in all UMSK'x' registers
+ */
+union cvmx_l2c_spar1
+{
+ uint64_t u64;
+ struct cvmx_l2c_spar1_s
+ {
+#if __BYTE_ORDER == __BIG_ENDIAN
+ uint64_t reserved_32_63 : 32;
+ uint64_t umsk7 : 8; /**< PP[7] L2 'DO NOT USE' set partition mask */
+ uint64_t umsk6 : 8; /**< PP[6] L2 'DO NOT USE' set partition mask */
+ uint64_t umsk5 : 8; /**< PP[5] L2 'DO NOT USE' set partition mask */
+ uint64_t umsk4 : 8; /**< PP[4] L2 'DO NOT USE' set partition mask */
+#else
+ uint64_t umsk4 : 8;
+ uint64_t umsk5 : 8;
+ uint64_t umsk6 : 8;
+ uint64_t umsk7 : 8;
+ uint64_t reserved_32_63 : 32;
+#endif
+ } s;
+ struct cvmx_l2c_spar1_s cn38xx;
+ struct cvmx_l2c_spar1_s cn38xxp2;
+ struct cvmx_l2c_spar1_s cn56xx;
+ struct cvmx_l2c_spar1_s cn56xxp1;
+ struct cvmx_l2c_spar1_s cn58xx;
+ struct cvmx_l2c_spar1_s cn58xxp1;
+};
+typedef union cvmx_l2c_spar1 cvmx_l2c_spar1_t;
+
+/**
+ * cvmx_l2c_spar2
+ *
+ * L2C_SPAR2 = L2 Set Partitioning Register (PP8-11)
+ *
+ * Description: L2 Set Partitioning Register
+ *
+ * Notes:
+ * - When a bit is set in the UMSK'x' register, a memory command issued from PP='x' will NOT select that
+ * set for replacement.
+ * - There should ALWAYS BE at least 1 bit clear in each UMSK'x' register for proper L2 cache operation
+ * - NOTES: When L2C FUSE[136] is blown(CRIP_1024K), then SETS#7-4 are SET in all UMSK'x' registers
+ * When L2C FUSE[137] is blown(CRIP_512K), then SETS#7-2 are SET in all UMSK'x' registers
+ */
+union cvmx_l2c_spar2
+{
+ uint64_t u64;
+ struct cvmx_l2c_spar2_s
+ {
+#if __BYTE_ORDER == __BIG_ENDIAN
+ uint64_t reserved_32_63 : 32;
+ uint64_t umsk11 : 8; /**< PP[11] L2 'DO NOT USE' set partition mask */
+ uint64_t umsk10 : 8; /**< PP[10] L2 'DO NOT USE' set partition mask */
+ uint64_t umsk9 : 8; /**< PP[9] L2 'DO NOT USE' set partition mask */
+ uint64_t umsk8 : 8; /**< PP[8] L2 'DO NOT USE' set partition mask */
+#else
+ uint64_t umsk8 : 8;
+ uint64_t umsk9 : 8;
+ uint64_t umsk10 : 8;
+ uint64_t umsk11 : 8;
+ uint64_t reserved_32_63 : 32;
+#endif
+ } s;
+ struct cvmx_l2c_spar2_s cn38xx;
+ struct cvmx_l2c_spar2_s cn38xxp2;
+ struct cvmx_l2c_spar2_s cn56xx;
+ struct cvmx_l2c_spar2_s cn56xxp1;
+ struct cvmx_l2c_spar2_s cn58xx;
+ struct cvmx_l2c_spar2_s cn58xxp1;
+};
+typedef union cvmx_l2c_spar2 cvmx_l2c_spar2_t;
+
+/**
+ * cvmx_l2c_spar3
+ *
+ * L2C_SPAR3 = L2 Set Partitioning Register (PP12-15)
+ *
+ * Description: L2 Set Partitioning Register
+ *
+ * Notes:
+ * - When a bit is set in the UMSK'x' register, a memory command issued from PP='x' will NOT select that
+ * set for replacement.
+ * - There should ALWAYS BE at least 1 bit clear in each UMSK'x' register for proper L2 cache operation
+ * - NOTES: When L2C FUSE[136] is blown(CRIP_1024K), then SETS#7-4 are SET in all UMSK'x' registers
+ * When L2C FUSE[137] is blown(CRIP_512K), then SETS#7-2 are SET in all UMSK'x' registers
+ */
+union cvmx_l2c_spar3
+{
+ uint64_t u64;
+ struct cvmx_l2c_spar3_s
+ {
+#if __BYTE_ORDER == __BIG_ENDIAN
+ uint64_t reserved_32_63 : 32;
+ uint64_t umsk15 : 8; /**< PP[15] L2 'DO NOT USE' set partition mask */
+ uint64_t umsk14 : 8; /**< PP[14] L2 'DO NOT USE' set partition mask */
+ uint64_t umsk13 : 8; /**< PP[13] L2 'DO NOT USE' set partition mask */
+ uint64_t umsk12 : 8; /**< PP[12] L2 'DO NOT USE' set partition mask */
+#else
+ uint64_t umsk12 : 8;
+ uint64_t umsk13 : 8;
+ uint64_t umsk14 : 8;
+ uint64_t umsk15 : 8;
+ uint64_t reserved_32_63 : 32;
+#endif
+ } s;
+ struct cvmx_l2c_spar3_s cn38xx;
+ struct cvmx_l2c_spar3_s cn38xxp2;
+ struct cvmx_l2c_spar3_s cn58xx;
+ struct cvmx_l2c_spar3_s cn58xxp1;
+};
+typedef union cvmx_l2c_spar3 cvmx_l2c_spar3_t;
+
+/**
+ * cvmx_l2c_spar4
+ *
+ * L2C_SPAR4 = L2 Set Partitioning Register (IOB)
+ *
+ * Description: L2 Set Partitioning Register
+ *
+ * Notes:
+ * - When a bit is set in the UMSK'x' register, a memory command issued from PP='x' will NOT select that
+ * set for replacement.
+ * - There should ALWAYS BE at least 1 bit clear in each UMSK'x' register for proper L2 cache operation
+ * - NOTES: When L2C FUSE[136] is blown(CRIP_256K), then SETS#7-4 are SET in all UMSK'x' registers
+ * When L2C FUSE[137] is blown(CRIP_128K), then SETS#7-2 are SET in all UMSK'x' registers
+ */
+union cvmx_l2c_spar4
+{
+ uint64_t u64;
+ struct cvmx_l2c_spar4_s
+ {
+#if __BYTE_ORDER == __BIG_ENDIAN
+ uint64_t reserved_8_63 : 56;
+ uint64_t umskiob : 8; /**< IOB L2 'DO NOT USE' set partition mask */
+#else
+ uint64_t umskiob : 8;
+ uint64_t reserved_8_63 : 56;
+#endif
+ } s;
+ struct cvmx_l2c_spar4_cn30xx
+ {
+#if __BYTE_ORDER == __BIG_ENDIAN
+ uint64_t reserved_4_63 : 60;
+ uint64_t umskiob : 4; /**< IOB L2 'DO NOT USE' set partition mask */
+#else
+ uint64_t umskiob : 4;
+ uint64_t reserved_4_63 : 60;
+#endif
+ } cn30xx;
+ struct cvmx_l2c_spar4_cn30xx cn31xx;
+ struct cvmx_l2c_spar4_s cn38xx;
+ struct cvmx_l2c_spar4_s cn38xxp2;
+ struct cvmx_l2c_spar4_s cn50xx;
+ struct cvmx_l2c_spar4_s cn52xx;
+ struct cvmx_l2c_spar4_s cn52xxp1;
+ struct cvmx_l2c_spar4_s cn56xx;
+ struct cvmx_l2c_spar4_s cn56xxp1;
+ struct cvmx_l2c_spar4_s cn58xx;
+ struct cvmx_l2c_spar4_s cn58xxp1;
+};
+typedef union cvmx_l2c_spar4 cvmx_l2c_spar4_t;
+
+/**
+ * cvmx_l2c_tad#_ecc0
+ *
+ * L2C_TAD_ECC0 = L2C ECC logging
+ *
+ * Description: holds the syndromes for a L2D read generated from L2C_XMC_CMD
+ */
+union cvmx_l2c_tadx_ecc0
+{
+ uint64_t u64;
+ struct cvmx_l2c_tadx_ecc0_s
+ {
+#if __BYTE_ORDER == __BIG_ENDIAN
+ uint64_t reserved_58_63 : 6;
+ uint64_t ow3ecc : 10; /**< ECC for OW3 of cache block */
+ uint64_t reserved_42_47 : 6;
+ uint64_t ow2ecc : 10; /**< ECC for OW2 of cache block */
+ uint64_t reserved_26_31 : 6;
+ uint64_t ow1ecc : 10; /**< ECC for OW1 of cache block */
+ uint64_t reserved_10_15 : 6;
+ uint64_t ow0ecc : 10; /**< ECC for OW0 of cache block */
+#else
+ uint64_t ow0ecc : 10;
+ uint64_t reserved_10_15 : 6;
+ uint64_t ow1ecc : 10;
+ uint64_t reserved_26_31 : 6;
+ uint64_t ow2ecc : 10;
+ uint64_t reserved_42_47 : 6;
+ uint64_t ow3ecc : 10;
+ uint64_t reserved_58_63 : 6;
+#endif
+ } s;
+ struct cvmx_l2c_tadx_ecc0_s cn63xx;
+ struct cvmx_l2c_tadx_ecc0_s cn63xxp1;
+};
+typedef union cvmx_l2c_tadx_ecc0 cvmx_l2c_tadx_ecc0_t;
+
+/**
+ * cvmx_l2c_tad#_ecc1
+ *
+ * L2C_TAD_ECC1 = L2C ECC logging
+ *
+ * Description: holds the syndromes for a L2D read generated from L2C_XMC_CMD
+ */
+union cvmx_l2c_tadx_ecc1
+{
+ uint64_t u64;
+ struct cvmx_l2c_tadx_ecc1_s
+ {
+#if __BYTE_ORDER == __BIG_ENDIAN
+ uint64_t reserved_58_63 : 6;
+ uint64_t ow7ecc : 10; /**< ECC for OW7 of cache block */
+ uint64_t reserved_42_47 : 6;
+ uint64_t ow6ecc : 10; /**< ECC for OW6 of cache block */
+ uint64_t reserved_26_31 : 6;
+ uint64_t ow5ecc : 10; /**< ECC for OW5 of cache block */
+ uint64_t reserved_10_15 : 6;
+ uint64_t ow4ecc : 10; /**< ECC for OW4 of cache block */
+#else
+ uint64_t ow4ecc : 10;
+ uint64_t reserved_10_15 : 6;
+ uint64_t ow5ecc : 10;
+ uint64_t reserved_26_31 : 6;
+ uint64_t ow6ecc : 10;
+ uint64_t reserved_42_47 : 6;
+ uint64_t ow7ecc : 10;
+ uint64_t reserved_58_63 : 6;
+#endif
+ } s;
+ struct cvmx_l2c_tadx_ecc1_s cn63xx;
+ struct cvmx_l2c_tadx_ecc1_s cn63xxp1;
+};
+typedef union cvmx_l2c_tadx_ecc1 cvmx_l2c_tadx_ecc1_t;
+
+/**
+ * cvmx_l2c_tad#_ien
+ *
+ * L2C_TAD_IEN = L2C TAD Interrupt Enable
+ *
+ */
+union cvmx_l2c_tadx_ien
+{
+ uint64_t u64;
+ struct cvmx_l2c_tadx_ien_s
+ {
+#if __BYTE_ORDER == __BIG_ENDIAN
+ uint64_t reserved_9_63 : 55;
+ uint64_t wrdislmc : 1; /**< Illegal Write to Disabled LMC Error enable
+ Enables L2C_TADX_INT[WRDISLMC] to
+ assert L2C_INT_REG[TADX] (and cause an interrupt) */
+ uint64_t rddislmc : 1; /**< Illegal Read to Disabled LMC Error enable
+ Enables L2C_TADX_INT[RDDISLMC] to
+ assert L2C_INT_REG[TADX] (and cause an interrupt) */
+ uint64_t noway : 1; /**< No way available interrupt enable
+ Enables L2C_ERR_TTGX[NOWAY] to assert
+ L2C_INT_REG[TADX] (and cause an interrupt) */
+ uint64_t vbfdbe : 1; /**< VBF Double-Bit Error enable
+ Enables L2C_ERR_TDTX[VSBE] to assert
+ L2C_INT_REG[TADX] (and cause an interrupt) */
+ uint64_t vbfsbe : 1; /**< VBF Single-Bit Error enable
+ Enables L2C_ERR_TDTX[VSBE] to assert
+ L2C_INT_REG[TADX] (and cause an interrupt) */
+ uint64_t tagdbe : 1; /**< TAG Double-Bit Error enable
+ Enables L2C_ERR_TTGX[DBE] to assert
+ L2C_INT_REG[TADX] (and cause an interrupt) */
+ uint64_t tagsbe : 1; /**< TAG Single-Bit Error enable
+ Enables L2C_ERR_TTGX[SBE] to assert
+ L2C_INT_REG[TADX] (and cause an interrupt) */
+ uint64_t l2ddbe : 1; /**< L2D Double-Bit Error enable
+ Enables L2C_ERR_TDTX[DBE] to assert
+ L2C_INT_REG[TADX] (and cause an interrupt) */
+ uint64_t l2dsbe : 1; /**< L2D Single-Bit Error enable
+ Enables L2C_ERR_TDTX[SBE] to assert
+ L2C_INT_REG[TADX] (and cause an interrupt) */
+#else
+ uint64_t l2dsbe : 1;
+ uint64_t l2ddbe : 1;
+ uint64_t tagsbe : 1;
+ uint64_t tagdbe : 1;
+ uint64_t vbfsbe : 1;
+ uint64_t vbfdbe : 1;
+ uint64_t noway : 1;
+ uint64_t rddislmc : 1;
+ uint64_t wrdislmc : 1;
+ uint64_t reserved_9_63 : 55;
+#endif
+ } s;
+ struct cvmx_l2c_tadx_ien_s cn63xx;
+ struct cvmx_l2c_tadx_ien_cn63xxp1
+ {
+#if __BYTE_ORDER == __BIG_ENDIAN
+ uint64_t reserved_7_63 : 57;
+ uint64_t noway : 1; /**< No way available interrupt enable
+ Enables L2C_ERR_TTGX[NOWAY] to assert
+ L2C_INT_REG[TADX] (and cause an interrupt) */
+ uint64_t vbfdbe : 1; /**< VBF Double-Bit Error enable
+ Enables L2C_ERR_TDTX[VSBE] to assert
+ L2C_INT_REG[TADX] (and cause an interrupt) */
+ uint64_t vbfsbe : 1; /**< VBF Single-Bit Error enable
+ Enables L2C_ERR_TDTX[VSBE] to assert
+ L2C_INT_REG[TADX] (and cause an interrupt) */
+ uint64_t tagdbe : 1; /**< TAG Double-Bit Error enable
+ Enables L2C_ERR_TTGX[DBE] to assert
+ L2C_INT_REG[TADX] (and cause an interrupt) */
+ uint64_t tagsbe : 1; /**< TAG Single-Bit Error enable
+ Enables L2C_ERR_TTGX[SBE] to assert
+ L2C_INT_REG[TADX] (and cause an interrupt) */
+ uint64_t l2ddbe : 1; /**< L2D Double-Bit Error enable
+ Enables L2C_ERR_TDTX[DBE] to assert
+ L2C_INT_REG[TADX] (and cause an interrupt) */
+ uint64_t l2dsbe : 1; /**< L2D Single-Bit Error enable
+ Enables L2C_ERR_TDTX[SBE] to assert
+ L2C_INT_REG[TADX] (and cause an interrupt) */
+#else
+ uint64_t l2dsbe : 1;
+ uint64_t l2ddbe : 1;
+ uint64_t tagsbe : 1;
+ uint64_t tagdbe : 1;
+ uint64_t vbfsbe : 1;
+ uint64_t vbfdbe : 1;
+ uint64_t noway : 1;
+ uint64_t reserved_7_63 : 57;
+#endif
+ } cn63xxp1;
+};
+typedef union cvmx_l2c_tadx_ien cvmx_l2c_tadx_ien_t;
+
+/**
+ * cvmx_l2c_tad#_int
+ *
+ * L2C_TAD_INT = L2C TAD Interrupt Register (not present in pass 1 O63)
+ *
+ *
+ * Notes:
+ * L2C_TAD_IEN is the interrupt enable register corresponding to this register.
+ *
+ */
+union cvmx_l2c_tadx_int
+{
+ uint64_t u64;
+ struct cvmx_l2c_tadx_int_s
+ {
+#if __BYTE_ORDER == __BIG_ENDIAN
+ uint64_t reserved_9_63 : 55;
+ uint64_t wrdislmc : 1; /**< Illegal Write to Disabled LMC Error
+ A DRAM write arrived before the LMC(s) were enabled */
+ uint64_t rddislmc : 1; /**< Illegal Read to Disabled LMC Error
+ A DRAM read arrived before the LMC(s) were enabled */
+ uint64_t noway : 1; /**< No way available interrupt
+ Shadow copy of L2C_ERR_TTGX[NOWAY]
+ Writes of 1 also clear L2C_ERR_TTGX[NOWAY] */
+ uint64_t vbfdbe : 1; /**< VBF Double-Bit Error
+ Shadow copy of L2C_ERR_TDTX[VDBE]
+ Writes of 1 also clear L2C_ERR_TDTX[VDBE] */
+ uint64_t vbfsbe : 1; /**< VBF Single-Bit Error
+ Shadow copy of L2C_ERR_TDTX[VSBE]
+ Writes of 1 also clear L2C_ERR_TDTX[VSBE] */
+ uint64_t tagdbe : 1; /**< TAG Double-Bit Error
+ Shadow copy of L2C_ERR_TTGX[DBE]
+ Writes of 1 also clear L2C_ERR_TTGX[DBE] */
+ uint64_t tagsbe : 1; /**< TAG Single-Bit Error
+ Shadow copy of L2C_ERR_TTGX[SBE]
+ Writes of 1 also clear L2C_ERR_TTGX[SBE] */
+ uint64_t l2ddbe : 1; /**< L2D Double-Bit Error
+ Shadow copy of L2C_ERR_TDTX[DBE]
+ Writes of 1 also clear L2C_ERR_TDTX[DBE] */
+ uint64_t l2dsbe : 1; /**< L2D Single-Bit Error
+ Shadow copy of L2C_ERR_TDTX[SBE]
+ Writes of 1 also clear L2C_ERR_TDTX[SBE] */
+#else
+ uint64_t l2dsbe : 1;
+ uint64_t l2ddbe : 1;
+ uint64_t tagsbe : 1;
+ uint64_t tagdbe : 1;
+ uint64_t vbfsbe : 1;
+ uint64_t vbfdbe : 1;
+ uint64_t noway : 1;
+ uint64_t rddislmc : 1;
+ uint64_t wrdislmc : 1;
+ uint64_t reserved_9_63 : 55;
+#endif
+ } s;
+ struct cvmx_l2c_tadx_int_s cn63xx;
+};
+typedef union cvmx_l2c_tadx_int cvmx_l2c_tadx_int_t;
+
+/**
+ * cvmx_l2c_tad#_pfc0
+ *
+ * L2C_TAD_PFC0 = L2C TAD Performance Counter 0
+ *
+ */
+union cvmx_l2c_tadx_pfc0
+{
+ uint64_t u64;
+ struct cvmx_l2c_tadx_pfc0_s
+ {
+#if __BYTE_ORDER == __BIG_ENDIAN
+ uint64_t count : 64; /**< Current counter value */
+#else
+ uint64_t count : 64;
+#endif
+ } s;
+ struct cvmx_l2c_tadx_pfc0_s cn63xx;
+ struct cvmx_l2c_tadx_pfc0_s cn63xxp1;
+};
+typedef union cvmx_l2c_tadx_pfc0 cvmx_l2c_tadx_pfc0_t;
+
+/**
+ * cvmx_l2c_tad#_pfc1
+ *
+ * L2C_TAD_PFC1 = L2C TAD Performance Counter 1
+ *
+ */
+union cvmx_l2c_tadx_pfc1
+{
+ uint64_t u64;
+ struct cvmx_l2c_tadx_pfc1_s
+ {
+#if __BYTE_ORDER == __BIG_ENDIAN
+ uint64_t count : 64; /**< Current counter value */
+#else
+ uint64_t count : 64;
+#endif
+ } s;
+ struct cvmx_l2c_tadx_pfc1_s cn63xx;
+ struct cvmx_l2c_tadx_pfc1_s cn63xxp1;
+};
+typedef union cvmx_l2c_tadx_pfc1 cvmx_l2c_tadx_pfc1_t;
+
+/**
+ * cvmx_l2c_tad#_pfc2
+ *
+ * L2C_TAD_PFC2 = L2C TAD Performance Counter 2
+ *
+ */
+union cvmx_l2c_tadx_pfc2
+{
+ uint64_t u64;
+ struct cvmx_l2c_tadx_pfc2_s
+ {
+#if __BYTE_ORDER == __BIG_ENDIAN
+ uint64_t count : 64; /**< Current counter value */
+#else
+ uint64_t count : 64;
+#endif
+ } s;
+ struct cvmx_l2c_tadx_pfc2_s cn63xx;
+ struct cvmx_l2c_tadx_pfc2_s cn63xxp1;
+};
+typedef union cvmx_l2c_tadx_pfc2 cvmx_l2c_tadx_pfc2_t;
+
+/**
+ * cvmx_l2c_tad#_pfc3
+ *
+ * L2C_TAD_PFC3 = L2C TAD Performance Counter 3
+ *
+ */
+union cvmx_l2c_tadx_pfc3
+{
+ uint64_t u64;
+ struct cvmx_l2c_tadx_pfc3_s
+ {
+#if __BYTE_ORDER == __BIG_ENDIAN
+ uint64_t count : 64; /**< Current counter value */
+#else
+ uint64_t count : 64;
+#endif
+ } s;
+ struct cvmx_l2c_tadx_pfc3_s cn63xx;
+ struct cvmx_l2c_tadx_pfc3_s cn63xxp1;
+};
+typedef union cvmx_l2c_tadx_pfc3 cvmx_l2c_tadx_pfc3_t;
+
+/**
+ * cvmx_l2c_tad#_prf
+ *
+ * L2C_TAD_PRF = L2C TAD Performance Counter Control
+ *
+ *
+ * Notes:
+ * (1) All four counters are equivalent and can use any of the defined selects.
+ *
+ * (2) the CNTnSEL legal values are:
+ * 0x00 -- Nothing (disabled)
+ * 0x01 -- L2 Tag Hit
+ * 0x02 -- L2 Tag Miss
+ * 0x03 -- L2 Tag NoAlloc (forced no-allocate)
+ * 0x04 -- L2 Victim
+ * 0x05 -- SC Fail
+ * 0x06 -- SC Pass
+ * 0x07 -- LFB Occupancy (each cycle adds \# of LFBs valid)
+ * 0x08 -- LFB Wait LFB (each cycle adds \# LFBs waiting for other LFBs)
+ * 0x09 -- LFB Wait VAB (each cycle adds \# LFBs waiting for VAB)
+ * 0x80 -- Quad 0 index bus inuse
+ * 0x81 -- Quad 0 read data bus inuse
+ * 0x82 -- Quad 0 \# banks inuse (0-4/cycle)
+ * 0x83 -- Quad 0 wdat flops inuse (0-4/cycle)
+ * 0x90 -- Quad 1 index bus inuse
+ * 0x91 -- Quad 1 read data bus inuse
+ * 0x92 -- Quad 1 \# banks inuse (0-4/cycle)
+ * 0x93 -- Quad 1 wdat flops inuse (0-4/cycle)
+ * 0xA0 -- Quad 2 index bus inuse
+ * 0xA1 -- Quad 2 read data bus inuse
+ * 0xA2 -- Quad 2 \# banks inuse (0-4/cycle)
+ * 0xA3 -- Quad 2 wdat flops inuse (0-4/cycle)
+ * 0xB0 -- Quad 3 index bus inuse
+ * 0xB1 -- Quad 3 read data bus inuse
+ * 0xB2 -- Quad 3 \# banks inuse (0-4/cycle)
+ * 0xB3 -- Quad 3 wdat flops inuse (0-4/cycle)
+ */
+union cvmx_l2c_tadx_prf
+{
+ uint64_t u64;
+ struct cvmx_l2c_tadx_prf_s
+ {
+#if __BYTE_ORDER == __BIG_ENDIAN
+ uint64_t reserved_32_63 : 32;
+ uint64_t cnt3sel : 8; /**< Selects event to count for L2C_TAD_PFC3 */
+ uint64_t cnt2sel : 8; /**< Selects event to count for L2C_TAD_PFC2 */
+ uint64_t cnt1sel : 8; /**< Selects event to count for L2C_TAD_PFC1 */
+ uint64_t cnt0sel : 8; /**< Selects event to count for L2C_TAD_PFC0 */
+#else
+ uint64_t cnt0sel : 8;
+ uint64_t cnt1sel : 8;
+ uint64_t cnt2sel : 8;
+ uint64_t cnt3sel : 8;
+ uint64_t reserved_32_63 : 32;
+#endif
+ } s;
+ struct cvmx_l2c_tadx_prf_s cn63xx;
+ struct cvmx_l2c_tadx_prf_s cn63xxp1;
+};
+typedef union cvmx_l2c_tadx_prf cvmx_l2c_tadx_prf_t;
+
+/**
+ * cvmx_l2c_tad#_tag
+ *
+ * L2C_TAD_TAG = L2C tag data
+ *
+ * Description: holds the tag information for LTGL2I and STGL2I commands
+ *
+ * Notes:
+ * (1) For 63xx TAG[35] must be written zero for STGL2I's or operation is undefined. During normal
+ * operation, TAG[35] will also read 0.
+ *
+ * (2) If setting the LOCK bit, the USE bit should also be set or operation is undefined.
+ *
+ * (3) The tag is the corresponding bits from the L2C+LMC internal L2/DRAM byte address.
+ */
+union cvmx_l2c_tadx_tag
+{
+ uint64_t u64;
+ struct cvmx_l2c_tadx_tag_s
+ {
+#if __BYTE_ORDER == __BIG_ENDIAN
+ uint64_t reserved_46_63 : 18;
+ uint64_t ecc : 6; /**< The tag ECC */
+ uint64_t reserved_36_39 : 4;
+ uint64_t tag : 19; /**< The tag (see notes 1 and 3) */
+ uint64_t reserved_4_16 : 13;
+ uint64_t use : 1; /**< The LRU use bit */
+ uint64_t valid : 1; /**< The valid bit */
+ uint64_t dirty : 1; /**< The dirty bit */
+ uint64_t lock : 1; /**< The lock bit */
+#else
+ uint64_t lock : 1;
+ uint64_t dirty : 1;
+ uint64_t valid : 1;
+ uint64_t use : 1;
+ uint64_t reserved_4_16 : 13;
+ uint64_t tag : 19;
+ uint64_t reserved_36_39 : 4;
+ uint64_t ecc : 6;
+ uint64_t reserved_46_63 : 18;
+#endif
+ } s;
+ struct cvmx_l2c_tadx_tag_s cn63xx;
+ struct cvmx_l2c_tadx_tag_s cn63xxp1;
+};
+typedef union cvmx_l2c_tadx_tag cvmx_l2c_tadx_tag_t;
+
+/**
+ * cvmx_l2c_ver_id
+ *
+ * L2C_VER_ID = L2C Virtualization ID Error Register
+ *
+ * Description: records virtualization IDs associated with HOLEWR/BIGWR/VRTWR/VRTIDRNG/VRTADRNG interrupts.
+ */
+union cvmx_l2c_ver_id
+{
+ uint64_t u64;
+ struct cvmx_l2c_ver_id_s
+ {
+#if __BYTE_ORDER == __BIG_ENDIAN
+ uint64_t mask : 64; /**< Mask of virtualization IDs which had an error */
+#else
+ uint64_t mask : 64;
+#endif
+ } s;
+ struct cvmx_l2c_ver_id_s cn63xx;
+ struct cvmx_l2c_ver_id_s cn63xxp1;
+};
+typedef union cvmx_l2c_ver_id cvmx_l2c_ver_id_t;
+
+/**
+ * cvmx_l2c_ver_iob
+ *
+ * L2C_VER_IOB = L2C Virtualization ID IOB Error Register
+ *
+ * Description: records IOBs associated with HOLEWR/BIGWR/VRTWR/VRTIDRNG/VRTADRNG interrupts.
+ */
+union cvmx_l2c_ver_iob
+{
+ uint64_t u64;
+ struct cvmx_l2c_ver_iob_s
+ {
+#if __BYTE_ORDER == __BIG_ENDIAN
+ uint64_t reserved_1_63 : 63;
+ uint64_t mask : 1; /**< Mask of IOBs which had a virtualization error */
+#else
+ uint64_t mask : 1;
+ uint64_t reserved_1_63 : 63;
+#endif
+ } s;
+ struct cvmx_l2c_ver_iob_s cn63xx;
+ struct cvmx_l2c_ver_iob_s cn63xxp1;
+};
+typedef union cvmx_l2c_ver_iob cvmx_l2c_ver_iob_t;
+
+/**
+ * cvmx_l2c_ver_msc
+ *
+ * L2C_VER_MSC = L2C Virtualization Miscellaneous Error Register (not in 63xx pass 1.x)
+ *
+ * Description: records type of command associated with HOLEWR/BIGWR/VRTWR/VRTIDRNG/VRTADRNG interrupts
+ */
+union cvmx_l2c_ver_msc
+{
+ uint64_t u64;
+ struct cvmx_l2c_ver_msc_s
+ {
+#if __BYTE_ORDER == __BIG_ENDIAN
+ uint64_t reserved_2_63 : 62;
+ uint64_t invl2 : 1; /**< If set, a INVL2 caused HOLEWR/BIGWR/VRT* to set */
+ uint64_t dwb : 1; /**< If set, a DWB caused HOLEWR/BIGWR/VRT* to set */
+#else
+ uint64_t dwb : 1;
+ uint64_t invl2 : 1;
+ uint64_t reserved_2_63 : 62;
+#endif
+ } s;
+ struct cvmx_l2c_ver_msc_s cn63xx;
+};
+typedef union cvmx_l2c_ver_msc cvmx_l2c_ver_msc_t;
+
+/**
+ * cvmx_l2c_ver_pp
+ *
+ * L2C_VER_PP = L2C Virtualization ID PP Error Register
+ *
+ * Description: records PPs associated with HOLEWR/BIGWR/VRTWR/VRTIDRNG/VRTADRNG interrupts.
+ */
+union cvmx_l2c_ver_pp
+{
+ uint64_t u64;
+ struct cvmx_l2c_ver_pp_s
+ {
+#if __BYTE_ORDER == __BIG_ENDIAN
+ uint64_t reserved_6_63 : 58;
+ uint64_t mask : 6; /**< Mask of PPs which had a virtualization error */
+#else
+ uint64_t mask : 6;
+ uint64_t reserved_6_63 : 58;
+#endif
+ } s;
+ struct cvmx_l2c_ver_pp_s cn63xx;
+ struct cvmx_l2c_ver_pp_s cn63xxp1;
+};
+typedef union cvmx_l2c_ver_pp cvmx_l2c_ver_pp_t;
+
+/**
+ * cvmx_l2c_virtid_iob#
+ *
+ * L2C_VIRTID_IOB = L2C IOB virtualization ID
+ *
+ * Description:
+ */
+union cvmx_l2c_virtid_iobx
+{
+ uint64_t u64;
+ struct cvmx_l2c_virtid_iobx_s
+ {
+#if __BYTE_ORDER == __BIG_ENDIAN
+ uint64_t reserved_14_63 : 50;
+ uint64_t dwbid : 6; /**< Virtualization ID to use for DWB commands */
+ uint64_t reserved_6_7 : 2;
+ uint64_t id : 6; /**< Virtualization ID to use for non-DWB commands */
+#else
+ uint64_t id : 6;
+ uint64_t reserved_6_7 : 2;
+ uint64_t dwbid : 6;
+ uint64_t reserved_14_63 : 50;
+#endif
+ } s;
+ struct cvmx_l2c_virtid_iobx_s cn63xx;
+ struct cvmx_l2c_virtid_iobx_s cn63xxp1;
+};
+typedef union cvmx_l2c_virtid_iobx cvmx_l2c_virtid_iobx_t;
+
+/**
+ * cvmx_l2c_virtid_pp#
+ *
+ * L2C_VIRTID_PP = L2C PP virtualization ID
+ *
+ * Description:
+ */
+union cvmx_l2c_virtid_ppx
+{
+ uint64_t u64;
+ struct cvmx_l2c_virtid_ppx_s
+ {
+#if __BYTE_ORDER == __BIG_ENDIAN
+ uint64_t reserved_6_63 : 58;
+ uint64_t id : 6; /**< Virtualization ID to use for this PP. */
+#else
+ uint64_t id : 6;
+ uint64_t reserved_6_63 : 58;
+#endif
+ } s;
+ struct cvmx_l2c_virtid_ppx_s cn63xx;
+ struct cvmx_l2c_virtid_ppx_s cn63xxp1;
+};
+typedef union cvmx_l2c_virtid_ppx cvmx_l2c_virtid_ppx_t;
+
+/**
+ * cvmx_l2c_vrt_ctl
+ *
+ * L2C_VRT_CTL = L2C Virtualization control register
+ *
+ */
+union cvmx_l2c_vrt_ctl
+{
+ uint64_t u64;
+ struct cvmx_l2c_vrt_ctl_s
+ {
+#if __BYTE_ORDER == __BIG_ENDIAN
+ uint64_t reserved_9_63 : 55;
+ uint64_t ooberr : 1; /**< Whether out of bounds writes are an error
+ Determines virtualization hardware behavior for
+ a store to an L2/DRAM address larger than
+ indicated by MEMSZ. If OOBERR is set, all these
+ stores (from any virtualization ID) are blocked. If
+ OOBERR is clear, none of these stores are blocked. */
+ uint64_t reserved_7_7 : 1;
+ uint64_t memsz : 3; /**< Memory space coverage of L2C_VRT_MEM (encoded)
+ 0 = 1GB
+ 1 = 2GB
+ 2 = 4GB
+ 3 = 8GB
+ 4 = 16GB
+ 5 = 32GB
+ 6 = 64GB (**reserved in 63xx**)
+ 7 = 128GB (**reserved in 63xx**) */
+ uint64_t numid : 3; /**< Number of allowed virtualization IDs (encoded)
+ 0 = 2
+ 1 = 4
+ 2 = 8
+ 3 = 16
+ 4 = 32
+ 5 = 64
+ 6,7 illegal
+ Violations of this limit causes
+ L2C to set L2C_INT_REG[VRTIDRNG]. */
+ uint64_t enable : 1; /**< Global virtualization enable
+ When ENABLE is clear, stores are never blocked by
+ the L2C virtualization hardware and none of NUMID,
+ MEMSZ, OOBERR are used. */
+#else
+ uint64_t enable : 1;
+ uint64_t numid : 3;
+ uint64_t memsz : 3;
+ uint64_t reserved_7_7 : 1;
+ uint64_t ooberr : 1;
+ uint64_t reserved_9_63 : 55;
+#endif
+ } s;
+ struct cvmx_l2c_vrt_ctl_s cn63xx;
+ struct cvmx_l2c_vrt_ctl_s cn63xxp1;
+};
+typedef union cvmx_l2c_vrt_ctl cvmx_l2c_vrt_ctl_t;
+
+/**
+ * cvmx_l2c_vrt_mem#
+ *
+ * L2C_VRT_MEM = L2C Virtualization Memory
+ *
+ * Description: Virtualization memory mapped region. There are 1024 32b
+ * byte-parity protected entries.
+ *
+ * Notes:
+ * When a DATA bit is set in L2C_VRT_MEM when L2C virtualization is enabled, L2C
+ * prevents the selected virtual machine from storing to the selected L2/DRAM region.
+ * L2C uses L2C_VRT_MEM to block stores when:
+ * - L2C_VRT_CTL[ENABLE] is set, and
+ * - the address of the store exists in L2C+LMC internal L2/DRAM Address space
+ * and is within the L2C_VRT_CTL[MEMSZ] bounds, and
+ * - the virtID of the store is within the L2C_VRT_CTL[NUMID] bounds
+ *
+ * L2C_VRT_MEM is never used for these L2C transactions which are always allowed:
+ * - L2C CMI L2/DRAM transactions that cannot modify L2/DRAM, and
+ * - any L2/DRAM transaction originated from L2C_XMC_CMD
+ *
+ * L2C_VRT_MEM contains one DATA bit per L2C+LMC internal L2/DRAM region and virtID indicating whether the store
+ * to the region is allowed. The granularity of the checking is the region size, which is:
+ * 2 ^^ (L2C_VRT_CTL[NUMID]+L2C_VRT_CTL[MEMSZ]+16)
+ * which ranges from a minimum of 64KB to a maximum of 256MB, depending on the size
+ * of L2/DRAM that is protected and the number of virtual machines.
+ *
+ * The L2C_VRT_MEM DATA bit that L2C uses is:
+ *
+ * l2c_vrt_mem_bit_index = address >> (L2C_VRT_CTL[MEMSZ]+L2C_VRT_CTL[NUMID]+16); // address is a byte address
+ * l2c_vrt_mem_bit_index = l2c_vrt_mem_bit_index | (virtID << (14-L2C_VRT_CTL[NUMID]));
+ *
+ * L2C_VRT_MEM(l2c_vrt_mem_bit_index >> 5)[DATA<l2c_vrt_mem_bit_index & 0x1F>] is used
+ *
+ * A specific example:
+ *
+ * L2C_VRT_CTL[NUMID]=2 (i.e. 8 virtual machine ID's used)
+ * L2C_VRT_CTL[MEMSZ]=4 (i.e. L2C_VRT_MEM covers 16 GB)
+ *
+ * L2/DRAM region size (granularity) is 4MB
+ *
+ * l2c_vrt_mem_bit_index<14:12> = virtID<2:0>
+ * l2c_vrt_mem_bit_index<11:0> = address<33:22>
+ *
+ * For L2/DRAM physical address 0x51000000 with virtID=5:
+ * L2C_VRT_MEM648[DATA<4>] determines when the store is allowed (648 is decimal, not hex)
+ */
+union cvmx_l2c_vrt_memx
+{
+ uint64_t u64;
+ struct cvmx_l2c_vrt_memx_s
+ {
+#if __BYTE_ORDER == __BIG_ENDIAN
+ uint64_t reserved_36_63 : 28;
+ uint64_t parity : 4; /**< Parity to write into (or read from) the
+ virtualization memory.
+ PARITY<i> is the even parity of DATA<(i*8)+7:i*8> */
+ uint64_t data : 32; /**< Data to write into (or read from) the
+ virtualization memory. */
+#else
+ uint64_t data : 32;
+ uint64_t parity : 4;
+ uint64_t reserved_36_63 : 28;
+#endif
+ } s;
+ struct cvmx_l2c_vrt_memx_s cn63xx;
+ struct cvmx_l2c_vrt_memx_s cn63xxp1;
+};
+typedef union cvmx_l2c_vrt_memx cvmx_l2c_vrt_memx_t;
+
+/**
+ * cvmx_l2c_wpar_iob#
+ *
+ * L2C_WPAR_IOB = L2C IOB way partitioning
+ *
+ *
+ * Notes:
+ * (1) The read value of MASK will include bits set because of the L2C cripple fuses.
+ *
+ */
+union cvmx_l2c_wpar_iobx
+{
+ uint64_t u64;
+ struct cvmx_l2c_wpar_iobx_s
+ {
+#if __BYTE_ORDER == __BIG_ENDIAN
+ uint64_t reserved_16_63 : 48;
+ uint64_t mask : 16; /**< Way partitioning mask. (1 means do not use) */
+#else
+ uint64_t mask : 16;
+ uint64_t reserved_16_63 : 48;
+#endif
+ } s;
+ struct cvmx_l2c_wpar_iobx_s cn63xx;
+ struct cvmx_l2c_wpar_iobx_s cn63xxp1;
+};
+typedef union cvmx_l2c_wpar_iobx cvmx_l2c_wpar_iobx_t;
+
+/**
+ * cvmx_l2c_wpar_pp#
+ *
+ * L2C_WPAR_PP = L2C PP way partitioning
+ *
+ *
+ * Notes:
+ * (1) The read value of MASK will include bits set because of the L2C cripple fuses.
+ *
+ */
+union cvmx_l2c_wpar_ppx
+{
+ uint64_t u64;
+ struct cvmx_l2c_wpar_ppx_s
+ {
+#if __BYTE_ORDER == __BIG_ENDIAN
+ uint64_t reserved_16_63 : 48;
+ uint64_t mask : 16; /**< Way partitioning mask. (1 means do not use) */
+#else
+ uint64_t mask : 16;
+ uint64_t reserved_16_63 : 48;
+#endif
+ } s;
+ struct cvmx_l2c_wpar_ppx_s cn63xx;
+ struct cvmx_l2c_wpar_ppx_s cn63xxp1;
+};
+typedef union cvmx_l2c_wpar_ppx cvmx_l2c_wpar_ppx_t;
+
+/**
+ * cvmx_l2c_xmc#_pfc
+ *
+ * L2C_XMC_PFC = L2C XMC Performance Counter(s)
+ *
+ */
+union cvmx_l2c_xmcx_pfc
+{
+ uint64_t u64;
+ struct cvmx_l2c_xmcx_pfc_s
+ {
+#if __BYTE_ORDER == __BIG_ENDIAN
+ uint64_t count : 64; /**< Current counter value */
+#else
+ uint64_t count : 64;
+#endif
+ } s;
+ struct cvmx_l2c_xmcx_pfc_s cn63xx;
+ struct cvmx_l2c_xmcx_pfc_s cn63xxp1;
+};
+typedef union cvmx_l2c_xmcx_pfc cvmx_l2c_xmcx_pfc_t;
+
+/**
+ * cvmx_l2c_xmc_cmd
+ *
+ * L2C_XMC_CMD = L2C XMC command register
+ *
+ *
+ * Notes:
+ * (1) the XMC command chosen MUST NOT be a IOB destined command or operation is UNDEFINED.
+ *
+ * (2) the XMC command will have sid forced to IOB, did forced to L2C, no virtualization checks
+ * performed (always pass), and xmdmsk forced to 0. Note that this implies that commands which
+ * REQUIRE an XMD cycle (STP,STC,SAA,FAA,FAS) should not be used or the results are unpredictable.
+ * The sid=IOB means that the way partitioning used for the command is L2C_WPAR_IOB.
+ * None of L2C_QOS_IOB, L2C_QOS_PP, L2C_VIRTID_IOB, L2C_VIRTID_PP are used for these commands.
+ *
+ * (3) any responses generated by the XMC command will be forced to PP7 (a non-existant PP) effectively
+ * causing them to be ignored. Generated STINs, however, will correctly invalidate the required
+ * PPs.
+ *
+ * (4) any L2D read generated by the XMC command will record the syndrome information in
+ * L2C_TAD_ECC0/1. If ECC is disabled prior to the CSR write this provides the ability to read the
+ * ECC bits directly. If ECC is not disabled this should log 0's (assuming no ECC errors were
+ * found in the block).
+ *
+ * (5) A write which arrives while the INUSE bit is set will block until the INUSE bit clears. This
+ * gives software 2 options when needing to issue a stream of writes to L2C_XMC_CMD: polling on the
+ * INUSE bit, or allowing HW to handle the interlock -- at the expense of locking up the RSL bus
+ * for potentially tens of cycles at a time while waiting for an available LFB/VAB entry.
+ *
+ * (6) The address written to L2C_XMC_CMD is a 38-bit OCTEON physical address. L2C performs hole removal and
+ * index aliasing (if enabled) on the written address and uses that for the command. This hole
+ * removed/index aliased 38-bit address is what is returned on a read of the L2C_XMC_CMD register.
+ */
+union cvmx_l2c_xmc_cmd
+{
+ uint64_t u64;
+ struct cvmx_l2c_xmc_cmd_s
+ {
+#if __BYTE_ORDER == __BIG_ENDIAN
+ uint64_t inuse : 1; /**< Set to 1 by HW upon receiving a write, cleared when
+ command has issued (not necessarily completed, but
+ ordered relative to other traffic) and HW can accept
+ another command. */
+ uint64_t cmd : 6; /**< Command to use for simulated XMC request
+ a new request can be accepted */
+ uint64_t reserved_38_56 : 19;
+ uint64_t addr : 38; /**< Address to use for simulated XMC request (see Note 6) */
+#else
+ uint64_t addr : 38;
+ uint64_t reserved_38_56 : 19;
+ uint64_t cmd : 6;
+ uint64_t inuse : 1;
+#endif
+ } s;
+ struct cvmx_l2c_xmc_cmd_s cn63xx;
+ struct cvmx_l2c_xmc_cmd_s cn63xxp1;
+};
+typedef union cvmx_l2c_xmc_cmd cvmx_l2c_xmc_cmd_t;
+
+/**
+ * cvmx_l2c_xmd#_pfc
+ *
+ * L2C_XMD_PFC = L2C XMD Performance Counter(s)
+ *
+ */
+union cvmx_l2c_xmdx_pfc
+{
+ uint64_t u64;
+ struct cvmx_l2c_xmdx_pfc_s
+ {
+#if __BYTE_ORDER == __BIG_ENDIAN
+ uint64_t count : 64; /**< Current counter value */
+#else
+ uint64_t count : 64;
+#endif
+ } s;
+ struct cvmx_l2c_xmdx_pfc_s cn63xx;
+ struct cvmx_l2c_xmdx_pfc_s cn63xxp1;
+};
+typedef union cvmx_l2c_xmdx_pfc cvmx_l2c_xmdx_pfc_t;
+
+#endif