From: Abhishek Paliwal <abhishek.pali...@aricent.com>

From: David Daney <david.da...@cavium.com>
From: Leonid Rosenboim <lrosenb...@caviumnetworks.com>
From: Chandrakala Chavva <ccha...@caviumnetworks.com>

MIPS: OCTEON: Force L1 Dcache and TLB parity errors for testing.

MIPS: OCTEON: Keep reset value for COP0_ERRCTL

The COP0_ERRCTL used for checking dcache, TLB, write_buffer parity errors.
Their are other bits with some reset value.

Signed-off-by: David Daney <david.da...@cavium.com>
Signed-off-by: Leonid Rosenboim <lrosenb...@caviumnetworks.com>
Signed-off-by: Chandrakala Chavva <ccha...@caviumnetworks.com>
Signed-off-by: Abhishek Paliwal <abhishek.pali...@aricent.com>
---
 arch/mips/cavium-octeon/Makefile | 1 +
 arch/mips/cavium-octeon/setup.c  | 8 +++++---
 arch/mips/mm/c-octeon.c          | 4 ++--
 arch/mips/mm/cex-oct.S           | 3 ++-
 drivers/edac/octeon_edac-pc.c    | 4 +++-
 5 files changed, 13 insertions(+), 7 deletions(-)

diff --git a/arch/mips/cavium-octeon/Makefile b/arch/mips/cavium-octeon/Makefile
index 4e95204..e16fd26 100644
--- a/arch/mips/cavium-octeon/Makefile
+++ b/arch/mips/cavium-octeon/Makefile
@@ -20,6 +20,7 @@ obj-y += executive/
 obj-$(CONFIG_MTD)                    += flash_setup.o
 obj-$(CONFIG_SMP)                    += smp.o
 obj-$(CONFIG_OCTEON_ILM)             += oct_ilm.o
+obj-$(CONFIG_OCTEON_ERROR_INJECTOR)    += octeon-error-injector.o
 
 DTS_FILES = octeon_3xxx.dts octeon_68xx.dts
 DTB_FILES = $(patsubst %.dts, %.dtb, $(DTS_FILES))
diff --git a/arch/mips/cavium-octeon/setup.c b/arch/mips/cavium-octeon/setup.c
index 7027044..83355fb 100644
--- a/arch/mips/cavium-octeon/setup.c
+++ b/arch/mips/cavium-octeon/setup.c
@@ -395,9 +395,11 @@ void octeon_check_cpu_bist(void)
        if (bist_val & mask)
                pr_err("Core%d BIST Failure: COP0_CVM_MEM_CTL = 0x%llx\n",
                       coreid, bist_val);
-       if (current_cpu_type() == CPU_CAVIUM_OCTEON3)
-               write_octeon_c0_errctl(1);
-       else
+       if (current_cpu_type() == CPU_CAVIUM_OCTEON3) {
+               bist_val = read_octeon_c0_errctl();
+               bist_val |= 1;
+               write_octeon_c0_errctl(bist_val);
+       } else
                write_octeon_c0_dcacheerr(0);
 }
 
diff --git a/arch/mips/mm/c-octeon.c b/arch/mips/mm/c-octeon.c
index 14d91ee..c0a0fb4 100644
--- a/arch/mips/mm/c-octeon.c
+++ b/arch/mips/mm/c-octeon.c
@@ -271,7 +271,7 @@ static int octeon3_be_handler(struct pt_regs *regs, int 
is_fixup)
                        pr_err("CacheErr (Dcache) == %llx\n", dcache_err);
                }
 
-               write_octeon_c0_errctl(wbfperr_mask);
+               write_octeon_c0_errctl(dcache_err | wbfperr_mask);
                return MIPS_BE_FATAL;
        }
        if (is_fixup)
@@ -294,7 +294,7 @@ static int octeon3_mcheck_handler(struct pt_regs *regs)
                union octeon_cvmemctl cvmmemctl;
 
                /* Clear the indicator */
-               write_octeon_c0_errctl(tlbperr_mask);
+               write_octeon_c0_errctl(dcache_err | tlbperr_mask);
                /*
                 * Blow everything away to (hopefully) write good
                 * parity to all TLB entries
diff --git a/arch/mips/mm/cex-oct.S b/arch/mips/mm/cex-oct.S
index e73fec3..225b163 100644
--- a/arch/mips/mm/cex-oct.S
+++ b/arch/mips/mm/cex-oct.S
@@ -70,7 +70,8 @@
 
        dmfc0   k0, CP0_ERRCTL
        sd      k0, (k1)
-       andi    k0, 1           /* Write 1 to clear Dcache parity error */
+       ori     k0, k0, 1
+       xori    k0, k0, 1               /* clear Dcache parity error */
        dmtc0   k0, CP0_ERRCTL
 
        /* check whether this is a nested exception */
diff --git a/drivers/edac/octeon_edac-pc.c b/drivers/edac/octeon_edac-pc.c
index 5e88867..1d5c99d 100644
--- a/drivers/edac/octeon_edac-pc.c
+++ b/drivers/edac/octeon_edac-pc.c
@@ -91,7 +91,9 @@ static int  co_cache_error_event(struct notifier_block *this,
 
                /* Clear the error indication */
                if (current_cpu_type() == CPU_CAVIUM_OCTEON3)
-                       write_octeon_c0_errctl(1);
+                       u64 errctl = read_octeon_c0_errctl();
+                       errctl |= 1;
+                       write_octeon_c0_errctl(errctl);
                else if (current_cpu_type() == CPU_CAVIUM_OCTEON2)
                        write_octeon_c0_dcacheerr(1);
                else
-- 
1.8.1.4

-- 
_______________________________________________
linux-yocto mailing list
linux-yocto@yoctoproject.org
https://lists.yoctoproject.org/listinfo/linux-yocto

Reply via email to