diff options
author | Kumar Gala <galak@kernel.crashing.org> | 2008-06-16 10:41:32 -0400 |
---|---|---|
committer | Kumar Gala <galak@kernel.crashing.org> | 2008-06-18 17:17:56 -0400 |
commit | 3dfa8773674e16f95f70a0e631e80c69390d04d7 (patch) | |
tree | 95e8989bbc8373e61f69ca2ac4c98ffd3c709bd9 /arch/powerpc | |
parent | bccaea8fe287454d70f5b2546910561e9f884053 (diff) |
powerpc/booke: Add support for new e500mc core
The new e500mc core from Freescale is based on the e500v2 but with the
following changes:
* Supports only the Enhanced Debug Architecture (DSRR0/1, etc)
* Floating Point
* No SPE
* Supports lwsync
* Doorbell Exceptions
* Hypervisor
* Cache line size is now 64-bytes (e500v1/v2 have a 32-byte cache line)
Signed-off-by: Kumar Gala <galak@kernel.crashing.org>
Diffstat (limited to 'arch/powerpc')
-rw-r--r-- | arch/powerpc/kernel/cputable.c | 15 | ||||
-rw-r--r-- | arch/powerpc/kernel/head_booke.h | 6 | ||||
-rw-r--r-- | arch/powerpc/kernel/head_fsl_booke.S | 10 | ||||
-rw-r--r-- | arch/powerpc/platforms/Kconfig.cputype | 7 |
4 files changed, 34 insertions, 4 deletions
diff --git a/arch/powerpc/kernel/cputable.c b/arch/powerpc/kernel/cputable.c index e44d5530f0a6..aa421f5651c8 100644 --- a/arch/powerpc/kernel/cputable.c +++ b/arch/powerpc/kernel/cputable.c | |||
@@ -1522,6 +1522,21 @@ static struct cpu_spec __initdata cpu_specs[] = { | |||
1522 | .machine_check = machine_check_e500, | 1522 | .machine_check = machine_check_e500, |
1523 | .platform = "ppc8548", | 1523 | .platform = "ppc8548", |
1524 | }, | 1524 | }, |
1525 | { /* e500mc */ | ||
1526 | .pvr_mask = 0xffff0000, | ||
1527 | .pvr_value = 0x80230000, | ||
1528 | .cpu_name = "e500mc", | ||
1529 | /* xxx - galak: add CPU_FTR_MAYBE_CAN_DOZE */ | ||
1530 | .cpu_features = CPU_FTRS_E500MC, | ||
1531 | .cpu_user_features = COMMON_USER_BOOKE | PPC_FEATURE_HAS_FPU, | ||
1532 | .icache_bsize = 64, | ||
1533 | .dcache_bsize = 64, | ||
1534 | .num_pmcs = 4, | ||
1535 | .oprofile_cpu_type = "ppc/e500", /* xxx - galak, e500mc? */ | ||
1536 | .oprofile_type = PPC_OPROFILE_FSL_EMB, | ||
1537 | .machine_check = machine_check_e500, | ||
1538 | .platform = "ppce500mc", | ||
1539 | }, | ||
1525 | { /* default match */ | 1540 | { /* default match */ |
1526 | .pvr_mask = 0x00000000, | 1541 | .pvr_mask = 0x00000000, |
1527 | .pvr_value = 0x00000000, | 1542 | .pvr_value = 0x00000000, |
diff --git a/arch/powerpc/kernel/head_booke.h b/arch/powerpc/kernel/head_booke.h index 9501c580ce87..505494f1ee7c 100644 --- a/arch/powerpc/kernel/head_booke.h +++ b/arch/powerpc/kernel/head_booke.h | |||
@@ -68,9 +68,13 @@ | |||
68 | #define MCHECK_STACK_BASE mcheckirq_ctx | 68 | #define MCHECK_STACK_BASE mcheckirq_ctx |
69 | #define CRIT_STACK_BASE critirq_ctx | 69 | #define CRIT_STACK_BASE critirq_ctx |
70 | 70 | ||
71 | /* only on e200 for now */ | 71 | /* only on e500mc/e200 */ |
72 | #define DEBUG_STACK_BASE dbgirq_ctx | 72 | #define DEBUG_STACK_BASE dbgirq_ctx |
73 | #ifdef CONFIG_PPC_E500MC | ||
74 | #define DEBUG_SPRG SPRN_SPRG9 | ||
75 | #else | ||
73 | #define DEBUG_SPRG SPRN_SPRG6W | 76 | #define DEBUG_SPRG SPRN_SPRG6W |
77 | #endif | ||
74 | 78 | ||
75 | #define EXC_LVL_FRAME_OVERHEAD (THREAD_SIZE - INT_FRAME_SIZE - EXC_LVL_SIZE) | 79 | #define EXC_LVL_FRAME_OVERHEAD (THREAD_SIZE - INT_FRAME_SIZE - EXC_LVL_SIZE) |
76 | 80 | ||
diff --git a/arch/powerpc/kernel/head_fsl_booke.S b/arch/powerpc/kernel/head_fsl_booke.S index 503f86030b6e..7c2b65380658 100644 --- a/arch/powerpc/kernel/head_fsl_booke.S +++ b/arch/powerpc/kernel/head_fsl_booke.S | |||
@@ -304,7 +304,7 @@ skpinv: addi r6,r6,1 /* Increment */ | |||
304 | SET_IVOR(13, DataTLBError); | 304 | SET_IVOR(13, DataTLBError); |
305 | SET_IVOR(14, InstructionTLBError); | 305 | SET_IVOR(14, InstructionTLBError); |
306 | SET_IVOR(15, DebugDebug); | 306 | SET_IVOR(15, DebugDebug); |
307 | #if defined(CONFIG_E500) | 307 | #if defined(CONFIG_E500) && !defined(CONFIG_PPC_E500MC) |
308 | SET_IVOR(15, DebugCrit); | 308 | SET_IVOR(15, DebugCrit); |
309 | #endif | 309 | #endif |
310 | SET_IVOR(32, SPEUnavailable); | 310 | SET_IVOR(32, SPEUnavailable); |
@@ -313,6 +313,9 @@ skpinv: addi r6,r6,1 /* Increment */ | |||
313 | #ifndef CONFIG_E200 | 313 | #ifndef CONFIG_E200 |
314 | SET_IVOR(35, PerformanceMonitor); | 314 | SET_IVOR(35, PerformanceMonitor); |
315 | #endif | 315 | #endif |
316 | #ifdef CONFIG_PPC_E500MC | ||
317 | SET_IVOR(36, Doorbell); | ||
318 | #endif | ||
316 | 319 | ||
317 | /* Establish the interrupt vector base */ | 320 | /* Establish the interrupt vector base */ |
318 | lis r4,interrupt_base@h /* IVPR only uses the high 16-bits */ | 321 | lis r4,interrupt_base@h /* IVPR only uses the high 16-bits */ |
@@ -750,10 +753,13 @@ interrupt_base: | |||
750 | /* Performance Monitor */ | 753 | /* Performance Monitor */ |
751 | EXCEPTION(0x2060, PerformanceMonitor, performance_monitor_exception, EXC_XFER_STD) | 754 | EXCEPTION(0x2060, PerformanceMonitor, performance_monitor_exception, EXC_XFER_STD) |
752 | 755 | ||
756 | #ifdef CONFIG_PPC_E500MC | ||
757 | EXCEPTION(0x2070, Doorbell, unknown_exception, EXC_XFER_EE) | ||
758 | #endif | ||
753 | 759 | ||
754 | /* Debug Interrupt */ | 760 | /* Debug Interrupt */ |
755 | DEBUG_DEBUG_EXCEPTION | 761 | DEBUG_DEBUG_EXCEPTION |
756 | #if defined(CONFIG_E500) | 762 | #if defined(CONFIG_E500) && !defined(CONFIG_PPC_E500MC) |
757 | DEBUG_CRIT_EXCEPTION | 763 | DEBUG_CRIT_EXCEPTION |
758 | #endif | 764 | #endif |
759 | 765 | ||
diff --git a/arch/powerpc/platforms/Kconfig.cputype b/arch/powerpc/platforms/Kconfig.cputype index f7efaa925a13..1a1ccfbb9232 100644 --- a/arch/powerpc/platforms/Kconfig.cputype +++ b/arch/powerpc/platforms/Kconfig.cputype | |||
@@ -95,6 +95,11 @@ config E500 | |||
95 | select FSL_EMB_PERFMON | 95 | select FSL_EMB_PERFMON |
96 | bool | 96 | bool |
97 | 97 | ||
98 | config PPC_E500MC | ||
99 | bool "e500mc Support" | ||
100 | select PPC_FPU | ||
101 | depends on E500 | ||
102 | |||
98 | config PPC_FPU | 103 | config PPC_FPU |
99 | bool | 104 | bool |
100 | default y if PPC64 | 105 | default y if PPC64 |
@@ -157,7 +162,7 @@ config ALTIVEC | |||
157 | 162 | ||
158 | config SPE | 163 | config SPE |
159 | bool "SPE Support" | 164 | bool "SPE Support" |
160 | depends on E200 || E500 | 165 | depends on E200 || (E500 && !PPC_E500MC) |
161 | default y | 166 | default y |
162 | ---help--- | 167 | ---help--- |
163 | This option enables kernel support for the Signal Processing | 168 | This option enables kernel support for the Signal Processing |