xf86-video-intel: src/intel_device.c src/intel_driver.h src/intel_module.c src/legacy/i810 src/sna/gen5_render.c src/sna/gen6_render.c src/sna/gen7_render.c src/sna/gen8_render.c src/sna/sna_accel.c src/sna/sna_dri2.c src/sna/sna_dri3.c src/sna/sna_driver.c src/sna/sna.h src/sna/sna_video_hwmc.c src/uxa/intel_dri3.c src/uxa/intel_driver.c src/uxa/intel.h src/uxa/intel_hwmc.c src/uxa/intel_memory.c

Chris Wilson ickle at kemper.freedesktop.org
Wed Oct 8 06:09:37 PDT 2014


 src/intel_device.c            |   59 +++++++++++++++++++-----------------------
 src/intel_driver.h            |   21 +++++++-------
 src/intel_module.c            |   38 ++++++++++++++-------------
 src/legacy/i810/i810_driver.c |    2 -
 src/sna/gen5_render.c         |    2 -
 src/sna/gen6_render.c         |    2 -
 src/sna/gen7_render.c         |    2 -
 src/sna/gen8_render.c         |    2 -
 src/sna/sna.h                 |    1 
 src/sna/sna_accel.c           |    2 -
 src/sna/sna_dri2.c            |    2 -
 src/sna/sna_dri3.c            |    2 -
 src/sna/sna_driver.c          |   22 ++++++++-------
 src/sna/sna_video_hwmc.c      |    2 -
 src/uxa/intel.h               |   15 ++++------
 src/uxa/intel_dri3.c          |    4 ++
 src/uxa/intel_driver.c        |   21 +++++++-------
 src/uxa/intel_hwmc.c          |    8 ++++-
 src/uxa/intel_memory.c        |    2 -
 19 files changed, 108 insertions(+), 101 deletions(-)

New commits:
commit c139e2fb95f2db0b39aadcd58cc63b316a278951
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Wed Oct 8 13:59:55 2014 +0100

    intel: Store pointer to struct intel_device
    
    Beware the barbarians at the gate, who invade and steal your ScrnInfoPtr
    and its Entity from underneath you. In some configurations, we lose
    access to the struct intel_device stored on the Entity after
    initialisation, causing havoc. Workaround this by storing the
    intel_device that we open in our driverPrivate.
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/intel_device.c b/src/intel_device.c
index 2e16ce5..140e153 100644
--- a/src/intel_device.c
+++ b/src/intel_device.c
@@ -65,9 +65,11 @@
 #include "fd.h"
 
 struct intel_device {
+	int idx;
 	char *master_node;
 	char *render_node;
 	int fd;
+	int device_id;
 	int open_count;
 	int master_count;
 };
@@ -184,7 +186,7 @@ int intel_entity_get_devid(int idx)
 	if (dev == NULL)
 		return 0;
 
-	return __intel_get_device_id(dev->fd);
+	return dev->device_id;
 }
 
 static inline struct intel_device *intel_device(ScrnInfoPtr scrn)
@@ -195,11 +197,6 @@ static inline struct intel_device *intel_device(ScrnInfoPtr scrn)
 	return xf86GetEntityPrivate(scrn->entityList[0], intel_device_key)->ptr;
 }
 
