diff options
Diffstat (limited to 'sys/contrib/octeon-sdk/cvmx-dfa-defs.h')
-rw-r--r-- | sys/contrib/octeon-sdk/cvmx-dfa-defs.h | 4982 |
1 files changed, 4982 insertions, 0 deletions
diff --git a/sys/contrib/octeon-sdk/cvmx-dfa-defs.h b/sys/contrib/octeon-sdk/cvmx-dfa-defs.h new file mode 100644 index 0000000..42ee0c8 --- /dev/null +++ b/sys/contrib/octeon-sdk/cvmx-dfa-defs.h @@ -0,0 +1,4982 @@ +/***********************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-dfa-defs.h + * + * Configuration and status register (CSR) type definitions for + * Octeon dfa. + * + * This file is auto generated. Do not edit. + * + * <hr>$Revision$<hr> + * + */ +#ifndef __CVMX_DFA_TYPEDEFS_H__ +#define __CVMX_DFA_TYPEDEFS_H__ + +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +#define CVMX_DFA_BIST0 CVMX_DFA_BIST0_FUNC() +static inline uint64_t CVMX_DFA_BIST0_FUNC(void) +{ + if (!(OCTEON_IS_MODEL(OCTEON_CN63XX))) + cvmx_warn("CVMX_DFA_BIST0 not supported on this chip\n"); + return CVMX_ADD_IO_SEG(0x00011800370007F0ull); +} +#else +#define CVMX_DFA_BIST0 (CVMX_ADD_IO_SEG(0x00011800370007F0ull)) +#endif +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +#define CVMX_DFA_BIST1 CVMX_DFA_BIST1_FUNC() +static inline uint64_t CVMX_DFA_BIST1_FUNC(void) +{ + if (!(OCTEON_IS_MODEL(OCTEON_CN63XX))) + cvmx_warn("CVMX_DFA_BIST1 not supported on this chip\n"); + return CVMX_ADD_IO_SEG(0x00011800370007F8ull); +} +#else +#define CVMX_DFA_BIST1 (CVMX_ADD_IO_SEG(0x00011800370007F8ull)) +#endif +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +#define CVMX_DFA_BST0 CVMX_DFA_BST0_FUNC() +static inline uint64_t CVMX_DFA_BST0_FUNC(void) +{ + if (!(OCTEON_IS_MODEL(OCTEON_CN31XX) || OCTEON_IS_MODEL(OCTEON_CN38XX) || OCTEON_IS_MODEL(OCTEON_CN58XX))) + cvmx_warn("CVMX_DFA_BST0 not supported on this chip\n"); + return CVMX_ADD_IO_SEG(0x00011800300007F0ull); +} +#else +#define CVMX_DFA_BST0 (CVMX_ADD_IO_SEG(0x00011800300007F0ull)) +#endif +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +#define CVMX_DFA_BST1 CVMX_DFA_BST1_FUNC() +static inline uint64_t CVMX_DFA_BST1_FUNC(void) +{ + if (!(OCTEON_IS_MODEL(OCTEON_CN31XX) || OCTEON_IS_MODEL(OCTEON_CN38XX) || OCTEON_IS_MODEL(OCTEON_CN58XX))) + cvmx_warn("CVMX_DFA_BST1 not supported on this chip\n"); + return CVMX_ADD_IO_SEG(0x00011800300007F8ull); +} +#else +#define CVMX_DFA_BST1 (CVMX_ADD_IO_SEG(0x00011800300007F8ull)) +#endif +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +#define CVMX_DFA_CFG CVMX_DFA_CFG_FUNC() +static inline uint64_t CVMX_DFA_CFG_FUNC(void) +{ + if (!(OCTEON_IS_MODEL(OCTEON_CN38XX) || OCTEON_IS_MODEL(OCTEON_CN58XX))) + cvmx_warn("CVMX_DFA_CFG not supported on this chip\n"); + return CVMX_ADD_IO_SEG(0x0001180030000000ull); +} +#else +#define CVMX_DFA_CFG (CVMX_ADD_IO_SEG(0x0001180030000000ull)) +#endif +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +#define CVMX_DFA_CONFIG CVMX_DFA_CONFIG_FUNC() +static inline uint64_t CVMX_DFA_CONFIG_FUNC(void) +{ + if (!(OCTEON_IS_MODEL(OCTEON_CN63XX))) + cvmx_warn("CVMX_DFA_CONFIG not supported on this chip\n"); + return CVMX_ADD_IO_SEG(0x0001180037000000ull); +} +#else +#define CVMX_DFA_CONFIG (CVMX_ADD_IO_SEG(0x0001180037000000ull)) +#endif +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +#define CVMX_DFA_CONTROL CVMX_DFA_CONTROL_FUNC() +static inline uint64_t CVMX_DFA_CONTROL_FUNC(void) +{ + if (!(OCTEON_IS_MODEL(OCTEON_CN63XX))) + cvmx_warn("CVMX_DFA_CONTROL not supported on this chip\n"); + return CVMX_ADD_IO_SEG(0x0001180037000020ull); +} +#else +#define CVMX_DFA_CONTROL (CVMX_ADD_IO_SEG(0x0001180037000020ull)) +#endif +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +#define CVMX_DFA_DBELL CVMX_DFA_DBELL_FUNC() +static inline uint64_t CVMX_DFA_DBELL_FUNC(void) +{ + if (!(OCTEON_IS_MODEL(OCTEON_CN31XX) || OCTEON_IS_MODEL(OCTEON_CN38XX) || OCTEON_IS_MODEL(OCTEON_CN58XX) || OCTEON_IS_MODEL(OCTEON_CN63XX))) + cvmx_warn("CVMX_DFA_DBELL not supported on this chip\n"); + return CVMX_ADD_IO_SEG(0x0001370000000000ull); +} +#else +#define CVMX_DFA_DBELL (CVMX_ADD_IO_SEG(0x0001370000000000ull)) +#endif +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +#define CVMX_DFA_DDR2_ADDR CVMX_DFA_DDR2_ADDR_FUNC() +static inline uint64_t CVMX_DFA_DDR2_ADDR_FUNC(void) +{ + if (!(OCTEON_IS_MODEL(OCTEON_CN31XX))) + cvmx_warn("CVMX_DFA_DDR2_ADDR not supported on this chip\n"); + return CVMX_ADD_IO_SEG(0x0001180030000210ull); +} +#else +#define CVMX_DFA_DDR2_ADDR (CVMX_ADD_IO_SEG(0x0001180030000210ull)) +#endif +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +#define CVMX_DFA_DDR2_BUS CVMX_DFA_DDR2_BUS_FUNC() +static inline uint64_t CVMX_DFA_DDR2_BUS_FUNC(void) +{ + if (!(OCTEON_IS_MODEL(OCTEON_CN31XX))) + cvmx_warn("CVMX_DFA_DDR2_BUS not supported on this chip\n"); + return CVMX_ADD_IO_SEG(0x0001180030000080ull); +} +#else +#define CVMX_DFA_DDR2_BUS (CVMX_ADD_IO_SEG(0x0001180030000080ull)) +#endif +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +#define CVMX_DFA_DDR2_CFG CVMX_DFA_DDR2_CFG_FUNC() +static inline uint64_t CVMX_DFA_DDR2_CFG_FUNC(void) +{ + if (!(OCTEON_IS_MODEL(OCTEON_CN31XX))) + cvmx_warn("CVMX_DFA_DDR2_CFG not supported on this chip\n"); + return CVMX_ADD_IO_SEG(0x0001180030000208ull); +} +#else +#define CVMX_DFA_DDR2_CFG (CVMX_ADD_IO_SEG(0x0001180030000208ull)) +#endif +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +#define CVMX_DFA_DDR2_COMP CVMX_DFA_DDR2_COMP_FUNC() +static inline uint64_t CVMX_DFA_DDR2_COMP_FUNC(void) +{ + if (!(OCTEON_IS_MODEL(OCTEON_CN31XX))) + cvmx_warn("CVMX_DFA_DDR2_COMP not supported on this chip\n"); + return CVMX_ADD_IO_SEG(0x0001180030000090ull); +} +#else +#define CVMX_DFA_DDR2_COMP (CVMX_ADD_IO_SEG(0x0001180030000090ull)) +#endif +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +#define CVMX_DFA_DDR2_EMRS CVMX_DFA_DDR2_EMRS_FUNC() +static inline uint64_t CVMX_DFA_DDR2_EMRS_FUNC(void) +{ + if (!(OCTEON_IS_MODEL(OCTEON_CN31XX))) + cvmx_warn("CVMX_DFA_DDR2_EMRS not supported on this chip\n"); + return CVMX_ADD_IO_SEG(0x0001180030000268ull); +} +#else +#define CVMX_DFA_DDR2_EMRS (CVMX_ADD_IO_SEG(0x0001180030000268ull)) +#endif +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +#define CVMX_DFA_DDR2_FCNT CVMX_DFA_DDR2_FCNT_FUNC() +static inline uint64_t CVMX_DFA_DDR2_FCNT_FUNC(void) +{ + if (!(OCTEON_IS_MODEL(OCTEON_CN31XX))) + cvmx_warn("CVMX_DFA_DDR2_FCNT not supported on this chip\n"); + return CVMX_ADD_IO_SEG(0x0001180030000078ull); +} +#else +#define CVMX_DFA_DDR2_FCNT (CVMX_ADD_IO_SEG(0x0001180030000078ull)) +#endif +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +#define CVMX_DFA_DDR2_MRS CVMX_DFA_DDR2_MRS_FUNC() +static inline uint64_t CVMX_DFA_DDR2_MRS_FUNC(void) +{ + if (!(OCTEON_IS_MODEL(OCTEON_CN31XX))) + cvmx_warn("CVMX_DFA_DDR2_MRS not supported on this chip\n"); + return CVMX_ADD_IO_SEG(0x0001180030000260ull); +} +#else +#define CVMX_DFA_DDR2_MRS (CVMX_ADD_IO_SEG(0x0001180030000260ull)) +#endif +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +#define CVMX_DFA_DDR2_OPT CVMX_DFA_DDR2_OPT_FUNC() +static inline uint64_t CVMX_DFA_DDR2_OPT_FUNC(void) +{ + if (!(OCTEON_IS_MODEL(OCTEON_CN31XX))) + cvmx_warn("CVMX_DFA_DDR2_OPT not supported on this chip\n"); + return CVMX_ADD_IO_SEG(0x0001180030000070ull); +} +#else +#define CVMX_DFA_DDR2_OPT (CVMX_ADD_IO_SEG(0x0001180030000070ull)) +#endif +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +#define CVMX_DFA_DDR2_PLL CVMX_DFA_DDR2_PLL_FUNC() +static inline uint64_t CVMX_DFA_DDR2_PLL_FUNC(void) +{ + if (!(OCTEON_IS_MODEL(OCTEON_CN31XX))) + cvmx_warn("CVMX_DFA_DDR2_PLL not supported on this chip\n"); + return CVMX_ADD_IO_SEG(0x0001180030000088ull); +} +#else +#define CVMX_DFA_DDR2_PLL (CVMX_ADD_IO_SEG(0x0001180030000088ull)) +#endif +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +#define CVMX_DFA_DDR2_TMG CVMX_DFA_DDR2_TMG_FUNC() +static inline uint64_t CVMX_DFA_DDR2_TMG_FUNC(void) +{ + if (!(OCTEON_IS_MODEL(OCTEON_CN31XX))) + cvmx_warn("CVMX_DFA_DDR2_TMG not supported on this chip\n"); + return CVMX_ADD_IO_SEG(0x0001180030000218ull); +} +#else +#define CVMX_DFA_DDR2_TMG (CVMX_ADD_IO_SEG(0x0001180030000218ull)) +#endif +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +#define CVMX_DFA_DEBUG0 CVMX_DFA_DEBUG0_FUNC() +static inline uint64_t CVMX_DFA_DEBUG0_FUNC(void) +{ + if (!(OCTEON_IS_MODEL(OCTEON_CN63XX))) + cvmx_warn("CVMX_DFA_DEBUG0 not supported on this chip\n"); + return CVMX_ADD_IO_SEG(0x0001180037000040ull); +} +#else +#define CVMX_DFA_DEBUG0 (CVMX_ADD_IO_SEG(0x0001180037000040ull)) +#endif +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +#define CVMX_DFA_DEBUG1 CVMX_DFA_DEBUG1_FUNC() +static inline uint64_t CVMX_DFA_DEBUG1_FUNC(void) +{ + if (!(OCTEON_IS_MODEL(OCTEON_CN63XX))) + cvmx_warn("CVMX_DFA_DEBUG1 not supported on this chip\n"); + return CVMX_ADD_IO_SEG(0x0001180037000048ull); +} +#else +#define CVMX_DFA_DEBUG1 (CVMX_ADD_IO_SEG(0x0001180037000048ull)) +#endif +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +#define CVMX_DFA_DEBUG2 CVMX_DFA_DEBUG2_FUNC() +static inline uint64_t CVMX_DFA_DEBUG2_FUNC(void) +{ + if (!(OCTEON_IS_MODEL(OCTEON_CN63XX))) + cvmx_warn("CVMX_DFA_DEBUG2 not supported on this chip\n"); + return CVMX_ADD_IO_SEG(0x0001180037000050ull); +} +#else +#define CVMX_DFA_DEBUG2 (CVMX_ADD_IO_SEG(0x0001180037000050ull)) +#endif +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +#define CVMX_DFA_DEBUG3 CVMX_DFA_DEBUG3_FUNC() +static inline uint64_t CVMX_DFA_DEBUG3_FUNC(void) +{ + if (!(OCTEON_IS_MODEL(OCTEON_CN63XX))) + cvmx_warn("CVMX_DFA_DEBUG3 not supported on this chip\n"); + return CVMX_ADD_IO_SEG(0x0001180037000058ull); +} +#else +#define CVMX_DFA_DEBUG3 (CVMX_ADD_IO_SEG(0x0001180037000058ull)) +#endif +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +#define CVMX_DFA_DIFCTL CVMX_DFA_DIFCTL_FUNC() +static inline uint64_t CVMX_DFA_DIFCTL_FUNC(void) +{ + if (!(OCTEON_IS_MODEL(OCTEON_CN31XX) || OCTEON_IS_MODEL(OCTEON_CN38XX) || OCTEON_IS_MODEL(OCTEON_CN58XX) || OCTEON_IS_MODEL(OCTEON_CN63XX))) + cvmx_warn("CVMX_DFA_DIFCTL not supported on this chip\n"); + return CVMX_ADD_IO_SEG(0x0001370600000000ull); +} +#else +#define CVMX_DFA_DIFCTL (CVMX_ADD_IO_SEG(0x0001370600000000ull)) +#endif +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +#define CVMX_DFA_DIFRDPTR CVMX_DFA_DIFRDPTR_FUNC() +static inline uint64_t CVMX_DFA_DIFRDPTR_FUNC(void) +{ + if (!(OCTEON_IS_MODEL(OCTEON_CN31XX) || OCTEON_IS_MODEL(OCTEON_CN38XX) || OCTEON_IS_MODEL(OCTEON_CN58XX) || OCTEON_IS_MODEL(OCTEON_CN63XX))) + cvmx_warn("CVMX_DFA_DIFRDPTR not supported on this chip\n"); + return CVMX_ADD_IO_SEG(0x0001370200000000ull); +} +#else +#define CVMX_DFA_DIFRDPTR (CVMX_ADD_IO_SEG(0x0001370200000000ull)) +#endif +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +#define CVMX_DFA_DTCFADR CVMX_DFA_DTCFADR_FUNC() +static inline uint64_t CVMX_DFA_DTCFADR_FUNC(void) +{ + if (!(OCTEON_IS_MODEL(OCTEON_CN63XX))) + cvmx_warn("CVMX_DFA_DTCFADR not supported on this chip\n"); + return CVMX_ADD_IO_SEG(0x0001180037000060ull); +} +#else +#define CVMX_DFA_DTCFADR (CVMX_ADD_IO_SEG(0x0001180037000060ull)) +#endif +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +#define CVMX_DFA_ECLKCFG CVMX_DFA_ECLKCFG_FUNC() +static inline uint64_t CVMX_DFA_ECLKCFG_FUNC(void) +{ + if (!(OCTEON_IS_MODEL(OCTEON_CN31XX))) + cvmx_warn("CVMX_DFA_ECLKCFG not supported on this chip\n"); + return CVMX_ADD_IO_SEG(0x0001180030000200ull); +} +#else +#define CVMX_DFA_ECLKCFG (CVMX_ADD_IO_SEG(0x0001180030000200ull)) +#endif +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +#define CVMX_DFA_ERR CVMX_DFA_ERR_FUNC() +static inline uint64_t CVMX_DFA_ERR_FUNC(void) +{ + if (!(OCTEON_IS_MODEL(OCTEON_CN31XX) || OCTEON_IS_MODEL(OCTEON_CN38XX) || OCTEON_IS_MODEL(OCTEON_CN58XX))) + cvmx_warn("CVMX_DFA_ERR not supported on this chip\n"); + return CVMX_ADD_IO_SEG(0x0001180030000028ull); +} +#else +#define CVMX_DFA_ERR (CVMX_ADD_IO_SEG(0x0001180030000028ull)) +#endif +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +#define CVMX_DFA_ERROR CVMX_DFA_ERROR_FUNC() +static inline uint64_t CVMX_DFA_ERROR_FUNC(void) +{ + if (!(OCTEON_IS_MODEL(OCTEON_CN63XX))) + cvmx_warn("CVMX_DFA_ERROR not supported on this chip\n"); + return CVMX_ADD_IO_SEG(0x0001180037000028ull); +} +#else +#define CVMX_DFA_ERROR (CVMX_ADD_IO_SEG(0x0001180037000028ull)) +#endif +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +#define CVMX_DFA_INTMSK CVMX_DFA_INTMSK_FUNC() +static inline uint64_t CVMX_DFA_INTMSK_FUNC(void) +{ + if (!(OCTEON_IS_MODEL(OCTEON_CN63XX))) + cvmx_warn("CVMX_DFA_INTMSK not supported on this chip\n"); + return CVMX_ADD_IO_SEG(0x0001180037000030ull); +} +#else +#define CVMX_DFA_INTMSK (CVMX_ADD_IO_SEG(0x0001180037000030ull)) +#endif +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +#define CVMX_DFA_MEMCFG0 CVMX_DFA_MEMCFG0_FUNC() +static inline uint64_t CVMX_DFA_MEMCFG0_FUNC(void) +{ + if (!(OCTEON_IS_MODEL(OCTEON_CN38XX) || OCTEON_IS_MODEL(OCTEON_CN58XX))) + cvmx_warn("CVMX_DFA_MEMCFG0 not supported on this chip\n"); + return CVMX_ADD_IO_SEG(0x0001180030000008ull); +} +#else +#define CVMX_DFA_MEMCFG0 (CVMX_ADD_IO_SEG(0x0001180030000008ull)) +#endif +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +#define CVMX_DFA_MEMCFG1 CVMX_DFA_MEMCFG1_FUNC() +static inline uint64_t CVMX_DFA_MEMCFG1_FUNC(void) +{ + if (!(OCTEON_IS_MODEL(OCTEON_CN38XX) || OCTEON_IS_MODEL(OCTEON_CN58XX))) + cvmx_warn("CVMX_DFA_MEMCFG1 not supported on this chip\n"); + return CVMX_ADD_IO_SEG(0x0001180030000010ull); +} +#else +#define CVMX_DFA_MEMCFG1 (CVMX_ADD_IO_SEG(0x0001180030000010ull)) +#endif +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +#define CVMX_DFA_MEMCFG2 CVMX_DFA_MEMCFG2_FUNC() +static inline uint64_t CVMX_DFA_MEMCFG2_FUNC(void) +{ + if (!(OCTEON_IS_MODEL(OCTEON_CN38XX) || OCTEON_IS_MODEL(OCTEON_CN58XX))) + cvmx_warn("CVMX_DFA_MEMCFG2 not supported on this chip\n"); + return CVMX_ADD_IO_SEG(0x0001180030000060ull); +} +#else +#define CVMX_DFA_MEMCFG2 (CVMX_ADD_IO_SEG(0x0001180030000060ull)) +#endif +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +#define CVMX_DFA_MEMFADR CVMX_DFA_MEMFADR_FUNC() +static inline uint64_t CVMX_DFA_MEMFADR_FUNC(void) +{ + if (!(OCTEON_IS_MODEL(OCTEON_CN31XX) || OCTEON_IS_MODEL(OCTEON_CN38XX) || OCTEON_IS_MODEL(OCTEON_CN58XX))) + cvmx_warn("CVMX_DFA_MEMFADR not supported on this chip\n"); + return CVMX_ADD_IO_SEG(0x0001180030000030ull); +} +#else +#define CVMX_DFA_MEMFADR (CVMX_ADD_IO_SEG(0x0001180030000030ull)) +#endif +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +#define CVMX_DFA_MEMFCR CVMX_DFA_MEMFCR_FUNC() +static inline uint64_t CVMX_DFA_MEMFCR_FUNC(void) +{ + if (!(OCTEON_IS_MODEL(OCTEON_CN38XX) || OCTEON_IS_MODEL(OCTEON_CN58XX))) + cvmx_warn("CVMX_DFA_MEMFCR not supported on this chip\n"); + return CVMX_ADD_IO_SEG(0x0001180030000038ull); +} +#else +#define CVMX_DFA_MEMFCR (CVMX_ADD_IO_SEG(0x0001180030000038ull)) +#endif +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +#define CVMX_DFA_MEMHIDAT CVMX_DFA_MEMHIDAT_FUNC() +static inline uint64_t CVMX_DFA_MEMHIDAT_FUNC(void) +{ + if (!(OCTEON_IS_MODEL(OCTEON_CN63XX))) + cvmx_warn("CVMX_DFA_MEMHIDAT not supported on this chip\n"); + return CVMX_ADD_IO_SEG(0x0001370700000000ull); +} +#else +#define CVMX_DFA_MEMHIDAT (CVMX_ADD_IO_SEG(0x0001370700000000ull)) +#endif +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +#define CVMX_DFA_MEMRLD CVMX_DFA_MEMRLD_FUNC() +static inline uint64_t CVMX_DFA_MEMRLD_FUNC(void) +{ + if (!(OCTEON_IS_MODEL(OCTEON_CN38XX) || OCTEON_IS_MODEL(OCTEON_CN58XX))) + cvmx_warn("CVMX_DFA_MEMRLD not supported on this chip\n"); + return CVMX_ADD_IO_SEG(0x0001180030000018ull); +} +#else +#define CVMX_DFA_MEMRLD (CVMX_ADD_IO_SEG(0x0001180030000018ull)) +#endif +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +#define CVMX_DFA_NCBCTL CVMX_DFA_NCBCTL_FUNC() +static inline uint64_t CVMX_DFA_NCBCTL_FUNC(void) +{ + if (!(OCTEON_IS_MODEL(OCTEON_CN38XX) || OCTEON_IS_MODEL(OCTEON_CN58XX))) + cvmx_warn("CVMX_DFA_NCBCTL not supported on this chip\n"); + return CVMX_ADD_IO_SEG(0x0001180030000020ull); +} +#else +#define CVMX_DFA_NCBCTL (CVMX_ADD_IO_SEG(0x0001180030000020ull)) +#endif +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +#define CVMX_DFA_PFC0_CNT CVMX_DFA_PFC0_CNT_FUNC() +static inline uint64_t CVMX_DFA_PFC0_CNT_FUNC(void) +{ + if (!(OCTEON_IS_MODEL(OCTEON_CN63XX))) + cvmx_warn("CVMX_DFA_PFC0_CNT not supported on this chip\n"); + return CVMX_ADD_IO_SEG(0x0001180037000090ull); +} +#else +#define CVMX_DFA_PFC0_CNT (CVMX_ADD_IO_SEG(0x0001180037000090ull)) +#endif +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +#define CVMX_DFA_PFC0_CTL CVMX_DFA_PFC0_CTL_FUNC() +static inline uint64_t CVMX_DFA_PFC0_CTL_FUNC(void) +{ + if (!(OCTEON_IS_MODEL(OCTEON_CN63XX))) + cvmx_warn("CVMX_DFA_PFC0_CTL not supported on this chip\n"); + return CVMX_ADD_IO_SEG(0x0001180037000088ull); +} +#else +#define CVMX_DFA_PFC0_CTL (CVMX_ADD_IO_SEG(0x0001180037000088ull)) +#endif +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +#define CVMX_DFA_PFC1_CNT CVMX_DFA_PFC1_CNT_FUNC() +static inline uint64_t CVMX_DFA_PFC1_CNT_FUNC(void) +{ + if (!(OCTEON_IS_MODEL(OCTEON_CN63XX))) + cvmx_warn("CVMX_DFA_PFC1_CNT not supported on this chip\n"); + return CVMX_ADD_IO_SEG(0x00011800370000A0ull); +} +#else +#define CVMX_DFA_PFC1_CNT (CVMX_ADD_IO_SEG(0x00011800370000A0ull)) +#endif +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +#define CVMX_DFA_PFC1_CTL CVMX_DFA_PFC1_CTL_FUNC() +static inline uint64_t CVMX_DFA_PFC1_CTL_FUNC(void) +{ + if (!(OCTEON_IS_MODEL(OCTEON_CN63XX))) + cvmx_warn("CVMX_DFA_PFC1_CTL not supported on this chip\n"); + return CVMX_ADD_IO_SEG(0x0001180037000098ull); +} +#else +#define CVMX_DFA_PFC1_CTL (CVMX_ADD_IO_SEG(0x0001180037000098ull)) +#endif +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +#define CVMX_DFA_PFC2_CNT CVMX_DFA_PFC2_CNT_FUNC() +static inline uint64_t CVMX_DFA_PFC2_CNT_FUNC(void) +{ + if (!(OCTEON_IS_MODEL(OCTEON_CN63XX))) + cvmx_warn("CVMX_DFA_PFC2_CNT not supported on this chip\n"); + return CVMX_ADD_IO_SEG(0x00011800370000B0ull); +} +#else +#define CVMX_DFA_PFC2_CNT (CVMX_ADD_IO_SEG(0x00011800370000B0ull)) +#endif +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +#define CVMX_DFA_PFC2_CTL CVMX_DFA_PFC2_CTL_FUNC() +static inline uint64_t CVMX_DFA_PFC2_CTL_FUNC(void) +{ + if (!(OCTEON_IS_MODEL(OCTEON_CN63XX))) + cvmx_warn("CVMX_DFA_PFC2_CTL not supported on this chip\n"); + return CVMX_ADD_IO_SEG(0x00011800370000A8ull); +} +#else +#define CVMX_DFA_PFC2_CTL (CVMX_ADD_IO_SEG(0x00011800370000A8ull)) +#endif +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +#define CVMX_DFA_PFC3_CNT CVMX_DFA_PFC3_CNT_FUNC() +static inline uint64_t CVMX_DFA_PFC3_CNT_FUNC(void) +{ + if (!(OCTEON_IS_MODEL(OCTEON_CN63XX))) + cvmx_warn("CVMX_DFA_PFC3_CNT not supported on this chip\n"); + return CVMX_ADD_IO_SEG(0x00011800370000C0ull); +} +#else +#define CVMX_DFA_PFC3_CNT (CVMX_ADD_IO_SEG(0x00011800370000C0ull)) +#endif +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +#define CVMX_DFA_PFC3_CTL CVMX_DFA_PFC3_CTL_FUNC() +static inline uint64_t CVMX_DFA_PFC3_CTL_FUNC(void) +{ + if (!(OCTEON_IS_MODEL(OCTEON_CN63XX))) + cvmx_warn("CVMX_DFA_PFC3_CTL not supported on this chip\n"); + return CVMX_ADD_IO_SEG(0x00011800370000B8ull); +} +#else +#define CVMX_DFA_PFC3_CTL (CVMX_ADD_IO_SEG(0x00011800370000B8ull)) +#endif +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +#define CVMX_DFA_PFC_GCTL CVMX_DFA_PFC_GCTL_FUNC() +static inline uint64_t CVMX_DFA_PFC_GCTL_FUNC(void) +{ + if (!(OCTEON_IS_MODEL(OCTEON_CN63XX))) + cvmx_warn("CVMX_DFA_PFC_GCTL not supported on this chip\n"); + return CVMX_ADD_IO_SEG(0x0001180037000080ull); +} +#else +#define CVMX_DFA_PFC_GCTL (CVMX_ADD_IO_SEG(0x0001180037000080ull)) +#endif +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +#define CVMX_DFA_RODT_COMP_CTL CVMX_DFA_RODT_COMP_CTL_FUNC() +static inline uint64_t CVMX_DFA_RODT_COMP_CTL_FUNC(void) +{ + if (!(OCTEON_IS_MODEL(OCTEON_CN58XX))) + cvmx_warn("CVMX_DFA_RODT_COMP_CTL not supported on this chip\n"); + return CVMX_ADD_IO_SEG(0x0001180030000068ull); +} +#else +#define CVMX_DFA_RODT_COMP_CTL (CVMX_ADD_IO_SEG(0x0001180030000068ull)) +#endif +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +#define CVMX_DFA_SBD_DBG0 CVMX_DFA_SBD_DBG0_FUNC() +static inline uint64_t CVMX_DFA_SBD_DBG0_FUNC(void) +{ + if (!(OCTEON_IS_MODEL(OCTEON_CN31XX) || OCTEON_IS_MODEL(OCTEON_CN38XX) || OCTEON_IS_MODEL(OCTEON_CN58XX))) + cvmx_warn("CVMX_DFA_SBD_DBG0 not supported on this chip\n"); + return CVMX_ADD_IO_SEG(0x0001180030000040ull); +} +#else +#define CVMX_DFA_SBD_DBG0 (CVMX_ADD_IO_SEG(0x0001180030000040ull)) +#endif +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +#define CVMX_DFA_SBD_DBG1 CVMX_DFA_SBD_DBG1_FUNC() +static inline uint64_t CVMX_DFA_SBD_DBG1_FUNC(void) +{ + if (!(OCTEON_IS_MODEL(OCTEON_CN31XX) || OCTEON_IS_MODEL(OCTEON_CN38XX) || OCTEON_IS_MODEL(OCTEON_CN58XX))) + cvmx_warn("CVMX_DFA_SBD_DBG1 not supported on this chip\n"); + return CVMX_ADD_IO_SEG(0x0001180030000048ull); +} +#else +#define CVMX_DFA_SBD_DBG1 (CVMX_ADD_IO_SEG(0x0001180030000048ull)) +#endif +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +#define CVMX_DFA_SBD_DBG2 CVMX_DFA_SBD_DBG2_FUNC() +static inline uint64_t CVMX_DFA_SBD_DBG2_FUNC(void) +{ + if (!(OCTEON_IS_MODEL(OCTEON_CN31XX) || OCTEON_IS_MODEL(OCTEON_CN38XX) || OCTEON_IS_MODEL(OCTEON_CN58XX))) + cvmx_warn("CVMX_DFA_SBD_DBG2 not supported on this chip\n"); + return CVMX_ADD_IO_SEG(0x0001180030000050ull); +} +#else +#define CVMX_DFA_SBD_DBG2 (CVMX_ADD_IO_SEG(0x0001180030000050ull)) +#endif +#if CVMX_ENABLE_CSR_ADDRESS_CHECKING +#define CVMX_DFA_SBD_DBG3 CVMX_DFA_SBD_DBG3_FUNC() +static inline uint64_t CVMX_DFA_SBD_DBG3_FUNC(void) +{ + if (!(OCTEON_IS_MODEL(OCTEON_CN31XX) || OCTEON_IS_MODEL(OCTEON_CN38XX) || OCTEON_IS_MODEL(OCTEON_CN58XX))) + cvmx_warn("CVMX_DFA_SBD_DBG3 not supported on this chip\n"); + return CVMX_ADD_IO_SEG(0x0001180030000058ull); +} +#else +#define CVMX_DFA_SBD_DBG3 (CVMX_ADD_IO_SEG(0x0001180030000058ull)) +#endif + +/** + * cvmx_dfa_bist0 + * + * DFA_BIST0 = DFA Bist Status (per-DTC) + * + * Description: + */ +union cvmx_dfa_bist0 +{ + uint64_t u64; + struct cvmx_dfa_bist0_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_29_63 : 35; + uint64_t mwb : 1; /**< Bist Results for MWB RAM(s) + - 0: GOOD (or bist in progress/never run) + - 1: BAD */ + uint64_t reserved_25_27 : 3; + uint64_t gfb : 1; /**< Bist Results for GFB RAM(s) + - 0: GOOD (or bist in progress/never run) + - 1: BAD */ + uint64_t reserved_18_23 : 6; + uint64_t stx : 2; /**< Bist Results for STX RAM(s) + - 0: GOOD (or bist in progress/never run) + - 1: BAD */ + uint64_t reserved_10_15 : 6; + uint64_t dtx : 2; /**< Bist Results for DTX RAM(s) + - 0: GOOD (or bist in progress/never run) + - 1: BAD */ + uint64_t reserved_5_7 : 3; + uint64_t rdf : 1; /**< Bist Results for RWB[3:0] RAM(s) + - 0: GOOD (or bist in progress/never run) + - 1: BAD */ + uint64_t reserved_1_3 : 3; + uint64_t pdb : 1; /**< Bist Results for PDB RAM(s) + - 0: GOOD (or bist in progress/never run) + - 1: BAD */ +#else + uint64_t pdb : 1; + uint64_t reserved_1_3 : 3; + uint64_t rdf : 1; + uint64_t reserved_5_7 : 3; + uint64_t dtx : 2; + uint64_t reserved_10_15 : 6; + uint64_t stx : 2; + uint64_t reserved_18_23 : 6; + uint64_t gfb : 1; + uint64_t reserved_25_27 : 3; + uint64_t mwb : 1; + uint64_t reserved_29_63 : 35; +#endif + } s; + struct cvmx_dfa_bist0_s cn63xx; + struct cvmx_dfa_bist0_s cn63xxp1; +}; +typedef union cvmx_dfa_bist0 cvmx_dfa_bist0_t; + +/** + * cvmx_dfa_bist1 + * + * DFA_BIST1 = DFA Bist Status (Globals) + * + * Description: + */ +union cvmx_dfa_bist1 +{ + uint64_t u64; + struct cvmx_dfa_bist1_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_13_63 : 51; + uint64_t ram3 : 1; /**< Bist Results for RAM3 RAM + - 0: GOOD (or bist in progress/never run) + - 1: BAD */ + uint64_t ram2 : 1; /**< Bist Results for RAM2 RAM + - 0: GOOD (or bist in progress/never run) + - 1: BAD */ + uint64_t ram1 : 1; /**< Bist Results for RAM1 RAM + - 0: GOOD (or bist in progress/never run) + - 1: BAD */ + uint64_t crq : 1; /**< Bist Results for CRQ RAM + - 0: GOOD (or bist in progress/never run) + - 1: BAD */ + uint64_t gutv : 1; /**< Bist Results for GUTV RAM + - 0: GOOD (or bist in progress/never run) + - 1: BAD */ + uint64_t reserved_5_7 : 3; + uint64_t gutp : 1; /**< Bist Results for NCD RAM + - 0: GOOD (or bist in progress/never run) + - 1: BAD */ + uint64_t ncd : 1; /**< Bist Results for NCD RAM + - 0: GOOD (or bist in progress/never run) + - 1: BAD */ + uint64_t gif : 1; /**< Bist Results for GIF RAM + - 0: GOOD (or bist in progress/never run) + - 1: BAD */ + uint64_t gib : 1; /**< Bist Results for GIB RAM + - 0: GOOD (or bist in progress/never run) + - 1: BAD */ + uint64_t gfu : 1; /**< Bist Results for GFU RAM + - 0: GOOD (or bist in progress/never run) + - 1: BAD */ +#else + uint64_t gfu : 1; + uint64_t gib : 1; + uint64_t gif : 1; + uint64_t ncd : 1; + uint64_t gutp : 1; + uint64_t reserved_5_7 : 3; + uint64_t gutv : 1; + uint64_t crq : 1; + uint64_t ram1 : 1; + uint64_t ram2 : 1; + uint64_t ram3 : 1; + uint64_t reserved_13_63 : 51; +#endif + } s; + struct cvmx_dfa_bist1_s cn63xx; + struct cvmx_dfa_bist1_s cn63xxp1; +}; +typedef union cvmx_dfa_bist1 cvmx_dfa_bist1_t; + +/** + * cvmx_dfa_bst0 + * + * DFA_BST0 = DFA Bist Status + * + * Description: + */ +union cvmx_dfa_bst0 +{ + uint64_t u64; + struct cvmx_dfa_bst0_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_32_63 : 32; + uint64_t rdf : 16; /**< Bist Results for RDF[3:0] RAM(s) + - 0: GOOD (or bist in progress/never run) + - 1: BAD */ + uint64_t pdf : 16; /**< Bist Results for PDF[3:0] RAM(s) + - 0: GOOD (or bist in progress/never run) + - 1: BAD */ +#else + uint64_t pdf : 16; + uint64_t rdf : 16; + uint64_t reserved_32_63 : 32; +#endif + } s; + struct cvmx_dfa_bst0_s cn31xx; + struct cvmx_dfa_bst0_s cn38xx; + struct cvmx_dfa_bst0_s cn38xxp2; + struct cvmx_dfa_bst0_cn58xx + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_20_63 : 44; + uint64_t rdf : 4; /**< Bist Results for RDF[3:0] RAM(s) + - 0: GOOD (or bist in progress/never run) + - 1: BAD */ + uint64_t reserved_4_15 : 12; + uint64_t pdf : 4; /**< Bist Results for PDF[3:0] RAM(s) + - 0: GOOD (or bist in progress/never run) + - 1: BAD */ +#else + uint64_t pdf : 4; + uint64_t reserved_4_15 : 12; + uint64_t rdf : 4; + uint64_t reserved_20_63 : 44; +#endif + } cn58xx; + struct cvmx_dfa_bst0_cn58xx cn58xxp1; +}; +typedef union cvmx_dfa_bst0 cvmx_dfa_bst0_t; + +/** + * cvmx_dfa_bst1 + * + * DFA_BST1 = DFA Bist Status + * + * Description: + */ +union cvmx_dfa_bst1 +{ + uint64_t u64; + struct cvmx_dfa_bst1_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_23_63 : 41; + uint64_t crq : 1; /**< Bist Results for CRQ RAM + - 0: GOOD (or bist in progress/never run) + - 1: BAD */ + uint64_t ifu : 1; /**< Bist Results for IFU RAM + - 0: GOOD (or bist in progress/never run) + - 1: BAD */ + uint64_t gfu : 1; /**< Bist Results for GFU RAM + - 0: GOOD (or bist in progress/never run) + - 1: BAD */ + uint64_t drf : 1; /**< Bist Results for DRF RAM + - 0: GOOD (or bist in progress/never run) + - 1: BAD */ + uint64_t crf : 1; /**< Bist Results for CRF RAM + - 0: GOOD (or bist in progress/never run) + - 1: BAD */ + uint64_t p0_bwb : 1; /**< Bist Results for P0_BWB RAM + - 0: GOOD (or bist in progress/never run) + - 1: BAD */ + uint64_t p1_bwb : 1; /**< Bist Results for P1_BWB RAM + - 0: GOOD (or bist in progress/never run) + - 1: BAD */ + uint64_t p0_brf : 8; /**< Bist Results for P0_BRF RAM + - 0: GOOD (or bist in progress/never run) + - 1: BAD */ + uint64_t p1_brf : 8; /**< Bist Results for P1_BRF RAM + - 0: GOOD (or bist in progress/never run) + - 1: BAD */ +#else + uint64_t p1_brf : 8; + uint64_t p0_brf : 8; + uint64_t p1_bwb : 1; + uint64_t p0_bwb : 1; + uint64_t crf : 1; + uint64_t drf : 1; + uint64_t gfu : 1; + uint64_t ifu : 1; + uint64_t crq : 1; + uint64_t reserved_23_63 : 41; +#endif + } s; + struct cvmx_dfa_bst1_cn31xx + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_23_63 : 41; + uint64_t crq : 1; /**< Bist Results for CRQ RAM + - 0: GOOD (or bist in progress/never run) + - 1: BAD */ + uint64_t ifu : 1; /**< Bist Results for IFU RAM + - 0: GOOD (or bist in progress/never run) + - 1: BAD */ + uint64_t gfu : 1; /**< Bist Results for GFU RAM + - 0: GOOD (or bist in progress/never run) + - 1: BAD */ + uint64_t drf : 1; /**< Bist Results for DRF RAM + - 0: GOOD (or bist in progress/never run) + - 1: BAD */ + uint64_t crf : 1; /**< Bist Results for CRF RAM + - 0: GOOD (or bist in progress/never run) + - 1: BAD */ + uint64_t reserved_0_17 : 18; +#else + uint64_t reserved_0_17 : 18; + uint64_t crf : 1; + uint64_t drf : 1; + uint64_t gfu : 1; + uint64_t ifu : 1; + uint64_t crq : 1; + uint64_t reserved_23_63 : 41; +#endif + } cn31xx; + struct cvmx_dfa_bst1_s cn38xx; + struct cvmx_dfa_bst1_s cn38xxp2; + struct cvmx_dfa_bst1_cn58xx + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_23_63 : 41; + uint64_t crq : 1; /**< Bist Results for CRQ RAM + - 0: GOOD (or bist in progress/never run) + - 1: BAD */ + uint64_t ifu : 1; /**< Bist Results for IFU RAM + - 0: GOOD (or bist in progress/never run) + - 1: BAD */ + uint64_t gfu : 1; /**< Bist Results for GFU RAM + - 0: GOOD (or bist in progress/never run) + - 1: BAD */ + uint64_t reserved_19_19 : 1; + uint64_t crf : 1; /**< Bist Results for CRF RAM + - 0: GOOD (or bist in progress/never run) + - 1: BAD */ + uint64_t p0_bwb : 1; /**< Bist Results for P0_BWB RAM + - 0: GOOD (or bist in progress/never run) + - 1: BAD */ + uint64_t p1_bwb : 1; /**< Bist Results for P1_BWB RAM + - 0: GOOD (or bist in progress/never run) + - 1: BAD */ + uint64_t p0_brf : 8; /**< Bist Results for P0_BRF RAM + - 0: GOOD (or bist in progress/never run) + - 1: BAD */ + uint64_t p1_brf : 8; /**< Bist Results for P1_BRF RAM + - 0: GOOD (or bist in progress/never run) + - 1: BAD */ +#else + uint64_t p1_brf : 8; + uint64_t p0_brf : 8; + uint64_t p1_bwb : 1; + uint64_t p0_bwb : 1; + uint64_t crf : 1; + uint64_t reserved_19_19 : 1; + uint64_t gfu : 1; + uint64_t ifu : 1; + uint64_t crq : 1; + uint64_t reserved_23_63 : 41; +#endif + } cn58xx; + struct cvmx_dfa_bst1_cn58xx cn58xxp1; +}; +typedef union cvmx_dfa_bst1 cvmx_dfa_bst1_t; + +/** + * cvmx_dfa_cfg + * + * Specify the RSL base addresses for the block + * + * DFA_CFG = DFA Configuration + * + * Description: + */ +union cvmx_dfa_cfg +{ + uint64_t u64; + struct cvmx_dfa_cfg_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_4_63 : 60; + uint64_t nrpl_ena : 1; /**< When set, allows the per-node replication feature to be + enabled. + In 36-bit mode: The IWORD0[31:30]=SNREPL field AND + bits [21:20] of the Next Node ptr are used in generating + the next node address (see OCTEON HRM - DFA Chapter for + psuedo-code of DTE next node address generation). + NOTE: When NRPL_ENA=1 and IWORD0[TY]=1(36b mode), + (regardless of IWORD0[NRPLEN]), the Resultant Word1+ + [[47:44],[23:20]] = Next Node's [27:20] bits. This allows + SW to use the RESERVED bits of the final node for SW + caching. Also, if required, SW will use [22:21]=Node + Replication to re-start the same graph walk(if graph + walk prematurely terminated (ie: DATA_GONE). + In 18-bit mode: The IWORD0[31:30]=SNREPL field AND + bit [16:14] of the Next Node ptr are used in generating + the next node address (see OCTEON HRM - DFA Chapter for + psuedo-code of DTE next node address generation). + If (IWORD0[NREPLEN]=1 and DFA_CFG[NRPL_ENA]=1) [ + If next node ptr[16] is set [ + next node ptr[15:14] indicates the next node repl + next node ptr[13:0] indicates the position of the + node relative to the first normal node (i.e. + IWORD3[Msize] must be added to get the final node) + ] + else If next node ptr[16] is not set [ + next node ptr[15:0] indicates the next node id + next node repl = 0 + ] + ] + NOTE: For 18b node replication, MAX node space=64KB(2^16) + is used in detecting terminal node space(see HRM for full + description). + NOTE: The DFA graphs MUST BE built/written to DFA LLM memory + aware of the "per-node" replication. */ + uint64_t nxor_ena : 1; /**< When set, allows the DTE Instruction IWORD0[NXOREN] + to be used to enable/disable the per-node address 'scramble' + of the LLM address to lessen the effects of bank conflicts. + If IWORD0[NXOREN] is also set, then: + In 36-bit mode: The node_Id[7:0] 8-bit value is XORed + against the LLM address addr[9:2]. + In 18-bit mode: The node_id[6:0] 7-bit value is XORed + against the LLM address addr[8:2]. (note: we don't address + scramble outside the mode's node space). + NOTE: The DFA graphs MUST BE built/written to DFA LLM memory + aware of the "per-node" address scramble. + NOTE: The address 'scramble' ocurs for BOTH DFA LLM graph + read/write operations. */ + uint64_t gxor_ena : 1; /**< When set, the DTE Instruction IWORD0[GXOR] + field is used to 'scramble' the LLM address + to lessen the effects of bank conflicts. + In 36-bit mode: The GXOR[7:0] 8-bit value is XORed + against the LLM address addr[9:2]. + In 18-bit mode: GXOR[6:0] 7-bit value is XORed against + the LLM address addr[8:2]. (note: we don't address + scramble outside the mode's node space) + NOTE: The DFA graphs MUST BE built/written to DFA LLM memory + aware of the "per-graph" address scramble. + NOTE: The address 'scramble' ocurs for BOTH DFA LLM graph + read/write operations. */ + uint64_t sarb : 1; /**< DFA Source Arbiter Mode + Selects the arbitration mode used to select DFA + requests issued from either CP2 or the DTE (NCB-CSR + or DFA HW engine). + - 0: Fixed Priority [Highest=CP2, Lowest=DTE] + - 1: Round-Robin + NOTE: This should only be written to a different value + during power-on SW initialization. */ +#else + uint64_t sarb : 1; + uint64_t gxor_ena : 1; + uint64_t nxor_ena : 1; + uint64_t nrpl_ena : 1; + uint64_t reserved_4_63 : 60; +#endif + } s; + struct cvmx_dfa_cfg_s cn38xx; + struct cvmx_dfa_cfg_cn38xxp2 + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_1_63 : 63; + uint64_t sarb : 1; /**< DFA Source Arbiter Mode + Selects the arbitration mode used to select DFA + requests issued from either CP2 or the DTE (NCB-CSR + or DFA HW engine). + - 0: Fixed Priority [Highest=CP2, Lowest=DTE] + - 1: Round-Robin + NOTE: This should only be written to a different value + during power-on SW initialization. */ +#else + uint64_t sarb : 1; + uint64_t reserved_1_63 : 63; +#endif + } cn38xxp2; + struct cvmx_dfa_cfg_s cn58xx; + struct cvmx_dfa_cfg_s cn58xxp1; +}; +typedef union cvmx_dfa_cfg cvmx_dfa_cfg_t; + +/** + * cvmx_dfa_config + * + * Specify the RSL base addresses for the block + * + * DFA_CONFIG = DFA Configuration Register + * + * Description: + */ +union cvmx_dfa_config +{ + uint64_t u64; + struct cvmx_dfa_config_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_9_63 : 55; + uint64_t repl_ena : 1; /**< Replication Mode Enable + *** o63-P2 NEW *** + When set, enables replication mode performance enhancement + feature. This enables the DFA to communicate address + replication information during memory references to the DFM + (memory controller). This in turn is used by the DFM to support + graph data in multiple banks (or bank sets), so that the least + full bank can be selected to minimize the effects of DDR3 bank + conflicts (ie: tRC=row cycle time). + SWNOTE: Using this mode requires the DFA SW compiler and DFA + driver to be aware of the o63-P2 address replication changes. + This involves changes to the MLOAD/GWALK DFA instruction format + (see: IWORD2.SREPL), as well as changes to node arc and metadata + definitions which now support an additional REPL field. + When clear, replication mode is disabled, and DFA will interpret + o63-P1 DFA instructions and node-arc formats which DO NOT have + address replication information. */ + uint64_t clmskcrip : 4; /**< Cluster Cripple Mask + A one in each bit of the mask represents which DTE cluster to + cripple. + NOTE: o63 has only a single Cluster (therefore CLMSKCRIP[0] + is the only bit used. + o2 has 4 clusters, where all CLMSKCRIP mask bits are used. + SWNOTE: The MIO_FUS___DFA_CLMASK_CRIPPLE[3:0] fuse bits will + be forced into this register at reset. Any fuse bits that + contain '1' will be disallowed during a write and will always + be read as '1'. */ + uint64_t cldtecrip : 3; /**< Encoding which represents \#of DTEs to cripple for each + cluster. Typically DTE_CLCRIP=0 which enables all DTEs + within each cluster. However, when the DFA performance + counters are used, SW may want to limit the \#of DTEs + per cluster available, as there are only 4 parallel + performance counters. + DTE_CLCRIP | \#DTEs crippled(per cluster) + ------------+----------------------------- + 0 | 0 DTE[15:0]:ON + 1 | 1/2 DTE[15:8]:OFF /DTE[7:0]:ON + 2 | 1/4 DTE[15:12]:OFF /DTE[11:0]:ON + 3 | 3/4 DTE[15:4]:OFF /DTE[3:0]:ON + 4 | 1/8 DTE[15:14]:OFF /DTE[13:0]:ON + 5 | 5/8 DTE[15:6]:OFF /DTE[5:0]:ON + 6 | 3/8 DTE[15:10]:OFF /DTE[9:0]:ON + 7 | 7/8 DTE[15:2]:OFF /DTE[1:0]:ON + NOTE: Higher numbered DTEs are crippled first. For instance, + on o63 (with 16 DTEs/cluster), if DTE_CLCRIP=1(1/2), then + DTE#s [15:8] within the cluster are crippled and only + DTE#s [7:0] are available. + IMPNOTE: The encodings are done in such a way as to later + be used with fuses (for future o2 revisions which will disable + some \#of DTEs). Blowing a fuse has the effect that there will + always be fewer DTEs available. [ie: we never want a customer + to blow additional fuses to get more DTEs]. + SWNOTE: The MIO_FUS___DFA_NUMDTE_CRIPPLE[2:0] fuse bits will + be forced into this register at reset. Any fuse bits that + contain '1' will be disallowed during a write and will always + be read as '1'. */ + uint64_t dteclkdis : 1; /**< DFA Clock Disable Source + When SET, the DFA clocks for DTE(thread engine) + operation are disabled (to conserve overall chip clocking + power when the DFA function is not used). + NOTE: When SET, SW MUST NEVER issue NCB-Direct CSR + operations to the DFA (will result in NCB Bus Timeout + errors). + NOTE: This should only be written to a different value + during power-on SW initialization. + SWNOTE: The MIO_FUS___DFA_DTE_DISABLE fuse bit will + be forced into this register at reset. If the fuse bit + contains '1', writes to DTECLKDIS are disallowed and + will always be read as '1'. */ +#else + uint64_t dteclkdis : 1; + uint64_t cldtecrip : 3; + uint64_t clmskcrip : 4; + uint64_t repl_ena : 1; + uint64_t reserved_9_63 : 55; +#endif + } s; + struct cvmx_dfa_config_s cn63xx; + struct cvmx_dfa_config_cn63xxp1 + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_8_63 : 56; + uint64_t clmskcrip : 4; /**< Cluster Cripple Mask + A one in each bit of the mask represents which DTE cluster to + cripple. + NOTE: o63 has only a single Cluster (therefore CLMSKCRIP[0] + is the only bit used. + o2 has 4 clusters, where all CLMSKCRIP mask bits are used. + SWNOTE: The MIO_FUS___DFA_CLMASK_CRIPPLE[3:0] fuse bits will + be forced into this register at reset. Any fuse bits that + contain '1' will be disallowed during a write and will always + be read as '1'. */ + uint64_t cldtecrip : 3; /**< Encoding which represents \#of DTEs to cripple for each + cluster. Typically DTE_CLCRIP=0 which enables all DTEs + within each cluster. However, when the DFA performance + counters are used, SW may want to limit the \#of DTEs + per cluster available, as there are only 4 parallel + performance counters. + DTE_CLCRIP | \#DTEs crippled(per cluster) + ------------+----------------------------- + 0 | 0 DTE[15:0]:ON + 1 | 1/2 DTE[15:8]:OFF /DTE[7:0]:ON + 2 | 1/4 DTE[15:12]:OFF /DTE[11:0]:ON + 3 | 3/4 DTE[15:4]:OFF /DTE[3:0]:ON + 4 | 1/8 DTE[15:14]:OFF /DTE[13:0]:ON + 5 | 5/8 DTE[15:6]:OFF /DTE[5:0]:ON + 6 | 3/8 DTE[15:10]:OFF /DTE[9:0]:ON + 7 | 7/8 DTE[15:2]:OFF /DTE[1:0]:ON + NOTE: Higher numbered DTEs are crippled first. For instance, + on o63 (with 16 DTEs/cluster), if DTE_CLCRIP=1(1/2), then + DTE#s [15:8] within the cluster are crippled and only + DTE#s [7:0] are available. + IMPNOTE: The encodings are done in such a way as to later + be used with fuses (for future o2 revisions which will disable + some \#of DTEs). Blowing a fuse has the effect that there will + always be fewer DTEs available. [ie: we never want a customer + to blow additional fuses to get more DTEs]. + SWNOTE: The MIO_FUS___DFA_NUMDTE_CRIPPLE[2:0] fuse bits will + be forced into this register at reset. Any fuse bits that + contain '1' will be disallowed during a write and will always + be read as '1'. */ + uint64_t dteclkdis : 1; /**< DFA Clock Disable Source + When SET, the DFA clocks for DTE(thread engine) + operation are disabled (to conserve overall chip clocking + power when the DFA function is not used). + NOTE: When SET, SW MUST NEVER issue NCB-Direct CSR + operations to the DFA (will result in NCB Bus Timeout + errors). + NOTE: This should only be written to a different value + during power-on SW initialization. + SWNOTE: The MIO_FUS___DFA_DTE_DISABLE fuse bit will + be forced into this register at reset. If the fuse bit + contains '1', writes to DTECLKDIS are disallowed and + will always be read as '1'. */ +#else + uint64_t dteclkdis : 1; + uint64_t cldtecrip : 3; + uint64_t clmskcrip : 4; + uint64_t reserved_8_63 : 56; +#endif + } cn63xxp1; +}; +typedef union cvmx_dfa_config cvmx_dfa_config_t; + +/** + * cvmx_dfa_control + * + * DFA_CONTROL = DFA Control Register + * + * Description: + */ +union cvmx_dfa_control +{ + uint64_t u64; + struct cvmx_dfa_control_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_10_63 : 54; + uint64_t sbdnum : 4; /**< SBD Debug Entry# + *FOR INTERNAL USE ONLY* + DFA Scoreboard debug control + Selects which one of 8 DFA Scoreboard entries is + latched into the DFA_SBD_DBG[0-3] registers. */ + uint64_t sbdlck : 1; /**< DFA Scoreboard LOCK Strobe + *FOR INTERNAL USE ONLY* + DFA Scoreboard debug control + When written with a '1', the DFA Scoreboard Debug + registers (DFA_SBD_DBG[0-3]) are all locked down. + This allows SW to lock down the contents of the entire + SBD for a single instant in time. All subsequent reads + of the DFA scoreboard registers will return the data + from that instant in time. */ + uint64_t reserved_3_4 : 2; + uint64_t pmode : 1; /**< NCB-NRP Arbiter Mode + (0=Fixed Priority [LP=WQF,DFF,HP=RGF]/1=RR + NOTE: This should only be written to a different value + during power-on SW initialization. */ + uint64_t qmode : 1; /**< NCB-NRQ Arbiter Mode + (0=Fixed Priority [LP=IRF,RWF,PRF,HP=GRF]/1=RR + NOTE: This should only be written to a different value + during power-on SW initialization. */ + uint64_t imode : 1; /**< NCB-Inbound Arbiter + (0=FP [LP=NRQ,HP=NRP], 1=RR) + NOTE: This should only be written to a different value + during power-on SW initialization. */ +#else + uint64_t imode : 1; + uint64_t qmode : 1; + uint64_t pmode : 1; + uint64_t reserved_3_4 : 2; + uint64_t sbdlck : 1; + uint64_t sbdnum : 4; + uint64_t reserved_10_63 : 54; +#endif + } s; + struct cvmx_dfa_control_s cn63xx; + struct cvmx_dfa_control_s cn63xxp1; +}; +typedef union cvmx_dfa_control cvmx_dfa_control_t; + +/** + * cvmx_dfa_dbell + * + * DFA_DBELL = DFA Doorbell Register + * + * Description: + * NOTE: To write to the DFA_DBELL register, a device would issue an IOBST directed at the DFA with addr[34:33]=2'b00. + * To read the DFA_DBELL register, a device would issue an IOBLD64 directed at the DFA with addr[34:33]=2'b00. + * + * NOTE: If DFA_CONFIG[DTECLKDIS]=1 (DFA-DTE clocks disabled), reads/writes to the DFA_DBELL register do not take effect. + * NOTE: If FUSE[TBD]="DFA DTE disable" is blown, reads/writes to the DFA_DBELL register do not take effect. + */ +union cvmx_dfa_dbell +{ + uint64_t u64; + struct cvmx_dfa_dbell_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_20_63 : 44; + uint64_t dbell : 20; /**< Represents the cumulative total of pending + DFA instructions which SW has previously written + into the DFA Instruction FIFO (DIF) in main memory. + Each DFA instruction contains a fixed size 32B + instruction word which is executed by the DFA HW. + The DBL register can hold up to 1M-1 (2^20-1) + pending DFA instruction requests. + During a read (by SW), the 'most recent' contents + of the DFA_DBELL register are returned at the time + the NCB-INB bus is driven. + NOTE: Since DFA HW updates this register, its + contents are unpredictable in SW. */ +#else + uint64_t dbell : 20; + uint64_t reserved_20_63 : 44; +#endif + } s; + struct cvmx_dfa_dbell_s cn31xx; + struct cvmx_dfa_dbell_s cn38xx; + struct cvmx_dfa_dbell_s cn38xxp2; + struct cvmx_dfa_dbell_s cn58xx; + struct cvmx_dfa_dbell_s cn58xxp1; + struct cvmx_dfa_dbell_s cn63xx; + struct cvmx_dfa_dbell_s cn63xxp1; +}; +typedef union cvmx_dfa_dbell cvmx_dfa_dbell_t; + +/** + * cvmx_dfa_ddr2_addr + * + * DFA_DDR2_ADDR = DFA DDR2 fclk-domain Memory Address Config Register + * + * + * Description: The following registers are used to compose the DFA's DDR2 address into ROW/COL/BNK + * etc. + */ +union cvmx_dfa_ddr2_addr +{ + uint64_t u64; + struct cvmx_dfa_ddr2_addr_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_9_63 : 55; + uint64_t rdimm_ena : 1; /**< If there is a need to insert a register chip on the + system (the equivalent of a registered DIMM) to + provide better setup for the command and control bits + turn this mode on. + RDIMM_ENA + 0 Registered Mode OFF + 1 Registered Mode ON */ + uint64_t num_rnks : 2; /**< NUM_RNKS is programmed based on how many ranks there + are in the system. This needs to be programmed correctly + regardless of whether we are in RNK_LO mode or not. + NUM_RNKS \# of Ranks + 0 1 + 1 2 + 2 4 + 3 RESERVED */ + uint64_t rnk_lo : 1; /**< When this mode is turned on, consecutive addresses + outside the bank boundary + are programmed to go to different ranks in order to + minimize bank conflicts. It is useful in 4-bank DDR2 + parts based memory to extend out the \#physical banks + available and minimize bank conflicts. + On 8 bank ddr2 parts, this mode is not very useful + because this mode does come with + a penalty which is that every successive reads that + cross rank boundary will need a 1 cycle bubble + inserted to prevent bus turnaround conflicts. + RNK_LO + 0 - OFF + 1 - ON */ + uint64_t num_colrows : 3; /**< NUM_COLROWS is used to set the MSB of the ROW_ADDR + and the LSB of RANK address when not in RNK_LO mode. + Calculate the sum of \#COL and \#ROW and program the + controller appropriately + RANK_LSB \#COLs + \#ROWs + ------------------------------ + - 000: 22 + - 001: 23 + - 010: 24 + - 011: 25 + - 100-111: RESERVED */ + uint64_t num_cols : 2; /**< The Long word address that the controller receives + needs to be converted to Row, Col, Rank and Bank + addresses depending on the memory part's micro arch. + NUM_COL tells the controller how many colum bits + there are and the controller uses this info to map + the LSB of the row address + - 00: num_cols = 9 + - 01: num_cols = 10 + - 10: num_cols = 11 + - 11: RESERVED */ +#else + uint64_t num_cols : 2; + uint64_t num_colrows : 3; + uint64_t rnk_lo : 1; + uint64_t num_rnks : 2; + uint64_t rdimm_ena : 1; + uint64_t reserved_9_63 : 55; +#endif + } s; + struct cvmx_dfa_ddr2_addr_s cn31xx; +}; +typedef union cvmx_dfa_ddr2_addr cvmx_dfa_ddr2_addr_t; + +/** + * cvmx_dfa_ddr2_bus + * + * DFA_DDR2_BUS = DFA DDR Bus Activity Counter + * + * + * Description: This counter counts \# cycles that the memory bus is doing a read/write/command + * Useful to benchmark the bus utilization as a ratio of + * \#Cycles of Data Transfer/\#Cycles since init or + * \#Cycles of Data Transfer/\#Cycles that memory controller is active + */ +union cvmx_dfa_ddr2_bus +{ + uint64_t u64; + struct cvmx_dfa_ddr2_bus_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_47_63 : 17; + uint64_t bus_cnt : 47; /**< Counter counts the \# cycles of Data transfer */ +#else + uint64_t bus_cnt : 47; + uint64_t reserved_47_63 : 17; +#endif + } s; + struct cvmx_dfa_ddr2_bus_s cn31xx; +}; +typedef union cvmx_dfa_ddr2_bus cvmx_dfa_ddr2_bus_t; + +/** + * cvmx_dfa_ddr2_cfg + * + * DFA_DDR2_CFG = DFA DDR2 fclk-domain Memory Configuration \#0 Register + * + * Description: + */ +union cvmx_dfa_ddr2_cfg +{ + uint64_t u64; + struct cvmx_dfa_ddr2_cfg_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_41_63 : 23; + uint64_t trfc : 5; /**< Establishes tRFC(from DDR2 data sheets) in \# of + 4 fclk intervals. + General Equation: + TRFC(csr) = ROUNDUP[tRFC(data-sheet-ns)/(4 * fclk(ns))] + Example: + tRFC(data-sheet-ns) = 127.5ns + Operational Frequency: 533MHz DDR rate + [fclk=266MHz(3.75ns)] + Then: + TRFC(csr) = ROUNDUP[127.5ns/(4 * 3.75ns)] + = 9 */ + uint64_t mrs_pgm : 1; /**< When clear, the HW initialization sequence fixes + some of the *MRS register bit definitions. + EMRS: + A[14:13] = 0 RESERVED + A[12] = 0 Output Buffers Enabled (FIXED) + A[11] = 0 RDQS Disabled (FIXED) + A[10] = 0 DQSn Enabled (FIXED) + A[9:7] = 0 OCD Not supported (FIXED) + A[6] = 0 RTT Disabled (FIXED) + A[5:3]=DFA_DDR2_TMG[ADDLAT] (if DFA_DDR2_TMG[POCAS]=1) + Additive LATENCY (Programmable) + A[2]=0 RTT Disabled (FIXED) + A[1]=DFA_DDR2_TMG[DIC] (Programmable) + A[0] = 0 DLL Enabled (FIXED) + MRS: + A[14:13] = 0 RESERVED + A[12] = 0 Fast Active Power Down Mode (FIXED) + A[11:9] = DFA_DDR2_TMG[TWR](Programmable) + A[8] = 1 DLL Reset (FIXED) + A[7] = 0 Test Mode (FIXED) + A[6:4]=DFA_DDR2_TMG[CASLAT] CAS LATENCY (Programmable) + A[3] = 0 Burst Type(must be 0:Sequential) (FIXED) + A[2:0] = 2 Burst Length=4 (must be 0:Sequential) (FIXED) + When set, the HW initialization sequence sources + the DFA_DDR2_MRS, DFA_DDR2_EMRS registers which are + driven onto the DFA_A[] pins. (this allows the MRS/EMRS + fields to be completely programmable - however care + must be taken by software). + This mode is useful for customers who wish to: + 1) override the FIXED definitions(above), or + 2) Use a "clamshell mode" of operation where the + address bits(per rank) are swizzled on the + board to reduce stub lengths for optimal + frequency operation. + Use this in combination with DFA_DDR2_CFG[RNK_MSK] + to specify the INIT sequence for each of the 4 + supported ranks. */ + uint64_t fpip : 3; /**< Early Fill Programmable Pipe [\#fclks] + This field dictates the \#fclks prior to the arrival + of fill data(in fclk domain), to start the 'early' fill + command pipe (in the eclk domain) so as to minimize the + overall fill latency. + The programmable early fill command signal is synchronized + into the eclk domain, where it is used to pull data out of + asynchronous RAM as fast as possible. + NOTE: A value of FPIP=0 is the 'safest' setting and will + result in the early fill command pipe starting in the + same cycle as the fill data. + General Equation: (for FPIP) + FPIP <= MIN[6, (ROUND_DOWN[6/EF_RATIO] + 1)] + where: + EF_RATIO = ECLK/FCLK Ratio [eclk(MHz)/fclk(MHz)] + Example: FCLK=200MHz/ECLK=600MHz + FPIP = MIN[6, (ROUND_DOWN[6/(600/200))] + 1)] + FPIP <= 3 */ + uint64_t reserved_29_31 : 3; + uint64_t ref_int : 13; /**< Refresh Interval (represented in \#of fclk + increments). + Each refresh interval will generate a single + auto-refresh command sequence which implicitly targets + all banks within the device: + Example: For fclk=200MHz(5ns)/400MHz(DDR): + trefint(ns) = [tREFI(max)=3.9us = 3900ns [datasheet] + REF_INT = ROUND_DOWN[(trefint/fclk)] + = ROUND_DOWN[(3900ns/5ns)] + = 780 fclks (0x30c) + NOTE: This should only be written to a different value + during power-on SW initialization. */ + uint64_t reserved_14_15 : 2; + uint64_t tskw : 2; /**< Board Skew (represented in \#fclks) + Represents additional board skew of DQ/DQS. + - 00: board-skew = 0 fclk + - 01: board-skew = 1 fclk + - 10: board-skew = 2 fclk + - 11: board-skew = 3 fclk + NOTE: This should only be written to a different value + during power-on SW initialization. */ + uint64_t rnk_msk : 4; /**< Controls the CS_N[3:0] during a) a HW Initialization + sequence (triggered by DFA_DDR2_CFG[INIT]) or + b) during a normal refresh sequence. If + the RNK_MSK[x]=1, the corresponding CS_N[x] is driven. + NOTE: This is required for DRAM used in a + clamshell configuration, since the address lines + carry Mode Register write data that is unique + per rank(or clam). In a clamshell configuration, + the N3K DFA_A[x] pin may be tied into Clam#0's A[x] + and also into Clam#1's 'mirrored' address bit A[y] + (eg: Clam0 sees A[5] and Clam1 sees A[15]). + To support clamshell designs, SW must initiate + separate HW init sequences each unique rank address + mapping. Before each HW init sequence is triggered, + SW must preload the DFA_DDR2_MRS/EMRS registers with + the data that will be driven onto the A[14:0] wires + during the EMRS/MRS mode register write(s). + NOTE: After the final HW initialization sequence has + been triggered, SW must wait 64K eclks before writing + the RNK_MSK[3:0] field = 3'b1111 (so that CS_N[3:0] + is driven during refresh sequences in normal operation. + NOTE: This should only be written to a different value + during power-on SW initialization. */ + uint64_t silo_qc : 1; /**< Enables Quarter Cycle move of the Rd sampling window */ + uint64_t silo_hc : 1; /**< A combination of SILO_HC, SILO_QC and TSKW + specifies the positioning of the sampling strobe + when receiving read data back from DDR2. This is + done to offset any board trace induced delay on + the DQ and DQS which inherently makes these + asynchronous with respect to the internal clk of + controller. TSKW moves this sampling window by + integer cycles. SILO_QC and HC move this quarter + and half a cycle respectively. */ + uint64_t sil_lat : 2; /**< Silo Latency (\#fclks): On reads, determines how many + additional fclks to wait (on top of CASLAT+1) before + pulling data out of the padring silos used for time + domain boundary crossing. + NOTE: This should only be written to a different value + during power-on SW initialization. */ + uint64_t bprch : 1; /**< Tristate Enable (back porch) (\#fclks) + On reads, allows user to control the shape of the + tristate disable back porch for the DQ data bus. + This parameter is also very dependent on the + RW_DLY and WR_DLY parameters and care must be + taken when programming these parameters to avoid + data bus contention. Valid range [0..2] + NOTE: This should only be written to a different value + during power-on SW initialization. */ + uint64_t fprch : 1; /**< Tristate Enable (front porch) (\#fclks) + On reads, allows user to control the shape of the + tristate disable front porch for the DQ data bus. + This parameter is also very dependent on the + RW_DLY and WR_DLY parameters and care must be + taken when programming these parameters to avoid + data bus contention. Valid range [0..2] + NOTE: This should only be written to a different value + during power-on SW initialization. */ + uint64_t init : 1; /**< When a '1' is written (and the previous value was '0'), + the HW init sequence(s) for the LLM Memory Port is + initiated. + NOTE: To initialize memory, SW must: + 1) Enable memory port + a) PRTENA=1 + 2) Wait 200us (to ensure a stable clock + to the DDR2) - as per DDR2 spec. + 3) Write a '1' to the INIT which + will initiate a hardware initialization + sequence. + NOTE: After writing a '1', SW must wait 64K eclk + cycles to ensure the HW init sequence has completed + before writing to ANY of the DFA_DDR2* registers. + NOTE: This should only be written to a different value + during power-on SW initialization. */ + uint64_t prtena : 1; /**< Enable DFA Memory + When enabled, this bit lets N3K be the default + driver for DFA-LLM memory port. */ +#else + uint64_t prtena : 1; + uint64_t init : 1; + uint64_t fprch : 1; + uint64_t bprch : 1; + uint64_t sil_lat : 2; + uint64_t silo_hc : 1; + uint64_t silo_qc : 1; + uint64_t rnk_msk : 4; + uint64_t tskw : 2; + uint64_t reserved_14_15 : 2; + uint64_t ref_int : 13; + uint64_t reserved_29_31 : 3; + uint64_t fpip : 3; + uint64_t mrs_pgm : 1; + uint64_t trfc : 5; + uint64_t reserved_41_63 : 23; +#endif + } s; + struct cvmx_dfa_ddr2_cfg_s cn31xx; +}; +typedef union cvmx_dfa_ddr2_cfg cvmx_dfa_ddr2_cfg_t; + +/** + * cvmx_dfa_ddr2_comp + * + * DFA_DDR2_COMP = DFA DDR2 I/O PVT Compensation Configuration + * + * + * Description: The following are registers to program the DDR2 PLL and DLL + */ +union cvmx_dfa_ddr2_comp +{ + uint64_t u64; + struct cvmx_dfa_ddr2_comp_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t dfa__pctl : 4; /**< DFA DDR pctl from compensation circuit + Internal DBG only */ + uint64_t dfa__nctl : 4; /**< DFA DDR nctl from compensation circuit + Internal DBG only */ + uint64_t reserved_9_55 : 47; + uint64_t pctl_csr : 4; /**< Compensation control bits */ + uint64_t nctl_csr : 4; /**< Compensation control bits */ + uint64_t comp_bypass : 1; /**< Compensation Bypass */ +#else + uint64_t comp_bypass : 1; + uint64_t nctl_csr : 4; + uint64_t pctl_csr : 4; + uint64_t reserved_9_55 : 47; + uint64_t dfa__nctl : 4; + uint64_t dfa__pctl : 4; +#endif + } s; + struct cvmx_dfa_ddr2_comp_s cn31xx; +}; +typedef union cvmx_dfa_ddr2_comp cvmx_dfa_ddr2_comp_t; + +/** + * cvmx_dfa_ddr2_emrs + * + * DFA_DDR2_EMRS = DDR2 EMRS Register(s) EMRS1[14:0], EMRS1_OCD[14:0] + * Description: This register contains the data driven onto the Address[14:0] lines during DDR INIT + * To support Clamshelling (where N3K DFA_A[] pins are not 1:1 mapped to each clam(or rank), a HW init + * sequence is allowed on a "per-rank" basis. Care must be taken in the values programmed into these + * registers during the HW initialization sequence (see N3K specific restrictions in notes below). + * DFA_DDR2_CFG[MRS_PGM] must be 1 to support this feature. + * + * Notes: + * For DDR-II please consult your device's data sheet for further details: + * + */ +union cvmx_dfa_ddr2_emrs +{ + uint64_t u64; + struct cvmx_dfa_ddr2_emrs_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_31_63 : 33; + uint64_t emrs1_ocd : 15; /**< Memory Address[14:0] during "EMRS1 (OCD Calibration)" + step \#12a "EMRS OCD Default Command" A[9:7]=111 + of DDR2 HW initialization sequence. + (See JEDEC DDR2 specification (JESD79-2): + Power Up and initialization sequence). + A[14:13] = 0, RESERVED + A[12] = 0, Output Buffers Enabled + A[11] = 0, RDQS Disabled (we do not support RDQS) + A[10] = 0, DQSn Enabled + A[9:7] = 7, OCD Calibration Mode Default + A[6] = 0, ODT Disabled + A[5:3]=DFA_DDR2_TMG[ADDLAT] Additive LATENCY (Default 0) + A[2]=0 Termination Res RTT (ODT off Default) + [A6,A2] = 0 -> ODT Disabled + 1 -> 75 ohm; 2 -> 150 ohm; 3 - Reserved + A[1]=0 Normal Output Driver Imp mode + (1 - weak ie., 60% of normal drive strength) + A[0] = 0 DLL Enabled */ + uint64_t reserved_15_15 : 1; + uint64_t emrs1 : 15; /**< Memory Address[14:0] during: + a) Step \#7 "EMRS1 to enable DLL (A[0]=0)" + b) Step \#12b "EMRS OCD Calibration Mode Exit" + steps of DDR2 HW initialization sequence. + (See JEDEC DDR2 specification (JESD79-2): Power Up and + initialization sequence). + A[14:13] = 0, RESERVED + A[12] = 0, Output Buffers Enabled + A[11] = 0, RDQS Disabled (we do not support RDQS) + A[10] = 0, DQSn Enabled + A[9:7] = 0, OCD Calibration Mode exit/maintain + A[6] = 0, ODT Disabled + A[5:3]=DFA_DDR2_TMG[ADDLAT] Additive LATENCY (Default 0) + A[2]=0 Termination Res RTT (ODT off Default) + [A6,A2] = 0 -> ODT Disabled + 1 -> 75 ohm; 2 -> 150 ohm; 3 - Reserved + A[1]=0 Normal Output Driver Imp mode + (1 - weak ie., 60% of normal drive strength) + A[0] = 0 DLL Enabled */ +#else + uint64_t emrs1 : 15; + uint64_t reserved_15_15 : 1; + uint64_t emrs1_ocd : 15; + uint64_t reserved_31_63 : 33; +#endif + } s; + struct cvmx_dfa_ddr2_emrs_s cn31xx; +}; +typedef union cvmx_dfa_ddr2_emrs cvmx_dfa_ddr2_emrs_t; + +/** + * cvmx_dfa_ddr2_fcnt + * + * DFA_DDR2_FCNT = DFA FCLK Counter + * + * + * Description: This FCLK cycle counter gets going after memory has been initialized + */ +union cvmx_dfa_ddr2_fcnt +{ + uint64_t u64; + struct cvmx_dfa_ddr2_fcnt_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_47_63 : 17; + uint64_t fcyc_cnt : 47; /**< Counter counts FCLK cycles or \# cycles that the memory + controller has requests queued up depending on FCNT_MODE + If FCNT_MODE = 0, this counter counts the \# FCLK cycles + If FCNT_MODE = 1, this counter counts the \# cycles the + controller is active with memory requests. */ +#else + uint64_t fcyc_cnt : 47; + uint64_t reserved_47_63 : 17; +#endif + } s; + struct cvmx_dfa_ddr2_fcnt_s cn31xx; +}; +typedef union cvmx_dfa_ddr2_fcnt cvmx_dfa_ddr2_fcnt_t; + +/** + * cvmx_dfa_ddr2_mrs + * + * DFA_DDR2_MRS = DDR2 MRS Register(s) MRS_DLL[14:0], MRS[14:0] + * Description: This register contains the data driven onto the Address[14:0] lines during DDR INIT + * To support Clamshelling (where N3K DFA_A[] pins are not 1:1 mapped to each clam(or rank), a HW init + * sequence is allowed on a "per-rank" basis. Care must be taken in the values programmed into these + * registers during the HW initialization sequence (see N3K specific restrictions in notes below). + * DFA_DDR2_CFG[MRS_PGM] must be 1 to support this feature. + * + * Notes: + * For DDR-II please consult your device's data sheet for further details: + * + */ +union cvmx_dfa_ddr2_mrs +{ + uint64_t u64; + struct cvmx_dfa_ddr2_mrs_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_31_63 : 33; + uint64_t mrs : 15; /**< Memory Address[14:0] during "MRS without resetting + DLL A[8]=0" step of HW initialization sequence. + (See JEDEC DDR2 specification (JESD79-2): Power Up + and initialization sequence - Step \#11). + A[14:13] = 0, RESERVED + A[12] = 0, Fast Active Power Down Mode + A[11:9] = DFA_DDR2_TMG[TWR] + A[8] = 0, for DLL Reset + A[7] =0 Test Mode (must be 0 for normal operation) + A[6:4]=DFA_DDR2_TMG[CASLAT] CAS LATENCY (default 4) + A[3]=0 Burst Type(must be 0:Sequential) + A[2:0]=2 Burst Length=4(default) */ + uint64_t reserved_15_15 : 1; + uint64_t mrs_dll : 15; /**< Memory Address[14:0] during "MRS for DLL_RESET A[8]=1" + step of HW initialization sequence. + (See JEDEC DDR2 specification (JESD79-2): Power Up + and initialization sequence - Step \#8). + A[14:13] = 0, RESERVED + A[12] = 0, Fast Active Power Down Mode + A[11:9] = DFA_DDR2_TMG[TWR] + A[8] = 1, for DLL Reset + A[7] = 0 Test Mode (must be 0 for normal operation) + A[6:4]=DFA_DDR2_TMG[CASLAT] CAS LATENCY (default 4) + A[3] = 0 Burst Type(must be 0:Sequential) + A[2:0] = 2 Burst Length=4(default) */ +#else + uint64_t mrs_dll : 15; + uint64_t reserved_15_15 : 1; + uint64_t mrs : 15; + uint64_t reserved_31_63 : 33; +#endif + } s; + struct cvmx_dfa_ddr2_mrs_s cn31xx; +}; +typedef union cvmx_dfa_ddr2_mrs cvmx_dfa_ddr2_mrs_t; + +/** + * cvmx_dfa_ddr2_opt + * + * DFA_DDR2_OPT = DFA DDR2 Optimization Registers + * + * + * Description: The following are registers to tweak certain parameters to boost performance + */ +union cvmx_dfa_ddr2_opt +{ + uint64_t u64; + struct cvmx_dfa_ddr2_opt_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_10_63 : 54; + uint64_t max_read_batch : 5; /**< Maximum number of consecutive read to service before + allowing write to interrupt. */ + uint64_t max_write_batch : 5; /**< Maximum number of consecutive writes to service before + allowing reads to interrupt. */ +#else + uint64_t max_write_batch : 5; + uint64_t max_read_batch : 5; + uint64_t reserved_10_63 : 54; +#endif + } s; + struct cvmx_dfa_ddr2_opt_s cn31xx; +}; +typedef union cvmx_dfa_ddr2_opt cvmx_dfa_ddr2_opt_t; + +/** + * cvmx_dfa_ddr2_pll + * + * DFA_DDR2_PLL = DFA DDR2 PLL and DLL Configuration + * + * + * Description: The following are registers to program the DDR2 PLL and DLL + */ +union cvmx_dfa_ddr2_pll +{ + uint64_t u64; + struct cvmx_dfa_ddr2_pll_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t pll_setting : 17; /**< Internal Debug Use Only */ + uint64_t reserved_32_46 : 15; + uint64_t setting90 : 5; /**< Contains the setting of DDR DLL; Internal DBG only */ + uint64_t reserved_21_26 : 6; + uint64_t dll_setting : 5; /**< Contains the open loop setting value for the DDR90 delay + line. */ + uint64_t dll_byp : 1; /**< DLL Bypass. When set, the DDR90 DLL is bypassed and + the DLL behaves in Open Loop giving a fixed delay + set by DLL_SETTING */ + uint64_t qdll_ena : 1; /**< DDR Quad DLL Enable: A 0->1 transition on this bit after + erst deassertion will reset the DDR 90 DLL. Allow + 200 micro seconds for Lock before DDR Init. */ + uint64_t bw_ctl : 4; /**< Internal Use Only - for Debug */ + uint64_t bw_upd : 1; /**< Internal Use Only - for Debug */ + uint64_t pll_div2 : 1; /**< PLL Output is further divided by 2. Useful for slow + fclk frequencies where the PLL may be out of range. */ + uint64_t reserved_7_7 : 1; + uint64_t pll_ratio : 5; /**< Bits <6:2> sets the clk multiplication ratio + If the fclk frequency desired is less than 260MHz + (lower end saturation point of the pll), write 2x + the ratio desired in this register and set PLL_DIV2 */ + uint64_t pll_bypass : 1; /**< PLL Bypass. Uses the ref_clk without multiplication. */ + uint64_t pll_init : 1; /**< Need a 0 to 1 pulse on this CSR to get the DFA + Clk Generator Started. Write this register before + starting anything. Allow 200 uS for PLL Lock before + doing anything. */ +#else + uint64_t pll_init : 1; + uint64_t pll_bypass : 1; + uint64_t pll_ratio : 5; + uint64_t reserved_7_7 : 1; + uint64_t pll_div2 : 1; + uint64_t bw_upd : 1; + uint64_t bw_ctl : 4; + uint64_t qdll_ena : 1; + uint64_t dll_byp : 1; + uint64_t dll_setting : 5; + uint64_t reserved_21_26 : 6; + uint64_t setting90 : 5; + uint64_t reserved_32_46 : 15; + uint64_t pll_setting : 17; +#endif + } s; + struct cvmx_dfa_ddr2_pll_s cn31xx; +}; +typedef union cvmx_dfa_ddr2_pll cvmx_dfa_ddr2_pll_t; + +/** + * cvmx_dfa_ddr2_tmg + * + * DFA_DDR2_TMG = DFA DDR2 Memory Timing Config Register + * + * + * Description: The following are registers to program the DDR2 memory timing parameters. + */ +union cvmx_dfa_ddr2_tmg +{ + uint64_t u64; + struct cvmx_dfa_ddr2_tmg_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_47_63 : 17; + uint64_t fcnt_mode : 1; /**< If FCNT_MODE = 0, this counter counts the \# FCLK cycles + If FCNT_MODE = 1, this counter counts the \# cycles the + controller is active with memory requests. */ + uint64_t cnt_clr : 1; /**< Clears the FCLK Cyc & Bus Util counter */ + uint64_t cavmipo : 1; /**< RESERVED */ + uint64_t ctr_rst : 1; /**< Reset oneshot pulse for refresh counter & Perf counters + SW should first write this field to a one to clear + & then write to a zero for normal operation */ + uint64_t odt_rtt : 2; /**< DDR2 Termination Resistor Setting + These two bits are loaded into the RTT + portion of the EMRS register bits A6 & A2. If DDR2's + termination (for the memory's DQ/DQS/DM pads) is not + desired, set it to 00. If it is, chose between + 01 for 75 ohm and 10 for 150 ohm termination. + 00 = ODT Disabled + 01 = 75 ohm Termination + 10 = 150 ohm Termination + 11 = 50 ohm Termination */ + uint64_t dqsn_ena : 1; /**< For DDR-II Mode, DIC[1] is used to load into EMRS + bit 10 - DQSN Enable/Disable field. By default, we + program the DDR's to drive the DQSN also. Set it to + 1 if DQSN should be Hi-Z. + 0 - DQSN Enable + 1 - DQSN Disable */ + uint64_t dic : 1; /**< Drive Strength Control: + For DDR-I/II Mode, DIC[0] is + loaded into the Extended Mode Register (EMRS) A1 bit + during initialization. (see DDR-I data sheet EMRS + description) + 0 = Normal + 1 = Reduced */ + uint64_t r2r_slot : 1; /**< A 1 on this register will force the controller to + slot a bubble between every reads */ + uint64_t tfaw : 5; /**< tFAW - Cycles = RNDUP[tFAW(ns)/tcyc(ns)] - 1 + Four Access Window time. Relevant only in + 8-bank parts. + TFAW = 5'b0 for DDR2-4bank + TFAW = RNDUP[tFAW(ns)/tcyc(ns)] - 1 in DDR2-8bank */ + uint64_t twtr : 4; /**< tWTR Cycles = RNDUP[tWTR(ns)/tcyc(ns)] + Last Wr Data to Rd Command time. + (Represented in fclk cycles) + TYP=15ns + - 0000: RESERVED + - 0001: 1 + - ... + - 0111: 7 + - 1000-1111: RESERVED */ + uint64_t twr : 3; /**< DDR Write Recovery time (tWR). Last Wr Brst to Prech + This is not a direct encoding of the value. Its + programmed as below per DDR2 spec. The decimal number + on the right is RNDUP(tWR(ns) / clkFreq) + TYP=15ns + - 000: RESERVED + - 001: 2 + - 010: 3 + - 011: 4 + - 100: 5 + - 101: 6 + - 110-111: RESERVED */ + uint64_t trp : 4; /**< tRP Cycles = RNDUP[tRP(ns)/tcyc(ns)] + (Represented in fclk cycles) + TYP=15ns + - 0000: RESERVED + - 0001: 1 + - ... + - 0111: 7 + - 1000-1111: RESERVED + When using parts with 8 banks (DFA_CFG->MAX_BNK + is 1), load tRP cycles + 1 into this register. */ + uint64_t tras : 5; /**< tRAS Cycles = RNDUP[tRAS(ns)/tcyc(ns)] + (Represented in fclk cycles) + TYP=45ns + - 00000-0001: RESERVED + - 00010: 2 + - ... + - 10100: 20 + - 10101-11111: RESERVED */ + uint64_t trrd : 3; /**< tRRD cycles: ACT-ACT timing parameter for different + banks. (Represented in fclk cycles) + For DDR2, TYP=7.5ns + - 000: RESERVED + - 001: 1 tCYC + - 010: 2 tCYC + - 011: 3 tCYC + - 100: 4 tCYC + - 101: 5 tCYC + - 110-111: RESERVED */ + uint64_t trcd : 4; /**< tRCD Cycles = RNDUP[tRCD(ns)/tcyc(ns)] + (Represented in fclk cycles) + TYP=15ns + - 0000: RESERVED + - 0001: 2 (2 is the smallest value allowed) + - 0002: 2 + - ... + - 0111: 7 + - 1110-1111: RESERVED */ + uint64_t addlat : 3; /**< When in Posted CAS mode ADDLAT needs to be programmed + to tRCD-1 + ADDLAT \#additional latency cycles + 000 0 + 001 1 (tRCD = 2 fclk's) + 010 2 (tRCD = 3 fclk's) + 011 3 (tRCD = 4 fclk's) + 100 4 (tRCD = 5 fclk's) + 101 5 (tRCD = 6 fclk's) + 110 6 (tRCD = 7 fclk's) + 111 7 (tRCD = 8 fclk's) */ + uint64_t pocas : 1; /**< Posted CAS mode. When 1, we use DDR2's Posted CAS + feature. When using this mode, ADDLAT needs to be + programmed as well */ + uint64_t caslat : 3; /**< CAS Latency in \# fclk Cycles + CASLAT \# CAS latency cycles + 000 - 010 RESERVED + 011 3 + 100 4 + 101 5 + 110 6 + 111 7 */ + uint64_t tmrd : 2; /**< tMRD Cycles + (Represented in fclk tCYC) + For DDR2, its TYP 2*tCYC) + - 000: RESERVED + - 001: 1 + - 010: 2 + - 011: 3 */ + uint64_t ddr2t : 1; /**< When 2T mode is turned on, command signals are + setup a cycle ahead of when the CS is enabled + and kept for a total of 2 cycles. This mode is + enabled in higher speeds when there is difficulty + meeting setup. Performance could + be negatively affected in 2T mode */ +#else + uint64_t ddr2t : 1; + uint64_t tmrd : 2; + uint64_t caslat : 3; + uint64_t pocas : 1; + uint64_t addlat : 3; + uint64_t trcd : 4; + uint64_t trrd : 3; + uint64_t tras : 5; + uint64_t trp : 4; + uint64_t twr : 3; + uint64_t twtr : 4; + uint64_t tfaw : 5; + uint64_t r2r_slot : 1; + uint64_t dic : 1; + uint64_t dqsn_ena : 1; + uint64_t odt_rtt : 2; + uint64_t ctr_rst : 1; + uint64_t cavmipo : 1; + uint64_t cnt_clr : 1; + uint64_t fcnt_mode : 1; + uint64_t reserved_47_63 : 17; +#endif + } s; + struct cvmx_dfa_ddr2_tmg_s cn31xx; +}; +typedef union cvmx_dfa_ddr2_tmg cvmx_dfa_ddr2_tmg_t; + +/** + * cvmx_dfa_debug0 + * + * DFA_DEBUG0 = DFA Scoreboard Debug \#0 Register + * *FOR INTERNAL USE ONLY* + * Description: When the DFA_CONTROL[SBDLCK] bit is written '1', the contents of this register are locked down. + * Otherwise, the contents of this register are the 'active' contents of the DFA Scoreboard at the time of the + * CSR read. + * VERIFICATION NOTE: Read data is unsafe. X's(undefined data) can propagate (in the behavioral model) + * on the reads unless the DTE Engine specified by DFA_CONTROL[SBDNUM] has previously been assigned an + * instruction. + */ +union cvmx_dfa_debug0 +{ + uint64_t u64; + struct cvmx_dfa_debug0_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t sbd0 : 64; /**< DFA ScoreBoard \#0 Data + (DFA Scoreboard Debug) + [63:38] (26) rptr[28:3]: Result Base Pointer (QW-aligned) + [37:22] (16) Cumulative Result Write Counter (for HDR write) + [21] (1) Waiting for GRdRsp EOT + [20] (1) Waiting for GRdReq Issue (to NRQ) + [19] (1) GLPTR/GLCNT Valid + [18] (1) Completion Mark Detected + [17:15] (3) Completion Code [0=PDGONE/1=PERR/2=RFULL/3=TERM] + [14] (1) Completion Detected + [13] (1) Waiting for HDR RWrCmtRsp + [12] (1) Waiting for LAST RESULT RWrCmtRsp + [11] (1) Waiting for HDR RWrReq + [10] (1) Waiting for RWrReq + [9] (1) Waiting for WQWrReq issue + [8] (1) Waiting for PRdRsp EOT + [7] (1) Waiting for PRdReq Issue (to NRQ) + [6] (1) Packet Data Valid + [5] (1) WQVLD + [4] (1) WQ Done Point (either WQWrReq issued (for WQPTR<>0) OR HDR RWrCmtRsp) + [3] (1) Resultant write STF/P Mode + [2] (1) Packet Data LDT mode + [1] (1) Gather Mode + [0] (1) Valid */ +#else + uint64_t sbd0 : 64; +#endif + } s; + struct cvmx_dfa_debug0_s cn63xx; + struct cvmx_dfa_debug0_s cn63xxp1; +}; +typedef union cvmx_dfa_debug0 cvmx_dfa_debug0_t; + +/** + * cvmx_dfa_debug1 + * + * DFA_DEBUG1 = DFA Scoreboard Debug \#1 Register + * *FOR INTERNAL USE ONLY* + * Description: When the DFA_CONTROL[SBDLCK] bit is written '1', the contents of this register are locked down. + * Otherwise, the contents of this register are the 'active' contents of the DFA Scoreboard at the time of the + * CSR read. + * VERIFICATION NOTE: Read data is unsafe. X's(undefined data) can propagate (in the behavioral model) + * on the reads unless the DTE Engine specified by DFA_CONTROL[SBDNUM] has previously been assigned an + * instruction. + */ +union cvmx_dfa_debug1 +{ + uint64_t u64; + struct cvmx_dfa_debug1_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t sbd1 : 64; /**< DFA ScoreBoard \#1 Data + DFA Scoreboard Debug Data + [63:56] (8) UNUSED + [55:16] (40) Packet Data Pointer + [15:0] (16) Packet Data Counter */ +#else + uint64_t sbd1 : 64; +#endif + } s; + struct cvmx_dfa_debug1_s cn63xx; + struct cvmx_dfa_debug1_s cn63xxp1; +}; +typedef union cvmx_dfa_debug1 cvmx_dfa_debug1_t; + +/** + * cvmx_dfa_debug2 + * + * DFA_DEBUG2 = DFA Scoreboard Debug \#2 Register + * + * Description: When the DFA_CONTROL[SBDLCK] bit is written '1', the contents of this register are locked down. + * Otherwise, the contents of this register are the 'active' contents of the DFA Scoreboard at the time of the + * CSR read. + * VERIFICATION NOTE: Read data is unsafe. X's(undefined data) can propagate (in the behavioral model) + * on the reads unless the DTE Engine specified by DFA_CONTROL[SBDNUM] has previously been assigned an + * instruction. + */ +union cvmx_dfa_debug2 +{ + uint64_t u64; + struct cvmx_dfa_debug2_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t sbd2 : 64; /**< DFA ScoreBoard \#2 Data + [63:45] (19) UNUSED + [44:42] (3) Instruction Type + [41:5] (37) rwptr[39:3]: Result Write Pointer + [4:0] (5) prwcnt[4:0]: Pending Result Write Counter */ +#else + uint64_t sbd2 : 64; +#endif + } s; + struct cvmx_dfa_debug2_s cn63xx; + struct cvmx_dfa_debug2_s cn63xxp1; +}; +typedef union cvmx_dfa_debug2 cvmx_dfa_debug2_t; + +/** + * cvmx_dfa_debug3 + * + * DFA_DEBUG3 = DFA Scoreboard Debug \#3 Register + * + * Description: When the DFA_CONTROL[SBDLCK] bit is written '1', the contents of this register are locked down. + * Otherwise, the contents of this register are the 'active' contents of the DFA Scoreboard at the time of the + * CSR read. + * VERIFICATION NOTE: Read data is unsafe. X's(undefined data) can propagate (in the behavioral model) + * on the reads unless the DTE Engine specified by DFA_CONTROL[SBDNUM] has previously been assigned an + * instruction. + */ +union cvmx_dfa_debug3 +{ + uint64_t u64; + struct cvmx_dfa_debug3_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t sbd3 : 64; /**< DFA ScoreBoard \#3 Data + [63:52] (11) rptr[39:29]: Result Base Pointer (QW-aligned) + [52:16] (37) glptr[39:3]: Gather List Pointer + [15:0] (16) glcnt Gather List Counter */ +#else + uint64_t sbd3 : 64; +#endif + } s; + struct cvmx_dfa_debug3_s cn63xx; + struct cvmx_dfa_debug3_s cn63xxp1; +}; +typedef union cvmx_dfa_debug3 cvmx_dfa_debug3_t; + +/** + * cvmx_dfa_difctl + * + * DFA_DIFCTL = DFA Instruction FIFO (DIF) Control Register + * + * Description: + * NOTE: To write to the DFA_DIFCTL register, a device would issue an IOBST directed at the DFA with addr[34:32]=3'b110. + * To read the DFA_DIFCTL register, a device would issue an IOBLD64 directed at the DFA with addr[34:32]=3'b110. + * + * NOTE: This register is intended to ONLY be written once (at power-up). Any future writes could + * cause the DFA and FPA HW to become unpredictable. + * + * NOTE: If DFA_CONFIG[DTECLKDIS]=1 (DFA-DTE clocks disabled), reads/writes to the DFA_DIFCTL register do not take effect. + * NOTE: If FUSE[TBD]="DFA DTE disable" is blown, reads/writes to the DFA_DIFCTL register do not take effect. + */ +union cvmx_dfa_difctl +{ + uint64_t u64; + struct cvmx_dfa_difctl_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_20_63 : 44; + uint64_t dwbcnt : 8; /**< Represents the \# of cache lines in the instruction + buffer that may be dirty and should not be + written-back to memory when the instruction + chunk is returned to the Free Page list. + NOTE: Typically SW will want to mark all DFA + Instruction memory returned to the Free Page list + as DWB (Don't WriteBack), therefore SW should + seed this register as: + DFA_DIFCTL[DWBCNT] = (DFA_DIFCTL[SIZE] + 4)/4 */ + uint64_t pool : 3; /**< Represents the 3bit buffer pool-id used by DFA HW + when the DFA instruction chunk is recycled back + to the Free Page List maintained by the FPA HW + (once the DFA instruction has been issued). */ + uint64_t size : 9; /**< Represents the \# of 32B instructions contained + within each DFA instruction chunk. At Power-on, + SW will seed the SIZE register with a fixed + chunk-size. (Must be at least 3) + DFA HW uses this field to determine the size + of each DFA instruction chunk, in order to: + a) determine when to read the next DFA + instruction chunk pointer which is + written by SW at the end of the current + DFA instruction chunk (see DFA description + of next chunk buffer Ptr for format). + b) determine when a DFA instruction chunk + can be returned to the Free Page List + maintained by the FPA HW. */ +#else + uint64_t size : 9; + uint64_t pool : 3; + uint64_t dwbcnt : 8; + uint64_t reserved_20_63 : 44; +#endif + } s; + struct cvmx_dfa_difctl_s cn31xx; + struct cvmx_dfa_difctl_s cn38xx; + struct cvmx_dfa_difctl_s cn38xxp2; + struct cvmx_dfa_difctl_s cn58xx; + struct cvmx_dfa_difctl_s cn58xxp1; + struct cvmx_dfa_difctl_s cn63xx; + struct cvmx_dfa_difctl_s cn63xxp1; +}; +typedef union cvmx_dfa_difctl cvmx_dfa_difctl_t; + +/** + * cvmx_dfa_difrdptr + * + * DFA_DIFRDPTR = DFA Instruction FIFO (DIF) RDPTR Register + * + * Description: + * NOTE: To write to the DFA_DIFRDPTR register, a device would issue an IOBST directed at the DFA with addr[34:33]=2'b01. + * To read the DFA_DIFRDPTR register, a device would issue an IOBLD64 directed at the DFA with addr[34:33]=2'b01. + * + * NOTE: If DFA_CONFIG[DTECLKDIS]=1 (DFA-DTE clocks disabled), reads/writes to the DFA_DIFRDPTR register do not take effect. + * NOTE: If FUSE[TBD]="DFA DTE disable" is blown, reads/writes to the DFA_DIFRDPTR register do not take effect. + */ +union cvmx_dfa_difrdptr +{ + uint64_t u64; + struct cvmx_dfa_difrdptr_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_40_63 : 24; + uint64_t rdptr : 35; /**< Represents the 32B-aligned address of the current + instruction in the DFA Instruction FIFO in main + memory. The RDPTR must be seeded by software at + boot time, and is then maintained thereafter + by DFA HW. + During the seed write (by SW), RDPTR[6:5]=0, + since DFA instruction chunks must be 128B aligned. + During a read (by SW), the 'most recent' contents + of the RDPTR register are returned at the time + the NCB-INB bus is driven. + NOTE: Since DFA HW updates this register, its + contents are unpredictable in SW (unless + its guaranteed that no new DoorBell register + writes have occurred and the DoorBell register is + read as zero). */ + uint64_t reserved_0_4 : 5; +#else + uint64_t reserved_0_4 : 5; + uint64_t rdptr : 35; + uint64_t reserved_40_63 : 24; +#endif + } s; + struct cvmx_dfa_difrdptr_cn31xx + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_36_63 : 28; + uint64_t rdptr : 31; /**< Represents the 32B-aligned address of the current + instruction in the DFA Instruction FIFO in main + memory. The RDPTR must be seeded by software at + boot time, and is then maintained thereafter + by DFA HW. + During the seed write (by SW), RDPTR[6:5]=0, + since DFA instruction chunks must be 128B aligned. + During a read (by SW), the 'most recent' contents + of the RDPTR register are returned at the time + the NCB-INB bus is driven. + NOTE: Since DFA HW updates this register, its + contents are unpredictable in SW (unless + its guaranteed that no new DoorBell register + writes have occurred and the DoorBell register is + read as zero). */ + uint64_t reserved_0_4 : 5; +#else + uint64_t reserved_0_4 : 5; + uint64_t rdptr : 31; + uint64_t reserved_36_63 : 28; +#endif + } cn31xx; + struct cvmx_dfa_difrdptr_cn31xx cn38xx; + struct cvmx_dfa_difrdptr_cn31xx cn38xxp2; + struct cvmx_dfa_difrdptr_cn31xx cn58xx; + struct cvmx_dfa_difrdptr_cn31xx cn58xxp1; + struct cvmx_dfa_difrdptr_s cn63xx; + struct cvmx_dfa_difrdptr_s cn63xxp1; +}; +typedef union cvmx_dfa_difrdptr cvmx_dfa_difrdptr_t; + +/** + * cvmx_dfa_dtcfadr + * + * DFA_DTCFADR = DFA DTC Failing Address Register + * + * Description: DFA Node Cache Failing Address/Control Error Capture information + * This register contains useful information to help in isolating a Node Cache RAM failure. + * NOTE: The first detected PERR failure is captured in DFA_DTCFADR (locked down), until the + * corresponding PERR Interrupt is cleared by writing one (W1C). (see: DFA_ERR[DC0PERR[2:0]]). + */ +union cvmx_dfa_dtcfadr +{ + uint64_t u64; + struct cvmx_dfa_dtcfadr_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_44_63 : 20; + uint64_t ram3fadr : 12; /**< DFA RAM3 Failing Address + If DFA_ERR[DC0PERR<2>]=1, this field indicates the + failing RAM3 Address. The failing address is locked + down until the DC0PERR<2> W1C occurs. */ + uint64_t reserved_25_31 : 7; + uint64_t ram2fadr : 9; /**< DFA RAM2 Failing Address + If DFA_ERR[DC0PERR<1>]=1, this field indicates the + failing RAM2 Address. The failing address is locked + down until the DC0PERR<1> W1C occurs. */ + uint64_t reserved_14_15 : 2; + uint64_t ram1fadr : 14; /**< DFA RAM1 Failing Address + If DFA_ERR[DC0PERR<0>]=1, this field indicates the + failing RAM1 Address. The failing address is locked + down until the DC0PERR<0> W1C occurs. */ +#else + uint64_t ram1fadr : 14; + uint64_t reserved_14_15 : 2; + uint64_t ram2fadr : 9; + uint64_t reserved_25_31 : 7; + uint64_t ram3fadr : 12; + uint64_t reserved_44_63 : 20; +#endif + } s; + struct cvmx_dfa_dtcfadr_s cn63xx; + struct cvmx_dfa_dtcfadr_s cn63xxp1; +}; +typedef union cvmx_dfa_dtcfadr cvmx_dfa_dtcfadr_t; + +/** + * cvmx_dfa_eclkcfg + * + * Specify the RSL base addresses for the block + * + * DFA_ECLKCFG = DFA eclk-domain Configuration Registers + * + * Description: + */ +union cvmx_dfa_eclkcfg +{ + uint64_t u64; + struct cvmx_dfa_eclkcfg_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_19_63 : 45; + uint64_t sbdnum : 3; /**< SBD Debug Entry# + For internal use only. (DFA Scoreboard debug) + Selects which one of 8 DFA Scoreboard entries is + latched into the DFA_SBD_DBG[0-3] registers. */ + uint64_t reserved_15_15 : 1; + uint64_t sbdlck : 1; /**< DFA Scoreboard LOCK Strobe + For internal use only. (DFA Scoreboard debug) + When written with a '1', the DFA Scoreboard Debug + registers (DFA_SBD_DBG[0-3]) are all locked down. + This allows SW to lock down the contents of the entire + SBD for a single instant in time. All subsequent reads + of the DFA scoreboard registers will return the data + from that instant in time. */ + uint64_t dcmode : 1; /**< DRF-CRQ/DTE Arbiter Mode + DTE-DRF Arbiter (0=FP [LP=CRQ/HP=DTE],1=RR) + NOTE: This should only be written to a different value + during power-on SW initialization. */ + uint64_t dtmode : 1; /**< DRF-DTE Arbiter Mode + DTE-DRF Arbiter (0=FP [LP=DTE[15],...,HP=DTE[0]],1=RR) + NOTE: This should only be written to a different value + during power-on SW initialization. */ + uint64_t pmode : 1; /**< NCB-NRP Arbiter Mode + (0=Fixed Priority [LP=WQF,DFF,HP=RGF]/1=RR + NOTE: This should only be written to a different value + during power-on SW initialization. */ + uint64_t qmode : 1; /**< NCB-NRQ Arbiter Mode + (0=Fixed Priority [LP=IRF,RWF,PRF,HP=GRF]/1=RR + NOTE: This should only be written to a different value + during power-on SW initialization. */ + uint64_t imode : 1; /**< NCB-Inbound Arbiter + (0=FP [LP=NRQ,HP=NRP], 1=RR) + NOTE: This should only be written to a different value + during power-on SW initialization. */ + uint64_t sarb : 1; /**< DFA Source Arbiter Mode + Selects the arbitration mode used to select DFA requests + issued from either CP2 or the DTE (NCB-CSR or DFA HW engine). + - 0: Fixed Priority [Highest=CP2, Lowest=DTE] + - 1: Round-Robin + NOTE: This should only be written to a different value + during power-on SW initialization. */ + uint64_t reserved_3_7 : 5; + uint64_t dteclkdis : 1; /**< DFA DTE Clock Disable + When SET, the DFA clocks for DTE(thread engine) + operation are disabled. + NOTE: When SET, SW MUST NEVER issue ANY operations to + the DFA via the NCB Bus. All DFA Operations must be + issued solely through the CP2 interface. */ + uint64_t maxbnk : 1; /**< Maximum Banks per-device (used by the address mapper + when extracting address bits for the memory bank#. + - 0: 4 banks/device + - 1: 8 banks/device */ + uint64_t dfa_frstn : 1; /**< Hold this 0 until the DFA DDR PLL and DLL lock + and then write a 1. A 1 on this register deasserts + the internal frst_n. Refer to DFA_DDR2_PLL registers for more + startup information. + Startup sequence if DFA interface needs to be ON: + After valid power up, + Write DFA_DDR2_PLL-> PLL_RATIO & PLL_DIV2 & PLL_BYPASS + to the appropriate values + Wait a few cycles + Write a 1 DFA_DDR2_PLL -> PLL_INIT + Wait 100 microseconds + Write a 1 to DFA_DDR2_PLL -> QDLL_ENA + Wait 10 microseconds + Write a 1 to this register DFA_FRSTN to pull DFA out of + reset + Now the DFA block is ready to be initialized (follow the + DDR init sequence). */ +#else + uint64_t dfa_frstn : 1; + uint64_t maxbnk : 1; + uint64_t dteclkdis : 1; + uint64_t reserved_3_7 : 5; + uint64_t sarb : 1; + uint64_t imode : 1; + uint64_t qmode : 1; + uint64_t pmode : 1; + uint64_t dtmode : 1; + uint64_t dcmode : 1; + uint64_t sbdlck : 1; + uint64_t reserved_15_15 : 1; + uint64_t sbdnum : 3; + uint64_t reserved_19_63 : 45; +#endif + } s; + struct cvmx_dfa_eclkcfg_s cn31xx; +}; +typedef union cvmx_dfa_eclkcfg cvmx_dfa_eclkcfg_t; + +/** + * cvmx_dfa_err + * + * DFA_ERR = DFA ERROR Register + * + * Description: + */ +union cvmx_dfa_err +{ + uint64_t u64; + struct cvmx_dfa_err_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_33_63 : 31; + uint64_t dblina : 1; /**< Doorbell Overflow Interrupt Enable bit. + When set, doorbell overflow conditions are reported. */ + uint64_t dblovf : 1; /**< Doorbell Overflow detected - Status bit + When set, the 20b accumulated doorbell register + had overflowed (SW wrote too many doorbell requests). + If the DBLINA had previously been enabled(set), + an interrupt will be posted. Software can clear + the interrupt by writing a 1 to this register bit. + NOTE: Detection of a Doorbell Register overflow + is a catastrophic error which may leave the DFA + HW in an unrecoverable state. */ + uint64_t cp2pina : 1; /**< CP2 LW Mode Parity Error Interrupt Enable bit. + When set, all PP-generated LW Mode read + transactions which encounter a parity error (across + the 36b of data) are reported. */ + uint64_t cp2perr : 1; /**< PP-CP2 Parity Error Detected - Status bit + When set, a parity error had been detected for a + PP-generated LW Mode read transaction. + If the CP2PINA had previously been enabled(set), + an interrupt will be posted. Software can clear + the interrupt by writing a 1 to this register bit. + See also: DFA_MEMFADR CSR which contains more data + about the memory address/control to help isolate + the failure. */ + uint64_t cp2parena : 1; /**< CP2 LW Mode Parity Error Enable + When set, all PP-generated LW Mode read + transactions which encounter a parity error (across + the 36b of data) are reported. + NOTE: This signal must only be written to a different + value when there are no PP-CP2 transactions + (preferrably during power-on software initialization). */ + uint64_t dtepina : 1; /**< DTE Parity Error Interrupt Enable bit + (for 18b SIMPLE mode ONLY). + When set, all DTE-generated 18b SIMPLE Mode read + transactions which encounter a parity error (across + the 17b of data) are reported. */ + uint64_t dteperr : 1; /**< DTE Parity Error Detected (for 18b SIMPLE mode ONLY) + When set, all DTE-generated 18b SIMPLE Mode read + transactions which encounter a parity error (across + the 17b of data) are reported. */ + uint64_t dteparena : 1; /**< DTE Parity Error Enable (for 18b SIMPLE mode ONLY) + When set, all DTE-generated 18b SIMPLE Mode read + transactions which encounter a parity error (across + the 17b of data) are reported. + NOTE: This signal must only be written to a different + value when there are no DFA thread engines active + (preferrably during power-on). */ + uint64_t dtesyn : 7; /**< DTE 29b ECC Failing 6bit Syndrome + When DTESBE or DTEDBE are set, this field contains + the failing 7b ECC syndrome. */ + uint64_t dtedbina : 1; /**< DTE 29b Double Bit Error Interrupt Enable bit + When set, an interrupt is posted for any DTE-generated + 36b SIMPLE Mode read which encounters a double bit + error. */ + uint64_t dtesbina : 1; /**< DTE 29b Single Bit Error Interrupt Enable bit + When set, an interrupt is posted for any DTE-generated + 36b SIMPLE Mode read which encounters a single bit + error (which is also corrected). */ + uint64_t dtedbe : 1; /**< DTE 29b Double Bit Error Detected - Status bit + When set, a double bit error had been detected + for a DTE-generated 36b SIMPLE Mode read transaction. + The DTESYN contains the failing syndrome. + If the DTEDBINA had previously been enabled(set), + an interrupt will be posted. Software can clear + the interrupt by writing a 1 to this register bit. + See also: DFA_MEMFADR CSR which contains more data + about the memory address/control to help isolate + the failure. + NOTE: DTE-generated 18b SIMPLE Mode Read transactions + do not participate in ECC check/correct). */ + uint64_t dtesbe : 1; /**< DTE 29b Single Bit Error Corrected - Status bit + When set, a single bit error had been detected and + corrected for a DTE-generated 36b SIMPLE Mode read + transaction. + If the DTEDBE=0, then the DTESYN contains the + failing syndrome (used during correction). + NOTE: DTE-generated 18b SIMPLE Mode Read + transactions do not participate in ECC check/correct). + If the DTESBINA had previously been enabled(set), + an interrupt will be posted. Software can clear + the interrupt by writing a 1 to this register bit. + See also: DFA_MEMFADR CSR which contains more data + about the memory address/control to help isolate + the failure. */ + uint64_t dteeccena : 1; /**< DTE 29b ECC Enable (for 36b SIMPLE mode ONLY) + When set, 29b ECC is enabled on all DTE-generated + 36b SIMPLE Mode read transactions. + NOTE: This signal must only be written to a different + value when there are no DFA thread engines active + (preferrably during power-on software initialization). */ + uint64_t cp2syn : 8; /**< PP-CP2 QW ECC Failing 8bit Syndrome + When CP2SBE or CP2DBE are set, this field contains + the failing ECC 8b syndrome. + Refer to CP2ECCENA. */ + uint64_t cp2dbina : 1; /**< PP-CP2 Double Bit Error Interrupt Enable bit + When set, an interrupt is posted for any PP-generated + QW Mode read which encounters a double bit error. + Refer to CP2DBE. */ + uint64_t cp2sbina : 1; /**< PP-CP2 Single Bit Error Interrupt Enable bit + When set, an interrupt is posted for any PP-generated + QW Mode read which encounters a single bit error + (which is also corrected). + Refer to CP2SBE. */ + uint64_t cp2dbe : 1; /**< PP-CP2 Double Bit Error Detected - Status bit + When set, a double bit error had been detected + for a PP-generated QW Mode read transaction. + The CP2SYN contains the failing syndrome. + NOTE: PP-generated LW Mode Read transactions + do not participate in ECC check/correct). + Refer to CP2ECCENA. + If the CP2DBINA had previously been enabled(set), + an interrupt will be posted. Software can clear + the interrupt by writing a 1 to this register bit. + See also: DFA_MEMFADR CSR which contains more data + about the memory address/control to help isolate + the failure. */ + uint64_t cp2sbe : 1; /**< PP-CP2 Single Bit Error Corrected - Status bit + When set, a single bit error had been detected and + corrected for a PP-generated QW Mode read + transaction. + If the CP2DBE=0, then the CP2SYN contains the + failing syndrome (used during correction). + Refer to CP2ECCENA. + If the CP2SBINA had previously been enabled(set), + an interrupt will be posted. Software can clear + the interrupt by writing a 1 to this register bit. + See also: DFA_MEMFADR CSR which contains more data + about the memory address/control to help isolate + the failure. + NOTE: PP-generated LW Mode Read transactions + do not participate in ECC check/correct). */ + uint64_t cp2eccena : 1; /**< PP-CP2 QW ECC Enable (for QW Mode transactions) + When set, 8bit QW ECC is enabled on all PP-generated + QW Mode read transactions, CP2SBE and + CP2DBE may be set, and CP2SYN may be filled. + NOTE: This signal must only be written to a different + value when there are no PP-CP2 transactions + (preferrably during power-on software initialization). + NOTE: QW refers to a 64-bit LLM Load/Store (intiated + by a processor core). LW refers to a 36-bit load/store. */ +#else + uint64_t cp2eccena : 1; + uint64_t cp2sbe : 1; + uint64_t cp2dbe : 1; + uint64_t cp2sbina : 1; + uint64_t cp2dbina : 1; + uint64_t cp2syn : 8; + uint64_t dteeccena : 1; + uint64_t dtesbe : 1; + uint64_t dtedbe : 1; + uint64_t dtesbina : 1; + uint64_t dtedbina : 1; + uint64_t dtesyn : 7; + uint64_t dteparena : 1; + uint64_t dteperr : 1; + uint64_t dtepina : 1; + uint64_t cp2parena : 1; + uint64_t cp2perr : 1; + uint64_t cp2pina : 1; + uint64_t dblovf : 1; + uint64_t dblina : 1; + uint64_t reserved_33_63 : 31; +#endif + } s; + struct cvmx_dfa_err_s cn31xx; + struct cvmx_dfa_err_s cn38xx; + struct cvmx_dfa_err_s cn38xxp2; + struct cvmx_dfa_err_s cn58xx; + struct cvmx_dfa_err_s cn58xxp1; +}; +typedef union cvmx_dfa_err cvmx_dfa_err_t; + +/** + * cvmx_dfa_error + * + * DFA_ERROR = DFA ERROR Register + * + * Description: + */ +union cvmx_dfa_error +{ + uint64_t u64; + struct cvmx_dfa_error_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_17_63 : 47; + uint64_t cndrd : 1; /**< If DC0PERR[0]=1 indicating a RAM1 Parity error, + this additional bit further specifies that the + RAM1 parity error was detected during a CND-RD + (Cache Node Metadata Read). + + For CNDRD Parity Error, the previous CNA arc fetch + information is written to RWORD1+ as follows: + RWORD1+[NTYPE]=MNODE + RWORD1+[NDNID]=cna.ndnid + RWORD1+[NHMSK]=cna.hmsk + RWORD1+[NNPTR]=cna.nnptr[13:0] */ + uint64_t reserved_4_15 : 12; + uint64_t dc0perr : 3; /**< RAM[3:1] Parity Error Detected from Node Cluster \#0 + See also DFA_DTCFADR register which contains the + failing addresses for the internal node cache RAMs. */ + uint64_t dblovf : 1; /**< Doorbell Overflow detected - Status bit + When set, the 20b accumulated doorbell register + had overflowed (SW wrote too many doorbell requests). + If the DBLINA had previously been enabled(set), + an interrupt will be posted. Software can clear + the interrupt by writing a 1 to this register bit. + NOTE: Detection of a Doorbell Register overflow + is a catastrophic error which may leave the DFA + HW in an unrecoverable state. */ +#else + uint64_t dblovf : 1; + uint64_t dc0perr : 3; + uint64_t reserved_4_15 : 12; + uint64_t cndrd : 1; + uint64_t reserved_17_63 : 47; +#endif + } s; + struct cvmx_dfa_error_s cn63xx; + struct cvmx_dfa_error_s cn63xxp1; +}; +typedef union cvmx_dfa_error cvmx_dfa_error_t; + +/** + * cvmx_dfa_intmsk + * + * DFA_INTMSK = DFA ERROR Interrupt Mask Register + * + * Description: + */ +union cvmx_dfa_intmsk +{ + uint64_t u64; + struct cvmx_dfa_intmsk_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_4_63 : 60; + uint64_t dc0pena : 3; /**< RAM[3:1] Parity Error Enabled Node Cluster \#0 */ + uint64_t dblina : 1; /**< Doorbell Overflow Interrupt Enable bit. + When set, doorbell overflow conditions are reported. */ +#else + uint64_t dblina : 1; + uint64_t dc0pena : 3; + uint64_t reserved_4_63 : 60; +#endif + } s; + struct cvmx_dfa_intmsk_s cn63xx; + struct cvmx_dfa_intmsk_s cn63xxp1; +}; +typedef union cvmx_dfa_intmsk cvmx_dfa_intmsk_t; + +/** + * cvmx_dfa_memcfg0 + * + * DFA_MEMCFG0 = DFA Memory Configuration + * + * Description: + */ +union cvmx_dfa_memcfg0 +{ + uint64_t u64; + struct cvmx_dfa_memcfg0_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_32_63 : 32; + uint64_t rldqck90_rst : 1; /**< RLDCK90 and RLDQK90 DLL SW Reset + When written with a '1' the RLDCK90 and RLDQK90 DLL are + in soft-reset. */ + uint64_t rldck_rst : 1; /**< RLDCK Zero Delay DLL(Clock Generator) SW Reset + When written with a '1' the RLDCK zero delay DLL is in + soft-reset. */ + uint64_t clkdiv : 2; /**< RLDCLK Divisor Select + - 0: RLDx_CK_H/L = Core Clock /2 + - 1: RESERVED (must not be used) + - 2: RLDx_CK_H/L = Core Clock /3 + - 3: RLDx_CK_H/L = Core Clock /4 + The DFA LLM interface(s) are tied to the core clock + frequency through this programmable clock divisor. + Examples: + Core Clock(MHz) | DFA-LLM Clock(MHz) | CLKDIV + -----------------+--------------------+-------- + 800 | 400/(800-DDR) | /2 + 1000 | 333/(666-DDR) | /3 + 800 | 200/(400-DDR) | /4 + NOTE: This value MUST BE programmed BEFORE doing a + Hardware init sequence (see: DFA_MEMCFG0[INIT_Px] bits). */ + uint64_t lpp_ena : 1; /**< PP Linear Port Addressing Mode Enable + When enabled, PP-core LLM accesses to the lower-512MB + LLM address space are sent to the single DFA port + which is enabled. NOTE: If LPP_ENA=1, only + one DFA RLDRAM port may be enabled for RLDRAM accesses + (ie: ENA_P0 and ENA_P1 CAN NEVER BOTH be set). + PP-core LLM accesses to the upper-512MB LLM address + space are sent to the other 'disabled' DFA port. + SW RESTRICTION: If LPP_ENA=1, then only one DFA port + may be enabled for RLDRAM accesses (ie: ENA_P0 and + ENA_P1 CAN NEVER BOTH be set). + NOTE: This bit is used to allow PP-Core LLM accesses to a + disabled port, such that each port can be sequentially + addressed (ie: disable LW address interleaving). + Enabling this bit allows BOTH PORTs to be active and + sequentially addressable. The single port that is + enabled(ENA_Px) will respond to the low-512MB LLM address + space, and the other 'disabled' port will respond to the + high-512MB LLM address space. + Example usage: + - DFA RLD0 pins used for TCAM-FPGA(CP2 accesses) + - DFA RLD1 pins used for RLDRAM (DTE/CP2 accesses). + USAGE NOTE: + If LPP_ENA=1 and SW DOES NOT initialize the disabled port + (ie: INIT_Px=0->1), then refreshes and the HW init + sequence WILL NOT occur for the disabled port. + If LPP_ENA=1 and SW does initialize the disabled port + (INIT_Px=0->1 with ENA_Px=0), then refreshes and + the HW init sequence WILL occur to the disabled port. */ + uint64_t bunk_init : 2; /**< Controls the CS_N[1:0] during a) a HW Initialization + sequence (triggered by DFA_MEMCFG0[INIT_Px]) or + b) during a normal refresh sequence. If + the BNK_INIT[x]=1, the corresponding CS_N[x] is driven. + NOTE: This is required for DRAM used in a + clamshell configuration, since the address lines + carry Mode Register write data that is unique + per bunk(or clam). In a clamshell configuration, + The N3K A[x] pin may be tied into Clam#0's A[x] + and also into Clam#1's 'mirrored' address bit A[y] + (eg: Clam0 sees A[5] and Clam1 sees A[15]). + To support clamshell designs, SW must initiate + two separate HW init sequences for the two bunks + (or clams) . Before each HW init sequence is triggered, + SW must preload the DFA_MEMRLD[22:0] with the data + that will be driven onto the A[22:0] wires during + an MRS mode register write. + NOTE: After the final HW initialization sequence has + been triggered, SW must wait 64K eclks before writing + the BUNK_INIT[1:0] field = 3'b11 (so that CS_N[1:0] is + driven during refresh sequences in normal operation. + NOTE: This should only be written to a different value + during power-on SW initialization. */ + uint64_t init_p0 : 1; /**< When a '1' is written (and the previous value was '0'), + the HW init sequence(s) for Memory Port \#0 is + initiated. + NOTE: To initialize memory, SW must: + 1) Set up the DFA_MEMCFG0[CLKDIV] ratio for intended + RLDRAM operation. + [legal values 0: DIV2 2: DIV3 3: DIV4] + 2) Write a '1' into BOTH the DFA_MEM_CFG0[RLDCK_RST] + and DFA_MEM_CFG0[RLDQCK90_RST] field at + the SAME TIME. This step puts all three DLLs in + SW reset (RLDCK, RLDCK90, RLDQK90 DLLs). + 3) Write a '0' into the DFA_MEM_CFG0[RLDCK_RST] field. + This step takes the RLDCK DLL out of soft-reset so + that the DLL can generate the RLDx_CK_H/L clock pins. + 4) Wait 1ms (for RLDCK DLL to achieve lock) + 5) Write a '0' into DFA_MEM_CFG0[RLDQCK90_RST] field. + This step takes the RLDCK90 DLL AND RLDQK90 DLL out + of soft-reset. + 6) Wait 1ms (for RLDCK90/RLDQK90 DLLs to achieve lock) + 7) Enable memory port(s): ENA_P0=1/ENA_P1=1 + 8) Wait 100us (to ensure a stable clock + to the RLDRAMs) - as per RLDRAM spec. + - - - - - Hardware Initialization Sequence - - - - - + 9) Setup the DFA_MEMCFG0[BUNK_INIT] for the bunk(s) + intended to be initialized. + 10) Write a '1' to the corresponding INIT_Px which + will initiate a hardware initialization + sequence to that'specific' port. + 11) Wait (DFA_MEMCFG0[CLKDIV] * 32K) eclk cycles. + [to ensure the HW init sequence has completed + before writing to ANY of the DFA_MEM* registers] + - - - - - Hardware Initialization Sequence - - - - - + 12) Write the DFA_MEMCFG0[BUNK_INIT]=3 to enable + refreshes to BOTH bunks. + NOTE: In some cases (where the address wires are routed + differently between the front and back 'bunks'), + SW will need to use DFA_MEMCFG0[BUNK_INIT] bits to + control the Hardware initialization sequence for a + 'specific bunk'. In these cases, SW would setup the + BUNK_INIT and repeat Steps \#9-11 for each bunk/port. + NOTE: This should only be written to a different value + during power-on SW initialization. + NOTE: DFA Memory Port#0 corresponds to the Octeon + RLD0_* pins. */ + uint64_t init_p1 : 1; /**< When a '1' is written (and the previous value was '0'), + the HW init sequence(s) for Memory Port \#1 is + initiated. + NOTE: To initialize memory, SW must: + 1) Set up the DFA_MEMCFG0[CLKDIV] ratio for intended + RLDRAM operation. + [legal values 0: DIV2 2: DIV3 3: DIV4] + 2) Write a '1' into BOTH the DFA_MEM_CFG0[RLDCK_RST] + and DFA_MEM_CFG0[RLDQCK90_RST] field at + the SAME TIME. This step puts all three DLLs in + SW reset (RLDCK, RLDCK90, RLDQK90 DLLs). + 3) Write a '0' into the DFA_MEM_CFG0[RLDCK_RST] field. + This step takes the RLDCK DLL out of soft-reset so + that the DLL can generate the RLDx_CK_H/L clock pins. + 4) Wait 1ms (for RLDCK DLL to achieve lock) + 5) Write a '0' into DFA_MEM_CFG0[RLDQCK90_RST] field. + This step takes the RLDCK90 DLL AND RLDQK90 DLL out + of soft-reset. + 6) Wait 1ms (for RLDCK90/RLDQK90 DLLs to achieve lock) + 7) Enable memory port(s) ENA_P0=1/ENA_P1=1 + 8) Wait 100us (to ensure a stable clock + to the RLDRAMs) - as per RLDRAM spec. + - - - - - Hardware Initialization Sequence - - - - - + 9) Setup the DFA_MEMCFG0[BUNK_INIT] for the bunk(s) + intended to be initialized. + 10) Write a '1' to the corresponding INIT_Px which + will initiate a hardware initialization + sequence to that'specific' port. + 11) Wait (DFA_MEMCFG0[CLKDIV] * 32K) eclk cycles. + [to ensure the HW init sequence has completed + before writing to ANY of the DFA_MEM* registers] + - - - - - Hardware Initialization Sequence - - - - - + 12) Write the DFA_MEMCFG0[BUNK_INIT]=3 to enable + refreshes to BOTH bunks. + NOTE: In some cases (where the address wires are routed + differently between the front and back 'bunks'), + SW will need to use DFA_MEMCFG0[BUNK_INIT] bits to + control the Hardware initialization sequence for a + 'specific bunk'. In these cases, SW would setup the + BUNK_INIT and repeat Steps \#9-11 for each bunk/port. + NOTE: This should only be written to a different value + during power-on SW initialization. + NOTE: DFA Memory Port#1 corresponds to the Octeon + RLD1_* pins. */ + uint64_t r2r_pbunk : 1; /**< When enabled, an additional command bubble is inserted + if back to back reads are issued to different physical + bunks. This is to avoid DQ data bus collisions when + references cross between physical bunks. + [NOTE: the physical bunk address boundary is determined + by the PBUNK bit]. + NOTE: This should only be written to a different value + during power-on SW initialization. */ + uint64_t pbunk : 3; /**< Physical Bunk address bit pointer. + Specifies which address bit within the Longword + Memory address MA[23:0] is used to determine the + chip selects. + [RLD_CS0_N corresponds to physical bunk \#0, and + RLD_CS1_N corresponds to physical bunk \#1]. + - 000: CS0_N = MA[19]/CS1_N = !MA[19] + - 001: CS0_N = MA[20]/CS1_N = !MA[20] + - 010: CS0_N = MA[21]/CS1_N = !MA[21] + - 011: CS0_N = MA[22]/CS1_N = !MA[22] + - 100: CS0_N = MA[23]/CS1_N = !MA[23] + - 101-111: CS0_N = 0 /CS1_N = 1 + Example(s): + To build out a 128MB DFA memory, 4x 32Mx9 + parts could be used to fill out TWO physical + bunks (clamshell configuration). Each (of the + two) physical bunks contains 2x 32Mx9 = 16Mx36. + Each RLDRAM device also contains 8 internal banks, + therefore the memory Address is 16M/8banks = 2M + addresses/bunk (2^21). In this case, MA[21] would + select the physical bunk. + NOTE: This should only be written to a different value + during power-on SW initialization. + be used to determine the Chip Select(s). */ + uint64_t blen : 1; /**< Device Burst Length (0=2-burst/1=4-burst) + NOTE: RLDRAM-II MUST USE BLEN=0(2-burst) */ + uint64_t bprch : 2; /**< Tristate Enable (back porch) (\#dclks) + On reads, allows user to control the shape of the + tristate disable back porch for the DQ data bus. + This parameter is also very dependent on the + RW_DLY and WR_DLY parameters and care must be + taken when programming these parameters to avoid + data bus contention. Valid range [0..2] + NOTE: This should only be written to a different value + during power-on SW initialization. */ + uint64_t fprch : 2; /**< Tristate Enable (front porch) (\#dclks) + On reads, allows user to control the shape of the + tristate disable front porch for the DQ data bus. + This parameter is also very dependent on the + RW_DLY and WR_DLY parameters and care must be + taken when programming these parameters to avoid + data bus contention. Valid range [0..2] + NOTE: This should only be written to a different value + during power-on SW initialization. */ + uint64_t wr_dly : 4; /**< Write->Read CMD Delay (\#mclks): + Determines \#mclk cycles to insert when controller + switches from write to read. This allows programmer + to control the data bus contention. + For RLDRAM-II(BL2): (TBL=1) + WR_DLY = ROUND_UP[((TWL+TBL)*2 - TSKW + FPRCH) / 2] - TRL + 1 + NOTE: This should only be written to a different value + during power-on SW initialization. + NOTE: For aggressive(performance optimal) designs, + the WR_DLY 'may' be tuned down(-1) if bus fight + on W->R transitions is not pronounced. */ + uint64_t rw_dly : 4; /**< Read->Write CMD Delay (\#mclks): + Determines \#mclk cycles to insert when controller + switches from read to write. This allows programmer + to control the data bus contention. + For RLDRAM-II(BL2): (TBL=1) + RW_DLY = ROUND_UP[((TRL+TBL)*2 + TSKW + BPRCH+2)/2] - TWL + 1 + NOTE: This should only be written to a different value + during power-on SW initialization. + NOTE: For aggressive(performance optimal) designs, + the RW_DLY 'may' be tuned down(-1) if bus fight + on R->W transitions is not pronounced. */ + uint64_t sil_lat : 2; /**< Silo Latency (\#dclks): On reads, determines how many + additional dclks to wait (on top of tRL+1) before + pulling data out of the padring silos used for time + domain boundary crossing. + NOTE: This should only be written to a different value + during power-on SW initialization. */ + uint64_t mtype : 1; /**< FCRAM-II Memory Type + *** CN58XX UNSUPPORTED *** */ + uint64_t reserved_2_2 : 1; + uint64_t ena_p0 : 1; /**< Enable DFA RLDRAM Port#0 + When enabled, this bit lets N3K be the default + driver for memory port \#0. + NOTE: a customer is at + liberty to enable either Port#0 or Port#1 or both. + NOTE: Once a port has been disabled, it MUST NEVER + be re-enabled. [the only way to enable a port is + through a chip reset]. + NOTE: DFA Memory Port#0 corresponds to the Octeon + RLD0_* pins. */ + uint64_t ena_p1 : 1; /**< Enable DFA RLDRAM Port#1 + When enabled, this bit lets N3K be the default + driver for memory port \#1. + NOTE: a customer is at + liberty to enable either Port#0 or Port#1 or both. + NOTE: Once a port has been disabled, it MUST NEVER + be re-enabled. [the only way to enable a port is + through a chip reset]. + NOTE: DFA Memory Port#1 corresponds to the Octeon + RLD1_* pins. */ +#else + uint64_t ena_p1 : 1; + uint64_t ena_p0 : 1; + uint64_t reserved_2_2 : 1; + uint64_t mtype : 1; + uint64_t sil_lat : 2; + uint64_t rw_dly : 4; + uint64_t wr_dly : 4; + uint64_t fprch : 2; + uint64_t bprch : 2; + uint64_t blen : 1; + uint64_t pbunk : 3; + uint64_t r2r_pbunk : 1; + uint64_t init_p1 : 1; + uint64_t init_p0 : 1; + uint64_t bunk_init : 2; + uint64_t lpp_ena : 1; + uint64_t clkdiv : 2; + uint64_t rldck_rst : 1; + uint64_t rldqck90_rst : 1; + uint64_t reserved_32_63 : 32; +#endif + } s; + struct cvmx_dfa_memcfg0_cn38xx + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_28_63 : 36; + uint64_t lpp_ena : 1; /**< PP Linear Port Addressing Mode Enable + When enabled, PP-core LLM accesses to the lower-512MB + LLM address space are sent to the single DFA port + which is enabled. NOTE: If LPP_ENA=1, only + one DFA RLDRAM port may be enabled for RLDRAM accesses + (ie: ENA_P0 and ENA_P1 CAN NEVER BOTH be set). + PP-core LLM accesses to the upper-512MB LLM address + space are sent to the other 'disabled' DFA port. + SW RESTRICTION: If LPP_ENA=1, then only one DFA port + may be enabled for RLDRAM accesses (ie: ENA_P0 and + ENA_P1 CAN NEVER BOTH be set). + NOTE: This bit is used to allow PP-Core LLM accesses to a + disabled port, such that each port can be sequentially + addressed (ie: disable LW address interleaving). + Enabling this bit allows BOTH PORTs to be active and + sequentially addressable. The single port that is + enabled(ENA_Px) will respond to the low-512MB LLM address + space, and the other 'disabled' port will respond to the + high-512MB LLM address space. + Example usage: + - DFA RLD0 pins used for TCAM-FPGA(CP2 accesses) + - DFA RLD1 pins used for RLDRAM (DTE/CP2 accesses). + USAGE NOTE: + If LPP_ENA=1 and SW DOES NOT initialize the disabled port + (ie: INIT_Px=0->1), then refreshes and the HW init + sequence WILL NOT occur for the disabled port. + If LPP_ENA=1 and SW does initialize the disabled port + (INIT_Px=0->1 with ENA_Px=0), then refreshes and + the HW init sequence WILL occur to the disabled port. */ + uint64_t bunk_init : 2; /**< Controls the CS_N[1:0] during a) a HW Initialization + sequence (triggered by DFA_MEMCFG0[INIT_Px]) or + b) during a normal refresh sequence. If + the BNK_INIT[x]=1, the corresponding CS_N[x] is driven. + NOTE: This is required for DRAM used in a + clamshell configuration, since the address lines + carry Mode Register write data that is unique + per bunk(or clam). In a clamshell configuration, + The N3K A[x] pin may be tied into Clam#0's A[x] + and also into Clam#1's 'mirrored' address bit A[y] + (eg: Clam0 sees A[5] and Clam1 sees A[15]). + To support clamshell designs, SW must initiate + two separate HW init sequences for the two bunks + (or clams) . Before each HW init sequence is triggered, + SW must preload the DFA_MEMRLD[22:0] with the data + that will be driven onto the A[22:0] wires during + an MRS mode register write. + NOTE: After the final HW initialization sequence has + been triggered, SW must wait 64K eclks before writing + the BUNK_INIT[1:0] field = 3'b11 (so that CS_N[1:0] is + driven during refresh sequences in normal operation. + NOTE: This should only be written to a different value + during power-on SW initialization. + NOTE: For MTYPE=1(FCRAM) Mode, each bunk MUST BE + initialized independently. In other words, a HW init + must be done for Bunk#0, and then another HW init + must be done for Bunk#1 at power-on. */ + uint64_t init_p0 : 1; /**< When a '1' is written (and the previous value was '0'), + the HW init sequence(s) for Memory Port \#0 is + initiated. + NOTE: To initialize memory, SW must: + 1) Enable memory port(s): + a) ENA_P1=1 (single port in pass 1) OR + b) ENA_P0=1/ENA_P1=1 (dual ports or single when not pass 1) + 2) Wait 100us (to ensure a stable clock + to the RLDRAMs) - as per RLDRAM spec. + 3) Write a '1' to the corresponding INIT_Px which + will initiate a hardware initialization + sequence. + NOTE: After writing a '1', SW must wait 64K eclk + cycles to ensure the HW init sequence has completed + before writing to ANY of the DFA_MEM* registers. + NOTE: This should only be written to a different value + during power-on SW initialization. + NOTE: DFA Memory Port#0 corresponds to the Octeon + RLD0_* pins. */ + uint64_t init_p1 : 1; /**< When a '1' is written (and the previous value was '0'), + the HW init sequence(s) for Memory Port \#1 is + initiated. + NOTE: To initialize memory, SW must: + 1) Enable memory port(s): + a) ENA_P1=1 (single port in pass 1) OR + b) ENA_P0=1/ENA_P1=1 (dual ports or single when not pass 1) + 2) Wait 100us (to ensure a stable clock + to the RLDRAMs) - as per RLDRAM spec. + 3) Write a '1' to the corresponding INIT_Px which + will initiate a hardware initialization + sequence. + NOTE: After writing a '1', SW must wait 64K eclk + cycles to ensure the HW init sequence has completed + before writing to ANY of the DFA_MEM* registers. + NOTE: This should only be written to a different value + during power-on SW initialization. + NOTE: DFA Memory Port#1 corresponds to the Octeon + RLD1_* pins. */ + uint64_t r2r_pbunk : 1; /**< When enabled, an additional command bubble is inserted + if back to back reads are issued to different physical + bunks. This is to avoid DQ data bus collisions when + references cross between physical bunks. + [NOTE: the physical bunk address boundary is determined + by the PBUNK bit]. + NOTE: This should only be written to a different value + during power-on SW initialization. + When MTYPE=1(FCRAM)/BLEN=0(2-burst), R2R_PBUNK SHOULD BE + ZERO(for optimal performance). However, if electrically, + DQ-sharing becomes a power/heat issue, then R2R_PBUNK + should be set (but at a cost to performance (1/2 BW). */ + uint64_t pbunk : 3; /**< Physical Bunk address bit pointer. + Specifies which address bit within the Longword + Memory address MA[23:0] is used to determine the + chip selects. + [RLD_CS0_N corresponds to physical bunk \#0, and + RLD_CS1_N corresponds to physical bunk \#1]. + - 000: CS0_N = MA[19]/CS1_N = !MA[19] + - 001: CS0_N = MA[20]/CS1_N = !MA[20] + - 010: CS0_N = MA[21]/CS1_N = !MA[21] + - 011: CS0_N = MA[22]/CS1_N = !MA[22] + - 100: CS0_N = MA[23]/CS1_N = !MA[23] + - 101-111: CS0_N = 0 /CS1_N = 1 + Example(s): + To build out a 128MB DFA memory, 4x 32Mx9 + parts could be used to fill out TWO physical + bunks (clamshell configuration). Each (of the + two) physical bunks contains 2x 32Mx9 = 16Mx36. + Each RLDRAM device also contains 8 internal banks, + therefore the memory Address is 16M/8banks = 2M + addresses/bunk (2^21). In this case, MA[21] would + select the physical bunk. + NOTE: This should only be written to a different value + during power-on SW initialization. + be used to determine the Chip Select(s). + NOTE: When MTYPE=1(FCRAM)/BLEN=0(2-burst), a + "Redundant Bunk" scheme is employed to provide the + highest overall performance (1 Req/ MCLK cycle). + In this mode, it's imperative that SW set the PBUNK + field +1 'above' the highest address bit. (such that + the PBUNK extracted from the address will always be + zero). In this mode, the CS_N[1:0] pins are driven + to each redundant bunk based on a TDM scheme: + [MCLK-EVEN=Bunk#0/MCLK-ODD=Bunk#1]. */ + uint64_t blen : 1; /**< Device Burst Length (0=2-burst/1=4-burst) + When BLEN=0(BL2), all QW reads/writes from CP2 are + decomposed into 2 separate BL2(LW) requests to the + Low-Latency memory. + When BLEN=1(BL4), a LW request (from CP2 or NCB) is + treated as 1 BL4(QW) request to the low latency memory. + NOTE: QW refers to a 64-bit LLM Load/Store (intiated + by a processor core). LW refers to a 36-bit load/store. + NOTE: This should only be written to a different value + during power-on SW initialization before the DFA LLM + (low latency memory) is used. + NOTE: MTYPE=0(RLDRAM-II) MUST USE BLEN=0(2-burst) + NOTE: MTYPE=1(FCRAM)/BLEN=0(BL2) requires a + multi-bunk(clam) board design. + NOTE: If MTYPE=1(FCRAM)/FCRAM2P=0(II)/BLEN=1(BL4), + SW SHOULD use CP2 QW read/write requests (for + optimal low-latency bus performance). + [LW length read/write requests(in BL4 mode) use 50% + of the available bus bandwidth] + NOTE: MTYPE=1(FCRAM)/FCRAM2P=0(II)/BLEN=0(BL2) can only + be used with FCRAM-II devices which support BL2 mode + (see: Toshiba FCRAM-II, where DQ tristate after 2 data + transfers). + NOTE: MTYPE=1(FCRAM)/FCRAM2P=1(II+) does not support LW + write requests (FCRAM-II+ device specification has removed + the variable write mask function from the devices). + As such, if this mode is used, SW must be careful to + issue only PP-CP2 QW write requests. */ + uint64_t bprch : 2; /**< Tristate Enable (back porch) (\#dclks) + On reads, allows user to control the shape of the + tristate disable back porch for the DQ data bus. + This parameter is also very dependent on the + RW_DLY and WR_DLY parameters and care must be + taken when programming these parameters to avoid + data bus contention. Valid range [0..2] + NOTE: This should only be written to a different value + during power-on SW initialization. */ + uint64_t fprch : 2; /**< Tristate Enable (front porch) (\#dclks) + On reads, allows user to control the shape of the + tristate disable front porch for the DQ data bus. + This parameter is also very dependent on the + RW_DLY and WR_DLY parameters and care must be + taken when programming these parameters to avoid + data bus contention. Valid range [0..2] + NOTE: This should only be written to a different value + during power-on SW initialization. */ + uint64_t wr_dly : 4; /**< Write->Read CMD Delay (\#mclks): + Determines \#mclk cycles to insert when controller + switches from write to read. This allows programmer + to control the data bus contention. + For RLDRAM-II(BL2): (TBL=1) + For FCRAM-II (BL4): (TBL=2) + For FCRAM-II (BL2 grepl=1x ONLY): (TBL=1) + For FCRAM-II (BL2 grepl>=2x): (TBL=3) + NOTE: When MTYTPE=1(FCRAM-II) BLEN=0(BL2 Mode), + grepl>=2x, writes require redundant bunk writes + which require an additional 2 cycles before slotting + the next read. + WR_DLY = ROUND_UP[((TWL+TBL)*2 - TSKW + FPRCH) / 2] - TRL + 1 + NOTE: This should only be written to a different value + during power-on SW initialization. + NOTE: For aggressive(performance optimal) designs, + the WR_DLY 'may' be tuned down(-1) if bus fight + on W->R transitions is not pronounced. */ + uint64_t rw_dly : 4; /**< Read->Write CMD Delay (\#mclks): + Determines \#mclk cycles to insert when controller + switches from read to write. This allows programmer + to control the data bus contention. + For RLDRAM-II/FCRAM-II (BL2): (TBL=1) + For FCRAM-II (BL4): (TBL=2) + RW_DLY = ROUND_UP[((TRL+TBL)*2 + TSKW + BPRCH+2)/2] - TWL + 1 + NOTE: This should only be written to a different value + during power-on SW initialization. + NOTE: For aggressive(performance optimal) designs, + the RW_DLY 'may' be tuned down(-1) if bus fight + on R->W transitions is not pronounced. */ + uint64_t sil_lat : 2; /**< Silo Latency (\#dclks): On reads, determines how many + additional dclks to wait (on top of tRL+1) before + pulling data out of the padring silos used for time + domain boundary crossing. + NOTE: This should only be written to a different value + during power-on SW initialization. */ + uint64_t mtype : 1; /**< Memory Type (0=RLDRAM-II/1=Network DRAM-II/FCRAM) + NOTE: N3K-P1 only supports RLDRAM-II + NOTE: This should only be written to a different value + during power-on SW initialization. + NOTE: When MTYPE=1(FCRAM)/BLEN=0(2-burst), only the + "unidirectional DS/QS" mode is supported. (see FCRAM + data sheet EMRS[A6:A5]=SS(Strobe Select) register + definition. [in FCRAM 2-burst mode, we use FCRAM + in a clamshell configuration such that clam0 is + addressed independently of clam1, and DQ is shared + for optimal performance. As such it's imperative that + the QS are conditionally received (and are NOT + free-running), as the N3K receive data capture silos + OR the clam0/1 QS strobes. + NOTE: If this bit is SET, the ASX0/1 + ASX_RLD_FCRAM_MODE[MODE] bit(s) should also be SET + in order for the RLD0/1-PHY(s) to support FCRAM devices. */ + uint64_t reserved_2_2 : 1; + uint64_t ena_p0 : 1; /**< Enable DFA RLDRAM Port#0 + When enabled, this bit lets N3K be the default + driver for memory port \#0. + NOTE: For N3K-P1, to enable Port#0(2nd port), + Port#1 MUST ALSO be enabled. + NOTE: For N3K-P2, single port mode, a customer is at + liberty to enable either Port#0 or Port#1. + NOTE: Once a port has been disabled, it MUST NEVER + be re-enabled. [the only way to enable a port is + through a chip reset]. + NOTE: DFA Memory Port#0 corresponds to the Octeon + RLD0_* pins. */ + uint64_t ena_p1 : 1; /**< Enable DFA RLDRAM Port#1 + When enabled, this bit lets N3K be the default + driver for memory port \#1. + NOTE: For N3K-P1, If the customer wishes to use a + single port, s/he must enable Port#1 (and not Port#0). + NOTE: For N3K-P2, single port mode, a customer is at + liberty to enable either Port#0 or Port#1. + NOTE: Once a port has been disabled, it MUST NEVER + be re-enabled. [the only way to enable a port is + through a chip reset]. + NOTE: DFA Memory Port#1 corresponds to the Octeon + RLD1_* pins. */ +#else + uint64_t ena_p1 : 1; + uint64_t ena_p0 : 1; + uint64_t reserved_2_2 : 1; + uint64_t mtype : 1; + uint64_t sil_lat : 2; + uint64_t rw_dly : 4; + uint64_t wr_dly : 4; + uint64_t fprch : 2; + uint64_t bprch : 2; + uint64_t blen : 1; + uint64_t pbunk : 3; + uint64_t r2r_pbunk : 1; + uint64_t init_p1 : 1; + uint64_t init_p0 : 1; + uint64_t bunk_init : 2; + uint64_t lpp_ena : 1; + uint64_t reserved_28_63 : 36; +#endif + } cn38xx; + struct cvmx_dfa_memcfg0_cn38xxp2 + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_27_63 : 37; + uint64_t bunk_init : 2; /**< Controls the CS_N[1:0] during a) a HW Initialization + sequence (triggered by DFA_MEMCFG0[INIT_Px]) or + b) during a normal refresh sequence. If + the BNK_INIT[x]=1, the corresponding CS_N[x] is driven. + NOTE: This is required for DRAM used in a + clamshell configuration, since the address lines + carry Mode Register write data that is unique + per bunk(or clam). In a clamshell configuration, + The N3K A[x] pin may be tied into Clam#0's A[x] + and also into Clam#1's 'mirrored' address bit A[y] + (eg: Clam0 sees A[5] and Clam1 sees A[15]). + To support clamshell designs, SW must initiate + two separate HW init sequences for the two bunks + (or clams) . Before each HW init sequence is triggered, + SW must preload the DFA_MEMRLD[22:0] with the data + that will be driven onto the A[22:0] wires during + an MRS mode register write. + NOTE: After the final HW initialization sequence has + been triggered, SW must wait 64K eclks before writing + the BUNK_INIT[1:0] field = 3'b11 (so that CS_N[1:0] is + driven during refresh sequences in normal operation. + NOTE: This should only be written to a different value + during power-on SW initialization. + NOTE: For MTYPE=1(FCRAM) Mode, each bunk MUST BE + initialized independently. In other words, a HW init + must be done for Bunk#0, and then another HW init + must be done for Bunk#1 at power-on. */ + uint64_t init_p0 : 1; /**< When a '1' is written (and the previous value was '0'), + the HW init sequence(s) for Memory Port \#0 is + initiated. + NOTE: To initialize memory, SW must: + 1) Enable memory port(s): + a) ENA_P1=1 (single port in pass 1) OR + b) ENA_P0=1/ENA_P1=1 (dual ports or single when not pass 1) + 2) Wait 100us (to ensure a stable clock + to the RLDRAMs) - as per RLDRAM spec. + 3) Write a '1' to the corresponding INIT_Px which + will initiate a hardware initialization + sequence. + NOTE: After writing a '1', SW must wait 64K eclk + cycles to ensure the HW init sequence has completed + before writing to ANY of the DFA_MEM* registers. + NOTE: This should only be written to a different value + during power-on SW initialization. + NOTE: DFA Memory Port#0 corresponds to the Octeon + RLD0_* pins. */ + uint64_t init_p1 : 1; /**< When a '1' is written (and the previous value was '0'), + the HW init sequence(s) for Memory Port \#1 is + initiated. + NOTE: To initialize memory, SW must: + 1) Enable memory port(s): + a) ENA_P1=1 (single port in pass 1) OR + b) ENA_P0=1/ENA_P1=1 (dual ports or single when not pass 1) + 2) Wait 100us (to ensure a stable clock + to the RLDRAMs) - as per RLDRAM spec. + 3) Write a '1' to the corresponding INIT_Px which + will initiate a hardware initialization + sequence. + NOTE: After writing a '1', SW must wait 64K eclk + cycles to ensure the HW init sequence has completed + before writing to ANY of the DFA_MEM* registers. + NOTE: This should only be written to a different value + during power-on SW initialization. + NOTE: DFA Memory Port#1 corresponds to the Octeon + RLD1_* pins. */ + uint64_t r2r_pbunk : 1; /**< When enabled, an additional command bubble is inserted + if back to back reads are issued to different physical + bunks. This is to avoid DQ data bus collisions when + references cross between physical bunks. + [NOTE: the physical bunk address boundary is determined + by the PBUNK bit]. + NOTE: This should only be written to a different value + during power-on SW initialization. + When MTYPE=1(FCRAM)/BLEN=0(2-burst), R2R_PBUNK SHOULD BE + ZERO(for optimal performance). However, if electrically, + DQ-sharing becomes a power/heat issue, then R2R_PBUNK + should be set (but at a cost to performance (1/2 BW). */ + uint64_t pbunk : 3; /**< Physical Bunk address bit pointer. + Specifies which address bit within the Longword + Memory address MA[23:0] is used to determine the + chip selects. + [RLD_CS0_N corresponds to physical bunk \#0, and + RLD_CS1_N corresponds to physical bunk \#1]. + - 000: CS0_N = MA[19]/CS1_N = !MA[19] + - 001: CS0_N = MA[20]/CS1_N = !MA[20] + - 010: CS0_N = MA[21]/CS1_N = !MA[21] + - 011: CS0_N = MA[22]/CS1_N = !MA[22] + - 100: CS0_N = MA[23]/CS1_N = !MA[23] + - 101-111: CS0_N = 0 /CS1_N = 1 + Example(s): + To build out a 128MB DFA memory, 4x 32Mx9 + parts could be used to fill out TWO physical + bunks (clamshell configuration). Each (of the + two) physical bunks contains 2x 32Mx9 = 16Mx36. + Each RLDRAM device also contains 8 internal banks, + therefore the memory Address is 16M/8banks = 2M + addresses/bunk (2^21). In this case, MA[21] would + select the physical bunk. + NOTE: This should only be written to a different value + during power-on SW initialization. + be used to determine the Chip Select(s). + NOTE: When MTYPE=1(FCRAM)/BLEN=0(2-burst), a + "Redundant Bunk" scheme is employed to provide the + highest overall performance (1 Req/ MCLK cycle). + In this mode, it's imperative that SW set the PBUNK + field +1 'above' the highest address bit. (such that + the PBUNK extracted from the address will always be + zero). In this mode, the CS_N[1:0] pins are driven + to each redundant bunk based on a TDM scheme: + [MCLK-EVEN=Bunk#0/MCLK-ODD=Bunk#1]. */ + uint64_t blen : 1; /**< Device Burst Length (0=2-burst/1=4-burst) + When BLEN=0(BL2), all QW reads/writes from CP2 are + decomposed into 2 separate BL2(LW) requests to the + Low-Latency memory. + When BLEN=1(BL4), a LW request (from CP2 or NCB) is + treated as 1 BL4(QW) request to the low latency memory. + NOTE: QW refers to a 64-bit LLM Load/Store (intiated + by a processor core). LW refers to a 36-bit load/store. + NOTE: This should only be written to a different value + during power-on SW initialization before the DFA LLM + (low latency memory) is used. + NOTE: MTYPE=0(RLDRAM-II) MUST USE BLEN=0(2-burst) + NOTE: MTYPE=1(FCRAM)/BLEN=0(BL2) requires a + multi-bunk(clam) board design. + NOTE: If MTYPE=1(FCRAM)/FCRAM2P=0(II)/BLEN=1(BL4), + SW SHOULD use CP2 QW read/write requests (for + optimal low-latency bus performance). + [LW length read/write requests(in BL4 mode) use 50% + of the available bus bandwidth] + NOTE: MTYPE=1(FCRAM)/FCRAM2P=0(II)/BLEN=0(BL2) can only + be used with FCRAM-II devices which support BL2 mode + (see: Toshiba FCRAM-II, where DQ tristate after 2 data + transfers). + NOTE: MTYPE=1(FCRAM)/FCRAM2P=1(II+) does not support LW + write requests (FCRAM-II+ device specification has removed + the variable write mask function from the devices). + As such, if this mode is used, SW must be careful to + issue only PP-CP2 QW write requests. */ + uint64_t bprch : 2; /**< Tristate Enable (back porch) (\#dclks) + On reads, allows user to control the shape of the + tristate disable back porch for the DQ data bus. + This parameter is also very dependent on the + RW_DLY and WR_DLY parameters and care must be + taken when programming these parameters to avoid + data bus contention. Valid range [0..2] + NOTE: This should only be written to a different value + during power-on SW initialization. */ + uint64_t fprch : 2; /**< Tristate Enable (front porch) (\#dclks) + On reads, allows user to control the shape of the + tristate disable front porch for the DQ data bus. + This parameter is also very dependent on the + RW_DLY and WR_DLY parameters and care must be + taken when programming these parameters to avoid + data bus contention. Valid range [0..2] + NOTE: This should only be written to a different value + during power-on SW initialization. */ + uint64_t wr_dly : 4; /**< Write->Read CMD Delay (\#mclks): + Determines \#mclk cycles to insert when controller + switches from write to read. This allows programmer + to control the data bus contention. + For RLDRAM-II(BL2): (TBL=1) + For FCRAM-II (BL4): (TBL=2) + For FCRAM-II (BL2 grepl=1x ONLY): (TBL=1) + For FCRAM-II (BL2 grepl>=2x): (TBL=3) + NOTE: When MTYTPE=1(FCRAM-II) BLEN=0(BL2 Mode), + grepl>=2x, writes require redundant bunk writes + which require an additional 2 cycles before slotting + the next read. + WR_DLY = ROUND_UP[((TWL+TBL)*2 - TSKW + FPRCH) / 2] - TRL + 1 + NOTE: This should only be written to a different value + during power-on SW initialization. + NOTE: For aggressive(performance optimal) designs, + the WR_DLY 'may' be tuned down(-1) if bus fight + on W->R transitions is not pronounced. */ + uint64_t rw_dly : 4; /**< Read->Write CMD Delay (\#mclks): + Determines \#mclk cycles to insert when controller + switches from read to write. This allows programmer + to control the data bus contention. + For RLDRAM-II/FCRAM-II (BL2): (TBL=1) + For FCRAM-II (BL4): (TBL=2) + RW_DLY = ROUND_UP[((TRL+TBL)*2 + TSKW + BPRCH+2)/2] - TWL + 1 + NOTE: This should only be written to a different value + during power-on SW initialization. + NOTE: For aggressive(performance optimal) designs, + the RW_DLY 'may' be tuned down(-1) if bus fight + on R->W transitions is not pronounced. */ + uint64_t sil_lat : 2; /**< Silo Latency (\#dclks): On reads, determines how many + additional dclks to wait (on top of tRL+1) before + pulling data out of the padring silos used for time + domain boundary crossing. + NOTE: This should only be written to a different value + during power-on SW initialization. */ + uint64_t mtype : 1; /**< Memory Type (0=RLDRAM-II/1=Network DRAM-II/FCRAM) + NOTE: N3K-P1 only supports RLDRAM-II + NOTE: This should only be written to a different value + during power-on SW initialization. + NOTE: When MTYPE=1(FCRAM)/BLEN=0(2-burst), only the + "unidirectional DS/QS" mode is supported. (see FCRAM + data sheet EMRS[A6:A5]=SS(Strobe Select) register + definition. [in FCRAM 2-burst mode, we use FCRAM + in a clamshell configuration such that clam0 is + addressed independently of clam1, and DQ is shared + for optimal performance. As such it's imperative that + the QS are conditionally received (and are NOT + free-running), as the N3K receive data capture silos + OR the clam0/1 QS strobes. + NOTE: If this bit is SET, the ASX0/1 + ASX_RLD_FCRAM_MODE[MODE] bit(s) should also be SET + in order for the RLD0/1-PHY(s) to support FCRAM devices. */ + uint64_t reserved_2_2 : 1; + uint64_t ena_p0 : 1; /**< Enable DFA RLDRAM Port#0 + When enabled, this bit lets N3K be the default + driver for memory port \#0. + NOTE: For N3K-P1, to enable Port#0(2nd port), + Port#1 MUST ALSO be enabled. + NOTE: For N3K-P2, single port mode, a customer is at + liberty to enable either Port#0 or Port#1. + NOTE: Once a port has been disabled, it MUST NEVER + be re-enabled. [the only way to enable a port is + through a chip reset]. + NOTE: DFA Memory Port#0 corresponds to the Octeon + RLD0_* pins. */ + uint64_t ena_p1 : 1; /**< Enable DFA RLDRAM Port#1 + When enabled, this bit lets N3K be the default + driver for memory port \#1. + NOTE: For N3K-P1, If the customer wishes to use a + single port, s/he must enable Port#1 (and not Port#0). + NOTE: For N3K-P2, single port mode, a customer is at + liberty to enable either Port#0 or Port#1. + NOTE: Once a port has been disabled, it MUST NEVER + be re-enabled. [the only way to enable a port is + through a chip reset]. + NOTE: DFA Memory Port#1 corresponds to the Octeon + RLD1_* pins. */ +#else + uint64_t ena_p1 : 1; + uint64_t ena_p0 : 1; + uint64_t reserved_2_2 : 1; + uint64_t mtype : 1; + uint64_t sil_lat : 2; + uint64_t rw_dly : 4; + uint64_t wr_dly : 4; + uint64_t fprch : 2; + uint64_t bprch : 2; + uint64_t blen : 1; + uint64_t pbunk : 3; + uint64_t r2r_pbunk : 1; + uint64_t init_p1 : 1; + uint64_t init_p0 : 1; + uint64_t bunk_init : 2; + uint64_t reserved_27_63 : 37; +#endif + } cn38xxp2; + struct cvmx_dfa_memcfg0_s cn58xx; + struct cvmx_dfa_memcfg0_s cn58xxp1; +}; +typedef union cvmx_dfa_memcfg0 cvmx_dfa_memcfg0_t; + +/** + * cvmx_dfa_memcfg1 + * + * DFA_MEMCFG1 = RLDRAM Memory Timing Configuration + * + * Description: + */ +union cvmx_dfa_memcfg1 +{ + uint64_t u64; + struct cvmx_dfa_memcfg1_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_34_63 : 30; + uint64_t ref_intlo : 9; /**< Burst Refresh Interval[8:0] (\#dclks) + For finer refresh interval granularity control. + This field provides an additional level of granularity + for the refresh interval. It specifies the additional + \#dclks [0...511] to be added to the REF_INT[3:0] field. + For RLDRAM-II: For dclk(400MHz=2.5ns): + Example: 64K AREF cycles required within tREF=32ms + trefint = tREF(ms)/(64K cycles/8banks) + = 32ms/8K = 3.9us = 3900ns + REF_INT[3:0] = ROUND_DOWN[(trefint/dclk)/512] + = ROUND_DOWN[(3900/2.5)/512] + = 3 + REF_INTLO[8:0] = MOD[(trefint/dclk)/512] + = MOD[(3900/2.5)/512] + = 24 + NOTE: This should only be written to a different value + during power-on SW initialization. */ + uint64_t aref_ena : 1; /**< Auto Refresh Cycle Enable + INTERNAL USE ONLY: + NOTE: This mode bit is ONLY intended to be used by + low-level power-on initialization routines in the + event that the hardware initialization routine + does not work. It allows SW to create AREF + commands on the RLDRAM bus directly. + When this bit is set, ALL RLDRAM writes (issued by + a PP through the NCB or CP2) are converted to AREF + commands on the RLDRAM bus. The write-address is + presented on the A[20:0]/BA[2:0] pins (for which + the RLDRAM only interprets BA[2:0]). + When this bit is set, only writes are allowed + and MUST use grepl=0 (1x). + NOTE: This should only be written to a different value + during power-on SW initialization. + NOTE: MRS_ENA and AREF_ENA are mutually exclusive + (SW can set one or the other, but never both!) + NOTE: AREF commands generated using this method target + the 'addressed' bunk. */ + uint64_t mrs_ena : 1; /**< Mode Register Set Cycle Enable + INTERNAL USE ONLY: + NOTE: This mode bit is ONLY intended to be used by + low-level power-on initialization routines in the + event that the hardware initialization routine + does not work. It allows SW to create MRS + commands on the RLDRAM bus directly. + When this bit is set, ALL RLDRAM writes (issued by + a PP through the NCB or CP2) are converted to MRS + commands on the RLDRAM bus. The write-address is + presented on the A[20:0]/BA[2:0] pins (for which + the RLDRAM only interprets A[17:0]). + When this bit is set, only writes are allowed + and MUST use grepl=0 (1x). + NOTE: This should only be written to a different value + during power-on SW initialization. + NOTE: MRS_ENA and AREF_ENA are mutually exclusive + (SW can set one or the other, but never both!) + NOTE: MRS commands generated using this method target + the 'addressed' bunk. */ + uint64_t tmrsc : 3; /**< Mode Register Set Cycle Time (represented in \#mclks) + - 000-001: RESERVED + - 010: tMRSC = 2 mclks + - 011: tMRSC = 3 mclks + - ... + - 111: tMRSC = 7 mclks + NOTE: The device tMRSC parameter is a function of CL + (which during HW initialization is not known. Its + recommended to load tMRSC(MAX) value to avoid timing + violations. + NOTE: This should only be written to a different value + during power-on SW initialization. */ + uint64_t trc : 4; /**< Row Cycle Time (represented in \#mclks) + see also: DFA_MEMRLD[RLCFG] field which must + correspond with tRL/tWL parameter(s). + - 0000-0010: RESERVED + - 0011: tRC = 3 mclks + - 0100: tRC = 4 mclks + - 0101: tRC = 5 mclks + - 0110: tRC = 6 mclks + - 0111: tRC = 7 mclks + - 1000: tRC = 8 mclks + - 1001: tRC = 9 mclks + - 1010-1111: RESERVED + NOTE: This should only be written to a different value + during power-on SW initialization. */ + uint64_t twl : 4; /**< Write Latency (represented in \#mclks) + see also: DFA_MEMRLD[RLCFG] field which must + correspond with tRL/tWL parameter(s). + - 0000-0001: RESERVED + - 0010: Write Latency (WL=2.0 mclk) + - 0011: Write Latency (WL=3.0 mclks) + - 0100: Write Latency (WL=4.0 mclks) + - 0101: Write Latency (WL=5.0 mclks) + - 0110: Write Latency (WL=6.0 mclks) + - 0111: Write Latency (WL=7.0 mclks) + - 1000: Write Latency (WL=8.0 mclks) + - 1001: Write Latency (WL=9.0 mclks) + - 1010: Write Latency (WL=10.0 mclks) + - 1011-1111: RESERVED + NOTE: This should only be written to a different value + during power-on SW initialization. */ + uint64_t trl : 4; /**< Read Latency (represented in \#mclks) + see also: DFA_MEMRLD[RLCFG] field which must + correspond with tRL/tWL parameter(s). + - 0000-0010: RESERVED + - 0011: Read Latency = 3 mclks + - 0100: Read Latency = 4 mclks + - 0101: Read Latency = 5 mclks + - 0110: Read Latency = 6 mclks + - 0111: Read Latency = 7 mclks + - 1000: Read Latency = 8 mclks + - 1001: Read Latency = 9 mclks + - 1010: Read Latency = 10 mclks + - 1011-1111: RESERVED + NOTE: This should only be written to a different value + during power-on SW initialization. */ + uint64_t reserved_6_7 : 2; + uint64_t tskw : 2; /**< Board Skew (represented in \#dclks) + Represents additional board skew of DQ/DQS. + - 00: board-skew = 0 dclk + - 01: board-skew = 1 dclk + - 10: board-skew = 2 dclk + - 11: board-skew = 3 dclk + NOTE: This should only be written to a different value + during power-on SW initialization. */ + uint64_t ref_int : 4; /**< Refresh Interval (represented in \#of 512 dclk + increments). + - 0000: RESERVED + - 0001: 1 * 512 = 512 dclks + - ... + - 1111: 15 * 512 = 7680 dclks + NOTE: For finer level of granularity, refer to + REF_INTLO[8:0] field. + For RLDRAM-II, each refresh interval will + generate a burst of 8 AREF commands, one to each of + 8 explicit banks (referenced using the RLD_BA[2:0] + pins. + Example: For mclk=200MHz/dclk(400MHz=2.5ns): + 64K AREF cycles required within tREF=32ms + trefint = tREF(ms)/(64K cycles/8banks) + = 32ms/8K = 3.9us = 3900ns + REF_INT = ROUND_DOWN[(trefint/dclk)/512] + = ROUND_DOWN[(3900/2.5)/512] + = 3 + NOTE: This should only be written to a different value + during power-on SW initialization. */ +#else + uint64_t ref_int : 4; + uint64_t tskw : 2; + uint64_t reserved_6_7 : 2; + uint64_t trl : 4; + uint64_t twl : 4; + uint64_t trc : 4; + uint64_t tmrsc : 3; + uint64_t mrs_ena : 1; + uint64_t aref_ena : 1; + uint64_t ref_intlo : 9; + uint64_t reserved_34_63 : 30; +#endif + } s; + struct cvmx_dfa_memcfg1_s cn38xx; + struct cvmx_dfa_memcfg1_s cn38xxp2; + struct cvmx_dfa_memcfg1_s cn58xx; + struct cvmx_dfa_memcfg1_s cn58xxp1; +}; +typedef union cvmx_dfa_memcfg1 cvmx_dfa_memcfg1_t; + +/** + * cvmx_dfa_memcfg2 + * + * DFA_MEMCFG2 = DFA Memory Config Register \#2 + * *** NOTE: Pass2 Addition + * + * Description: Additional Memory Configuration CSRs to support FCRAM-II/II+ and Network DRAM-II + */ +union cvmx_dfa_memcfg2 +{ + uint64_t u64; + struct cvmx_dfa_memcfg2_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_12_63 : 52; + uint64_t dteclkdis : 1; /**< DFA DTE Clock Disable + When SET, the DFA clocks for DTE(thread engine) + operation are disabled. + NOTE: When SET, SW MUST NEVER issue ANY operations to + the DFA via the NCB Bus. All DFA Operations must be + issued solely through the CP2 interface. + + NOTE: When DTECLKDIS=1, if CP2 Errors are encountered + (ie: CP2SBE, CP2DBE, CP2PERR), the DFA_MEMFADR CSR + does not reflect the failing address/ctl information. */ + uint64_t silrst : 1; /**< LLM-PHY Silo Reset + When a '1' is written (when the previous + value was a '0') causes the the LLM-PHY Silo read/write + pointers to be reset. + NOTE: SW MUST WAIT 400 dclks after the LAST HW Init + sequence was launched (ie: INIT_START 0->1 CSR write), + before the SILRST can be triggered (0->1). */ + uint64_t trfc : 5; /**< FCRAM-II Refresh Interval + *** CN58XX UNSUPPORTED *** */ + uint64_t refshort : 1; /**< FCRAM Short Refresh Mode + *** CN58XX UNSUPPORTED *** */ + uint64_t ua_start : 2; /**< FCRAM-II Upper Addres Start + *** CN58XX UNSUPPORTED *** */ + uint64_t maxbnk : 1; /**< Maximum Banks per-device (used by the address mapper + when extracting address bits for the memory bank#. + - 0: 4 banks/device + - 1: 8 banks/device */ + uint64_t fcram2p : 1; /**< FCRAM-II+ Mode Enable + *** CN58XX UNSUPPORTED *** */ +#else + uint64_t fcram2p : 1; + uint64_t maxbnk : 1; + uint64_t ua_start : 2; + uint64_t refshort : 1; + uint64_t trfc : 5; + uint64_t silrst : 1; + uint64_t dteclkdis : 1; + uint64_t reserved_12_63 : 52; +#endif + } s; + struct cvmx_dfa_memcfg2_s cn38xx; + struct cvmx_dfa_memcfg2_s cn38xxp2; + struct cvmx_dfa_memcfg2_s cn58xx; + struct cvmx_dfa_memcfg2_s cn58xxp1; +}; +typedef union cvmx_dfa_memcfg2 cvmx_dfa_memcfg2_t; + +/** + * cvmx_dfa_memfadr + * + * DFA_MEMFADR = RLDRAM Failing Address/Control Register + * + * Description: DFA Memory Failing Address/Control Error Capture information + * This register contains useful information to help in isolating an RLDRAM memory failure. + * NOTE: The first detected SEC/DED/PERR failure is captured in DFA_MEMFADR, however, a DED or PERR (which is + * more severe) will always overwrite a SEC error. The user can 'infer' the source of the interrupt + * via the FSRC field. + * NOTE: If DFA_MEMCFG2[DTECLKDIS]=1, the contents of this register are UNDEFINED. + */ +union cvmx_dfa_memfadr +{ + uint64_t u64; + struct cvmx_dfa_memfadr_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_24_63 : 40; + uint64_t maddr : 24; /**< Memory Address */ +#else + uint64_t maddr : 24; + uint64_t reserved_24_63 : 40; +#endif + } s; + struct cvmx_dfa_memfadr_cn31xx + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_40_63 : 24; + uint64_t fdst : 9; /**< Fill-Destination + FSRC[1:0] | FDST[8:0] + -------------+------------------------------------- + 0(NCB-DTE) | [fillstart,2'b0,WIDX(1),DMODE(1),DTE(4)] + 1(NCB-CSR) | [ncbSRC[8:0]] + 3(CP2-PP) | [2'b0,SIZE(1),INDEX(1),PP(4),FID(1)] + where: + DTE: DFA Thread Engine ID# + PP: Packet Processor ID# + FID: Fill-ID# (unique per PP) + WIDX: 16b SIMPLE Mode (index) + DMODE: (0=16b SIMPLE/1=32b SIMPLE) + SIZE: (0=LW Mode access/1=QW Mode Access) + INDEX: (0=Low LW/1=High LW) + NOTE: QW refers to a 56/64-bit LLM Load/Store (intiated + by a processor core). LW refers to a 32-bit load/store. */ + uint64_t fsrc : 2; /**< Fill-Source (0=NCB-DTE/1=NCB-CSR/2=RESERVED/3=PP-CP2) */ + uint64_t pnum : 1; /**< Memory Port + NOTE: For O2P, this bit will always return zero. */ + uint64_t bnum : 3; /**< Memory Bank + When DFA_DDR2_ADDR[RNK_LO]=1, BNUM[2]=RANK[0]. + (RANK[1] can be inferred from MADDR[24:0]) */ + uint64_t maddr : 25; /**< Memory Address */ +#else + uint64_t maddr : 25; + uint64_t bnum : 3; + uint64_t pnum : 1; + uint64_t fsrc : 2; + uint64_t fdst : 9; + uint64_t reserved_40_63 : 24; +#endif + } cn31xx; + struct cvmx_dfa_memfadr_cn38xx + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_39_63 : 25; + uint64_t fdst : 9; /**< Fill-Destination + FSRC[1:0] | FDST[8:0] + -------------+------------------------------------- + 0(NCB-DTE) | [fillstart,2'b0,WIDX(1),DMODE(1),DTE(4)] + 1(NCB-CSR) | [ncbSRC[8:0]] + 3(CP2-PP) | [2'b0,SIZE(1),INDEX(1),PP(4),FID(1)] + where: + DTE: DFA Thread Engine ID# + PP: Packet Processor ID# + FID: Fill-ID# (unique per PP) + WIDX: 18b SIMPLE Mode (index) + DMODE: (0=18b SIMPLE/1=36b SIMPLE) + SIZE: (0=LW Mode access/1=QW Mode Access) + INDEX: (0=Low LW/1=High LW) + NOTE: QW refers to a 64-bit LLM Load/Store (intiated + by a processor core). LW refers to a 36-bit load/store. */ + uint64_t fsrc : 2; /**< Fill-Source (0=NCB-DTE/1=NCB-CSR/2=RESERVED/3=PP-CP2) */ + uint64_t pnum : 1; /**< Memory Port + NOTE: the port id's are reversed + PNUM==0 => port#1 + PNUM==1 => port#0 */ + uint64_t bnum : 3; /**< Memory Bank */ + uint64_t maddr : 24; /**< Memory Address */ +#else + uint64_t maddr : 24; + uint64_t bnum : 3; + uint64_t pnum : 1; + uint64_t fsrc : 2; + uint64_t fdst : 9; + uint64_t reserved_39_63 : 25; +#endif + } cn38xx; + struct cvmx_dfa_memfadr_cn38xx cn38xxp2; + struct cvmx_dfa_memfadr_cn38xx cn58xx; + struct cvmx_dfa_memfadr_cn38xx cn58xxp1; +}; +typedef union cvmx_dfa_memfadr cvmx_dfa_memfadr_t; + +/** + * cvmx_dfa_memfcr + * + * DFA_MEMFCR = FCRAM MRS Register(s) EMRS2[14:0], EMRS1[14:0], MRS[14:0] + * *** CN58XX UNSUPPORTED *** + * + * Notes: + * For FCRAM-II please consult your device's data sheet for further details: + * MRS Definition: + * A[13:8]=0 RESERVED + * A[7]=0 TEST MODE (N3K requires test mode 0:"disabled") + * A[6:4] CAS LATENCY (fully programmable - SW must ensure that the value programmed + * into DFA_MEM_CFG0[TRL] corresponds with this value). + * A[3]=0 BURST TYPE (N3K requires 0:"Sequential" Burst Type) + * A[2:0] BURST LENGTH Burst Length [1:BL2/2:BL4] (N3K only supports BL=2,4) + * + * In BL2 mode(for highest performance), only 1/2 the phsyical + * memory is unique (ie: each bunk stores the same information). + * In BL4 mode(highest capacity), all of the physical memory + * is unique (ie: each bunk is uniquely addressable). + * EMRS Definition: + * A[13:12] REFRESH MODE (N3K Supports only 0:"Conventional" and 1:"Short" auto-refresh modes) + * + * (SW must ensure that the value programmed into DFA_MEMCFG2[REFSHORT] + * is also reflected in the Refresh Mode encoding). + * A[11:7]=0 RESERVED + * A[6:5]=2 STROBE SELECT (N3K supports only 2:"Unidirectional DS/QS" mode - the read capture + * silos rely on a conditional QS strobe) + * A[4:3] DIC(QS) QS Drive Strength: fully programmable (consult your FCRAM-II data sheet) + * [0: Normal Output Drive/1: Strong Output Drive/2: Weak output Drive] + * A[2:1] DIC(DQ) DQ Drive Strength: fully programmable (consult your FCRAM-II data sheet) + * [0: Normal Output Drive/1: Strong Output Drive/2: Weak output Drive] + * A[0] DLL DLL Enable: Programmable [0:DLL Enable/1: DLL Disable] + * + * EMRS2 Definition: (for FCRAM-II+) + * A[13:11]=0 RESERVED + * A[10:8] ODTDS On Die Termination (DS+/-) + * [0: ODT Disable /1: 15ohm termination /(2-7): RESERVED] + * A[7:6]=0 MBW Multi-Bank Write: (N3K requires use of 0:"single bank" mode only) + * A[5:3] ODTin On Die Termination (input pin) + * [0: ODT Disable /1: 15ohm termination /(2-7): RESERVED] + * A[2:0] ODTDQ On Die Termination (DQ) + * [0: ODT Disable /1: 15ohm termination /(2-7): RESERVED] + */ +union cvmx_dfa_memfcr +{ + uint64_t u64; + struct cvmx_dfa_memfcr_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_47_63 : 17; + uint64_t emrs2 : 15; /**< Memory Address[14:0] during EMRS2(for FCRAM-II+) + *** CN58XX UNSUPPORTED *** */ + uint64_t reserved_31_31 : 1; + uint64_t emrs : 15; /**< Memory Address[14:0] during EMRS + *** CN58XX UNSUPPORTED *** + A[0]=1: DLL Enabled) */ + uint64_t reserved_15_15 : 1; + uint64_t mrs : 15; /**< FCRAM Memory Address[14:0] during MRS + *** CN58XX UNSUPPORTED *** + A[6:4]=4 CAS LATENCY=4(default) + A[3]=0 Burst Type(must be 0:Sequential) + A[2:0]=2 Burst Length=4(default) */ +#else + uint64_t mrs : 15; + uint64_t reserved_15_15 : 1; + uint64_t emrs : 15; + uint64_t reserved_31_31 : 1; + uint64_t emrs2 : 15; + uint64_t reserved_47_63 : 17; +#endif + } s; + struct cvmx_dfa_memfcr_s cn38xx; + struct cvmx_dfa_memfcr_s cn38xxp2; + struct cvmx_dfa_memfcr_s cn58xx; + struct cvmx_dfa_memfcr_s cn58xxp1; +}; +typedef union cvmx_dfa_memfcr cvmx_dfa_memfcr_t; + +/** + * cvmx_dfa_memhidat + * + * DFA_MEMHIDAT = DFA NCB-Direct CSR access to DFM Memory Space (High QW) + * + * Description: + * DFA supports NCB-Direct CSR acccesses to DFM Memory space for debug purposes. Unfortunately, NCB-Direct accesses + * are limited to QW-size(64bits), whereas the minimum access granularity for DFM Memory space is OW(128bits). To + * support writes to DFM Memory space, the Hi-QW of data is sourced from the DFA_MEMHIDAT register. Recall, the + * OW(128b) in DDR3 memory space is fixed format: + * OWDATA[127:118]: OWECC[9:0] 10bits of in-band OWECC SEC/DED codeword + * This can be precomputed/written by SW OR + * if DFM_FNTCTL[ECC_WENA]=1, DFM hardware will auto-compute the 10b OWECC and place in the + * OWDATA[127:118] before being written to memory. + * OWDATA[117:0]: Memory Data (contains fixed MNODE/MONODE arc formats for use by DTEs(thread engines). + * Or, a user may choose to treat DFM Memory Space as 'scratch pad' in which case the + * OWDATA[117:0] may contain user-specified information accessible via NCB-Direct CSR mode + * accesses to DFA Memory Space. + * NOTE: To write to the DFA_MEMHIDAT register, a device would issue an IOBST directed at the DFA with addr[34:32]=3'b111. + * To read the DFA_MEMHIDAT register, a device would issue an IOBLD64 directed at the DFA with addr[34:32]=3'b111. + * + * NOTE: If DFA_CONFIG[DTECLKDIS]=1 (DFA-DTE clocks disabled), reads/writes to the DFA_MEMHIDAT register do not take effect. + * NOTE: If FUSE[TBD]="DFA DTE disable" is blown, reads/writes to the DFA_MEMHIDAT register do not take effect. + */ +union cvmx_dfa_memhidat +{ + uint64_t u64; + struct cvmx_dfa_memhidat_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t hidat : 64; /**< DFA Hi-QW of Write data during NCB-Direct DFM DDR3 + Memory accesses. + All DFM DDR3 memory accesses are OW(128b) references, + and since NCB-Direct Mode writes only support QW(64b), + the Hi QW of data must be sourced from a CSR register. + NOTE: This single register is 'shared' for ALL DFM + DDR3 Memory writes. */ +#else + uint64_t hidat : 64; +#endif + } s; + struct cvmx_dfa_memhidat_s cn63xx; + struct cvmx_dfa_memhidat_s cn63xxp1; +}; +typedef union cvmx_dfa_memhidat cvmx_dfa_memhidat_t; + +/** + * cvmx_dfa_memrld + * + * DFA_MEMRLD = DFA RLDRAM MRS Register Values + * + * Description: + */ +union cvmx_dfa_memrld +{ + uint64_t u64; + struct cvmx_dfa_memrld_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_23_63 : 41; + uint64_t mrsdat : 23; /**< This field represents the data driven onto the + A[22:0] address lines during MRS(Mode Register Set) + commands (during a HW init sequence). This field + corresponds with the Mode Register Bit Map from + your RLDRAM-II device specific data sheet. + A[17:10]: RESERVED + A[9]: ODT (on die termination) + A[8]: Impedance Matching + A[7]: DLL Reset + A[6]: UNUSED + A[5]: Address Mux (for N3K: MUST BE ZERO) + A[4:3]: Burst Length (for N3K: MUST BE ZERO) + A[2:0]: Configuration (see data sheet for + specific RLDRAM-II device). + - 000-001: CFG=1 [tRC=4/tRL=4/tWL=5] + - 010: CFG=2 [tRC=6/tRL=6/tWL=7] + - 011: CFG=3 [tRC=8/tRL=8/tWL=9] + - 100-111: RESERVED + NOTE: For additional density, the RLDRAM-II parts + can be 'clamshelled' (ie: two devices mounted on + different sides of the PCB board), since the BGA + pinout supports 'mirroring'. + To support a clamshell design, SW must preload + the MRSDAT[22:0] with the proper A[22:0] pin mapping + which is dependent on the 'selected' bunk/clam + (see also: DFA_MEMCFG0[BUNK_INIT] field). + NOTE: Care MUST BE TAKEN NOT to write to this register + within 64K eclk cycles of a HW INIT (see: INIT_P0/INIT_P1). + NOTE: This should only be written to a different value + during power-on SW initialization. */ +#else + uint64_t mrsdat : 23; + uint64_t reserved_23_63 : 41; +#endif + } s; + struct cvmx_dfa_memrld_s cn38xx; + struct cvmx_dfa_memrld_s cn38xxp2; + struct cvmx_dfa_memrld_s cn58xx; + struct cvmx_dfa_memrld_s cn58xxp1; +}; +typedef union cvmx_dfa_memrld cvmx_dfa_memrld_t; + +/** + * cvmx_dfa_ncbctl + * + * DFA_NCBCTL = DFA NCB CTL Register + * + * Description: + */ +union cvmx_dfa_ncbctl +{ + uint64_t u64; + struct cvmx_dfa_ncbctl_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_11_63 : 53; + uint64_t sbdnum : 5; /**< SBD Debug Entry# + For internal use only. (DFA Scoreboard debug) + Selects which one of 32 DFA Scoreboard entries is + latched into the DFA_SBD_DBG[0-3] registers. */ + uint64_t sbdlck : 1; /**< DFA Scoreboard LOCK Strobe + For internal use only. (DFA Scoreboard debug) + When written with a '1', the DFA Scoreboard Debug + registers (DFA_SBD_DBG[0-3]) are all locked down. + This allows SW to lock down the contents of the entire + SBD for a single instant in time. All subsequent reads + of the DFA scoreboard registers will return the data + from that instant in time. */ + uint64_t dcmode : 1; /**< DRF-CRQ/DTE Arbiter Mode + DTE-DRF Arbiter (0=FP [LP=CRQ/HP=DTE],1=RR) + NOTE: This should only be written to a different value + during power-on SW initialization. */ + uint64_t dtmode : 1; /**< DRF-DTE Arbiter Mode + DTE-DRF Arbiter (0=FP [LP=DTE[15],...,HP=DTE[0]],1=RR) + NOTE: This should only be written to a different value + during power-on SW initialization. */ + uint64_t pmode : 1; /**< NCB-NRP Arbiter Mode + (0=Fixed Priority [LP=WQF,DFF,HP=RGF]/1=RR + NOTE: This should only be written to a different value + during power-on SW initialization. */ + uint64_t qmode : 1; /**< NCB-NRQ Arbiter Mode + (0=Fixed Priority [LP=IRF,RWF,PRF,HP=GRF]/1=RR + NOTE: This should only be written to a different value + during power-on SW initialization. */ + uint64_t imode : 1; /**< NCB-Inbound Arbiter + (0=FP [LP=NRQ,HP=NRP], 1=RR) + NOTE: This should only be written to a different value + during power-on SW initialization. */ +#else + uint64_t imode : 1; + uint64_t qmode : 1; + uint64_t pmode : 1; + uint64_t dtmode : 1; + uint64_t dcmode : 1; + uint64_t sbdlck : 1; + uint64_t sbdnum : 5; + uint64_t reserved_11_63 : 53; +#endif + } s; + struct cvmx_dfa_ncbctl_cn38xx + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_10_63 : 54; + uint64_t sbdnum : 4; /**< SBD Debug Entry# + For internal use only. (DFA Scoreboard debug) + Selects which one of 16 DFA Scoreboard entries is + latched into the DFA_SBD_DBG[0-3] registers. */ + uint64_t sbdlck : 1; /**< DFA Scoreboard LOCK Strobe + For internal use only. (DFA Scoreboard debug) + When written with a '1', the DFA Scoreboard Debug + registers (DFA_SBD_DBG[0-3]) are all locked down. + This allows SW to lock down the contents of the entire + SBD for a single instant in time. All subsequent reads + of the DFA scoreboard registers will return the data + from that instant in time. */ + uint64_t dcmode : 1; /**< DRF-CRQ/DTE Arbiter Mode + DTE-DRF Arbiter (0=FP [LP=CRQ/HP=DTE],1=RR) + NOTE: This should only be written to a different value + during power-on SW initialization. */ + uint64_t dtmode : 1; /**< DRF-DTE Arbiter Mode + DTE-DRF Arbiter (0=FP [LP=DTE[15],...,HP=DTE[0]],1=RR) + NOTE: This should only be written to a different value + during power-on SW initialization. */ + uint64_t pmode : 1; /**< NCB-NRP Arbiter Mode + (0=Fixed Priority [LP=WQF,DFF,HP=RGF]/1=RR + NOTE: This should only be written to a different value + during power-on SW initialization. */ + uint64_t qmode : 1; /**< NCB-NRQ Arbiter Mode + (0=Fixed Priority [LP=IRF,RWF,PRF,HP=GRF]/1=RR + NOTE: This should only be written to a different value + during power-on SW initialization. */ + uint64_t imode : 1; /**< NCB-Inbound Arbiter + (0=FP [LP=NRQ,HP=NRP], 1=RR) + NOTE: This should only be written to a different value + during power-on SW initialization. */ +#else + uint64_t imode : 1; + uint64_t qmode : 1; + uint64_t pmode : 1; + uint64_t dtmode : 1; + uint64_t dcmode : 1; + uint64_t sbdlck : 1; + uint64_t sbdnum : 4; + uint64_t reserved_10_63 : 54; +#endif + } cn38xx; + struct cvmx_dfa_ncbctl_cn38xx cn38xxp2; + struct cvmx_dfa_ncbctl_s cn58xx; + struct cvmx_dfa_ncbctl_s cn58xxp1; +}; +typedef union cvmx_dfa_ncbctl cvmx_dfa_ncbctl_t; + +/** + * cvmx_dfa_pfc0_cnt + * + * DFA_PFC0_CNT = DFA Performance Counter \#0 + * *FOR INTERNAL USE ONLY* + * Description: + */ +union cvmx_dfa_pfc0_cnt +{ + uint64_t u64; + struct cvmx_dfa_pfc0_cnt_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t pfcnt0 : 64; /**< Performance Counter \#0 + When DFA_PFC_GCTL[CNT0ENA]=1, the event selected + by DFA_PFC0_CTL[EVSEL] is counted. + See also DFA_PFC_GCTL[CNT0WCLR] and DFA_PFC_GCTL + [CNT0RCLR] for special clear count cases available + for SW data collection. */ +#else + uint64_t pfcnt0 : 64; +#endif + } s; + struct cvmx_dfa_pfc0_cnt_s cn63xx; + struct cvmx_dfa_pfc0_cnt_s cn63xxp1; +}; +typedef union cvmx_dfa_pfc0_cnt cvmx_dfa_pfc0_cnt_t; + +/** + * cvmx_dfa_pfc0_ctl + * + * DFA_PFC0_CTL = DFA Performance Counter#0 Control + * *FOR INTERNAL USE ONLY* + * Description: + */ +union cvmx_dfa_pfc0_ctl +{ + uint64_t u64; + struct cvmx_dfa_pfc0_ctl_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_14_63 : 50; + uint64_t evsel : 6; /**< Performance Counter#0 Event Selector + // Events [0-31] are based on PMODE(0:per cluster-DTE 1:per graph) + - 0: \#Total Cycles + - 1: \#LDNODE visits + - 2: \#SDNODE visits + - 3: \#DNODE visits (LD/SD) + - 4: \#LCNODE visits + - 5: \#SCNODE visits + - 6: \#CNODE visits (LC/SC) + - 7: \#LMNODE visits + - 8: \#SMNODE visits + - 9: \#MNODE visits (LM/SM) + - 10: \#MONODE visits + - 11: \#CACHE visits (DNODE,CNODE) exc: CNDRD,MPHIDX + - 12: \#CACHE visits (DNODE,CNODE)+(CNDRD,MPHIDX) + - 13: \#MEMORY visits (MNODE+MONODE) + - 14: \#CNDRDs detected (occur for SCNODE->*MNODE transitions) + - 15: \#MPHIDX detected (occur for ->LMNODE transitions) + - 16: \#RESCANs detected (occur when HASH collision is detected) + - 17: \#GWALK iterations STALLED - Packet data/Result Buffer + - 18: \#GWALK iterations NON-STALLED + - 19: \#CLOAD iterations + - 20: \#MLOAD iterations + [NOTE: If PMODE=1(per-graph) the MLOAD IWORD0.VGID will be used to discern graph#]. + - 21: \#RWORD1+ writes + - 22: \#cycles Cluster is busy + - 23: \#GWALK Instructions + - 24: \#CLOAD Instructions + - 25: \#MLOAD Instructions + [NOTE: If PMODE=1(per-graph) the MLOAD IWORD0.VGID will be used to discern graph#]. + - 26: \#GFREE Instructions + - 27-30: RESERVED + - 31: \# Node Transitions detected (see DFA_PFC_GCTL[SNODE,ENODE,EDNODE] registers + //============================================================= + // Events [32-63] are used ONLY FOR PMODE=0(per-cluster DTE mode): + - 32: \#cycles a specific cluster-DTE remains active(valid state) + - 33: \#cycles a specific cluster-DTE waits for Memory Response Data + - 34: \#cycles a specific cluster-DTE waits in resource stall state + (waiting for packet data or result buffer space) + - 35: \#cycles a specific cluster-DTE waits in resource pending state + - 36-63: RESERVED + //============================================================= */ + uint64_t reserved_6_7 : 2; + uint64_t cldte : 4; /**< Performance Counter#0 Cluster DTE Selector + When DFA_PFC_GCTL[PMODE]=0 (per-cluster DTE), this field + is used to select/monitor the cluster's DTE# for all events + associated with Performance Counter#0. */ + uint64_t clnum : 2; /**< Performance Counter#0 Cluster Selector + When DFA_PFC_GCTL[PMODE]=0 (per-cluster DTE), this field + is used to select/monitor the cluster# for all events + associated with Performance Counter#0. */ +#else + uint64_t clnum : 2; + uint64_t cldte : 4; + uint64_t reserved_6_7 : 2; + uint64_t evsel : 6; + uint64_t reserved_14_63 : 50; +#endif + } s; + struct cvmx_dfa_pfc0_ctl_s cn63xx; + struct cvmx_dfa_pfc0_ctl_s cn63xxp1; +}; +typedef union cvmx_dfa_pfc0_ctl cvmx_dfa_pfc0_ctl_t; + +/** + * cvmx_dfa_pfc1_cnt + * + * DFA_PFC1_CNT = DFA Performance Counter \#1 + * *FOR INTERNAL USE ONLY* + * Description: + */ +union cvmx_dfa_pfc1_cnt +{ + uint64_t u64; + struct cvmx_dfa_pfc1_cnt_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t pfcnt1 : 64; /**< Performance Counter \#1 + When DFA_PFC_GCTL[CNT1ENA]=1, the event selected + by DFA_PFC1_CTL[EVSEL] is counted. + See also DFA_PFC_GCTL[CNT1WCLR] and DFA_PFC_GCTL + [CNT1RCLR] for special clear count cases available + for SW data collection. */ +#else + uint64_t pfcnt1 : 64; +#endif + } s; + struct cvmx_dfa_pfc1_cnt_s cn63xx; + struct cvmx_dfa_pfc1_cnt_s cn63xxp1; +}; +typedef union cvmx_dfa_pfc1_cnt cvmx_dfa_pfc1_cnt_t; + +/** + * cvmx_dfa_pfc1_ctl + * + * DFA_PFC1_CTL = DFA Performance Counter#1 Control + * *FOR INTERNAL USE ONLY* + * Description: + */ +union cvmx_dfa_pfc1_ctl +{ + uint64_t u64; + struct cvmx_dfa_pfc1_ctl_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_14_63 : 50; + uint64_t evsel : 6; /**< Performance Counter#1 Event Selector + - 0: \#Cycles + - 1: \#LDNODE visits + - 2: \#SDNODE visits + - 3: \#DNODE visits (LD/SD) + - 4: \#LCNODE visits + - 5: \#SCNODE visits + - 6: \#CNODE visits (LC/SC) + - 7: \#LMNODE visits + - 8: \#SMNODE visits + - 9: \#MNODE visits (LM/SM) + - 10: \#MONODE visits + - 11: \#CACHE visits (DNODE,CNODE) exc: CNDRD,MPHIDX + - 12: \#CACHE visits (DNODE,CNODE)+(CNDRD,MPHIDX) + - 13: \#MEMORY visits (MNODE+MONODE) + - 14: \#CNDRDs detected (occur for SCNODE->*MNODE transitions) + - 15: \#MPHIDX detected (occur for ->LMNODE transitions) + - 16: \#RESCANs detected (occur when HASH collision is detected) + - 17: \#GWALK STALLs detected - Packet data/Result Buffer + - 18: \#GWALK DTE cycles (all DTE-GNT[3a]) + - 19: \#CLOAD DTE cycles + - 20: \#MLOAD DTE cycles + - 21: \#cycles waiting for Memory Response Data + - 22: \#cycles waiting in resource stall state (waiting for packet data or result buffer space) + - 23: \#cycles waiting in resource pending state + - 24: \#RWORD1+ writes + - 25: \#DTE-VLD cycles + - 26: \#DTE Transitions detected (see DFA_PFC_GCTL[SNODE,ENODE] registers + - 27: \#GWALK Instructions + - 28: \#CLOAD Instructions + - 29: \#MLOAD Instructions + - 30: \#GFREE Instructions (== \#GFREE DTE cycles) + - 31: RESERVED + - 32: \#DTE-Busy cycles (ALL DTE-GNT strobes) */ + uint64_t reserved_6_7 : 2; + uint64_t cldte : 4; /**< Performance Counter#1 Cluster DTE Selector + When DFA_PFC_GCTL[PMODE]=0 (per-cluster DTE), this field + is used to select/monitor the cluster's DTE# for all events + associated with Performance Counter#1. */ + uint64_t clnum : 2; /**< Performance Counter#1 Cluster Selector + When DFA_PFC_GCTL[PMODE]=0 (per-cluster DTE), this field + is used to select/monitor the cluster# for all events + associated with Performance Counter#1. */ +#else + uint64_t clnum : 2; + uint64_t cldte : 4; + uint64_t reserved_6_7 : 2; + uint64_t evsel : 6; + uint64_t reserved_14_63 : 50; +#endif + } s; + struct cvmx_dfa_pfc1_ctl_s cn63xx; + struct cvmx_dfa_pfc1_ctl_s cn63xxp1; +}; +typedef union cvmx_dfa_pfc1_ctl cvmx_dfa_pfc1_ctl_t; + +/** + * cvmx_dfa_pfc2_cnt + * + * DFA_PFC2_CNT = DFA Performance Counter \#2 + * *FOR INTERNAL USE ONLY* + * Description: + */ +union cvmx_dfa_pfc2_cnt +{ + uint64_t u64; + struct cvmx_dfa_pfc2_cnt_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t pfcnt2 : 64; /**< Performance Counter \#2 + When DFA_PFC_GCTL[CNT2ENA]=1, the event selected + by DFA_PFC2_CTL[EVSEL] is counted. + See also DFA_PFC_GCTL[CNT2WCLR] and DFA_PFC_GCTL + [CNT2RCLR] for special clear count cases available + for SW data collection. */ +#else + uint64_t pfcnt2 : 64; +#endif + } s; + struct cvmx_dfa_pfc2_cnt_s cn63xx; + struct cvmx_dfa_pfc2_cnt_s cn63xxp1; +}; +typedef union cvmx_dfa_pfc2_cnt cvmx_dfa_pfc2_cnt_t; + +/** + * cvmx_dfa_pfc2_ctl + * + * DFA_PFC2_CTL = DFA Performance Counter#2 Control + * *FOR INTERNAL USE ONLY* + * Description: + */ +union cvmx_dfa_pfc2_ctl +{ + uint64_t u64; + struct cvmx_dfa_pfc2_ctl_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_14_63 : 50; + uint64_t evsel : 6; /**< Performance Counter#2 Event Selector + - 0: \#Cycles + - 1: \#LDNODE visits + - 2: \#SDNODE visits + - 3: \#DNODE visits (LD/SD) + - 4: \#LCNODE visits + - 5: \#SCNODE visits + - 6: \#CNODE visits (LC/SC) + - 7: \#LMNODE visits + - 8: \#SMNODE visits + - 9: \#MNODE visits (LM/SM) + - 10: \#MONODE visits + - 11: \#CACHE visits (DNODE,CNODE) exc: CNDRD,MPHIDX + - 12: \#CACHE visits (DNODE,CNODE)+(CNDRD,MPHIDX) + - 13: \#MEMORY visits (MNODE+MONODE) + - 14: \#CNDRDs detected (occur for SCNODE->*MNODE transitions) + - 15: \#MPHIDX detected (occur for ->LMNODE transitions) + - 16: \#RESCANs detected (occur when HASH collision is detected) + - 17: \#GWALK STALLs detected - Packet data/Result Buffer + - 18: \#GWALK DTE cycles (all DTE-GNT[3a]) + - 19: \#CLOAD DTE cycles + - 20: \#MLOAD DTE cycles + - 21: \#cycles waiting for Memory Response Data + - 22: \#cycles waiting in resource stall state (waiting for packet data or result buffer space) + - 23: \#cycles waiting in resource pending state + - 24: \#RWORD1+ writes + - 25: \#DTE-VLD cycles + - 26: \#DTE Transitions detected (see DFA_PFC_GCTL[SNODE,ENODE] registers + - 27: \#GWALK Instructions + - 28: \#CLOAD Instructions + - 29: \#MLOAD Instructions + - 30: \#GFREE Instructions (== \#GFREE DTE cycles) + - 31: RESERVED + - 32: \#DTE-Busy cycles (ALL DTE-GNT strobes) */ + uint64_t reserved_6_7 : 2; + uint64_t cldte : 4; /**< Performance Counter#2 Cluster DTE Selector + When DFA_PFC_GCTL[PMODE]=0 (per-cluster DTE), this field + is used to select/monitor the cluster's DTE# for all events + associated with Performance Counter#2. */ + uint64_t clnum : 2; /**< Performance Counter#2 Cluster Selector + When DFA_PFC_GCTL[PMODE]=0 (per-cluster DTE), this field + is used to select/monitor the cluster# for all events + associated with Performance Counter#2. */ +#else + uint64_t clnum : 2; + uint64_t cldte : 4; + uint64_t reserved_6_7 : 2; + uint64_t evsel : 6; + uint64_t reserved_14_63 : 50; +#endif + } s; + struct cvmx_dfa_pfc2_ctl_s cn63xx; + struct cvmx_dfa_pfc2_ctl_s cn63xxp1; +}; +typedef union cvmx_dfa_pfc2_ctl cvmx_dfa_pfc2_ctl_t; + +/** + * cvmx_dfa_pfc3_cnt + * + * DFA_PFC3_CNT = DFA Performance Counter \#3 + * *FOR INTERNAL USE ONLY* + * Description: + */ +union cvmx_dfa_pfc3_cnt +{ + uint64_t u64; + struct cvmx_dfa_pfc3_cnt_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t pfcnt3 : 64; /**< Performance Counter \#3 + When DFA_PFC_GCTL[CNT3ENA]=1, the event selected + by DFA_PFC3_CTL[EVSEL] is counted. + See also DFA_PFC_GCTL[CNT3WCLR] and DFA_PFC_GCTL + [CNT3RCLR] for special clear count cases available + for SW data collection. */ +#else + uint64_t pfcnt3 : 64; +#endif + } s; + struct cvmx_dfa_pfc3_cnt_s cn63xx; + struct cvmx_dfa_pfc3_cnt_s cn63xxp1; +}; +typedef union cvmx_dfa_pfc3_cnt cvmx_dfa_pfc3_cnt_t; + +/** + * cvmx_dfa_pfc3_ctl + * + * DFA_PFC3_CTL = DFA Performance Counter#3 Control + * *FOR INTERNAL USE ONLY* + * Description: + */ +union cvmx_dfa_pfc3_ctl +{ + uint64_t u64; + struct cvmx_dfa_pfc3_ctl_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_14_63 : 50; + uint64_t evsel : 6; /**< Performance Counter#3 Event Selector + - 0: \#Cycles + - 1: \#LDNODE visits + - 2: \#SDNODE visits + - 3: \#DNODE visits (LD/SD) + - 4: \#LCNODE visits + - 5: \#SCNODE visits + - 6: \#CNODE visits (LC/SC) + - 7: \#LMNODE visits + - 8: \#SMNODE visits + - 9: \#MNODE visits (LM/SM) + - 10: \#MONODE visits + - 11: \#CACHE visits (DNODE,CNODE) exc: CNDRD,MPHIDX + - 12: \#CACHE visits (DNODE,CNODE)+(CNDRD,MPHIDX) + - 13: \#MEMORY visits (MNODE+MONODE) + - 14: \#CNDRDs detected (occur for SCNODE->*MNODE transitions) + - 15: \#MPHIDX detected (occur for ->LMNODE transitions) + - 16: \#RESCANs detected (occur when HASH collision is detected) + - 17: \#GWALK STALLs detected - Packet data/Result Buffer + - 18: \#GWALK DTE cycles (all DTE-GNT[3a]) + - 19: \#CLOAD DTE cycles + - 20: \#MLOAD DTE cycles + - 21: \#cycles waiting for Memory Response Data + - 22: \#cycles waiting in resource stall state (waiting for packet data or result buffer space) + - 23: \#cycles waiting in resource pending state + - 24: \#RWORD1+ writes + - 25: \#DTE-VLD cycles + - 26: \#DTE Transitions detected (see DFA_PFC_GCTL[SNODE,ENODE] registers + - 27: \#GWALK Instructions + - 28: \#CLOAD Instructions + - 29: \#MLOAD Instructions + - 30: \#GFREE Instructions (== \#GFREE DTE cycles) + - 31: RESERVED + - 32: \#DTE-Busy cycles (ALL DTE-GNT strobes) */ + uint64_t reserved_6_7 : 2; + uint64_t cldte : 4; /**< Performance Counter#3 Cluster DTE Selector + When DFA_PFC_GCTL[PMODE]=0 (per-cluster DTE), this field + is used to select/monitor the cluster's DTE# for all events + associated with Performance Counter#3. */ + uint64_t clnum : 2; /**< Performance Counter#3 Cluster Selector + When DFA_PFC_GCTL[PMODE]=0 (per-cluster DTE), this field + is used to select/monitor the cluster# for all events + associated with Performance Counter#3. */ +#else + uint64_t clnum : 2; + uint64_t cldte : 4; + uint64_t reserved_6_7 : 2; + uint64_t evsel : 6; + uint64_t reserved_14_63 : 50; +#endif + } s; + struct cvmx_dfa_pfc3_ctl_s cn63xx; + struct cvmx_dfa_pfc3_ctl_s cn63xxp1; +}; +typedef union cvmx_dfa_pfc3_ctl cvmx_dfa_pfc3_ctl_t; + +/** + * cvmx_dfa_pfc_gctl + * + * DFA_PFC_GCTL = DFA Performance Counter Global Control + * *FOR INTERNAL USE ONLY* + * Description: + */ +union cvmx_dfa_pfc_gctl +{ + uint64_t u64; + struct cvmx_dfa_pfc_gctl_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_29_63 : 35; + uint64_t vgid : 8; /**< Virtual Graph Id# + When PMODE=1(per-graph selector), this field is used + to select/monitor only those events which are + associated with this selected VGID(virtual graph ID). + This field is used globally across all four performance + counters. + IMPNOTE: I implemented a global VGID across all 4 performance + counters to save wires/area. */ + uint64_t pmode : 1; /**< Select Mode + - 0: Events are selected on a per-cluster DTE# (CLNUM/CLDTE) + DFA_PFCx_CTL[CLNUM,CLDTE] specifies the cluster-DTE for + each 1(of 4) performance counters. + - 1: Events are selected on a per-graph basis (VGID=virtual Graph ID). + NOTE: Only EVSEL=[0...31] can be used in conjunction with PMODE=1. + DFA_PFC_GCTL[VGID] specifies the Virtual graph ID used across + all four performance counters. */ + uint64_t ednode : 2; /**< Ending DNODE Selector + When ENODE=0/1(*DNODE), this field is used to further + specify the Ending DNODE transition sub-type: + - 0: ALL DNODE sub-types + - 1: ->D2e (explicit DNODE transition node-arc alone transitions to DNODE) + - 2: ->D2i (implicit DNODE transition:arc-present triggers transition) + - 3: ->D1r (rescan DNODE transition) */ + uint64_t enode : 3; /**< Ending Node Selector + When DFA_PFCx_CTL[EVSEL]=Node Transition(31), the ENODE + field is used to select Ending Node, and the SNODE + field is used to select the Starting Node. + - 0: LDNODE + - 1: SDNODE + - 2: LCNODE + - 3: SCNODE + - 4: LMNODE + - 5: SMNODE + - 6: MONODE + - 7: RESERVED */ + uint64_t snode : 3; /**< Starting Node Selector + When DFA_PFCx_CTL[EVSEL]=Node Transition(31), the SNODE + field is used to select Starting Node, and the ENODE + field is used to select the Ending Node. + - 0: LDNODE + - 1: SDNODE + - 2: LCNODE + - 3: SCNODE + - 4: LMNODE + - 5: SMNODE + - 6: MONODE + - 7: RESERVED */ + uint64_t cnt3rclr : 1; /**< Performance Counter \#3 Read Clear + If this bit is set, CSR reads to the DFA_PFC3_CNT + will clear the count value. This allows SW to maintain + 'cumulative' counters to avoid HW wraparound. */ + uint64_t cnt2rclr : 1; /**< Performance Counter \#2 Read Clear + If this bit is set, CSR reads to the DFA_PFC2_CNT + will clear the count value. This allows SW to maintain + 'cumulative' counters to avoid HW wraparound. */ + uint64_t cnt1rclr : 1; /**< Performance Counter \#1 Read Clear + If this bit is set, CSR reads to the DFA_PFC1_CNT + will clear the count value. This allows SW to maintain + 'cumulative' counters to avoid HW wraparound. */ + uint64_t cnt0rclr : 1; /**< Performance Counter \#0 Read Clear + If this bit is set, CSR reads to the DFA_PFC0_CNT + will clear the count value. This allows SW to maintain + 'cumulative' counters to avoid HW wraparound. */ + uint64_t cnt3wclr : 1; /**< Performance Counter \#3 Write Clear + If this bit is set, CSR writes to the DFA_PFC3_CNT + will clear the count value. + If this bit is clear, CSR writes to the DFA_PFC3_CNT + will continue the count from the written value. */ + uint64_t cnt2wclr : 1; /**< Performance Counter \#2 Write Clear + If this bit is set, CSR writes to the DFA_PFC2_CNT + will clear the count value. + If this bit is clear, CSR writes to the DFA_PFC2_CNT + will continue the count from the written value. */ + uint64_t cnt1wclr : 1; /**< Performance Counter \#1 Write Clear + If this bit is set, CSR writes to the DFA_PFC1_CNT + will clear the count value. + If this bit is clear, CSR writes to the DFA_PFC1_CNT + will continue the count from the written value. */ + uint64_t cnt0wclr : 1; /**< Performance Counter \#0 Write Clear + If this bit is set, CSR writes to the DFA_PFC0_CNT + will clear the count value. + If this bit is clear, CSR writes to the DFA_PFC0_CNT + will continue the count from the written value. */ + uint64_t cnt3ena : 1; /**< Performance Counter 3 Enable + When this bit is set, the performance counter \#3 + is enabled. */ + uint64_t cnt2ena : 1; /**< Performance Counter 2 Enable + When this bit is set, the performance counter \#2 + is enabled. */ + uint64_t cnt1ena : 1; /**< Performance Counter 1 Enable + When this bit is set, the performance counter \#1 + is enabled. */ + uint64_t cnt0ena : 1; /**< Performance Counter 0 Enable + When this bit is set, the performance counter \#0 + is enabled. */ +#else + uint64_t cnt0ena : 1; + uint64_t cnt1ena : 1; + uint64_t cnt2ena : 1; + uint64_t cnt3ena : 1; + uint64_t cnt0wclr : 1; + uint64_t cnt1wclr : 1; + uint64_t cnt2wclr : 1; + uint64_t cnt3wclr : 1; + uint64_t cnt0rclr : 1; + uint64_t cnt1rclr : 1; + uint64_t cnt2rclr : 1; + uint64_t cnt3rclr : 1; + uint64_t snode : 3; + uint64_t enode : 3; + uint64_t ednode : 2; + uint64_t pmode : 1; + uint64_t vgid : 8; + uint64_t reserved_29_63 : 35; +#endif + } s; + struct cvmx_dfa_pfc_gctl_s cn63xx; + struct cvmx_dfa_pfc_gctl_s cn63xxp1; +}; +typedef union cvmx_dfa_pfc_gctl cvmx_dfa_pfc_gctl_t; + +/** + * cvmx_dfa_rodt_comp_ctl + * + * DFA_RODT_COMP_CTL = DFA RLD Compensation control (For read "on die termination") + * + */ +union cvmx_dfa_rodt_comp_ctl +{ + uint64_t u64; + struct cvmx_dfa_rodt_comp_ctl_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t reserved_17_63 : 47; + uint64_t enable : 1; /**< Read On Die Termination Enable + (0=disable, 1=enable) */ + uint64_t reserved_12_15 : 4; + uint64_t nctl : 4; /**< Compensation control bits */ + uint64_t reserved_5_7 : 3; + uint64_t pctl : 5; /**< Compensation control bits */ +#else + uint64_t pctl : 5; + uint64_t reserved_5_7 : 3; + uint64_t nctl : 4; + uint64_t reserved_12_15 : 4; + uint64_t enable : 1; + uint64_t reserved_17_63 : 47; +#endif + } s; + struct cvmx_dfa_rodt_comp_ctl_s cn58xx; + struct cvmx_dfa_rodt_comp_ctl_s cn58xxp1; +}; +typedef union cvmx_dfa_rodt_comp_ctl cvmx_dfa_rodt_comp_ctl_t; + +/** + * cvmx_dfa_sbd_dbg0 + * + * DFA_SBD_DBG0 = DFA Scoreboard Debug \#0 Register + * + * Description: When the DFA_NCBCTL[SBDLCK] bit is written '1', the contents of this register are locked down. + * Otherwise, the contents of this register are the 'active' contents of the DFA Scoreboard at the time of the + * CSR read. + * VERIFICATION NOTE: Read data is unsafe. X's(undefined data) can propagate (in the behavioral model) + * on the reads unless the DTE Engine specified by DFA_NCBCTL[SBDNUM] has previously been assigned an + * instruction. + */ +union cvmx_dfa_sbd_dbg0 +{ + uint64_t u64; + struct cvmx_dfa_sbd_dbg0_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t sbd0 : 64; /**< DFA ScoreBoard \#0 Data + For internal use only! (DFA Scoreboard Debug) + [63:40] rptr[26:3]: Result Base Pointer + [39:24] rwcnt[15:0] Cumulative Result Write Counter + [23] lastgrdrsp: Last Gather-Rd Response + [22] wtgrdrsp: Waiting Gather-Rd Response + [21] wtgrdreq: Waiting for Gather-Rd Issue + [20] glvld: GLPTR/GLCNT Valid + [19] cmpmark: Completion Marked Node Detected + [18:17] cmpcode[1:0]: Completion Code + [0=PDGONE/1=PERR/2=RFULL/3=TERM] + [16] cmpdet: Completion Detected + [15] wthdrwrcmtrsp: Waiting for HDR RWrCmtRsp + [14] wtlastwrcmtrsp: Waiting for LAST RESULT + RWrCmtRsp + [13] hdrwrreq: Waiting for HDR RWrReq + [12] wtrwrreq: Waiting for RWrReq + [11] wtwqwrreq: Waiting for WQWrReq issue + [10] lastprdrspeot: Last Packet-Rd Response + [9] lastprdrsp: Last Packet-Rd Response + [8] wtprdrsp: Waiting for PRdRsp EOT + [7] wtprdreq: Waiting for PRdReq Issue + [6] lastpdvld: PDPTR/PDLEN Valid + [5] pdvld: Packet Data Valid + [4] wqvld: WQVLD + [3] wqdone: WorkQueue Done condition + a) WQWrReq issued(for WQPTR<>0) OR + b) HDR RWrCmtRsp completed) + [2] rwstf: Resultant write STF/P Mode + [1] pdldt: Packet-Data LDT mode + [0] gmode: Gather-Mode */ +#else + uint64_t sbd0 : 64; +#endif + } s; + struct cvmx_dfa_sbd_dbg0_s cn31xx; + struct cvmx_dfa_sbd_dbg0_s cn38xx; + struct cvmx_dfa_sbd_dbg0_s cn38xxp2; + struct cvmx_dfa_sbd_dbg0_s cn58xx; + struct cvmx_dfa_sbd_dbg0_s cn58xxp1; +}; +typedef union cvmx_dfa_sbd_dbg0 cvmx_dfa_sbd_dbg0_t; + +/** + * cvmx_dfa_sbd_dbg1 + * + * DFA_SBD_DBG1 = DFA Scoreboard Debug \#1 Register + * + * Description: When the DFA_NCBCTL[SBDLCK] bit is written '1', the contents of this register are locked down. + * Otherwise, the contents of this register are the 'active' contents of the DFA Scoreboard at the time of the + * CSR read. + * VERIFICATION NOTE: Read data is unsafe. X's(undefined data) can propagate (in the behavioral model) + * on the reads unless the DTE Engine specified by DFA_NCBCTL[SBDNUM] has previously been assigned an + * instruction. + */ +union cvmx_dfa_sbd_dbg1 +{ + uint64_t u64; + struct cvmx_dfa_sbd_dbg1_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t sbd1 : 64; /**< DFA ScoreBoard \#1 Data + For internal use only! (DFA Scoreboard Debug) + [63:61] wqptr[35:33]: Work Queue Pointer + [60:52] rptr[35:27]: Result Base Pointer + [51:16] pdptr[35:0]: Packet Data Pointer + [15:0] pdcnt[15:0]: Packet Data Counter */ +#else + uint64_t sbd1 : 64; +#endif + } s; + struct cvmx_dfa_sbd_dbg1_s cn31xx; + struct cvmx_dfa_sbd_dbg1_s cn38xx; + struct cvmx_dfa_sbd_dbg1_s cn38xxp2; + struct cvmx_dfa_sbd_dbg1_s cn58xx; + struct cvmx_dfa_sbd_dbg1_s cn58xxp1; +}; +typedef union cvmx_dfa_sbd_dbg1 cvmx_dfa_sbd_dbg1_t; + +/** + * cvmx_dfa_sbd_dbg2 + * + * DFA_SBD_DBG2 = DFA Scoreboard Debug \#2 Register + * + * Description: When the DFA_NCBCTL[SBDLCK] bit is written '1', the contents of this register are locked down. + * Otherwise, the contents of this register are the 'active' contents of the DFA Scoreboard at the time of the + * CSR read. + * VERIFICATION NOTE: Read data is unsafe. X's(undefined data) can propagate (in the behavioral model) + * on the reads unless the DTE Engine specified by DFA_NCBCTL[SBDNUM] has previously been assigned an + * instruction. + */ +union cvmx_dfa_sbd_dbg2 +{ + uint64_t u64; + struct cvmx_dfa_sbd_dbg2_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t sbd2 : 64; /**< DFA ScoreBoard \#2 Data + [63:49] wqptr[17:3]: Work Queue Pointer + [48:16] rwptr[35:3]: Result Write Pointer + [15:0] prwcnt[15:0]: Pending Result Write Counter */ +#else + uint64_t sbd2 : 64; +#endif + } s; + struct cvmx_dfa_sbd_dbg2_s cn31xx; + struct cvmx_dfa_sbd_dbg2_s cn38xx; + struct cvmx_dfa_sbd_dbg2_s cn38xxp2; + struct cvmx_dfa_sbd_dbg2_s cn58xx; + struct cvmx_dfa_sbd_dbg2_s cn58xxp1; +}; +typedef union cvmx_dfa_sbd_dbg2 cvmx_dfa_sbd_dbg2_t; + +/** + * cvmx_dfa_sbd_dbg3 + * + * DFA_SBD_DBG3 = DFA Scoreboard Debug \#3 Register + * + * Description: When the DFA_NCBCTL[SBDLCK] bit is written '1', the contents of this register are locked down. + * Otherwise, the contents of this register are the 'active' contents of the DFA Scoreboard at the time of the + * CSR read. + * VERIFICATION NOTE: Read data is unsafe. X's(undefined data) can propagate (in the behavioral model) + * on the reads unless the DTE Engine specified by DFA_NCBCTL[SBDNUM] has previously been assigned an + * instruction. + */ +union cvmx_dfa_sbd_dbg3 +{ + uint64_t u64; + struct cvmx_dfa_sbd_dbg3_s + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t sbd3 : 64; /**< DFA ScoreBoard \#3 Data + [63:49] wqptr[32:18]: Work Queue Pointer + [48:16] glptr[35:3]: Gather List Pointer + [15:0] glcnt[15:0]: Gather List Counter */ +#else + uint64_t sbd3 : 64; +#endif + } s; + struct cvmx_dfa_sbd_dbg3_s cn31xx; + struct cvmx_dfa_sbd_dbg3_s cn38xx; + struct cvmx_dfa_sbd_dbg3_s cn38xxp2; + struct cvmx_dfa_sbd_dbg3_s cn58xx; + struct cvmx_dfa_sbd_dbg3_s cn58xxp1; +}; +typedef union cvmx_dfa_sbd_dbg3 cvmx_dfa_sbd_dbg3_t; + +#endif |