Starting with UltraSPARC IV CPUs the CPU caches are described with different
OFW properties.
This commit is contained in:
parent
9b824f84d5
commit
c273f8a878
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user