#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <ctype.h>
#include <string.h>
#include <kvm.h>
#include <varargs.h>
#include <errno.h>
#include <time.h>
#include <dirent.h>
#include <fcntl.h>
#include <sys/param.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/utsname.h>
#include <sys/openpromio.h>
#include <sys/spitregs.h>
#include <sys/cheetahregs.h>
#include <kstat.h>
#include <libintl.h>
#include <syslog.h>
#include <sys/dkio.h>
#include "pdevinfo.h"
#include "display.h"
#include "pdevinfo_sun4u.h"
#include "display_sun4u.h"
#include "libprtdiag.h"
uint_t
get_cpu_freq(Prom_node *pnode)
{
Prop *prop;
uint_t *value;
if ((prop = find_prop(pnode, "clock-frequency")) == NULL) {
return (0);
}
if ((value = (uint_t *)get_prop_val(prop)) == NULL) {
return (0);
}
return (*value);
}
int
get_ecache_size(Prom_node *node)
{
int *cache_size_p;
if (cache_size_p = (int *)get_prop_val(find_prop(node,
"ecache-size"))) {
return (*cache_size_p);
}
if (cache_size_p = (int *)get_prop_val(find_prop(node,
"l3-cache-size"))) {
return (*cache_size_p);
}
if (cache_size_p = (int *)get_prop_val(find_prop(node,
"l2-cache-size"))) {
return (*cache_size_p);
}
return (0);
}
void
display_cpu_devices(Sys_tree *tree)
{
Board_node *bnode;
log_printf("\n", 0);
log_printf("=========================", 0);
log_printf(" CPUs ", 0);
log_printf("=========================", 0);
log_printf("\n", 0);
log_printf("\n", 0);
log_printf(" Run Ecache "
" CPU CPU\n", 0);
log_printf("Brd CPU Module MHz MB "
"Impl. Mask\n", 0);
log_printf("--- --- ------- ----- ------ "
"------ ----\n", 0);
for (bnode = tree->bd_list; bnode != NULL; bnode = bnode->next)
display_cpus(bnode);
log_printf("\n", 0);
}
void
display_cpus(Board_node *board)
{
Prom_node *cpu;
for (cpu = dev_find_type(board->nodes, "cpu"); cpu != NULL;
cpu = dev_next_type(cpu, "cpu")) {
uint_t freq;
int ecache_size;
int *mid;
int *impl;
int *mask, decoded_mask;
mid = (int *)get_prop_val(find_prop(cpu, "upa-portid"));
if (mid == NULL) {
mid = (int *)get_prop_val(find_prop(cpu, "portid"));
}
freq = (get_cpu_freq(cpu) + 500000) / 1000000;
ecache_size = get_ecache_size(cpu);
impl = (int *)get_prop_val(find_prop(cpu, "implementation#"));
mask = (int *)get_prop_val(find_prop(cpu, "mask#"));
if ((freq != 0) && (node_failed(cpu) == 0)) {
display_boardnum(board->board_num);
log_printf(" %2d ", *mid, 0);
display_mid(*mid);
log_printf(" %3u ", freq, 0);
if (ecache_size == 0)
log_printf(" %3s ", "N/A", 0);
else
log_printf(" %4.1f ",
(float)ecache_size / (float)(1<<20),
0);
if (impl == NULL) {
log_printf("%6s ", "N/A", 0);
} else {
switch (*impl) {
case SPITFIRE_IMPL:
log_printf("%-6s ", "US-I", 0);
break;
case BLACKBIRD_IMPL:
log_printf("%-6s ", "US-II", 0);
break;
case CHEETAH_IMPL:
log_printf("%-6s ", "US-III", 0);
break;
case CHEETAH_PLUS_IMPL:
log_printf("%-7s ", "US-III+", 0);
break;
case JAGUAR_IMPL:
log_printf("%-6s ", "US-IV", 0);
break;
default:
log_printf("%-6x ", *impl, 0);
break;
}
}
if (mask == NULL) {
log_printf(" %3s", "N/A", 0);
} else {
if ((impl) && IS_CHEETAH(*impl))
decoded_mask =
REMAP_CHEETAH_MASK(*mask);
else
decoded_mask = *mask;
log_printf(" %d.%d", (decoded_mask >> 4) & 0xf,
decoded_mask & 0xf, 0);
}
log_printf("\n", 0);
}
}
}
void
display_mid(int mid)
{
log_printf(" %2d ", mid, 0);
}