--- i810switch.c.old 2004-08-09 17:05:59.000000000 +0900 +++ i810switch.c 2004-08-09 18:28:26.000000000 +0900 @@ -8,7 +8,7 @@ #include #include -#define CMD_LSPCI "lspci" +#define CMD_LSPCI "/usr/bin/lspci" static const char *Opt_lcd = NULL; static const char *Opt_crt = NULL; @@ -52,6 +52,8 @@ #define I830_DSPACTRL 0x70180 #define I830_DSPBCTRL 0x71180 +#define GRX 0x3ce + #define I810STR "8086:7121" #define I810ESTR "8086:7123" #define I810_DC100STR_1 "8086:7125" @@ -133,7 +135,7 @@ { struct i810_par par; unsigned long addr; - int i, crt = -1, lcd = -1, err = 0, count = 0, chiptype, len = 0; + int i, bios_init = 0, crt = -1, lcd = -1, err = 0, count = 0, chiptype, len = 0; FILE *pci_f; char *buff = NULL; char lspcistr[] = CMD_LSPCI " -v -d xxxx:xxxx"; @@ -143,7 +145,9 @@ while (--argc > 0) { argv++; - if (!strcmp(argv[0], "crt")) { + if (!strcmp(argv[0], "init")) { + bios_init = 1; + } else if (!strcmp(argv[0], "crt")) { if (--argc > 0) { argv++; if (!strcmp(argv[0], "on")) @@ -206,7 +210,7 @@ pclose(pci_f); memset(&par, 0, sizeof(struct i810_par)); - par.mem = open("/dev/mem", (crt+lcd == -2) ? O_RDONLY : O_RDWR); + par.mem = open("/dev/mem", ((crt+lcd == -2)&&(bios_init == 0)) ? O_RDONLY : O_RDWR); if (par.mem == -1) { i = errno; perror("/dev/mem"); @@ -217,7 +221,7 @@ } par.flag |= I810_MEMOPEN; - par.mmio = mmap(NULL, 512 * 1024, (crt+lcd == -2) ? PROT_READ : PROT_WRITE | PROT_READ, + par.mmio = mmap(NULL, 512 * 1024, ((crt+lcd == -2)&&(bios_init == 0)) ? PROT_READ : PROT_WRITE | PROT_READ, MAP_SHARED, par.mem, addr); if (!par.mmio) { release_resource(&par); @@ -226,6 +230,24 @@ par.flag |= I810_MMIO; + if (bios_init) { +#define VIDEO_BIOS_SCRATCH 0x18 + int gr18, grx; + + printf("mmio address %lx\n", par.mmio); + printf("real address %lx\n", addr); + + i810_writeb(par.mmio, GRX, VIDEO_BIOS_SCRATCH); + gr18 = i810_readb(par.mmio, GRX + 1); + gr18 |= 0x80; + printf("new GR18 is %x\n", gr18); + i810_writeb(par.mmio, GRX, VIDEO_BIOS_SCRATCH); + i810_writeb(par.mmio, GRX + 1, gr18); + + release_resource(&par); + exit(0); + } + if (crt+lcd == -2) { if (chiptype == I810) { printf("CRT: ");