diff options
author | hpa <hpa> | 2005-08-03 21:18:37 +0000 |
---|---|---|
committer | hpa <hpa> | 2005-08-03 21:18:37 +0000 |
commit | 32bf33d0202a9f7ec4be37107e2de0662f1ad5ff (patch) | |
tree | 1d74f74d862d14f6a1fbb7af66442386f857fe62 | |
parent | a9eaf5c7594bddc3ea66a48a8b8a8b0f522270f2 (diff) | |
download | syslinux-32bf33d0202a9f7ec4be37107e2de0662f1ad5ff.tar.gz |
Support PCI config via BIOS
-rw-r--r-- | com32/lib/Makefile | 16 | ||||
-rw-r--r-- | com32/lib/pci/cfgtype.c | 36 | ||||
-rw-r--r-- | com32/lib/pci/pci.h | 2 | ||||
-rw-r--r-- | com32/lib/pci/readb.c | 1 | ||||
-rw-r--r-- | com32/lib/pci/readl.c | 1 | ||||
-rw-r--r-- | com32/lib/pci/readw.c | 1 | ||||
-rw-r--r-- | com32/lib/pci/readx.c | 4 | ||||
-rw-r--r-- | com32/lib/pci/writeb.c | 1 | ||||
-rw-r--r-- | com32/lib/pci/writel.c | 1 | ||||
-rw-r--r-- | com32/lib/pci/writew.c | 1 | ||||
-rw-r--r-- | com32/lib/pci/writex.c | 7 |
11 files changed, 56 insertions, 15 deletions
diff --git a/com32/lib/Makefile b/com32/lib/Makefile index 7dea7afb..82faa553 100644 --- a/com32/lib/Makefile +++ b/com32/lib/Makefile @@ -1,7 +1,8 @@ # Include configuration rules include MCONFIG -LIBOBJS = abort.o atexit.o atoi.o atol.o atoll.o calloc.o creat.o \ +LIBOBJS = \ + abort.o atexit.o atoi.o atol.o atoll.o calloc.o creat.o \ ctypes.o errno.o fgetc.o fgets.o fopen.o fprintf.o fputc.o \ putchar.o \ fputs.o fread2.o fread.o free.o fwrite2.o fwrite.o getopt.o \ @@ -15,10 +16,13 @@ LIBOBJS = abort.o atexit.o atoi.o atol.o atoll.o calloc.o creat.o \ strtoimax.o strtok.o strtol.o strtoll.o strtoul.o strtoull.o \ strtoumax.o vfprintf.o vprintf.o vsnprintf.o vsprintf.o \ asprintf.o vasprintf.o strlcpy.o strlcat.o \ - vsscanf.o libgcc/__ashldi3.o libgcc/__udivdi3.o \ + vsscanf.o \ + \ + libgcc/__ashldi3.o libgcc/__udivdi3.o \ libgcc/__negdi2.o libgcc/__ashrdi3.o libgcc/__lshrdi3.o \ libgcc/__muldi3.o libgcc/__udivmoddi4.o libgcc/__umoddi3.o \ libgcc/__divdi3.o libgcc/__moddi3.o \ + \ sys/entry.o sys/exit.o sys/argv.o sys/times.o sys/idle.o \ sys/fileinfo.o sys/opendev.o sys/read.o sys/write.o sys/ftell.o \ sys/close.o sys/open.o sys/fileread.o sys/fileclose.o \ @@ -27,11 +31,15 @@ LIBOBJS = abort.o atexit.o atoi.o atol.o atoll.o calloc.o creat.o \ sys/rawcon_write.o sys/err_read.o sys/err_write.o \ sys/null_read.o sys/null_write.o sys/serial_write.o \ sys/ansicon_write.o sys/ansiserial_write.o \ - pci/cfgtype.o pci/readb.o pci/readw.o pci/readl.o \ - pci/writeb.o pci/writew.o pci/writel.o \ + \ + pci/cfgtype.o \ + pci/readb.o pci/readw.o pci/readl.o pci/readbios.o \ + pci/writeb.o pci/writew.o pci/writel.o pci/writebios.o \ + \ zlib/adler32.o zlib/compress.o zlib/crc32.o zlib/gzio.o \ zlib/uncompr.o zlib/deflate.o zlib/trees.o zlib/zutil.o \ zlib/inflate.o zlib/infback.o zlib/inftrees.o zlib/inffast.o \ + \ libpng/png.o libpng/pngset.o libpng/pngrutil.o \ libpng/pngtrans.o libpng/pngwutil.o libpng/pngread.o \ libpng/pngrio.o libpng/pngwio.o libpng/pngwrite.o \ diff --git a/com32/lib/pci/cfgtype.c b/com32/lib/pci/cfgtype.c index 5fa72beb..37c398db 100644 --- a/com32/lib/pci/cfgtype.c +++ b/com32/lib/pci/cfgtype.c @@ -1,22 +1,38 @@ #include "pci/pci.h" +#include <com32.h> +#include <string.h> enum pci_config_type __pci_cfg_type; void pci_set_config_type(enum pci_config_type type) { uint32_t oldcf8; + static const com32sys_t ireg = { + .eax.l = 0xb101, + .edi.l = 0, + .eflags.l = EFLAGS_CF, + }; + com32sys_t oreg; if ( type == PCI_CFG_AUTO ) { - /* Try to detect CM #1 */ - cli(); - oldcf8 = inl(0xcf8); - outl(~0, 0xcf8); - if ( inl(0xcf8) == pci_mkaddr(255,31,7,252) ) - type = PCI_CFG_TYPE1; - else - type = PCI_CFG_TYPE2; /* ... it better be ... */ - outl(oldcf8, 0xcf8); - sti(); + /* Try to detect PCI BIOS */ + __intcall(0x1a, &ireg, &oreg); + + if ( !(oreg.eflags.l & EFLAGS_CF) && + oreg.edx.l == 0x20494250 ) { + type = (oreg.edi.l & 1) ? PCI_CFG_TYPE1 : PCI_CFG_BIOS; + } else { + /* Try to detect CM #1 */ + cli(); + oldcf8 = inl(0xcf8); + outl(~0, 0xcf8); + if ( inl(0xcf8) == pci_mkaddr(255,31,7,252) ) + type = PCI_CFG_TYPE1; + else + type = PCI_CFG_TYPE2; /* ... it better be ... */ + outl(oldcf8, 0xcf8); + sti(); + } } __pci_cfg_type = type; diff --git a/com32/lib/pci/pci.h b/com32/lib/pci/pci.h index 6946edfa..66a1eb50 100644 --- a/com32/lib/pci/pci.h +++ b/com32/lib/pci/pci.h @@ -10,5 +10,7 @@ #include <sys/cpu.h> extern enum pci_config_type __pci_cfg_type; +extern uint32_t __pci_read_bios(uint32_t call, pciaddr_t a); +extern void __pci_write_bios(uint32_t call, uint32_t v, pciaddr_t a); #endif /* PCI_PCI_H */ diff --git a/com32/lib/pci/readb.c b/com32/lib/pci/readb.c index bfc544f4..c0c41724 100644 --- a/com32/lib/pci/readb.c +++ b/com32/lib/pci/readb.c @@ -1,3 +1,4 @@ #define TYPE uint8_t #define BWL(x) x ## b +#define BIOSCALL 0xb108 #include "pci/readx.c" diff --git a/com32/lib/pci/readl.c b/com32/lib/pci/readl.c index ef3fdd69..fbef3a7c 100644 --- a/com32/lib/pci/readl.c +++ b/com32/lib/pci/readl.c @@ -1,3 +1,4 @@ #define TYPE uint32_t #define BWL(x) x ## l +#define BIOSCALL 0xb10a #include "pci/readx.c" diff --git a/com32/lib/pci/readw.c b/com32/lib/pci/readw.c index 68892298..86604c47 100644 --- a/com32/lib/pci/readw.c +++ b/com32/lib/pci/readw.c @@ -1,3 +1,4 @@ #define TYPE uint16_t #define BWL(x) x ## w +#define BIOSCALL 0xb109 #include "pci/readx.c" diff --git a/com32/lib/pci/readx.c b/com32/lib/pci/readx.c index f1e542d7..06c3c987 100644 --- a/com32/lib/pci/readx.c +++ b/com32/lib/pci/readx.c @@ -1,4 +1,5 @@ #include "pci/pci.h" +#include <string.h> TYPE BWL(pci_read) (pciaddr_t a) { @@ -40,6 +41,9 @@ TYPE BWL(pci_read) (pciaddr_t a) sti(); } return r; + + case PCI_CFG_BIOS: + return (TYPE) __pci_read_bios(BIOSCALL, a); default: return (TYPE)~0; diff --git a/com32/lib/pci/writeb.c b/com32/lib/pci/writeb.c index a63fcf1f..5a9a24af 100644 --- a/com32/lib/pci/writeb.c +++ b/com32/lib/pci/writeb.c @@ -1,3 +1,4 @@ #define TYPE uint8_t #define BWL(x) x ## b +#define BIOSCALL 0xb10b #include "pci/writex.c" diff --git a/com32/lib/pci/writel.c b/com32/lib/pci/writel.c index f608baa0..df9fc7b6 100644 --- a/com32/lib/pci/writel.c +++ b/com32/lib/pci/writel.c @@ -1,3 +1,4 @@ #define TYPE uint32_t #define BWL(x) x ## l +#define BIOSCALL 0xb10d #include "pci/writex.c" diff --git a/com32/lib/pci/writew.c b/com32/lib/pci/writew.c index 4399d716..e5a948a7 100644 --- a/com32/lib/pci/writew.c +++ b/com32/lib/pci/writew.c @@ -1,3 +1,4 @@ #define TYPE uint16_t #define BWL(x) x ## w +#define BIOSCALL 0xb10c #include "pci/writex.c" diff --git a/com32/lib/pci/writex.c b/com32/lib/pci/writex.c index c7e715e7..a48a88df 100644 --- a/com32/lib/pci/writex.c +++ b/com32/lib/pci/writex.c @@ -37,9 +37,14 @@ void BWL(pci_write) (TYPE v, pciaddr_t a) outb(oldcfa, 0xcfa); sti(); } + return; + + case PCI_CFG_BIOS: + __pci_write_bios(BIOSCALL, v, a); + return; default: - return; /* Do nothing */ + return; } } } |