EDAC: Cleanup atomic_scrub mess
authorBorislav Petkov <bp@suse.de>
Thu, 21 May 2015 17:59:31 +0000 (19:59 +0200)
committerBorislav Petkov <bp@suse.de>
Thu, 28 May 2015 13:31:53 +0000 (15:31 +0200)
So first of all, this atomic_scrub() function's naming is bad. It looks
like an atomic_t helper. Change it to edac_atomic_scrub().

The bigger problem is that this function is arch-specific and every new
arch which doesn't necessarily need that functionality still needs to
define it, otherwise EDAC doesn't compile.

So instead of doing that and including arch-specific headers, have each
arch define an EDAC_ATOMIC_SCRUB symbol which can be used in edac_mc.c
for ifdeffery. Much cleaner.

And we already are doing this with another symbol - EDAC_SUPPORT. This
is also much cleaner than having CONFIG_EDAC enumerate all the arches
which need/have EDAC support and drivers.

This way I can kill the useless edac.h header in tile too.

Acked-by: Ralf Baechle <ralf@linux-mips.org>
Acked-by: Michael Ellerman <mpe@ellerman.id.au>
Acked-by: Chris Metcalf <cmetcalf@ezchip.com>
Acked-by: Ingo Molnar <mingo@kernel.org>
Acked-by: Russell King <rmk+kernel@arm.linux.org.uk>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Cc: Doug Thompson <dougthompson@xmission.com>
Cc: linux-arm-kernel@lists.infradead.org
Cc: linux-edac@vger.kernel.org
Cc: linux-kernel@vger.kernel.org
Cc: linux-mips@linux-mips.org
Cc: linuxppc-dev@lists.ozlabs.org
Cc: "Maciej W. Rozycki" <macro@codesourcery.com>
Cc: Markos Chandras <markos.chandras@imgtec.com>
Cc: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: "Steven J. Hill" <Steven.Hill@imgtec.com>
Cc: x86@kernel.org
Signed-off-by: Borislav Petkov <bp@suse.de>
12 files changed:
arch/arm/Kconfig
arch/arm/include/asm/edac.h
arch/mips/Kconfig
arch/mips/include/asm/edac.h
arch/powerpc/Kconfig
arch/powerpc/include/asm/edac.h
arch/tile/Kconfig
arch/tile/include/asm/edac.h [deleted file]
arch/x86/Kconfig
arch/x86/include/asm/edac.h
drivers/edac/Kconfig
drivers/edac/edac_mc.c

index 45df48b..325d6f3 100644 (file)
@@ -15,6 +15,8 @@ config ARM
        select CLONE_BACKWARDS
        select CPU_PM if (SUSPEND || CPU_IDLE)
        select DCACHE_WORD_ACCESS if HAVE_EFFICIENT_UNALIGNED_ACCESS
+       select EDAC_SUPPORT
+       select EDAC_ATOMIC_SCRUB
        select GENERIC_ALLOCATOR
        select GENERIC_ATOMIC64 if (CPU_V7M || CPU_V6 || !CPU_32v6K || !AEABI)
        select GENERIC_CLOCKEVENTS_BROADCAST if SMP
index 0df7a2c..5189fa8 100644 (file)
 #define ASM_EDAC_H
 /*
  * ECC atomic, DMA, SMP and interrupt safe scrub function.
- * Implements the per arch atomic_scrub() that EDAC use for software
+ * Implements the per arch edac_atomic_scrub() that EDAC use for software
  * ECC scrubbing.  It reads memory and then writes back the original
  * value, allowing the hardware to detect and correct memory errors.
  */
