[linux-yocto] [PATCH 01/13] Replace OCTEON_IS_OCTEON2() and OCTEON_IS_OCTEON3() with appropriate current_cpu_type().
Chandrakala Chavva
cchavva.cavm at gmail.com
Mon Jan 26 22:04:07 PST 2015
From: Abhishek Paliwal <abhishek.paliwal at aricent.com>
From: Chandrakala Chavva <cchavva at caviumnetworks.com>
Fix reading LMCX_DLL_CTL2 CSR fields.
Read LMCX_DLL_CTL2<quad_dll_ena> from the correct struct.
Fix RML_TO error in octeon-lmc.
Use correct CSR for disabling ECC errors interrupts for Octeon II.
Register octeon-lmc only if DDR controller is present.
Check for LMCX_DLL_CTL2[QUAD_DLL_ENA]
which is set correctly for all OcteonII models.
Signed-off-by: Chandrakala Chavva <cchavva at caviumnetworks.com>
Signed-off-by: Leonid Rosenboim <lrosenboim at caviumnetworks.com>
Signed-off-by: Abhishek Paliwal <abhishek.paliwal at aricent.com>
---
arch/mips/cavium-octeon/dma-octeon.c | 5 +++--
arch/mips/cavium-octeon/octeon-platform.c | 1 +
arch/mips/cavium-octeon/setup.c | 6 +++++-
arch/mips/include/asm/octeon/octeon.h | 14 +++++++++++++-
drivers/edac/octeon_edac-lmc.c | 16 +++++++++++++---
drivers/edac/octeon_edac-pc.c | 2 +-
6 files changed, 36 insertions(+), 8 deletions(-)
diff --git a/arch/mips/cavium-octeon/dma-octeon.c b/arch/mips/cavium-octeon/dma-octeon.c
index 02f2444..92513be 100644
--- a/arch/mips/cavium-octeon/dma-octeon.c
+++ b/arch/mips/cavium-octeon/dma-octeon.c
@@ -276,7 +276,8 @@ void __init plat_swiotlb_setup(void)
continue;
/* These addresses map low for PCI. */
- if (e->addr > 0x410000000ull && !OCTEON_IS_MODEL(OCTEON_CN6XXX))
+ if (e->addr > 0x410000000ull &&
+ current_cpu_type() != CPU_CAVIUM_OCTEON2)
continue;
addr_size += e->size;
@@ -308,7 +309,7 @@ void __init plat_swiotlb_setup(void)
#endif
#ifdef CONFIG_USB_OCTEON_OHCI
/* OCTEON II ohci is only 32-bit. */
- if (OCTEON_IS_MODEL(OCTEON_CN6XXX) && max_addr >= 0x100000000ul)
+ if (current_cpu_type() == CPU_CAVIUM_OCTEON2 && max_addr >= 0x100000000ul)
swiotlbsize = 64 * (1<<20);
#endif
swiotlb_nslabs = swiotlbsize >> IO_TLB_SHIFT;
diff --git a/arch/mips/cavium-octeon/octeon-platform.c b/arch/mips/cavium-octeon/octeon-platform.c
index 6df0f4d..285238b 100644
--- a/arch/mips/cavium-octeon/octeon-platform.c
+++ b/arch/mips/cavium-octeon/octeon-platform.c
@@ -687,6 +687,7 @@ end_led:
alias_prop = fdt_getprop(initial_boot_params, aliases,
"usbn", NULL);
if (alias_prop) {
+
int usbn = fdt_path_offset(initial_boot_params, alias_prop);
if (usbn >= 0 && (current_cpu_type() == CPU_CAVIUM_OCTEON2 ||
diff --git a/arch/mips/cavium-octeon/setup.c b/arch/mips/cavium-octeon/setup.c
index d65238d..fc0b0d2 100644
--- a/arch/mips/cavium-octeon/setup.c
+++ b/arch/mips/cavium-octeon/setup.c
@@ -393,7 +393,7 @@ void octeon_check_cpu_bist(void)
pr_err("Core%d BIST Failure: COP0_CVM_MEM_CTL = 0x%llx\n",
coreid, bist_val);
- write_octeon_c0_dcacheerr(0);
+ write_octeon_c0_dcacheerr(0);
}
/**
@@ -582,6 +582,10 @@ void octeon_user_io_init(void)
* mode. */
cvmmemctl.s.cvmsegenau = 0;
+ /* Enable TLB parity error reporting on OCTEON II */
+ if (current_cpu_type() == CPU_CAVIUM_OCTEON2)
+ cvmmemctl.s.tlbperrena = 1;
+
write_c0_cvmmemctl(cvmmemctl.u64);
/* Setup of CVMSEG is done in kernel-entry-init.h */
diff --git a/arch/mips/include/asm/octeon/octeon.h b/arch/mips/include/asm/octeon/octeon.h
index f5d77b9..c809f86 100644
--- a/arch/mips/include/asm/octeon/octeon.h
+++ b/arch/mips/include/asm/octeon/octeon.h
@@ -127,7 +127,19 @@ union octeon_cvmemctl {
/* RO 1 = BIST fail, 0 = BIST pass */
uint64_t wbfbist:1;
/* Reserved */
- uint64_t reserved:22;
+ uint64_t reserved:13;
+ /* When set, TLB parity errors can occur. */
+ uint64_t tlbperrena:1;
+ /* OCTEON II - When set, CVMSET LM parity errors are enabled. */
+ uint64_t lmemperrena:1;
+ /* OCTEON II - If set, NUDGE/WRITEBACK_INVALIDATE,
+ * NUDGE_WB, EVICT_SOON, LC, CONT_WRITE_BACK,
+ * PREPARE_FOR_STORE and PREPARE_FOR_STORE_THROUGH
+ * prefetch operations become NOPs. */
+ uint64_t disstpref:1;
+ /* OCTEON II - If set, NORMAL and NOTL2 prefetch
+ * operations become NOPs. */
+ uint64_t disldpref:1;
/* R/W If set, marked write-buffer entries time out
* the same as as other entries; if clear, marked
* write-buffer entries use the maximum timeout. */
diff --git a/drivers/edac/octeon_edac-lmc.c b/drivers/edac/octeon_edac-lmc.c
index 93412d6..0c9b497 100644
--- a/drivers/edac/octeon_edac-lmc.c
+++ b/drivers/edac/octeon_edac-lmc.c
@@ -130,8 +130,18 @@ static int octeon_lmc_edac_probe(struct platform_device *pdev)
/* OCTEON II */
union cvmx_lmcx_int_en en;
union cvmx_lmcx_config config;
+ union cvmx_lmcx_dll_ctl2 ctl2;
+
+ /* Check if LMC controller is enabled. */
+ ctl2.u64 = cvmx_read_csr(CVMX_LMCX_DLL_CTL2(mc));
+ if ((current_cpu_type() == CPU_CAVIUM_OCTEON3 && ctl2.cn70xx.quad_dll_ena == 0)
+ || (current_cpu_type() == CPU_CAVIUM_OCTEON2
+ && ctl2.cn63xx.quad_dll_ena == 0)) {
+ dev_info(&pdev->dev, "Disabled (LMC not present)\n");
+ return 0;
+ }
- config.u64 = cvmx_read_csr(CVMX_LMCX_CONFIG(0));
+ config.u64 = cvmx_read_csr(CVMX_LMCX_CONFIG(mc));
if (!config.s.ecc_ena) {
dev_info(&pdev->dev, "Disabled (ECC not enabled)\n");
return 0;
@@ -154,10 +164,10 @@ static int octeon_lmc_edac_probe(struct platform_device *pdev)
return -ENXIO;
}
- en.u64 = cvmx_read_csr(CVMX_LMCX_MEM_CFG0(mc));
+ en.u64 = cvmx_read_csr(CVMX_LMCX_INT_EN(mc));
en.s.intr_ded_ena = 0; /* We poll */
en.s.intr_sec_ena = 0;
- cvmx_write_csr(CVMX_LMCX_MEM_CFG0(mc), en.u64);
+ cvmx_write_csr(CVMX_LMCX_INT_EN(mc), en.u64);
}
platform_set_drvdata(pdev, mci);
diff --git a/drivers/edac/octeon_edac-pc.c b/drivers/edac/octeon_edac-pc.c
index 0f83c33..380cbe2 100644
--- a/drivers/edac/octeon_edac-pc.c
+++ b/drivers/edac/octeon_edac-pc.c
@@ -73,7 +73,7 @@ static int co_cache_error_event(struct notifier_block *this,
edac_device_handle_ce(p->ed, cpu, 0, "dcache");
/* Clear the error indication */
- if (OCTEON_IS_MODEL(OCTEON_FAM_2))
+ if (current_cpu_type() == CPU_CAVIUM_OCTEON2)
write_octeon_c0_dcacheerr(1);
else
write_octeon_c0_dcacheerr(0);
--
1.8.1.4
More information about the linux-yocto
mailing list