04b6fa8330
facilities as well as support for the Octeon 2 family of SoCs. XXX Note that with our antediluvian assembler, we can't support some Octeon 2 instructions and fall back to using the old ones instead.
5890 lines
304 KiB
C
5890 lines
304 KiB
C
/***********************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
|