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>
This commit is contained in:
Borislav Petkov 2015-05-21 19:59:31 +02:00
parent 30c7469ba6
commit b01aec9b2c
12 changed files with 27 additions and 41 deletions

View file

@ -15,6 +15,8 @@ config ARM
select CLONE_BACKWARDS select CLONE_BACKWARDS
select CPU_PM if (SUSPEND || CPU_IDLE) select CPU_PM if (SUSPEND || CPU_IDLE)
select DCACHE_WORD_ACCESS if HAVE_EFFICIENT_UNALIGNED_ACCESS select DCACHE_WORD_ACCESS if HAVE_EFFICIENT_UNALIGNED_ACCESS
select EDAC_SUPPORT
select EDAC_ATOMIC_SCRUB
select GENERIC_ALLOCATOR select GENERIC_ALLOCATOR
select GENERIC_ATOMIC64 if (CPU_V7M || CPU_V6 || !CPU_32v6K || !AEABI) select GENERIC_ATOMIC64 if (CPU_V7M || CPU_V6 || !CPU_32v6K || !AEABI)
select GENERIC_CLOCKEVENTS_BROADCAST if SMP select GENERIC_CLOCKEVENTS_BROADCAST if SMP

View file

@ -18,11 +18,12 @@
#define ASM_EDAC_H #define ASM_EDAC_H
/* /*
* ECC atomic, DMA, SMP and interrupt safe scrub function. * 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 * ECC scrubbing. It reads memory and then writes back the original
* value, allowing the hardware to detect and correct memory errors. * 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 #if __LINUX_ARM_ARCH__ >= 6
unsigned int *virt_addr = va; unsigned int *virt_addr = va;

View file

@ -819,6 +819,7 @@ config CAVIUM_OCTEON_SOC
select SYS_SUPPORTS_64BIT_KERNEL select SYS_SUPPORTS_64BIT_KERNEL
select SYS_SUPPORTS_BIG_ENDIAN select SYS_SUPPORTS_BIG_ENDIAN
select EDAC_SUPPORT select EDAC_SUPPORT
select EDAC_ATOMIC_SCRUB
select SYS_SUPPORTS_LITTLE_ENDIAN select SYS_SUPPORTS_LITTLE_ENDIAN
select SYS_SUPPORTS_HOTPLUG_CPU if CPU_BIG_ENDIAN select SYS_SUPPORTS_HOTPLUG_CPU if CPU_BIG_ENDIAN
select SYS_HAS_EARLY_PRINTK select SYS_HAS_EARLY_PRINTK

View file

@ -5,7 +5,7 @@
/* ECC atomic, DMA, SMP and interrupt safe scrub function */ /* 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 *virt_addr = va;
unsigned long temp; unsigned long temp;
@ -21,7 +21,7 @@ static inline void atomic_scrub(void *va, u32 size)
__asm__ __volatile__ ( __asm__ __volatile__ (
" .set mips2 \n" " .set mips2 \n"
"1: ll %0, %1 # atomic_scrub \n" "1: ll %0, %1 # edac_atomic_scrub \n"
" addu %0, $0 \n" " addu %0, $0 \n"
" sc %0, %1 \n" " sc %0, %1 \n"
" beqz %0, 1b \n" " beqz %0, 1b \n"

View file

@ -153,6 +153,8 @@ config PPC
select NO_BOOTMEM select NO_BOOTMEM
select HAVE_GENERIC_RCU_GUP select HAVE_GENERIC_RCU_GUP
select HAVE_PERF_EVENTS_NMI if PPC64 select HAVE_PERF_EVENTS_NMI if PPC64
select EDAC_SUPPORT
select EDAC_ATOMIC_SCRUB
config GENERIC_CSUM config GENERIC_CSUM
def_bool CPU_LITTLE_ENDIAN def_bool CPU_LITTLE_ENDIAN

View file

@ -12,11 +12,11 @@
#define ASM_EDAC_H #define ASM_EDAC_H
/* /*
* ECC atomic, DMA, SMP and interrupt safe scrub function. * 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 * ECC scrubbing. It reads memory and then writes back the original
* value, allowing the hardware to detect and correct memory errors. * 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 *virt_addr = va;
unsigned int temp; unsigned int temp;

View file

@ -28,6 +28,7 @@ config TILE
select HAVE_DEBUG_STACKOVERFLOW select HAVE_DEBUG_STACKOVERFLOW
select ARCH_WANT_FRAME_POINTERS select ARCH_WANT_FRAME_POINTERS
select HAVE_CONTEXT_TRACKING select HAVE_CONTEXT_TRACKING
select EDAC_SUPPORT
# FIXME: investigate whether we need/want these options. # FIXME: investigate whether we need/want these options.
# select HAVE_IOREMAP_PROT # select HAVE_IOREMAP_PROT

View file

@ -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 */

View file

@ -143,6 +143,8 @@ config X86
select ACPI_LEGACY_TABLES_LOOKUP if ACPI select ACPI_LEGACY_TABLES_LOOKUP if ACPI
select X86_FEATURE_NAMES if PROC_FS select X86_FEATURE_NAMES if PROC_FS
select SRCU select SRCU
select EDAC_SUPPORT
select EDAC_ATOMIC_SCRUB
config INSTRUCTION_DECODER config INSTRUCTION_DECODER
def_bool y def_bool y

View file

@ -3,7 +3,7 @@
/* ECC atomic, DMA, SMP and interrupt safe scrub function */ /* 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; u32 i, *virt_addr = va;

View file

@ -2,15 +2,16 @@
# EDAC Kconfig # EDAC Kconfig
# Copyright (c) 2008 Doug Thompson www.softwarebitmaker.com # Copyright (c) 2008 Doug Thompson www.softwarebitmaker.com
# Licensed and distributed under the GPL # Licensed and distributed under the GPL
#
config EDAC_ATOMIC_SCRUB
bool
config EDAC_SUPPORT config EDAC_SUPPORT
bool bool
menuconfig EDAC menuconfig EDAC
bool "EDAC (Error Detection And Correction) reporting" bool "EDAC (Error Detection And Correction) reporting"
depends on HAS_IOMEM depends on HAS_IOMEM && EDAC_SUPPORT
depends on X86 || PPC || TILE || ARM || EDAC_SUPPORT
help help
EDAC is designed to report errors in the core system. EDAC is designed to report errors in the core system.
These are low-level errors that are reported in the CPU or These are low-level errors that are reported in the CPU or

View file

@ -30,11 +30,16 @@
#include <linux/bitops.h> #include <linux/bitops.h>
#include <asm/uaccess.h> #include <asm/uaccess.h>
#include <asm/page.h> #include <asm/page.h>
#include <asm/edac.h>
#include "edac_core.h" #include "edac_core.h"
#include "edac_module.h" #include "edac_module.h"
#include <ras/ras_event.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 */ /* lock to memory controller's control array */
static DEFINE_MUTEX(mem_ctls_mutex); static DEFINE_MUTEX(mem_ctls_mutex);
static LIST_HEAD(mc_devices); 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); virt_addr = kmap_atomic(pg);
/* Perform architecture specific atomic scrub operation */ /* Perform architecture specific atomic scrub operation */
atomic_scrub(virt_addr + offset, size); edac_atomic_scrub(virt_addr + offset, size);
/* Unmap and complete */ /* Unmap and complete */
kunmap_atomic(virt_addr); kunmap_atomic(virt_addr);