Eliminate INT10 call to get BIOS contents

libpciaccess (and the old X server PCI code as well) provides a function to
get the ROM contents. Code to use that was already present in the driver and
used if the INT10 function failed. Skip the INT10 and just use libpciaccess
as that eliminates several module loads and scary use of vm86.

Signed-off-by: Keith Packard <keithp@keithp.com>
This commit is contained in:
Keith Packard 2008-09-29 17:37:28 -07:00
parent ab2b70f831
commit 8304b405e0
7 changed files with 22 additions and 61 deletions

View File

@ -81,8 +81,6 @@ extern void I830InitpScrn(ScrnInfoPtr pScrn);
extern int I830EntityIndex;
extern const char *I810vgahwSymbols[];
extern const char *I810ramdacSymbols[];
extern const char *I810int10Symbols[];
extern const char *I810vbeSymbols[];
extern const char *I810ddcSymbols[];
extern const char *I810fbSymbols[];
extern const char *I810xaaSymbols[];
@ -106,21 +104,6 @@ extern void I830DPRINTF_stub(const char *filename, int line,
#define RecPtr pI810
#endif
/* BIOS debug macro */
#define xf86ExecX86int10_wrapper(pInt, pScrn) do { \
ErrorF("Executing (ax == 0x%x) BIOS call at %s:%d\n", pInt->ax, __FILE__, __LINE__); \
if (I810_DEBUG & DEBUG_VERBOSE_BIOS) { \
ErrorF("Checking Error state before execution\n"); \
PrintErrorState(pScrn); \
} \
xf86ExecX86int10(pInt); \
if(I810_DEBUG & DEBUG_VERBOSE_BIOS) { \
ErrorF("Checking Error state after execution\n"); \
usleep(50000); \
PrintErrorState(pScrn); \
} \
} while (0)
static inline void memset_volatile(volatile void *b, int c, size_t len)
{
int i;

View File

@ -47,7 +47,6 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#include "xaa.h"
#include "xf86Cursor.h"
#include "xf86xv.h"
#include "xf86int10.h"
#include "vbe.h"
#include "vgaHW.h"
@ -276,6 +275,8 @@ typedef struct _I810Rec {
int drmMinor;
} I810Rec;
extern const char *I810vbeSymbols[];
#define I810PTR(p) ((I810Ptr)((p)->driverPrivate))
#define I810_SELECT_FRONT 0

View File

@ -342,14 +342,6 @@ const char *I810ddcSymbols[] = {
NULL
};
const char *I810int10Symbols[] = {
"xf86ExecX86int10",
"xf86InitInt10",
"xf86Int10AllocPages",
"xf86int10Addr",
NULL
};
const char *I810xaaSymbols[] = {
"XAACreateInfoRec",
"XAADestroyInfoRec",
@ -518,7 +510,7 @@ i810Setup(pointer module, pointer opts, int *errmaj, int *errmin)
#endif
I810shadowFBSymbols,
I810vbeSymbols, vbeOptionalSymbols,
I810ddcSymbols, I810int10Symbols, NULL);
I810ddcSymbols, NULL);
/*
* The return value must be non-NULL on success even though there

View File

@ -56,8 +56,6 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#include "xaa.h"
#include "xf86Cursor.h"
#include "xf86xv.h"
#include "xf86int10.h"
#include "vbe.h"
#include "vgaHW.h"
#include "xf86Crtc.h"
#include "xf86RandR12.h"

View File

@ -47,9 +47,6 @@
(bios[_addr + 2] << 16) \
(bios[_addr + 3] << 24))
/* XXX */
#define INTEL_VBIOS_SIZE (64 * 1024)
static void *
find_section(struct bdb_header *bdb, int section_id)
{
@ -180,34 +177,34 @@ i830_bios_init(ScrnInfoPtr pScrn)
struct bdb_header *bdb;
int vbt_off, bdb_off;
unsigned char *bios;
vbeInfoPtr pVbe;
pointer pVBEModule = NULL;
int ret;
int size;
bios = xalloc(INTEL_VBIOS_SIZE);
#if XSERVER_LIBPCIACCESS
size = pI830->PciInfo->rom_size;
#else
#define INTEL_VBIOS_SIZE (64 * 1024) /* XXX */
size = INTEL_VBIOS_SIZE;
#endif
if (size == 0)
return -1;
bios = xalloc(size);
if (bios == NULL)
return -1;
/* Load vbe module */
if (!(pVBEModule = xf86LoadSubModule(pScrn, "vbe")))
return FALSE;
xf86LoaderReqSymLists(I810vbeSymbols, NULL);
pVbe = VBEInit(NULL, pI830->pEnt->index);
if (pVbe != NULL) {
memcpy(bios, xf86int10Addr(pVbe->pInt10,
pVbe->pInt10->BIOSseg << 4),
INTEL_VBIOS_SIZE);
vbeFree (pVbe);
} else {
#if XSERVER_LIBPCIACCESS
pci_device_read_rom (pI830->PciInfo, bios);
ret = pci_device_read_rom (pI830->PciInfo, bios);
if (ret != 0)
return -1;
#else
xf86ReadPciBIOS(0, pI830->PciTag, 0, bios, INTEL_VBIOS_SIZE);
/* xf86ReadPciBIOS returns the length read */
ret = xf86ReadPciBIOS(0, pI830->PciTag, 0, bios, size);
if (ret <= 0)
return -1;
#endif
}
vbt_off = INTEL_BIOS_16(0x1a);
if (vbt_off >= INTEL_VBIOS_SIZE) {
if (vbt_off >= size) {
xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Bad VBT offset: 0x%x\n",
vbt_off);
xfree(bios);

View File

@ -191,7 +191,6 @@ USE OR OTHER DEALINGS IN THE SOFTWARE.
#include "dixstruct.h"
#include "xf86xv.h"
#include <X11/extensions/Xv.h>
#include "vbe.h"
#include "shadow.h"
#include "i830.h"
#include "i830_display.h"
@ -441,9 +440,6 @@ I830DetectMemory(ScrnInfoPtr pScrn)
uint16_t gmch_ctrl;
int memsize = 0, gtt_size;
int range;
#if 0
VbeInfoBlock *vbeInfo;
#endif
#if XSERVER_LIBPCIACCESS
struct pci_device *bridge = intel_host_bridge ();
@ -1420,11 +1416,6 @@ I830LoadSyms(ScrnInfoPtr pScrn)
if (pI830->use_drm_mode)
return TRUE;
/* Load int10 module */
if (!xf86LoadSubModule(pScrn, "int10"))
return FALSE;
xf86LoaderReqSymLists(I810int10Symbols, NULL);
/* The vgahw module should be loaded here when needed */
if (!xf86LoadSubModule(pScrn, "vgahw"))
return FALSE;

View File

@ -31,7 +31,6 @@
* Authors: David Dawes <dawes@xfree86.org>
* Eric Anholt <eric.anholt@intel.com>
*
* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/vbe/vbeModes.c,v 1.6 2002/11/02 01:38:25 dawes Exp $
*/
/*
* Modified by Alan Hourihane <alanh@tungstengraphics.com>