Home | History | Annotate | Line # | Download | only in boot
vreset.c revision 1.10
      1  1.10  kiyohara /*	$NetBSD: vreset.c,v 1.10 2008/03/26 15:09:50 kiyohara 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.5  junyoung 		delayLoop(1);
    532   1.5  junyoung 		break;
    533   1.1  sakamoto 	};
    534   1.1  sakamoto 
    535   1.1  sakamoto #ifdef DEBUG
    536   1.1  sakamoto 	printslots();
    537   1.5  junyoung 	delayLoop(5);
    538   1.1  sakamoto #endif
    539   1.1  sakamoto 	delayLoop(2);		/* give time for the video monitor to come up */
    540   1.1  sakamoto }
    541   1.1  sakamoto 
    542   1.1  sakamoto /*
    543   1.5  junyoung  * Write to VGA Attribute registers.
    544   1.1  sakamoto  */
    545   1.4  sakamoto void
    546   1.5  junyoung writeAttr(u_char index, u_char data, u_char videoOn)
    547   1.1  sakamoto {
    548   1.4  sakamoto 	u_char v;
    549   1.1  sakamoto 	v = inb(0x3da);   /* reset attr. address toggle */
    550   1.1  sakamoto 	if (videoOn)
    551   1.1  sakamoto 		outb(0x3c0, (index & 0x1F) | 0x20);
    552   1.1  sakamoto 	else
    553   1.1  sakamoto 		outb(0x3c0, (index & 0x1F));
    554   1.1  sakamoto 	outb(0x3c0, data);
    555   1.1  sakamoto }
    556   1.1  sakamoto 
    557   1.4  sakamoto void
    558   1.5  junyoung setTextRegs(struct VgaRegs *svp)
    559   1.1  sakamoto {
    560   1.1  sakamoto 	int i;
    561   1.1  sakamoto 
    562   1.1  sakamoto 	/*
    563   1.1  sakamoto 	 *  saved settings
    564   1.5  junyoung 	 */
    565   1.4  sakamoto 	while (svp->io_port != ENDMK) {
    566   1.1  sakamoto 		outb(svp->io_port,   svp->io_index);
    567   1.1  sakamoto 		outb(svp->io_port+1, svp->io_value);
    568   1.5  junyoung 		svp++;
    569   1.1  sakamoto 	}
    570   1.1  sakamoto 
    571   1.1  sakamoto 	outb(0x3c2, 0x67);  /* MISC */
    572   1.1  sakamoto 	outb(0x3c6, 0xff);  /* MASK */
    573   1.1  sakamoto 
    574   1.4  sakamoto 	for (i = 0; i < 0x10; i++)
    575   1.5  junyoung 		writeAttr(i, AC[i], 0);	/* pallete */
    576   1.5  junyoung 	writeAttr(0x10, 0x0c, 0);	/* text mode */
    577   1.5  junyoung 	writeAttr(0x11, 0x00, 0);	/* overscan color (border) */
    578   1.5  junyoung 	writeAttr(0x12, 0x0f, 0);	/* plane enable */
    579   1.5  junyoung 	writeAttr(0x13, 0x08, 0);	/* pixel panning */
    580   1.5  junyoung 	writeAttr(0x14, 0x00, 1);	/* color select; video on */
    581   1.1  sakamoto }
    582   1.1  sakamoto 
    583   1.4  sakamoto void
    584   1.5  junyoung setTextCLUT(void)
    585   1.1  sakamoto {
    586   1.1  sakamoto 	int i;
    587   1.1  sakamoto 
    588   1.5  junyoung 	outb(0x3C6, 0xFF);
    589   1.1  sakamoto 	i = inb(0x3C7);
    590   1.5  junyoung 	outb(0x3C8, 0);
    591   1.1  sakamoto 	i = inb(0x3C7);
    592   1.1  sakamoto 
    593   1.4  sakamoto 	for (i = 0; i < 256; i++) {
    594   1.1  sakamoto 		outb(0x3C9, TextCLUT[i].r);
    595   1.1  sakamoto 		outb(0x3C9, TextCLUT[i].g);
    596   1.1  sakamoto 		outb(0x3C9, TextCLUT[i].b);
    597   1.1  sakamoto 	}
    598   1.1  sakamoto }
    599   1.1  sakamoto 
    600   1.4  sakamoto void
    601   1.5  junyoung loadFont(u_char *ISA_mem)
    602   1.1  sakamoto {
    603   1.1  sakamoto 	int i, j;
    604   1.4  sakamoto 	u_char *font_page = (u_char *)&ISA_mem[0xA0000];
    605   1.5  junyoung 
    606   1.1  sakamoto 	outb(0x3C2, 0x67);
    607   1.5  junyoung 	/*
    608   1.5  junyoung 	 * Load font
    609   1.1  sakamoto 	 */
    610   1.5  junyoung 	i = inb(0x3DA);		/* Reset Attr toggle */
    611   1.1  sakamoto 
    612   1.5  junyoung 	outb(0x3C0,0x30);
    613   1.5  junyoung 	outb(0x3C0, 0x01);	/* graphics mode */
    614   1.1  sakamoto 
    615   1.5  junyoung 	outw(0x3C4, 0x0001);	/* reset sequencer */
    616   1.5  junyoung 	outw(0x3C4, 0x0204);	/* write to plane 2 */
    617   1.5  junyoung 	outw(0x3C4, 0x0406);	/* enable plane graphics */
    618   1.5  junyoung 	outw(0x3C4, 0x0003);	/* reset sequencer */
    619   1.5  junyoung 	outw(0x3CE, 0x0402);	/* read plane 2 */
    620   1.5  junyoung 	outw(0x3CE, 0x0500);	/* write mode 0, read mode 0 */
    621   1.5  junyoung 	outw(0x3CE, 0x0605);	/* set graphics mode */
    622   1.1  sakamoto 
    623   1.1  sakamoto 	for (i = 0;  i < sizeof(font);  i += 16) {
    624   1.1  sakamoto 		for (j = 0;  j < 16;  j++) {
    625   1.8     perry 			__asm volatile("eieio");
    626   1.1  sakamoto 			font_page[(2*i)+j] = font[i+j];
    627   1.1  sakamoto 		}
    628   1.1  sakamoto 	}
    629   1.1  sakamoto }
    630   1.1  sakamoto 
    631   1.1  sakamoto void
    632   1.5  junyoung unlockS3(void)
    633   1.1  sakamoto {
    634   1.1  sakamoto 	/* From the S3 manual */
    635   1.1  sakamoto 	outb(0x46E8, 0x10);  /* Put into setup mode */
    636   1.1  sakamoto 	outb(0x3C3, 0x10);
    637   1.1  sakamoto 	outb(0x102, 0x01);   /* Enable registers */
    638   1.1  sakamoto 	outb(0x46E8, 0x08);  /* Enable video */
    639   1.1  sakamoto 	outb(0x3C3, 0x08);
    640   1.1  sakamoto 	outb(0x4AE8, 0x00);
    641   1.1  sakamoto 
    642   1.1  sakamoto 	outb(0x42E8, 0x80);  /* Reset graphics engine? */
    643   1.1  sakamoto 
    644   1.1  sakamoto 	outb(0x3D4, 0x38);  /* Unlock all registers */
    645   1.1  sakamoto 	outb(0x3D5, 0x48);
    646   1.1  sakamoto 	outb(0x3D4, 0x39);
    647   1.1  sakamoto 	outb(0x3D5, 0xA5);
    648   1.1  sakamoto 	outb(0x3D4, 0x40);
    649   1.1  sakamoto 	outb(0x3D5, inb(0x3D5)|0x01);
    650   1.1  sakamoto 	outb(0x3D4, 0x33);
    651   1.1  sakamoto 	outb(0x3D5, inb(0x3D5)&~0x52);
    652   1.1  sakamoto 	outb(0x3D4, 0x35);
    653   1.1  sakamoto 	outb(0x3D5, inb(0x3D5)&~0x30);
    654   1.1  sakamoto 	outb(0x3D4, 0x3A);
    655   1.1  sakamoto 	outb(0x3D5, 0x00);
    656   1.1  sakamoto 	outb(0x3D4, 0x53);
    657   1.1  sakamoto 	outb(0x3D5, 0x00);
    658   1.1  sakamoto 	outb(0x3D4, 0x31);
    659   1.1  sakamoto 	outb(0x3D5, inb(0x3D5)&~0x4B);
    660   1.1  sakamoto 	outb(0x3D4, 0x58);
    661   1.1  sakamoto 
    662   1.1  sakamoto 	outb(0x3D5, 0);
    663   1.1  sakamoto 
    664   1.1  sakamoto 	outb(0x3D4, 0x54);
    665   1.1  sakamoto 	outb(0x3D5, 0x38);
    666   1.1  sakamoto 	outb(0x3D4, 0x60);
    667   1.1  sakamoto 	outb(0x3D5, 0x07);
    668   1.1  sakamoto 	outb(0x3D4, 0x61);
    669   1.1  sakamoto 	outb(0x3D5, 0x80);
    670   1.1  sakamoto 	outb(0x3D4, 0x62);
    671   1.1  sakamoto 	outb(0x3D5, 0xA1);
    672   1.1  sakamoto 	outb(0x3D4, 0x69);  /* High order bits for cursor address */
    673   1.1  sakamoto 	outb(0x3D5, 0);
    674   1.5  junyoung 
    675   1.1  sakamoto 	outb(0x3D4, 0x32);
    676   1.1  sakamoto 	outb(0x3D5, inb(0x3D5)&~0x10);
    677   1.1  sakamoto }
    678   1.1  sakamoto 
    679   1.1  sakamoto /* ============ */
    680   1.1  sakamoto 
    681   1.1  sakamoto 
    682   1.1  sakamoto #define NSLOTS 4
    683   1.1  sakamoto #define NPCIREGS  5
    684   1.1  sakamoto 
    685   1.4  sakamoto /*
    686   1.5  junyoung  * should use devfunc number/indirect method to be totally safe on
    687   1.4  sakamoto  * all machines, this works for now on 3 slot Moto boxes
    688   1.1  sakamoto  */
    689   1.1  sakamoto 
    690   1.1  sakamoto struct PCI_ConfigInfo {
    691   1.4  sakamoto 	u_long * config_addr;
    692   1.4  sakamoto 	u_long regs[NPCIREGS];
    693   1.1  sakamoto } PCI_slots [NSLOTS] = {
    694   1.4  sakamoto 	{ (u_long *)0x80802000, { 0xDE, 0xAD, 0xBE, 0xEF } },
    695   1.4  sakamoto 	{ (u_long *)0x80804000, { 0xDE, 0xAD, 0xBE, 0xEF } },
    696   1.4  sakamoto 	{ (u_long *)0x80808000, { 0xDE, 0xAD, 0xBE, 0xEF } },
    697   1.4  sakamoto 	{ (u_long *)0x80810000, { 0xDE, 0xAD, 0xBE, 0xEF } }
    698   1.1  sakamoto };
    699   1.1  sakamoto 
    700   1.1  sakamoto 
    701   1.1  sakamoto /*
    702   1.1  sakamoto  * The following code modifies the PCI Command register
    703   1.5  junyoung  * to enable memory and I/O accesses.
    704   1.5  junyoung  */
    705   1.4  sakamoto void
    706   1.5  junyoung enablePCIvideo(int slot)
    707   1.1  sakamoto {
    708   1.4  sakamoto        volatile u_char * ppci;
    709   1.1  sakamoto 
    710   1.4  sakamoto         ppci =  (u_char *)PCI_slots[slot].config_addr;
    711   1.1  sakamoto 	ppci[4] = 0x0003;         /* enable memory and I/O accesses */
    712   1.8     perry 	__asm volatile("eieio");
    713   1.1  sakamoto 
    714   1.1  sakamoto 	outb(0x3d4, 0x11);
    715   1.1  sakamoto 	outb(0x3d5, 0x0e);   /* unlock CR0-CR7 */
    716   1.1  sakamoto }
    717   1.1  sakamoto 
    718   1.1  sakamoto #define DEVID   0
    719   1.1  sakamoto #define CMD     1
    720   1.1  sakamoto #define CLASS   2
    721   1.1  sakamoto #define MEMBASE 4
    722   1.1  sakamoto 
    723   1.1  sakamoto int
    724   1.5  junyoung scanPCI(void)
    725   1.1  sakamoto {
    726   1.1  sakamoto 	int slt, r;
    727   1.1  sakamoto 	struct PCI_ConfigInfo *pslot;
    728   1.1  sakamoto 	int theSlot = -1;
    729   1.1  sakamoto 	int highVgaSlot = -1;
    730   1.1  sakamoto 
    731   1.4  sakamoto 	for (slt = 0; slt < NSLOTS; slt++) {
    732   1.1  sakamoto 		pslot = &PCI_slots[slt];
    733   1.4  sakamoto 		for (r = 0; r < NPCIREGS; r++) {
    734   1.2  sakamoto 			pslot->regs[r] = bswap32(pslot->config_addr[r]);
    735   1.1  sakamoto 		}
    736   1.1  sakamoto 
    737   1.4  sakamoto 		if (pslot->regs[DEVID] != 0xFFFFFFFF) {     /* card in slot ? */
    738   1.4  sakamoto 			if ((pslot->regs[CLASS] & 0xFFFFFF00) == 0x03000000) { /* VGA ? */
    739   1.1  sakamoto 				highVgaSlot = slt;
    740   1.4  sakamoto 				if ((pslot->regs[CMD] & 0x03)) { /* did firmware enable it ? */
    741   1.1  sakamoto 					theSlot = slt;
    742   1.1  sakamoto 				}
    743   1.1  sakamoto 			}
    744   1.1  sakamoto 		}
    745   1.1  sakamoto 	}
    746   1.1  sakamoto 
    747   1.4  sakamoto 	if (theSlot == -1)
    748   1.1  sakamoto 		theSlot = highVgaSlot;
    749   1.1  sakamoto 
    750   1.5  junyoung 	return theSlot;
    751   1.1  sakamoto }
    752   1.1  sakamoto 
    753   1.1  sakamoto int
    754   1.5  junyoung delayLoop(int k)
    755   1.1  sakamoto {
    756   1.1  sakamoto 	volatile int a, b;
    757   1.1  sakamoto 	volatile int i, j;
    758   1.1  sakamoto 	a = 0;
    759   1.1  sakamoto 	do {
    760   1.4  sakamoto 		for (i = 0; i < 500; i++) {
    761   1.1  sakamoto 			b = i;
    762   1.4  sakamoto 			for (j = 0; j < 200; j++) {
    763   1.1  sakamoto 				a = b+j;
    764   1.1  sakamoto 			}
    765   1.1  sakamoto 		}
    766   1.1  sakamoto 	} while (k--);
    767   1.5  junyoung 	return a;
    768   1.1  sakamoto }
    769   1.1  sakamoto 
    770   1.1  sakamoto /* return Vendor ID of card in the slot */
    771   1.5  junyoung static int
    772   1.5  junyoung PCIVendor(int slotnum)
    773   1.1  sakamoto {
    774   1.1  sakamoto 	struct PCI_ConfigInfo *pslot;
    775   1.1  sakamoto 
    776   1.1  sakamoto 	pslot = &PCI_slots[slotnum];
    777   1.1  sakamoto 
    778   1.1  sakamoto 	return (pslot->regs[DEVID] & 0xFFFF);
    779   1.1  sakamoto }
    780   1.1  sakamoto 
    781   1.4  sakamoto #ifdef DEBUG
    782   1.5  junyoung static void
    783   1.5  junyoung printslots(void)
    784   1.1  sakamoto {
    785   1.1  sakamoto 	int i;
    786   1.4  sakamoto 	for (i = 0; i < NSLOTS; i++) {
    787   1.4  sakamoto 		printf("PCI Slot number: %d", i);
    788  1.10  kiyohara 		printf(" Vendor ID: 0x%x\n", PCIVendor(i));
    789   1.1  sakamoto 	}
    790   1.1  sakamoto }
    791   1.4  sakamoto #endif /* DEBUG */
    792   1.1  sakamoto #endif /* CONS_VGA */
    793