diff options
author | Ian Romanick <idr@umwelt.(none)> | 2006-08-08 16:42:23 -0700 |
---|---|---|
committer | Ian Romanick <idr@umwelt.(none)> | 2006-08-08 16:42:23 -0700 |
commit | 9df53d903ed68073bf7d2c2a275b6f6556a85c0f (patch) | |
tree | 271ea5b7d9e19e6ee2e2958057c43c96df192266 | |
parent | 83ebf61ec03ff31005375900bee1e55e0e694c4b (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.c | 17 | ||||
-rw-r--r-- | hw/xfree86/loader/xf86sym.c | 2 | ||||
-rw-r--r-- | hw/xfree86/os-support/bus/Pci.c | 45 | ||||
-rw-r--r-- | hw/xfree86/os-support/bus/axpPci.c | 15 | ||||
-rw-r--r-- | hw/xfree86/os-support/bus/linuxPci.c | 130 | ||||
-rw-r--r-- | hw/xfree86/os-support/bus/sparcPci.c | 2 | ||||
-rw-r--r-- | hw/xfree86/os-support/bus/xf86Pci.h | 3 |
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 */ |