[Intel-gfx] [PATCH] Eliminate INT10 call to get BIOS contents

Keith Packard keithp at keithp.com
Thu Oct 2 01:36:12 CEST 2008


On Mon, 2008-09-29 at 19:09 -0700, Keith Packard wrote:
> Here's another pass at this patch, it moves the remaining vbe defines to
> i810.h to make sure no modern driver can use them. It also error-checks
> the return from the BIOS read functions in case something bad happens
> there. Please take a look, send comments and test results.

Sigh. I think I must have posted the first patch here; let me try this
again. Thanks, Eric, for noticing that I didn't manage to actually post
the new patch.

---

From ac85ef79c2411ad2652d3ba5df8d6441ade2cfdf Mon Sep 17 00:00:00 2001
From: Keith Packard <keithp at keithp.com>
Date: Mon, 29 Sep 2008 17:37:28 -0700
Subject: [PATCH] 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 at keithp.com>
---
 src/common.h      |   17 -----------------
 src/i810.h        |    3 ++-
 src/i810_driver.c |   10 +---------
 src/i830.h        |    2 --
 src/i830_bios.c   |   41 +++++++++++++++++++----------------------
 src/i830_driver.c |    9 ---------
 src/i830_modes.c  |    1 -
 7 files changed, 22 insertions(+), 61 deletions(-)

diff --git a/src/common.h b/src/common.h
index 840d30a..acd5f4a 100644
--- a/src/common.h
+++ b/src/common.h
@@ -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;
diff --git a/src/i810.h b/src/i810.h
index e7331f6..7ea2043 100644
--- a/src/i810.h
+++ b/src/i810.h
@@ -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
diff --git a/src/i810_driver.c b/src/i810_driver.c
index a7f408c..cc28ad8 100644
--- a/src/i810_driver.c
+++ b/src/i810_driver.c
@@ -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
diff --git a/src/i830.h b/src/i830.h
index 491dfd0..5b78236 100644
--- a/src/i830.h
+++ b/src/i830.h
@@ -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"
diff --git a/src/i830_bios.c b/src/i830_bios.c
index ff49025..fbc7707 100644
--- a/src/i830_bios.c
+++ b/src/i830_bios.c
@@ -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)
 {
@@ -179,34 +176,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);
diff --git a/src/i830_driver.c b/src/i830_driver.c
index ce7b623..0fe24fd 100644
--- a/src/i830_driver.c
+++ b/src/i830_driver.c
@@ -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;
diff --git a/src/i830_modes.c b/src/i830_modes.c
index 06921a5..4aa493e 100644
--- a/src/i830_modes.c
+++ b/src/i830_modes.c
@@ -31,7 +31,6 @@
  * Authors: David Dawes <dawes at xfree86.org>
  *	    Eric Anholt <eric.anholt at 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 at tungstengraphics.com>
-- 
1.5.6.5


-- 
keith.packard at intel.com
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 189 bytes
Desc: This is a digitally signed message part
URL: <http://lists.freedesktop.org/archives/intel-gfx/attachments/20081001/c21b4258/attachment.sig>


More information about the Intel-gfx mailing list