1/* $NetBSD: biosvbe.S,v 1.3 2011/02/20 22:03:13 jakllsch Exp $ */ 2 3/*- 4 * Copyright (c) 2009 Jared D. McNeill <jmcneill@invisible.ca> 5 * All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 1. Redistributions of source code must retain the above copyright 11 * notice, this list of conditions and the following disclaimer. 12 * 2. Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 16 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 17 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 18 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 19 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 20 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 26 * POSSIBILITY OF SUCH DAMAGE. 27 */ 28 29#include <machine/asm.h> 30 31 .text 32 33/* 34 * VESA BIOS Extensions routines 35 */ 36 37/* 38 * Function 00h - Return VBE Controller Information 39 * 40 * int biosvbe_info(struct vbeinfoblock *) 41 * return: VBE call status 42 */ 43ENTRY(biosvbe_info) 44 pushl %ebp 45 movl %esp,%ebp 46 pushl %ebx 47 pushl %ecx 48 pushl %edx 49 push %esi 50 push %edi 51 52 movl 8(%ebp), %edi /* vbe info block address*/ 53 54 call _C_LABEL(prot_to_real) 55 .code16 56 57 push %es 58 59 push %di 60 shrl $4, %edi 61 mov %ds, %ax 62 add %di, %ax 63 mov %ax, %es 64 pop %di 65 and $0xf, %di /* mode info block address now in es:di */ 66 67 movw $0x4f00, %ax /* get vbe info block */ 68 int $0x10 69 70 pop %es 71 72 calll _C_LABEL(real_to_prot) 73 .code32 74 75 andl $0xffff,%eax 76 77 pop %edi 78 pop %esi 79 popl %edx 80 popl %ecx 81 popl %ebx 82 popl %ebp 83 ret 84 85/* 86 * Function 01h - Return VBE Mode Information 87 * 88 * int biosvbe_get_mode_info(int mode, struct modeinfoblock *mi) 89 * return: VBE call status 90 */ 91ENTRY(biosvbe_get_mode_info) 92 pushl %ebp 93 movl %esp,%ebp 94 pushl %ebx 95 pushl %ecx 96 pushl %edx 97 push %esi 98 push %edi 99 100 movl 8(%ebp), %ecx /* mode number */ 101 movl 12(%ebp), %edi /* mode info block address */ 102 103 call _C_LABEL(prot_to_real) 104 .code16 105 106 push %es 107 108 push %di 109 shrl $4, %edi 110 mov %ds, %ax 111 add %di, %ax 112 mov %ax, %es 113 pop %di 114 and $0xf, %di /* mode info block address now in es:di */ 115 116 movw $0x4f01, %ax /* get mode info block */ 117 int $0x10 118 119 pop %es 120 121 calll _C_LABEL(real_to_prot) 122 .code32 123 124 andl $0xffff,%eax 125 126 pop %edi 127 pop %esi 128 popl %edx 129 popl %ecx 130 popl %ebx 131 popl %ebp 132 ret 133 134/* 135 * Function 02h - Set VBE Mode 136 * 137 * int biosvbe_set_mode(int mode) 138 * return: VBE call status 139 */ 140ENTRY(biosvbe_set_mode) 141 pushl %ebp 142 movl %esp,%ebp 143 pushl %ebx 144 pushl %ecx 145 pushl %edx 146 push %esi 147 push %edi 148 149 movl 8(%ebp), %ebx /* mode number */ 150 orl $0x4000, %ebx 151 152 call _C_LABEL(prot_to_real) 153 .code16 154 155 movw $0x4f02, %ax /* set mode */ 156 int $0x10 157 158 calll _C_LABEL(real_to_prot) 159 .code32 160 161 andl $0xffff,%eax 162 163 pop %edi 164 pop %esi 165 popl %edx 166 popl %ecx 167 popl %ebx 168 popl %ebp 169 ret 170 171/* 172 * Function 08h - Set/Get DAC Palette Format 173 * 174 * int biosvbe_palette_format(int format) 175 * return: VBE call status 176 */ 177ENTRY(biosvbe_palette_format) 178 pushl %ebp 179 movl %esp,%ebp 180 pushl %ebx 181 pushl %ecx 182 pushl %edx 183 push %esi 184 push %edi 185 186 movl 8(%ebp), %ebx /* mode number */ 187 188 call _C_LABEL(prot_to_real) 189 .code16 190 191 movw $0x4f08, %ax /* get/set palette format */ 192 int $0x10 193 194 calll _C_LABEL(real_to_prot) 195 .code32 196 197 andl $0xffff,%eax 198 199 pop %edi 200 pop %esi 201 popl %edx 202 popl %ecx 203 popl %ebx 204 popl %ebp 205 ret 206 207/* 208 * Function 09h - Set/Get Palette Data 209 * 210 * int biosvbe_palette_data(int mode, int reg, struct paletteentry *) 211 * return: VBE call status 212 */ 213ENTRY(biosvbe_palette_data) 214 pushl %ebp 215 movl %esp,%ebp 216 pushl %ebx 217 pushl %ecx 218 pushl %edx 219 push %esi 220 push %edi 221 222 movl 8(%ebp), %ebx /* mode number */ 223 movl 12(%ebp), %edx /* register */ 224 movl 16(%ebp), %edi /* palette entry address */ 225 movl $1, %ecx /* # palette entries to update */ 226 227 call _C_LABEL(prot_to_real) 228 .code16 229 230 push %es 231 232 push %di 233 shrl $4, %edi 234 mov %ds, %ax 235 add %di, %ax 236 mov %ax, %es 237 pop %di 238 and $0xf, %di /* palette entry address now in es:di */ 239 240 movw $0x4f09, %ax /* get/set palette entry */ 241 int $0x10 242 243 pop %es 244 245 calll _C_LABEL(real_to_prot) 246 .code32 247 248 andl $0xffff,%eax 249 250 pop %edi 251 pop %esi 252 popl %edx 253 popl %ecx 254 popl %ebx 255 popl %ebp 256 ret 257 258/* 259 * Function 15h BL=00h - Report VBE/DDC Capabilities 260 * 261 * int biosvbe_ddc_caps(void) 262 * return: VBE/DDC capabilities 263 */ 264ENTRY(biosvbe_ddc_caps) 265 pushl %ebp 266 movl %esp,%ebp 267 pushl %ebx 268 pushl %ecx 269 pushl %edx 270 push %esi 271 push %edi 272 273 call _C_LABEL(prot_to_real) 274 .code16 275 276 pushw %es 277 278 xorw %di, %di 279 movw %di, %es /* es:di == 0:0 */ 280 281 movw $0x4f15, %ax /* display identification extensions */ 282 mov $0x00, %bx /* report DDC capabilities */ 283 mov $0x00, %cx /* controller unit number (00h = primary) */ 284 int $0x10 285 286 popw %es 287 288 calll _C_LABEL(real_to_prot) 289 .code32 290 291 movl %eax,%ecx 292 movl $0x0000,%eax 293 andl $0xffff,%ecx 294 cmpl $0x004f,%ecx 295 jne 1f 296 andl $0xffff,%ebx 297 movl %ebx,%eax 2981: 299 300 pop %edi 301 pop %esi 302 popl %edx 303 popl %ecx 304 popl %ebx 305 popl %ebp 306 ret 307 308/* 309 * Function 15h BL=01h - Read EDID 310 * 311 * int biosvbe_ddc_read_edid(int blockno, void *buf) 312 * return: VBE call status 313 */ 314ENTRY(biosvbe_ddc_read_edid) 315 pushl %ebp 316 movl %esp,%ebp 317 pushl %ebx 318 pushl %ecx 319 pushl %edx 320 push %esi 321 push %edi 322 323 movl 8(%ebp), %edx /* EDID block number */ 324 movl 12(%ebp), %edi /* EDID block address */ 325 326 call _C_LABEL(prot_to_real) 327 .code16 328 329 push %es 330 331 push %di 332 shrl $4, %edi 333 mov %ds, %ax 334 add %di, %ax 335 mov %ax, %es 336 pop %di 337 and $0xf, %di /* EDID block address now in es:di */ 338 339 movw $0x4f15, %ax /* display identification extensions */ 340 mov $0x01, %bx /* read EDID */ 341 mov $0x00, %cx /* controller unit number (00h = primary) */ 342 int $0x10 343 344 pop %es 345 346 calll _C_LABEL(real_to_prot) 347 .code32 348 349 andl $0xffff,%eax 350 351 pop %edi 352 pop %esi 353 popl %edx 354 popl %ecx 355 popl %ebx 356 popl %ebp 357 ret 358 359