diff options
Diffstat (limited to 'arch/m32r')
-rw-r--r-- | arch/m32r/boot/setup.S | 15 | ||||
-rw-r--r-- | arch/m32r/mm/cache.c | 28 |
2 files changed, 33 insertions, 10 deletions
diff --git a/arch/m32r/boot/setup.S b/arch/m32r/boot/setup.S index 742669fab8a9..398542507d84 100644 --- a/arch/m32r/boot/setup.S +++ b/arch/m32r/boot/setup.S | |||
@@ -1,11 +1,10 @@ | |||
1 | /* | 1 | /* |
2 | * linux/arch/m32r/boot/setup.S -- A setup code. | 2 | * linux/arch/m32r/boot/setup.S -- A setup code. |
3 | * | 3 | * |
4 | * Copyright (C) 2001, 2002 Hiroyuki Kondo, Hirokazu Takata, | 4 | * Copyright (C) 2001-2005 Hiroyuki Kondo, Hirokazu Takata, |
5 | * and Hitoshi Yamamoto | 5 | * Hitoshi Yamamoto, Hayato Fujiwara |
6 | * | 6 | * |
7 | */ | 7 | */ |
8 | /* $Id$ */ | ||
9 | 8 | ||
10 | #include <linux/linkage.h> | 9 | #include <linux/linkage.h> |
11 | #include <asm/segment.h> | 10 | #include <asm/segment.h> |
@@ -81,6 +80,16 @@ ENTRY(boot) | |||
81 | ; ldi r1, #0x00 ; cache off | 80 | ; ldi r1, #0x00 ; cache off |
82 | st r1, @r0 | 81 | st r1, @r0 |
83 | #elif defined(CONFIG_CHIP_M32104) | 82 | #elif defined(CONFIG_CHIP_M32104) |
83 | ldi r0, #-96 ; DNCR0 | ||
84 | seth r1, #0x0060 ; from 0x00600000 | ||
85 | or3 r1, r1, #0x0005 ; size 2MB | ||
86 | st r1, @r0 | ||
87 | seth r1, #0x0100 ; from 0x01000000 | ||
88 | or3 r1, r1, #0x0003 ; size 16MB | ||
89 | st r1, @+r0 | ||
90 | seth r1, #0x0200 ; from 0x02000000 | ||
91 | or3 r1, r1, #0x0002 ; size 32MB | ||
92 | st r1, @+r0 | ||
84 | ldi r0, #-4 ;LDIMM (r0, M32R_MCCR) | 93 | ldi r0, #-4 ;LDIMM (r0, M32R_MCCR) |
85 | ldi r1, #0x703 ; cache on (with invalidation) | 94 | ldi r1, #0x703 ; cache on (with invalidation) |
86 | st r1, @r0 | 95 | st r1, @r0 |
diff --git a/arch/m32r/mm/cache.c b/arch/m32r/mm/cache.c index c6f72a64ae12..9f54dd937013 100644 --- a/arch/m32r/mm/cache.c +++ b/arch/m32r/mm/cache.c | |||
@@ -1,7 +1,7 @@ | |||
1 | /* | 1 | /* |
2 | * linux/arch/m32r/mm/cache.c | 2 | * linux/arch/m32r/mm/cache.c |
3 | * | 3 | * |
4 | * Copyright (C) 2002 Hirokazu Takata | 4 | * Copyright (C) 2002-2005 Hirokazu Takata, Hayato Fujiwara |
5 | */ | 5 | */ |
6 | 6 | ||
7 | #include <linux/config.h> | 7 | #include <linux/config.h> |
@@ -9,7 +9,8 @@ | |||
9 | 9 | ||
10 | #undef MCCR | 10 | #undef MCCR |
11 | 11 | ||
12 | #if defined(CONFIG_CHIP_XNUX2) || defined(CONFIG_CHIP_M32700) || defined(CONFIG_CHIP_VDEC2) || defined(CONFIG_CHIP_OPSP) | 12 | #if defined(CONFIG_CHIP_XNUX2) || defined(CONFIG_CHIP_M32700) \ |
13 | || defined(CONFIG_CHIP_VDEC2) || defined(CONFIG_CHIP_OPSP) | ||
13 | /* Cache Control Register */ | 14 | /* Cache Control Register */ |
14 | #define MCCR ((volatile unsigned long*)0xfffffffc) | 15 | #define MCCR ((volatile unsigned long*)0xfffffffc) |
15 | #define MCCR_CC (1UL << 7) /* Cache mode modify bit */ | 16 | #define MCCR_CC (1UL << 7) /* Cache mode modify bit */ |
@@ -27,7 +28,7 @@ | |||
27 | #define MCCR_IIV (1UL << 0) /* I-cache invalidate */ | 28 | #define MCCR_IIV (1UL << 0) /* I-cache invalidate */ |
28 | #define MCCR_ICACHE_INV MCCR_IIV | 29 | #define MCCR_ICACHE_INV MCCR_IIV |
29 | #elif defined(CONFIG_CHIP_M32104) | 30 | #elif defined(CONFIG_CHIP_M32104) |
30 | #define MCCR ((volatile unsigned long*)0xfffffffc) | 31 | #define MCCR ((volatile unsigned short*)0xfffffffe) |
31 | #define MCCR_IIV (1UL << 8) /* I-cache invalidate */ | 32 | #define MCCR_IIV (1UL << 8) /* I-cache invalidate */ |
32 | #define MCCR_DIV (1UL << 9) /* D-cache invalidate */ | 33 | #define MCCR_DIV (1UL << 9) /* D-cache invalidate */ |
33 | #define MCCR_DCB (1UL << 10) /* D-cache copy back */ | 34 | #define MCCR_DCB (1UL << 10) /* D-cache copy back */ |
@@ -36,7 +37,7 @@ | |||
36 | #define MCCR_ICACHE_INV MCCR_IIV | 37 | #define MCCR_ICACHE_INV MCCR_IIV |
37 | #define MCCR_DCACHE_CB MCCR_DCB | 38 | #define MCCR_DCACHE_CB MCCR_DCB |
38 | #define MCCR_DCACHE_CBINV (MCCR_DIV|MCCR_DCB) | 39 | #define MCCR_DCACHE_CBINV (MCCR_DIV|MCCR_DCB) |
39 | #endif /* CONFIG_CHIP_XNUX2 || CONFIG_CHIP_M32700 */ | 40 | #endif |
40 | 41 | ||
41 | #ifndef MCCR | 42 | #ifndef MCCR |
42 | #error Unknown cache type. | 43 | #error Unknown cache type. |
@@ -47,29 +48,42 @@ | |||
47 | void _flush_cache_all(void) | 48 | void _flush_cache_all(void) |
48 | { | 49 | { |
49 | #if defined(CONFIG_CHIP_M32102) | 50 | #if defined(CONFIG_CHIP_M32102) |
51 | unsigned char mccr; | ||
50 | *MCCR = MCCR_ICACHE_INV; | 52 | *MCCR = MCCR_ICACHE_INV; |
53 | #elif defined(CONFIG_CHIP_M32104) | ||
54 | unsigned short mccr; | ||
55 | |||
56 | /* Copyback and invalidate D-cache */ | ||
57 | /* Invalidate I-cache */ | ||
58 | *MCCR |= (MCCR_ICACHE_INV | MCCR_DCACHE_CBINV); | ||
51 | #else | 59 | #else |
52 | unsigned long mccr; | 60 | unsigned long mccr; |
53 | 61 | ||
54 | /* Copyback and invalidate D-cache */ | 62 | /* Copyback and invalidate D-cache */ |
55 | /* Invalidate I-cache */ | 63 | /* Invalidate I-cache */ |
56 | *MCCR = MCCR_ICACHE_INV | MCCR_DCACHE_CBINV; | 64 | *MCCR = MCCR_ICACHE_INV | MCCR_DCACHE_CBINV; |
57 | while ((mccr = *MCCR) & MCCR_IIV); /* loop while invalidating... */ | ||
58 | #endif | 65 | #endif |
66 | while ((mccr = *MCCR) & MCCR_IIV); /* loop while invalidating... */ | ||
59 | } | 67 | } |
60 | 68 | ||
61 | /* Copy back D-cache and invalidate I-cache all */ | 69 | /* Copy back D-cache and invalidate I-cache all */ |
62 | void _flush_cache_copyback_all(void) | 70 | void _flush_cache_copyback_all(void) |
63 | { | 71 | { |
64 | #if defined(CONFIG_CHIP_M32102) | 72 | #if defined(CONFIG_CHIP_M32102) |
73 | unsigned char mccr; | ||
65 | *MCCR = MCCR_ICACHE_INV; | 74 | *MCCR = MCCR_ICACHE_INV; |
75 | #elif defined(CONFIG_CHIP_M32104) | ||
76 | unsigned short mccr; | ||
77 | |||
78 | /* Copyback and invalidate D-cache */ | ||
79 | /* Invalidate I-cache */ | ||
80 | *MCCR |= (MCCR_ICACHE_INV | MCCR_DCACHE_CB); | ||
66 | #else | 81 | #else |
67 | unsigned long mccr; | 82 | unsigned long mccr; |
68 | 83 | ||
69 | /* Copyback D-cache */ | 84 | /* Copyback D-cache */ |
70 | /* Invalidate I-cache */ | 85 | /* Invalidate I-cache */ |
71 | *MCCR = MCCR_ICACHE_INV | MCCR_DCACHE_CB; | 86 | *MCCR = MCCR_ICACHE_INV | MCCR_DCACHE_CB; |
72 | while ((mccr = *MCCR) & MCCR_IIV); /* loop while invalidating... */ | ||
73 | |||
74 | #endif | 87 | #endif |
88 | while ((mccr = *MCCR) & MCCR_IIV); /* loop while invalidating... */ | ||
75 | } | 89 | } |