1 1.15 thorpej /* $NetBSD: ug.c,v 1.15 2022/09/25 18:43:32 thorpej Exp $ */ 2 1.1 xtraeme 3 1.1 xtraeme /* 4 1.1 xtraeme * Copyright (c) 2007 Mihai Chelaru <kefren (at) netbsd.ro> 5 1.1 xtraeme * All rights reserved. 6 1.1 xtraeme * 7 1.1 xtraeme * Redistribution and use in source and binary forms, with or without 8 1.1 xtraeme * modification, are permitted provided that the following conditions 9 1.1 xtraeme * are met: 10 1.1 xtraeme * 1. Redistributions of source code must retain the above copyright 11 1.1 xtraeme * notice, this list of conditions and the following disclaimer. 12 1.1 xtraeme * 2. Redistributions in binary form must reproduce the above copyright 13 1.1 xtraeme * notice, this list of conditions and the following disclaimer in the 14 1.1 xtraeme * documentation and/or other materials provided with the distribution. 15 1.1 xtraeme * 16 1.1 xtraeme * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 17 1.1 xtraeme * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 18 1.1 xtraeme * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 19 1.1 xtraeme * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 20 1.1 xtraeme * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 21 1.1 xtraeme * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 22 1.1 xtraeme * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 23 1.1 xtraeme * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 24 1.1 xtraeme * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 25 1.1 xtraeme * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26 1.1 xtraeme */ 27 1.1 xtraeme 28 1.1 xtraeme #include <sys/cdefs.h> 29 1.15 thorpej __KERNEL_RCSID(0, "$NetBSD: ug.c,v 1.15 2022/09/25 18:43:32 thorpej Exp $"); 30 1.1 xtraeme 31 1.1 xtraeme #include <sys/param.h> 32 1.1 xtraeme #include <sys/systm.h> 33 1.1 xtraeme #include <sys/kernel.h> 34 1.1 xtraeme #include <sys/proc.h> 35 1.1 xtraeme #include <sys/device.h> 36 1.1 xtraeme #include <sys/errno.h> 37 1.1 xtraeme #include <sys/conf.h> 38 1.1 xtraeme #include <sys/envsys.h> 39 1.1 xtraeme #include <sys/time.h> 40 1.1 xtraeme 41 1.8 ad #include <sys/bus.h> 42 1.8 ad #include <sys/intr.h> 43 1.1 xtraeme 44 1.1 xtraeme #include <dev/isa/isareg.h> 45 1.1 xtraeme #include <dev/isa/isavar.h> 46 1.1 xtraeme 47 1.1 xtraeme #include <dev/sysmon/sysmonvar.h> 48 1.1 xtraeme 49 1.1 xtraeme #include <dev/ic/ugreg.h> 50 1.1 xtraeme #include <dev/ic/ugvar.h> 51 1.1 xtraeme 52 1.1 xtraeme uint8_t ug_ver; 53 1.1 xtraeme 54 1.1 xtraeme /* 55 1.1 xtraeme * Imported from linux driver 56 1.1 xtraeme */ 57 1.1 xtraeme 58 1.13 maxv static const struct ug2_motherboard_info ug2_mb[] = { 59 1.1 xtraeme { 0x000C, "unknown. Please send-pr(1)", { 60 1.1 xtraeme { "CPU Core", 0, 0, 10, 1, 0 }, 61 1.1 xtraeme { "DDR", 1, 0, 10, 1, 0 }, 62 1.1 xtraeme { "DDR VTT", 2, 0, 10, 1, 0 }, 63 1.1 xtraeme { "CPU VTT 1.2V", 3, 0, 10, 1, 0 }, 64 1.1 xtraeme { "MCH & PCIE 1.5V", 4, 0, 10, 1, 0 }, 65 1.1 xtraeme { "MCH 2.5V", 5, 0, 20, 1, 0 }, 66 1.1 xtraeme { "ICH 1.05V", 6, 0, 10, 1, 0 }, 67 1.1 xtraeme { "ATX +12V (24-Pin)", 7, 0, 60, 1, 0 }, 68 1.1 xtraeme { "ATX +12V (4-pin)", 8, 0, 60, 1, 0 }, 69 1.1 xtraeme { "ATX +5V", 9, 0, 30, 1, 0 }, 70 1.1 xtraeme { "+3.3V", 10, 0, 20, 1, 0 }, 71 1.1 xtraeme { "5VSB", 11, 0, 30, 1, 0 }, 72 1.1 xtraeme { "CPU", 24, 1, 1, 1, 0 }, 73 1.1 xtraeme { "System", 25, 1, 1, 1, 0 }, 74 1.1 xtraeme { "PWM", 26, 1, 1, 1, 0 }, 75 1.1 xtraeme { "CPU Fan", 32, 2, 60, 1, 0 }, 76 1.1 xtraeme { "NB Fan", 33, 2, 60, 1, 0 }, 77 1.1 xtraeme { "SYS FAN", 34, 2, 60, 1, 0 }, 78 1.1 xtraeme { "AUX1 Fan", 35, 2, 60, 1, 0 }, 79 1.1 xtraeme { NULL, 0, 0, 0, 0, 0 } } 80 1.1 xtraeme }, 81 1.1 xtraeme { 0x000D, "Abit AW8", { 82 1.1 xtraeme { "CPU Core", 0, 0, 10, 1, 0 }, 83 1.1 xtraeme { "DDR", 1, 0, 10, 1, 0 }, 84 1.1 xtraeme { "DDR VTT", 2, 0, 10, 1, 0 }, 85 1.1 xtraeme { "CPU VTT 1.2V", 3, 0, 10, 1, 0 }, 86 1.1 xtraeme { "MCH & PCIE 1.5V", 4, 0, 10, 1, 0 }, 87 1.1 xtraeme { "MCH 2.5V", 5, 0, 20, 1, 0 }, 88 1.1 xtraeme { "ICH 1.05V", 6, 0, 10, 1, 0 }, 89 1.1 xtraeme { "ATX +12V (24-Pin)", 7, 0, 60, 1, 0 }, 90 1.1 xtraeme { "ATX +12V (4-pin)", 8, 0, 60, 1, 0 }, 91 1.1 xtraeme { "ATX +5V", 9, 0, 30, 1, 0 }, 92 1.1 xtraeme { "+3.3V", 10, 0, 20, 1, 0 }, 93 1.1 xtraeme { "5VSB", 11, 0, 30, 1, 0 }, 94 1.1 xtraeme { "CPU", 24, 1, 1, 1, 0 }, 95 1.1 xtraeme { "System", 25, 1, 1, 1, 0 }, 96 1.1 xtraeme { "PWM1", 26, 1, 1, 1, 0 }, 97 1.1 xtraeme { "PWM2", 27, 1, 1, 1, 0 }, 98 1.1 xtraeme { "PWM3", 28, 1, 1, 1, 0 }, 99 1.1 xtraeme { "PWM4", 29, 1, 1, 1, 0 }, 100 1.1 xtraeme { "CPU Fan", 32, 2, 60, 1, 0 }, 101 1.1 xtraeme { "NB Fan", 33, 2, 60, 1, 0 }, 102 1.1 xtraeme { "SYS Fan", 34, 2, 60, 1, 0 }, 103 1.1 xtraeme { "AUX1 Fan", 35, 2, 60, 1, 0 }, 104 1.1 xtraeme { "AUX2 Fan", 36, 2, 60, 1, 0 }, 105 1.1 xtraeme { "AUX3 Fan", 37, 2, 60, 1, 0 }, 106 1.1 xtraeme { "AUX4 Fan", 38, 2, 60, 1, 0 }, 107 1.1 xtraeme { "AUX5 Fan", 39, 2, 60, 1, 0 }, 108 1.1 xtraeme { NULL, 0, 0, 0, 0, 0 } } 109 1.1 xtraeme }, 110 1.1 xtraeme { 0x000E, "Abit AL8", { 111 1.1 xtraeme { "CPU Core", 0, 0, 10, 1, 0 }, 112 1.1 xtraeme { "DDR", 1, 0, 10, 1, 0 }, 113 1.1 xtraeme { "DDR VTT", 2, 0, 10, 1, 0 }, 114 1.1 xtraeme { "CPU VTT 1.2V", 3, 0, 10, 1, 0 }, 115 1.1 xtraeme { "MCH & PCIE 1.5V", 4, 0, 10, 1, 0 }, 116 1.1 xtraeme { "MCH 2.5V", 5, 0, 20, 1, 0 }, 117 1.1 xtraeme { "ICH 1.05V", 6, 0, 10, 1, 0 }, 118 1.1 xtraeme { "ATX +12V (24-Pin)", 7, 0, 60, 1, 0 }, 119 1.1 xtraeme { "ATX +12V (4-pin)", 8, 0, 60, 1, 0 }, 120 1.1 xtraeme { "ATX +5V", 9, 0, 30, 1, 0 }, 121 1.1 xtraeme { "+3.3V", 10, 0, 20, 1, 0 }, 122 1.1 xtraeme { "5VSB", 11, 0, 30, 1, 0 }, 123 1.1 xtraeme { "CPU", 24, 1, 1, 1, 0 }, 124 1.1 xtraeme { "System", 25, 1, 1, 1, 0 }, 125 1.1 xtraeme { "PWM", 26, 1, 1, 1, 0 }, 126 1.1 xtraeme { "CPU Fan", 32, 2, 60, 1, 0 }, 127 1.1 xtraeme { "NB Fan", 33, 2, 60, 1, 0 }, 128 1.1 xtraeme { "SYS Fan", 34, 2, 60, 1, 0 }, 129 1.1 xtraeme { NULL, 0, 0, 0, 0, 0 } } 130 1.1 xtraeme }, 131 1.1 xtraeme { 0x000F, "unknown. Please send-pr(1)", { 132 1.1 xtraeme { "CPU Core", 0, 0, 10, 1, 0 }, 133 1.1 xtraeme { "DDR", 1, 0, 10, 1, 0 }, 134 1.1 xtraeme { "DDR VTT", 2, 0, 10, 1, 0 }, 135 1.1 xtraeme { "CPU VTT 1.2V", 3, 0, 10, 1, 0 }, 136 1.1 xtraeme { "MCH & PCIE 1.5V", 4, 0, 10, 1, 0 }, 137 1.1 xtraeme { "MCH 2.5V", 5, 0, 20, 1, 0 }, 138 1.1 xtraeme { "ICH 1.05V", 6, 0, 10, 1, 0 }, 139 1.1 xtraeme { "ATX +12V (24-Pin)", 7, 0, 60, 1, 0 }, 140 1.1 xtraeme { "ATX +12V (4-pin)", 8, 0, 60, 1, 0 }, 141 1.1 xtraeme { "ATX +5V", 9, 0, 30, 1, 0 }, 142 1.1 xtraeme { "+3.3V", 10, 0, 20, 1, 0 }, 143 1.1 xtraeme { "5VSB", 11, 0, 30, 1, 0 }, 144 1.1 xtraeme { "CPU", 24, 1, 1, 1, 0 }, 145 1.1 xtraeme { "System", 25, 1, 1, 1, 0 }, 146 1.1 xtraeme { "PWM", 26, 1, 1, 1, 0 }, 147 1.1 xtraeme { "CPU Fan", 32, 2, 60, 1, 0 }, 148 1.1 xtraeme { "NB Fan", 33, 2, 60, 1, 0 }, 149 1.1 xtraeme { "SYS Fan", 34, 2, 60, 1, 0 }, 150 1.1 xtraeme { NULL, 0, 0, 0, 0, 0 } } 151 1.1 xtraeme }, 152 1.1 xtraeme { 0x0010, "Abit NI8 SLI GR", { 153 1.1 xtraeme { "CPU Core", 0, 0, 10, 1, 0 }, 154 1.1 xtraeme { "DDR", 1, 0, 10, 1, 0 }, 155 1.1 xtraeme { "DDR VTT", 2, 0, 10, 1, 0 }, 156 1.1 xtraeme { "CPU VTT 1.2V", 3, 0, 10, 1, 0 }, 157 1.1 xtraeme { "NB 1.4V", 4, 0, 10, 1, 0 }, 158 1.1 xtraeme { "SB 1.5V", 6, 0, 10, 1, 0 }, 159 1.1 xtraeme { "ATX +12V (24-Pin)", 7, 0, 60, 1, 0 }, 160 1.1 xtraeme { "ATX +12V (4-pin)", 8, 0, 60, 1, 0 }, 161 1.1 xtraeme { "ATX +5V", 9, 0, 30, 1, 0 }, 162 1.1 xtraeme { "+3.3V", 10, 0, 20, 1, 0 }, 163 1.1 xtraeme { "5VSB", 11, 0, 30, 1, 0 }, 164 1.1 xtraeme { "CPU", 24, 1, 1, 1, 0 }, 165 1.1 xtraeme { "SYS", 25, 1, 1, 1, 0 }, 166 1.1 xtraeme { "PWM", 26, 1, 1, 1, 0 }, 167 1.1 xtraeme { "CPU Fan", 32, 2, 60, 1, 0 }, 168 1.1 xtraeme { "NB Fan", 33, 2, 60, 1, 0 }, 169 1.1 xtraeme { "SYS Fan", 34, 2, 60, 1, 0 }, 170 1.1 xtraeme { "AUX1 Fan", 35, 2, 60, 1, 0 }, 171 1.1 xtraeme { "OTES1 Fan", 36, 2, 60, 1, 0 }, 172 1.1 xtraeme { NULL, 0, 0, 0, 0, 0 } } 173 1.1 xtraeme }, 174 1.1 xtraeme { 0x0011, "Abit AT8 32X", { 175 1.1 xtraeme { "CPU Core", 0, 0, 10, 1, 0 }, 176 1.1 xtraeme { "DDR", 1, 0, 20, 1, 0 }, 177 1.1 xtraeme { "DDR VTT", 2, 0, 10, 1, 0 }, 178 1.1 xtraeme { "CPU VDDA 2.5V", 6, 0, 20, 1, 0 }, 179 1.1 xtraeme { "NB 1.8V", 4, 0, 10, 1, 0 }, 180 1.1 xtraeme { "NB 1.8V Dual", 5, 0, 10, 1, 0 }, 181 1.1 xtraeme { "HTV 1.2", 3, 0, 10, 1, 0 }, 182 1.1 xtraeme { "PCIE 1.2V", 12, 0, 10, 1, 0 }, 183 1.1 xtraeme { "NB 1.2V", 13, 0, 10, 1, 0 }, 184 1.1 xtraeme { "ATX +12V (24-Pin)", 7, 0, 60, 1, 0 }, 185 1.1 xtraeme { "ATX +12V (4-pin)", 8, 0, 60, 1, 0 }, 186 1.1 xtraeme { "ATX +5V", 9, 0, 30, 1, 0 }, 187 1.1 xtraeme { "+3.3V", 10, 0, 20, 1, 0 }, 188 1.1 xtraeme { "5VSB", 11, 0, 30, 1, 0 }, 189 1.1 xtraeme { "CPU", 24, 1, 1, 1, 0 }, 190 1.1 xtraeme { "NB", 25, 1, 1, 1, 0 }, 191 1.1 xtraeme { "System", 26, 1, 1, 1, 0 }, 192 1.1 xtraeme { "PWM", 27, 1, 1, 1, 0 }, 193 1.1 xtraeme { "CPU Fan", 32, 2, 60, 1, 0 }, 194 1.1 xtraeme { "NB Fan", 33, 2, 60, 1, 0 }, 195 1.1 xtraeme { "SYS Fan", 34, 2, 60, 1, 0 }, 196 1.1 xtraeme { "AUX1 Fan", 35, 2, 60, 1, 0 }, 197 1.1 xtraeme { "AUX2 Fan", 36, 2, 60, 1, 0 }, 198 1.1 xtraeme { NULL, 0, 0, 0, 0, 0 } } 199 1.1 xtraeme }, 200 1.1 xtraeme { 0x0012, "unknown. Please send-pr(1)", { 201 1.1 xtraeme { "CPU Core", 0, 0, 10, 1, 0 }, 202 1.1 xtraeme { "DDR", 1, 0, 20, 1, 0 }, 203 1.1 xtraeme { "DDR VTT", 2, 0, 10, 1, 0 }, 204 1.1 xtraeme { "HyperTransport", 3, 0, 10, 1, 0 }, 205 1.1 xtraeme { "CPU VDDA 2.5V", 5, 0, 20, 1, 0 }, 206 1.1 xtraeme { "NB", 4, 0, 10, 1, 0 }, 207 1.1 xtraeme { "SB", 6, 0, 10, 1, 0 }, 208 1.1 xtraeme { "ATX +12V (24-Pin)", 7, 0, 60, 1, 0 }, 209 1.1 xtraeme { "ATX +12V (4-pin)", 8, 0, 60, 1, 0 }, 210 1.1 xtraeme { "ATX +5V", 9, 0, 30, 1, 0 }, 211 1.1 xtraeme { "+3.3V", 10, 0, 20, 1, 0 }, 212 1.1 xtraeme { "5VSB", 11, 0, 30, 1, 0 }, 213 1.1 xtraeme { "CPU", 24, 1, 1, 1, 0 }, 214 1.1 xtraeme { "SYS", 25, 1, 1, 1, 0 }, 215 1.1 xtraeme { "PWM", 26, 1, 1, 1, 0 }, 216 1.1 xtraeme { "CPU Fan", 32, 2, 60, 1, 0 }, 217 1.1 xtraeme { "NB Fan", 33, 2, 60, 1, 0 }, 218 1.1 xtraeme { "SYS Fan", 34, 2, 60, 1, 0 }, 219 1.1 xtraeme { "AUX1 Fan", 36, 2, 60, 1, 0 }, 220 1.1 xtraeme { NULL, 0, 0, 0, 0, 0 } } 221 1.1 xtraeme }, 222 1.1 xtraeme { 0x0013, "unknown. Please send-pr(1)", { 223 1.1 xtraeme { "CPU Core", 0, 0, 10, 1, 0 }, 224 1.1 xtraeme { "DDR", 1, 0, 10, 1, 0 }, 225 1.1 xtraeme { "DDR VTT", 2, 0, 10, 1, 0 }, 226 1.1 xtraeme { "CPU VTT 1.2V", 3, 0, 10, 1, 0 }, 227 1.1 xtraeme { "MCH & PCIE 1.5V", 4, 0, 10, 1, 0 }, 228 1.1 xtraeme { "MCH 2.5V", 5, 0, 20, 1, 0 }, 229 1.1 xtraeme { "ICH 1.05V", 6, 0, 10, 1, 0 }, 230 1.1 xtraeme { "ATX +12V (24-Pin)", 7, 0, 60, 1, 0 }, 231 1.1 xtraeme { "ATX +12V (4-pin)", 8, 0, 60, 1, 0 }, 232 1.1 xtraeme { "ATX +5V", 9, 0, 30, 1, 0 }, 233 1.1 xtraeme { "+3.3V", 10, 0, 20, 1, 0 }, 234 1.1 xtraeme { "5VSB", 11, 0, 30, 1, 0 }, 235 1.1 xtraeme { "CPU", 24, 1, 1, 1, 0 }, 236 1.1 xtraeme { "System", 25, 1, 1, 1, 0 }, 237 1.1 xtraeme { "PWM1", 26, 1, 1, 1, 0 }, 238 1.1 xtraeme { "PWM2", 27, 1, 1, 1, 0 }, 239 1.1 xtraeme { "PWM3", 28, 1, 1, 1, 0 }, 240 1.1 xtraeme { "PWM4", 29, 1, 1, 1, 0 }, 241 1.1 xtraeme { "CPU Fan", 32, 2, 60, 1, 0 }, 242 1.1 xtraeme { "NB Fan", 33, 2, 60, 1, 0 }, 243 1.1 xtraeme { "SYS Fan", 34, 2, 60, 1, 0 }, 244 1.1 xtraeme { "AUX1 Fan", 35, 2, 60, 1, 0 }, 245 1.1 xtraeme { "AUX2 Fan", 36, 2, 60, 1, 0 }, 246 1.1 xtraeme { "AUX3 Fan", 37, 2, 60, 1, 0 }, 247 1.1 xtraeme { "AUX4 Fan", 38, 2, 60, 1, 0 }, 248 1.1 xtraeme { NULL, 0, 0, 0, 0, 0 } } 249 1.1 xtraeme }, 250 1.1 xtraeme { 0x0014, "Abit AB9 Pro", { 251 1.1 xtraeme { "CPU Core", 0, 0, 10, 1, 0 }, 252 1.1 xtraeme { "DDR", 1, 0, 10, 1, 0 }, 253 1.1 xtraeme { "DDR VTT", 2, 0, 10, 1, 0 }, 254 1.1 xtraeme { "CPU VTT 1.2V", 3, 0, 10, 1, 0 }, 255 1.1 xtraeme { "MCH & PCIE 1.5V", 4, 0, 10, 1, 0 }, 256 1.1 xtraeme { "MCH 2.5V", 5, 0, 20, 1, 0 }, 257 1.1 xtraeme { "ICH 1.05V", 6, 0, 10, 1, 0 }, 258 1.1 xtraeme { "ATX +12V (24-Pin)", 7, 0, 60, 1, 0 }, 259 1.1 xtraeme { "ATX +12V (4-pin)", 8, 0, 60, 1, 0 }, 260 1.1 xtraeme { "ATX +5V", 9, 0, 30, 1, 0 }, 261 1.1 xtraeme { "+3.3V", 10, 0, 20, 1, 0 }, 262 1.1 xtraeme { "5VSB", 11, 0, 30, 1, 0 }, 263 1.1 xtraeme { "CPU", 24, 1, 1, 1, 0 }, 264 1.1 xtraeme { "System", 25, 1, 1, 1, 0 }, 265 1.1 xtraeme { "PWM", 26, 1, 1, 1, 0 }, 266 1.1 xtraeme { "CPU Fan", 32, 2, 60, 1, 0 }, 267 1.1 xtraeme { "NB Fan", 33, 2, 60, 1, 0 }, 268 1.1 xtraeme { "SYS Fan", 34, 2, 60, 1, 0 }, 269 1.1 xtraeme { NULL, 0, 0, 0, 0, 0 } } 270 1.1 xtraeme }, 271 1.1 xtraeme { 0x0015, "unknown. Please send-pr(1)", { 272 1.1 xtraeme { "CPU Core", 0, 0, 10, 1, 0 }, 273 1.1 xtraeme { "DDR", 1, 0, 20, 1, 0 }, 274 1.1 xtraeme { "DDR VTT", 2, 0, 10, 1, 0 }, 275 1.1 xtraeme { "HyperTransport", 3, 0, 10, 1, 0 }, 276 1.1 xtraeme { "CPU VDDA 2.5V", 5, 0, 20, 1, 0 }, 277 1.1 xtraeme { "NB", 4, 0, 10, 1, 0 }, 278 1.1 xtraeme { "SB", 6, 0, 10, 1, 0 }, 279 1.1 xtraeme { "ATX +12V (24-Pin)", 7, 0, 60, 1, 0 }, 280 1.1 xtraeme { "ATX +12V (4-pin)", 8, 0, 60, 1, 0 }, 281 1.1 xtraeme { "ATX +5V", 9, 0, 30, 1, 0 }, 282 1.1 xtraeme { "+3.3V", 10, 0, 20, 1, 0 }, 283 1.1 xtraeme { "5VSB", 11, 0, 30, 1, 0 }, 284 1.1 xtraeme { "CPU", 24, 1, 1, 1, 0 }, 285 1.1 xtraeme { "SYS", 25, 1, 1, 1, 0 }, 286 1.1 xtraeme { "PWM", 26, 1, 1, 1, 0 }, 287 1.1 xtraeme { "CPU Fan", 32, 2, 60, 1, 0 }, 288 1.1 xtraeme { "NB Fan", 33, 2, 60, 1, 0 }, 289 1.1 xtraeme { "SYS Fan", 34, 2, 60, 1, 0 }, 290 1.1 xtraeme { "AUX1 Fan", 33, 2, 60, 1, 0 }, 291 1.1 xtraeme { "AUX2 Fan", 35, 2, 60, 1, 0 }, 292 1.1 xtraeme { "AUX3 Fan", 36, 2, 60, 1, 0 }, 293 1.1 xtraeme { NULL, 0, 0, 0, 0, 0 } } 294 1.1 xtraeme }, 295 1.1 xtraeme { 0x0016, "generic", { 296 1.1 xtraeme { "CPU Core", 0, 0, 10, 1, 0 }, 297 1.1 xtraeme { "DDR", 1, 0, 20, 1, 0 }, 298 1.1 xtraeme { "DDR VTT", 2, 0, 10, 1, 0 }, 299 1.1 xtraeme { "CPU VTT 1.2V", 3, 0, 10, 1, 0 }, 300 1.1 xtraeme { "MCH & PCIE 1.5V", 4, 0, 10, 1, 0 }, 301 1.1 xtraeme { "MCH 2.5V", 5, 0, 20, 1, 0 }, 302 1.1 xtraeme { "ICH 1.05V", 6, 0, 10, 1, 0 }, 303 1.1 xtraeme { "ATX +12V (24-Pin)", 7, 0, 60, 1, 0 }, 304 1.1 xtraeme { "ATX +12V (4-pin)", 8, 0, 60, 1, 0 }, 305 1.1 xtraeme { "ATX +5V", 9, 0, 30, 1, 0 }, 306 1.1 xtraeme { "+3.3V", 10, 0, 20, 1, 0 }, 307 1.1 xtraeme { "5VSB", 11, 0, 30, 1, 0 }, 308 1.1 xtraeme { "CPU", 24, 1, 1, 1, 0 }, 309 1.1 xtraeme { "System", 25, 1, 1, 1, 0 }, 310 1.1 xtraeme { "PWM", 26, 1, 1, 1, 0 }, 311 1.1 xtraeme { "CPU Fan", 32, 2, 60, 1, 0 }, 312 1.1 xtraeme { "NB Fan", 33, 2, 60, 1, 0 }, 313 1.1 xtraeme { "SYS FAN", 34, 2, 60, 1, 0 }, 314 1.1 xtraeme { "AUX1 Fan", 35, 2, 60, 1, 0 }, 315 1.1 xtraeme { NULL, 0, 0, 0, 0, 0 } } 316 1.1 xtraeme }, 317 1.1 xtraeme { 0x0000, NULL, { { NULL, 0, 0, 0, 0, 0 } } } 318 1.1 xtraeme }; 319 1.1 xtraeme 320 1.1 xtraeme 321 1.1 xtraeme int 322 1.1 xtraeme ug_reset(struct ug_softc *sc) 323 1.1 xtraeme { 324 1.1 xtraeme int cnt = 0; 325 1.1 xtraeme 326 1.1 xtraeme while (bus_space_read_1(sc->sc_iot, sc->sc_ioh, UG_DATA) != 0x08) { 327 1.1 xtraeme /* 8 meaning Voodoo */ 328 1.1 xtraeme 329 1.1 xtraeme if (cnt++ > UG_DELAY_CYCLES) 330 1.1 xtraeme return 0; 331 1.1 xtraeme 332 1.1 xtraeme bus_space_write_1(sc->sc_iot, sc->sc_ioh, UG_DATA, 0); 333 1.1 xtraeme 334 1.1 xtraeme /* Wait for 0x09 at Data Port */ 335 1.1 xtraeme if (!ug_waitfor(sc, UG_DATA, 0x09)) 336 1.1 xtraeme return 0; 337 1.1 xtraeme 338 1.1 xtraeme /* Wait for 0xAC at Cmd Port */ 339 1.1 xtraeme if (!ug_waitfor(sc, UG_CMD, 0xAC)) 340 1.1 xtraeme return 0; 341 1.1 xtraeme } 342 1.1 xtraeme 343 1.1 xtraeme return 1; 344 1.1 xtraeme } 345 1.1 xtraeme 346 1.1 xtraeme uint8_t 347 1.1 xtraeme ug_read(struct ug_softc *sc, unsigned short sensor) 348 1.1 xtraeme { 349 1.1 xtraeme uint8_t bank, sens, rv; 350 1.1 xtraeme 351 1.1 xtraeme bank = (sensor & 0xFF00) >> 8; 352 1.1 xtraeme sens = sensor & 0x00FF; 353 1.1 xtraeme 354 1.1 xtraeme bus_space_write_1(sc->sc_iot, sc->sc_ioh, UG_DATA, bank); 355 1.1 xtraeme 356 1.1 xtraeme /* Wait 8 at Data Port */ 357 1.1 xtraeme if (!ug_waitfor(sc, UG_DATA, 8)) 358 1.1 xtraeme return 0; 359 1.1 xtraeme 360 1.1 xtraeme bus_space_write_1(sc->sc_iot, sc->sc_ioh, UG_CMD, sens); 361 1.1 xtraeme 362 1.1 xtraeme /* Wait 1 at Data Port */ 363 1.1 xtraeme if (!ug_waitfor(sc, UG_DATA, 1)) 364 1.1 xtraeme return 0; 365 1.1 xtraeme 366 1.1 xtraeme /* Finally read the sensor */ 367 1.1 xtraeme rv = bus_space_read_1(sc->sc_iot, sc->sc_ioh, UG_CMD); 368 1.1 xtraeme 369 1.1 xtraeme ug_reset(sc); 370 1.1 xtraeme 371 1.1 xtraeme return rv; 372 1.1 xtraeme } 373 1.1 xtraeme 374 1.1 xtraeme int 375 1.1 xtraeme ug_waitfor(struct ug_softc *sc, uint16_t offset, uint8_t value) 376 1.1 xtraeme { 377 1.1 xtraeme int cnt = 0; 378 1.1 xtraeme while (bus_space_read_1(sc->sc_iot, sc->sc_ioh, offset) != value) { 379 1.1 xtraeme if (cnt++ > UG_DELAY_CYCLES) 380 1.1 xtraeme return 0; 381 1.1 xtraeme } 382 1.1 xtraeme return 1; 383 1.1 xtraeme } 384 1.1 xtraeme 385 1.1 xtraeme void 386 1.1 xtraeme ug_setup_sensors(struct ug_softc *sc) 387 1.1 xtraeme { 388 1.1 xtraeme int i; 389 1.1 xtraeme 390 1.1 xtraeme /* Setup Temps */ 391 1.1 xtraeme for (i = 0; i < UG_VOLT_MIN; i++) 392 1.9 xtraeme sc->sc_sensor[i].units = ENVSYS_STEMP; 393 1.1 xtraeme 394 1.1 xtraeme #define COPYDESCR(x, y) \ 395 1.1 xtraeme do { \ 396 1.1 xtraeme strlcpy((x), (y), sizeof(x)); \ 397 1.1 xtraeme } while (0) 398 1.1 xtraeme 399 1.9 xtraeme COPYDESCR(sc->sc_sensor[0].desc, "CPU Temp"); 400 1.9 xtraeme COPYDESCR(sc->sc_sensor[1].desc, "SYS Temp"); 401 1.9 xtraeme COPYDESCR(sc->sc_sensor[2].desc, "PWN Temp"); 402 1.1 xtraeme 403 1.1 xtraeme /* Right, Now setup U sensors */ 404 1.1 xtraeme 405 1.1 xtraeme for (i = UG_VOLT_MIN; i < UG_FAN_MIN; i++) { 406 1.9 xtraeme sc->sc_sensor[i].units = ENVSYS_SVOLTS_DC; 407 1.9 xtraeme sc->sc_sensor[i].rfact = UG_RFACT; 408 1.1 xtraeme } 409 1.1 xtraeme 410 1.9 xtraeme COPYDESCR(sc->sc_sensor[3].desc, "HTVdd"); 411 1.9 xtraeme COPYDESCR(sc->sc_sensor[4].desc, "VCore"); 412 1.9 xtraeme COPYDESCR(sc->sc_sensor[5].desc, "DDRVdd"); 413 1.9 xtraeme COPYDESCR(sc->sc_sensor[6].desc, "Vdd3V3"); 414 1.9 xtraeme COPYDESCR(sc->sc_sensor[7].desc, "Vdd5V"); 415 1.9 xtraeme COPYDESCR(sc->sc_sensor[8].desc, "NBVdd"); 416 1.9 xtraeme COPYDESCR(sc->sc_sensor[9].desc, "AGPVdd"); 417 1.9 xtraeme COPYDESCR(sc->sc_sensor[10].desc, "DDRVtt"); 418 1.9 xtraeme COPYDESCR(sc->sc_sensor[11].desc, "Vdd5VSB"); 419 1.9 xtraeme COPYDESCR(sc->sc_sensor[12].desc, "Vdd3VDual"); 420 1.9 xtraeme COPYDESCR(sc->sc_sensor[13].desc, "SBVdd"); 421 1.1 xtraeme 422 1.1 xtraeme /* Fan sensors */ 423 1.1 xtraeme for (i = UG_FAN_MIN; i < UG_NUM_SENSORS; i++) 424 1.9 xtraeme sc->sc_sensor[i].units = ENVSYS_SFANRPM; 425 1.1 xtraeme 426 1.9 xtraeme COPYDESCR(sc->sc_sensor[14].desc, "CPU Fan"); 427 1.9 xtraeme COPYDESCR(sc->sc_sensor[15].desc, "NB Fan"); 428 1.9 xtraeme COPYDESCR(sc->sc_sensor[16].desc, "SYS Fan"); 429 1.9 xtraeme COPYDESCR(sc->sc_sensor[17].desc, "AUX Fan 1"); 430 1.9 xtraeme COPYDESCR(sc->sc_sensor[18].desc, "AUX Fan 2"); 431 1.12 pgoyette 432 1.12 pgoyette /* All sensors */ 433 1.12 pgoyette for (i = 0; i < UG_NUM_SENSORS; i++) 434 1.12 pgoyette sc->sc_sensor[i].units = ENVSYS_SINVALID; 435 1.1 xtraeme } 436 1.1 xtraeme 437 1.9 xtraeme void 438 1.9 xtraeme ug_refresh(struct sysmon_envsys *sme, envsys_data_t *edata) 439 1.1 xtraeme { 440 1.1 xtraeme struct ug_softc *sc = sme->sme_cookie; 441 1.1 xtraeme 442 1.1 xtraeme /* Sensors return C while we need uK */ 443 1.1 xtraeme 444 1.3 xtraeme if (edata->sensor < UG_VOLT_MIN - 1) /* CPU and SYS Temps */ 445 1.5 xtraeme edata->value_cur = ug_read(sc, UG_CPUTEMP + edata->sensor) 446 1.5 xtraeme * 1000000 + 273150000; 447 1.3 xtraeme else if (edata->sensor == 2) /* PWMTEMP */ 448 1.5 xtraeme edata->value_cur = ug_read(sc, UG_PWMTEMP) 449 1.1 xtraeme * 1000000 + 273150000; 450 1.1 xtraeme 451 1.1 xtraeme /* Voltages */ 452 1.1 xtraeme 453 1.3 xtraeme #define VOLT_SENSOR UG_HTV + edata->sensor - UG_VOLT_MIN 454 1.1 xtraeme 455 1.1 xtraeme else 456 1.3 xtraeme if ((edata->sensor >= UG_VOLT_MIN) && (edata->sensor < UG_FAN_MIN)) { 457 1.5 xtraeme edata->value_cur = ug_read(sc, VOLT_SENSOR); 458 1.1 xtraeme switch(VOLT_SENSOR) { 459 1.1 xtraeme case UG_5V: /* 6V RFact */ 460 1.1 xtraeme case UG_5VSB: 461 1.5 xtraeme edata->value_cur *= UG_RFACT6; 462 1.1 xtraeme break; 463 1.1 xtraeme case UG_3V3: /* 4V RFact */ 464 1.1 xtraeme case UG_3VDUAL: 465 1.5 xtraeme edata->value_cur *= UG_RFACT4; 466 1.1 xtraeme break; 467 1.1 xtraeme default: /* 3V RFact */ 468 1.5 xtraeme edata->value_cur *= UG_RFACT3; 469 1.7 xtraeme break; 470 1.1 xtraeme } 471 1.1 xtraeme } else 472 1.1 xtraeme 473 1.1 xtraeme #undef VOLT_SENSOR 474 1.1 xtraeme 475 1.1 xtraeme /* and Fans */ 476 1.3 xtraeme if (edata->sensor >= UG_FAN_MIN) 477 1.5 xtraeme edata->value_cur = ug_read(sc, UG_CPUFAN + 478 1.3 xtraeme edata->sensor - UG_FAN_MIN) * UG_RFACT_FAN; 479 1.1 xtraeme } 480 1.1 xtraeme 481 1.1 xtraeme void 482 1.11 xtraeme ug2_attach(device_t dv) 483 1.1 xtraeme { 484 1.11 xtraeme struct ug_softc *sc = device_private(dv); 485 1.1 xtraeme uint8_t buf[2]; 486 1.3 xtraeme int i; 487 1.13 maxv const struct ug2_motherboard_info *ai; 488 1.13 maxv const struct ug2_sensor_info *si; 489 1.1 xtraeme 490 1.1 xtraeme aprint_normal(": Abit uGuru 2005 system monitor\n"); 491 1.1 xtraeme 492 1.1 xtraeme if (ug2_read(sc, UG2_MISC_BANK, UG2_BOARD_ID, 2, buf) != 2) { 493 1.11 xtraeme aprint_error_dev(dv, "Cannot detect board ID. Using default\n"); 494 1.1 xtraeme buf[0] = UG_MAX_MSB_BOARD; 495 1.1 xtraeme buf[1] = UG_MAX_LSB_BOARD; 496 1.1 xtraeme } 497 1.1 xtraeme 498 1.1 xtraeme if (buf[0] > UG_MAX_MSB_BOARD || buf[1] > UG_MAX_LSB_BOARD || 499 1.1 xtraeme buf[1] < UG_MIN_LSB_BOARD) { 500 1.11 xtraeme aprint_error_dev(dv, "Invalid board ID(%X,%X). Using default\n", 501 1.11 xtraeme buf[0], buf[1]); 502 1.1 xtraeme buf[0] = UG_MAX_MSB_BOARD; 503 1.1 xtraeme buf[1] = UG_MAX_LSB_BOARD; 504 1.1 xtraeme } 505 1.1 xtraeme 506 1.1 xtraeme ai = &ug2_mb[buf[1] - UG_MIN_LSB_BOARD]; 507 1.1 xtraeme 508 1.11 xtraeme aprint_normal_dev(dv, "mainboard %s (%.2X%.2X)\n", 509 1.1 xtraeme ai->name, buf[0], buf[1]); 510 1.1 xtraeme 511 1.13 maxv sc->mbsens = (const void *)ai->sensors; 512 1.10 kefren sc->sc_sme = sysmon_envsys_create(); 513 1.1 xtraeme 514 1.1 xtraeme for (i = 0, si = ai->sensors; si && si->name; si++, i++) { 515 1.9 xtraeme COPYDESCR(sc->sc_sensor[i].desc, si->name); 516 1.9 xtraeme sc->sc_sensor[i].rfact = 1; 517 1.10 kefren sc->sc_sensor[i].state = ENVSYS_SVALID; 518 1.1 xtraeme switch (si->type) { 519 1.1 xtraeme case UG2_VOLTAGE_SENSOR: 520 1.9 xtraeme sc->sc_sensor[i].units = ENVSYS_SVOLTS_DC; 521 1.9 xtraeme sc->sc_sensor[i].rfact = UG_RFACT; 522 1.1 xtraeme break; 523 1.1 xtraeme case UG2_TEMP_SENSOR: 524 1.9 xtraeme sc->sc_sensor[i].units = ENVSYS_STEMP; 525 1.1 xtraeme break; 526 1.1 xtraeme case UG2_FAN_SENSOR: 527 1.9 xtraeme sc->sc_sensor[i].units = ENVSYS_SFANRPM; 528 1.3 xtraeme break; 529 1.3 xtraeme default: 530 1.3 xtraeme break; 531 1.1 xtraeme } 532 1.9 xtraeme if (sysmon_envsys_sensor_attach(sc->sc_sme, 533 1.9 xtraeme &sc->sc_sensor[i])) { 534 1.9 xtraeme sysmon_envsys_destroy(sc->sc_sme); 535 1.9 xtraeme return; 536 1.9 xtraeme } 537 1.1 xtraeme } 538 1.1 xtraeme #undef COPYDESCR 539 1.1 xtraeme 540 1.11 xtraeme sc->sc_sme->sme_name = device_xname(dv); 541 1.9 xtraeme sc->sc_sme->sme_cookie = sc; 542 1.9 xtraeme sc->sc_sme->sme_refresh = ug2_refresh; 543 1.1 xtraeme 544 1.9 xtraeme if (sysmon_envsys_register(sc->sc_sme)) { 545 1.11 xtraeme aprint_error_dev(dv, "unable to register with sysmon\n"); 546 1.9 xtraeme sysmon_envsys_destroy(sc->sc_sme); 547 1.9 xtraeme } 548 1.1 xtraeme } 549 1.1 xtraeme 550 1.9 xtraeme void 551 1.9 xtraeme ug2_refresh(struct sysmon_envsys *sme, envsys_data_t *edata) 552 1.1 xtraeme { 553 1.1 xtraeme struct ug_softc *sc = sme->sme_cookie; 554 1.13 maxv const struct ug2_sensor_info *si = 555 1.13 maxv (const struct ug2_sensor_info *)sc->mbsens; 556 1.1 xtraeme int rfact = 1; 557 1.1 xtraeme uint8_t v; 558 1.1 xtraeme 559 1.3 xtraeme si += edata->sensor; 560 1.1 xtraeme 561 1.1 xtraeme #define SENSOR_VALUE (v * si->multiplier * rfact / si->divisor + si->offset) 562 1.1 xtraeme 563 1.1 xtraeme if (ug2_read(sc, UG2_SENSORS_BANK, UG2_VALUES_OFFSET + 564 1.1 xtraeme si->port, 1, &v) == 1) { 565 1.1 xtraeme switch (si->type) { 566 1.1 xtraeme case UG2_TEMP_SENSOR: 567 1.5 xtraeme edata->value_cur = SENSOR_VALUE * 1000000 568 1.1 xtraeme + 273150000; 569 1.1 xtraeme break; 570 1.1 xtraeme case UG2_VOLTAGE_SENSOR: 571 1.1 xtraeme rfact = UG_RFACT; 572 1.5 xtraeme edata->value_cur = SENSOR_VALUE; 573 1.1 xtraeme break; 574 1.1 xtraeme default: 575 1.5 xtraeme edata->value_cur = SENSOR_VALUE; 576 1.6 xtraeme break; 577 1.1 xtraeme } 578 1.9 xtraeme } 579 1.1 xtraeme #undef SENSOR_VALUE 580 1.1 xtraeme } 581 1.1 xtraeme 582 1.14 jdolecek static int 583 1.14 jdolecek ug2_wait_ready(bus_space_tag_t iot, bus_space_handle_t ioh) 584 1.1 xtraeme { 585 1.1 xtraeme int cnt = 0; 586 1.1 xtraeme 587 1.14 jdolecek bus_space_write_1(iot, ioh, UG_DATA, 0x1a); 588 1.14 jdolecek while (bus_space_read_1(iot, ioh, UG_DATA) & 589 1.1 xtraeme UG2_STATUS_BUSY) { 590 1.1 xtraeme if (cnt++ > UG_DELAY_CYCLES) 591 1.1 xtraeme return 0; 592 1.1 xtraeme } 593 1.1 xtraeme return 1; 594 1.1 xtraeme } 595 1.1 xtraeme 596 1.14 jdolecek static int 597 1.14 jdolecek ug2_wait_readable(bus_space_tag_t iot, bus_space_handle_t ioh) 598 1.1 xtraeme { 599 1.1 xtraeme int cnt = 0; 600 1.1 xtraeme 601 1.14 jdolecek while (!(bus_space_read_1(iot, ioh, UG_DATA) & 602 1.1 xtraeme UG2_STATUS_READY_FOR_READ)) { 603 1.1 xtraeme if (cnt++ > UG_DELAY_CYCLES) 604 1.1 xtraeme return 0; 605 1.1 xtraeme } 606 1.1 xtraeme return 1; 607 1.1 xtraeme } 608 1.1 xtraeme 609 1.1 xtraeme int 610 1.14 jdolecek ug2_sync(bus_space_tag_t iot, bus_space_handle_t ioh) 611 1.1 xtraeme { 612 1.1 xtraeme int cnt = 0; 613 1.1 xtraeme 614 1.14 jdolecek #define UG2_WAIT_READY if(ug2_wait_ready(iot, ioh) == 0) return 0; 615 1.1 xtraeme 616 1.1 xtraeme /* Don't sync two times in a row */ 617 1.14 jdolecek if (ug_ver != 0) { 618 1.1 xtraeme ug_ver = 0; 619 1.1 xtraeme return 1; 620 1.1 xtraeme } 621 1.1 xtraeme 622 1.1 xtraeme UG2_WAIT_READY; 623 1.14 jdolecek bus_space_write_1(iot, ioh, UG_DATA, 0x20); 624 1.1 xtraeme UG2_WAIT_READY; 625 1.14 jdolecek bus_space_write_1(iot, ioh, UG_CMD, 0x10); 626 1.1 xtraeme UG2_WAIT_READY; 627 1.14 jdolecek bus_space_write_1(iot, ioh, UG_CMD, 0x00); 628 1.1 xtraeme UG2_WAIT_READY; 629 1.14 jdolecek if (ug2_wait_readable(iot, ioh) == 0) 630 1.1 xtraeme return 0; 631 1.14 jdolecek while (bus_space_read_1(iot, ioh, UG_CMD) != 0xAC) 632 1.1 xtraeme if (cnt++ > UG_DELAY_CYCLES) 633 1.1 xtraeme return 0; 634 1.1 xtraeme return 1; 635 1.1 xtraeme } 636 1.1 xtraeme 637 1.1 xtraeme int 638 1.1 xtraeme ug2_read(struct ug_softc *sc, uint8_t bank, uint8_t offset, uint8_t count, 639 1.1 xtraeme uint8_t *ret) 640 1.1 xtraeme { 641 1.1 xtraeme int i; 642 1.14 jdolecek bus_space_tag_t iot = sc->sc_iot; 643 1.14 jdolecek bus_space_handle_t ioh = sc->sc_ioh; 644 1.1 xtraeme 645 1.14 jdolecek if (ug2_sync(iot, ioh) == 0) 646 1.1 xtraeme return 0; 647 1.1 xtraeme 648 1.14 jdolecek bus_space_write_1(iot, ioh, UG_DATA, 0x1A); 649 1.1 xtraeme UG2_WAIT_READY; 650 1.14 jdolecek bus_space_write_1(iot, ioh, UG_CMD, bank); 651 1.1 xtraeme UG2_WAIT_READY; 652 1.14 jdolecek bus_space_write_1(iot, ioh, UG_CMD, offset); 653 1.1 xtraeme UG2_WAIT_READY; 654 1.14 jdolecek bus_space_write_1(iot, ioh, UG_CMD, count); 655 1.1 xtraeme UG2_WAIT_READY; 656 1.1 xtraeme 657 1.1 xtraeme #undef UG2_WAIT_READY 658 1.1 xtraeme 659 1.1 xtraeme /* Now wait for the results */ 660 1.1 xtraeme for (i = 0; i < count; i++) { 661 1.14 jdolecek if (ug2_wait_readable(sc->sc_iot, sc->sc_ioh) == 0) 662 1.1 xtraeme break; 663 1.1 xtraeme ret[i] = bus_space_read_1(sc->sc_iot, sc->sc_ioh, UG_CMD); 664 1.1 xtraeme } 665 1.1 xtraeme 666 1.1 xtraeme return i; 667 1.1 xtraeme } 668