-static inline void atomic_scrub(void *va, u32 size)
+
+static inline void edac_atomic_scrub(void *va, u32 size)
 {
 #if __LINUX_ARM_ARCH__ >= 6
        unsigned int *virt_addr = va;
index f501665..b65edf5 100644 (file)
@@ -819,6 +819,7 @@ config CAVIUM_OCTEON_SOC
        select SYS_SUPPORTS_64BIT_KERNEL
        select SYS_SUPPORTS_BIG_ENDIAN
        select EDAC_SUPPORT
+       select EDAC_ATOMIC_SCRUB
        select SYS_SUPPORTS_LITTLE_ENDIAN
        select SYS_SUPPORTS_HOTPLUG_CPU if CPU_BIG_ENDIAN
        select SYS_HAS_EARLY_PRINTK
index 94105d3..980b165 100644 (file)
@@ -5,7 +5,7 @@
 
 /* ECC atomic, DMA, SMP and interrupt safe scrub function */
 
-static inline void atomic_scrub(void *va, u32 size)
+static inline void edac_atomic_scrub(void *va, u32 size)
 {
        unsigned long *virt_addr = va;
        unsigned long temp;
@@ -21,7 +21,7 @@ static inline void atomic_scrub(void *va, u32 size)
 
                __asm__ __volatile__ (
                "       .set    mips2                                   \n"
-               "1:     ll      %0, %1          # atomic_scrub          \n"
+               "1:     ll      %0, %1          # edac_atomic_scrub     \n"
                "       addu    %0, $0                                  \n"
                "       sc      %0, %1                                  \n"
                "       beqz    %0, 1b                                  \n"
index 190cc48..5ef2711 100644 (file)
@@ -153,6 +153,8 @@ config PPC
        select NO_BOOTMEM
        select HAVE_GENERIC_RCU_GUP
        select HAVE_PERF_EVENTS_NMI if PPC64
+       select EDAC_SUPPORT
+       select EDAC_ATOMIC_SCRUB
 
 config GENERIC_CSUM
        def_bool CPU_LITTLE_ENDIAN
index 6ead88b..5571e23 100644 (file)
 #define ASM_EDAC_H
 /*
  * ECC atomic, DMA, SMP and interrupt safe scrub function.
- * Implements the per arch atomic_scrub() that EDAC use for software
+ * Implements the per arch edac_atomic_scrub() that EDAC use for software
  * ECC scrubbing.  It reads memory and then writes back the original
  * value, allowing the hardware to detect and correct memory errors.
  */
-static __inline__ void atomic_scrub(void *va, u32 size)
+static __inline__ void edac_atomic_scrub(void *va, u32 size)
 {
        unsigned int *virt_addr = va;
        unsigned int temp;
index a07e31b..59cf0b9 100644 (file)
@@ -28,6 +28,7 @@ config TILE
        select HAVE_DEBUG_STACKOVERFLOW
        select ARCH_WANT_FRAME_POINTERS
        select HAVE_CONTEXT_TRACKING
+       select EDAC_SUPPORT
 
 # FIXME: investigate whether we need/want these options.
 #      select HAVE_IOREMAP_PROT
diff --git a/arch/tile/include/asm/edac.h b/arch/tile/include/asm/edac.h
deleted file mode 100644 (file)
index 87fc83e..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright 2011 Tilera Corporation. All Rights Reserved.
- *
- *   This program is free software; you can redistribute it and/or
- *   modify it under the terms of the GNU General Public License
- *   as published by the Free Software Foundation, version 2.
- *
- *   This program is distributed in the hope that it will be useful, but
- *   WITHOUT ANY WARRANTY; without even the implied warranty of
- *   MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
- *   NON INFRINGEMENT.  See the GNU General Public License for
- *   more details.
- */
-
-#ifndef _ASM_TILE_EDAC_H
-#define _ASM_TILE_EDAC_H
-
-/* ECC atomic, DMA, SMP and interrupt safe scrub function */
-
-static inline void atomic_scrub(void *va, u32 size)
-{
-       /*
-        * These is nothing to be done here because CE is
-        * corrected by the mshim.
-        */
-       return;
-}
-
-#endif /* _ASM_TILE_EDAC_H */
index 226d569..482c160 100644 (file)
@@ -143,6 +143,8 @@ config X86
        select ACPI_LEGACY_TABLES_LOOKUP if ACPI
        select X86_FEATURE_NAMES if PROC_FS
        select SRCU
+       select EDAC_SUPPORT
+       select EDAC_ATOMIC_SCRUB
 
 config INSTRUCTION_DECODER
        def_bool y
index e9b57ec..cf8fdf8 100644 (file)
@@ -3,7 +3,7 @@
 
 /* ECC atomic, DMA, SMP and interrupt safe scrub function */
 
-static inline void atomic_scrub(void *va, u32 size)
+static inline void edac_atomic_scrub(void *va, u32 size)
 {
        u32 i, *virt_addr = va;
 
index 2d2530c..a90e06a 100644 (file)
@@ -2,15 +2,16 @@
 #      EDAC Kconfig
 #      Copyright (c) 2008 Doug Thompson www.softwarebitmaker.com
 #      Licensed and distributed under the GPL
-#
+
+config EDAC_ATOMIC_SCRUB
+       bool
 
 config EDAC_SUPPORT
        bool
 
 menuconfig EDAC
        bool "EDAC (Error Detection And Correction) reporting"
-       depends on HAS_IOMEM
-       depends on X86 || PPC || TILE || ARM || EDAC_SUPPORT
+       depends on HAS_IOMEM && EDAC_SUPPORT
        help
          EDAC is designed to report errors in the core system.
          These are low-level errors that are reported in the CPU or
index af3be19..943ed8c 100644 (file)
 #include <linux/bitops.h>
 #include <asm/uaccess.h>
 #include <asm/page.h>
-#include <asm/edac.h>
 #include "edac_core.h"
 #include "edac_module.h"
 #include <ras/ras_event.h>
 
+#ifdef CONFIG_EDAC_ATOMIC_SCRUB
+#include <asm/edac.h>
+#else
+#define edac_atomic_scrub(va, size) do { } while (0)
+#endif
+
 /* lock to memory controller's control array */
 static DEFINE_MUTEX(mem_ctls_mutex);
 static LIST_HEAD(mc_devices);
@@ -874,7 +879,7 @@ static void edac_mc_scrub_block(unsigned long page, unsigned long offset,
        virt_addr = kmap_atomic(pg);
 
        /* Perform architecture specific atomic scrub operation */
-       atomic_scrub(virt_addr + offset, size);
+       edac_atomic_scrub(virt_addr + offset, size);
 
        /* Unmap and complete */
        kunmap_atomic(virt_addr);