1*7ed56e8cSmrg /* $NetBSD: systemsw.c,v 1.2 2017/07/24 09:56:45 mrg Exp $ */
2b1431b71Smrg
3b1431b71Smrg /*
4b1431b71Smrg * Copyright 2000, 2001
5b1431b71Smrg * Broadcom Corporation. All rights reserved.
6b1431b71Smrg *
7b1431b71Smrg * This software is furnished under license and may be used and copied only
8b1431b71Smrg * in accordance with the following terms and conditions. Subject to these
9b1431b71Smrg * conditions, you may download, copy, install, use, modify and distribute
10b1431b71Smrg * modified or unmodified copies of this software in source and/or binary
11b1431b71Smrg * form. No title or ownership is transferred hereby.
12b1431b71Smrg *
13b1431b71Smrg * 1) Any source code used, modified or distributed must reproduce and
14b1431b71Smrg * retain this copyright notice and list of conditions as they appear in
15b1431b71Smrg * the source file.
16b1431b71Smrg *
17b1431b71Smrg * 2) No right is granted to use any trade name, trademark, or logo of
18b1431b71Smrg * Broadcom Corporation. The "Broadcom Corporation" name may not be
19b1431b71Smrg * used to endorse or promote products derived from this software
20b1431b71Smrg * without the prior written permission of Broadcom Corporation.
21b1431b71Smrg *
22b1431b71Smrg * 3) THIS SOFTWARE IS PROVIDED "AS-IS" AND ANY EXPRESS OR IMPLIED
23b1431b71Smrg * WARRANTIES, INCLUDING BUT NOT LIMITED TO, ANY IMPLIED WARRANTIES OF
24b1431b71Smrg * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
25b1431b71Smrg * NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL BROADCOM BE LIABLE
26b1431b71Smrg * FOR ANY DAMAGES WHATSOEVER, AND IN PARTICULAR, BROADCOM SHALL NOT BE
27b1431b71Smrg * LIABLE FOR DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
28b1431b71Smrg * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
29b1431b71Smrg * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
30b1431b71Smrg * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
31b1431b71Smrg * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
32b1431b71Smrg * OR OTHERWISE), EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33b1431b71Smrg */
34b1431b71Smrg
35b1431b71Smrg #include <sys/cdefs.h>
36*7ed56e8cSmrg __KERNEL_RCSID(0, "$NetBSD: systemsw.c,v 1.2 2017/07/24 09:56:45 mrg Exp $");
37b1431b71Smrg
38b1431b71Smrg #include <sys/param.h>
39b1431b71Smrg #include <sys/cpu.h>
40b1431b71Smrg #include <sys/intr.h>
41b1431b71Smrg #include <sys/kernel.h>
42b1431b71Smrg #include <sys/systm.h>
43b1431b71Smrg
44b1431b71Smrg #include <mips/locore.h>
45b1431b71Smrg #include <mips/mips3_clock.h>
46b1431b71Smrg
47*7ed56e8cSmrg #include <evbmips/sbmips/systemsw.h>
48b1431b71Smrg
49b1431b71Smrg
50b1431b71Smrg /* trivial functions for function switch */
51b1431b71Smrg static void clock_init_triv(void *);
52b1431b71Smrg static void cpu_intr_triv(int, vaddr_t, uint32_t);
53b1431b71Smrg
54b1431b71Smrg /* system function switch */
55b1431b71Smrg struct systemsw systemsw = {
56b1431b71Smrg cpu_intr_triv,
57b1431b71Smrg
58b1431b71Smrg NULL, /* clock intr arg */
59b1431b71Smrg clock_init_triv,
60b1431b71Smrg
61b1431b71Smrg NULL, /* statclock arg */
62b1431b71Smrg NULL, /* s_statclock_init: dflt no-op */
63b1431b71Smrg NULL, /* s_statclock_setrate: dflt no-op */
64b1431b71Smrg
65b1431b71Smrg NULL, /* intr_establish */
66b1431b71Smrg };
67b1431b71Smrg
68b1431b71Smrg bool
system_set_clockfns(void * arg,void (* init)(void *))69b1431b71Smrg system_set_clockfns(void *arg, void (*init)(void *))
70b1431b71Smrg {
71b1431b71Smrg
72b1431b71Smrg if (systemsw.s_clock_init != clock_init_triv)
73b1431b71Smrg return true;
74b1431b71Smrg systemsw.s_clock_arg = arg;
75b1431b71Smrg systemsw.s_clock_init = init;
76b1431b71Smrg return false;
77b1431b71Smrg }
78b1431b71Smrg
79b1431b71Smrg static void
cpu_intr_triv(int ppl,vaddr_t pc,uint32_t status)80b1431b71Smrg cpu_intr_triv(int ppl, vaddr_t pc, uint32_t status)
81b1431b71Smrg {
82b1431b71Smrg
83b1431b71Smrg panic("cpu_intr_triv");
84b1431b71Smrg }
85b1431b71Smrg
86b1431b71Smrg void
cpu_intr(int ppl,vaddr_t pc,uint32_t status)87b1431b71Smrg cpu_intr(int ppl, vaddr_t pc, uint32_t status)
88b1431b71Smrg {
89b1431b71Smrg
90b1431b71Smrg (*systemsw.s_cpu_intr)(ppl, pc, status);
91b1431b71Smrg }
92b1431b71Smrg
93b1431b71Smrg static void
clock_init_triv(void * arg)94b1431b71Smrg clock_init_triv(void *arg)
95b1431b71Smrg {
96b1431b71Smrg
97b1431b71Smrg panic("clock_init_triv");
98b1431b71Smrg }
99b1431b71Smrg
100b1431b71Smrg void
cpu_initclocks(void)101b1431b71Smrg cpu_initclocks(void)
102b1431b71Smrg {
103b1431b71Smrg
104b1431b71Smrg (*systemsw.s_clock_init)(systemsw.s_clock_arg);
105b1431b71Smrg
106b1431b71Smrg if (systemsw.s_statclock_init != NULL)
107b1431b71Smrg (*systemsw.s_statclock_init)(systemsw.s_statclock_arg);
108b1431b71Smrg
109b1431b71Smrg /*
110b1431b71Smrg * ``Disable'' the compare interrupt by setting it to its largest
111b1431b71Smrg * value. Each hard clock interrupt we'll reset the CP0 compare
112b1431b71Smrg * register to just bind the CP0 clock register.
113b1431b71Smrg */
114b1431b71Smrg mips3_cp0_compare_write(~0u);
115b1431b71Smrg mips3_cp0_count_write(0);
116b1431b71Smrg
117b1431b71Smrg mips3_init_tc();
118b1431b71Smrg
119b1431b71Smrg /*
120b1431b71Smrg * Now we can enable all interrupts including hardclock(9).
121b1431b71Smrg */
122b1431b71Smrg spl0();
123b1431b71Smrg }
124b1431b71Smrg
125b1431b71Smrg void
setstatclockrate(int hzrate)126b1431b71Smrg setstatclockrate(int hzrate)
127b1431b71Smrg {
128b1431b71Smrg
129b1431b71Smrg if (systemsw.s_statclock_setrate != NULL)
130b1431b71Smrg (*systemsw.s_statclock_setrate)(systemsw.s_statclock_arg,
131b1431b71Smrg hzrate);
132b1431b71Smrg }
133