summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIan Romanick <idr@umwelt.(none)>2006-08-08 16:42:23 -0700
committerIan Romanick <idr@umwelt.(none)>2006-08-08 16:42:23 -0700
commit9df53d903ed68073bf7d2c2a275b6f6556a85c0f (patch)
tree271ea5b7d9e19e6ee2e2958057c43c96df192266
parent83ebf61ec03ff31005375900bee1e55e0e694c4b (diff)
Rename xf86ReadDomainMemory to xf86ReadLegacyVideoBIOS, since that's
what it is actually used for. Modify a few routines in linuxPci.c to take pci_device structures as parameters in stead of PCITAGs.
-rw-r--r--hw/xfree86/int10/generic.c17
-rw-r--r--hw/xfree86/loader/xf86sym.c2
-rw-r--r--hw/xfree86/os-support/bus/Pci.c45
-rw-r--r--hw/xfree86/os-support/bus/axpPci.c15
-rw-r--r--hw/xfree86/os-support/bus/linuxPci.c130
-rw-r--r--hw/xfree86/os-support/bus/sparcPci.c2
-rw-r--r--hw/xfree86/os-support/bus/xf86Pci.h3
7 files changed, 83 insertions, 131 deletions
diff --git a/hw/xfree86/int10/generic.c b/hw/xfree86/int10/generic.c
index eab2047ad..8f68ab43f 100644
--- a/hw/xfree86/int10/generic.c
+++ b/hw/xfree86/int10/generic.c
@@ -216,26 +216,15 @@ xf86ExtendedInitInt10(int entityIndex, int Flags)
setup_int_vect(pInt);
set_return_trap(pInt);
- /*
- * Retrieve two segments: one at V_BIOS, the other 64kB beyond the first.
- * This'll catch any BIOS that might have been initialised before server
- * entry.
+ /* Retrieve the entire legacy video BIOS segment. This can be upto
+ * 128KiB.
*/
vbiosMem = (char *)base + V_BIOS;
(void)memset(vbiosMem, 0, 2 * V_BIOS_SIZE);
- if (xf86ReadDomainMemory(pInt->Tag, V_BIOS, V_BIOS_SIZE, vbiosMem) <
- V_BIOS_SIZE) {
+ if (xf86ReadLegacyVideoBIOS(pInt->Tag, vbiosMem) < V_BIOS_SIZE) {
xf86DrvMsg(screen, X_WARNING,
"Unable to retrieve all of segment 0x0C0000.\n");
}
- else if ((((unsigned char *)vbiosMem)[0] == 0x55) &&
- (((unsigned char *)vbiosMem)[1] == 0xAA) &&
- (((unsigned char *)vbiosMem)[2] > 0x80)) {
- if (xf86ReadDomainMemory(pInt->Tag, V_BIOS + V_BIOS_SIZE, V_BIOS_SIZE,
- (unsigned char *)vbiosMem + V_BIOS_SIZE) < V_BIOS_SIZE)
- xf86DrvMsg(screen, X_WARNING,
- "Unable to retrieve all of segment 0x0D0000.\n");
- }
/*
* If this adapter is the primary, use its post-init BIOS (if we can find
diff --git a/hw/xfree86/loader/xf86sym.c b/hw/xfree86/loader/xf86sym.c
index 1b9810002..f001cf5d9 100644
--- a/hw/xfree86/loader/xf86sym.c
+++ b/hw/xfree86/loader/xf86sym.c
@@ -251,7 +251,7 @@ _X_HIDDEN void *xfree86LookupTab[] = {
SYMFUNC(xf86MapReadSideEffects)
SYMFUNC(xf86GetPciDomain)
SYMFUNC(xf86MapDomainMemory)
- SYMFUNC(xf86ReadDomainMemory)
+ SYMFUNC(xf86ReadLegacyVideoBIOS)
SYMFUNC(xf86UDelay)
SYMFUNC(xf86IODelay)
SYMFUNC(xf86SlowBcopy)
diff --git a/hw/xfree86/os-support/bus/Pci.c b/hw/xfree86/os-support/bus/Pci.c
index 6079b07b5..85fb6dd65 100644
--- a/hw/xfree86/os-support/bus/Pci.c
+++ b/hw/xfree86/os-support/bus/Pci.c
@@ -25,7 +25,7 @@
* xf86MapDomainMemory() - Like xf86MapPciMem() but can handle
* domain/host address translation
* xf86MapLegacyIO() - Maps PCI I/O spaces
- * xf86ReadDomainMemory() - Like xf86ReadPciBIOS() but can handle
+ * xf86ReadLegacyVideoBIOS() - Like xf86ReadPciBIOS() but can handle
* domain/host address translation
*
* The actual PCI backend driver is selected by the pciInit() function
@@ -282,20 +282,6 @@ pciTag(int busnum, int devnum, int funcnum)
return(PCI_MAKE_TAG(busnum,devnum,funcnum));
}
-CARD32
-pciByteSwap(CARD32 u)
-{
-#if X_BYTE_ORDER == X_BIG_ENDIAN
-
- return lswapl(u);
-
-#else /* !BIG_ENDIAN */
-
- return(u);
-
-#endif
-}
-
ADDRESS
pciAddrNOOP(PCITAG tag, PciAddrType type, ADDRESS addr)
{
@@ -347,24 +333,39 @@ xf86MapLegacyIO(struct pci_device *dev)
}
_X_EXPORT int
-xf86ReadDomainMemory(PCITAG Tag, ADDRESS Base, int Len, unsigned char *Buf)
+xf86ReadLegacyVideoBIOS(PCITAG Tag, unsigned char *Buf)
{
+ const unsigned Len = (2 * 0x10000);
+ ADDRESS Base = 0xC0000;
int ret, length, rlength;
/* Read in 64kB chunks */
ret = 0;
- while ((length = Len) > 0) {
- if (length > 0x010000) length = 0x010000;
- rlength = xf86ReadBIOS(Base, 0, Buf, length);
+
+ for (length = 0x10000; length > 0; /* empty */) {
+ rlength = xf86ReadBIOS(Base, 0, & Buf[ret], length);
if (rlength < 0) {
ret = rlength;
break;
}
+
ret += rlength;
- if (rlength < length) break;
+ length -= rlength;
Base += rlength;
- Buf += rlength;
- Len -= rlength;
+ }
+
+ if ((Buf[0] == 0x55) && (Buf[1] == 0xAA) && (Buf[2] > 0x80)) {
+ for (length = 0x10000; length > 0; /* empty */) {
+ rlength = xf86ReadBIOS(Base, 0, & Buf[ret], length);
+ if (rlength < 0) {
+ ret = rlength;
+ break;
+ }
+
+ ret += rlength;
+ length -= rlength;
+ Base += rlength;
+ }
}
return ret;
diff --git a/hw/xfree86/os-support/bus/axpPci.c b/hw/xfree86/os-support/bus/axpPci.c
index b24fae773..e7e996a09 100644
--- a/hw/xfree86/os-support/bus/axpPci.c
+++ b/hw/xfree86/os-support/bus/axpPci.c
@@ -362,19 +362,16 @@ xf86MapLegacyIO(struct pci_device *dev)
}
_X_EXPORT int
-xf86ReadDomainMemory(PCITAG Tag, ADDRESS Base, int Len, unsigned char *Buf)
+xf86ReadLegacyVideoBIOS(PCITAG Tag, unsigned char *Buf)
{
- static unsigned long pagemask = 0;
+ const unsigned long pagemask = xf86getpagesize() - 1;
+ const ADDRESS Base = 0xC0000;
+ const int Len = 0x20000;
+ const ADDRESS MapBase = Base & ~pagemask;
+ unsigned long MapSize = ((Base + Len + pagemask) & ~pagemask) - MapBase;
unsigned char *MappedAddr;
- unsigned long MapSize;
- ADDRESS MapBase;
int i;
- if (!pagemask) pagemask = xf86getpagesize() - 1;
-
- /* Ensure page boundaries */
- MapBase = Base & ~pagemask;
- MapSize = ((Base + Len + pagemask) & ~pagemask) - MapBase;
/*
* VIDMEM_MMIO in order to get sparse mapping on sparse memory systems
diff --git a/hw/xfree86/os-support/bus/linuxPci.c b/hw/xfree86/os-support/bus/linuxPci.c
index 9a2cd37d3..a9db5c887 100644
--- a/hw/xfree86/os-support/bus/linuxPci.c
+++ b/hw/xfree86/os-support/bus/linuxPci.c
@@ -95,8 +95,6 @@ static const struct pci_id_match match_host_bridge = {
0x0000ffff00, 0
};
-/* from lnx_pci.c. */
-extern int lnxPciInit(void);
void
linuxPciInit(void)
@@ -358,19 +356,10 @@ linuxGetSizesStruct(const struct pci_device *dev)
}
static __inline__ unsigned long
-linuxGetIOSize(PCITAG Tag)
+linuxGetIOSize(const struct pci_device *dev)
{
- const struct pci_device * const dev = pci_device_find_by_slot(PCI_DOM_FROM_TAG(Tag),
- PCI_BUS_NO_DOMAIN(PCI_BUS_FROM_TAG(Tag)),
- PCI_DEV_FROM_TAG(Tag),
- PCI_FUNC_FROM_TAG(Tag));
- if (dev != NULL) {
- const struct pciSizes * const sizes = linuxGetSizesStruct(dev);
- return sizes->io_size;
- } else {
- /* Default to 64KB I/O. */
- return (1U << 16);
- }
+ const struct pciSizes * const sizes = linuxGetSizesStruct(dev);
+ return sizes->io_size;
}
_X_EXPORT int
@@ -387,7 +376,7 @@ xf86GetPciDomain(PCITAG Tag)
if ((result = PCI_DOM_FROM_TAG(Tag)) != 0)
return result;
- if ((fd = linuxPciOpenFile(Tag, FALSE)) < 0)
+ if ((fd = linuxPciOpenFile(dev, FALSE)) < 0)
return 0;
if ((result = ioctl(fd, PCIIOC_CONTROLLER, 0)) < 0)
@@ -397,19 +386,19 @@ xf86GetPciDomain(PCITAG Tag)
}
static pointer
-linuxMapPci(int ScreenNum, int Flags, PCITAG Tag,
+linuxMapPci(int ScreenNum, int Flags, struct pci_device *dev,
ADDRESS Base, unsigned long Size, int mmap_ioctl)
{
+ /* Align to page boundary */
+ const ADDRESS realBase = Base & ~(getpagesize() - 1);
+ const ADDRESS Offset = Base - realBase;
+
do {
- struct pci_device *dev;
unsigned char *result;
- ADDRESS realBase, Offset;
int fd, mmapflags, prot;
xf86InitVidMem();
- dev = xf86GetPciHostConfigFromTag(Tag);
-
/* FIXME: What if dev == NULL? */
if (((fd = linuxPciOpenFile(dev, FALSE)) < 0) ||
@@ -442,9 +431,6 @@ linuxMapPci(int ScreenNum, int Flags, PCITAG Tag,
#endif /* ?__ia64__ */
- /* Align to page boundary */
- realBase = Base & ~(getpagesize() - 1);
- Offset = Base - realBase;
if (Flags & VIDMEM_READONLY)
prot = PROT_READ;
@@ -472,24 +458,18 @@ static pointer DomainMmappedIO[MAX_DOMAINS];
static pointer DomainMmappedMem[MAX_DOMAINS];
static int
-linuxOpenLegacy(PCITAG Tag, char *name)
-
+linuxOpenLegacy(struct pci_device *dev, char *name)
{
#define PREFIX "/sys/class/pci_bus/%04x:%02x/%s"
char *path;
int domain, bus;
pciBusInfo_t *pBusInfo;
- struct pci_device *dev;
int fd;
path = xalloc(strlen(PREFIX) + strlen(name));
if (!path)
return -1;
- dev = pci_device_find_by_slot(PCI_DOM_FROM_TAG(Tag),
- PCI_BUS_NO_DOM(PCI_BUS_FROM_TAG(Tag)),
- PCI_DEV_FROM_TAG(Tag),
- PCI_FUNC_FROM_TAG(Tag));
while (dev != NULL) {
sprintf(path, PREFIX, dev->domain, dev->bus, name);
fd = open(path, O_RDWR);
@@ -524,21 +504,17 @@ xf86MapDomainMemory(int ScreenNum, int Flags, PCITAG Tag,
ADDRESS Base, unsigned long Size)
{
int domain = xf86GetPciDomain(Tag);
+ const struct pci_device *dev = xf86GetPciHostConfigFromTag(Tag);
int fd;
/*
* We use /proc/bus/pci on non-legacy addresses or if the Linux sysfs
* legacy_mem interface is unavailable.
*/
- if (Base > 1024*1024)
- return linuxMapPci(ScreenNum, Flags, Tag, Base, Size,
+ if ((Base > 1024*1024) || ((fd = linuxOpenLegacy(dev, "legacy_mem")) < 0))
+ return linuxMapPci(ScreenNum, Flags, dev, Base, Size,
PCIIOC_MMAP_IS_MEM);
- if ((fd = linuxOpenLegacy(Tag, "legacy_mem")) < 0)
- return linuxMapPci(ScreenNum, Flags, Tag, Base, Size,
- PCIIOC_MMAP_IS_MEM);
-
-
/* If we haven't already mapped this legacy space, try to. */
if (!DomainMmappedMem[domain]) {
DomainMmappedMem[domain] = mmap(NULL, 1024*1024, PROT_READ|PROT_WRITE,
@@ -575,6 +551,7 @@ xf86MapLegacyIO(struct pci_device *dev)
const PCITAG tag = PCI_MAKE_TAG(PCI_MAKE_BUS(dev->domain, dev->bus),
dev->dev, dev->func);
const int domain = xf86GetPciDomain(tag);
+ const struct pci_device *bridge = xf86GetPciHostConfigFromTag(Tag);
int fd;
if ((domain <= 0) || (domain >= MAX_DOMAINS))
@@ -584,8 +561,8 @@ xf86MapLegacyIO(struct pci_device *dev)
return (IOADDRESS)DomainMmappedIO[domain];
/* Permanently map all of I/O space */
- if ((fd = linuxOpenLegacy(tag, "legacy_io")) < 0) {
- DomainMmappedIO[domain] = linuxMapPci(-1, VIDMEM_MMIO, tag,
+ if ((fd = linuxOpenLegacy(bridge, "legacy_io")) < 0) {
+ DomainMmappedIO[domain] = linuxMapPci(-1, VIDMEM_MMIO, bridge,
0, linuxGetIOSize(tag),
PCIIOC_MMAP_IS_IO);
/* ia64 can't mmap legacy IO port space */
@@ -599,55 +576,37 @@ xf86MapLegacyIO(struct pci_device *dev)
return (IOADDRESS)DomainMmappedIO[domain];
}
-/*
- * xf86ReadDomainMemory - copy from domain memory into a caller supplied buffer
+/**
+ * Read legacy VGA video BIOS associated with specified domain.
+ *
+ * Attempts to read up to 128KiB of legacy VGA video BIOS.
+ *
+ * \return
+ * The number of bytes read on success or -1 on failure.
*/
_X_EXPORT int
-xf86ReadDomainMemory(PCITAG Tag, ADDRESS Base, int Len, unsigned char *Buf)
+xf86ReadLegacyVideoBIOS(PCITAG Tag, unsigned char *Buf)
{
+ const ADDRESS Base = V_BIOS;
+ const int Len = V_BIOS_SIZE * 2;
+ const int pagemask = getpagesize() - 1;
+ const ADDRESS offset = Base & ~pagemask;
+ const unsigned long size = ((Base + Len + pagemask) & ~pagemask) - offset;
+ const struct pci_device * const dev =
+ pci_device_find_by_slot(PCI_DOM_FROM_TAG(Tag),
+ PCI_BUS_NO_DOM(PCI_BUS_FROM_TAG(Tag)),
+ PCI_DEV_FROM_TAG(Tag),
+ PCI_FUNC_FROM_TAG(Tag));
unsigned char *ptr, *src;
- ADDRESS offset;
- unsigned long size;
- int len, pagemask = getpagesize() - 1;
-
- unsigned int i, dom, bus, dev, func;
- unsigned int fd;
- char file[256];
- struct stat st;
-
- dom = PCI_DOM_FROM_TAG(Tag);
- bus = PCI_BUS_FROM_TAG(Tag);
- dev = PCI_DEV_FROM_TAG(Tag);
- func = PCI_FUNC_FROM_TAG(Tag);
- sprintf(file, "/sys/devices/pci%04x:%02x/%04x:%02x:%02x.%1x/rom",
- dom, bus, dom, bus, dev, func);
+ int len;
- /*
- * If the caller wants the ROM and the sysfs rom interface exists,
- * try to use it instead of reading it from /proc/bus/pci.
- */
- if (((Base & 0xfffff) == 0xC0000) && (stat(file, &st) == 0)) {
- if ((fd = open(file, O_RDWR)))
- Base = 0x0;
-
- /* enable the ROM first */
- write(fd, "1", 2);
- lseek(fd, 0, SEEK_SET);
- /* copy the ROM until we hit Len, EOF or read error */
- for (i = 0; i < Len && read(fd, Buf, 1) > 0; Buf++, i++)
- ;
-
- write(fd, "0", 2);
- close(fd);
-
- return Len;
+ /* Try to use the civilized PCI interface first.
+ */
+ if (pci_device_read_rom(dev, Buf) == 0) {
+ return dev->rom_size;
}
- /* Ensure page boundaries */
- offset = Base & ~pagemask;
- size = ((Base + Len + pagemask) & ~pagemask) - offset;
-
ptr = xf86MapDomainMemory(-1, VIDMEM_READONLY, Tag, offset, size);
if (!ptr)
@@ -655,8 +614,15 @@ xf86ReadDomainMemory(PCITAG Tag, ADDRESS Base, int Len, unsigned char *Buf)
/* Using memcpy() here can hang the system */
src = ptr + (Base - offset);
- for (len = Len; len-- > 0;)
- *Buf++ = *src++;
+ for (len = 0; len < V_BIOS_SIZE; len++) {
+ Buf[len] = src[len];
+ }
+
+ if ((buf[0] == 0x55) && (buf[1] == 0xAA) && (buf[2] > 0x80)) {
+ for ( /* empty */ ; len < (2 * V_BIOS_SIZE); len++) {
+ Buf[len] = src[len];
+ }
+ }
xf86UnMapVidMem(-1, ptr, size);
diff --git a/hw/xfree86/os-support/bus/sparcPci.c b/hw/xfree86/os-support/bus/sparcPci.c
index bef3093ff..f09ed9f0a 100644
--- a/hw/xfree86/os-support/bus/sparcPci.c
+++ b/hw/xfree86/os-support/bus/sparcPci.c
@@ -649,7 +649,7 @@ xf86MapLegacyIO(int ScreenNum, int Flags, PCITAG Tag,
}
_X_EXPORT int
-xf86ReadDomainMemory(PCITAG Tag, ADDRESS Base, int Len, unsigned char *Buf)
+xf86ReadLegacyVideoBIOS(PCITAG Tag, ADDRESS Base, int Len, unsigned char *Buf)
{
unsigned char *ptr, *src;
ADDRESS offset;
diff --git a/hw/xfree86/os-support/bus/xf86Pci.h b/hw/xfree86/os-support/bus/xf86Pci.h
index 6fcb468e4..1ab0749f1 100644
--- a/hw/xfree86/os-support/bus/xf86Pci.h
+++ b/hw/xfree86/os-support/bus/xf86Pci.h
@@ -263,7 +263,6 @@ int xf86GetPciDomain(PCITAG tag);
pointer xf86MapDomainMemory(int ScreenNum, int Flags, PCITAG Tag,
ADDRESS Base, unsigned long Size);
IOADDRESS xf86MapLegacyIO(struct pci_device *dev);
-int xf86ReadDomainMemory(PCITAG Tag, ADDRESS Base, int Len,
- unsigned char *Buf);
+int xf86ReadLegacyVideoBIOS(PCITAG Tag, unsigned char *Buf);
#endif /* _XF86PCI_H */