diff options
author | Stuart Bennett <sb476@cam.ac.uk> | 2007-11-23 03:45:29 +0000 |
---|---|---|
committer | Stuart Bennett <sb476@cam.ac.uk> | 2007-11-23 03:45:29 +0000 |
commit | 484ed73089c3aa0871aebfa316702631ab8f5423 (patch) | |
tree | c4ec450e46f1c01444f5797ef62e051051699048 | |
parent | 3fbfcd93167e2148d949fab4cdcc14c862d47965 (diff) |
PROM usage should work everywhere now
-rw-r--r-- | nvbiosemu.c | 13 | ||||
-rw-r--r-- | vbtracetool.c | 63 |
2 files changed, 46 insertions, 30 deletions
diff --git a/nvbiosemu.c b/nvbiosemu.c index 3a201e2..f3b415d 100644 --- a/nvbiosemu.c +++ b/nvbiosemu.c @@ -82,8 +82,7 @@ static void NVShadowVBIOS_PROM(ScrnInfoPtr pScrn, uint8_t *data) { int i; - printf( - "Attempting to locate BIOS image in PROM\n"); + printf("Attempting to locate BIOS image in PROM"); /* enable ROM access */ PMC[0x1850 / 4] = 0x0; @@ -138,7 +137,7 @@ int fake_bios(int fd, uint8_t *bios) return 0; } -int reload_nv_bios() +int reload_nv_bios(uintptr_t pcimemaddr) { int fd; uint8_t bios[NV_PROM_SIZE]; @@ -148,11 +147,11 @@ int reload_nv_bios() return 0; } - unsigned int reg_address = 0xe5000000; // FIXME - PMC = map_dev_mem(fd, reg_address + 0x000000, NV_PROM_SIZE); - PRAMIN = map_dev_mem(fd, reg_address + 0x700000, NV_PROM_SIZE); - PROM = map_dev_mem(fd, reg_address + 0x300000, NV_PROM_SIZE); + printf("Using card memory region at 0x%x\n", pcimemaddr); + PMC = map_dev_mem(fd, pcimemaddr + 0x000000, NV_PROM_SIZE); + PRAMIN = map_dev_mem(fd, pcimemaddr + 0x700000, NV_PROM_SIZE); + PROM = map_dev_mem(fd, pcimemaddr + 0x300000, NV_PROM_SIZE); if (NVShadowVBIOS(NULL, bios)) { if (fake_bios(fd, bios)) diff --git a/vbtracetool.c b/vbtracetool.c index 1c93639..65a8b2d 100644 --- a/vbtracetool.c +++ b/vbtracetool.c @@ -10,6 +10,7 @@ */ #include <pci/pci.h> +#include <stdint.h> #include <stdio.h> #include <stdlib.h> #include <string.h> @@ -19,7 +20,7 @@ #include "lrmi.h" #include "x86emu.h" -extern int reload_nv_bios(); +extern int reload_nv_bios(uintptr_t pcimemaddr); int do_set_mode(unsigned mode) { @@ -92,8 +93,8 @@ int main(int argc, char *argv[]) static struct pci_access *pacc; struct pci_dev *p; unsigned int c; - unsigned int pci_id; - int opt, debug = 0, mode, op = 0, opset = 0, nvreload = 0; + unsigned int pci_id = 0, pci_vendor; + int opt, debug = 0, mode, op = 'g', opset = 0, nvreload = 0; while ((opt = getopt(argc, argv, "dgnps:")) != -1) { switch (opt) { @@ -107,11 +108,11 @@ int main(int argc, char *argv[]) nvreload = 1; break; case 'p': - op = 2; + op = 'p'; opset++; break; case 's': - op = 1; + op = 's'; opset++; mode = atoi(optarg); break; @@ -138,33 +139,49 @@ int main(int argc, char *argv[]) else M.x86.debug = 0; - if (nvreload) - if (reload_nv_bios()) + pacc = pci_alloc(); + pacc->numeric_ids = 1; + pci_init(pacc); + pci_scan_bus(pacc); + if (!pacc->devices) { + printf("eh?\n"); + exit(EXIT_FAILURE); + } + for (p = pacc->devices; p; p = p->next) { + c = pci_read_word(p, PCI_CLASS_DEVICE); + if (c == 0x300) { + pci_id = (p->bus << 8) + (p->dev << 3) + (p->func & 0x7); + pci_vendor = pci_read_word(p, PCI_VENDOR_ID); + break; + } + } + + if (!pci_id) { + printf("No graphics card found\n"); + exit(EXIT_FAILURE); + } + + printf("Using card %04x:%04x on %04x\n", pci_vendor, + pci_read_word(p, PCI_DEVICE_ID), pci_id); + + if (nvreload) { + if (pci_vendor != 0x10de) + printf("Not an Nvidia card -- -n ignored\n"); + else if (reload_nv_bios(p->base_addr[0])) exit(EXIT_FAILURE); + } /* brace yourselves */ sync(); sync(); switch (op) { - case 0: + case 'g': return (do_get_mode()); - case 1: + case 'p': + return (do_post_int(pci_id)); + case 's': return (do_set_mode(mode)); - case 2: - pacc = pci_alloc(); - pacc->numeric_ids = 1; - pci_init(pacc); - - pci_scan_bus(pacc); - - for (p = pacc->devices; p; p = p->next) { - c = pci_read_word(p, PCI_CLASS_DEVICE); - if (c == 0x300) { - pci_id = (p->bus << 8) + (p->dev << 3) + (p->func & 0x7); - return (do_post_int(pci_id)); - } - } } return 0; |