[linux-yocto] [PATCH 9/9] MIPS:OCTEON: More OCTEONIII support
Chandrakala Chavva
cchavva.cavm at gmail.com
Fri Jan 23 09:53:14 PST 2015
From: Abhishek Paliwal <abhishek.paliwal at aricent.com>
From: Chandrakala Chavva <cchavva at caviumnetworks.com>
Read clock rate from the correct CSR. Don't clear COP0_DCACHE for OCTEONIII.
Signed-off-by: Chandrakala Chavva <cchavva at caviumnetworks.com>
Signed-off-by: Abhishek Paliwal <abhishek.paliwal at aricent.com>
---
arch/mips/Makefile | 7 +
arch/mips/cavium-octeon/csrc-octeon.c | 7 +
arch/mips/cavium-octeon/setup.c | 8 +-
.../asm/mach-cavium-octeon/kernel-entry-init.h | 3 +
arch/mips/include/asm/octeon/cvmx-rst-defs.h | 564 +++++++++++++++++++++
5 files changed, 588 insertions(+), 1 deletion(-)
create mode 100644 arch/mips/include/asm/octeon/cvmx-rst-defs.h
diff --git a/arch/mips/Makefile b/arch/mips/Makefile
index 9b8556d..5be8eec 100644
--- a/arch/mips/Makefile
+++ b/arch/mips/Makefile
@@ -156,6 +156,13 @@ ifeq (,$(findstring march=octeon, $(cflags-$(CONFIG_CPU_CAVIUM_OCTEON))))
cflags-$(CONFIG_CPU_CAVIUM_OCTEON) += -Wa,-march=octeon
endif
cflags-$(CONFIG_CAVIUM_CN63XXP1) += -Wa,-mfix-cn63xxp1
+
+ifdef CONFIG_CAVIUM_OCTEON_CHK_CVMX_ADDRESS
+cflags-y += -DCVMX_ENABLE_CSR_ADDRESS_CHECKING=1
+else
+cflags-y += -DCVMX_ENABLE_CSR_ADDRESS_CHECKING=0
+endif
+
cflags-$(CONFIG_CPU_BMIPS) += -march=mips32 -Wa,-mips32 -Wa,--trap
cflags-$(CONFIG_CPU_R4000_WORKAROUNDS) += $(call cc-option,-mfix-r4000,)
diff --git a/arch/mips/cavium-octeon/csrc-octeon.c b/arch/mips/cavium-octeon/csrc-octeon.c
index b752c4e..612d379 100644
--- a/arch/mips/cavium-octeon/csrc-octeon.c
+++ b/arch/mips/cavium-octeon/csrc-octeon.c
@@ -18,6 +18,7 @@
#include <asm/octeon/octeon.h>
#include <asm/octeon/cvmx-ipd-defs.h>
#include <asm/octeon/cvmx-mio-defs.h>
+#include <asm/octeon/cvmx-rst-defs.h>
static u64 f;
@@ -43,6 +44,12 @@ void __init octeon_setup_delays(void)
rdiv = rst_boot.s.c_mul; /* CPU clock */
sdiv = rst_boot.s.pnr_mul; /* I/O clock */
f = (0x8000000000000000ull / sdiv) * 2;
+ } else if (current_cpu_type() == CPU_CAVIUM_OCTEON3) {
+ union cvmx_rst_boot rst_boot;
+ rst_boot.u64 = cvmx_read_csr(CVMX_RST_BOOT);
+ rdiv = rst_boot.s.c_mul; /* CPU clock */
+ sdiv = rst_boot.s.pnr_mul; /* I/O clock */
+ f = (0x8000000000000000ull / sdiv) * 2;
}
}
diff --git a/arch/mips/cavium-octeon/setup.c b/arch/mips/cavium-octeon/setup.c
index eccf9a9..d65238d 100644
--- a/arch/mips/cavium-octeon/setup.c
+++ b/arch/mips/cavium-octeon/setup.c
@@ -41,6 +41,7 @@
#include <asm/octeon/octeon.h>
#include <asm/octeon/pci-octeon.h>
#include <asm/octeon/cvmx-mio-defs.h>
+#include <asm/octeon/cvmx-rst-defs.h>
extern struct plat_smp_ops octeon_smp_ops;
@@ -653,11 +654,16 @@ void __init prom_init(void)
sysinfo->dfa_ref_clock_hz = octeon_bootinfo->dfa_ref_clock_hz;
sysinfo->bootloader_config_flags = octeon_bootinfo->config_flags;
- if (OCTEON_IS_MODEL(OCTEON_CN6XXX)) {
+ if (current_cpu_type() == CPU_CAVIUM_OCTEON2) {
/* I/O clock runs at a different rate than the CPU. */
union cvmx_mio_rst_boot rst_boot;
rst_boot.u64 = cvmx_read_csr(CVMX_MIO_RST_BOOT);
octeon_io_clock_rate = 50000000 * rst_boot.s.pnr_mul;
+ } else if (current_cpu_type() == CPU_CAVIUM_OCTEON3) {
+ /* I/O clock runs at a different rate than the CPU. */
+ union cvmx_rst_boot rst_boot;
+ rst_boot.u64 = cvmx_read_csr(CVMX_RST_BOOT);
+ octeon_io_clock_rate = 50000000 * rst_boot.s.pnr_mul;
} else {
octeon_io_clock_rate = sysinfo->cpu_clock_hz;
}
diff --git a/arch/mips/include/asm/mach-cavium-octeon/kernel-entry-init.h b/arch/mips/include/asm/mach-cavium-octeon/kernel-entry-init.h
index f5ab254..b18d64e 100644
--- a/arch/mips/include/asm/mach-cavium-octeon/kernel-entry-init.h
+++ b/arch/mips/include/asm/mach-cavium-octeon/kernel-entry-init.h
@@ -101,6 +101,9 @@ skip:
mfc0 v0, CP0_PRID_REG
bbit0 v0, 15, 1f
# OCTEON II or better have bit 15 set. Clear the error bits.
+ and t1, v0, 0xff00
+ dli v0, 0x9500
+ bge t1, v0, 1f # OCTEON III has no DCACHE_ERR_REG COP0
dli v0, 0x27
dmtc0 v0, CP0_DCACHE_ERR_REG
1 :
diff --git a/arch/mips/include/asm/octeon/cvmx-rst-defs.h b/arch/mips/include/asm/octeon/cvmx-rst-defs.h
new file mode 100644
index 0000000..9db8d35
--- /dev/null
+++ b/arch/mips/include/asm/octeon/cvmx-rst-defs.h
@@ -0,0 +1,564 @@
+/***********************license start***************
+ * Copyright (c) 2003-2014 Cavium Inc. (support at 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 Inc. 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 INC. 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-rst-defs.h
+ *
+ * Configuration and status register (CSR) type definitions for
+ * Octeon rst.
+ *
+ * This file is auto generated. Do not edit.
+ *
+ * <hr>$Revision$<hr>
+ *
+ */
+#ifndef __CVMX_RST_DEFS_H__
+#define __CVMX_RST_DEFS_H__
+
+#if CVMX_ENABLE_CSR_ADDRESS_CHECKING
+#define CVMX_RST_BOOT CVMX_RST_BOOT_FUNC()
+static inline uint64_t CVMX_RST_BOOT_FUNC(void)
+{
+ if (!(OCTEON_IS_MODEL(OCTEON_CN70XX) || OCTEON_IS_MODEL(OCTEON_CN78XX)))
+ cvmx_warn("CVMX_RST_BOOT not supported on this chip\n");
+ return CVMX_ADD_IO_SEG(0x0001180006001600ull);
+}
+#else
+#define CVMX_RST_BOOT (CVMX_ADD_IO_SEG(0x0001180006001600ull))
+#endif
+#if CVMX_ENABLE_CSR_ADDRESS_CHECKING
+#define CVMX_RST_CFG CVMX_RST_CFG_FUNC()
+static inline uint64_t CVMX_RST_CFG_FUNC(void)
+{
+ if (!(OCTEON_IS_MODEL(OCTEON_CN70XX) || OCTEON_IS_MODEL(OCTEON_CN78XX)))
+ cvmx_warn("CVMX_RST_CFG not supported on this chip\n");
+ return CVMX_ADD_IO_SEG(0x0001180006001610ull);
+}
+#else
+#define CVMX_RST_CFG (CVMX_ADD_IO_SEG(0x0001180006001610ull))
+#endif
+#if CVMX_ENABLE_CSR_ADDRESS_CHECKING
+#define CVMX_RST_CKILL CVMX_RST_CKILL_FUNC()
+static inline uint64_t CVMX_RST_CKILL_FUNC(void)
+{
+ if (!(OCTEON_IS_MODEL(OCTEON_CN70XX) || OCTEON_IS_MODEL(OCTEON_CN78XX)))
+ cvmx_warn("CVMX_RST_CKILL not supported on this chip\n");
+ return CVMX_ADD_IO_SEG(0x0001180006001638ull);
+}
+#else
+#define CVMX_RST_CKILL (CVMX_ADD_IO_SEG(0x0001180006001638ull))
+#endif
+#if CVMX_ENABLE_CSR_ADDRESS_CHECKING
+static inline uint64_t CVMX_RST_CTLX(unsigned long offset)
+{
+ if (!(
+ (OCTEON_IS_MODEL(OCTEON_CN70XX) && ((offset <= 2))) ||
+ (OCTEON_IS_MODEL(OCTEON_CN78XX) && ((offset <= 3)))))
+ cvmx_warn("CVMX_RST_CTLX(%lu) is invalid on this chip\n", offset);
+ return CVMX_ADD_IO_SEG(0x0001180006001640ull) + ((offset) & 3) * 8;
+}
+#else
+#define CVMX_RST_CTLX(offset) (CVMX_ADD_IO_SEG(0x0001180006001640ull) + ((offset) & 3) * 8)
+#endif
+#if CVMX_ENABLE_CSR_ADDRESS_CHECKING
+#define CVMX_RST_DELAY CVMX_RST_DELAY_FUNC()
+static inline uint64_t CVMX_RST_DELAY_FUNC(void)
+{
+ if (!(OCTEON_IS_MODEL(OCTEON_CN70XX) || OCTEON_IS_MODEL(OCTEON_CN78XX)))
+ cvmx_warn("CVMX_RST_DELAY not supported on this chip\n");
+ return CVMX_ADD_IO_SEG(0x0001180006001608ull);
+}
+#else
+#define CVMX_RST_DELAY (CVMX_ADD_IO_SEG(0x0001180006001608ull))
+#endif
+#if CVMX_ENABLE_CSR_ADDRESS_CHECKING
+#define CVMX_RST_INT CVMX_RST_INT_FUNC()
+static inline uint64_t CVMX_RST_INT_FUNC(void)
+{
+ if (!(OCTEON_IS_MODEL(OCTEON_CN70XX) || OCTEON_IS_MODEL(OCTEON_CN78XX)))
+ cvmx_warn("CVMX_RST_INT not supported on this chip\n");
+ return CVMX_ADD_IO_SEG(0x0001180006001628ull);
+}
+#else
+#define CVMX_RST_INT (CVMX_ADD_IO_SEG(0x0001180006001628ull))
+#endif
+#if CVMX_ENABLE_CSR_ADDRESS_CHECKING
+#define CVMX_RST_OCX CVMX_RST_OCX_FUNC()
+static inline uint64_t CVMX_RST_OCX_FUNC(void)
+{
+ if (!(OCTEON_IS_MODEL(OCTEON_CN78XX)))
+ cvmx_warn("CVMX_RST_OCX not supported on this chip\n");
+ return CVMX_ADD_IO_SEG(0x0001180006001618ull);
+}
+#else
+#define CVMX_RST_OCX (CVMX_ADD_IO_SEG(0x0001180006001618ull))
+#endif
+#if CVMX_ENABLE_CSR_ADDRESS_CHECKING
+#define CVMX_RST_POWER_DBG CVMX_RST_POWER_DBG_FUNC()
+static inline uint64_t CVMX_RST_POWER_DBG_FUNC(void)
+{
+ if (!(OCTEON_IS_MODEL(OCTEON_CN78XX)))
+ cvmx_warn("CVMX_RST_POWER_DBG not supported on this chip\n");
+ return CVMX_ADD_IO_SEG(0x0001180006001708ull);
+}
+#else
+#define CVMX_RST_POWER_DBG (CVMX_ADD_IO_SEG(0x0001180006001708ull))
+#endif
+#if CVMX_ENABLE_CSR_ADDRESS_CHECKING
+#define CVMX_RST_PP_POWER CVMX_RST_PP_POWER_FUNC()
+static inline uint64_t CVMX_RST_PP_POWER_FUNC(void)
+{
+ if (!(OCTEON_IS_MODEL(OCTEON_CN70XX) || OCTEON_IS_MODEL(OCTEON_CN78XX)))
+ cvmx_warn("CVMX_RST_PP_POWER not supported on this chip\n");
+ return CVMX_ADD_IO_SEG(0x0001180006001700ull);
+}
+#else
+#define CVMX_RST_PP_POWER (CVMX_ADD_IO_SEG(0x0001180006001700ull))
+#endif
+#if CVMX_ENABLE_CSR_ADDRESS_CHECKING
+static inline uint64_t CVMX_RST_SOFT_PRSTX(unsigned long offset)
+{
+ if (!(
+ (OCTEON_IS_MODEL(OCTEON_CN70XX) && ((offset <= 2))) ||
+ (OCTEON_IS_MODEL(OCTEON_CN78XX) && ((offset <= 3)))))
+ cvmx_warn("CVMX_RST_SOFT_PRSTX(%lu) is invalid on this chip\n", offset);
+ return CVMX_ADD_IO_SEG(0x00011800060016C0ull) + ((offset) & 3) * 8;
+}
+#else
+#define CVMX_RST_SOFT_PRSTX(offset) (CVMX_ADD_IO_SEG(0x00011800060016C0ull) + ((offset) & 3) * 8)
+#endif
+#if CVMX_ENABLE_CSR_ADDRESS_CHECKING
+#define CVMX_RST_SOFT_RST CVMX_RST_SOFT_RST_FUNC()
+static inline uint64_t CVMX_RST_SOFT_RST_FUNC(void)
+{
+ if (!(OCTEON_IS_MODEL(OCTEON_CN70XX) || OCTEON_IS_MODEL(OCTEON_CN78XX)))
+ cvmx_warn("CVMX_RST_SOFT_RST not supported on this chip\n");
+ return CVMX_ADD_IO_SEG(0x0001180006001680ull);
+}
+#else
+#define CVMX_RST_SOFT_RST (CVMX_ADD_IO_SEG(0x0001180006001680ull))
+#endif
+
+/**
+ * cvmx_rst_boot
+ */
+union cvmx_rst_boot {
+ uint64_t u64;
+ struct cvmx_rst_boot_s {
+#ifdef __BIG_ENDIAN_BITFIELD
+ uint64_t chipkill : 1; /**< A 0->1 transition of CHIPKILL starts the CHIPKILL timer. When CHIPKILL=1 and the timer
+ expires, internal chip reset is asserted forever until the next chip reset. The CHIPKILL
+ timer can be stopped only by a chip (cold, warm, soft) reset. The length of the CHIPKILL
+ timer is specified by RST_CKILL[TIMER]. */
+ uint64_t jtcsrdis : 1; /**< When set, internal CSR access via JTAG TAP controller is disabled This field resets to 1
+ in Authentik mode, else 0. */
+ uint64_t ejtagdis : 1; /**< When set, external EJTAG access is disabled. This field resets to 1 in Authentik mode, else 0. */
+ uint64_t romen : 1; /**< When set, Authentik/eMMC boot ROM is visible in the boot bus address space. This field
+ resets to 1 in an Authentik part or when booting from eMMC. Else, resets to 0. */
+ uint64_t ckill_ppdis : 1; /**< When set, cores other than 0 are disabled during a CHIPKILL. Writes have no effect when
+ RST_BOOT[CHIPKILL]=1. */
+ uint64_t jt_tstmode : 1; /**< JTAG test mode. */
+ uint64_t vrm_err : 1; /**< VRM did not complete operations within 5.25mS of DCOK being asserted. PLLs were released
+ automatically. */
+ uint64_t reserved_37_56 : 20;
+ uint64_t c_mul : 7; /**< Core-clock multiplier. C_MUL = (core-clock speed) / (ref-clock speed). 'ref-clock speed'
+ should always be 50MHz.
+ INTERNAL: C_MUL is set from the pi_pll_mul pins plus 6. */
+ uint64_t pnr_mul : 6; /**< Coprocessor-clock multiplier. PNR_MUL = (coprocessor-clock speed) /(ref-clock speed).
+ 'ref-clock speed' should always be 50MHz.
+ INTERNAL: C_MUL is set from the pi_pnr_pll_mul pins plus 6. */
+ uint64_t reserved_21_23 : 3;
+ uint64_t lboot_oci : 3; /**< Last boot cause mask; resets only with DCOK.
+ <20> = Warm reset due to CCPI link 2 going down.
+ <19> = Warm reset due to CCPI link 1 going down.
+ <18> = Warm reset due to CCPI link 0 going down. */
+ uint64_t lboot_ext : 6; /**< Last boot cause mask; resets only with DCOK.
+ <17> = Warm reset due to Cntl3 link-down or hot-reset.
+ <16> = Warm reset due to Cntl2 link-down or hot-reset.
+ <15> = Cntl3 reset due to PERST3_L pin.
+ <14> = Cntl2 reset due to PERST2_L pin.
+ <13> = Warm reset due to PERST3_L pin.
+ <12> = Warm reset due to PERST2_L pin. */
+ uint64_t lboot : 10; /**< Last boot cause mask; resets only with DCOK.
+ <11> = Soft reset due to watchdog.
+ <10> = Soft reset due to RST_SOFT_RST write.
+ <9> = Warm reset due to Cntl1 link-down or hot-reset.
+ <8> = Warm reset due to Cntl0 link-down or hot-reset.
+ <7> = Cntl1 reset due to PERST1_L pin.
+ <6> = Cntl0 reset due to PERST0_L pin.
+ <5> = Warm reset due to PERST1_L pin.
+ <4> = Warm reset due to PERST0_L pin.
+ <3> = Warm reset due to CHIP_RESET_L pin.
+ <2> = Cold reset due to PLL_DC_OK pin. */
+ uint64_t rboot : 1; /**< Determines whether core 0 remains in reset after chip cold/warm/soft reset. */
+ uint64_t rboot_pin : 1; /**< Read-only access to REMOTE_BOOT pin. */
+#else
+ uint64_t rboot_pin : 1;
+ uint64_t rboot : 1;
+ uint64_t lboot : 10;
+ uint64_t lboot_ext : 6;
+ uint64_t lboot_oci : 3;
+ uint64_t reserved_21_23 : 3;
+ uint64_t pnr_mul : 6;
+ uint64_t c_mul : 7;
+ uint64_t reserved_37_56 : 20;
+ uint64_t vrm_err : 1;
+ uint64_t jt_tstmode : 1;
+ uint64_t ckill_ppdis : 1;
+ uint64_t romen : 1;
+ uint64_t ejtagdis : 1;
+ uint64_t jtcsrdis : 1;
+ uint64_t chipkill : 1;
+#endif
+ } s;
+ struct cvmx_rst_boot_s cn70xx;
+ struct cvmx_rst_boot_s cn70xxp1;
+ struct cvmx_rst_boot_s cn78xx;
+};
+typedef union cvmx_rst_boot cvmx_rst_boot_t;
+
+/**
+ * cvmx_rst_cfg
+ */
+union cvmx_rst_cfg {
+ uint64_t u64;
+ struct cvmx_rst_cfg_s {
+#ifdef __BIG_ENDIAN_BITFIELD
+ uint64_t bist_delay : 58; /**< Reserved. */
+ uint64_t reserved_3_5 : 3;
+ uint64_t cntl_clr_bist : 1; /**< Perform clear BIST during control-only reset, instead of a full BIST. A warm/soft reset
+ will not change this field. */
+ uint64_t warm_clr_bist : 1; /**< Perform clear BIST during warm reset, instead of a full BIST. A warm/soft reset does not
+ change this field. Note that a cold reset always performs a full BIST. */
+ uint64_t soft_clr_bist : 1; /**< Perform clear BIST during soft reset, instead of a full BIST. A warm/soft reset does not
+ change this field. Note that a cold reset always performs a full BIST. */
+#else
+ uint64_t soft_clr_bist : 1;
+ uint64_t warm_clr_bist : 1;
+ uint64_t cntl_clr_bist : 1;
+ uint64_t reserved_3_5 : 3;
+ uint64_t bist_delay : 58;
+#endif
+ } s;
+ struct cvmx_rst_cfg_s cn70xx;
+ struct cvmx_rst_cfg_s cn70xxp1;
+ struct cvmx_rst_cfg_s cn78xx;
+};
+typedef union cvmx_rst_cfg cvmx_rst_cfg_t;
+
+/**
+ * cvmx_rst_ckill
+ */
+union cvmx_rst_ckill {
+ uint64_t u64;
+ struct cvmx_rst_ckill_s {
+#ifdef __BIG_ENDIAN_BITFIELD
+ uint64_t reserved_47_63 : 17;
+ uint64_t timer : 47; /**< Chipkill timer measured in SCLKs. Reads return current chipkill timer. Writes have no
+ effect when RST_BOOT[CHIPKILL] = 1. */
+#else
+ uint64_t timer : 47;
+ uint64_t reserved_47_63 : 17;
+#endif
+ } s;
+ struct cvmx_rst_ckill_s cn70xx;
+ struct cvmx_rst_ckill_s cn70xxp1;
+ struct cvmx_rst_ckill_s cn78xx;
+};
+typedef union cvmx_rst_ckill cvmx_rst_ckill_t;
+
+/**
+ * cvmx_rst_ctl#
+ */
+union cvmx_rst_ctlx {
+ uint64_t u64;
+ struct cvmx_rst_ctlx_s {
+#ifdef __BIG_ENDIAN_BITFIELD
+ uint64_t reserved_10_63 : 54;
+ uint64_t prst_link : 1; /**< Controls whether corresponding controller link-down or hot-reset causes the assertion of
+ RST_SOFT_PRST()[SOFT_PRST].
+ A warm/soft reset does not change this field. On cold reset, this field is initialized to
+ 0. */
+ uint64_t rst_done : 1; /**< Read-only access to controller reset status. RST_DONE is always zero (i.e. the controller
+ is held in reset) when:
+ * RST_SOFT_PRST()[SOFT_PRST] = 1, or
+ * RST_RCV = 1 and PERST*_L pin is asserted. */
+ uint64_t rst_link : 1; /**< Reset link. Controls whether corresponding controller link-down reset or hot reset causes
+ a warm chip reset. On cold reset, this field is initialized as follows:
+ _ 0 when RST_CTL()[HOST_MODE] = 1.
+ _ 1 when RST_CTL()[HOST_MODE] = 0.
+ Note that a link-down or hot-reset event can never cause a warm chip reset when the
+ controller is in reset (i.e. can never cause a warm reset when [RST_DONE] = 0). */
+ uint64_t host_mode : 1; /**< Read-only access to the corresponding PEM()_CFG[HOSTMD] field indicating PEMn is root
+ complex (host). For controllers 0 and 2 the initial value is determined by straps. For
+ controllers 1 and 3 this field is initially set as host. */
+ uint64_t reserved_4_5 : 2;
+ uint64_t rst_drv : 1; /**< Controls whether PERST*_L is driven. A warm/soft reset does not change this field. On cold
+ reset, this field is initialized as follows:
+ _ 0 when RST_CTL()[HOST_MODE] = 0.
+ _ 1 when RST_CTL()[HOST_MODE] = 1.
+ When set, CNXXXX drives the corresponding PERST*_L pin. Otherwise, CNXXXX does not drive
+ the corresponding PERST*_L pin. */
+ uint64_t rst_rcv : 1; /**< Controls whether PERST*_L is received. A warm/soft reset will not change this field. On
+ cold reset, this field is initialized as follows:
+ _ 0 when RST_CTL()[HOST_MODE] = 1.
+ _ 1 when RST_CTL()[HOST_MODE] = 0.
+ When RST_RCV is equal to 1, the PERST*_L value is received and may be used to reset the
+ controller and (optionally, based on RST_CHIP) warm reset the chip.
+ When RST_RCV is equal to 1 (and RST_CHIP = 0), RST_INT[PERST*] gets set when the PERST*_L
+ pin asserts. (This interrupt can alert software whenever the external reset pin initiates
+ a controller reset sequence.)
+ RST_VAL gives the PERST*_L pin value when RST_RCV = 1.
+ When RST_RCV = 0, the PERST*_L pin value is ignored. */
+ uint64_t rst_chip : 1; /**< Controls whether PERST*_L causes a chip warm reset like CHIP_RESET_L. A warm/soft reset
+ will not change this field. On cold reset, this field is initialized to 0.
+ When RST_RCV = 0, RST_CHIP is ignored.
+ When RST_RCV = 1, RST_CHIP = 1, and PERST*_L asserts, a chip warm reset is generated. */
+ uint64_t rst_val : 1; /**< Read-only access to PERST*_L. Unpredictable when RST_RCV = 0.
+ Reads as 1 when RST_RCV is equal to 1 and the
+ PERST*_L pin is asserted.
+ Reads as 0 when RST_RCV = 1 and the PERST*_L pin is not asserted. */
+#else
+ uint64_t rst_val : 1;
+ uint64_t rst_chip : 1;
+ uint64_t rst_rcv : 1;
+ uint64_t rst_drv : 1;
+ uint64_t reserved_4_5 : 2;
+ uint64_t host_mode : 1;
+ uint64_t rst_link : 1;
+ uint64_t rst_done : 1;
+ uint64_t prst_link : 1;
+ uint64_t reserved_10_63 : 54;
+#endif
+ } s;
+ struct cvmx_rst_ctlx_s cn70xx;
+ struct cvmx_rst_ctlx_s cn70xxp1;
+ struct cvmx_rst_ctlx_s cn78xx;
+};
+typedef union cvmx_rst_ctlx cvmx_rst_ctlx_t;
+
+/**
+ * cvmx_rst_delay
+ */
+union cvmx_rst_delay {
+ uint64_t u64;
+ struct cvmx_rst_delay_s {
+#ifdef __BIG_ENDIAN_BITFIELD
+ uint64_t reserved_32_63 : 32;
+ uint64_t warm_rst_dly : 16; /**< Warm reset delay. A warm reset immediately causes an early warm-reset notification, but
+ the assertion of warm reset is delayed this many coprocessor-clock cycles. A warm/soft
+ reset will not change this field.
+ This must be at least 500 DCLK cycles. */
+ uint64_t soft_rst_dly : 16; /**< Soft reset delay. A soft reset immediately causes an early soft-reset notification, but
+ the assertion of soft reset is delayed this many coprocessor-clock cycles. A warm/soft
+ reset will not change this field.
+ This must be at least 500 DCLK cycles. */
+#else
+ uint64_t soft_rst_dly : 16;
+ uint64_t warm_rst_dly : 16;
+ uint64_t reserved_32_63 : 32;
+#endif
+ } s;
+ struct cvmx_rst_delay_s cn70xx;
+ struct cvmx_rst_delay_s cn70xxp1;
+ struct cvmx_rst_delay_s cn78xx;
+};
+typedef union cvmx_rst_delay cvmx_rst_delay_t;
+
+/**
+ * cvmx_rst_int
+ */
+union cvmx_rst_int {
+ uint64_t u64;
+ struct cvmx_rst_int_s {
+#ifdef __BIG_ENDIAN_BITFIELD
+ uint64_t reserved_12_63 : 52;
+ uint64_t perst : 4; /**< PERST*_L asserted while RST_CTL()[RST_RCV] = 1 and RST_CTL()[RST_CHIP] = 0. One bit
+ corresponds to each controller. */
+ uint64_t reserved_4_7 : 4;
+ uint64_t rst_link : 4; /**< A controller link-down/hot-reset occurred while RST_CTL()[RST_LINK] = 0. Software must
+ assert then deassert RST_SOFT_PRST()[SOFT_PRST]. One bit corresponds to each controller. */
+#else
+ uint64_t rst_link : 4;
+ uint64_t reserved_4_7 : 4;
+ uint64_t perst : 4;
+ uint64_t reserved_12_63 : 52;
+#endif
+ } s;
+ struct cvmx_rst_int_cn70xx {
+#ifdef __BIG_ENDIAN_BITFIELD
+ uint64_t reserved_11_63 : 53;
+ uint64_t perst : 3; /**< PERST*_L asserted while RST_CTL()[RST_RCV] = 1 and RST_CTL()[RST_CHIP] = 0. One bit
+ corresponds to each controller. */
+ uint64_t reserved_3_7 : 5;
+ uint64_t rst_link : 3; /**< A controller link-down/hot-reset occurred while RST_CTL()[RST_LINK] = 0. Software must
+ assert then deassert RST_SOFT_PRST()[SOFT_PRST]. One bit corresponds to each controller. */
+#else
+ uint64_t rst_link : 3;
+ uint64_t reserved_3_7 : 5;
+ uint64_t perst : 3;
+ uint64_t reserved_11_63 : 53;
+#endif
+ } cn70xx;
+ struct cvmx_rst_int_cn70xx cn70xxp1;
+ struct cvmx_rst_int_s cn78xx;
+};
+typedef union cvmx_rst_int cvmx_rst_int_t;
+
+/**
+ * cvmx_rst_ocx
+ */
+union cvmx_rst_ocx {
+ uint64_t u64;
+ struct cvmx_rst_ocx_s {
+#ifdef __BIG_ENDIAN_BITFIELD
+ uint64_t reserved_3_63 : 61;
+ uint64_t rst_link : 3; /**< Controls whether corresponding OCX link going down causes a chip reset. A warm/soft reset
+ does not change this field. On cold reset, this field is initialized to 0. See
+ OCX_COM_LINK()_CTL for a description of what events can contribute to the link_down
+ condition. */
+#else
+ uint64_t rst_link : 3;
+ uint64_t reserved_3_63 : 61;
+#endif
+ } s;
+ struct cvmx_rst_ocx_s cn78xx;
+};
+typedef union cvmx_rst_ocx cvmx_rst_ocx_t;
+
+/**
+ * cvmx_rst_power_dbg
+ */
+union cvmx_rst_power_dbg {
+ uint64_t u64;
+ struct cvmx_rst_power_dbg_s {
+#ifdef __BIG_ENDIAN_BITFIELD
+ uint64_t reserved_3_63 : 61;
+ uint64_t str : 3; /**< Reserved. INTERNAL: Internal power driver strength. Resets only on cold reset. */
+#else
+ uint64_t str : 3;
+ uint64_t reserved_3_63 : 61;
+#endif
+ } s;
+ struct cvmx_rst_power_dbg_s cn78xx;
+};
+typedef union cvmx_rst_power_dbg cvmx_rst_power_dbg_t;
+
+/**
+ * cvmx_rst_pp_power
+ *
+ * These bits should only be changed while the corresponding PP is in reset (see CIU3_PP_RST).
+ *
+ */
+union cvmx_rst_pp_power {
+ uint64_t u64;
+ struct cvmx_rst_pp_power_s {
+#ifdef __BIG_ENDIAN_BITFIELD
+ uint64_t reserved_48_63 : 16;
+ uint64_t gate : 48; /**< Powerdown enable. When both a bit and the corresponding CIU_PP_RST bit are set, the core
+ has voltage removed to save power. In typical operation these bits are setup during
+ initialization and PP resets are controlled through CIU_PP_RST. These bits may only be
+ changed when the corresponding core is in reset using CIU_PP_RST. */
+#else
+ uint64_t gate : 48;
+ uint64_t reserved_48_63 : 16;
+#endif
+ } s;
+ struct cvmx_rst_pp_power_cn70xx {
+#ifdef __BIG_ENDIAN_BITFIELD
+ uint64_t reserved_4_63 : 60;
+ uint64_t gate : 4; /**< When set, corresponding PP has voltage removed to save power. */
+#else
+ uint64_t gate : 4;
+ uint64_t reserved_4_63 : 60;
+#endif
+ } cn70xx;
+ struct cvmx_rst_pp_power_cn70xx cn70xxp1;
+ struct cvmx_rst_pp_power_s cn78xx;
+};
+typedef union cvmx_rst_pp_power cvmx_rst_pp_power_t;
+
+/**
+ * cvmx_rst_soft_prst#
+ */
+union cvmx_rst_soft_prstx {
+ uint64_t u64;
+ struct cvmx_rst_soft_prstx_s {
+#ifdef __BIG_ENDIAN_BITFIELD
+ uint64_t reserved_1_63 : 63;
+ uint64_t soft_prst : 1; /**< Resets the PCIe logic and corresponding common logic associated with the SLI controller in
+ all modes, not just RC mode.
+ * If the RST_CTL()[HOST_MODE] = 0, SOFT_PRST resets to 0.
+ * If the RST_CTL()[HOST_MODE] = 1, SOFT_PRST resets to 1.
+ When CNXXXX is configured to drive PERST*_L (i.e.
+ RST_CTL()[RST_DRV] = 1), this controls the output value on PERST*_L. */
+#else
+ uint64_t soft_prst : 1;
+ uint64_t reserved_1_63 : 63;
+#endif
+ } s;
+ struct cvmx_rst_soft_prstx_s cn70xx;
+ struct cvmx_rst_soft_prstx_s cn70xxp1;
+ struct cvmx_rst_soft_prstx_s cn78xx;
+};
+typedef union cvmx_rst_soft_prstx cvmx_rst_soft_prstx_t;
+
+/**
+ * cvmx_rst_soft_rst
+ */
+union cvmx_rst_soft_rst {
+ uint64_t u64;
+ struct cvmx_rst_soft_rst_s {
+#ifdef __BIG_ENDIAN_BITFIELD
+ uint64_t reserved_1_63 : 63;
+ uint64_t soft_rst : 1; /**< When set, resets the CNXXXX core. When performing a soft reset from a remote PCIe host,
+ always read this register and wait for the results before setting SOFT_RST to 1. */
+#else
+ uint64_t soft_rst : 1;
+ uint64_t reserved_1_63 : 63;
+#endif
+ } s;
+ struct cvmx_rst_soft_rst_s cn70xx;
+ struct cvmx_rst_soft_rst_s cn70xxp1;
+ struct cvmx_rst_soft_rst_s cn78xx;
+};
+typedef union cvmx_rst_soft_rst cvmx_rst_soft_rst_t;
+
+#endif
--
1.8.1.4
More information about the linux-yocto
mailing list