mirror of
https://github.com/X11Libre/xserver.git
synced 2026-10-04 22:36:10 +00:00
Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/xserver into pci-rework
Conflicts: hw/xfree86/common/xf86DoScanPci.c hw/xfree86/common/xf86Init.c hw/xfree86/common/xf86pciBus.c
This commit is contained in:
commit
07ad92d2c4
162 changed files with 384 additions and 1032 deletions
|
|
@ -2,19 +2,22 @@ module_LTLIBRARIES = libint10.la
|
|||
|
||||
sdk_HEADERS = xf86int10.h
|
||||
|
||||
EXTRA_CFLAGS = @SERVER_DEFINES@ @MODULE_DEFINES@ @LOADER_DEFINES@
|
||||
EXTRA_CFLAGS =
|
||||
|
||||
libint10_la_LDFLAGS = -avoid-version
|
||||
|
||||
COMMON_SOURCES = \
|
||||
helper_exec.c \
|
||||
helper_mem.c \
|
||||
pci.c \
|
||||
xf86int10.c \
|
||||
xf86int10module.c
|
||||
|
||||
if INT10_VM86
|
||||
AM_CFLAGS = -D_PC -D_VM86_LINUX $(XORG_CFLAGS) $(EXTRA_CFLAGS)
|
||||
INCLUDES = $(XORG_INCS)
|
||||
libint10_la_SOURCES = \
|
||||
helper_exec.c \
|
||||
helper_mem.c \
|
||||
pci.c \
|
||||
xf86int10.c \
|
||||
xf86int10module.c \
|
||||
$(COMMON_SOURCES) \
|
||||
$(srcdir)/../os-support/linux/int10/vm86/linux_vm86.c \
|
||||
$(srcdir)/../os-support/linux/int10/linux.c
|
||||
endif
|
||||
|
|
@ -22,8 +25,11 @@ endif
|
|||
if INT10_X86EMU
|
||||
AM_CFLAGS = -D_X86EMU -DNO_SYS_HEADERS -D_PC $(XORG_CFLAGS) $(EXTRA_CFLAGS)
|
||||
INCLUDES = $(XORG_INCS) -I$(srcdir)/../x86emu
|
||||
libint10_la_SOURCES = pci.c xf86int10module.c helper_exec.c helper_mem.c \
|
||||
xf86int10.c xf86x86emu.c generic.c x86emu.c
|
||||
libint10_la_SOURCES = \
|
||||
$(COMMON_SOURCES) \
|
||||
xf86x86emu.c \
|
||||
generic.c \
|
||||
x86emu.c
|
||||
endif
|
||||
|
||||
if INT10_STUB
|
||||
|
|
|
|||
|
|
@ -63,12 +63,6 @@ static void UnmapVRam(xf86Int10InfoPtr pInt);
|
|||
|
||||
static void *sysMem = NULL;
|
||||
|
||||
xf86Int10InfoPtr
|
||||
xf86InitInt10(int entityIndex)
|
||||
{
|
||||
return xf86ExtendedInitInt10(entityIndex, 0);
|
||||
}
|
||||
|
||||
xf86Int10InfoPtr
|
||||
xf86ExtendedInitInt10(int entityIndex, int Flags)
|
||||
{
|
||||
|
|
@ -149,59 +143,12 @@ xf86ExtendedInitInt10(int entityIndex, int Flags)
|
|||
|
||||
if (xf86IsEntityPrimary(entityIndex)
|
||||
&& !(initPrimary(options))) {
|
||||
|
||||
if (bios.bus == BUS_ISA && bios.location.legacy) {
|
||||
xf86DrvMsg(screen, X_CONFIG,
|
||||
"Overriding BIOS location: 0x%x\n",
|
||||
bios.location.legacy);
|
||||
cs = bios.location.legacy >> 4;
|
||||
#define CHECK_V_SEGMENT_RANGE(x) \
|
||||
if (((x) << 4) < V_BIOS) {\
|
||||
xf86DrvMsg(screen, X_ERROR, \
|
||||
"V_BIOS address 0x%lx out of range\n", \
|
||||
(unsigned long)(x) << 4); \
|
||||
goto error1; \
|
||||
}
|
||||
CHECK_V_SEGMENT_RANGE(cs);
|
||||
vbiosMem = (unsigned char *)sysMem - V_BIOS + (cs << 4);
|
||||
if (!int10_check_bios(screen, cs, vbiosMem)) {
|
||||
xf86DrvMsg(screen, X_ERROR,
|
||||
"No V_BIOS at specified address 0x%lx\n",
|
||||
(unsigned long)cs << 4);
|
||||
goto error1;
|
||||
}
|
||||
} else {
|
||||
if (bios.bus == BUS_PCI) {
|
||||
xf86DrvMsg(screen, X_WARNING,
|
||||
"Option BiosLocation for primary device ignored: "
|
||||
"It points to PCI.\n");
|
||||
xf86DrvMsg(screen, X_WARNING,
|
||||
"You must set Option InitPrimary also\n");
|
||||
}
|
||||
|
||||
cs = MEM_RW(pInt,((0x10<<2)+2));
|
||||
CHECK_V_SEGMENT_RANGE(cs);
|
||||
vbiosMem = (unsigned char *)sysMem - V_BIOS + (cs << 4);
|
||||
if (!int10_check_bios(screen, cs, vbiosMem)) {
|
||||
cs = MEM_RW(pInt, (0x42 << 2) + 2);
|
||||
CHECK_V_SEGMENT_RANGE(cs);
|
||||
vbiosMem = (unsigned char *)sysMem - V_BIOS + (cs << 4);
|
||||
if (!int10_check_bios(screen, cs, vbiosMem)) {
|
||||
cs = V_BIOS >> 4;
|
||||
vbiosMem = (unsigned char *)sysMem - V_BIOS + (cs << 4);
|
||||
if (!int10_check_bios(screen, cs, vbiosMem)) {
|
||||
xf86DrvMsg(screen, X_ERROR, "No V_BIOS found\n");
|
||||
goto error1;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (! xf86int10GetBiosSegment(pInt, &bios,
|
||||
(unsigned char *)sysMem - V_BIOS)) {
|
||||
goto error1;
|
||||
}
|
||||
|
||||
xf86DrvMsg(screen, X_INFO, "Primary V_BIOS segment is: 0x%lx\n",
|
||||
(unsigned long)cs);
|
||||
|
||||
set_return_trap(pInt);
|
||||
pInt->BIOSseg = cs;
|
||||
|
||||
pInt->Flags = Flags & (SET_BIOS_SCRATCH | RESTORE_BIOS_SCRATCH);
|
||||
if (! (pInt->Flags & SET_BIOS_SCRATCH))
|
||||
|
|
@ -209,54 +156,33 @@ xf86ExtendedInitInt10(int entityIndex, int Flags)
|
|||
xf86Int10SaveRestoreBIOSVars(pInt, TRUE);
|
||||
|
||||
} else {
|
||||
BusType location_type;
|
||||
const BusType location_type = xf86int10GetBiosLocationType(pInt,
|
||||
&bios);
|
||||
int bios_location = V_BIOS;
|
||||
int pci_entity;
|
||||
|
||||
EntityInfoPtr pEnt = xf86GetEntityInfo(pInt->entityIndex);
|
||||
|
||||
reset_int_vect(pInt);
|
||||
set_return_trap(pInt);
|
||||
|
||||
if (bios.bus != BUS_NONE) {
|
||||
switch (location_type = bios.bus) {
|
||||
case BUS_PCI:
|
||||
xf86DrvMsg(screen,X_CONFIG,"Overriding bios location: "
|
||||
"PCI:%i:%i%i\n",bios.location.pci.bus,
|
||||
bios.location.pci.dev,bios.location.pci.func);
|
||||
break;
|
||||
case BUS_ISA:
|
||||
bios_location = bios.location.legacy;
|
||||
if (bios.location.legacy)
|
||||
xf86DrvMsg(screen,X_CONFIG,"Overriding bios location: "
|
||||
"Legacy:0x%x\n",bios.location.legacy);
|
||||
else
|
||||
xf86DrvMsg(screen,X_CONFIG,"Overriding bios location: "
|
||||
"Legacy\n");
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
} else
|
||||
location_type = pEnt->location.type;
|
||||
|
||||
xfree(pEnt);
|
||||
|
||||
switch (location_type) {
|
||||
case BUS_PCI:
|
||||
case BUS_PCI: {
|
||||
const int pci_entity = (bios.bus == BUS_PCI)
|
||||
? xf86GetPciEntity(bios.location.pci.bus,
|
||||
bios.location.pci.dev,
|
||||
bios.location.pci.func)
|
||||
: pInt->entityIndex;
|
||||
|
||||
vbiosMem = (unsigned char *)base + bios_location;
|
||||
if (bios.bus == BUS_PCI)
|
||||
pci_entity = xf86GetPciEntity(bios.location.pci.bus,
|
||||
bios.location.pci.dev,
|
||||
bios.location.pci.func);
|
||||
else
|
||||
pci_entity = pInt->entityIndex;
|
||||
if (!(size = mapPciRom(pci_entity,(unsigned char *)(vbiosMem)))) {
|
||||
xf86DrvMsg(screen,X_ERROR,"Cannot read V_BIOS (3)\n");
|
||||
goto error1;
|
||||
}
|
||||
INTPriv(pInt)->highMemory = GET_HIGH_BASE(size);
|
||||
break;
|
||||
}
|
||||
case BUS_ISA:
|
||||
if (bios.bus == BUS_ISA) {
|
||||
bios_location = bios.location.legacy;
|
||||
}
|
||||
vbiosMem = (unsigned char *)sysMem + bios_location;
|
||||
#if 0
|
||||
(void)memset(vbiosMem, 0, V_BIOS_SIZE);
|
||||
|
|
|
|||
|
|
@ -594,7 +594,7 @@ pciCfg1outb(CARD16 addr, CARD8 val)
|
|||
}
|
||||
|
||||
CARD8
|
||||
bios_checksum(CARD8 *start, int size)
|
||||
bios_checksum(const CARD8 *start, int size)
|
||||
{
|
||||
CARD8 sum = 0;
|
||||
|
||||
|
|
@ -703,3 +703,9 @@ xf86Int10SaveRestoreBIOSVars(xf86Int10InfoPtr pInt, Bool save)
|
|||
xf86UnMapVidMem(pInt->scrnIndex,base - BIOS_SCRATCH_OFF ,pagesize);
|
||||
}
|
||||
#endif
|
||||
|
||||
xf86Int10InfoPtr
|
||||
xf86InitInt10(int entityIndex)
|
||||
{
|
||||
return xf86ExtendedInitInt10(entityIndex, 0);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -224,7 +224,7 @@ xf86HandleInt10Options(ScrnInfoPtr pScrn, int entityIndex)
|
|||
}
|
||||
|
||||
Bool
|
||||
int10skip(void* options)
|
||||
int10skip(const void* options)
|
||||
{
|
||||
Bool noint10 = FALSE;
|
||||
|
||||
|
|
@ -235,7 +235,7 @@ int10skip(void* options)
|
|||
}
|
||||
|
||||
Bool
|
||||
int10_check_bios(int scrnIndex, int codeSeg, unsigned char* vbiosMem)
|
||||
int10_check_bios(int scrnIndex, int codeSeg, const unsigned char* vbiosMem)
|
||||
{
|
||||
int size;
|
||||
|
||||
|
|
@ -262,7 +262,7 @@ int10_check_bios(int scrnIndex, int codeSeg, unsigned char* vbiosMem)
|
|||
}
|
||||
|
||||
Bool
|
||||
initPrimary(void* options)
|
||||
initPrimary(const void* options)
|
||||
{
|
||||
Bool initPrimary = FALSE;
|
||||
|
||||
|
|
@ -281,39 +281,33 @@ initPrimary(void* options)
|
|||
* be used with extreme care.
|
||||
*/
|
||||
void
|
||||
xf86int10ParseBiosLocation(void* options,
|
||||
xf86int10ParseBiosLocation(const void* options,
|
||||
xf86int10BiosLocationPtr bios)
|
||||
{
|
||||
char *s;
|
||||
char *p;
|
||||
char *str = NULL;
|
||||
|
||||
if (options)
|
||||
str = xf86GetOptValString(options,OPT_BIOS_LOCATION);
|
||||
const char *p;
|
||||
const char *str;
|
||||
|
||||
bios->bus = BUS_NONE;
|
||||
if (!str)
|
||||
return;
|
||||
|
||||
s = xstrdup(str);
|
||||
p = strtok(s,":");
|
||||
if (xf86NameCmp(p,"pci") == 0) bios->bus = BUS_PCI;
|
||||
else
|
||||
if (xf86NameCmp(p,"primary") == 0) bios->bus = BUS_ISA;
|
||||
|
||||
xfree(s);
|
||||
if ((options == NULL)
|
||||
|| ((str = xf86GetOptValString(options, OPT_BIOS_LOCATION)) == NULL)) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (strncasecmp(str, "pci", 3) == 0) {
|
||||
bios->bus = BUS_PCI;
|
||||
} else if (strncasecmp(str, "primary", 7) == 0) {
|
||||
bios->bus = BUS_ISA;
|
||||
}
|
||||
else {
|
||||
return;
|
||||
}
|
||||
|
||||
if (bios->bus == BUS_NONE) return;
|
||||
|
||||
s = xstrdup(str);
|
||||
p = strchr(s, ':');
|
||||
p = strchr(str, ':');
|
||||
|
||||
switch (bios->bus) {
|
||||
case BUS_ISA:
|
||||
if (p)
|
||||
bios->location.legacy = atoi(++p);
|
||||
else
|
||||
bios->location.legacy = 0;
|
||||
bios->location.legacy = (p != NULL) ? atoi(++p) : 0;
|
||||
break;
|
||||
case BUS_PCI:
|
||||
if (p) {
|
||||
|
|
@ -332,8 +326,107 @@ xf86int10ParseBiosLocation(void* options,
|
|||
default:
|
||||
break;
|
||||
}
|
||||
xfree(s);
|
||||
}
|
||||
|
||||
|
||||
BusType
|
||||
xf86int10GetBiosLocationType(const xf86Int10InfoPtr pInt,
|
||||
const xf86int10BiosLocationPtr bios)
|
||||
{
|
||||
BusType location_type = bios->bus;
|
||||
|
||||
switch (location_type) {
|
||||
case BUS_PCI:
|
||||
xf86DrvMsg(pInt->scrnIndex,X_CONFIG,"Overriding bios location: "
|
||||
"PCI:%i:%i%i\n",bios->location.pci.bus,
|
||||
bios->location.pci.dev,bios->location.pci.func);
|
||||
break;
|
||||
case BUS_ISA:
|
||||
if (bios->location.legacy)
|
||||
xf86DrvMsg(pInt->scrnIndex,X_CONFIG,"Overriding bios location: "
|
||||
"Legacy:0x%x\n",bios->location.legacy);
|
||||
else
|
||||
xf86DrvMsg(pInt->scrnIndex,X_CONFIG,"Overriding bios location: "
|
||||
"Legacy\n");
|
||||
break;
|
||||
case BUS_NONE: {
|
||||
EntityInfoPtr pEnt = xf86GetEntityInfo(pInt->entityIndex);
|
||||
location_type = pEnt->location.type;
|
||||
xfree(pEnt);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return location_type;
|
||||
}
|
||||
|
||||
|
||||
#define CHECK_V_SEGMENT_RANGE(x) \
|
||||
if (((x) << 4) < V_BIOS) { \
|
||||
xf86DrvMsg(pInt->scrnIndex, X_ERROR, \
|
||||
"V_BIOS address 0x%lx out of range\n", \
|
||||
(unsigned long)(x) << 4); \
|
||||
return FALSE; \
|
||||
}
|
||||
|
||||
Bool
|
||||
xf86int10GetBiosSegment(xf86Int10InfoPtr pInt,
|
||||
const xf86int10BiosLocationPtr bios, void * base)
|
||||
{
|
||||
unsigned i;
|
||||
int cs = ~0;
|
||||
int segments[4];
|
||||
const char * format;
|
||||
|
||||
|
||||
if (bios->bus == BUS_ISA && bios->location.legacy) {
|
||||
xf86DrvMsg(pInt->scrnIndex, X_CONFIG,
|
||||
"Overriding BIOS location: 0x%x\n",
|
||||
bios->location.legacy);
|
||||
|
||||
segments[0] = bios->location.legacy >> 4;
|
||||
segments[1] = ~0;
|
||||
|
||||
format = "No V_BIOS at specified address 0x%lx\n";
|
||||
} else {
|
||||
if (bios->bus == BUS_PCI) {
|
||||
xf86DrvMsg(pInt->scrnIndex, X_WARNING,
|
||||
"Option BiosLocation for primary device ignored: "
|
||||
"It points to PCI.\n");
|
||||
xf86DrvMsg(pInt->scrnIndex, X_WARNING,
|
||||
"You must set Option InitPrimary also\n");
|
||||
}
|
||||
|
||||
segments[0] = MEM_RW(pInt, (0x10 << 2) + 2);
|
||||
segments[1] = MEM_RW(pInt, (0x42 << 2) + 2);
|
||||
segments[2] = V_BIOS >> 4;
|
||||
segments[3] = ~0;
|
||||
|
||||
format = "No V_BIOS found\n";
|
||||
}
|
||||
|
||||
for (i = 0; segments[i] != ~0; i++) {
|
||||
unsigned char * vbiosMem;
|
||||
|
||||
cs = segments[i];
|
||||
|
||||
CHECK_V_SEGMENT_RANGE(cs);
|
||||
vbiosMem = (unsigned char *)base + (cs << 4);
|
||||
if (int10_check_bios(pInt->scrnIndex, cs, vbiosMem)) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (segments[i] == ~0) {
|
||||
xf86DrvMsg(pInt->scrnIndex, X_ERROR, format, (unsigned long)cs << 4);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
xf86DrvMsg(pInt->scrnIndex, X_INFO, "Primary V_BIOS segment is: 0x%lx\n",
|
||||
(unsigned long)cs);
|
||||
|
||||
pInt->BIOSseg = cs;
|
||||
return TRUE;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -143,7 +143,7 @@ void dump_code(xf86Int10InfoPtr pInt);
|
|||
void dump_registers(xf86Int10InfoPtr pInt);
|
||||
void stack_trace(xf86Int10InfoPtr pInt);
|
||||
xf86Int10InfoPtr getInt10Rec(int entityIndex);
|
||||
CARD8 bios_checksum(CARD8 *start, int size);
|
||||
CARD8 bios_checksum(const CARD8 *start, int size);
|
||||
void LockLegacyVGA(xf86Int10InfoPtr pInt, legacyVGAPtr vga);
|
||||
void UnlockLegacyVGA(xf86Int10InfoPtr pInt, legacyVGAPtr vga);
|
||||
#if defined (_PC)
|
||||
|
|
@ -182,11 +182,16 @@ int setup_system_bios(void *base_addr);
|
|||
void reset_int_vect(xf86Int10InfoPtr pInt);
|
||||
void set_return_trap(xf86Int10InfoPtr pInt);
|
||||
void * xf86HandleInt10Options(ScrnInfoPtr pScrn, int entityIndex);
|
||||
Bool int10skip(void* options);
|
||||
Bool int10_check_bios(int scrnIndex, int codeSeg, unsigned char* vbiosMem);
|
||||
Bool initPrimary(void* options);
|
||||
void xf86int10ParseBiosLocation(void* options,
|
||||
Bool int10skip(const void* options);
|
||||
Bool int10_check_bios(int scrnIndex, int codeSeg,
|
||||
const unsigned char* vbiosMem);
|
||||
Bool initPrimary(const void* options);
|
||||
void xf86int10ParseBiosLocation(const void* options,
|
||||
xf86int10BiosLocationPtr bios);
|
||||
BusType xf86int10GetBiosLocationType(const xf86Int10InfoPtr pInt,
|
||||
const xf86int10BiosLocationPtr bios);
|
||||
Bool xf86int10GetBiosSegment(xf86Int10InfoPtr pInt,
|
||||
const xf86int10BiosLocationPtr bios, void * base);
|
||||
#ifdef DEBUG
|
||||
void dprint(unsigned long start, unsigned long size);
|
||||
#endif
|
||||
|
|
|
|||
Loading…
Reference in a new issue