Home | History | Annotate | Line # | Download | only in boot
vreset.c revision 1.9
      1  1.9       dsl /*	$NetBSD: vreset.c,v 1.9 2006/01/29 21:42:41 dsl 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.1  sakamoto #define S3Vendor     	0x5333
     71  1.1  sakamoto #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.5  junyoung void setTextRegs(struct VgaRegs *);
    444  1.5  junyoung void setTextCLUT(void);
    445  1.5  junyoung void loadFont(u_char *);
    446  1.5  junyoung void unlockS3(void);
    447  1.4  sakamoto #ifdef DEBUG
    448  1.5  junyoung static void printslots(void);
    449  1.4  sakamoto #endif
    450  1.1  sakamoto 
    451  1.4  sakamoto static inline void
    452  1.5  junyoung outw(int port, u_short val)
    453  1.1  sakamoto {
    454  1.1  sakamoto 	outb(port, val >> 8);
    455  1.1  sakamoto 	outb(port+1, val);
    456  1.1  sakamoto }
    457  1.5  junyoung 
    458  1.4  sakamoto void
    459  1.5  junyoung vga_reset(u_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.5  junyoung 	if ((inb(0x3CF) & 0x01) == 0)
    467  1.5  junyoung 		return;
    468  1.1  sakamoto 
    469  1.1  sakamoto 	/* If no VGA responding in text mode, then we have some work to do... */
    470  1.1  sakamoto 	slot = scanPCI();            	/* find video card in use  */
    471  1.1  sakamoto 	enablePCIvideo(slot);          	/* enable I/O to card      */
    472  1.1  sakamoto 
    473  1.1  sakamoto 	/*
    474  1.1  sakamoto          * Note: the PCI scanning code does not yet work correctly
    475  1.1  sakamoto          *       for non-Moto boxes, so the switch below only
    476  1.1  sakamoto          *       defaults to using an S3 card if it does not
    477  1.1  sakamoto          *       find a Cirrus card.
    478  1.1  sakamoto          *
    479  1.1  sakamoto          *       The only reason we need to scan the bus looking for
    480  1.1  sakamoto          *       a graphics card is so we could do the "enablePCIvideo(slot)"
    481  1.1  sakamoto          *       call above; it is needed because Moto's OpenFirmware
    482  1.1  sakamoto          *       disables I/O to the graphics adapter before it gives
    483  1.1  sakamoto          *       us control.                                       PEK'97
    484  1.1  sakamoto          */
    485  1.1  sakamoto 
    486  1.1  sakamoto 	switch (PCIVendor(slot)) {
    487  1.1  sakamoto 	default:			       /* Assume S3 */
    488  1.5  junyoung #if 0
    489  1.5  junyoung 	case S3Vendor:
    490  1.5  junyoung #endif
    491  1.5  junyoung 		unlockS3();
    492  1.1  sakamoto 		VgaTextRegs = S3TextRegs;
    493  1.1  sakamoto 		outw(0x3C4, 0x0120);           /* disable video              */
    494  1.1  sakamoto 		setTextRegs(VgaTextRegs);      /* initial register setup     */
    495  1.1  sakamoto 		setTextCLUT();                 /* load color lookup table    */
    496  1.1  sakamoto 		loadFont(ISA_mem);             /* load font                  */
    497  1.1  sakamoto 		setTextRegs(VgaTextRegs);      /* reload registers           */
    498  1.1  sakamoto 		outw(0x3C4, 0x0100);           /* re-enable video            */
    499  1.1  sakamoto 		outb(0x3c2, 0x63);  	       /* MISC */
    500  1.1  sakamoto 		outb(0x3c2, 0x67);  	       /* MISC */
    501  1.1  sakamoto 		break;
    502  1.1  sakamoto 
    503  1.5  junyoung 	case CirrusVendor:
    504  1.1  sakamoto 		VgaTextRegs = GenVgaTextRegs;
    505  1.1  sakamoto 		outw(0x3C4, 0x0612);	       /* unlock ext regs            */
    506  1.1  sakamoto 		outw(0x3C4, 0x0700);	       /* reset ext sequence mode    */
    507  1.1  sakamoto 		outw(0x3C4, 0x0120);           /* disable video              */
    508  1.1  sakamoto 		setTextRegs(VgaTextRegs);      /* initial register setup     */
    509  1.1  sakamoto 		setTextCLUT();                 /* load color lookup table    */
    510  1.1  sakamoto 		loadFont(ISA_mem);             /* load font                  */
    511  1.1  sakamoto 		setTextRegs(VgaTextRegs);      /* reload registers           */
    512  1.1  sakamoto 		outw(0x3C4, 0x0100);           /* re-enable video            */
    513  1.1  sakamoto 		outb(0x3c2, 0x63);  	       /* MISC */
    514  1.1  sakamoto 		break;
    515  1.1  sakamoto 
    516  1.5  junyoung         case DiamondVendor:
    517  1.5  junyoung         case MatroxVendor:
    518  1.1  sakamoto 	  /*
    519  1.1  sakamoto            * The following code is almost enuf to get the Matrox
    520  1.1  sakamoto            * working (on a Moto box) but the video is not stable.
    521  1.1  sakamoto            * We probably need to tweak the TVP3026 Video PLL regs.   PEK'97
    522  1.1  sakamoto            */
    523  1.5  junyoung 		VgaTextRegs = GenVgaTextRegs;
    524  1.1  sakamoto 		outw(0x3C4, 0x0120);           /* disable video              */
    525  1.1  sakamoto 		setTextRegs(VgaTextRegs);      /* initial register setup     */
    526  1.1  sakamoto 		setTextCLUT();                 /* load color lookup table    */
    527  1.1  sakamoto 		loadFont(ISA_mem);             /* load font                  */
    528  1.1  sakamoto 		setTextRegs(VgaTextRegs);      /* reload registers           */
    529  1.1  sakamoto 		outw(0x3C4, 0x0100);           /* re-enable video            */
    530  1.1  sakamoto 		outb(0x3c2, 0x63);  	       /* MISC */
    531  1.4  sakamoto 		printf("VGA Chip Vendor ID: 0x%08x\n", PCIVendor(slot));
    532  1.5  junyoung 		delayLoop(1);
    533  1.5  junyoung 		break;
    534  1.1  sakamoto 	};
    535  1.1  sakamoto 
    536  1.1  sakamoto #ifdef DEBUG
    537  1.1  sakamoto 	printslots();
    538  1.5  junyoung 	delayLoop(5);
    539  1.1  sakamoto #endif
    540  1.1  sakamoto 	delayLoop(2);		/* give time for the video monitor to come up */
    541  1.1  sakamoto }
    542  1.1  sakamoto 
    543  1.1  sakamoto /*
    544  1.5  junyoung  * Write to VGA Attribute registers.
    545  1.1  sakamoto  */
    546  1.4  sakamoto void
    547  1.5  junyoung writeAttr(u_char index, u_char data, u_char videoOn)
    548  1.1  sakamoto {
    549  1.4  sakamoto 	u_char v;
    550  1.1  sakamoto 	v = inb(0x3da);   /* reset attr. address toggle */
    551  1.1  sakamoto 	if (videoOn)
    552  1.1  sakamoto 		outb(0x3c0, (index & 0x1F) | 0x20);
    553  1.1  sakamoto 	else
    554  1.1  sakamoto 		outb(0x3c0, (index & 0x1F));
    555  1.1  sakamoto 	outb(0x3c0, data);
    556  1.1  sakamoto }
    557  1.1  sakamoto 
    558  1.4  sakamoto void
    559  1.5  junyoung setTextRegs(struct VgaRegs *svp)
    560  1.1  sakamoto {
    561  1.1  sakamoto 	int i;
    562  1.1  sakamoto 
    563  1.1  sakamoto 	/*
    564  1.1  sakamoto 	 *  saved settings
    565  1.5  junyoung 	 */
    566  1.4  sakamoto 	while (svp->io_port != ENDMK) {
    567  1.1  sakamoto 		outb(svp->io_port,   svp->io_index);
    568  1.1  sakamoto 		outb(svp->io_port+1, svp->io_value);
    569  1.5  junyoung 		svp++;
    570  1.1  sakamoto 	}
    571  1.1  sakamoto 
    572  1.1  sakamoto 	outb(0x3c2, 0x67);  /* MISC */
    573  1.1  sakamoto 	outb(0x3c6, 0xff);  /* MASK */
    574  1.1  sakamoto 
    575  1.4  sakamoto 	for (i = 0; i < 0x10; i++)
    576  1.5  junyoung 		writeAttr(i, AC[i], 0);	/* pallete */
    577  1.5  junyoung 	writeAttr(0x10, 0x0c, 0);	/* text mode */
    578  1.5  junyoung 	writeAttr(0x11, 0x00, 0);	/* overscan color (border) */
    579  1.5  junyoung 	writeAttr(0x12, 0x0f, 0);	/* plane enable */
    580  1.5  junyoung 	writeAttr(0x13, 0x08, 0);	/* pixel panning */
    581  1.5  junyoung 	writeAttr(0x14, 0x00, 1);	/* color select; video on */
    582  1.1  sakamoto }
    583  1.1  sakamoto 
    584  1.4  sakamoto void
    585  1.5  junyoung setTextCLUT(void)
    586  1.1  sakamoto {
    587  1.1  sakamoto 	int i;
    588  1.1  sakamoto 
    589  1.5  junyoung 	outb(0x3C6, 0xFF);
    590  1.1  sakamoto 	i = inb(0x3C7);
    591  1.5  junyoung 	outb(0x3C8, 0);
    592  1.1  sakamoto 	i = inb(0x3C7);
    593  1.1  sakamoto 
    594  1.4  sakamoto 	for (i = 0; i < 256; i++) {
    595  1.1  sakamoto 		outb(0x3C9, TextCLUT[i].r);
    596  1.1  sakamoto 		outb(0x3C9, TextCLUT[i].g);
    597  1.1  sakamoto 		outb(0x3C9, TextCLUT[i].b);
    598  1.1  sakamoto 	}
    599  1.1  sakamoto }
    600  1.1  sakamoto 
    601  1.4  sakamoto void
    602  1.5  junyoung loadFont(u_char *ISA_mem)
    603  1.1  sakamoto {
    604  1.1  sakamoto 	int i, j;
    605  1.4  sakamoto 	u_char *font_page = (u_char *)&ISA_mem[0xA0000];
    606  1.5  junyoung 
    607  1.1  sakamoto 	outb(0x3C2, 0x67);
    608  1.5  junyoung 	/*
    609  1.5  junyoung 	 * Load font
    610  1.1  sakamoto 	 */
    611  1.5  junyoung 	i = inb(0x3DA);		/* Reset Attr toggle */
    612  1.1  sakamoto 
    613  1.5  junyoung 	outb(0x3C0,0x30);
    614  1.5  junyoung 	outb(0x3C0, 0x01);	/* graphics mode */
    615  1.1  sakamoto 
    616  1.5  junyoung 	outw(0x3C4, 0x0001);	/* reset sequencer */
    617  1.5  junyoung 	outw(0x3C4, 0x0204);	/* write to plane 2 */
    618  1.5  junyoung 	outw(0x3C4, 0x0406);	/* enable plane graphics */
    619  1.5  junyoung 	outw(0x3C4, 0x0003);	/* reset sequencer */
    620  1.5  junyoung 	outw(0x3CE, 0x0402);	/* read plane 2 */
    621  1.5  junyoung 	outw(0x3CE, 0x0500);	/* write mode 0, read mode 0 */
    622  1.5  junyoung 	outw(0x3CE, 0x0605);	/* set graphics mode */
    623  1.1  sakamoto 
    624  1.1  sakamoto 	for (i = 0;  i < sizeof(font);  i += 16) {
    625  1.1  sakamoto 		for (j = 0;  j < 16;  j++) {
    626  1.8     perry 			__asm volatile("eieio");
    627  1.1  sakamoto 			font_page[(2*i)+j] = font[i+j];
    628  1.1  sakamoto 		}
    629  1.1  sakamoto 	}
    630  1.1  sakamoto }
    631  1.1  sakamoto 
    632  1.1  sakamoto void
    633  1.5  junyoung unlockS3(void)
    634  1.1  sakamoto {
    635  1.1  sakamoto 	/* From the S3 manual */
    636  1.1  sakamoto 	outb(0x46E8, 0x10);  /* Put into setup mode */
    637  1.1  sakamoto 	outb(0x3C3, 0x10);
    638  1.1  sakamoto 	outb(0x102, 0x01);   /* Enable registers */
    639  1.1  sakamoto 	outb(0x46E8, 0x08);  /* Enable video */
    640  1.1  sakamoto 	outb(0x3C3, 0x08);
    641  1.1  sakamoto 	outb(0x4AE8, 0x00);
    642  1.1  sakamoto 
    643  1.1  sakamoto 	outb(0x42E8, 0x80);  /* Reset graphics engine? */
    644  1.1  sakamoto 
    645  1.1  sakamoto 	outb(0x3D4, 0x38);  /* Unlock all registers */
    646  1.1  sakamoto 	outb(0x3D5, 0x48);
    647  1.1  sakamoto 	outb(0x3D4, 0x39);
    648  1.1  sakamoto 	outb(0x3D5, 0xA5);
    649  1.1  sakamoto 	outb(0x3D4, 0x40);
    650  1.1  sakamoto 	outb(0x3D5, inb(0x3D5)|0x01);
    651  1.1  sakamoto 	outb(0x3D4, 0x33);
    652  1.1  sakamoto 	outb(0x3D5, inb(0x3D5)&~0x52);
    653  1.1  sakamoto 	outb(0x3D4, 0x35);
    654  1.1  sakamoto 	outb(0x3D5, inb(0x3D5)&~0x30);
    655  1.1  sakamoto 	outb(0x3D4, 0x3A);
    656  1.1  sakamoto 	outb(0x3D5, 0x00);
    657  1.1  sakamoto 	outb(0x3D4, 0x53);
    658  1.1  sakamoto 	outb(0x3D5, 0x00);
    659  1.1  sakamoto 	outb(0x3D4, 0x31);
    660  1.1  sakamoto 	outb(0x3D5, inb(0x3D5)&~0x4B);
    661  1.1  sakamoto 	outb(0x3D4, 0x58);
    662  1.1  sakamoto 
    663  1.1  sakamoto 	outb(0x3D5, 0);
    664  1.1  sakamoto 
    665  1.1  sakamoto 	outb(0x3D4, 0x54);
    666  1.1  sakamoto 	outb(0x3D5, 0x38);
    667  1.1  sakamoto 	outb(0x3D4, 0x60);
    668  1.1  sakamoto 	outb(0x3D5, 0x07);
    669  1.1  sakamoto 	outb(0x3D4, 0x61);
    670  1.1  sakamoto 	outb(0x3D5, 0x80);
    671  1.1  sakamoto 	outb(0x3D4, 0x62);
    672  1.1  sakamoto 	outb(0x3D5, 0xA1);
    673  1.1  sakamoto 	outb(0x3D4, 0x69);  /* High order bits for cursor address */
    674  1.1  sakamoto 	outb(0x3D5, 0);
    675  1.5  junyoung 
    676  1.1  sakamoto 	outb(0x3D4, 0x32);
    677  1.1  sakamoto 	outb(0x3D5, inb(0x3D5)&~0x10);
    678  1.1  sakamoto }
    679  1.1  sakamoto 
    680  1.1  sakamoto /* ============ */
    681  1.1  sakamoto 
    682  1.1  sakamoto 
    683  1.1  sakamoto #define NSLOTS 4
    684  1.1  sakamoto #define NPCIREGS  5
    685  1.1  sakamoto 
    686  1.4  sakamoto /*
    687  1.5  junyoung  * should use devfunc number/indirect method to be totally safe on
    688  1.4  sakamoto  * all machines, this works for now on 3 slot Moto boxes
    689  1.1  sakamoto  */
    690  1.1  sakamoto 
    691  1.1  sakamoto struct PCI_ConfigInfo {
    692  1.4  sakamoto 	u_long * config_addr;
    693  1.4  sakamoto 	u_long regs[NPCIREGS];
    694  1.1  sakamoto } PCI_slots [NSLOTS] = {
    695  1.4  sakamoto 	{ (u_long *)0x80802000, { 0xDE, 0xAD, 0xBE, 0xEF } },
    696  1.4  sakamoto 	{ (u_long *)0x80804000, { 0xDE, 0xAD, 0xBE, 0xEF } },
    697  1.4  sakamoto 	{ (u_long *)0x80808000, { 0xDE, 0xAD, 0xBE, 0xEF } },
    698  1.4  sakamoto 	{ (u_long *)0x80810000, { 0xDE, 0xAD, 0xBE, 0xEF } }
    699  1.1  sakamoto };
    700  1.1  sakamoto 
    701  1.1  sakamoto 
    702  1.1  sakamoto /*
    703  1.1  sakamoto  * The following code modifies the PCI Command register
    704  1.5  junyoung  * to enable memory and I/O accesses.
    705  1.5  junyoung  */
    706  1.4  sakamoto void
    707  1.5  junyoung enablePCIvideo(int slot)
    708  1.1  sakamoto {
    709  1.4  sakamoto        volatile u_char * ppci;
    710  1.1  sakamoto 
    711  1.4  sakamoto         ppci =  (u_char *)PCI_slots[slot].config_addr;
    712  1.1  sakamoto 	ppci[4] = 0x0003;         /* enable memory and I/O accesses */
    713  1.8     perry 	__asm volatile("eieio");
    714  1.1  sakamoto 
    715  1.1  sakamoto 	outb(0x3d4, 0x11);
    716  1.1  sakamoto 	outb(0x3d5, 0x0e);   /* unlock CR0-CR7 */
    717  1.1  sakamoto }
    718  1.1  sakamoto 
    719  1.1  sakamoto #define DEVID   0
    720  1.1  sakamoto #define CMD     1
    721  1.1  sakamoto #define CLASS   2
    722  1.1  sakamoto #define MEMBASE 4
    723  1.1  sakamoto 
    724  1.1  sakamoto int
    725  1.5  junyoung scanPCI(void)
    726  1.1  sakamoto {
    727  1.1  sakamoto 	int slt, r;
    728  1.1  sakamoto 	struct PCI_ConfigInfo *pslot;
    729  1.1  sakamoto 	int theSlot = -1;
    730  1.1  sakamoto 	int highVgaSlot = -1;
    731  1.1  sakamoto 
    732  1.4  sakamoto 	for (slt = 0; slt < NSLOTS; slt++) {
    733  1.1  sakamoto 		pslot = &PCI_slots[slt];
    734  1.4  sakamoto 		for (r = 0; r < NPCIREGS; r++) {
    735  1.2  sakamoto 			pslot->regs[r] = bswap32(pslot->config_addr[r]);
    736  1.1  sakamoto 		}
    737  1.1  sakamoto 
    738  1.4  sakamoto 		if (pslot->regs[DEVID] != 0xFFFFFFFF) {     /* card in slot ? */
    739  1.4  sakamoto 			if ((pslot->regs[CLASS] & 0xFFFFFF00) == 0x03000000) { /* VGA ? */
    740  1.1  sakamoto 				highVgaSlot = slt;
    741  1.4  sakamoto 				if ((pslot->regs[CMD] & 0x03)) { /* did firmware enable it ? */
    742  1.1  sakamoto 					theSlot = slt;
    743  1.1  sakamoto 				}
    744  1.1  sakamoto 			}
    745  1.1  sakamoto 		}
    746  1.1  sakamoto 	}
    747  1.1  sakamoto 
    748  1.4  sakamoto 	if (theSlot == -1)
    749  1.1  sakamoto 		theSlot = highVgaSlot;
    750  1.1  sakamoto 
    751  1.5  junyoung 	return theSlot;
    752  1.1  sakamoto }
    753  1.1  sakamoto 
    754  1.1  sakamoto int
    755  1.5  junyoung delayLoop(int k)
    756  1.1  sakamoto {
    757  1.1  sakamoto 	volatile int a, b;
    758  1.1  sakamoto 	volatile int i, j;
    759  1.1  sakamoto 	a = 0;
    760  1.1  sakamoto 	do {
    761  1.4  sakamoto 		for (i = 0; i < 500; i++) {
    762  1.1  sakamoto 			b = i;
    763  1.4  sakamoto 			for (j = 0; j < 200; j++) {
    764  1.1  sakamoto 				a = b+j;
    765  1.1  sakamoto 			}
    766  1.1  sakamoto 		}
    767  1.1  sakamoto 	} while (k--);
    768  1.5  junyoung 	return a;
    769  1.1  sakamoto }
    770  1.1  sakamoto 
    771  1.1  sakamoto /* return Vendor ID of card in the slot */
    772  1.5  junyoung static int
    773  1.5  junyoung PCIVendor(int slotnum)
    774  1.1  sakamoto {
    775  1.1  sakamoto 	struct PCI_ConfigInfo *pslot;
    776  1.1  sakamoto 
    777  1.1  sakamoto 	pslot = &PCI_slots[slotnum];
    778  1.1  sakamoto 
    779  1.1  sakamoto 	return (pslot->regs[DEVID] & 0xFFFF);
    780  1.1  sakamoto }
    781  1.1  sakamoto 
    782  1.4  sakamoto #ifdef DEBUG
    783  1.5  junyoung static void
    784  1.5  junyoung printslots(void)
    785  1.1  sakamoto {
    786  1.1  sakamoto 	int i;
    787  1.4  sakamoto 	for (i = 0; i < NSLOTS; i++) {
    788  1.4  sakamoto 		printf("PCI Slot number: %d", i);
    789  1.4  sakamoto 		printf(" Vendor ID: 0x%08x\n", PCIVendor(i));
    790  1.1  sakamoto 	}
    791  1.1  sakamoto }
    792  1.4  sakamoto #endif /* DEBUG */
    793  1.1  sakamoto #endif /* CONS_VGA */
    794