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