1 /* $NetBSD: sbscd.c,v 1.20 2021/08/07 16:18:59 thorpej Exp $ */ 2 3 /* 4 * Copyright 2000, 2001 5 * Broadcom Corporation. All rights reserved. 6 * 7 * This software is furnished under license and may be used and copied only 8 * in accordance with the following terms and conditions. Subject to these 9 * conditions, you may download, copy, install, use, modify and distribute 10 * modified or unmodified copies of this software in source and/or binary 11 * form. No title or ownership is transferred hereby. 12 * 13 * 1) Any source code used, modified or distributed must reproduce and 14 * retain this copyright notice and list of conditions as they appear in 15 * the source file. 16 * 17 * 2) No right is granted to use any trade name, trademark, or logo of 18 * Broadcom Corporation. The "Broadcom Corporation" name may not be 19 * used to endorse or promote products derived from this software 20 * without the prior written permission of Broadcom Corporation. 21 * 22 * 3) THIS SOFTWARE IS PROVIDED "AS-IS" AND ANY EXPRESS OR IMPLIED 23 * WARRANTIES, INCLUDING BUT NOT LIMITED TO, ANY IMPLIED WARRANTIES OF 24 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR 25 * NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL BROADCOM BE LIABLE 26 * FOR ANY DAMAGES WHATSOEVER, AND IN PARTICULAR, BROADCOM SHALL NOT BE 27 * LIABLE FOR DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 28 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 29 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 30 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 31 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 32 * OR OTHERWISE), EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 33 */ 34 35 #include <sys/cdefs.h> 36 __KERNEL_RCSID(0, "$NetBSD: sbscd.c,v 1.20 2021/08/07 16:18:59 thorpej Exp $"); 37 38 #include <sys/param.h> 39 #include <sys/device.h> 40 #include <sys/systm.h> 41 42 #include <mips/sibyte/include/sb1250_int.h> 43 #include <mips/sibyte/include/sb1250_regs.h> 44 #include <mips/sibyte/include/sb1250_scd.h> 45 #include <mips/sibyte/include/zbbusvar.h> 46 #include <mips/sibyte/dev/sbscdvar.h> 47 48 #include "locators.h" 49 50 static int sbscd_match(device_t, cfdata_t, void *); 51 static void sbscd_attach(device_t, device_t, void *); 52 53 CFATTACH_DECL_NEW(sbscd, 0, 54 sbscd_match, sbscd_attach, NULL, NULL); 55 56 static int sbscd_print(void *, const char *); 57 static const char *sbscd_device_type_name(enum sbscd_device_type type); 58 59 static const struct sbscd_attach_locs sb1250_sbscd_devs[] = { 60 #if 0 61 { A_IMR_CPU0_BASE, 62 { -1, -1 }, 63 SBSCD_DEVTYPE_ICU }, 64 #endif 65 { A_SCD_WDOG_0, 66 { K_INT_WATCHDOG_TIMER_0, -1 }, 67 SBSCD_DEVTYPE_WDOG }, 68 { A_SCD_WDOG_1, 69 { K_INT_WATCHDOG_TIMER_1, -1 }, 70 SBSCD_DEVTYPE_WDOG }, 71 { A_SCD_TIMER_0, 72 { K_INT_TIMER_0, -1 }, 73 SBSCD_DEVTYPE_TIMER }, 74 { A_SCD_TIMER_1, 75 { K_INT_TIMER_1, -1 }, 76 SBSCD_DEVTYPE_TIMER }, 77 { A_SCD_TIMER_2, 78 { K_INT_TIMER_2, -1 }, 79 SBSCD_DEVTYPE_TIMER }, 80 { A_SCD_TIMER_3, 81 { K_INT_TIMER_3, -1 }, 82 SBSCD_DEVTYPE_TIMER }, 83 { A_SCD_JTAG_BASE + 0x1FFA0, /* XXX magic number for jtag addr */ 84 { -1, -1 }, 85 SBSCD_DEVTYPE_JTAGCONS }, 86 /* XXX others */ 87 }; 88 static const int sb1250_sbscd_dev_count = __arraycount(sb1250_sbscd_devs); 89 90 static int 91 sbscd_match(device_t parent, cfdata_t match, void *aux) 92 { 93 struct zbbus_attach_args *zap = aux; 94 95 if (zap->za_locs.za_type != ZBBUS_ENTTYPE_SCD) 96 return (0); 97 98 return 1; 99 } 100 101 static void 102 sbscd_attach(device_t parent, device_t self, void *aux) 103 { 104 struct sbscd_attach_args sa; 105 int i; 106 int locs[SBSCDCF_NLOCS]; 107 108 aprint_normal("\n"); 109 110 for (i = 0; i < sb1250_sbscd_dev_count; i++) { 111 memset(&sa, 0, sizeof sa); 112 sa.sa_locs = sb1250_sbscd_devs[i]; 113 114 locs[SBSCDCF_OFFSET] = sb1250_sbscd_devs[i].sa_offset; 115 locs[SBSCDCF_INTR + 0] = 116 sb1250_sbscd_devs[i].sa_intr[0]; 117 locs[SBSCDCF_INTR + 1] = 118 sb1250_sbscd_devs[i].sa_intr[1]; 119 120 config_found(self, &sa, sbscd_print, 121 CFARGS(.submatch = config_stdsubmatch, 122 .locators = locs)); 123 } 124 return; 125 } 126 127 int 128 sbscd_print(void *aux, const char *pnp) 129 { 130 struct sbscd_attach_args *sap = aux; 131 int i; 132 133 if (pnp) 134 aprint_normal("%s at %s", 135 sbscd_device_type_name(sap->sa_locs.sa_type), pnp); 136 aprint_normal(" offset 0x%lx", sap->sa_locs.sa_offset); 137 for (i = 0; i < 2; i++) { 138 if (sap->sa_locs.sa_intr[i] != -1) 139 aprint_normal("%s%d", i == 0 ? " intr " : ",", 140 sap->sa_locs.sa_intr[i]); 141 } 142 return (UNCONF); 143 } 144 145 static const char * 146 sbscd_device_type_name(enum sbscd_device_type type) 147 { 148 149 switch (type) { 150 case SBSCD_DEVTYPE_ICU: 151 return ("sbicu"); 152 case SBSCD_DEVTYPE_WDOG: 153 return ("sbwdog"); 154 case SBSCD_DEVTYPE_TIMER: 155 return ("sbtimer"); 156 case SBSCD_DEVTYPE_JTAGCONS: 157 return ("sbjcn"); 158 159 } 160 panic("sbscd_device_type_name"); 161 return ("panic"); 162 } 163