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) 2001 by Thomas Moestl <tmm@FreeBSD.org>.
|
||||||
|
* Copyright (c) 2008, 2010 Marius Strobl <marius@FreeBSD.org>
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* 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))
|
#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
|
void
|
||||||
cache_init(struct pcpu *pcpu)
|
cache_init(struct pcpu *pcpu)
|
||||||
{
|
{
|
||||||
u_long set;
|
u_long set;
|
||||||
|
u_int use_new_prop;
|
||||||
|
|
||||||
if (OF_GET(pcpu->pc_node, "icache-size",
|
use_new_prop = cache_new_prop(pcpu->pc_impl);
|
||||||
pcpu->pc_cache.ic_size) == -1 ||
|
if (OF_GET(pcpu->pc_node, !use_new_prop ? "icache-size" :
|
||||||
OF_GET(pcpu->pc_node, "icache-line-size",
|
"l1-icache-size", pcpu->pc_cache.ic_size) == -1 ||
|
||||||
pcpu->pc_cache.ic_linesize) == -1 ||
|
OF_GET(pcpu->pc_node, !use_new_prop ? "icache-line-size" :
|
||||||
OF_GET(pcpu->pc_node, "icache-associativity",
|
"l1-icache-line-size", pcpu->pc_cache.ic_linesize) == -1 ||
|
||||||
pcpu->pc_cache.ic_assoc) == -1 ||
|
OF_GET(pcpu->pc_node, !use_new_prop ? "icache-associativity" :
|
||||||
OF_GET(pcpu->pc_node, "dcache-size",
|
"l1-icache-associativity", pcpu->pc_cache.ic_assoc) == -1 ||
|
||||||
pcpu->pc_cache.dc_size) == -1 ||
|
OF_GET(pcpu->pc_node, !use_new_prop ? "dcache-size" :
|
||||||
OF_GET(pcpu->pc_node, "dcache-line-size",
|
"l1-dcache-size", pcpu->pc_cache.dc_size) == -1 ||
|
||||||
pcpu->pc_cache.dc_linesize) == -1 ||
|
OF_GET(pcpu->pc_node, !use_new_prop ? "dcache-line-size" :
|
||||||
OF_GET(pcpu->pc_node, "dcache-associativity",
|
"l1-dcache-line-size", pcpu->pc_cache.dc_linesize) == -1 ||
|
||||||
pcpu->pc_cache.dc_assoc) == -1 ||
|
OF_GET(pcpu->pc_node, !use_new_prop ? "dcache-associativity" :
|
||||||
OF_GET(pcpu->pc_node, "ecache-size",
|
"l1-dcache-associativity", pcpu->pc_cache.dc_assoc) == -1 ||
|
||||||
pcpu->pc_cache.ec_size) == -1 ||
|
OF_GET(pcpu->pc_node, !use_new_prop ? "ecache-size" :
|
||||||
OF_GET(pcpu->pc_node, "ecache-line-size",
|
"l2-cache-size", pcpu->pc_cache.ec_size) == -1 ||
|
||||||
pcpu->pc_cache.ec_linesize) == -1 ||
|
OF_GET(pcpu->pc_node, !use_new_prop ? "ecache-line-size" :
|
||||||
OF_GET(pcpu->pc_node, "ecache-associativity",
|
"l2-cache-line-size", pcpu->pc_cache.ec_linesize) == -1 ||
|
||||||
pcpu->pc_cache.ec_assoc) == -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");
|
panic("cache_init: could not retrieve cache parameters");
|
||||||
|
|
||||||
set = pcpu->pc_cache.ic_size / pcpu->pc_cache.ic_assoc;
|
set = pcpu->pc_cache.ic_size / pcpu->pc_cache.ic_assoc;
|
||||||
|
Loading…
Reference in New Issue
Block a user