From 7396369ef190a049b3a779a54edd76ff118f3c28 Mon Sep 17 00:00:00 2001 From: Mystery Man Date: Fri, 21 Nov 2003 12:53:39 +0000 Subject: This commit was manufactured by cvs2svn to create tag 'MDK92-AMD64'. --- tools/ddcprobe/vbe.c | 353 ++++++++++----------------------------------------- 1 file changed, 65 insertions(+), 288 deletions(-) (limited to 'tools/ddcprobe/vbe.c') diff --git a/tools/ddcprobe/vbe.c b/tools/ddcprobe/vbe.c index a67e56d0b..7a5633c7e 100644 --- a/tools/ddcprobe/vbe.c +++ b/tools/ddcprobe/vbe.c @@ -8,69 +8,23 @@ #include #include #include +#include +#include +#if defined(__i386__) #include "lrmi.h" +#endif #include "vesamode.h" #include "vbe.h" -#ident "$Id$" -/* Return information about a particular video mode. */ -struct vbe_mode_info *vbe_get_mode_info(u_int16_t mode) +/* Get VBE info. */ +static void normalize_addr(vbe_addr_t *paddr) { - struct LRMI_regs regs; - char *mem; - struct vbe_mode_info *ret = NULL; - - /* Initialize LRMI. */ - if(LRMI_init() == 0) { - return NULL; - } - - /* Allocate a chunk of memory. */ - mem = LRMI_alloc_real(sizeof(struct vbe_mode_info)); - if(mem == NULL) { - return NULL; - } - memset(mem, 0, sizeof(struct vbe_mode_info)); - - memset(®s, 0, sizeof(regs)); - regs.eax = 0x4f01; - regs.ecx = mode; - regs.es = ((u_int32_t)mem) >> 4; - regs.edi = ((u_int32_t)mem) & 0x0f; - - /* Do it. */ - iopl(3); - ioperm(0, 0x400, 1); - - if(LRMI_int(0x10, ®s) == 0) { - LRMI_free_real(mem); - return NULL; - } - - /* Check for successful return. */ - if((regs.eax & 0xffff) != 0x004f) { - LRMI_free_real(mem); - return NULL; - } - - /* Get memory for return. */ - ret = malloc(sizeof(struct vbe_mode_info)); - if(ret == NULL) { - LRMI_free_real(mem); - return NULL; - } - - /* Copy the buffer for return. */ - memcpy(ret, mem, sizeof(struct vbe_mode_info)); - - /* Clean up and return. */ - LRMI_free_real(mem); - return ret; + paddr->base = (paddr->addr.seg << 4) + paddr->addr.ofs; } -/* Get VBE info. */ struct vbe_info *vbe_get_vbe_info() { +#if defined(__i386__) struct LRMI_regs regs; unsigned char *mem; struct vbe_info *ret = NULL; @@ -119,101 +73,93 @@ struct vbe_info *vbe_get_vbe_info() memcpy(ret, mem, sizeof(struct vbe_info)); /* Set up pointers to usable memory. */ - ret->mode_list.list = (u_int16_t*) ((ret->mode_list.addr.seg << 4) + - (ret->mode_list.addr.ofs)); - ret->oem_name.string = (char*) ((ret->oem_name.addr.seg << 4) + - (ret->oem_name.addr.ofs)); + ret->mode_list.ptr = (u_int16_t*) ((ret->mode_list.addr.seg << 4) + + (ret->mode_list.addr.ofs)); + ret->oem_name.ptr = (char*) ((ret->oem_name.addr.seg << 4) + + (ret->oem_name.addr.ofs)); /* Snip, snip. */ - mem = strdup(ret->oem_name.string); /* leak */ + mem = strdup(ret->oem_name.ptr); /* leak */ while(((i = strlen(mem)) > 0) && isspace(mem[i - 1])) { mem[i - 1] = '\0'; } - ret->oem_name.string = mem; + ret->oem_name.ptr = mem; /* Set up pointers for VESA 3.0+ strings. */ if(ret->version[1] >= 3) { /* Vendor name. */ - ret->vendor_name.string = (char*) + ret->vendor_name.ptr = (char*) ((ret->vendor_name.addr.seg << 4) + (ret->vendor_name.addr.ofs)); - mem = strdup(ret->vendor_name.string); /* leak */ + mem = strdup(ret->vendor_name.ptr); /* leak */ while(((i = strlen(mem)) > 0) && isspace(mem[i - 1])) { mem[i - 1] = '\0'; } - ret->vendor_name.string = mem; + ret->vendor_name.ptr = mem; /* Product name. */ - ret->product_name.string = (char*) + ret->product_name.ptr = (char*) ((ret->product_name.addr.seg << 4) + (ret->product_name.addr.ofs)); - mem = strdup(ret->product_name.string); /* leak */ + mem = strdup(ret->product_name.ptr); /* leak */ while(((i = strlen(mem)) > 0) && isspace(mem[i - 1])) { mem[i - 1] = '\0'; } - ret->product_name.string = mem; + ret->product_name.ptr = mem; /* Product revision. */ - ret->product_revision.string = (char*) + ret->product_revision.ptr = (char*) ((ret->product_revision.addr.seg << 4) + (ret->product_revision.addr.ofs)); - mem = strdup(ret->product_revision.string); /* leak */ + mem = strdup(ret->product_revision.ptr); /* leak */ while(((i = strlen(mem)) > 0) && isspace(mem[i - 1])) { mem[i - 1] = '\0'; } - ret->product_revision.string = mem; + ret->product_revision.ptr = mem; } /* Cleanup. */ LRMI_free_real(mem); return ret; -} - -/* Check if EDID queries are suorted. */ -int vbe_get_edid_supported() -{ - struct LRMI_regs regs; - int ret = 0; +#endif +#if KERNEL_BOOT_INFO + int vbe_fd; - /* Initialize LRMI. */ - if(LRMI_init() == 0) { - return 0; - } + struct vbe_info *ret = NULL; + ret = malloc(sizeof(struct vbe_info)); + if (ret == NULL) + return NULL; - memset(®s, 0, sizeof(regs)); - regs.eax = 0x4f15; - regs.ebx = 0x0000; - regs.es = 0x3000; - regs.edi = 0x3000; + if ((vbe_fd = open(BOOT_VBE_INFO, O_RDONLY)) < 0) + return NULL; - /* Do it. */ - iopl(3); - ioperm(0, 0x400, 1); + if (read(vbe_fd, ret, VBE_BLOCK_SIZE) != VBE_BLOCK_SIZE) + return NULL; - if(LRMI_int(0x10, ®s) == 0) { - return 0; - } + close(vbe_fd); - /* Check for successful return. */ - if((regs.eax & 0xff) == 0x4f) { - /* Supported. */ - ret = 1; - } else { - /* Not supported. */ - ret = 0; + /* Set up pointers to usable memory. */ + normalize_addr(&ret->mode_list); + normalize_addr(&ret->oem_name); + if (ret->version[1] >= 3) { + normalize_addr(&ret->vendor_name); + normalize_addr(&ret->product_name); + normalize_addr(&ret->product_revision); } - /* Clean up and return. */ return ret; +#endif + return NULL; } /* Get EDID info. */ struct vbe_edid1_info *vbe_get_edid_info() { +#if defined(__i386__) struct LRMI_regs regs; unsigned char *mem; struct vbe_edid1_info *ret = NULL; @@ -276,62 +222,33 @@ struct vbe_edid1_info *vbe_get_edid_info() LRMI_free_real(mem); return ret; -} - -/* Figure out what the current video mode is. */ -int32_t vbe_get_mode() -{ - struct LRMI_regs regs; - int32_t ret = -1; +#endif +#if KERNEL_BOOT_INFO + int i, invalid, edid_fd; - /* Initialize LRMI. */ - if(LRMI_init() == 0) { - return -1; - } + struct vbe_edid1_info *ret = NULL; + ret = malloc(sizeof(struct vbe_edid1_info)); + if (ret == NULL) + return NULL; - memset(®s, 0, sizeof(regs)); - regs.eax = 0x4f03; + if ((edid_fd = open(BOOT_EDID_INFO, O_RDONLY)) < 0) + return NULL; - /* Do it. */ - iopl(3); - ioperm(0, 0x400, 1); + if (read(edid_fd, ret, EDID_BLOCK_SIZE) != EDID_BLOCK_SIZE) + return NULL; - if(LRMI_int(0x10, ®s) == 0) { - return -1; - } + close(edid_fd); - /* Save the returned value. */ - if((regs.eax & 0xffff) == 0x004f) { - ret = regs.ebx & 0xffff; - } else { - ret = -1; - } + /* Check that kernel could actually get something useful. */ + invalid = 1; + for (i = 0; invalid && i < 8; i++) + invalid = invalid && (ret->header[i] == EDID_INVALID); + if (invalid) + return NULL; - /* Clean up and return. */ return ret; -} - -/* Set the video mode. */ -void vbe_set_mode(u_int16_t mode) -{ - struct LRMI_regs regs; - - /* Initialize LRMI. */ - if(LRMI_init() == 0) { - return; - } - - memset(®s, 0, sizeof(regs)); - regs.eax = 0x4f02; - regs.ebx = mode; - - /* Do it. */ - iopl(3); - ioperm(0, 0x400, 1); - LRMI_int(0x10, ®s); - - /* Return. */ - return; +#endif + return NULL; } /* Just read ranges from the EDID. */ @@ -567,143 +484,3 @@ struct vbe_modeline *vbe_get_edid_modelines() return ret; } - -const void *vbe_save_svga_state() -{ - struct LRMI_regs regs; - unsigned char *mem; - u_int16_t block_size; - void *data; - - /* Initialize LRMI. */ - if(LRMI_init() == 0) { - return NULL; - } - - memset(®s, 0, sizeof(regs)); - regs.eax = 0x4f04; - regs.ecx = 0xffff; - regs.edx = 0; - - iopl(3); - ioperm(0, 0x400, 1); - - if(LRMI_int(0x10, ®s) == 0) { - return NULL; - } - - if((regs.eax & 0xff) != 0x4f) { - fprintf(stderr, "Get SuperVGA Video State not supported.\n"); - return NULL; - } - - if((regs.eax & 0xffff) != 0x004f) { - fprintf(stderr, "Get SuperVGA Video State Info failed.\n"); - return NULL; - } - - block_size = 64 * (regs.ebx & 0xffff); - - /* Allocate a chunk of memory. */ - mem = LRMI_alloc_real(block_size); - if(mem == NULL) { - return NULL; - } - memset(mem, 0, sizeof(block_size)); - - memset(®s, 0, sizeof(regs)); - regs.eax = 0x4f04; - regs.ecx = 0x000f; - regs.edx = 0x0001; - regs.es = ((u_int32_t)mem) >> 4; - regs.ebx = ((u_int32_t)mem) & 0x0f; - memset(mem, 0, block_size); - iopl(3); - ioperm(0, 0x400, 1); - - if(LRMI_int(0x10, ®s) == 0) { - LRMI_free_real(mem); - return NULL; - } - - if((regs.eax & 0xffff) != 0x004f) { - fprintf(stderr, "Get SuperVGA Video State Save failed.\n"); - return NULL; - } - - data = malloc(block_size); - if(data == NULL) { - LRMI_free_real(mem); - return NULL; - } - - /* Clean up and return. */ - memcpy(data, mem, block_size); - LRMI_free_real(mem); - return data; -} - -void vbe_restore_svga_state(const void *state) -{ - struct LRMI_regs regs; - unsigned char *mem; - u_int16_t block_size; - - /* Initialize LRMI. */ - if(LRMI_init() == 0) { - return; - } - - memset(®s, 0, sizeof(regs)); - regs.eax = 0x4f04; - regs.ecx = 0x000f; - regs.edx = 0; - - /* Find out how much memory we need. */ - iopl(3); - ioperm(0, 0x400, 1); - - if(LRMI_int(0x10, ®s) == 0) { - return; - } - - if((regs.eax & 0xff) != 0x4f) { - fprintf(stderr, "Get SuperVGA Video State not supported.\n"); - return; - } - - if((regs.eax & 0xffff) != 0x004f) { - fprintf(stderr, "Get SuperVGA Video State Info failed.\n"); - return; - } - - block_size = 64 * (regs.ebx & 0xffff); - - /* Allocate a chunk of memory. */ - mem = LRMI_alloc_real(block_size); - if(mem == NULL) { - return; - } - memset(mem, 0, sizeof(block_size)); - - memset(®s, 0, sizeof(regs)); - regs.eax = 0x4f04; - regs.ecx = 0x000f; - regs.edx = 0x0002; - regs.es = 0x2000; - regs.ebx = 0x0000; - memcpy(mem, state, block_size); - - iopl(3); - ioperm(0, 0x400, 1); - - if(LRMI_int(0x10, ®s) == 0) { - LRMI_free_real(mem); - return; - } - - if((regs.eax & 0xffff) != 0x004f) { - fprintf(stderr, "Get SuperVGA Video State Restore failed.\n"); - return; - } -} -- cgit v1.2.1