diff options
author | Miod Vallat <miod@cvs.openbsd.org> | 2010-01-09 20:33:17 +0000 |
---|---|---|
committer | Miod Vallat <miod@cvs.openbsd.org> | 2010-01-09 20:33:17 +0000 |
commit | 87b483e2a7df54e7ed2f12b9849b2536d55e9082 (patch) | |
tree | d6b24a614c2a0c15bad70eed78b911b2ef109148 /sys/arch/loongson | |
parent | 1c2dbae3782a9af621a9d39b2388249f24e4a16f (diff) |
Define struct cpu_hwinfo, to hold hardware specific information about each
processor (instead of sys_config.cpu[]), and pass it in the attach_args
when attaching cpu devices.
This allows per-cpu information to be gathered late in the bootstrap process,
and not be limited by an arbitrary MAX_CPUS limit; this will suit IP27 and
IP35 systems better.
While there, use this information to make sure delay() uses the speed
information from the cpu it is invoked on.
Diffstat (limited to 'sys/arch/loongson')
-rw-r--r-- | sys/arch/loongson/dev/mainbus.c | 20 | ||||
-rw-r--r-- | sys/arch/loongson/include/autoconf.h | 18 | ||||
-rw-r--r-- | sys/arch/loongson/loongson/machdep.c | 28 |
3 files changed, 26 insertions, 40 deletions
diff --git a/sys/arch/loongson/dev/mainbus.c b/sys/arch/loongson/dev/mainbus.c index be353cda893..8def1cfd57b 100644 --- a/sys/arch/loongson/dev/mainbus.c +++ b/sys/arch/loongson/dev/mainbus.c @@ -1,4 +1,4 @@ -/* $OpenBSD: mainbus.c,v 1.1 2009/12/25 21:11:09 miod Exp $ */ +/* $OpenBSD: mainbus.c,v 1.2 2010/01/09 20:33:16 miod Exp $ */ /* * Copyright (c) 2001-2003 Opsycon AB (www.opsycon.se / www.opsycon.com) @@ -58,18 +58,20 @@ mainbus_match(struct device *parent, void *cfdata, void *aux) void mainbus_attach(struct device *parent, struct device *self, void *aux) { - struct mainbus_attach_args maa; + struct cpu_attach_args caa; printf("\n"); - bzero(&maa, sizeof maa); - maa.maa_name = "cpu"; - config_found(self, &maa, mainbus_print); - maa.maa_name = "clock"; - config_found(self, &maa, mainbus_print); + bzero(&caa, sizeof caa); + caa.caa_maa.maa_name = "cpu"; + caa.caa_hw = &bootcpu_hwinfo; + config_found(self, &caa, mainbus_print); - maa.maa_name = "bonito"; - config_found(self, &maa, mainbus_print); + caa.caa_maa.maa_name = "clock"; + config_found(self, &caa.caa_maa, mainbus_print); + + caa.caa_maa.maa_name = "bonito"; + config_found(self, &caa.caa_maa, mainbus_print); } int diff --git a/sys/arch/loongson/include/autoconf.h b/sys/arch/loongson/include/autoconf.h index 2925043e969..eb471091533 100644 --- a/sys/arch/loongson/include/autoconf.h +++ b/sys/arch/loongson/include/autoconf.h @@ -1,4 +1,4 @@ -/* $OpenBSD: autoconf.h,v 1.1 2009/11/21 18:30:18 miod Exp $ */ +/* $OpenBSD: autoconf.h,v 1.2 2010/01/09 20:33:16 miod Exp $ */ /* * Copyright (c) 2001-2003 Opsycon AB (www.opsycon.se / www.opsycon.com) @@ -38,23 +38,9 @@ /* * Structure holding all misc config information. */ -#define MAX_CPUS 1 - struct sys_rec { int system_type; - struct cpuinfo { - u_int16_t type; - u_int8_t vers_maj; - u_int8_t vers_min; - u_int16_t fptype; - u_int8_t fpvers_maj; - u_int8_t fpvers_min; - u_int32_t clock; - u_int32_t tlbsize; - u_int32_t tlbwired; - } cpu[MAX_CPUS]; - /* Serial console configuration. */ struct mips_bus_space console_io; }; @@ -65,4 +51,6 @@ struct mainbus_attach_args { const char *maa_name; }; +#include <mips64/autoconf.h> + #endif /* _MACHINE_AUTOCONF_H_ */ diff --git a/sys/arch/loongson/loongson/machdep.c b/sys/arch/loongson/loongson/machdep.c index 989a92bb584..5b59fedf80b 100644 --- a/sys/arch/loongson/loongson/machdep.c +++ b/sys/arch/loongson/loongson/machdep.c @@ -1,4 +1,4 @@ -/* $OpenBSD: machdep.c,v 1.1 2009/12/25 22:06:03 miod Exp $ */ +/* $OpenBSD: machdep.c,v 1.2 2010/01/09 20:33:16 miod Exp $ */ /* * Copyright (c) 2009 Miodrag Vallat. @@ -107,6 +107,7 @@ struct user *proc0paddr; int kbd_reset; struct sys_rec sys_config; +struct cpu_hwinfo bootcpu_hwinfo; /* Pointers to the start and end of the symbol table. */ caddr_t ssym; @@ -274,7 +275,7 @@ mips_init(int32_t argc, int32_t argv, int32_t envp, int32_t cv) cpuspeed = atoi(envvar, 10); /* speed in Hz */ if (cpuspeed < 100 * 1000000) cpuspeed = 797000000; /* Reasonable default */ - sys_config.cpu[0].clock = cpuspeed; + bootcpu_hwinfo.clock = cpuspeed; /* * Look at arguments passed to us and compute boothowto. @@ -385,15 +386,11 @@ mips_init(int32_t argc, int32_t argv, int32_t envp, int32_t cv) } } - sys_config.cpu[0].type = (prid >> 8) & 0xff; - sys_config.cpu[0].vers_maj = (prid >> 4) & 0x0f; - sys_config.cpu[0].vers_min = prid & 0x0f; + bootcpu_hwinfo.c0prid = prid; + bootcpu_hwinfo.type = (prid >> 8) & 0xff; /* FPU reports itself as type 5, version 0.1... */ - sys_config.cpu[0].fptype = sys_config.cpu[0].type; - sys_config.cpu[0].fpvers_maj = sys_config.cpu[0].vers_maj; - sys_config.cpu[0].fpvers_min = sys_config.cpu[0].vers_min; - - sys_config.cpu[0].tlbsize = 64; + bootcpu_hwinfo.c1prid = bootcpu_hwinfo.c0prid; + bootcpu_hwinfo.tlbsize = 64; /* * Configure cache. @@ -403,11 +400,10 @@ mips_init(int32_t argc, int32_t argv, int32_t envp, int32_t cv) Loongson2_ConfigCache(); - sys_config.cpu[0].tlbwired = UPAGES / 2; tlb_set_page_mask(TLB_PAGE_MASK); tlb_set_wired(0); - tlb_flush(sys_config.cpu[0].tlbsize); - tlb_set_wired(sys_config.cpu[0].tlbwired); + tlb_flush(bootcpu_hwinfo.tlbsize); + tlb_set_wired(UPAGES / 2); /* * Get a console, very early but after initial mapping setup. @@ -707,7 +703,7 @@ setregs(p, pack, stack, retval) u_long stack; register_t *retval; { - extern struct proc *machFPCurProcPtr; + struct cpu_info *ci = curcpu(); bzero((caddr_t)p->p_md.md_regs, sizeof(struct trap_frame)); p->p_md.md_regs->sp = stack; @@ -718,8 +714,8 @@ setregs(p, pack, stack, retval) p->p_md.md_regs->sr |= idle_mask & SR_INT_MASK; p->p_md.md_regs->ic = (idle_mask << 8) & IC_INT_MASK; p->p_md.md_flags &= ~MDP_FPUSED; - if (machFPCurProcPtr == p) - machFPCurProcPtr = NULL; + if (ci->ci_fpuproc == p) + ci->ci_fpuproc = NULL; p->p_md.md_ss_addr = 0; p->p_md.md_pc_ctrl = 0; p->p_md.md_watch_1 = 0; |