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