diff options
author | David S. Miller <davem@sunset.davemloft.net> | 2005-09-26 03:32:17 -0400 |
---|---|---|
committer | David S. Miller <davem@sunset.davemloft.net> | 2005-09-26 03:32:17 -0400 |
commit | 80dc0d6b44ce0f01df58d8899e46612690ed7d81 (patch) | |
tree | 570b8e834c0fae0793bdf75dd2fd2516b0fabf4f /arch/sparc64/kernel/smp.c | |
parent | 56425306517ef28a9b480161cdb96d182172bc1d (diff) |
[SPARC64]: Probe D/I/E-cache config and use.
At boot time, determine the D-cache, I-cache and E-cache size and
line-size. Use them in cache flushes when appropriate.
This change was motivated by discovering that the D-cache on
UltraSparc-IIIi and later are 64K not 32K, and the flushes done by the
Cheetah error handlers were assuming a 32K size.
There are still some pieces of code that are hard coding things and
will need to be fixed up at some point.
While we're here, fix the D-cache and I-cache parity error handlers
to run with interrupts disabled, and when the trap occurs at trap
level > 1 log the event via a counter displayed in /proc/cpuinfo.
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'arch/sparc64/kernel/smp.c')
-rw-r--r-- | arch/sparc64/kernel/smp.c | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/arch/sparc64/kernel/smp.c b/arch/sparc64/kernel/smp.c index b4fc6a5462b2..590df5a16f5a 100644 --- a/arch/sparc64/kernel/smp.c +++ b/arch/sparc64/kernel/smp.c | |||
@@ -93,6 +93,27 @@ void __init smp_store_cpu_info(int id) | |||
93 | cpu_data(id).pte_cache[1] = NULL; | 93 | cpu_data(id).pte_cache[1] = NULL; |
94 | cpu_data(id).pgd_cache = NULL; | 94 | cpu_data(id).pgd_cache = NULL; |
95 | cpu_data(id).idle_volume = 1; | 95 | cpu_data(id).idle_volume = 1; |
96 | |||
97 | cpu_data(id).dcache_size = prom_getintdefault(cpu_node, "dcache-size", | ||
98 | 16 * 1024); | ||
99 | cpu_data(id).dcache_line_size = | ||
100 | prom_getintdefault(cpu_node, "dcache-line-size", 32); | ||
101 | cpu_data(id).icache_size = prom_getintdefault(cpu_node, "icache-size", | ||
102 | 16 * 1024); | ||
103 | cpu_data(id).icache_line_size = | ||
104 | prom_getintdefault(cpu_node, "icache-line-size", 32); | ||
105 | cpu_data(id).ecache_size = prom_getintdefault(cpu_node, "ecache-size", | ||
106 | 4 * 1024 * 1024); | ||
107 | cpu_data(id).ecache_line_size = | ||
108 | prom_getintdefault(cpu_node, "ecache-line-size", 64); | ||
109 | printk("CPU[%d]: Caches " | ||
110 | "D[sz(%d):line_sz(%d)] " | ||
111 | "I[sz(%d):line_sz(%d)] " | ||
112 | "E[sz(%d):line_sz(%d)]\n", | ||
113 | id, | ||
114 | cpu_data(id).dcache_size, cpu_data(id).dcache_line_size, | ||
115 | cpu_data(id).icache_size, cpu_data(id).icache_line_size, | ||
116 | cpu_data(id).ecache_size, cpu_data(id).ecache_line_size); | ||
96 | } | 117 | } |
97 | 118 | ||
98 | static void smp_setup_percpu_timer(void); | 119 | static void smp_setup_percpu_timer(void); |