From 34a7d0d2f76c71165cc643d5b48061786a83fc87 Mon Sep 17 00:00:00 2001 From: Joshua Wise Date: Tue, 25 Nov 2008 03:26:35 -0500 Subject: [PATCH] Add a FB access layer. --- aseg-paging/Makefile | 3 +++ aseg-paging/drivers.c | 12 +++++++++ aseg-paging/firstrun.c | 12 +++++++++ gendrv/tnt2.c | 20 -------------- include/pci.h | 2 +- net/net.c | 1 - pci/pci.c | 4 +-- video/fb.c | 3 +++ video/tnt2.c | 61 ++++++++++++++++++++++++++++++++++++++++++ 9 files changed, 94 insertions(+), 24 deletions(-) create mode 100644 aseg-paging/drivers.c delete mode 100644 gendrv/tnt2.c create mode 100644 video/fb.c create mode 100644 video/tnt2.c diff --git a/aseg-paging/Makefile b/aseg-paging/Makefile index 9117d9d..c9a8f43 100644 --- a/aseg-paging/Makefile +++ b/aseg-paging/Makefile @@ -43,6 +43,9 @@ OBJS = ../ich2/smi.o \ ../net/http/fs.o \ ../net/http/httpd.o \ ../net/3c90x.o \ + ../video/tnt2.o \ + ../video/fb.o \ + drivers.o \ ../lib/minilib.o \ ../lib/doprnt.o \ ../lib/sprintf.o \ diff --git a/aseg-paging/drivers.c b/aseg-paging/drivers.c new file mode 100644 index 0000000..fca0bfe --- /dev/null +++ b/aseg-paging/drivers.c @@ -0,0 +1,12 @@ +#include + +extern struct pci_driver a3c90x_driver; +extern struct pci_driver tnt2_driver; + +struct pci_driver *drivers[] = +{ + &a3c90x_driver, + &tnt2_driver, + 0 +}; + diff --git a/aseg-paging/firstrun.c b/aseg-paging/firstrun.c index ca611fa..48a1ac0 100644 --- a/aseg-paging/firstrun.c +++ b/aseg-paging/firstrun.c @@ -13,8 +13,11 @@ extern void timer_handler(smi_event_t ev); extern void kbc_handler(smi_event_t ev); extern void gbl_rls_handler(smi_event_t ev); +extern pci_driver_t *drivers[]; + void smi_init() { smram_state_t smram; + pci_driver_t **driver; smram = smram_save_state(); smram_tseg_set_state(SMRAM_TSEG_OPEN); @@ -31,6 +34,15 @@ void smi_init() { smi_disable(); eth_init(); + + /* After everything is initialized, load drivers. */ + for (driver = drivers; *driver; driver++) + { + outputf("Probing driver: %s", (*driver)->name); + if (pci_probe_driver(*driver)) + output("Found a card"); + } + outputf("Driver probe complete"); smi_register_handler(SMI_EVENT_FAST_TIMER, timer_handler); smi_enable_event(SMI_EVENT_FAST_TIMER); diff --git a/gendrv/tnt2.c b/gendrv/tnt2.c deleted file mode 100644 index ead2266..0000000 --- a/gendrv/tnt2.c +++ /dev/null @@ -1,20 +0,0 @@ -#include -#include - -static void *fbaddr; - -static int tnt2_probe(struct pci_dev *pci, void *data) -{ - -} - -static struct pci_id tnt2_pci[] = { -{0x10DE, 0x0028, "TNT2", "RIVA TNT2"} -}; - -struct pci_driver tnt2_driver = { - .name = "tnt2", - .probe = tnt2_probe, - .ids = tnt2_pci, - .id_count = sizeof(tnt2_pci)/sizeof(tnt2_pci[0]), -}; diff --git a/include/pci.h b/include/pci.h index 9f7e6b9..9e964ca 100644 --- a/include/pci.h +++ b/include/pci.h @@ -55,6 +55,6 @@ typedef struct pci_driver { int id_count; } pci_driver_t; -int pci_probe_driver(pci_driver_t driver); +int pci_probe_driver(pci_driver_t *driver); #endif diff --git a/net/net.c b/net/net.c index 2022cca..52ab38f 100644 --- a/net/net.c +++ b/net/net.c @@ -159,6 +159,5 @@ void eth_init() /* Required for DMA to work. :( */ smram_tseg_set_state(SMRAM_TSEG_OPEN); lwip_init(); - pci_probe_driver(a3c90x_driver); httpd_init(); } diff --git a/pci/pci.c b/pci/pci.c index fbea894..5fd03b4 100644 --- a/pci/pci.c +++ b/pci/pci.c @@ -115,7 +115,7 @@ static int _probefn(pci_dev_t *dev, void *d) return 0; } -int pci_probe_driver(pci_driver_t driver) +int pci_probe_driver(pci_driver_t *driver) { - return pci_probe(_probefn, &driver); + return pci_probe(_probefn, driver); } diff --git a/video/fb.c b/video/fb.c new file mode 100644 index 0000000..ed404e1 --- /dev/null +++ b/video/fb.c @@ -0,0 +1,3 @@ +#include + +struct fbdevice *fb; diff --git a/video/tnt2.c b/video/tnt2.c new file mode 100644 index 0000000..73a3d0b --- /dev/null +++ b/video/tnt2.c @@ -0,0 +1,61 @@ +#include +#include +#include +#include +#include + +static void tnt2_getvmode(void *priv); + +static struct fbdevice tnt2_fb = { + .getvmode = &tnt2_getvmode, +}; + +static unsigned int vgard(unsigned char a) +{ + outb(a, 0x3D4); + return (unsigned int)inb(0x3D5); +} + +static void tnt2_getvmode(void *priv) +{ + tnt2_fb.curmode.xres = (vgard(0x1) + 1) * 8; + tnt2_fb.curmode.yres = (vgard(0x12) | (vgard(0x7) & 2) << 7 | (vgard(0x7) & 0x40) << 3) + 1; + switch (vgard(0x28)) + { + case 4: + tnt2_fb.curmode.format = FB_RGB888; + tnt2_fb.curmode.bytestride = 4; + tnt2_fb.curmode.text = 0; + break; + case 0: + tnt2_fb.curmode.text = 1; + break; + default: + outputf("Unknown TNT2 format %d", vgard(0x28)); + break; + } +} + +static int tnt2_probe(struct pci_dev *pci, void *data) +{ + if (pci->bars[1].type != PCI_BAR_MEMORY32) + { + output("TNT2 BAR1 is not memory32?"); + return 0; + } + tnt2_fb.fbaddr = (void *)pci->bars[1].addr; + fb = &tnt2_fb; + outputf("Found TNT2 with FB at %08x", tnt2_fb.fbaddr); + return 1; +} + +static struct pci_id tnt2_pci[] = { + {0x10DE, 0x0028, "TNT2", "RIVA TNT2"} +}; + +struct pci_driver tnt2_driver = { + .name = "tnt2", + .probe = tnt2_probe, + .ids = tnt2_pci, + .id_count = sizeof(tnt2_pci)/sizeof(tnt2_pci[0]), +}; -- 2.43.0