Commit f12d0d7c authored by Hyok S. Choi's avatar Hyok S. Choi Committed by Russell King

[ARM] nommu: manage the CP15 things

All the current CP15 access codes in ARM arch can be categorized and
conditioned by the defines as follows:

     Related operation	Safe condition
  a. any CP15 access	!CPU_CP15
  b. alignment trap	CPU_CP15_MMU
  c. D-cache(C-bit)	CPU_CP15
  d. I-cache		CPU_CP15 && !( CPU_ARM610 || CPU_ARM710 ||
				CPU_ARM720 || CPU_ARM740 ||
				CPU_XSCALE || CPU_XSC3 )
  e. alternate vector	CPU_CP15 && !CPU_ARM740
  f. TTB		CPU_CP15_MMU
  g. Domain		CPU_CP15_MMU
  h. FSR/FAR		CPU_CP15_MMU

For example, alternate vector is supported if and only if
"CPU_CP15 && !CPU_ARM740" is satisfied.
Signed-off-by: default avatarHyok S. Choi <hyok.choi@samsung.com>
Signed-off-by: default avatarRussell King <rmk+kernel@arm.linux.org.uk>
parent fefdaa06
...@@ -621,6 +621,7 @@ config LEDS_CPU ...@@ -621,6 +621,7 @@ config LEDS_CPU
config ALIGNMENT_TRAP config ALIGNMENT_TRAP
bool bool
depends on CPU_CP15_MMU
default y if !ARCH_EBSA110 default y if !ARCH_EBSA110
help help
ARM processors can not fetch/store information which is not ARM processors can not fetch/store information which is not
...@@ -852,7 +853,7 @@ source "drivers/base/Kconfig" ...@@ -852,7 +853,7 @@ source "drivers/base/Kconfig"
source "drivers/connector/Kconfig" source "drivers/connector/Kconfig"
if ALIGNMENT_TRAP if ALIGNMENT_TRAP || !CPU_CP15_MMU
source "drivers/mtd/Kconfig" source "drivers/mtd/Kconfig"
endif endif
......
...@@ -25,6 +25,14 @@ config FLASH_SIZE ...@@ -25,6 +25,14 @@ config FLASH_SIZE
hex 'FLASH Size' if SET_MEM_PARAM hex 'FLASH Size' if SET_MEM_PARAM
default 0x00400000 default 0x00400000
config PROCESSOR_ID
hex
default 0x00007700
depends on !CPU_CP15
help
If processor has no CP15 register, this processor ID is
used instead of the auto-probing which utilizes the register.
config REMAP_VECTORS_TO_RAM config REMAP_VECTORS_TO_RAM
bool 'Install vectors to the begining of RAM' if DRAM_BASE bool 'Install vectors to the begining of RAM' if DRAM_BASE
depends on DRAM_BASE depends on DRAM_BASE
......
...@@ -51,7 +51,11 @@ OBJS += head-at91rm9200.o ...@@ -51,7 +51,11 @@ OBJS += head-at91rm9200.o
endif endif
ifeq ($(CONFIG_CPU_BIG_ENDIAN),y) ifeq ($(CONFIG_CPU_BIG_ENDIAN),y)
ifeq ($(CONFIG_CPU_CP15),y)
OBJS += big-endian.o OBJS += big-endian.o
else
# The endian should be set by h/w design.
endif
endif endif
# #
......
...@@ -82,9 +82,11 @@ ...@@ -82,9 +82,11 @@
kphex r6, 8 /* processor id */ kphex r6, 8 /* processor id */
kputc #':' kputc #':'
kphex r7, 8 /* architecture id */ kphex r7, 8 /* architecture id */
#ifdef CONFIG_CPU_CP15
kputc #':' kputc #':'
mrc p15, 0, r0, c1, c0 mrc p15, 0, r0, c1, c0
kphex r0, 8 /* control reg */ kphex r0, 8 /* control reg */
#endif
kputc #'\n' kputc #'\n'
kphex r5, 8 /* decompressed kernel start */ kphex r5, 8 /* decompressed kernel start */
kputc #'-' kputc #'-'
...@@ -507,7 +509,11 @@ call_kernel: bl cache_clean_flush ...@@ -507,7 +509,11 @@ call_kernel: bl cache_clean_flush
*/ */
call_cache_fn: adr r12, proc_types call_cache_fn: adr r12, proc_types
#ifdef CONFIG_CPU_CP15
mrc p15, 0, r6, c0, c0 @ get processor ID mrc p15, 0, r6, c0, c0 @ get processor ID
#else
ldr r6, =CONFIG_PROCESSOR_ID
#endif
1: ldr r1, [r12, #0] @ get value 1: ldr r1, [r12, #0] @ get value
ldr r2, [r12, #4] @ get mask ldr r2, [r12, #4] @ get mask
eor r1, r1, r6 @ (real ^ match) eor r1, r1, r6 @ (real ^ match)
......
...@@ -9,7 +9,6 @@ ...@@ -9,7 +9,6 @@
* published by the Free Software Foundation. * published by the Free Software Foundation.
* *
* Common kernel startup code (non-paged MM) * Common kernel startup code (non-paged MM)
* for 32-bit CPUs which has a process ID register(CP15).
* *
*/ */
#include <linux/linkage.h> #include <linux/linkage.h>
...@@ -40,7 +39,11 @@ ...@@ -40,7 +39,11 @@
ENTRY(stext) ENTRY(stext)
msr cpsr_c, #PSR_F_BIT | PSR_I_BIT | SVC_MODE @ ensure svc mode msr cpsr_c, #PSR_F_BIT | PSR_I_BIT | SVC_MODE @ ensure svc mode
@ and irqs disabled @ and irqs disabled
#ifndef CONFIG_CPU_CP15
ldr r9, =CONFIG_PROCESSOR_ID
#else
mrc p15, 0, r9, c0, c0 @ get processor id mrc p15, 0, r9, c0, c0 @ get processor id
#endif
bl __lookup_processor_type @ r5=procinfo r9=cpuid bl __lookup_processor_type @ r5=procinfo r9=cpuid
movs r10, r5 @ invalid processor (r5=0)? movs r10, r5 @ invalid processor (r5=0)?
beq __error_p @ yes, error 'p' beq __error_p @ yes, error 'p'
...@@ -58,6 +61,7 @@ ENTRY(stext) ...@@ -58,6 +61,7 @@ ENTRY(stext)
*/ */
.type __after_proc_init, %function .type __after_proc_init, %function
__after_proc_init: __after_proc_init:
#ifdef CONFIG_CPU_CP15
mrc p15, 0, r0, c1, c0, 0 @ read control reg mrc p15, 0, r0, c1, c0, 0 @ read control reg
#ifdef CONFIG_ALIGNMENT_TRAP #ifdef CONFIG_ALIGNMENT_TRAP
orr r0, r0, #CR_A orr r0, r0, #CR_A
...@@ -74,6 +78,7 @@ __after_proc_init: ...@@ -74,6 +78,7 @@ __after_proc_init:
bic r0, r0, #CR_I bic r0, r0, #CR_I
#endif #endif
mcr p15, 0, r0, c1, c0, 0 @ write control reg mcr p15, 0, r0, c1, c0, 0 @ write control reg
#endif /* CONFIG_CPU_CP15 */
mov pc, r13 @ clear the BSS and jump mov pc, r13 @ clear the BSS and jump
@ to start_kernel @ to start_kernel
......
...@@ -221,16 +221,26 @@ void __show_regs(struct pt_regs *regs) ...@@ -221,16 +221,26 @@ void __show_regs(struct pt_regs *regs)
processor_modes[processor_mode(regs)], processor_modes[processor_mode(regs)],
thumb_mode(regs) ? " (T)" : "", thumb_mode(regs) ? " (T)" : "",
get_fs() == get_ds() ? "kernel" : "user"); get_fs() == get_ds() ? "kernel" : "user");
#if CONFIG_CPU_CP15
{ {
unsigned int ctrl, transbase, dac; unsigned int ctrl;
__asm__ ( __asm__ (
" mrc p15, 0, %0, c1, c0\n" " mrc p15, 0, %0, c1, c0\n"
" mrc p15, 0, %1, c2, c0\n" : "=r" (ctrl));
" mrc p15, 0, %2, c3, c0\n" printk("Control: %04X\n", ctrl);
: "=r" (ctrl), "=r" (transbase), "=r" (dac));
printk("Control: %04X Table: %08X DAC: %08X\n",
ctrl, transbase, dac);
} }
#ifdef CONFIG_CPU_CP15_MMU
{
unsigned int transbase, dac;
__asm__ (
" mrc p15, 0, %0, c2, c0\n"
" mrc p15, 0, %1, c3, c0\n"
: "=r" (transbase), "=r" (dac));
printk("Table: %08X DAC: %08X\n",
transbase, dac);
}
#endif
#endif
} }
void show_regs(struct pt_regs * regs) void show_regs(struct pt_regs * regs)
......
...@@ -445,15 +445,15 @@ config CPU_BIG_ENDIAN ...@@ -445,15 +445,15 @@ config CPU_BIG_ENDIAN
of your chipset/board/processor. of your chipset/board/processor.
config CPU_ICACHE_DISABLE config CPU_ICACHE_DISABLE
bool "Disable I-Cache" bool "Disable I-Cache (I-bit)"
depends on CPU_ARM920T || CPU_ARM922T || CPU_ARM925T || CPU_ARM926T || CPU_ARM1020 || CPU_V6 depends on CPU_CP15 && !(CPU_ARM610 || CPU_ARM710 || CPU_ARM720T || CPU_ARM740T || CPU_XSCALE || CPU_XSC3)
help help
Say Y here to disable the processor instruction cache. Unless Say Y here to disable the processor instruction cache. Unless
you have a reason not to or are unsure, say N. you have a reason not to or are unsure, say N.
config CPU_DCACHE_DISABLE config CPU_DCACHE_DISABLE
bool "Disable D-Cache" bool "Disable D-Cache (C-bit)"
depends on CPU_ARM920T || CPU_ARM922T || CPU_ARM925T || CPU_ARM926T || CPU_ARM1020 || CPU_V6 depends on CPU_CP15
help help
Say Y here to disable the processor data cache. Unless Say Y here to disable the processor data cache. Unless
you have a reason not to or are unsure, say N. you have a reason not to or are unsure, say N.
......
...@@ -29,9 +29,13 @@ ENTRY(v4_flush_user_cache_all) ...@@ -29,9 +29,13 @@ ENTRY(v4_flush_user_cache_all)
* Clean and invalidate the entire cache. * Clean and invalidate the entire cache.
*/ */
ENTRY(v4_flush_kern_cache_all) ENTRY(v4_flush_kern_cache_all)
#ifdef CPU_CP15
mov r0, #0 mov r0, #0
mcr p15, 0, r0, c7, c7, 0 @ flush ID cache mcr p15, 0, r0, c7, c7, 0 @ flush ID cache
mov pc, lr mov pc, lr
#else
/* FALLTHROUGH */
#endif
/* /*
* flush_user_cache_range(start, end, flags) * flush_user_cache_range(start, end, flags)
...@@ -44,9 +48,13 @@ ENTRY(v4_flush_kern_cache_all) ...@@ -44,9 +48,13 @@ ENTRY(v4_flush_kern_cache_all)
* - flags - vma_area_struct flags describing address space * - flags - vma_area_struct flags describing address space
*/ */
ENTRY(v4_flush_user_cache_range) ENTRY(v4_flush_user_cache_range)
#ifdef CPU_CP15
mov ip, #0 mov ip, #0
mcreq p15, 0, ip, c7, c7, 0 @ flush ID cache mcreq p15, 0, ip, c7, c7, 0 @ flush ID cache
mov pc, lr mov pc, lr
#else
/* FALLTHROUGH */
#endif
/* /*
* coherent_kern_range(start, end) * coherent_kern_range(start, end)
...@@ -108,8 +116,10 @@ ENTRY(v4_dma_inv_range) ...@@ -108,8 +116,10 @@ ENTRY(v4_dma_inv_range)
* - end - virtual end address * - end - virtual end address
*/ */
ENTRY(v4_dma_flush_range) ENTRY(v4_dma_flush_range)
#ifdef CPU_CP15
mov r0, #0 mov r0, #0
mcr p15, 0, r0, c7, c7, 0 @ flush ID cache mcr p15, 0, r0, c7, c7, 0 @ flush ID cache
#endif
/* FALLTHROUGH */ /* FALLTHROUGH */
/* /*
......
...@@ -46,6 +46,7 @@ ...@@ -46,6 +46,7 @@
#define CPUID_TCM 2 #define CPUID_TCM 2
#define CPUID_TLBTYPE 3 #define CPUID_TLBTYPE 3
#ifdef CONFIG_CPU_CP15
#define read_cpuid(reg) \ #define read_cpuid(reg) \
({ \ ({ \
unsigned int __val; \ unsigned int __val; \
...@@ -55,6 +56,9 @@ ...@@ -55,6 +56,9 @@
: "cc"); \ : "cc"); \
__val; \ __val; \
}) })
#else
#define read_cpuid(reg) (processor_id)
#endif
/* /*
* This is used to ensure the compiler did actually allocate the register we * This is used to ensure the compiler did actually allocate the register we
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment