1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21 22 /* 23 * Copyright 2007 Sun Microsystems, Inc. All rights reserved. 24 * Use is subject to license terms. 25 */ 26 27 #pragma ident "%Z%%M% %I% %E% SMI" 28 29 /* 30 * Miniature VGA driver for bootstrap. 31 */ 32 33 #include <sys/archsystm.h> 34 #include <sys/vgareg.h> 35 36 #include "boot_vga.h" 37 38 #if defined(_BOOT) 39 #include "../dboot/dboot_xboot.h" 40 #endif 41 42 #define VGA_COLOR_CRTC_INDEX 0x3d4 43 #define VGA_COLOR_CRTC_DATA 0x3d5 44 #define VGA_SCREEN ((unsigned short *)0xb8000) 45 46 static void vga_set_crtc(int index, unsigned char val); 47 static unsigned char vga_get_crtc(int index); 48 49 void 50 vga_clear(int color) 51 { 52 unsigned short val; 53 int i; 54 55 val = (color << 8) | ' '; 56 57 for (i = 0; i < VGA_TEXT_ROWS * VGA_TEXT_COLS; i++) { 58 VGA_SCREEN[i] = val; 59 } 60 } 61 62 void 63 vga_drawc(int c, int color) 64 { 65 int row; 66 int col; 67 68 vga_getpos(&row, &col); 69 VGA_SCREEN[row*VGA_TEXT_COLS + col] = (color << 8) | c; 70 } 71 72 void 73 vga_scroll(int color) 74 { 75 unsigned short val; 76 int i; 77 78 val = (color << 8) | ' '; 79 80 for (i = 0; i < (VGA_TEXT_ROWS-1)*VGA_TEXT_COLS; i++) { 81 VGA_SCREEN[i] = VGA_SCREEN[i + VGA_TEXT_COLS]; 82 } 83 for (; i < VGA_TEXT_ROWS * VGA_TEXT_COLS; i++) { 84 VGA_SCREEN[i] = val; 85 } 86 } 87 88 void 89 vga_setpos(int row, int col) 90 { 91 int off; 92 93 off = row * VGA_TEXT_COLS + col; 94 vga_set_crtc(VGA_CRTC_CLAH, off >> 8); 95 vga_set_crtc(VGA_CRTC_CLAL, off & 0xff); 96 } 97 98 void 99 vga_getpos(int *row, int *col) 100 { 101 int off; 102 103 off = (vga_get_crtc(VGA_CRTC_CLAH) << 8) + 104 vga_get_crtc(VGA_CRTC_CLAL); 105 *row = off / VGA_TEXT_COLS; 106 *col = off % VGA_TEXT_COLS; 107 } 108 109 static void 110 vga_set_crtc(int index, unsigned char val) 111 { 112 outb(VGA_COLOR_CRTC_INDEX, index); 113 outb(VGA_COLOR_CRTC_DATA, val); 114 } 115 116 117 static unsigned char 118 vga_get_crtc(int index) 119 { 120 outb(VGA_COLOR_CRTC_INDEX, index); 121 return (inb(VGA_COLOR_CRTC_DATA)); 122 } 123