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