identcpu.c revision 164372
1/*-
2 * Initial implementation:
3 * Copyright (c) 2001 Robert Drehmel
4 * All rights reserved.
5 *
6 * As long as the above copyright statement and this notice remain
7 * unchanged, you can do what ever you want with this file.
8 *
9 * $FreeBSD: head/sys/sparc64/sparc64/identcpu.c 164372 2006-11-18 07:10:52Z kmacy $
10 */
11#include <sys/param.h>
12#include <sys/systm.h>
13#include <sys/kernel.h>
14#include <sys/sysctl.h>
15
16#include <machine/cpufunc.h>
17#include <machine/md_var.h>
18#include <machine/ver.h>
19
20char machine[] = MACHINE;
21SYSCTL_STRING(_hw, HW_MACHINE, machine, CTLFLAG_RD,
22    machine, 0, "Machine class");
23
24static char cpu_model[128];
25SYSCTL_STRING(_hw, HW_MODEL, model, CTLFLAG_RD,
26    cpu_model, 0, "Machine model");
27
28#ifndef SUN4V
29int cpu_impl;
30#endif
31
32void setPQL2(int *const size, int *const ways);
33
34void
35setPQL2(int *const size, int *const ways)
36{
37#ifdef SUN4V
38/* XXX hardcoding is lame */
39	*size = 3*1024;
40	*ways = 12;
41#endif
42	return;
43}
44
45void
46cpu_identify(u_long vers, u_int freq, u_int id)
47{
48	const char *manus;
49	const char *impls;
50
51	switch (VER_MANUF(vers)) {
52	case 0x04:
53		manus = "HAL";
54		break;
55	case 0x13:
56	case 0x17:
57	case 0x22:
58	case 0x3e:
59		manus = "Sun Microsystems";
60		break;
61	default:
62		manus = NULL;
63		break;
64	}
65	switch (VER_IMPL(vers)) {
66	case CPU_IMPL_SPARC64:
67		impls = "SPARC64";
68		break;
69	case CPU_IMPL_ULTRASPARCI:
70		impls = "UltraSparc-I";
71		break;
72	case CPU_IMPL_ULTRASPARCII:
73		impls = "UltraSparc-II";
74		break;
75	case CPU_IMPL_ULTRASPARCIIi:
76		impls = "UltraSparc-IIi";
77		break;
78	case CPU_IMPL_ULTRASPARCIIe:
79		/* V9 Manual says `UltraSparc-e'.  I assume this is wrong. */
80		impls = "UltraSparc-IIe";
81		break;
82	case CPU_IMPL_ULTRASPARCIII:
83		impls = "UltraSparc-III";
84		break;
85	case CPU_IMPL_ULTRASPARCIIIp:
86		impls = "UltraSparc-III+";
87		break;
88	case CPU_IMPL_ULTRASPARCIIIi:
89		impls = "UltraSparc-IIIi";
90		break;
91	default:
92		impls = NULL;
93		break;
94	}
95	if (manus == NULL || impls == NULL) {
96		printf(
97		    "CPU: unknown; please e-mail the following value together\n"
98		    "     with the exact name of your processor to "
99		    "<freebsd-sparc64@FreeBSD.org>.\n"
100		    "     version register: <0x%lx>\n", vers);
101		return;
102	}
103
104	snprintf(cpu_model, sizeof(cpu_model), "%s %s", manus, impls);
105	printf("cpu%d: %s %s Processor (%d.%02d MHz CPU)\n", id, manus, impls,
106	    (freq + 4999) / 1000000, ((freq + 4999) / 10000) % 100);
107	if (bootverbose) {
108		printf("  mask=0x%lx maxtl=%ld maxwin=%ld\n", VER_MASK(vers),
109		    VER_MAXTL(vers), VER_MAXWIN(vers));
110	}
111}
112