-static inline void intel_set_device(ScrnInfoPtr scrn, struct intel_device *dev)
-{
-	xf86GetEntityPrivate(scrn->entityList[0], intel_device_key)->ptr = dev;
-}
-
 static int is_i915_device(int fd)
 {
 	drm_version_t version;
@@ -585,6 +582,12 @@ int intel_open_device(int entity_num,
 	if (geteuid() && is_master(fd))
 		master_count++;
 
+	if (pci)
+		dev->device_id = pci->device_id;
+	else
+		dev->device_id = __intel_get_device_id(fd);
+
+	dev->idx = entity_num;
 	dev->fd = fd;
 	dev->open_count = master_count;
 	dev->master_count = master_count;
@@ -615,24 +618,24 @@ int __intel_peek_fd(ScrnInfoPtr scrn)
 	return dev->fd;
 }
 
-int intel_has_render_node(ScrnInfoPtr scrn)
+int intel_has_render_node(struct intel_device *dev)
 {
-	struct intel_device *dev;
 	struct stat st;
 
-	dev = intel_device(scrn);
 	assert(dev && dev->fd != -1);
-
 	return is_render_node(dev->fd, &st);
 }
 
-int intel_get_device(ScrnInfoPtr scrn)
+struct intel_device *intel_get_device(ScrnInfoPtr scrn, int *fd)
 {
 	struct intel_device *dev;
 	int ret;
 
 	dev = intel_device(scrn);
-	assert(dev && dev->fd != -1);
+	if (dev == NULL)
+		return NULL;
+
+	assert(dev->fd != -1);
 
 	if (dev->open_count++ == 0) {
 		drmSetVersion sv;
@@ -661,16 +664,16 @@ int intel_get_device(ScrnInfoPtr scrn)
 				   strerror(errno), errno);
 			dump_clients_info(scrn, dev->fd);
 			dev->open_count--;
-			return -1;
+			return NULL;
 		}
 	}
 
-	return dev->fd;
+	*fd = dev->fd;
+	return dev;
 }
 
-const char *intel_get_client_name(ScrnInfoPtr scrn)
+const char *intel_get_client_name(struct intel_device *dev)
 {
-	struct intel_device *dev = intel_device(scrn);
 	assert(dev && dev->render_node);
 	return dev->render_node;
 }
@@ -686,14 +689,11 @@ static int authorise(struct intel_device *dev, int fd)
 	return drmGetMagic(fd, &magic) == 0 && drmAuthMagic(dev->fd, magic) == 0;
 }
 
-int intel_get_client_fd(ScrnInfoPtr scrn)
+int intel_get_client_fd(struct intel_device *dev)
 {
-	struct intel_device *dev;
 	int fd = -1;
 
-	dev = intel_device(scrn);
-	assert(dev);
-	assert(dev->fd != -1);
+	assert(dev && dev->fd != -1);
 	assert(dev->render_node);
 
 #ifdef O_CLOEXEC
@@ -714,16 +714,14 @@ int intel_get_client_fd(ScrnInfoPtr scrn)
 	return fd;
 }
 
-int intel_get_device_id(ScrnInfoPtr scrn)
+int intel_get_device_id(struct intel_device *dev)
 {
-	struct intel_device *dev = intel_device(scrn);
 	assert(dev && dev->fd != -1);
-	return __intel_get_device_id(dev->fd);
+	return dev->device_id;
 }
 
-int intel_get_master(ScrnInfoPtr scrn)
+int intel_get_master(struct intel_device *dev)
 {
-	struct intel_device *dev = intel_device(scrn);
 	int ret;
 
 	assert(dev && dev->fd != -1);
@@ -744,9 +742,8 @@ int intel_get_master(ScrnInfoPtr scrn)
 	return ret;
 }
 
-int intel_put_master(ScrnInfoPtr scrn)
+int intel_put_master(struct intel_device *dev)
 {
-	struct intel_device *dev = intel_device(scrn);
 	int ret;
 
 	assert(dev && dev->fd != -1);
@@ -762,10 +759,8 @@ int intel_put_master(ScrnInfoPtr scrn)
 	return ret;
 }
 
