summaryrefslogtreecommitdiffstats
path: root/tools/ddcprobe/vbe.c
diff options
context:
space:
mode:
authorMystery Man <unknown@mandriva.org>2003-11-21 12:53:39 +0000
committerMystery Man <unknown@mandriva.org>2003-11-21 12:53:39 +0000
commit7396369ef190a049b3a779a54edd76ff118f3c28 (patch)
tree20c2a6d7fcd96433d0d91b1460b5604a6d7267ce /tools/ddcprobe/vbe.c
parente41742b093fdb26bcae87e9d5b30d4d7bca93ea9 (diff)
downloaddrakx-backup-do-not-use-7396369ef190a049b3a779a54edd76ff118f3c28.tar
drakx-backup-do-not-use-7396369ef190a049b3a779a54edd76ff118f3c28.tar.gz
drakx-backup-do-not-use-7396369ef190a049b3a779a54edd76ff118f3c28.tar.bz2
drakx-backup-do-not-use-7396369ef190a049b3a779a54edd76ff118f3c28.tar.xz
drakx-backup-do-not-use-7396369ef190a049b3a779a54edd76ff118f3c28.zip
This commit was manufactured by cvs2svn to create tag 'MDK92-AMD64'.MDK92-AMD64
Diffstat (limited to 'tools/ddcprobe/vbe.c')
-rw-r--r--tools/ddcprobe/vbe.c353
1 files changed, 65 insertions, 288 deletions
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 <assert.h>
#include <limits.h>
#include <ctype.h>
+#include <fcntl.h>
+#include <unistd.h>
+#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(&regs, 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, &regs) == 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(&regs, 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, &regs) == 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(&regs, 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, &regs) == 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(&regs, 0, sizeof(regs));
- regs.eax = 0x4f02;
- regs.ebx = mode;
-
- /* Do it. */
- iopl(3);
- ioperm(0, 0x400, 1);
- LRMI_int(0x10, &regs);
-
- /* 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(&regs, 0, sizeof(regs));
- regs.eax = 0x4f04;
- regs.ecx = 0xffff;
- regs.edx = 0;
-
- iopl(3);
- ioperm(0, 0x400, 1);
-
- if(LRMI_int(0x10, &regs) == 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(&regs, 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, &regs) == 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(&regs, 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, &regs) == 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(&regs, 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, &regs) == 0) {
- LRMI_free_real(mem);
- return;
- }
-
- if((regs.eax & 0xffff) != 0x004f) {
- fprintf(stderr, "Get SuperVGA Video State Restore failed.\n");
- return;
- }
-}