diff options
Diffstat (limited to 'sys/arch/hppa64/dev/cpu.c')
-rw-r--r-- | sys/arch/hppa64/dev/cpu.c | 139 |
1 files changed, 139 insertions, 0 deletions
diff --git a/sys/arch/hppa64/dev/cpu.c b/sys/arch/hppa64/dev/cpu.c new file mode 100644 index 00000000000..a4ce15560e2 --- /dev/null +++ b/sys/arch/hppa64/dev/cpu.c @@ -0,0 +1,139 @@ +/* $OpenBSD: cpu.c,v 1.1 2005/04/01 10:40:47 mickey Exp $ */ + +/* + * Copyright (c) 2005 Michael Shalayeff + * All rights reserved. + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER IN + * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT + * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include <sys/param.h> +#include <sys/systm.h> +#include <sys/device.h> +#include <sys/reboot.h> + +#include <machine/pdc.h> +#include <machine/reg.h> +#include <machine/iomod.h> +#include <machine/autoconf.h> + +#include <arch/hppa/dev/cpudevs.h> + +struct cpu_softc { + struct device sc_dev; + + hppa_hpa_t sc_hpa; + void *sc_ih; +}; + +int cpumatch(struct device *, void *, void *); +void cpuattach(struct device *, struct device *, void *); + +struct cfattach cpu_ca = { + sizeof(struct cpu_softc), cpumatch, cpuattach +}; + +struct cfdriver cpu_cd = { + NULL, "cpu", DV_DULL +}; + +int +cpumatch(parent, cfdata, aux) + struct device *parent; + void *cfdata; + void *aux; +{ + struct confargs *ca = aux; + /* struct cfdata *cf = cfdata; */ + + if (strcmp(ca->ca_name, "cpu")) + return 0; + + return 1; +} + +int +cpu_hardclock(void *v) +{ + hardclock(v); + return (1); +} + +void +cpuattach(parent, self, aux) + struct device *parent; + struct device *self; + void *aux; +{ + /* machdep.c */ + extern struct pdc_model pdc_model; + extern struct pdc_cache pdc_cache; + extern u_int cpu_ticksnum, cpu_ticksdenom; + extern u_int fpu_enable; + + /* struct cpu_softc *sc = (struct cpu_softc *)self; */ + /* struct confargs *ca = aux; */ + u_int mhz = 100 * cpu_ticksnum / cpu_ticksdenom; + const char *p; + + printf (": %s ", cpu_typename); + if (pdc_model.hvers) { + static const char lvls[4][4] = { "0", "1", "1.5", "2" }; + + printf("L%s-%c ", lvls[pdc_model.pa_lvl], "AB"[pdc_model.mc]); + } + + printf ("%d", mhz / 100); + if (mhz % 100 > 9) + printf(".%02d", mhz % 100); + printf("MHz"); + + if (fpu_enable) { + extern u_int fpu_version; + u_int32_t ver[2]; + + mtctl(fpu_enable, CR_CCR); + __asm volatile( + "fstds %%fr0,0(%0)\n\t" + "copr,0,0\n\t" + "fstds %%fr0,0(%0)" + :: "r" (&ver) : "memory"); + mtctl(0, CR_CCR); + fpu_version = HPPA_FPUVER(ver[0]); + printf(", FPU %s rev %d", + hppa_mod_info(HPPA_TYPE_FPU, fpu_version >> 5), + fpu_version & 0x1f); + } + + printf("\n%s: ", self->dv_xname); + p = ""; + if (!pdc_cache.dc_conf.cc_sh) { + printf("%uK(%db/l) Icache, ", + pdc_cache.ic_size / 1024, pdc_cache.ic_conf.cc_line * 16); + p = "D"; + } + printf("%uK(%db/l) wr-%s %scoherent %scache, ", + pdc_cache.dc_size / 1024, pdc_cache.dc_conf.cc_line * 16, + pdc_cache.dc_conf.cc_wt? "thru" : "back", + pdc_cache.dc_conf.cc_cst? "" : "in", p); + + p = ""; + if (!pdc_cache.dt_conf.tc_sh) { + printf("%u ITLB, ", pdc_cache.it_size); + p = "D"; + } + printf("%u %scoherent %sTLB\n", + pdc_cache.dt_size, pdc_cache.dt_conf.tc_cst? "" : "in", p); + +/* TODO spin up others */ +} |