-void intel_put_device(ScrnInfoPtr scrn)
+void intel_put_device(struct intel_device *dev)
 {
-	struct intel_device *dev = intel_device(scrn);
-
 	assert(dev && dev->fd != -1);
 
 	assert(dev->open_count);
@@ -773,7 +768,7 @@ void intel_put_device(ScrnInfoPtr scrn)
 		return;
 
 	assert(!hosted());
-	intel_set_device(scrn, NULL);
+	xf86GetEntityPrivate(dev->idx, intel_device_key)->ptr = NULL;
 
 	drmClose(dev->fd);
 	if (dev->render_node != dev->master_node)
diff --git a/src/intel_driver.h b/src/intel_driver.h
index 13e2688..f3eb90a 100644
--- a/src/intel_driver.h
+++ b/src/intel_driver.h
@@ -117,23 +117,24 @@ struct xf86_platform_device;
 struct intel_device_info {
 	int gen;
 };
+struct intel_device;
 
 int intel_entity_get_devid(int index);
 
-void intel_detect_chipset(ScrnInfoPtr scrn, EntityInfoPtr ent);
-
 int intel_open_device(int entity_num,
 		      const struct pci_device *pci,
 		      struct xf86_platform_device *dev);
 int __intel_peek_fd(ScrnInfoPtr scrn);
-int intel_has_render_node(ScrnInfoPtr scrn);
-int intel_get_device(ScrnInfoPtr scrn);
-const char *intel_get_client_name(ScrnInfoPtr scrn);
-int intel_get_client_fd(ScrnInfoPtr scrn);
-int intel_get_device_id(ScrnInfoPtr scrn);
-int intel_get_master(ScrnInfoPtr scrn);
-int intel_put_master(ScrnInfoPtr scrn);
-void intel_put_device(ScrnInfoPtr scrn);
+struct intel_device *intel_get_device(ScrnInfoPtr scrn, int *fd);
+int intel_has_render_node(struct intel_device *dev);
+const char *intel_get_client_name(struct intel_device *dev);
+int intel_get_client_fd(struct intel_device *dev);
+int intel_get_device_id(struct intel_device *dev);
+int intel_get_master(struct intel_device *dev);
+int intel_put_master(struct intel_device *dev);
+void intel_put_device(struct intel_device *dev);
+
+void intel_detect_chipset(ScrnInfoPtr scrn, struct intel_device *dev);
 
 #define IS_DEFAULT_ACCEL_METHOD(x) ({ \
 	enum { NOACCEL, SNA, UXA, GLAMOR } default_accel_method__ = DEFAULT_ACCEL_METHOD; \
diff --git a/src/intel_module.c b/src/intel_module.c
index e3da290..2fbb4df 100644
--- a/src/intel_module.c
+++ b/src/intel_module.c
@@ -325,27 +325,31 @@ static const struct pci_id_match intel_device_match[] = {
 };
 
 void
-intel_detect_chipset(ScrnInfoPtr scrn, EntityInfoPtr ent)
+intel_detect_chipset(ScrnInfoPtr scrn, struct intel_device *dev)
 {
-	MessageType from = X_PROBED;
-	const char *name = NULL;
 	int devid;
+	const char *name = NULL;
 	int i;
 
-	if (ent->device->chipID >= 0) {
-		xf86DrvMsg(scrn->scrnIndex, from = X_CONFIG,
-			   "ChipID override: 0x%04X\n",
-			   ent->device->chipID);
-		devid = ent->device->chipID;
-	} else {
+	if (dev == NULL) {
+		EntityInfoPtr ent;
 		struct pci_device *pci;
 
-		pci = xf86GetPciInfoForEntity(ent->index);
-		if (pci != NULL)
-			devid = pci->device_id;
-		else
-			devid = intel_get_device_id(scrn);
-	}
+		ent = xf86GetEntityInfo(scrn->entityList[0]);
+		if (ent->device->chipID >= 0) {
+			xf86DrvMsg(scrn->scrnIndex, X_CONFIG,
+				   "ChipID override: 0x%04X\n",
+				   ent->device->chipID);
+			devid = ent->device->chipID;
+		} else {
+			pci = xf86GetPciInfoForEntity(ent->index);
+			if (pci)
+				devid = pci->device_id;
+			else
+				devid = ~0;
+		}
+	} else
+		devid = intel_get_device_id(dev);
 
 	for (i = 0; intel_chipsets[i].name != NULL; i++) {
 		if (devid == intel_chipsets[i].token) {
@@ -365,7 +369,7 @@ intel_detect_chipset(ScrnInfoPtr scrn, EntityInfoPtr ent)
 		}
 
 		if (gen) {
-			xf86DrvMsg(scrn->scrnIndex, from,
+			xf86DrvMsg(scrn->scrnIndex, X_PROBED,
 				   "gen%d engineering sample\n", gen);
 		} else {
 			xf86DrvMsg(scrn->scrnIndex, X_WARNING,
@@ -374,7 +378,7 @@ intel_detect_chipset(ScrnInfoPtr scrn, EntityInfoPtr ent)
 
 		name = "unknown";
 	} else {
-		xf86DrvMsg(scrn->scrnIndex, from,
+		xf86DrvMsg(scrn->scrnIndex, X_PROBED,
 			   "Integrated Graphics Chipset: Intel(R) %s\n",
 			   name);
 	}
diff --git a/src/legacy/i810/i810_driver.c b/src/legacy/i810/i810_driver.c
index 3d53d04..778b1a4 100644
--- a/src/legacy/i810/i810_driver.c
+++ b/src/legacy/i810/i810_driver.c
@@ -364,7 +364,7 @@ I810PreInit(ScrnInfoPtr scrn, int flags)
     */
    I810DoDDC(scrn, pI810->pEnt->index);
 
-   intel_detect_chipset(scrn, pI810->pEnt);
+   intel_detect_chipset(scrn, NULL);
 
    pI810->LinearAddr = pI810->PciInfo->regions[0].base_addr;
    xf86DrvMsg(scrn->scrnIndex, X_PROBED, "Linear framebuffer at 0x%lX\n",
diff --git a/src/sna/gen5_render.c b/src/sna/gen5_render.c
index 435e674..37cf1ff 100644
--- a/src/sna/gen5_render.c
+++ b/src/sna/gen5_render.c
@@ -3333,7 +3333,7 @@ const char *gen5_render_init(struct sna *sna, const char *backend)
 #if !NO_COMPOSITE_SPANS
 	sna->render.check_composite_spans = gen5_check_composite_spans;
 	sna->render.composite_spans = gen5_render_composite_spans;
-	if (intel_get_device_id(sna->scrn) == 0x0044)
+	if (intel_get_device_id(sna->dev) == 0x0044)
 		sna->render.prefer_gpu |= PREFER_GPU_SPANS;
 #endif
 	sna->render.video = gen5_render_video;
diff --git a/src/sna/gen6_render.c b/src/sna/gen6_render.c
index 5c625ef..a05196a 100644
--- a/src/sna/gen6_render.c
+++ b/src/sna/gen6_render.c
@@ -3633,7 +3633,7 @@ static bool gen6_render_setup(struct sna *sna, int devid)
 
 const char *gen6_render_init(struct sna *sna, const char *backend)
 {
-	int devid = intel_get_device_id(sna->scrn);
+	int devid = intel_get_device_id(sna->dev);
 
 	if (!gen6_render_setup(sna, devid))
 		return backend;
diff --git a/src/sna/gen7_render.c b/src/sna/gen7_render.c
index 16e666b..2d8f296 100644
--- a/src/sna/gen7_render.c
+++ b/src/sna/gen7_render.c
@@ -3885,7 +3885,7 @@ static bool gen7_render_setup(struct sna *sna, int devid)
 
 const char *gen7_render_init(struct sna *sna, const char *backend)
 {
-	int devid = intel_get_device_id(sna->scrn);
+	int devid = intel_get_device_id(sna->dev);
 
 	if (!gen7_render_setup(sna, devid))
 		return backend;
diff --git a/src/sna/gen8_render.c b/src/sna/gen8_render.c
index 6cc7a68..b615fa0 100644
--- a/src/sna/gen8_render.c
+++ b/src/sna/gen8_render.c
@@ -3885,7 +3885,7 @@ static bool gen8_render_setup(struct sna *sna)
 	int i, j, k, l, m;
 	uint32_t devid;
 
-	devid = intel_get_device_id(sna->scrn);
+	devid = intel_get_device_id(sna->dev);
 	if (devid & 0xf)
 		state->gt = ((devid >> 4) & 0xf) + 1;
 	DBG(("%s: gt=%d\n", __FUNCTION__, state->gt));
diff --git a/src/sna/sna.h b/src/sna/sna.h
index 1a6244b..30b0292 100644
--- a/src/sna/sna.h
+++ b/src/sna/sna.h
@@ -242,6 +242,7 @@ struct sna {
 	struct kgem kgem;
 
 	ScrnInfoPtr scrn;
+	struct intel_device *dev;
 
 	unsigned flags;
 #define SNA_IS_SLAVED		0x1
diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c
index a6ba2a0..12221f2 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -17886,7 +17886,7 @@ void sna_accel_leave(struct sna *sna)
 		return;
 
 	/* as a user, we can only render now if we have a rendernode */
-	if (intel_has_render_node(sna->scrn))
+	if (intel_has_render_node(sna->dev))
 		return;
 
 	/* no longer authorized to use our fd */
diff --git a/src/sna/sna_dri2.c b/src/sna/sna_dri2.c
index d38e43a..04ba786 100644
--- a/src/sna/sna_dri2.c
+++ b/src/sna/sna_dri2.c
@@ -3300,7 +3300,7 @@ bool sna_dri2_open(struct sna *sna, ScreenPtr screen)
 	memset(&info, '\0', sizeof(info));
 	info.fd = sna->kgem.fd;
 	info.driverName = dri_driver_name(sna);
-	info.deviceName = intel_get_client_name(sna->scrn);
+	info.deviceName = intel_get_client_name(sna->dev);
 
 	DBG(("%s: loading dri driver '%s' [gen=%d] for device '%s'\n",
 	     __FUNCTION__, info.driverName, sna->kgem.gen, info.deviceName));
diff --git a/src/sna/sna_dri3.c b/src/sna/sna_dri3.c
index cd4c174..1f09aec 100644
--- a/src/sna/sna_dri3.c
+++ b/src/sna/sna_dri3.c
@@ -158,7 +158,7 @@ static int sna_dri3_open_device(ScreenPtr screen,
 	int fd;
 
 	DBG(("%s()\n", __FUNCTION__));
-	fd = intel_get_client_fd(xf86ScreenToScrn(screen));
+	fd = intel_get_client_fd(to_sna_from_screen(screen)->dev);
 	if (fd < 0)
 		return -fd;
 
diff --git a/src/sna/sna_driver.c b/src/sna/sna_driver.c
index a09aa98..03db760 100644
--- a/src/sna/sna_driver.c
+++ b/src/sna/sna_driver.c
@@ -268,7 +268,7 @@ static Bool sna_create_screen_resources(ScreenPtr screen)
 	 * already revoked our KMS privileges, so just carry on regardless,
 	 * and hope that everything is sorted after the VT switch.
 	 */
-	if (intel_get_master(sna->scrn) == 0) {
+	if (intel_get_master(sna->dev) == 0) {
 		/* Only preserve the fbcon, not any subsequent server regens */
 		if (serverGeneration == 1 && (sna->flags & SNA_IS_HOSTED) == 0)
 			sna_copy_fbcon(sna);
@@ -597,8 +597,8 @@ static Bool sna_pre_init(ScrnInfoPtr scrn, int probe)
 	scrn->progClock = TRUE;
 	scrn->rgbBits = 8;
 
-	fd = intel_get_device(scrn);
-	if (fd == -1) {
+	sna->dev = intel_get_device(scrn, &fd);
+	if (sna->dev == NULL) {
 		xf86DrvMsg(scrn->scrnIndex, X_ERROR,
 			   "Failed to claim DRM device.\n");
 		goto cleanup;
@@ -611,7 +611,7 @@ static Bool sna_pre_init(ScrnInfoPtr scrn, int probe)
 		goto cleanup;
 	}
 
-	intel_detect_chipset(scrn, pEnt);
+	intel_detect_chipset(scrn, sna->dev);
 	xf86DrvMsg(scrn->scrnIndex, X_PROBED, "CPU: %s\n",
 		   sna_cpu_features_to_string(sna->cpu_features, buf));
 
@@ -715,6 +715,8 @@ static Bool sna_pre_init(ScrnInfoPtr scrn, int probe)
 
 cleanup:
 	scrn->driverPrivate = (void *)((uintptr_t)sna->info | (sna->flags & SNA_IS_SLAVED) | 2);
+	if (sna->dev)
+		intel_put_device(sna->dev);
 	free(sna);
 	return FALSE;
 }
@@ -929,7 +931,7 @@ static void sna_leave_vt(VT_FUNC_ARGS_DECL)
 	sna_accel_leave(sna);
 	sna_mode_reset(sna);
 
-	if (intel_put_master(scrn))
+	if (intel_put_master(sna->dev))
 		xf86DrvMsg(scrn->scrnIndex, X_WARNING,
 			   "drmDropMaster failed: %s\n", strerror(errno));
 }
@@ -967,7 +969,7 @@ static Bool sna_early_close_screen(CLOSE_SCREEN_ARGS_DECL)
 	}
 
 	if (scrn->vtSema) {
-		intel_put_master(scrn);
+		intel_put_master(sna->dev);
 		scrn->vtSema = FALSE;
 	}
 
@@ -1234,9 +1236,9 @@ static void sna_free_screen(FREE_SCREEN_ARGS_DECL)
 
 	sna_mode_fini(sna);
 	sna_acpi_fini(sna);
-	free(sna);
 
-	intel_put_device(scrn);
+	intel_put_device(sna->dev);
+	free(sna);
 }
 
 static Bool sna_enter_vt(VT_FUNC_ARGS_DECL)
@@ -1245,7 +1247,7 @@ static Bool sna_enter_vt(VT_FUNC_ARGS_DECL)
 	struct sna *sna = to_sna(scrn);
 
 	DBG(("%s\n", __FUNCTION__));
-	if (intel_get_master(scrn))
+	if (intel_get_master(sna->dev))
 		return FALSE;
 
 	if (sna->flags & SNA_REPROBE) {
@@ -1257,7 +1259,7 @@ static Bool sna_enter_vt(VT_FUNC_ARGS_DECL)
 	}
 
 	if (!sna_set_desired_mode(sna)) {
-		intel_put_master(scrn);
+		intel_put_master(sna->dev);
 		return FALSE;
 	}
 
diff --git a/src/sna/sna_video_hwmc.c b/src/sna/sna_video_hwmc.c
index 3c453a7..b2319c9 100644
--- a/src/sna/sna_video_hwmc.c
+++ b/src/sna/sna_video_hwmc.c
@@ -81,7 +81,7 @@ static int create_context(XvPortPtr port, XvMCContextPtr ctx,
 		return BadAlloc;
 
 	if (sna->kgem.gen >= 040) {
-		int devid = intel_get_device_id(sna->scrn);
+		int devid = intel_get_device_id(sna->dev);
 
 		if (sna->kgem.gen >= 045)
 			priv->type = XVMC_I965_MPEG2_VLD;
diff --git a/src/uxa/intel.h b/src/uxa/intel.h
index 3a1641f..a398229 100644
--- a/src/uxa/intel.h
+++ b/src/uxa/intel.h
@@ -54,7 +54,6 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 #include "xorg-server.h"
 #include "xf86_OSproc.h"
 #include "compiler.h"
-#include "xf86Pci.h"
 #include "xf86Cursor.h"
 #include "xf86xv.h"
 #include "xf86Crtc.h"
@@ -113,6 +112,7 @@ enum dri_type {
 
 typedef struct intel_screen_private {
 	ScrnInfoPtr scrn;
+	struct intel_device *dev;
 	int cpp;
 
 #define RENDER_BATCH			I915_EXEC_RENDER
@@ -167,7 +167,6 @@ typedef struct intel_screen_private {
 
 	int Chipset;
 	EntityInfoPtr pEnt;
-	struct pci_device *PciInfo;
 	const struct intel_device_info *info;
 
 	unsigned int BR[20];
@@ -326,14 +325,14 @@ typedef struct intel_screen_private {
 #define IS_HSW(intel) (INTEL_INFO(intel)->gen == 075)
 
 /* Some chips have specific errata (or limits) that we need to workaround. */
-#define IS_I830(intel) ((intel)->PciInfo->device_id == PCI_CHIP_I830_M)
-#define IS_845G(intel) ((intel)->PciInfo->device_id == PCI_CHIP_845_G)
-#define IS_I865G(intel) ((intel)->PciInfo->device_id == PCI_CHIP_I865_G)
+#define IS_I830(intel) (intel_get_device_id((intel)->dev) == PCI_CHIP_I830_M)
+#define IS_845G(intel) (intel_get_device_id((intel)->dev) == PCI_CHIP_845_G)
+#define IS_I865G(intel) (intel_get_device_id((intel)->dev) == PCI_CHIP_I865_G)
 
-#define IS_I915G(pI810) ((intel)->PciInfo->device_id == PCI_CHIP_I915_G || (intel)->PciInfo->device_id == PCI_CHIP_E7221_G)
-#define IS_I915GM(pI810) ((intel)->PciInfo->device_id == PCI_CHIP_I915_GM)
+#define IS_I915G(pI810) (intel_get_device_id((intel)->dev) == PCI_CHIP_I915_G || intel_get_device_id((intel)->dev) == PCI_CHIP_E7221_G)
+#define IS_I915GM(pI810) (intel_get_device_id((intel)->dev) == PCI_CHIP_I915_GM)
 
-#define IS_965_Q(pI810) ((intel)->PciInfo->device_id == PCI_CHIP_I965_Q)
+#define IS_965_Q(pI810) (intel_get_device_id((intel)->dev) == PCI_CHIP_I965_Q)
 
 /* supports Y tiled surfaces (pre-965 Mesa isn't ready yet) */
 #define SUPPORTS_YTILING(pI810) (INTEL_INFO(intel)->gen >= 040)
diff --git a/src/uxa/intel_dri3.c b/src/uxa/intel_dri3.c
index fed6b18..2dd2b55 100644
--- a/src/uxa/intel_dri3.c
+++ b/src/uxa/intel_dri3.c
@@ -40,9 +40,11 @@ intel_dri3_open(ScreenPtr screen,
                 RRProviderPtr provider,
                 int *out)
 {
+	ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
+	intel_screen_private *intel = intel_get_screen_private(scrn);
 	int fd;
 
-	fd = intel_get_client_fd(xf86ScreenToScrn(screen));
+	fd = intel_get_client_fd(intel->dev);
 	if (fd < 0)
 		return -fd;
 
diff --git a/src/uxa/intel_driver.c b/src/uxa/intel_driver.c
index f31f7bd..ebd7498 100644
--- a/src/uxa/intel_driver.c
+++ b/src/uxa/intel_driver.c
@@ -200,7 +200,7 @@ static void PreInitCleanup(ScrnInfoPtr scrn)
 static void intel_check_chipset_option(ScrnInfoPtr scrn)
 {
 	intel_screen_private *intel = intel_get_screen_private(scrn);
-	intel_detect_chipset(scrn, intel->pEnt);
+	intel_detect_chipset(scrn, intel->dev);
 }
 
 static Bool I830GetEarlyOptions(ScrnInfoPtr scrn)
@@ -268,9 +268,8 @@ static void intel_check_dri_option(ScrnInfoPtr scrn)
 static Bool intel_open_drm_master(ScrnInfoPtr scrn)
 {
 	intel_screen_private *intel = intel_get_screen_private(scrn);
-
-	intel->drmSubFD = intel_get_device(scrn);
-	return intel->drmSubFD != -1;
+	intel->dev = intel_get_device(scrn, &intel->drmSubFD);
+	return intel->dev != NULL;
 }
 
 static int intel_init_bufmgr(intel_screen_private *intel)
@@ -381,7 +380,7 @@ static Bool can_accelerate_blt(struct intel_screen_private *intel)
 	}
 
 	if (INTEL_INFO(intel)->gen == 060) {
-		struct pci_device *const device = intel->PciInfo;
+		struct pci_device *const device = xf86GetPciInfoForEntity(intel->pEnt->index);
 
 		/* Sandybridge rev07 locks up easily, even with the
 		 * BLT ring workaround in place.
@@ -482,8 +481,6 @@ static Bool I830PreInit(ScrnInfoPtr scrn, int flags)
 
 	scrn->displayWidth = 640;	/* default it */
 
-	intel->PciInfo = xf86GetPciInfoForEntity(intel->pEnt->index);
-
 	if (!intel_open_drm_master(scrn)) {
 		xf86DrvMsg(scrn->scrnIndex, X_ERROR,
 			   "Failed to become DRM master.\n");
@@ -860,7 +857,7 @@ I830ScreenInit(SCREEN_INIT_ARGS_DECL)
 #ifdef INTEL_XVMC
 	MessageType from;
 #endif
-	struct pci_device *const device = intel->PciInfo;
+	struct pci_device *const device = xf86GetPciInfoForEntity(intel->pEnt->index);
 	int fb_bar = IS_GEN2(intel) ? 0 : 2;
 
 	scrn->videoRam = device->regions[fb_bar].size / 1024;
@@ -1065,7 +1062,7 @@ static void I830FreeScreen(FREE_SCREEN_ARGS_DECL)
 	if (intel && !((uintptr_t)intel & 3)) {
 		intel_mode_fini(intel);
 		intel_bufmgr_fini(intel);
-		intel_put_device(scrn);
+		intel_put_device(intel->dev);
 
 		free(intel);
 		scrn->driverPrivate = NULL;
@@ -1075,12 +1072,13 @@ static void I830FreeScreen(FREE_SCREEN_ARGS_DECL)
 static void I830LeaveVT(VT_FUNC_ARGS_DECL)
 {
 	SCRN_INFO_PTR(arg);
+	intel_screen_private *intel = intel_get_screen_private(scrn);
 
 	xf86RotateFreeShadow(scrn);
 
 	xf86_hide_cursors(scrn);
 
-	if (intel_put_master(scrn))
+	if (intel_put_master(intel->dev))
 		xf86DrvMsg(scrn->scrnIndex, X_WARNING,
 			   "drmDropMaster failed: %s\n", strerror(errno));
 }
@@ -1091,8 +1089,9 @@ static void I830LeaveVT(VT_FUNC_ARGS_DECL)
 static Bool I830EnterVT(VT_FUNC_ARGS_DECL)
 {
 	SCRN_INFO_PTR(arg);
+	intel_screen_private *intel = intel_get_screen_private(scrn);
 
-	if (intel_get_master(scrn)) {
+	if (intel_get_master(intel->dev)) {
 		xf86DrvMsg(scrn->scrnIndex, X_WARNING,
 			   "drmSetMaster failed: %s\n",
 			   strerror(errno));
diff --git a/src/uxa/intel_hwmc.c b/src/uxa/intel_hwmc.c
index f991aa6..829cb8e 100644
--- a/src/uxa/intel_hwmc.c
+++ b/src/uxa/intel_hwmc.c
@@ -191,6 +191,7 @@ Bool intel_xvmc_adaptor_init(ScreenPtr pScreen)
 {
 	ScrnInfoPtr scrn = xf86ScreenToScrn(pScreen);
 	intel_screen_private *intel = intel_get_screen_private(scrn);
+	struct pci_device *pci;
 	static XF86MCAdaptorRec *pAdapt;
 	char *name;
 	char buf[64];
@@ -207,6 +208,10 @@ Bool intel_xvmc_adaptor_init(ScreenPtr pScreen)
 		return FALSE;
 	}
 
+	pci = xf86GetPciInfoForEntity(intel->pEnt->index);
+	if (pci == NULL)
+		return FALSE;
+
 	pAdapt = calloc(1, sizeof(XF86MCAdaptorRec));
 	if (!pAdapt) {
 		ErrorF("Allocation error.\n");
@@ -249,8 +254,7 @@ Bool intel_xvmc_adaptor_init(ScreenPtr pScreen)
 	}
 
 	sprintf(buf, "pci:%04x:%02x:%02x.%d",
-		intel->PciInfo->domain,
-		intel->PciInfo->bus, intel->PciInfo->dev, intel->PciInfo->func);
+		pci->domain, pci->bus, pci->dev, pci->func);
 
 	xf86XvMCRegisterDRInfo(pScreen, INTEL_XVMC_LIBNAME,
 			       buf,
diff --git a/src/uxa/intel_memory.c b/src/uxa/intel_memory.c
index 5796e6d..0c6cf30 100644
--- a/src/uxa/intel_memory.c
+++ b/src/uxa/intel_memory.c
@@ -168,7 +168,7 @@ agp_aperture_size(struct pci_device *dev, int gen)
 void intel_set_gem_max_sizes(ScrnInfoPtr scrn)
 {
 	intel_screen_private *intel = intel_get_screen_private(scrn);
-	size_t agp_size = agp_aperture_size(intel->PciInfo,
+	size_t agp_size = agp_aperture_size(xf86GetPciInfoForEntity(intel->pEnt->index),
 					    INTEL_INFO(intel)->gen);
 
 	/* The chances of being able to mmap an object larger than


More information about the xorg-commit mailing list