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