Home | History | Annotate | Line # | Download | only in boot
vreset.c revision 1.10.2.1
      1  1.10.2.1      yamt /*	$NetBSD: vreset.c,v 1.10.2.1 2008/06/04 02:04:41 yamt Exp $	*/
      2       1.1  sakamoto 
      3       1.1  sakamoto /*
      4       1.1  sakamoto  * Copyright (C) 1995-1997 Gary Thomas (gdt (at) linuxppc.org)
      5       1.1  sakamoto  * All rights reserved.
      6       1.1  sakamoto  *
      7       1.1  sakamoto  * Initialize the VGA control registers to 80x25 text mode.
      8       1.1  sakamoto  *
      9       1.1  sakamoto  * Adapted from a program by:
     10       1.1  sakamoto  *                                      Steve Sellgren
     11       1.1  sakamoto  *                                      San Francisco Indigo Company
     12       1.1  sakamoto  *                                      sfindigo!sellgren (at) uunet.uu.net
     13       1.1  sakamoto  * Adapted for Moto boxes by:
     14       1.1  sakamoto  *                                      Pat Kane & Mark Scott, 1996
     15       1.1  sakamoto  * Fixed for IBM/PowerStack II          Pat Kane 1997
     16       1.1  sakamoto  *
     17       1.1  sakamoto  * Redistribution and use in source and binary forms, with or without
     18       1.1  sakamoto  * modification, are permitted provided that the following conditions
     19       1.1  sakamoto  * are met:
     20       1.1  sakamoto  * 1. Redistributions of source code must retain the above copyright
     21       1.1  sakamoto  *    notice, this list of conditions and the following disclaimer.
     22       1.1  sakamoto  * 2. Redistributions in binary form must reproduce the above copyright
     23       1.1  sakamoto  *    notice, this list of conditions and the following disclaimer in the
     24       1.1  sakamoto  *    documentation and/or other materials provided with the distribution.
     25       1.1  sakamoto  * 3. All advertising materials mentioning features or use of this software
     26       1.1  sakamoto  *    must display the following acknowledgement:
     27       1.1  sakamoto  *      This product includes software developed by Gary Thomas.
     28       1.1  sakamoto  * 4. The name of the author may not be used to endorse or promote products
     29       1.1  sakamoto  *    derived from this software without specific prior written permission.
     30       1.1  sakamoto  *
     31       1.1  sakamoto  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
     32       1.1  sakamoto  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
     33       1.1  sakamoto  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
     34       1.1  sakamoto  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
     35       1.1  sakamoto  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
     36       1.1  sakamoto  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     37       1.1  sakamoto  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     38       1.1  sakamoto  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     39       1.1  sakamoto  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
     40       1.1  sakamoto  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     41       1.1  sakamoto  */
     42       1.1  sakamoto 
     43       1.1  sakamoto #ifdef CONS_VGA
     44       1.6  junyoung #include <lib/libsa/stand.h>
     45       1.9       dsl #include <sys/bswap.h>
     46       1.4  sakamoto #include "boot.h"
     47       1.4  sakamoto #include "iso_font.h"
     48       1.4  sakamoto 
     49       1.4  sakamoto #if 0
     50       1.1  sakamoto static char rcsid[] = "vreset.c 2.0 1997 kane  PEK'97 Exp $";
     51       1.1  sakamoto #endif
     52       1.1  sakamoto 
     53       1.1  sakamoto /*
     54       1.5  junyoung  * VGA Register
     55       1.1  sakamoto  */
     56       1.1  sakamoto struct VgaRegs
     57       1.1  sakamoto {
     58       1.4  sakamoto 	u_short io_port;
     59       1.4  sakamoto 	u_char io_index;
     60       1.4  sakamoto 	u_char io_value;
     61       1.1  sakamoto };
     62       1.1  sakamoto 
     63       1.1  sakamoto /*
     64       1.1  sakamoto  * Default console text mode registers  used to reset
     65       1.1  sakamoto  * graphics adapter.
     66       1.1  sakamoto  */
     67       1.1  sakamoto #define NREGS 54
     68       1.1  sakamoto #define ENDMK  0xFFFF  /* End marker */
     69       1.1  sakamoto 
     70  1.10.2.1      yamt #define S3Vendor	0x5333
     71  1.10.2.1      yamt #define CirrusVendor	0x1013
     72       1.1  sakamoto #define DiamondVendor	0x100E
     73       1.1  sakamoto #define MatroxVendor	0x102B
     74       1.1  sakamoto 
     75       1.1  sakamoto struct VgaRegs GenVgaTextRegs[NREGS+1] = {
     76       1.5  junyoung /*      port    index   value */
     77       1.5  junyoung 	/* SR Regs */
     78       1.5  junyoung         { 0x3c4, 0x1, 0x0 },
     79       1.5  junyoung         { 0x3c4, 0x2, 0x3 },
     80       1.5  junyoung         { 0x3c4, 0x3, 0x0 },
     81       1.5  junyoung         { 0x3c4, 0x4, 0x2 },
     82       1.5  junyoung 	/* CR Regs */
     83       1.5  junyoung         { 0x3d4, 0x0, 0x5f },
     84       1.5  junyoung         { 0x3d4, 0x1, 0x4f },
     85       1.5  junyoung         { 0x3d4, 0x2, 0x50 },
     86       1.5  junyoung         { 0x3d4, 0x3, 0x82 },
     87       1.5  junyoung         { 0x3d4, 0x4, 0x55 },
     88       1.5  junyoung         { 0x3d4, 0x5, 0x81 },
     89       1.5  junyoung         { 0x3d4, 0x6, 0xbf },
     90       1.5  junyoung         { 0x3d4, 0x7, 0x1f },
     91       1.5  junyoung         { 0x3d4, 0x8, 0x00 },
     92       1.5  junyoung         { 0x3d4, 0x9, 0x4f },
     93       1.5  junyoung         { 0x3d4, 0xa, 0x0d },
     94       1.5  junyoung         { 0x3d4, 0xb, 0x0e },
     95       1.5  junyoung         { 0x3d4, 0xc, 0x00 },
     96       1.5  junyoung         { 0x3d4, 0xd, 0x00 },
     97       1.5  junyoung         { 0x3d4, 0xe, 0x00 },
     98       1.5  junyoung         { 0x3d4, 0xf, 0x00 },
     99       1.5  junyoung         { 0x3d4, 0x10, 0x9c },
    100       1.5  junyoung         { 0x3d4, 0x11, 0x8e },
    101       1.5  junyoung         { 0x3d4, 0x12, 0x8f },
    102       1.5  junyoung         { 0x3d4, 0x13, 0x28 },
    103       1.5  junyoung         { 0x3d4, 0x14, 0x1f },
    104       1.5  junyoung         { 0x3d4, 0x15, 0x96 },
    105       1.5  junyoung         { 0x3d4, 0x16, 0xb9 },
    106       1.5  junyoung         { 0x3d4, 0x17, 0xa3 },
    107       1.5  junyoung 	/* GR Regs */
    108       1.5  junyoung         { 0x3ce, 0x0, 0x0 },
    109       1.5  junyoung         { 0x3ce, 0x1, 0x0 },
    110       1.5  junyoung         { 0x3ce, 0x2, 0x0 },
    111       1.5  junyoung         { 0x3ce, 0x3, 0x0 },
    112       1.5  junyoung         { 0x3ce, 0x4, 0x0 },
    113       1.5  junyoung         { 0x3ce, 0x5, 0x10 },
    114       1.5  junyoung         { 0x3ce, 0x6, 0xe },
    115       1.5  junyoung         { 0x3ce, 0x7, 0x0 },
    116       1.5  junyoung         { 0x3ce, 0x8, 0xff },
    117       1.5  junyoung         { ENDMK },
    118       1.1  sakamoto };
    119       1.1  sakamoto 
    120       1.1  sakamoto struct VgaRegs S3TextRegs[NREGS+1] = {
    121       1.5  junyoung /*	port	index	value */
    122       1.5  junyoung 	/* SR Regs */
    123       1.5  junyoung 	{ 0x3c4, 0x1, 0x0 },
    124       1.5  junyoung 	{ 0x3c4, 0x2, 0x3 },
    125       1.5  junyoung 	{ 0x3c4, 0x3, 0x0 },
    126       1.5  junyoung 	{ 0x3c4, 0x4, 0x2 },
    127       1.5  junyoung 	/* CR Regs */
    128       1.5  junyoung 	{ 0x3d4, 0x0, 0x5f },
    129       1.5  junyoung 	{ 0x3d4, 0x1, 0x4f },
    130       1.5  junyoung 	{ 0x3d4, 0x2, 0x50 },
    131       1.5  junyoung 	{ 0x3d4, 0x3, 0x82 },
    132       1.5  junyoung 	{ 0x3d4, 0x4, 0x55 },
    133       1.5  junyoung 	{ 0x3d4, 0x5, 0x81 },
    134       1.5  junyoung 	{ 0x3d4, 0x6, 0xbf },
    135       1.5  junyoung 	{ 0x3d4, 0x7, 0x1f },
    136       1.5  junyoung 	{ 0x3d4, 0x8, 0x00 },
    137       1.5  junyoung 	{ 0x3d4, 0x9, 0x4f },
    138       1.5  junyoung 	{ 0x3d4, 0xa, 0x0d },
    139       1.5  junyoung 	{ 0x3d4, 0xb, 0x0e },
    140       1.5  junyoung 	{ 0x3d4, 0xc, 0x00 },
    141       1.5  junyoung 	{ 0x3d4, 0xd, 0x00 },
    142       1.5  junyoung 	{ 0x3d4, 0xe, 0x00 },
    143       1.5  junyoung 	{ 0x3d4, 0xf, 0x00 },
    144       1.5  junyoung 	{ 0x3d4, 0x10, 0x9c },
    145       1.5  junyoung 	{ 0x3d4, 0x11, 0x8e },
    146       1.5  junyoung 	{ 0x3d4, 0x12, 0x8f },
    147       1.5  junyoung 	{ 0x3d4, 0x13, 0x28 },
    148       1.5  junyoung 	{ 0x3d4, 0x14, 0x1f },
    149       1.5  junyoung 	{ 0x3d4, 0x15, 0x96 },
    150       1.5  junyoung 	{ 0x3d4, 0x16, 0xb9 },
    151       1.5  junyoung 	{ 0x3d4, 0x17, 0xa3 },
    152       1.5  junyoung 	/* GR Regs */
    153       1.5  junyoung 	{ 0x3ce, 0x0, 0x0 },
    154       1.5  junyoung 	{ 0x3ce, 0x1, 0x0 },
    155       1.5  junyoung 	{ 0x3ce, 0x2, 0x0 },
    156       1.5  junyoung 	{ 0x3ce, 0x3, 0x0 },
    157       1.5  junyoung 	{ 0x3ce, 0x4, 0x0 },
    158       1.5  junyoung 	{ 0x3ce, 0x5, 0x10 },
    159       1.5  junyoung 	{ 0x3ce, 0x6, 0xe },
    160       1.5  junyoung 	{ 0x3ce, 0x7, 0x0 },
    161       1.5  junyoung 	{ 0x3ce, 0x8, 0xff },
    162       1.4  sakamoto         { ENDMK }
    163       1.1  sakamoto };
    164       1.1  sakamoto 
    165       1.5  junyoung struct RGBColors {
    166       1.5  junyoung 	u_char r, g, b;
    167       1.1  sakamoto };
    168       1.1  sakamoto 
    169       1.1  sakamoto /*
    170       1.1  sakamoto  * Default console text mode color table.
    171       1.1  sakamoto  * These values were obtained by booting Linux with
    172       1.5  junyoung  * text mode firmware & then dumping the registers.
    173       1.1  sakamoto  */
    174       1.5  junyoung struct RGBColors TextCLUT[256] = {
    175       1.5  junyoung /*	red	green	blue */
    176       1.4  sakamoto 	{ 0x0,	0x0,	0x0 },
    177       1.4  sakamoto 	{ 0x0,	0x0,	0x2a },
    178       1.4  sakamoto 	{ 0x0,	0x2a,	0x0 },
    179       1.4  sakamoto 	{ 0x0,	0x2a,	0x2a },
    180       1.4  sakamoto 	{ 0x2a,	0x0,	0x0 },
    181       1.4  sakamoto 	{ 0x2a,	0x0,	0x2a },
    182       1.4  sakamoto 	{ 0x2a,	0x2a,	0x0 },
    183       1.4  sakamoto 	{ 0x2a,	0x2a,	0x2a },
    184       1.4  sakamoto 	{ 0x0,	0x0,	0x15 },
    185       1.4  sakamoto 	{ 0x0,	0x0,	0x3f },
    186       1.4  sakamoto 	{ 0x0,	0x2a,	0x15 },
    187       1.4  sakamoto 	{ 0x0,	0x2a,	0x3f },
    188       1.4  sakamoto 	{ 0x2a,	0x0,	0x15 },
    189       1.4  sakamoto 	{ 0x2a,	0x0,	0x3f },
    190       1.4  sakamoto 	{ 0x2a,	0x2a,	0x15 },
    191       1.4  sakamoto 	{ 0x2a,	0x2a,	0x3f },
    192       1.4  sakamoto 	{ 0x0,	0x15,	0x0 },
    193       1.4  sakamoto 	{ 0x0,	0x15,	0x2a },
    194       1.4  sakamoto 	{ 0x0,	0x3f,	0x0 },
    195       1.4  sakamoto 	{ 0x0,	0x3f,	0x2a },
    196       1.4  sakamoto 	{ 0x2a,	0x15,	0x0 },
    197       1.4  sakamoto 	{ 0x2a,	0x15,	0x2a },
    198       1.4  sakamoto 	{ 0x2a,	0x3f,	0x0 },
    199       1.4  sakamoto 	{ 0x2a,	0x3f,	0x2a },
    200       1.4  sakamoto 	{ 0x0,	0x15,	0x15 },
    201       1.4  sakamoto 	{ 0x0,	0x15,	0x3f },
    202       1.4  sakamoto 	{ 0x0,	0x3f,	0x15 },
    203       1.4  sakamoto 	{ 0x0,	0x3f,	0x3f },
    204       1.4  sakamoto 	{ 0x2a,	0x15,	0x15 },
    205       1.4  sakamoto 	{ 0x2a,	0x15,	0x3f },
    206       1.4  sakamoto 	{ 0x2a,	0x3f,	0x15 },
    207       1.4  sakamoto 	{ 0x2a,	0x3f,	0x3f },
    208       1.4  sakamoto 	{ 0x15,	0x0,	0x0 },
    209       1.4  sakamoto 	{ 0x15,	0x0,	0x2a },
    210       1.4  sakamoto 	{ 0x15,	0x2a,	0x0 },
    211       1.4  sakamoto 	{ 0x15,	0x2a,	0x2a },
    212       1.4  sakamoto 	{ 0x3f,	0x0,	0x0 },
    213       1.4  sakamoto 	{ 0x3f,	0x0,	0x2a },
    214       1.4  sakamoto 	{ 0x3f,	0x2a,	0x0 },
    215       1.4  sakamoto 	{ 0x3f,	0x2a,	0x2a },
    216       1.4  sakamoto 	{ 0x15,	0x0,	0x15 },
    217       1.4  sakamoto 	{ 0x15,	0x0,	0x3f },
    218       1.4  sakamoto 	{ 0x15,	0x2a,	0x15 },
    219       1.4  sakamoto 	{ 0x15,	0x2a,	0x3f },
    220       1.4  sakamoto 	{ 0x3f,	0x0,	0x15 },
    221       1.4  sakamoto 	{ 0x3f,	0x0,	0x3f },
    222       1.4  sakamoto 	{ 0x3f,	0x2a,	0x15 },
    223       1.4  sakamoto 	{ 0x3f,	0x2a,	0x3f },
    224       1.4  sakamoto 	{ 0x15,	0x15,	0x0 },
    225       1.4  sakamoto 	{ 0x15,	0x15,	0x2a },
    226       1.4  sakamoto 	{ 0x15,	0x3f,	0x0 },
    227       1.4  sakamoto 	{ 0x15,	0x3f,	0x2a },
    228       1.4  sakamoto 	{ 0x3f,	0x15,	0x0 },
    229       1.4  sakamoto 	{ 0x3f,	0x15,	0x2a },
    230       1.4  sakamoto 	{ 0x3f,	0x3f,	0x0 },
    231       1.4  sakamoto 	{ 0x3f,	0x3f,	0x2a },
    232       1.4  sakamoto 	{ 0x15,	0x15,	0x15 },
    233       1.4  sakamoto 	{ 0x15,	0x15,	0x3f },
    234       1.4  sakamoto 	{ 0x15,	0x3f,	0x15 },
    235       1.4  sakamoto 	{ 0x15,	0x3f,	0x3f },
    236       1.4  sakamoto 	{ 0x3f,	0x15,	0x15 },
    237       1.4  sakamoto 	{ 0x3f,	0x15,	0x3f },
    238       1.4  sakamoto 	{ 0x3f,	0x3f,	0x15 },
    239       1.4  sakamoto 	{ 0x3f,	0x3f,	0x3f },
    240       1.4  sakamoto 	{ 0x39,	0xc,	0x5 },
    241       1.4  sakamoto 	{ 0x15,	0x2c,	0xf },
    242       1.4  sakamoto 	{ 0x26,	0x10,	0x3d },
    243       1.4  sakamoto 	{ 0x29,	0x29,	0x38 },
    244       1.4  sakamoto 	{ 0x4,	0x1a,	0xe },
    245       1.4  sakamoto 	{ 0x2,	0x1e,	0x3a },
    246       1.4  sakamoto 	{ 0x3c,	0x25,	0x33 },
    247       1.4  sakamoto 	{ 0x3c,	0xc,	0x2c },
    248       1.4  sakamoto 	{ 0x3f,	0x3,	0x2b },
    249       1.4  sakamoto 	{ 0x1c,	0x9,	0x13 },
    250       1.4  sakamoto 	{ 0x25,	0x2a,	0x35 },
    251       1.4  sakamoto 	{ 0x1e,	0xa,	0x38 },
    252       1.4  sakamoto 	{ 0x24,	0x8,	0x3 },
    253       1.4  sakamoto 	{ 0x3,	0xe,	0x36 },
    254       1.4  sakamoto 	{ 0xc,	0x6,	0x2a },
    255       1.4  sakamoto 	{ 0x26,	0x3,	0x32 },
    256       1.4  sakamoto 	{ 0x5,	0x2f,	0x33 },
    257       1.4  sakamoto 	{ 0x3c,	0x35,	0x2f },
    258       1.4  sakamoto 	{ 0x2d,	0x26,	0x3e },
    259       1.4  sakamoto 	{ 0xd,	0xa,	0x10 },
    260       1.4  sakamoto 	{ 0x25,	0x3c,	0x11 },
    261       1.4  sakamoto 	{ 0xd,	0x4,	0x2e },
    262       1.4  sakamoto 	{ 0x5,	0x19,	0x3e },
    263       1.4  sakamoto 	{ 0xc,	0x13,	0x34 },
    264       1.4  sakamoto 	{ 0x2b,	0x6,	0x24 },
    265       1.4  sakamoto 	{ 0x4,	0x3,	0xd },
    266       1.4  sakamoto 	{ 0x2f,	0x3c,	0xc },
    267       1.4  sakamoto 	{ 0x2a,	0x37,	0x1f },
    268       1.4  sakamoto 	{ 0xf,	0x12,	0x38 },
    269       1.4  sakamoto 	{ 0x38,	0xe,	0x2a },
    270       1.4  sakamoto 	{ 0x12,	0x2f,	0x19 },
    271       1.4  sakamoto 	{ 0x29,	0x2e,	0x31 },
    272       1.4  sakamoto 	{ 0x25,	0x13,	0x3e },
    273       1.4  sakamoto 	{ 0x33,	0x3e,	0x33 },
    274       1.4  sakamoto 	{ 0x1d,	0x2c,	0x25 },
    275       1.4  sakamoto 	{ 0x15,	0x15,	0x5 },
    276       1.4  sakamoto 	{ 0x32,	0x25,	0x39 },
    277       1.4  sakamoto 	{ 0x1a,	0x7,	0x1f },
    278       1.4  sakamoto 	{ 0x13,	0xe,	0x1d },
    279       1.4  sakamoto 	{ 0x36,	0x17,	0x34 },
    280       1.4  sakamoto 	{ 0xf,	0x15,	0x23 },
    281       1.4  sakamoto 	{ 0x2,	0x35,	0xd },
    282       1.4  sakamoto 	{ 0x15,	0x3f,	0xc },
    283       1.4  sakamoto 	{ 0x14,	0x2f,	0xf },
    284       1.4  sakamoto 	{ 0x19,	0x21,	0x3e },
    285       1.4  sakamoto 	{ 0x27,	0x11,	0x2f },
    286       1.4  sakamoto 	{ 0x38,	0x3f,	0x3c },
    287       1.4  sakamoto 	{ 0x36,	0x2d,	0x15 },
    288       1.4  sakamoto 	{ 0x16,	0x17,	0x2 },
    289       1.4  sakamoto 	{ 0x1,	0xa,	0x3d },
    290       1.4  sakamoto 	{ 0x1b,	0x11,	0x3f },
    291       1.4  sakamoto 	{ 0x21,	0x3c,	0xd },
    292       1.4  sakamoto 	{ 0x1a,	0x39,	0x3d },
    293       1.4  sakamoto 	{ 0x8,	0xe,	0xe },
    294       1.4  sakamoto 	{ 0x22,	0x21,	0x23 },
    295       1.4  sakamoto 	{ 0x1e,	0x30,	0x5 },
    296       1.4  sakamoto 	{ 0x1f,	0x22,	0x3d },
    297       1.4  sakamoto 	{ 0x1e,	0x2f,	0xa },
    298       1.4  sakamoto 	{ 0x0,	0x1c,	0xe },
    299       1.4  sakamoto 	{ 0x0,	0x1c,	0x15 },
    300       1.4  sakamoto 	{ 0x0,	0x1c,	0x1c },
    301       1.4  sakamoto 	{ 0x0,	0x15,	0x1c },
    302       1.4  sakamoto 	{ 0x0,	0xe,	0x1c },
    303       1.4  sakamoto 	{ 0x0,	0x7,	0x1c },
    304       1.4  sakamoto 	{ 0xe,	0xe,	0x1c },
    305       1.4  sakamoto 	{ 0x11,	0xe,	0x1c },
    306       1.4  sakamoto 	{ 0x15,	0xe,	0x1c },
    307       1.4  sakamoto 	{ 0x18,	0xe,	0x1c },
    308       1.4  sakamoto 	{ 0x1c,	0xe,	0x1c },
    309       1.4  sakamoto 	{ 0x1c,	0xe,	0x18 },
    310       1.4  sakamoto 	{ 0x1c,	0xe,	0x15 },
    311       1.4  sakamoto 	{ 0x1c,	0xe,	0x11 },
    312       1.4  sakamoto 	{ 0x1c,	0xe,	0xe },
    313       1.4  sakamoto 	{ 0x1c,	0x11,	0xe },
    314       1.4  sakamoto 	{ 0x1c,	0x15,	0xe },
    315       1.4  sakamoto 	{ 0x1c,	0x18,	0xe },
    316       1.4  sakamoto 	{ 0x1c,	0x1c,	0xe },
    317       1.4  sakamoto 	{ 0x18,	0x1c,	0xe },
    318       1.4  sakamoto 	{ 0x15,	0x1c,	0xe },
    319       1.4  sakamoto 	{ 0x11,	0x1c,	0xe },
    320       1.4  sakamoto 	{ 0xe,	0x1c,	0xe },
    321       1.4  sakamoto 	{ 0xe,	0x1c,	0x11 },
    322       1.4  sakamoto 	{ 0xe,	0x1c,	0x15 },
    323       1.4  sakamoto 	{ 0xe,	0x1c,	0x18 },
    324       1.4  sakamoto 	{ 0xe,	0x1c,	0x1c },
    325       1.4  sakamoto 	{ 0xe,	0x18,	0x1c },
    326       1.4  sakamoto 	{ 0xe,	0x15,	0x1c },
    327       1.4  sakamoto 	{ 0xe,	0x11,	0x1c },
    328       1.4  sakamoto 	{ 0x14,	0x14,	0x1c },
    329       1.4  sakamoto 	{ 0x16,	0x14,	0x1c },
    330       1.4  sakamoto 	{ 0x18,	0x14,	0x1c },
    331       1.4  sakamoto 	{ 0x1a,	0x14,	0x1c },
    332       1.4  sakamoto 	{ 0x1c,	0x14,	0x1c },
    333       1.4  sakamoto 	{ 0x1c,	0x14,	0x1a },
    334       1.4  sakamoto 	{ 0x1c,	0x14,	0x18 },
    335       1.4  sakamoto 	{ 0x1c,	0x14,	0x16 },
    336       1.4  sakamoto 	{ 0x1c,	0x14,	0x14 },
    337       1.4  sakamoto 	{ 0x1c,	0x16,	0x14 },
    338       1.4  sakamoto 	{ 0x1c,	0x18,	0x14 },
    339       1.4  sakamoto 	{ 0x1c,	0x1a,	0x14 },
    340       1.4  sakamoto 	{ 0x1c,	0x1c,	0x14 },
    341       1.4  sakamoto 	{ 0x1a,	0x1c,	0x14 },
    342       1.4  sakamoto 	{ 0x18,	0x1c,	0x14 },
    343       1.4  sakamoto 	{ 0x16,	0x1c,	0x14 },
    344       1.4  sakamoto 	{ 0x14,	0x1c,	0x14 },
    345       1.4  sakamoto 	{ 0x14,	0x1c,	0x16 },
    346       1.4  sakamoto 	{ 0x14,	0x1c,	0x18 },
    347       1.4  sakamoto 	{ 0x14,	0x1c,	0x1a },
    348       1.4  sakamoto 	{ 0x14,	0x1c,	0x1c },
    349       1.4  sakamoto 	{ 0x14,	0x1a,	0x1c },
    350       1.4  sakamoto 	{ 0x14,	0x18,	0x1c },
    351       1.4  sakamoto 	{ 0x14,	0x16,	0x1c },
    352       1.4  sakamoto 	{ 0x0,	0x0,	0x10 },
    353       1.4  sakamoto 	{ 0x4,	0x0,	0x10 },
    354       1.4  sakamoto 	{ 0x8,	0x0,	0x10 },
    355       1.4  sakamoto 	{ 0xc,	0x0,	0x10 },
    356       1.4  sakamoto 	{ 0x10,	0x0,	0x10 },
    357       1.4  sakamoto 	{ 0x10,	0x0,	0xc },
    358       1.4  sakamoto 	{ 0x10,	0x0,	0x8 },
    359       1.4  sakamoto 	{ 0x10,	0x0,	0x4 },
    360       1.4  sakamoto 	{ 0x10,	0x0,	0x0 },
    361       1.4  sakamoto 	{ 0x10,	0x4,	0x0 },
    362       1.4  sakamoto 	{ 0x10,	0x8,	0x0 },
    363       1.4  sakamoto 	{ 0x10,	0xc,	0x0 },
    364       1.4  sakamoto 	{ 0x10,	0x10,	0x0 },
    365       1.4  sakamoto 	{ 0xc,	0x10,	0x0 },
    366       1.4  sakamoto 	{ 0x8,	0x10,	0x0 },
    367       1.4  sakamoto 	{ 0x4,	0x10,	0x0 },
    368       1.4  sakamoto 	{ 0x0,	0x10,	0x0 },
    369       1.4  sakamoto 	{ 0x0,	0x10,	0x4 },
    370       1.4  sakamoto 	{ 0x0,	0x10,	0x8 },
    371       1.4  sakamoto 	{ 0x0,	0x10,	0xc },
    372       1.4  sakamoto 	{ 0x0,	0x10,	0x10 },
    373       1.4  sakamoto 	{ 0x0,	0xc,	0x10 },
    374       1.4  sakamoto 	{ 0x0,	0x8,	0x10 },
    375       1.4  sakamoto 	{ 0x0,	0x4,	0x10 },
    376       1.4  sakamoto 	{ 0x8,	0x8,	0x10 },
    377       1.4  sakamoto 	{ 0xa,	0x8,	0x10 },
    378       1.4  sakamoto 	{ 0xc,	0x8,	0x10 },
    379       1.4  sakamoto 	{ 0xe,	0x8,	0x10 },
    380       1.4  sakamoto 	{ 0x10,	0x8,	0x10 },
    381       1.4  sakamoto 	{ 0x10,	0x8,	0xe },
    382       1.4  sakamoto 	{ 0x10,	0x8,	0xc },
    383       1.4  sakamoto 	{ 0x10,	0x8,	0xa },
    384       1.4  sakamoto 	{ 0x10,	0x8,	0x8 },
    385       1.4  sakamoto 	{ 0x10,	0xa,	0x8 },
    386       1.4  sakamoto 	{ 0x10,	0xc,	0x8 },
    387       1.4  sakamoto 	{ 0x10,	0xe,	0x8 },
    388       1.4  sakamoto 	{ 0x10,	0x10,	0x8 },
    389       1.4  sakamoto 	{ 0xe,	0x10,	0x8 },
    390       1.4  sakamoto 	{ 0xc,	0x10,	0x8 },
    391       1.4  sakamoto 	{ 0xa,	0x10,	0x8 },
    392       1.4  sakamoto 	{ 0x8,	0x10,	0x8 },
    393       1.4  sakamoto 	{ 0x8,	0x10,	0xa },
    394       1.4  sakamoto 	{ 0x8,	0x10,	0xc },
    395       1.4  sakamoto 	{ 0x8,	0x10,	0xe },
    396       1.4  sakamoto 	{ 0x8,	0x10,	0x10 },
    397       1.4  sakamoto 	{ 0x8,	0xe,	0x10 },
    398       1.4  sakamoto 	{ 0x8,	0xc,	0x10 },
    399       1.4  sakamoto 	{ 0x8,	0xa,	0x10 },
    400       1.4  sakamoto 	{ 0xb,	0xb,	0x10 },
    401       1.4  sakamoto 	{ 0xc,	0xb,	0x10 },
    402       1.4  sakamoto 	{ 0xd,	0xb,	0x10 },
    403       1.4  sakamoto 	{ 0xf,	0xb,	0x10 },
    404       1.4  sakamoto 	{ 0x10,	0xb,	0x10 },
    405       1.4  sakamoto 	{ 0x10,	0xb,	0xf },
    406       1.4  sakamoto 	{ 0x10,	0xb,	0xd },
    407       1.4  sakamoto 	{ 0x10,	0xb,	0xc },
    408       1.4  sakamoto 	{ 0x10,	0xb,	0xb },
    409       1.4  sakamoto 	{ 0x10,	0xc,	0xb },
    410       1.4  sakamoto 	{ 0x10,	0xd,	0xb },
    411       1.4  sakamoto 	{ 0x10,	0xf,	0xb },
    412       1.4  sakamoto 	{ 0x10,	0x10,	0xb },
    413       1.4  sakamoto 	{ 0xf,	0x10,	0xb },
    414       1.4  sakamoto 	{ 0xd,	0x10,	0xb },
    415       1.4  sakamoto 	{ 0xc,	0x10,	0xb },
    416       1.4  sakamoto 	{ 0xb,	0x10,	0xb },
    417       1.4  sakamoto 	{ 0xb,	0x10,	0xc },
    418       1.4  sakamoto 	{ 0xb,	0x10,	0xd },
    419       1.4  sakamoto 	{ 0xb,	0x10,	0xf },
    420       1.4  sakamoto 	{ 0xb,	0x10,	0x10 },
    421       1.4  sakamoto 	{ 0xb,	0xf,	0x10 },
    422       1.4  sakamoto 	{ 0xb,	0xd,	0x10 },
    423       1.4  sakamoto 	{ 0xb,	0xc,	0x10 },
    424       1.4  sakamoto 	{ 0x0,	0x0,	0x0 },
    425       1.4  sakamoto 	{ 0x0,	0x0,	0x0 },
    426       1.4  sakamoto 	{ 0x0,	0x0,	0x0 },
    427       1.4  sakamoto 	{ 0x0,	0x0,	0x0 },
    428       1.4  sakamoto 	{ 0x0,	0x0,	0x0 },
    429       1.4  sakamoto 	{ 0x0,	0x0,	0x0 },
    430       1.4  sakamoto 	{ 0x0,	0x0,	0x0 },
    431       1.1  sakamoto };
    432       1.1  sakamoto 
    433       1.4  sakamoto u_char AC[21] = {
    434       1.5  junyoung 	0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x14, 0x07,
    435       1.5  junyoung 	0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F,
    436       1.4  sakamoto 	0x0C, 0x00, 0x0F, 0x08, 0x00
    437       1.4  sakamoto };
    438       1.1  sakamoto 
    439       1.5  junyoung void enablePCIvideo(int);
    440       1.5  junyoung static int scanPCI(void);
    441       1.5  junyoung static int PCIVendor(int);
    442       1.5  junyoung int delayLoop(int);
    443  1.10.2.1      yamt void writeAttr(u_char, u_char, u_char);
    444       1.5  junyoung void setTextRegs(struct VgaRegs *);
    445       1.5  junyoung void setTextCLUT(void);
    446       1.5  junyoung void loadFont(u_char *);
    447       1.5  junyoung void unlockS3(void);
    448       1.4  sakamoto #ifdef DEBUG
    449       1.5  junyoung static void printslots(void);
    450       1.4  sakamoto #endif
    451       1.1  sakamoto 
    452       1.4  sakamoto void
    453       1.5  junyoung vga_reset(u_char *ISA_mem)
    454       1.1  sakamoto {
    455       1.1  sakamoto 	int slot;
    456       1.1  sakamoto         struct VgaRegs *VgaTextRegs;
    457       1.1  sakamoto 
    458       1.1  sakamoto 	/* See if VGA already in TEXT mode - exit if so! */
    459       1.1  sakamoto 	outb(0x3CE, 0x06);
    460       1.5  junyoung 	if ((inb(0x3CF) & 0x01) == 0)
    461       1.5  junyoung 		return;
    462       1.1  sakamoto 
    463       1.1  sakamoto 	/* If no VGA responding in text mode, then we have some work to do... */
    464       1.1  sakamoto 	slot = scanPCI();            	/* find video card in use  */
    465       1.1  sakamoto 	enablePCIvideo(slot);          	/* enable I/O to card      */
    466       1.1  sakamoto 
    467       1.1  sakamoto 	/*
    468       1.1  sakamoto          * Note: the PCI scanning code does not yet work correctly
    469       1.1  sakamoto          *       for non-Moto boxes, so the switch below only
    470       1.1  sakamoto          *       defaults to using an S3 card if it does not
    471       1.1  sakamoto          *       find a Cirrus card.
    472       1.1  sakamoto          *
    473       1.1  sakamoto          *       The only reason we need to scan the bus looking for
    474       1.1  sakamoto          *       a graphics card is so we could do the "enablePCIvideo(slot)"
    475       1.1  sakamoto          *       call above; it is needed because Moto's OpenFirmware
    476       1.1  sakamoto          *       disables I/O to the graphics adapter before it gives
    477       1.1  sakamoto          *       us control.                                       PEK'97
    478       1.1  sakamoto          */
    479       1.1  sakamoto 
    480       1.1  sakamoto 	switch (PCIVendor(slot)) {
    481       1.1  sakamoto 	default:			       /* Assume S3 */
    482       1.5  junyoung #if 0
    483       1.5  junyoung 	case S3Vendor:
    484       1.5  junyoung #endif
    485       1.5  junyoung 		unlockS3();
    486       1.1  sakamoto 		VgaTextRegs = S3TextRegs;
    487       1.1  sakamoto 		outw(0x3C4, 0x0120);           /* disable video              */
    488       1.1  sakamoto 		setTextRegs(VgaTextRegs);      /* initial register setup     */
    489       1.1  sakamoto 		setTextCLUT();                 /* load color lookup table    */
    490       1.1  sakamoto 		loadFont(ISA_mem);             /* load font                  */
    491       1.1  sakamoto 		setTextRegs(VgaTextRegs);      /* reload registers           */
    492       1.1  sakamoto 		outw(0x3C4, 0x0100);           /* re-enable video            */
    493       1.1  sakamoto 		outb(0x3c2, 0x63);  	       /* MISC */
    494       1.1  sakamoto 		outb(0x3c2, 0x67);  	       /* MISC */
    495       1.1  sakamoto 		break;
    496       1.1  sakamoto 
    497       1.5  junyoung 	case CirrusVendor:
    498       1.1  sakamoto 		VgaTextRegs = GenVgaTextRegs;
    499       1.1  sakamoto 		outw(0x3C4, 0x0612);	       /* unlock ext regs            */
    500       1.1  sakamoto 		outw(0x3C4, 0x0700);	       /* reset ext sequence mode    */
    501       1.1  sakamoto 		outw(0x3C4, 0x0120);           /* disable video              */
    502       1.1  sakamoto 		setTextRegs(VgaTextRegs);      /* initial register setup     */
    503       1.1  sakamoto 		setTextCLUT();                 /* load color lookup table    */
    504       1.1  sakamoto 		loadFont(ISA_mem);             /* load font                  */
    505       1.1  sakamoto 		setTextRegs(VgaTextRegs);      /* reload registers           */
    506       1.1  sakamoto 		outw(0x3C4, 0x0100);           /* re-enable video            */
    507       1.1  sakamoto 		outb(0x3c2, 0x63);  	       /* MISC */
    508       1.1  sakamoto 		break;
    509       1.1  sakamoto 
    510       1.5  junyoung         case DiamondVendor:
    511       1.5  junyoung         case MatroxVendor:
    512       1.1  sakamoto 	  /*
    513       1.1  sakamoto            * The following code is almost enuf to get the Matrox
    514       1.1  sakamoto            * working (on a Moto box) but the video is not stable.
    515       1.1  sakamoto            * We probably need to tweak the TVP3026 Video PLL regs.   PEK'97
    516       1.1  sakamoto            */
    517       1.5  junyoung 		VgaTextRegs = GenVgaTextRegs;
    518       1.1  sakamoto 		outw(0x3C4, 0x0120);           /* disable video              */
    519       1.1  sakamoto 		setTextRegs(VgaTextRegs);      /* initial register setup     */
    520       1.1  sakamoto 		setTextCLUT();                 /* load color lookup table    */
    521       1.1  sakamoto 		loadFont(ISA_mem);             /* load font                  */
    522       1.1  sakamoto 		setTextRegs(VgaTextRegs);      /* reload registers           */
    523       1.1  sakamoto 		outw(0x3C4, 0x0100);           /* re-enable video            */
    524       1.1  sakamoto 		outb(0x3c2, 0x63);  	       /* MISC */
    525       1.5  junyoung 		delayLoop(1);
    526       1.5  junyoung 		break;
    527       1.1  sakamoto 	};
    528       1.1  sakamoto 
    529       1.1  sakamoto #ifdef DEBUG
    530       1.1  sakamoto 	printslots();
    531       1.5  junyoung 	delayLoop(5);
    532       1.1  sakamoto #endif
    533       1.1  sakamoto 	delayLoop(2);		/* give time for the video monitor to come up */
    534       1.1  sakamoto }
    535       1.1  sakamoto 
    536       1.1  sakamoto /*
    537       1.5  junyoung  * Write to VGA Attribute registers.
    538       1.1  sakamoto  */
    539       1.4  sakamoto void
    540       1.5  junyoung writeAttr(u_char index, u_char data, u_char videoOn)
    541       1.1  sakamoto {
    542       1.4  sakamoto 	u_char v;
    543       1.1  sakamoto 	v = inb(0x3da);   /* reset attr. address toggle */
    544       1.1  sakamoto 	if (videoOn)
    545       1.1  sakamoto 		outb(0x3c0, (index & 0x1F) | 0x20);
    546       1.1  sakamoto 	else
    547       1.1  sakamoto 		outb(0x3c0, (index & 0x1F));
    548       1.1  sakamoto 	outb(0x3c0, data);
    549       1.1  sakamoto }
    550       1.1  sakamoto 
    551       1.4  sakamoto void
    552       1.5  junyoung setTextRegs(struct VgaRegs *svp)
    553       1.1  sakamoto {
    554       1.1  sakamoto 	int i;
    555       1.1  sakamoto 
    556       1.1  sakamoto 	/*
    557       1.1  sakamoto 	 *  saved settings
    558       1.5  junyoung 	 */
    559       1.4  sakamoto 	while (svp->io_port != ENDMK) {
    560       1.1  sakamoto 		outb(svp->io_port,   svp->io_index);
    561       1.1  sakamoto 		outb(svp->io_port+1, svp->io_value);
    562       1.5  junyoung 		svp++;
    563       1.1  sakamoto 	}
    564       1.1  sakamoto 
    565       1.1  sakamoto 	outb(0x3c2, 0x67);  /* MISC */
    566       1.1  sakamoto 	outb(0x3c6, 0xff);  /* MASK */
    567       1.1  sakamoto 
    568       1.4  sakamoto 	for (i = 0; i < 0x10; i++)
    569       1.5  junyoung 		writeAttr(i, AC[i], 0);	/* pallete */
    570       1.5  junyoung 	writeAttr(0x10, 0x0c, 0);	/* text mode */
    571       1.5  junyoung 	writeAttr(0x11, 0x00, 0);	/* overscan color (border) */
    572       1.5  junyoung 	writeAttr(0x12, 0x0f, 0);	/* plane enable */
    573       1.5  junyoung 	writeAttr(0x13, 0x08, 0);	/* pixel panning */
    574       1.5  junyoung 	writeAttr(0x14, 0x00, 1);	/* color select; video on */
    575       1.1  sakamoto }
    576       1.1  sakamoto 
    577       1.4  sakamoto void
    578       1.5  junyoung setTextCLUT(void)
    579       1.1  sakamoto {
    580       1.1  sakamoto 	int i;
    581       1.1  sakamoto 
    582       1.5  junyoung 	outb(0x3C6, 0xFF);
    583       1.1  sakamoto 	i = inb(0x3C7);
    584       1.5  junyoung 	outb(0x3C8, 0);
    585       1.1  sakamoto 	i = inb(0x3C7);
    586       1.1  sakamoto 
    587       1.4  sakamoto 	for (i = 0; i < 256; i++) {
    588       1.1  sakamoto 		outb(0x3C9, TextCLUT[i].r);
    589       1.1  sakamoto 		outb(0x3C9, TextCLUT[i].g);
    590       1.1  sakamoto 		outb(0x3C9, TextCLUT[i].b);
    591       1.1  sakamoto 	}
    592       1.1  sakamoto }
    593       1.1  sakamoto 
    594       1.4  sakamoto void
    595       1.5  junyoung loadFont(u_char *ISA_mem)
    596       1.1  sakamoto {
    597       1.1  sakamoto 	int i, j;
    598       1.4  sakamoto 	u_char *font_page = (u_char *)&ISA_mem[0xA0000];
    599       1.5  junyoung 
    600       1.1  sakamoto 	outb(0x3C2, 0x67);
    601       1.5  junyoung 	/*
    602       1.5  junyoung 	 * Load font
    603       1.1  sakamoto 	 */
    604       1.5  junyoung 	i = inb(0x3DA);		/* Reset Attr toggle */
    605       1.1  sakamoto 
    606       1.5  junyoung 	outb(0x3C0,0x30);
    607       1.5  junyoung 	outb(0x3C0, 0x01);	/* graphics mode */
    608       1.1  sakamoto 
    609       1.5  junyoung 	outw(0x3C4, 0x0001);	/* reset sequencer */
    610       1.5  junyoung 	outw(0x3C4, 0x0204);	/* write to plane 2 */
    611       1.5  junyoung 	outw(0x3C4, 0x0406);	/* enable plane graphics */
    612       1.5  junyoung 	outw(0x3C4, 0x0003);	/* reset sequencer */
    613       1.5  junyoung 	outw(0x3CE, 0x0402);	/* read plane 2 */
    614       1.5  junyoung 	outw(0x3CE, 0x0500);	/* write mode 0, read mode 0 */
    615       1.5  junyoung 	outw(0x3CE, 0x0605);	/* set graphics mode */
    616       1.1  sakamoto 
    617       1.1  sakamoto 	for (i = 0;  i < sizeof(font);  i += 16) {
    618       1.1  sakamoto 		for (j = 0;  j < 16;  j++) {
    619       1.8     perry 			__asm volatile("eieio");
    620       1.1  sakamoto 			font_page[(2*i)+j] = font[i+j];
    621       1.1  sakamoto 		}
    622       1.1  sakamoto 	}
    623       1.1  sakamoto }
    624       1.1  sakamoto 
    625       1.1  sakamoto void
    626       1.5  junyoung unlockS3(void)
    627       1.1  sakamoto {
    628       1.1  sakamoto 	/* From the S3 manual */
    629       1.1  sakamoto 	outb(0x46E8, 0x10);  /* Put into setup mode */
    630       1.1  sakamoto 	outb(0x3C3, 0x10);
    631       1.1  sakamoto 	outb(0x102, 0x01);   /* Enable registers */
    632       1.1  sakamoto 	outb(0x46E8, 0x08);  /* Enable video */
    633       1.1  sakamoto 	outb(0x3C3, 0x08);
    634       1.1  sakamoto 	outb(0x4AE8, 0x00);
    635       1.1  sakamoto 
    636       1.1  sakamoto 	outb(0x42E8, 0x80);  /* Reset graphics engine? */
    637       1.1  sakamoto 
    638       1.1  sakamoto 	outb(0x3D4, 0x38);  /* Unlock all registers */
    639       1.1  sakamoto 	outb(0x3D5, 0x48);
    640       1.1  sakamoto 	outb(0x3D4, 0x39);
    641       1.1  sakamoto 	outb(0x3D5, 0xA5);
    642       1.1  sakamoto 	outb(0x3D4, 0x40);
    643       1.1  sakamoto 	outb(0x3D5, inb(0x3D5)|0x01);
    644       1.1  sakamoto 	outb(0x3D4, 0x33);
    645       1.1  sakamoto 	outb(0x3D5, inb(0x3D5)&~0x52);
    646       1.1  sakamoto 	outb(0x3D4, 0x35);
    647       1.1  sakamoto 	outb(0x3D5, inb(0x3D5)&~0x30);
    648       1.1  sakamoto 	outb(0x3D4, 0x3A);
    649       1.1  sakamoto 	outb(0x3D5, 0x00);
    650       1.1  sakamoto 	outb(0x3D4, 0x53);
    651       1.1  sakamoto 	outb(0x3D5, 0x00);
    652       1.1  sakamoto 	outb(0x3D4, 0x31);
    653       1.1  sakamoto 	outb(0x3D5, inb(0x3D5)&~0x4B);
    654       1.1  sakamoto 	outb(0x3D4, 0x58);
    655       1.1  sakamoto 
    656       1.1  sakamoto 	outb(0x3D5, 0);
    657       1.1  sakamoto 
    658       1.1  sakamoto 	outb(0x3D4, 0x54);
    659       1.1  sakamoto 	outb(0x3D5, 0x38);
    660       1.1  sakamoto 	outb(0x3D4, 0x60);
    661       1.1  sakamoto 	outb(0x3D5, 0x07);
    662       1.1  sakamoto 	outb(0x3D4, 0x61);
    663       1.1  sakamoto 	outb(0x3D5, 0x80);
    664       1.1  sakamoto 	outb(0x3D4, 0x62);
    665       1.1  sakamoto 	outb(0x3D5, 0xA1);
    666       1.1  sakamoto 	outb(0x3D4, 0x69);  /* High order bits for cursor address */
    667       1.1  sakamoto 	outb(0x3D5, 0);
    668       1.5  junyoung 
    669       1.1  sakamoto 	outb(0x3D4, 0x32);
    670       1.1  sakamoto 	outb(0x3D5, inb(0x3D5)&~0x10);
    671       1.1  sakamoto }
    672       1.1  sakamoto 
    673       1.1  sakamoto /* ============ */
    674       1.1  sakamoto 
    675       1.1  sakamoto 
    676  1.10.2.1      yamt #define NSLOTS 5
    677       1.1  sakamoto #define NPCIREGS  5
    678       1.1  sakamoto 
    679       1.4  sakamoto /*
    680       1.5  junyoung  * should use devfunc number/indirect method to be totally safe on
    681       1.4  sakamoto  * all machines, this works for now on 3 slot Moto boxes
    682       1.1  sakamoto  */
    683       1.1  sakamoto 
    684       1.1  sakamoto struct PCI_ConfigInfo {
    685       1.4  sakamoto 	u_long * config_addr;
    686       1.4  sakamoto 	u_long regs[NPCIREGS];
    687       1.1  sakamoto } PCI_slots [NSLOTS] = {
    688  1.10.2.1      yamt 	{ (u_long *)0x80800800, { 0xDE, 0xAD, 0xBE, 0xEF } },
    689  1.10.2.1      yamt 	{ (u_long *)0x80801000, { 0xDE, 0xAD, 0xBE, 0xEF } },
    690       1.4  sakamoto 	{ (u_long *)0x80802000, { 0xDE, 0xAD, 0xBE, 0xEF } },
    691       1.4  sakamoto 	{ (u_long *)0x80804000, { 0xDE, 0xAD, 0xBE, 0xEF } },
    692       1.4  sakamoto 	{ (u_long *)0x80808000, { 0xDE, 0xAD, 0xBE, 0xEF } },
    693       1.1  sakamoto };
    694       1.1  sakamoto 
    695       1.1  sakamoto 
    696       1.1  sakamoto /*
    697       1.1  sakamoto  * The following code modifies the PCI Command register
    698       1.5  junyoung  * to enable memory and I/O accesses.
    699       1.5  junyoung  */
    700       1.4  sakamoto void
    701       1.5  junyoung enablePCIvideo(int slot)
    702       1.1  sakamoto {
    703  1.10.2.1      yamt 	volatile u_char *ppci;
    704       1.1  sakamoto 
    705  1.10.2.1      yamt 	ppci = (u_char *)PCI_slots[slot].config_addr;
    706  1.10.2.1      yamt 	ppci[4] = 0x0003;	/* enable memory and I/O accesses */
    707       1.8     perry 	__asm volatile("eieio");
    708       1.1  sakamoto 
    709       1.1  sakamoto 	outb(0x3d4, 0x11);
    710  1.10.2.1      yamt 	outb(0x3d5, 0x0e);	/* unlock CR0-CR7 */
    711       1.1  sakamoto }
    712       1.1  sakamoto 
    713       1.1  sakamoto #define DEVID   0
    714       1.1  sakamoto #define CMD     1
    715       1.1  sakamoto #define CLASS   2
    716       1.1  sakamoto #define MEMBASE 4
    717       1.1  sakamoto 
    718       1.1  sakamoto int
    719       1.5  junyoung scanPCI(void)
    720       1.1  sakamoto {
    721       1.1  sakamoto 	int slt, r;
    722       1.1  sakamoto 	struct PCI_ConfigInfo *pslot;
    723       1.1  sakamoto 	int theSlot = -1;
    724       1.1  sakamoto 	int highVgaSlot = -1;
    725       1.1  sakamoto 
    726       1.4  sakamoto 	for (slt = 0; slt < NSLOTS; slt++) {
    727       1.1  sakamoto 		pslot = &PCI_slots[slt];
    728       1.4  sakamoto 		for (r = 0; r < NPCIREGS; r++) {
    729       1.2  sakamoto 			pslot->regs[r] = bswap32(pslot->config_addr[r]);
    730       1.1  sakamoto 		}
    731       1.1  sakamoto 
    732       1.4  sakamoto 		if (pslot->regs[DEVID] != 0xFFFFFFFF) {     /* card in slot ? */
    733       1.4  sakamoto 			if ((pslot->regs[CLASS] & 0xFFFFFF00) == 0x03000000) { /* VGA ? */
    734       1.1  sakamoto 				highVgaSlot = slt;
    735       1.4  sakamoto 				if ((pslot->regs[CMD] & 0x03)) { /* did firmware enable it ? */
    736       1.1  sakamoto 					theSlot = slt;
    737       1.1  sakamoto 				}
    738       1.1  sakamoto 			}
    739       1.1  sakamoto 		}
    740       1.1  sakamoto 	}
    741       1.1  sakamoto 
    742       1.4  sakamoto 	if (theSlot == -1)
    743       1.1  sakamoto 		theSlot = highVgaSlot;
    744       1.1  sakamoto 
    745       1.5  junyoung 	return theSlot;
    746       1.1  sakamoto }
    747       1.1  sakamoto 
    748       1.1  sakamoto int
    749       1.5  junyoung delayLoop(int k)
    750       1.1  sakamoto {
    751       1.1  sakamoto 	volatile int a, b;
    752       1.1  sakamoto 	volatile int i, j;
    753       1.1  sakamoto 	a = 0;
    754       1.1  sakamoto 	do {
    755       1.4  sakamoto 		for (i = 0; i < 500; i++) {
    756       1.1  sakamoto 			b = i;
    757       1.4  sakamoto 			for (j = 0; j < 200; j++) {
    758       1.1  sakamoto 				a = b+j;
    759       1.1  sakamoto 			}
    760       1.1  sakamoto 		}
    761       1.1  sakamoto 	} while (k--);
    762       1.5  junyoung 	return a;
    763       1.1  sakamoto }
    764       1.1  sakamoto 
    765       1.1  sakamoto /* return Vendor ID of card in the slot */
    766       1.5  junyoung static int
    767       1.5  junyoung PCIVendor(int slotnum)
    768       1.1  sakamoto {
    769       1.1  sakamoto 	struct PCI_ConfigInfo *pslot;
    770       1.1  sakamoto 
    771       1.1  sakamoto 	pslot = &PCI_slots[slotnum];
    772       1.1  sakamoto 
    773       1.1  sakamoto 	return (pslot->regs[DEVID] & 0xFFFF);
    774       1.1  sakamoto }
    775       1.1  sakamoto 
    776       1.4  sakamoto #ifdef DEBUG
    777       1.5  junyoung static void
    778       1.5  junyoung printslots(void)
    779       1.1  sakamoto {
    780       1.1  sakamoto 	int i;
    781       1.4  sakamoto 	for (i = 0; i < NSLOTS; i++) {
    782       1.4  sakamoto 		printf("PCI Slot number: %d", i);
    783      1.10  kiyohara 		printf(" Vendor ID: 0x%x\n", PCIVendor(i));
    784       1.1  sakamoto 	}
    785       1.1  sakamoto }
    786       1.4  sakamoto #endif /* DEBUG */
    787       1.1  sakamoto #endif /* CONS_VGA */
    788