[PATCH 1/6] ARM: move cache/processor/fault glue to separate include files
Colin Cross
ccross at google.com
Fri Feb 11 21:52:14 EST 2011
On Fri, Feb 11, 2011 at 8:17 AM, Russell King - ARM Linux
<linux at arm.linux.org.uk> wrote:
> This allows the cache/processor/fault glue to be more easily used
> from assembler code.
>
> Signed-off-by: Russell King <rmk+kernel at arm.linux.org.uk>
> ---
> arch/arm/include/asm/cacheflush.h | 133 +----------------
> arch/arm/include/asm/cpu-multi32.h | 69 --------
> arch/arm/include/asm/cpu-single.h | 44 ------
> arch/arm/include/asm/glue-cache.h | 146 ++++++++++++++++++
> arch/arm/include/asm/glue-df.h | 110 +++++++++++++
> arch/arm/include/asm/glue-pf.h | 57 +++++++
> arch/arm/include/asm/glue-proc.h | 261 +++++++++++++++++++++++++++++++
> arch/arm/include/asm/glue.h | 138 -----------------
> arch/arm/include/asm/proc-fns.h | 299 ++++++++----------------------------
> arch/arm/kernel/asm-offsets.c | 2 +
> arch/arm/kernel/entry-armv.S | 3 +-
> 11 files changed, 644 insertions(+), 618 deletions(-)
> delete mode 100644 arch/arm/include/asm/cpu-multi32.h
> delete mode 100644 arch/arm/include/asm/cpu-single.h
> create mode 100644 arch/arm/include/asm/glue-cache.h
> create mode 100644 arch/arm/include/asm/glue-df.h
> create mode 100644 arch/arm/include/asm/glue-pf.h
> create mode 100644 arch/arm/include/asm/glue-proc.h
>
> diff --git a/arch/arm/include/asm/cacheflush.h b/arch/arm/include/asm/cacheflush.h
> index 3acd8fa..18a5664 100644
> --- a/arch/arm/include/asm/cacheflush.h
> +++ b/arch/arm/include/asm/cacheflush.h
> @@ -12,7 +12,7 @@
>
> #include <linux/mm.h>
>
> -#include <asm/glue.h>
> +#include <asm/glue-cache.h>
> #include <asm/shmparam.h>
> #include <asm/cachetype.h>
> #include <asm/outercache.h>
> @@ -20,123 +20,6 @@
> #define CACHE_COLOUR(vaddr) ((vaddr & (SHMLBA - 1)) >> PAGE_SHIFT)
>
> /*
> - * Cache Model
> - * ===========
> - */
> -#undef _CACHE
> -#undef MULTI_CACHE
> -
> -#if defined(CONFIG_CPU_CACHE_V3)
> -# ifdef _CACHE
> -# define MULTI_CACHE 1
> -# else
> -# define _CACHE v3
> -# endif
> -#endif
> -
> -#if defined(CONFIG_CPU_CACHE_V4)
> -# ifdef _CACHE
> -# define MULTI_CACHE 1
> -# else
> -# define _CACHE v4
> -# endif
> -#endif
> -
> -#if defined(CONFIG_CPU_ARM920T) || defined(CONFIG_CPU_ARM922T) || \
> - defined(CONFIG_CPU_ARM925T) || defined(CONFIG_CPU_ARM1020) || \
> - defined(CONFIG_CPU_ARM1026)
> -# define MULTI_CACHE 1
> -#endif
> -
> -#if defined(CONFIG_CPU_FA526)
> -# ifdef _CACHE
> -# define MULTI_CACHE 1
> -# else
> -# define _CACHE fa
> -# endif
> -#endif
> -
> -#if defined(CONFIG_CPU_ARM926T)
> -# ifdef _CACHE
> -# define MULTI_CACHE 1
> -# else
> -# define _CACHE arm926
> -# endif
> -#endif
> -
> -#if defined(CONFIG_CPU_ARM940T)
> -# ifdef _CACHE
> -# define MULTI_CACHE 1
> -# else
> -# define _CACHE arm940
> -# endif
> -#endif
> -
> -#if defined(CONFIG_CPU_ARM946E)
> -# ifdef _CACHE
> -# define MULTI_CACHE 1
> -# else
> -# define _CACHE arm946
> -# endif
> -#endif
> -
> -#if defined(CONFIG_CPU_CACHE_V4WB)
> -# ifdef _CACHE
> -# define MULTI_CACHE 1
> -# else
> -# define _CACHE v4wb
> -# endif
> -#endif
> -
> -#if defined(CONFIG_CPU_XSCALE)
> -# ifdef _CACHE
> -# define MULTI_CACHE 1
> -# else
> -# define _CACHE xscale
> -# endif
> -#endif
> -
> -#if defined(CONFIG_CPU_XSC3)
> -# ifdef _CACHE
> -# define MULTI_CACHE 1
> -# else
> -# define _CACHE xsc3
> -# endif
> -#endif
> -
> -#if defined(CONFIG_CPU_MOHAWK)
> -# ifdef _CACHE
> -# define MULTI_CACHE 1
> -# else
> -# define _CACHE mohawk
> -# endif
> -#endif
> -
> -#if defined(CONFIG_CPU_FEROCEON)
> -# define MULTI_CACHE 1
> -#endif
> -
> -#if defined(CONFIG_CPU_V6)
> -//# ifdef _CACHE
> -# define MULTI_CACHE 1
> -//# else
> -//# define _CACHE v6
> -//# endif
> -#endif
> -
> -#if defined(CONFIG_CPU_V7)
> -//# ifdef _CACHE
> -# define MULTI_CACHE 1
> -//# else
> -//# define _CACHE v7
> -//# endif
> -#endif
> -
> -#if !defined(_CACHE) && !defined(MULTI_CACHE)
> -#error Unknown cache maintainence model
> -#endif
> -
> -/*
> * This flag is used to indicate that the page pointed to by a pte is clean
> * and does not require cleaning before returning it to the user.
> */
> @@ -249,19 +132,11 @@ extern struct cpu_cache_fns cpu_cache;
> * visible to the CPU.
> */
> #define dmac_map_area cpu_cache.dma_map_area
> -#define dmac_unmap_area cpu_cache.dma_unmap_area
> +#define dmac_unmap_area cpu_cache.dma_unmap_area
> #define dmac_flush_range cpu_cache.dma_flush_range
>
> #else
>
> -#define __cpuc_flush_icache_all __glue(_CACHE,_flush_icache_all)
> -#define __cpuc_flush_kern_all __glue(_CACHE,_flush_kern_cache_all)
> -#define __cpuc_flush_user_all __glue(_CACHE,_flush_user_cache_all)
> -#define __cpuc_flush_user_range __glue(_CACHE,_flush_user_cache_range)
> -#define __cpuc_coherent_kern_range __glue(_CACHE,_coherent_kern_range)
> -#define __cpuc_coherent_user_range __glue(_CACHE,_coherent_user_range)
> -#define __cpuc_flush_dcache_area __glue(_CACHE,_flush_kern_dcache_area)
> -
> extern void __cpuc_flush_icache_all(void);
> extern void __cpuc_flush_kern_all(void);
> extern void __cpuc_flush_user_all(void);
> @@ -276,10 +151,6 @@ extern void __cpuc_flush_dcache_area(void *, size_t);
> * is visible to DMA, or data written by DMA to system memory is
> * visible to the CPU.
> */
> -#define dmac_map_area __glue(_CACHE,_dma_map_area)
> -#define dmac_unmap_area __glue(_CACHE,_dma_unmap_area)
> -#define dmac_flush_range __glue(_CACHE,_dma_flush_range)
> -
> extern void dmac_map_area(const void *, size_t, int);
> extern void dmac_unmap_area(const void *, size_t, int);
> extern void dmac_flush_range(const void *, const void *);
> diff --git a/arch/arm/include/asm/cpu-multi32.h b/arch/arm/include/asm/cpu-multi32.h
> deleted file mode 100644
> index e2b5b0b..0000000
> --- a/arch/arm/include/asm/cpu-multi32.h
> +++ /dev/null
> @@ -1,69 +0,0 @@
> -/*
> - * arch/arm/include/asm/cpu-multi32.h
> - *
> - * Copyright (C) 2000 Russell King
> - *
> - * This program is free software; you can redistribute it and/or modify
> - * it under the terms of the GNU General Public License version 2 as
> - * published by the Free Software Foundation.
> - */
> -#include <asm/page.h>
> -
> -struct mm_struct;
> -
> -/*
> - * Don't change this structure - ASM code
> - * relies on it.
> - */
> -extern struct processor {
> - /* MISC
> - * get data abort address/flags
> - */
> - void (*_data_abort)(unsigned long pc);
> - /*
> - * Retrieve prefetch fault address
> - */
> - unsigned long (*_prefetch_abort)(unsigned long lr);
> - /*
> - * Set up any processor specifics
> - */
> - void (*_proc_init)(void);
> - /*
> - * Disable any processor specifics
> - */
> - void (*_proc_fin)(void);
> - /*
> - * Special stuff for a reset
> - */
> - void (*reset)(unsigned long addr) __attribute__((noreturn));
> - /*
> - * Idle the processor
> - */
> - int (*_do_idle)(void);
> - /*
> - * Processor architecture specific
> - */
> - /*
> - * clean a virtual address range from the
> - * D-cache without flushing the cache.
> - */
> - void (*dcache_clean_area)(void *addr, int size);
> -
> - /*
> - * Set the page table
> - */
> - void (*switch_mm)(unsigned long pgd_phys, struct mm_struct *mm);
> - /*
> - * Set a possibly extended PTE. Non-extended PTEs should
> - * ignore 'ext'.
> - */
> - void (*set_pte_ext)(pte_t *ptep, pte_t pte, unsigned int ext);
> -} processor;
> -
> -#define cpu_proc_init() processor._proc_init()
> -#define cpu_proc_fin() processor._proc_fin()
> -#define cpu_reset(addr) processor.reset(addr)
> -#define cpu_do_idle() processor._do_idle()
> -#define cpu_dcache_clean_area(addr,sz) processor.dcache_clean_area(addr,sz)
> -#define cpu_set_pte_ext(ptep,pte,ext) processor.set_pte_ext(ptep,pte,ext)
> -#define cpu_do_switch_mm(pgd,mm) processor.switch_mm(pgd,mm)
> diff --git a/arch/arm/include/asm/cpu-single.h b/arch/arm/include/asm/cpu-single.h
> deleted file mode 100644
> index f073a6d..0000000
> --- a/arch/arm/include/asm/cpu-single.h
> +++ /dev/null
> @@ -1,44 +0,0 @@
> -/*
> - * arch/arm/include/asm/cpu-single.h
> - *
> - * Copyright (C) 2000 Russell King
> - *
> - * This program is free software; you can redistribute it and/or modify
> - * it under the terms of the GNU General Public License version 2 as
> - * published by the Free Software Foundation.
> - */
> -/*
> - * Single CPU
> - */
> -#ifdef __STDC__
> -#define __catify_fn(name,x) name##x
> -#else
> -#define __catify_fn(name,x) name/**/x
> -#endif
> -#define __cpu_fn(name,x) __catify_fn(name,x)
> -
> -/*
> - * If we are supporting multiple CPUs, then we must use a table of
> - * function pointers for this lot. Otherwise, we can optimise the
> - * table away.
> - */
> -#define cpu_proc_init __cpu_fn(CPU_NAME,_proc_init)
> -#define cpu_proc_fin __cpu_fn(CPU_NAME,_proc_fin)
> -#define cpu_reset __cpu_fn(CPU_NAME,_reset)
> -#define cpu_do_idle __cpu_fn(CPU_NAME,_do_idle)
> -#define cpu_dcache_clean_area __cpu_fn(CPU_NAME,_dcache_clean_area)
> -#define cpu_do_switch_mm __cpu_fn(CPU_NAME,_switch_mm)
> -#define cpu_set_pte_ext __cpu_fn(CPU_NAME,_set_pte_ext)
> -
> -#include <asm/page.h>
> -
> -struct mm_struct;
> -
> -/* declare all the functions as extern */
> -extern void cpu_proc_init(void);
> -extern void cpu_proc_fin(void);
> -extern int cpu_do_idle(void);
> -extern void cpu_dcache_clean_area(void *, int);
> -extern void cpu_do_switch_mm(unsigned long pgd_phys, struct mm_struct *mm);
> -extern void cpu_set_pte_ext(pte_t *ptep, pte_t pte, unsigned int ext);
> -extern void cpu_reset(unsigned long addr) __attribute__((noreturn));
> diff --git a/arch/arm/include/asm/glue-cache.h b/arch/arm/include/asm/glue-cache.h
> new file mode 100644
> index 0000000..0591d35
> --- /dev/null
> +++ b/arch/arm/include/asm/glue-cache.h
> @@ -0,0 +1,146 @@
> +/*
> + * arch/arm/include/asm/glue-cache.h
> + *
> + * Copyright (C) 1999-2002 Russell King
> + *
> + * This program is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License version 2 as
> + * published by the Free Software Foundation.
> + */
> +#ifndef ASM_GLUE_CACHE_H
> +#define ASM_GLUE_CACHE_H
> +
> +#include <asm/glue.h>
> +
> +/*
> + * Cache Model
> + * ===========
> + */
> +#undef _CACHE
> +#undef MULTI_CACHE
> +
> +#if defined(CONFIG_CPU_CACHE_V3)
> +# ifdef _CACHE
> +# define MULTI_CACHE 1
> +# else
> +# define _CACHE v3
> +# endif
> +#endif
> +
> +#if defined(CONFIG_CPU_CACHE_V4)
> +# ifdef _CACHE
> +# define MULTI_CACHE 1
> +# else
> +# define _CACHE v4
> +# endif
> +#endif
> +
> +#if defined(CONFIG_CPU_ARM920T) || defined(CONFIG_CPU_ARM922T) || \
> + defined(CONFIG_CPU_ARM925T) || defined(CONFIG_CPU_ARM1020) || \
> + defined(CONFIG_CPU_ARM1026)
> +# define MULTI_CACHE 1
> +#endif
> +
> +#if defined(CONFIG_CPU_FA526)
> +# ifdef _CACHE
> +# define MULTI_CACHE 1
> +# else
> +# define _CACHE fa
> +# endif
> +#endif
> +
> +#if defined(CONFIG_CPU_ARM926T)
> +# ifdef _CACHE
> +# define MULTI_CACHE 1
> +# else
> +# define _CACHE arm926
> +# endif
> +#endif
> +
> +#if defined(CONFIG_CPU_ARM940T)
> +# ifdef _CACHE
> +# define MULTI_CACHE 1
> +# else
> +# define _CACHE arm940
> +# endif
> +#endif
> +
> +#if defined(CONFIG_CPU_ARM946E)
> +# ifdef _CACHE
> +# define MULTI_CACHE 1
> +# else
> +# define _CACHE arm946
> +# endif
> +#endif
> +
> +#if defined(CONFIG_CPU_CACHE_V4WB)
> +# ifdef _CACHE
> +# define MULTI_CACHE 1
> +# else
> +# define _CACHE v4wb
> +# endif
> +#endif
> +
> +#if defined(CONFIG_CPU_XSCALE)
> +# ifdef _CACHE
> +# define MULTI_CACHE 1
> +# else
> +# define _CACHE xscale
> +# endif
> +#endif
> +
> +#if defined(CONFIG_CPU_XSC3)
> +# ifdef _CACHE
> +# define MULTI_CACHE 1
> +# else
> +# define _CACHE xsc3
> +# endif
> +#endif
> +
> +#if defined(CONFIG_CPU_MOHAWK)
> +# ifdef _CACHE
> +# define MULTI_CACHE 1
> +# else
> +# define _CACHE mohawk
> +# endif
> +#endif
> +
> +#if defined(CONFIG_CPU_FEROCEON)
> +# define MULTI_CACHE 1
> +#endif
> +
> +#if defined(CONFIG_CPU_V6)
> +//# ifdef _CACHE
> +# define MULTI_CACHE 1
> +//# else
> +//# define _CACHE v6
> +//# endif
> +#endif
> +
> +#if defined(CONFIG_CPU_V7)
> +//# ifdef _CACHE
> +# define MULTI_CACHE 1
> +//# else
> +//# define _CACHE v7
> +//# endif
> +#endif
> +
> +#if !defined(_CACHE) && !defined(MULTI_CACHE)
> +#error Unknown cache maintainence model
> +#endif
> +
> +#ifndef MULTI_CACHE
> +#define __cpuc_flush_icache_all __glue(_CACHE,_flush_icache_all)
> +#define __cpuc_flush_kern_all __glue(_CACHE,_flush_kern_cache_all)
> +#define __cpuc_flush_user_all __glue(_CACHE,_flush_user_cache_all)
> +#define __cpuc_flush_user_range __glue(_CACHE,_flush_user_cache_range)
> +#define __cpuc_coherent_kern_range __glue(_CACHE,_coherent_kern_range)
> +#define __cpuc_coherent_user_range __glue(_CACHE,_coherent_user_range)
> +#define __cpuc_flush_dcache_area __glue(_CACHE,_flush_kern_dcache_area)
> +
> +#define dmac_map_area __glue(_CACHE,_dma_map_area)
> +#define dmac_unmap_area __glue(_CACHE,_dma_unmap_area)
> +#define dmac_flush_range __glue(_CACHE,_dma_flush_range)
> +#endif
> +
> +#endif
> diff --git a/arch/arm/include/asm/glue-df.h b/arch/arm/include/asm/glue-df.h
> new file mode 100644
> index 0000000..354d571
> --- /dev/null
> +++ b/arch/arm/include/asm/glue-df.h
> @@ -0,0 +1,110 @@
> +/*
> + * arch/arm/include/asm/glue-df.h
> + *
> + * Copyright (C) 1997-1999 Russell King
> + * Copyright (C) 2000-2002 Deep Blue Solutions Ltd.
> + *
> + * This program is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License version 2 as
> + * published by the Free Software Foundation.
> + */
> +#ifndef ASM_GLUE_DF_H
> +#define ASM_GLUE_DF_H
> +
> +#include <asm/glue.h>
> +
> +/*
> + * Data Abort Model
> + * ================
> + *
> + * We have the following to choose from:
> + * arm6 - ARM6 style
> + * arm7 - ARM7 style
> + * v4_early - ARMv4 without Thumb early abort handler
> + * v4t_late - ARMv4 with Thumb late abort handler
> + * v4t_early - ARMv4 with Thumb early abort handler
> + * v5tej_early - ARMv5 with Thumb and Java early abort handler
> + * xscale - ARMv5 with Thumb with Xscale extensions
> + * v6_early - ARMv6 generic early abort handler
> + * v7_early - ARMv7 generic early abort handler
> + */
> +#undef CPU_DABORT_HANDLER
> +#undef MULTI_DABORT
> +
> +#if defined(CONFIG_CPU_ARM610)
> +# ifdef CPU_DABORT_HANDLER
> +# define MULTI_DABORT 1
> +# else
> +# define CPU_DABORT_HANDLER cpu_arm6_data_abort
> +# endif
> +#endif
> +
> +#if defined(CONFIG_CPU_ARM710)
> +# ifdef CPU_DABORT_HANDLER
> +# define MULTI_DABORT 1
> +# else
> +# define CPU_DABORT_HANDLER cpu_arm7_data_abort
> +# endif
> +#endif
> +
> +#ifdef CONFIG_CPU_ABRT_LV4T
> +# ifdef CPU_DABORT_HANDLER
> +# define MULTI_DABORT 1
> +# else
> +# define CPU_DABORT_HANDLER v4t_late_abort
> +# endif
> +#endif
> +
> +#ifdef CONFIG_CPU_ABRT_EV4
> +# ifdef CPU_DABORT_HANDLER
> +# define MULTI_DABORT 1
> +# else
> +# define CPU_DABORT_HANDLER v4_early_abort
> +# endif
> +#endif
> +
> +#ifdef CONFIG_CPU_ABRT_EV4T
> +# ifdef CPU_DABORT_HANDLER
> +# define MULTI_DABORT 1
> +# else
> +# define CPU_DABORT_HANDLER v4t_early_abort
> +# endif
> +#endif
> +
> +#ifdef CONFIG_CPU_ABRT_EV5TJ
> +# ifdef CPU_DABORT_HANDLER
> +# define MULTI_DABORT 1
> +# else
> +# define CPU_DABORT_HANDLER v5tj_early_abort
> +# endif
> +#endif
> +
> +#ifdef CONFIG_CPU_ABRT_EV5T
> +# ifdef CPU_DABORT_HANDLER
> +# define MULTI_DABORT 1
> +# else
> +# define CPU_DABORT_HANDLER v5t_early_abort
> +# endif
> +#endif
> +
> +#ifdef CONFIG_CPU_ABRT_EV6
> +# ifdef CPU_DABORT_HANDLER
> +# define MULTI_DABORT 1
> +# else
> +# define CPU_DABORT_HANDLER v6_early_abort
> +# endif
> +#endif
> +
> +#ifdef CONFIG_CPU_ABRT_EV7
> +# ifdef CPU_DABORT_HANDLER
> +# define MULTI_DABORT 1
> +# else
> +# define CPU_DABORT_HANDLER v7_early_abort
> +# endif
> +#endif
> +
> +#ifndef CPU_DABORT_HANDLER
> +#error Unknown data abort handler type
> +#endif
> +
> +#endif
> diff --git a/arch/arm/include/asm/glue-pf.h b/arch/arm/include/asm/glue-pf.h
> new file mode 100644
> index 0000000..d385f37
> --- /dev/null
> +++ b/arch/arm/include/asm/glue-pf.h
> @@ -0,0 +1,57 @@
> +/*
> + * arch/arm/include/asm/glue-pf.h
> + *
> + * Copyright (C) 1997-1999 Russell King
> + * Copyright (C) 2000-2002 Deep Blue Solutions Ltd.
> + *
> + * This program is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License version 2 as
> + * published by the Free Software Foundation.
> + */
> +#ifndef ASM_GLUE_PF_H
> +#define ASM_GLUE_PF_H
> +
> +#include <asm/glue.h>
> +
> +/*
> + * Prefetch Abort Model
> + * ================
> + *
> + * We have the following to choose from:
> + * legacy - no IFSR, no IFAR
> + * v6 - ARMv6: IFSR, no IFAR
> + * v7 - ARMv7: IFSR and IFAR
> + */
> +
> +#undef CPU_PABORT_HANDLER
> +#undef MULTI_PABORT
> +
> +#ifdef CONFIG_CPU_PABRT_LEGACY
> +# ifdef CPU_PABORT_HANDLER
> +# define MULTI_PABORT 1
> +# else
> +# define CPU_PABORT_HANDLER legacy_pabort
> +# endif
> +#endif
> +
> +#ifdef CONFIG_CPU_PABRT_V6
> +# ifdef CPU_PABORT_HANDLER
> +# define MULTI_PABORT 1
> +# else
> +# define CPU_PABORT_HANDLER v6_pabort
> +# endif
> +#endif
> +
> +#ifdef CONFIG_CPU_PABRT_V7
> +# ifdef CPU_PABORT_HANDLER
> +# define MULTI_PABORT 1
> +# else
> +# define CPU_PABORT_HANDLER v7_pabort
> +# endif
> +#endif
> +
> +#ifndef CPU_PABORT_HANDLER
> +#error Unknown prefetch abort handler type
> +#endif
> +
> +#endif
> diff --git a/arch/arm/include/asm/glue-proc.h b/arch/arm/include/asm/glue-proc.h
> new file mode 100644
> index 0000000..e3bf443
> --- /dev/null
> +++ b/arch/arm/include/asm/glue-proc.h
> @@ -0,0 +1,261 @@
> +/*
> + * arch/arm/include/asm/glue-proc.h
> + *
> + * Copyright (C) 1997-1999 Russell King
> + * Copyright (C) 2000 Deep Blue Solutions Ltd
> + *
> + * This program is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License version 2 as
> + * published by the Free Software Foundation.
> + */
> +#ifndef ASM_GLUE_PROC_H
> +#define ASM_GLUE_PROC_H
> +
> +#include <asm/glue.h>
> +
> +/*
> + * Work out if we need multiple CPU support
> + */
> +#undef MULTI_CPU
> +#undef CPU_NAME
> +
> +/*
> + * CPU_NAME - the prefix for CPU related functions
> + */
> +
> +#ifdef CONFIG_CPU_ARM610
> +# ifdef CPU_NAME
> +# undef MULTI_CPU
> +# define MULTI_CPU
> +# else
> +# define CPU_NAME cpu_arm6
> +# endif
> +#endif
> +
> +#ifdef CONFIG_CPU_ARM7TDMI
> +# ifdef CPU_NAME
> +# undef MULTI_CPU
> +# define MULTI_CPU
> +# else
> +# define CPU_NAME cpu_arm7tdmi
> +# endif
> +#endif
> +
> +#ifdef CONFIG_CPU_ARM710
> +# ifdef CPU_NAME
> +# undef MULTI_CPU
> +# define MULTI_CPU
> +# else
> +# define CPU_NAME cpu_arm7
> +# endif
> +#endif
> +
> +#ifdef CONFIG_CPU_ARM720T
> +# ifdef CPU_NAME
> +# undef MULTI_CPU
> +# define MULTI_CPU
> +# else
> +# define CPU_NAME cpu_arm720
> +# endif
> +#endif
> +
> +#ifdef CONFIG_CPU_ARM740T
> +# ifdef CPU_NAME
> +# undef MULTI_CPU
> +# define MULTI_CPU
> +# else
> +# define CPU_NAME cpu_arm740
> +# endif
> +#endif
> +
> +#ifdef CONFIG_CPU_ARM9TDMI
> +# ifdef CPU_NAME
> +# undef MULTI_CPU
> +# define MULTI_CPU
> +# else
> +# define CPU_NAME cpu_arm9tdmi
> +# endif
> +#endif
> +
> +#ifdef CONFIG_CPU_ARM920T
> +# ifdef CPU_NAME
> +# undef MULTI_CPU
> +# define MULTI_CPU
> +# else
> +# define CPU_NAME cpu_arm920
> +# endif
> +#endif
> +
> +#ifdef CONFIG_CPU_ARM922T
> +# ifdef CPU_NAME
> +# undef MULTI_CPU
> +# define MULTI_CPU
> +# else
> +# define CPU_NAME cpu_arm922
> +# endif
> +#endif
> +
> +#ifdef CONFIG_CPU_FA526
> +# ifdef CPU_NAME
> +# undef MULTI_CPU
> +# define MULTI_CPU
> +# else
> +# define CPU_NAME cpu_fa526
> +# endif
> +#endif
> +
> +#ifdef CONFIG_CPU_ARM925T
> +# ifdef CPU_NAME
> +# undef MULTI_CPU
> +# define MULTI_CPU
> +# else
> +# define CPU_NAME cpu_arm925
> +# endif
> +#endif
> +
> +#ifdef CONFIG_CPU_ARM926T
> +# ifdef CPU_NAME
> +# undef MULTI_CPU
> +# define MULTI_CPU
> +# else
> +# define CPU_NAME cpu_arm926
> +# endif
> +#endif
> +
> +#ifdef CONFIG_CPU_ARM940T
> +# ifdef CPU_NAME
> +# undef MULTI_CPU
> +# define MULTI_CPU
> +# else
> +# define CPU_NAME cpu_arm940
> +# endif
> +#endif
> +
> +#ifdef CONFIG_CPU_ARM946E
> +# ifdef CPU_NAME
> +# undef MULTI_CPU
> +# define MULTI_CPU
> +# else
> +# define CPU_NAME cpu_arm946
> +# endif
> +#endif
> +
> +#ifdef CONFIG_CPU_SA110
> +# ifdef CPU_NAME
> +# undef MULTI_CPU
> +# define MULTI_CPU
> +# else
> +# define CPU_NAME cpu_sa110
> +# endif
> +#endif
> +
> +#ifdef CONFIG_CPU_SA1100
> +# ifdef CPU_NAME
> +# undef MULTI_CPU
> +# define MULTI_CPU
> +# else
> +# define CPU_NAME cpu_sa1100
> +# endif
> +#endif
> +
> +#ifdef CONFIG_CPU_ARM1020
> +# ifdef CPU_NAME
> +# undef MULTI_CPU
> +# define MULTI_CPU
> +# else
> +# define CPU_NAME cpu_arm1020
> +# endif
> +#endif
> +
> +#ifdef CONFIG_CPU_ARM1020E
> +# ifdef CPU_NAME
> +# undef MULTI_CPU
> +# define MULTI_CPU
> +# else
> +# define CPU_NAME cpu_arm1020e
> +# endif
> +#endif
> +
> +#ifdef CONFIG_CPU_ARM1022
> +# ifdef CPU_NAME
> +# undef MULTI_CPU
> +# define MULTI_CPU
> +# else
> +# define CPU_NAME cpu_arm1022
> +# endif
> +#endif
> +
> +#ifdef CONFIG_CPU_ARM1026
> +# ifdef CPU_NAME
> +# undef MULTI_CPU
> +# define MULTI_CPU
> +# else
> +# define CPU_NAME cpu_arm1026
> +# endif
> +#endif
> +
> +#ifdef CONFIG_CPU_XSCALE
> +# ifdef CPU_NAME
> +# undef MULTI_CPU
> +# define MULTI_CPU
> +# else
> +# define CPU_NAME cpu_xscale
> +# endif
> +#endif
> +
> +#ifdef CONFIG_CPU_XSC3
> +# ifdef CPU_NAME
> +# undef MULTI_CPU
> +# define MULTI_CPU
> +# else
> +# define CPU_NAME cpu_xsc3
> +# endif
> +#endif
> +
> +#ifdef CONFIG_CPU_MOHAWK
> +# ifdef CPU_NAME
> +# undef MULTI_CPU
> +# define MULTI_CPU
> +# else
> +# define CPU_NAME cpu_mohawk
> +# endif
> +#endif
> +
> +#ifdef CONFIG_CPU_FEROCEON
> +# ifdef CPU_NAME
> +# undef MULTI_CPU
> +# define MULTI_CPU
> +# else
> +# define CPU_NAME cpu_feroceon
> +# endif
> +#endif
> +
> +#ifdef CONFIG_CPU_V6
> +# ifdef CPU_NAME
> +# undef MULTI_CPU
> +# define MULTI_CPU
> +# else
> +# define CPU_NAME cpu_v6
> +# endif
> +#endif
> +
> +#ifdef CONFIG_CPU_V7
> +# ifdef CPU_NAME
> +# undef MULTI_CPU
> +# define MULTI_CPU
> +# else
> +# define CPU_NAME cpu_v7
> +# endif
> +#endif
> +
> +#ifndef MULTI_CPU
> +#define cpu_proc_init __glue(CPU_NAME,_proc_init)
> +#define cpu_proc_fin __glue(CPU_NAME,_proc_fin)
> +#define cpu_reset __glue(CPU_NAME,_reset)
> +#define cpu_do_idle __glue(CPU_NAME,_do_idle)
> +#define cpu_dcache_clean_area __glue(CPU_NAME,_dcache_clean_area)
> +#define cpu_do_switch_mm __glue(CPU_NAME,_switch_mm)
> +#define cpu_set_pte_ext __glue(CPU_NAME,_set_pte_ext)
> +#endif
> +
> +#endif
> diff --git a/arch/arm/include/asm/glue.h b/arch/arm/include/asm/glue.h
> index 234a3fc..0ec35d1 100644
> --- a/arch/arm/include/asm/glue.h
> +++ b/arch/arm/include/asm/glue.h
> @@ -15,7 +15,6 @@
> */
> #ifdef __KERNEL__
>
> -
> #ifdef __STDC__
> #define ____glue(name,fn) name##fn
> #else
> @@ -23,141 +22,4 @@
> #endif
> #define __glue(name,fn) ____glue(name,fn)
>
> -
> -
> -/*
> - * Data Abort Model
> - * ================
> - *
> - * We have the following to choose from:
> - * arm6 - ARM6 style
> - * arm7 - ARM7 style
> - * v4_early - ARMv4 without Thumb early abort handler
> - * v4t_late - ARMv4 with Thumb late abort handler
> - * v4t_early - ARMv4 with Thumb early abort handler
> - * v5tej_early - ARMv5 with Thumb and Java early abort handler
> - * xscale - ARMv5 with Thumb with Xscale extensions
> - * v6_early - ARMv6 generic early abort handler
> - * v7_early - ARMv7 generic early abort handler
> - */
> -#undef CPU_DABORT_HANDLER
> -#undef MULTI_DABORT
> -
> -#if defined(CONFIG_CPU_ARM610)
> -# ifdef CPU_DABORT_HANDLER
> -# define MULTI_DABORT 1
> -# else
> -# define CPU_DABORT_HANDLER cpu_arm6_data_abort
> -# endif
> -#endif
> -
> -#if defined(CONFIG_CPU_ARM710)
> -# ifdef CPU_DABORT_HANDLER
> -# define MULTI_DABORT 1
> -# else
> -# define CPU_DABORT_HANDLER cpu_arm7_data_abort
> -# endif
> -#endif
> -
> -#ifdef CONFIG_CPU_ABRT_LV4T
> -# ifdef CPU_DABORT_HANDLER
> -# define MULTI_DABORT 1
> -# else
> -# define CPU_DABORT_HANDLER v4t_late_abort
> -# endif
> -#endif
> -
> -#ifdef CONFIG_CPU_ABRT_EV4
> -# ifdef CPU_DABORT_HANDLER
> -# define MULTI_DABORT 1
> -# else
> -# define CPU_DABORT_HANDLER v4_early_abort
> -# endif
> -#endif
> -
> -#ifdef CONFIG_CPU_ABRT_EV4T
> -# ifdef CPU_DABORT_HANDLER
> -# define MULTI_DABORT 1
> -# else
> -# define CPU_DABORT_HANDLER v4t_early_abort
> -# endif
> -#endif
> -
> -#ifdef CONFIG_CPU_ABRT_EV5TJ
> -# ifdef CPU_DABORT_HANDLER
> -# define MULTI_DABORT 1
> -# else
> -# define CPU_DABORT_HANDLER v5tj_early_abort
> -# endif
> -#endif
> -
> -#ifdef CONFIG_CPU_ABRT_EV5T
> -# ifdef CPU_DABORT_HANDLER
> -# define MULTI_DABORT 1
> -# else
> -# define CPU_DABORT_HANDLER v5t_early_abort
> -# endif
> -#endif
> -
> -#ifdef CONFIG_CPU_ABRT_EV6
> -# ifdef CPU_DABORT_HANDLER
> -# define MULTI_DABORT 1
> -# else
> -# define CPU_DABORT_HANDLER v6_early_abort
> -# endif
> -#endif
> -
> -#ifdef CONFIG_CPU_ABRT_EV7
> -# ifdef CPU_DABORT_HANDLER
> -# define MULTI_DABORT 1
> -# else
> -# define CPU_DABORT_HANDLER v7_early_abort
> -# endif
> -#endif
> -
> -#ifndef CPU_DABORT_HANDLER
> -#error Unknown data abort handler type
> -#endif
> -
> -/*
> - * Prefetch Abort Model
> - * ================
> - *
> - * We have the following to choose from:
> - * legacy - no IFSR, no IFAR
> - * v6 - ARMv6: IFSR, no IFAR
> - * v7 - ARMv7: IFSR and IFAR
> - */
> -
> -#undef CPU_PABORT_HANDLER
> -#undef MULTI_PABORT
> -
> -#ifdef CONFIG_CPU_PABRT_LEGACY
> -# ifdef CPU_PABORT_HANDLER
> -# define MULTI_PABORT 1
> -# else
> -# define CPU_PABORT_HANDLER legacy_pabort
> -# endif
> -#endif
> -
> -#ifdef CONFIG_CPU_PABRT_V6
> -# ifdef CPU_PABORT_HANDLER
> -# define MULTI_PABORT 1
> -# else
> -# define CPU_PABORT_HANDLER v6_pabort
> -# endif
> -#endif
> -
> -#ifdef CONFIG_CPU_PABRT_V7
> -# ifdef CPU_PABORT_HANDLER
> -# define MULTI_PABORT 1
> -# else
> -# define CPU_PABORT_HANDLER v7_pabort
> -# endif
> -#endif
> -
> -#ifndef CPU_PABORT_HANDLER
> -#error Unknown prefetch abort handler type
> -#endif
> -
> #endif
> diff --git a/arch/arm/include/asm/proc-fns.h b/arch/arm/include/asm/proc-fns.h
> index 8fdae9b..6980215 100644
> --- a/arch/arm/include/asm/proc-fns.h
> +++ b/arch/arm/include/asm/proc-fns.h
> @@ -13,248 +13,77 @@
>
> #ifdef __KERNEL__
>
> +#include <asm/glue-proc.h>
> +#include <asm/page.h>
>
> -/*
> - * Work out if we need multiple CPU support
> - */
> -#undef MULTI_CPU
> -#undef CPU_NAME
> +#ifndef __ASSEMBLY__
> +
> +struct mm_struct;
>
> /*
> - * CPU_NAME - the prefix for CPU related functions
> + * Don't change this structure - ASM code relies on it.
> */
> -
> -#ifdef CONFIG_CPU_ARM610
> -# ifdef CPU_NAME
> -# undef MULTI_CPU
> -# define MULTI_CPU
> -# else
> -# define CPU_NAME cpu_arm6
> -# endif
> -#endif
> -
> -#ifdef CONFIG_CPU_ARM7TDMI
> -# ifdef CPU_NAME
> -# undef MULTI_CPU
> -# define MULTI_CPU
> -# else
> -# define CPU_NAME cpu_arm7tdmi
> -# endif
> -#endif
> -
> -#ifdef CONFIG_CPU_ARM710
> -# ifdef CPU_NAME
> -# undef MULTI_CPU
> -# define MULTI_CPU
> -# else
> -# define CPU_NAME cpu_arm7
> -# endif
> -#endif
> -
> -#ifdef CONFIG_CPU_ARM720T
> -# ifdef CPU_NAME
> -# undef MULTI_CPU
> -# define MULTI_CPU
> -# else
> -# define CPU_NAME cpu_arm720
> -# endif
> -#endif
> -
> -#ifdef CONFIG_CPU_ARM740T
> -# ifdef CPU_NAME
> -# undef MULTI_CPU
> -# define MULTI_CPU
> -# else
> -# define CPU_NAME cpu_arm740
> -# endif
> -#endif
> -
> -#ifdef CONFIG_CPU_ARM9TDMI
> -# ifdef CPU_NAME
> -# undef MULTI_CPU
> -# define MULTI_CPU
> -# else
> -# define CPU_NAME cpu_arm9tdmi
> -# endif
> -#endif
> -
> -#ifdef CONFIG_CPU_ARM920T
> -# ifdef CPU_NAME
> -# undef MULTI_CPU
> -# define MULTI_CPU
> -# else
> -# define CPU_NAME cpu_arm920
> -# endif
> -#endif
> -
> -#ifdef CONFIG_CPU_ARM922T
> -# ifdef CPU_NAME
> -# undef MULTI_CPU
> -# define MULTI_CPU
> -# else
> -# define CPU_NAME cpu_arm922
> -# endif
> -#endif
> -
> -#ifdef CONFIG_CPU_FA526
> -# ifdef CPU_NAME
> -# undef MULTI_CPU
> -# define MULTI_CPU
> -# else
> -# define CPU_NAME cpu_fa526
> -# endif
> -#endif
> -
> -#ifdef CONFIG_CPU_ARM925T
> -# ifdef CPU_NAME
> -# undef MULTI_CPU
> -# define MULTI_CPU
> -# else
> -# define CPU_NAME cpu_arm925
> -# endif
> -#endif
> -
> -#ifdef CONFIG_CPU_ARM926T
> -# ifdef CPU_NAME
> -# undef MULTI_CPU
> -# define MULTI_CPU
> -# else
> -# define CPU_NAME cpu_arm926
> -# endif
> -#endif
> -
> -#ifdef CONFIG_CPU_ARM940T
> -# ifdef CPU_NAME
> -# undef MULTI_CPU
> -# define MULTI_CPU
> -# else
> -# define CPU_NAME cpu_arm940
> -# endif
> -#endif
> -
> -#ifdef CONFIG_CPU_ARM946E
> -# ifdef CPU_NAME
> -# undef MULTI_CPU
> -# define MULTI_CPU
> -# else
> -# define CPU_NAME cpu_arm946
> -# endif
> -#endif
> -
> -#ifdef CONFIG_CPU_SA110
> -# ifdef CPU_NAME
> -# undef MULTI_CPU
> -# define MULTI_CPU
> -# else
> -# define CPU_NAME cpu_sa110
> -# endif
> -#endif
> -
> -#ifdef CONFIG_CPU_SA1100
> -# ifdef CPU_NAME
> -# undef MULTI_CPU
> -# define MULTI_CPU
> -# else
> -# define CPU_NAME cpu_sa1100
> -# endif
> -#endif
> -
> -#ifdef CONFIG_CPU_ARM1020
> -# ifdef CPU_NAME
> -# undef MULTI_CPU
> -# define MULTI_CPU
> -# else
> -# define CPU_NAME cpu_arm1020
> -# endif
> -#endif
> -
> -#ifdef CONFIG_CPU_ARM1020E
> -# ifdef CPU_NAME
> -# undef MULTI_CPU
> -# define MULTI_CPU
> -# else
> -# define CPU_NAME cpu_arm1020e
> -# endif
> -#endif
> -
> -#ifdef CONFIG_CPU_ARM1022
> -# ifdef CPU_NAME
> -# undef MULTI_CPU
> -# define MULTI_CPU
> -# else
> -# define CPU_NAME cpu_arm1022
> -# endif
> -#endif
> -
> -#ifdef CONFIG_CPU_ARM1026
> -# ifdef CPU_NAME
> -# undef MULTI_CPU
> -# define MULTI_CPU
> -# else
> -# define CPU_NAME cpu_arm1026
> -# endif
> -#endif
> -
> -#ifdef CONFIG_CPU_XSCALE
> -# ifdef CPU_NAME
> -# undef MULTI_CPU
> -# define MULTI_CPU
> -# else
> -# define CPU_NAME cpu_xscale
> -# endif
> -#endif
> -
> -#ifdef CONFIG_CPU_XSC3
> -# ifdef CPU_NAME
> -# undef MULTI_CPU
> -# define MULTI_CPU
> -# else
> -# define CPU_NAME cpu_xsc3
> -# endif
> -#endif
> -
> -#ifdef CONFIG_CPU_MOHAWK
> -# ifdef CPU_NAME
> -# undef MULTI_CPU
> -# define MULTI_CPU
> -# else
> -# define CPU_NAME cpu_mohawk
> -# endif
> -#endif
> -
> -#ifdef CONFIG_CPU_FEROCEON
> -# ifdef CPU_NAME
> -# undef MULTI_CPU
> -# define MULTI_CPU
> -# else
> -# define CPU_NAME cpu_feroceon
> -# endif
> -#endif
> -
> -#ifdef CONFIG_CPU_V6
> -# ifdef CPU_NAME
> -# undef MULTI_CPU
> -# define MULTI_CPU
> -# else
> -# define CPU_NAME cpu_v6
> -# endif
> -#endif
> -
> -#ifdef CONFIG_CPU_V7
> -# ifdef CPU_NAME
> -# undef MULTI_CPU
> -# define MULTI_CPU
> -# else
> -# define CPU_NAME cpu_v7
> -# endif
> -#endif
> -
> -#ifndef __ASSEMBLY__
> +extern struct processor {
> + /* MISC
> + * get data abort address/flags
> + */
> + void (*_data_abort)(unsigned long pc);
> + /*
> + * Retrieve prefetch fault address
> + */
> + unsigned long (*_prefetch_abort)(unsigned long lr);
> + /*
> + * Set up any processor specifics
> + */
> + void (*_proc_init)(void);
> + /*
> + * Disable any processor specifics
> + */
> + void (*_proc_fin)(void);
> + /*
> + * Special stuff for a reset
> + */
> + void (*reset)(unsigned long addr) __attribute__((noreturn));
> + /*
> + * Idle the processor
> + */
> + int (*_do_idle)(void);
> + /*
> + * Processor architecture specific
> + */
> + /*
> + * clean a virtual address range from the
> + * D-cache without flushing the cache.
> + */
> + void (*dcache_clean_area)(void *addr, int size);
> +
> + /*
> + * Set the page table
> + */
> + void (*switch_mm)(unsigned long pgd_phys, struct mm_struct *mm);
> + /*
> + * Set a possibly extended PTE. Non-extended PTEs should
> + * ignore 'ext'.
> + */
> + void (*set_pte_ext)(pte_t *ptep, pte_t pte, unsigned int ext);
> +} processor;
>
> #ifndef MULTI_CPU
> -#include <asm/cpu-single.h>
> +extern void cpu_proc_init(void);
> +extern void cpu_proc_fin(void);
> +extern int cpu_do_idle(void);
> +extern void cpu_dcache_clean_area(void *, int);
> +extern void cpu_do_switch_mm(unsigned long pgd_phys, struct mm_struct *mm);
> +extern void cpu_set_pte_ext(pte_t *ptep, pte_t pte, unsigned int ext);
> +extern void cpu_reset(unsigned long addr) __attribute__((noreturn));
> #else
> -#include <asm/cpu-multi32.h>
> +#define cpu_proc_init() processor._proc_init()
> +#define cpu_proc_fin() processor._proc_fin()
> +#define cpu_reset(addr) processor.reset(addr)
> +#define cpu_do_idle() processor._do_idle()
> +#define cpu_dcache_clean_area(addr,sz) processor.dcache_clean_area(addr,sz)
> +#define cpu_set_pte_ext(ptep,pte,ext) processor.set_pte_ext(ptep,pte,ext)
> +#define cpu_do_switch_mm(pgd,mm) processor.switch_mm(pgd,mm)
> #endif
>
> #include <asm/memory.h>
> diff --git a/arch/arm/kernel/asm-offsets.c b/arch/arm/kernel/asm-offsets.c
> index 82da661..5302a91 100644
> --- a/arch/arm/kernel/asm-offsets.c
> +++ b/arch/arm/kernel/asm-offsets.c
> @@ -13,6 +13,8 @@
> #include <linux/sched.h>
> #include <linux/mm.h>
> #include <linux/dma-mapping.h>
> +#include <asm/glue-df.h>
> +#include <asm/glue-pf.h>
> #include <asm/mach/arch.h>
> #include <asm/thread_info.h>
> #include <asm/memory.h>
> diff --git a/arch/arm/kernel/entry-armv.S b/arch/arm/kernel/entry-armv.S
> index 2b46fea..e8d8856 100644
> --- a/arch/arm/kernel/entry-armv.S
> +++ b/arch/arm/kernel/entry-armv.S
> @@ -16,7 +16,8 @@
> */
>
> #include <asm/memory.h>
> -#include <asm/glue.h>
> +#include <asm/glue-df.h>
> +#include <asm/glue-pf.h>
> #include <asm/vfpmacros.h>
> #include <mach/entry-macro.S>
> #include <asm/thread_notify.h>
> --
> 1.6.2.5
Acked-by: Colin Cross <ccross at android.com>
Tested on Tegra 2.
More information about the linux-arm-kernel
mailing list