summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStuart Bennett <sb476@cam.ac.uk>2007-11-23 03:45:29 +0000
committerStuart Bennett <sb476@cam.ac.uk>2007-11-23 03:45:29 +0000
commit484ed73089c3aa0871aebfa316702631ab8f5423 (patch)
treec4ec450e46f1c01444f5797ef62e051051699048
parent3fbfcd93167e2148d949fab4cdcc14c862d47965 (diff)
PROM usage should work everywhere now
-rw-r--r--nvbiosemu.c13
-rw-r--r--vbtracetool.c63
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;