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