aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/edac
diff options
context:
space:
mode:
authorBorislav Petkov <bp@suse.de>2015-05-21 13:59:31 -0400
committerBorislav Petkov <bp@suse.de>2015-05-28 09:31:53 -0400
commitb01aec9b2c7d32f17a37553df63efa9f7c0fdaa0 (patch)
treec824c935c92b9dbbbfd2dc7405aec2e4063eacc9 /drivers/edac
parent30c7469ba6f5eccf33ac33ec7cb19414f50cf3bf (diff)
EDAC: Cleanup atomic_scrub mess
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>
Diffstat (limited to 'drivers/edac')
-rw-r--r--drivers/edac/Kconfig7
-rw-r--r--drivers/edac/edac_mc.c9
2 files changed, 11 insertions, 5 deletions
diff --git a/drivers/edac/Kconfig b/drivers/edac/Kconfig
index 2d2530cdf99d..a90e06ac1631 100644
--- a/drivers/edac/Kconfig
+++ b/drivers/edac/Kconfig
@@ -2,15 +2,16 @@
2# EDAC Kconfig 2# EDAC Kconfig
3# Copyright (c) 2008 Doug Thompson www.softwarebitmaker.com 3# Copyright (c) 2008 Doug Thompson www.softwarebitmaker.com
4# Licensed and distributed under the GPL 4# Licensed and distributed under the GPL
5# 5
6config EDAC_ATOMIC_SCRUB
7 bool
6 8
7config EDAC_SUPPORT 9config EDAC_SUPPORT
8 bool 10 bool
9 11
10menuconfig EDAC 12menuconfig EDAC
11 bool "EDAC (Error Detection And Correction) reporting" 13 bool "EDAC (Error Detection And Correction) reporting"
12 depends on HAS_IOMEM 14 depends on HAS_IOMEM && EDAC_SUPPORT
13 depends on X86 || PPC || TILE || ARM || EDAC_SUPPORT
14 help 15 help
15 EDAC is designed to report errors in the core system. 16 EDAC is designed to report errors in the core system.
16 These are low-level errors that are reported in the CPU or 17 These are low-level errors that are reported in the CPU or
diff --git a/drivers/edac/edac_mc.c b/drivers/edac/edac_mc.c
index af3be1914dbb..943ed8cf71b9 100644
--- a/drivers/edac/edac_mc.c
+++ b/drivers/edac/edac_mc.c
@@ -30,11 +30,16 @@
30#include <linux/bitops.h> 30#include <linux/bitops.h>
31#include <asm/uaccess.h> 31#include <asm/uaccess.h>
32#include <asm/page.h> 32#include <asm/page.h>
33#include <asm/edac.h>
34#include "edac_core.h" 33#include "edac_core.h"
35#include "edac_module.h" 34#include "edac_module.h"
36#include <ras/ras_event.h> 35#include <ras/ras_event.h>
37 36
37#ifdef CONFIG_EDAC_ATOMIC_SCRUB
38#include <asm/edac.h>
39#else
40#define edac_atomic_scrub(va, size) do { } while (0)
41#endif
42
38/* lock to memory controller's control array */ 43/* lock to memory controller's control array */
39static DEFINE_MUTEX(mem_ctls_mutex); 44static DEFINE_MUTEX(mem_ctls_mutex);
40static LIST_HEAD(mc_devices); 45static LIST_HEAD(mc_devices);
@@ -874,7 +879,7 @@ static void edac_mc_scrub_block(unsigned long page, unsigned long offset,
874 virt_addr = kmap_atomic(pg); 879 virt_addr = kmap_atomic(pg);
875 880
876 /* Perform architecture specific atomic scrub operation */ 881 /* Perform architecture specific atomic scrub operation */
877 atomic_scrub(virt_addr + offset, size); 882 edac_atomic_scrub(virt_addr + offset, size);
878 883
879 /* Unmap and complete */ 884 /* Unmap and complete */
880 kunmap_atomic(virt_addr); 885 kunmap_atomic(virt_addr);