summaryrefslogtreecommitdiffstats
path: root/sys/sparc64
diff options
context:
space:
mode:
authormarius <marius@FreeBSD.org>2010-02-20 23:42:24 +0000
committermarius <marius@FreeBSD.org>2010-02-20 23:42:24 +0000
commit413b4ea947cb4375d4c6c1ede6d1f1ba6188ccfd (patch)
tree3c0a96af65fcbcf18d0b011d872efa074e44c6c8 /sys/sparc64
parent27efbf647d0328612f1c44a888957c1f15f2b67c (diff)
downloadFreeBSD-src-413b4ea947cb4375d4c6c1ede6d1f1ba6188ccfd.zip
FreeBSD-src-413b4ea947cb4375d4c6c1ede6d1f1ba6188ccfd.tar.gz
Starting with UltraSPARC IV CPUs the CPU caches are described with different
OFW properties.
Diffstat (limited to 'sys/sparc64')
-rw-r--r--sys/sparc64/sparc64/cache.c56
1 files changed, 37 insertions, 19 deletions
diff --git a/sys/sparc64/sparc64/cache.c b/sys/sparc64/sparc64/cache.c
index d558bf2..8cb8dee 100644
--- a/sys/sparc64/sparc64/cache.c
+++ b/sys/sparc64/sparc64/cache.c
@@ -43,6 +43,7 @@
*/
/*-
* Copyright (c) 2001 by Thomas Moestl <tmm@FreeBSD.org>.
+ * Copyright (c) 2008, 2010 Marius Strobl <marius@FreeBSD.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -89,32 +90,49 @@ icache_page_inval_t *icache_page_inval;
#define OF_GET(h, n, v) OF_getprop((h), (n), &(v), sizeof(v))
+static u_int cache_new_prop(u_int cpu_impl);
+
+static u_int
+cache_new_prop(u_int cpu_impl)
+{
+
+ switch (cpu_impl) {
+ case CPU_IMPL_ULTRASPARCIV:
+ case CPU_IMPL_ULTRASPARCIVp:
+ return (1);
+ default:
+ return (0);
+ }
+}
+
/*
- * Fill in the cache parameters using the cpu node.
+ * Fill in the cache parameters using the CPU node.
*/
void
cache_init(struct pcpu *pcpu)
{
u_long set;
+ u_int use_new_prop;
- if (OF_GET(pcpu->pc_node, "icache-size",
- pcpu->pc_cache.ic_size) == -1 ||
- OF_GET(pcpu->pc_node, "icache-line-size",
- pcpu->pc_cache.ic_linesize) == -1 ||
- OF_GET(pcpu->pc_node, "icache-associativity",
- pcpu->pc_cache.ic_assoc) == -1 ||
- OF_GET(pcpu->pc_node, "dcache-size",
- pcpu->pc_cache.dc_size) == -1 ||
- OF_GET(pcpu->pc_node, "dcache-line-size",
- pcpu->pc_cache.dc_linesize) == -1 ||
- OF_GET(pcpu->pc_node, "dcache-associativity",
- pcpu->pc_cache.dc_assoc) == -1 ||
- OF_GET(pcpu->pc_node, "ecache-size",
- pcpu->pc_cache.ec_size) == -1 ||
- OF_GET(pcpu->pc_node, "ecache-line-size",
- pcpu->pc_cache.ec_linesize) == -1 ||
- OF_GET(pcpu->pc_node, "ecache-associativity",
- pcpu->pc_cache.ec_assoc) == -1)
+ use_new_prop = cache_new_prop(pcpu->pc_impl);
+ if (OF_GET(pcpu->pc_node, !use_new_prop ? "icache-size" :
+ "l1-icache-size", pcpu->pc_cache.ic_size) == -1 ||
+ OF_GET(pcpu->pc_node, !use_new_prop ? "icache-line-size" :
+ "l1-icache-line-size", pcpu->pc_cache.ic_linesize) == -1 ||
+ OF_GET(pcpu->pc_node, !use_new_prop ? "icache-associativity" :
+ "l1-icache-associativity", pcpu->pc_cache.ic_assoc) == -1 ||
+ OF_GET(pcpu->pc_node, !use_new_prop ? "dcache-size" :
+ "l1-dcache-size", pcpu->pc_cache.dc_size) == -1 ||
+ OF_GET(pcpu->pc_node, !use_new_prop ? "dcache-line-size" :
+ "l1-dcache-line-size", pcpu->pc_cache.dc_linesize) == -1 ||
+ OF_GET(pcpu->pc_node, !use_new_prop ? "dcache-associativity" :
+ "l1-dcache-associativity", pcpu->pc_cache.dc_assoc) == -1 ||
+ OF_GET(pcpu->pc_node, !use_new_prop ? "ecache-size" :
+ "l2-cache-size", pcpu->pc_cache.ec_size) == -1 ||
+ OF_GET(pcpu->pc_node, !use_new_prop ? "ecache-line-size" :
+ "l2-cache-line-size", pcpu->pc_cache.ec_linesize) == -1 ||
+ OF_GET(pcpu->pc_node, !use_new_prop ? "ecache-associativity" :
+ "l2-cache-associativity", pcpu->pc_cache.ec_assoc) == -1)
panic("cache_init: could not retrieve cache parameters");
set = pcpu->pc_cache.ic_size / pcpu->pc_cache.ic_assoc;
OpenPOWER on IntegriCloud