summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorhpa <hpa>2005-08-03 21:18:37 +0000
committerhpa <hpa>2005-08-03 21:18:37 +0000
commit32bf33d0202a9f7ec4be37107e2de0662f1ad5ff (patch)
tree1d74f74d862d14f6a1fbb7af66442386f857fe62
parenta9eaf5c7594bddc3ea66a48a8b8a8b0f522270f2 (diff)
downloadsyslinux-32bf33d0202a9f7ec4be37107e2de0662f1ad5ff.tar.gz
Support PCI config via BIOS
-rw-r--r--com32/lib/Makefile16
-rw-r--r--com32/lib/pci/cfgtype.c36
-rw-r--r--com32/lib/pci/pci.h2
-rw-r--r--com32/lib/pci/readb.c1
-rw-r--r--com32/lib/pci/readl.c1
-rw-r--r--com32/lib/pci/readw.c1
-rw-r--r--com32/lib/pci/readx.c4
-rw-r--r--com32/lib/pci/writeb.c1
-rw-r--r--com32/lib/pci/writel.c1
-rw-r--r--com32/lib/pci/writew.c1
-rw-r--r--com32/lib/pci/writex.c7
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;
}
}
}