identcpu.c revision 200891
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
10#include <sys/cdefs.h>
11__FBSDID("$FreeBSD: head/sys/sparc64/sparc64/identcpu.c 200891 2009-12-23 06:52:12Z marcel $");
12
13#include <sys/param.h>
14#include <sys/systm.h>
15#include <sys/kernel.h>
16#include <sys/sysctl.h>
17
18#include <machine/cpufunc.h>
19#include <machine/md_var.h>
20#include <machine/ver.h>
21
22char machine[] = MACHINE;
23SYSCTL_STRING(_hw, HW_MACHINE, machine, CTLFLAG_RD,
24    machine, 0, "Machine class");
25
26static char cpu_model[128];
27SYSCTL_STRING(_hw, HW_MODEL, model, CTLFLAG_RD,
28    cpu_model, 0, "Machine model");
29
30SYSCTL_NODE(_hw, OID_AUTO, freq, CTLFLAG_RD, 0, "");
31
32static u_int cpu_count;
33static u_int cpu_freq;
34SYSCTL_UINT(_hw_freq, OID_AUTO, cpu, CTLFLAG_RD, &cpu_freq, 0,
35    "CPU clock frequency");
36
37int cpu_impl;
38
39void
40cpu_identify(u_long vers, u_int freq, u_int id)
41{
42	const char *manus;
43	const char *impls;
44
45	switch (VER_MANUF(vers)) {
46	case 0x04:
47		manus = "HAL";
48		break;
49	case 0x13:
50	case 0x17:
51	case 0x22:
52	case 0x3e:
53		manus = "Sun Microsystems";
54		break;
55	default:
56		manus = NULL;
57		break;
58	}
59	switch (VER_IMPL(vers)) {
60	case CPU_IMPL_SPARC64:
61		impls = "SPARC64";
62		break;
63	case CPU_IMPL_ULTRASPARCI:
64		impls = "UltraSparc-I";
65		break;
66	case CPU_IMPL_ULTRASPARCII:
67		impls = "UltraSparc-II";
68		break;
69	case CPU_IMPL_ULTRASPARCIIi:
70		impls = "UltraSparc-IIi";
71		break;
72	case CPU_IMPL_ULTRASPARCIIe:
73		/* V9 Manual says `UltraSparc-e'.  I assume this is wrong. */
74		impls = "UltraSparc-IIe";
75		break;
76	case CPU_IMPL_ULTRASPARCIII:
77		impls = "UltraSparc-III";
78		break;
79	case CPU_IMPL_ULTRASPARCIIIp:
80		impls = "UltraSparc-III+";
81		break;
82	case CPU_IMPL_ULTRASPARCIIIi:
83		impls = "UltraSparc-IIIi";
84		break;
85	case CPU_IMPL_ULTRASPARCIV:
86		impls = "UltraSparc-IV";
87		break;
88	case CPU_IMPL_ULTRASPARCIVp:
89		impls = "UltraSparc-IV+";
90		break;
91	case CPU_IMPL_ULTRASPARCIIIip:
92		impls = "UltraSparc-IIIi+";
93		break;
94	default:
95		impls = NULL;
96		break;
97	}
98	if (manus == NULL || impls == NULL) {
99		printf(
100		    "CPU: unknown; please e-mail the following value together\n"
101		    "     with the exact name of your processor to "
102		    "<freebsd-sparc64@FreeBSD.org>.\n"
103		    "     version register: <0x%lx>\n", vers);
104		return;
105	}
106
107	snprintf(cpu_model, sizeof(cpu_model), "%s %s", manus, impls);
108	printf("cpu%d: %s %s Processor (%d.%02d MHz CPU)\n", id, manus, impls,
109	    (freq + 4999) / 1000000, ((freq + 4999) / 10000) % 100);
110	if (bootverbose) {
111		printf("  mask=0x%lx maxtl=%ld maxwin=%ld\n", VER_MASK(vers),
112		    VER_MAXTL(vers), VER_MAXWIN(vers));
113	}
114
115	/*
116	 * Calculate the average CPU frequency.
117	 */
118	freq = (freq + 500000ul) / 1000000ul;
119	cpu_freq = (cpu_freq * cpu_count + freq) / (cpu_count + 1);
120	cpu_count++;
121}
122