Do not map full 0-1MB legacy range

If we're mapping something in the "legacy range" (0-1Mb), we shouldn't
expand the requested range to the entire 0-1Mb range.  Typically this
is for mapping the VGA frame buffer, and some platforms support mmap of
the frame buffer but not the entire 0-1Mb range.

For example, HP sx1000 and sx2000 ia64 platforms can have memory from
0-0x9ffff, VGA frame buffer from 0xa0000-0xbffff, and memory from
0xc0000-0xfffff.  On these platforms, we can't map the entire 0-1Mb
range with the same attribute because the memory only supports WB,
while the frame buffer supports only UC.  But an mmap of just the
frame buffer should work fine.
This commit is contained in:
Bjorn Helgaas 2006-11-03 18:54:06 +01:00 committed by Matthias Hopf
parent c1828a8ff5
commit bd0c829654

View File

@ -627,7 +627,6 @@ linuxMapPci(int ScreenNum, int Flags, PCITAG Tag,
#define MAX_DOMAINS 257
static pointer DomainMmappedIO[MAX_DOMAINS];
static pointer DomainMmappedMem[MAX_DOMAINS];
static int
linuxOpenLegacy(PCITAG Tag, char *name)
@ -685,6 +684,7 @@ xf86MapDomainMemory(int ScreenNum, int Flags, PCITAG Tag,
{
int domain = xf86GetPciDomain(Tag);
int fd;
pointer addr;
/*
* We use /proc/bus/pci on non-legacy addresses or if the Linux sysfs
@ -698,20 +698,14 @@ xf86MapDomainMemory(int ScreenNum, int Flags, PCITAG Tag,
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,
MAP_SHARED, fd, 0);
if (DomainMmappedMem[domain] == MAP_FAILED) {
close(fd);
perror("mmap failure");
FatalError("xf86MapDomainMem(): mmap() failure\n");
}
addr = mmap(NULL, Size, PROT_READ|PROT_WRITE, MAP_SHARED, fd, Base);
if (addr == MAP_FAILED) {
close (fd);
perror("mmap failure");
FatalError("xf86MapDomainMem(): mmap() failure\n");
}
close(fd);
return (pointer)((char *)DomainMmappedMem[domain] + Base);
return addr;
}
/*