Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 26 Aug 2015 21:33:44 +0000 (UTC)
From:      Baptiste Daroussin <bapt@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r287173 - head/sys/dev/drm2/i915
Message-ID:  <201508262133.t7QLXiU6067558@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: bapt
Date: Wed Aug 26 21:33:43 2015
New Revision: 287173
URL: https://svnweb.freebsd.org/changeset/base/287173

Log:
  Reduce diff with linux 3.8.13 on i915_drv.c
  
  While here update the list of devices id to match the one in linux 3.8.13
  
  Reviewed by:	dumbbell
  Differential Revision:	https://reviews.freebsd.org/D3489

Modified:
  head/sys/dev/drm2/i915/i915_drv.c

Modified: head/sys/dev/drm2/i915/i915_drv.c
==============================================================================
--- head/sys/dev/drm2/i915/i915_drv.c	Wed Aug 26 21:31:04 2015	(r287172)
+++ head/sys/dev/drm2/i915/i915_drv.c	Wed Aug 26 21:33:43 2015	(r287173)
@@ -47,6 +47,11 @@ static drm_pci_id_list_t i915_pciidlist[
 	i915_PCI_IDS
 };
 
+#define INTEL_VGA_DEVICE(id, info_) {		\
+	.device = id,				\
+	.info = info_,				\
+}
+
 static const struct intel_device_info intel_i830_info = {
 	.gen = 2, .is_mobile = 1, .cursor_needs_physical = 1,
 	.has_overlay = 1, .overlay_needs_physical = 1,
@@ -181,7 +186,6 @@ static const struct intel_device_info in
 	.has_pch_split = 1,
 };
 
-#if 0
 static const struct intel_device_info intel_valleyview_m_info = {
 	.gen = 7, .is_mobile = 1,
 	.need_gfx_hws = 1, .has_hotplug = 1,
@@ -199,7 +203,6 @@ static const struct intel_device_info in
 	.has_blt_ring = 1,
 	.is_valleyview = 1,
 };
-#endif
 
 static const struct intel_device_info intel_haswell_d_info = {
 	.is_haswell = 1, .gen = 7,
@@ -221,42 +224,37 @@ static const struct intel_device_info in
 	.not_supported = 1,
 };
 
-#define INTEL_VGA_DEVICE(id, info_) {		\
-	.device = id,				\
-	.info = info_,				\
-}
-
 static const struct intel_gfx_device_id {
 	int device;
 	const struct intel_device_info *info;
-} pciidlist[] = {		/* aka */
-	INTEL_VGA_DEVICE(0x3577, &intel_i830_info),
-	INTEL_VGA_DEVICE(0x2562, &intel_845g_info),
-	INTEL_VGA_DEVICE(0x3582, &intel_i85x_info),
+} pciidlist[] = {						/* aka */
+	INTEL_VGA_DEVICE(0x3577, &intel_i830_info),		/* I830_M */
+	INTEL_VGA_DEVICE(0x2562, &intel_845g_info),		/* 845_G */
+	INTEL_VGA_DEVICE(0x3582, &intel_i85x_info),		/* I855_GM */
 	INTEL_VGA_DEVICE(0x358e, &intel_i85x_info),
-	INTEL_VGA_DEVICE(0x2572, &intel_i865g_info),
-	INTEL_VGA_DEVICE(0x2582, &intel_i915g_info),
-	INTEL_VGA_DEVICE(0x258a, &intel_i915g_info),
-	INTEL_VGA_DEVICE(0x2592, &intel_i915gm_info),
-	INTEL_VGA_DEVICE(0x2772, &intel_i945g_info),
-	INTEL_VGA_DEVICE(0x27a2, &intel_i945gm_info),
-	INTEL_VGA_DEVICE(0x27ae, &intel_i945gm_info),
-	INTEL_VGA_DEVICE(0x2972, &intel_i965g_info),
-	INTEL_VGA_DEVICE(0x2982, &intel_i965g_info),
-	INTEL_VGA_DEVICE(0x2992, &intel_i965g_info),
-	INTEL_VGA_DEVICE(0x29a2, &intel_i965g_info),
-	INTEL_VGA_DEVICE(0x29b2, &intel_g33_info),
-	INTEL_VGA_DEVICE(0x29c2, &intel_g33_info),
-	INTEL_VGA_DEVICE(0x29d2, &intel_g33_info),
-	INTEL_VGA_DEVICE(0x2a02, &intel_i965gm_info),
-	INTEL_VGA_DEVICE(0x2a12, &intel_i965gm_info),
-	INTEL_VGA_DEVICE(0x2a42, &intel_gm45_info),
-	INTEL_VGA_DEVICE(0x2e02, &intel_g45_info),
-	INTEL_VGA_DEVICE(0x2e12, &intel_g45_info),
-	INTEL_VGA_DEVICE(0x2e22, &intel_g45_info),
-	INTEL_VGA_DEVICE(0x2e32, &intel_g45_info),
-	INTEL_VGA_DEVICE(0x2e42, &intel_g45_info),
-	INTEL_VGA_DEVICE(0x2e92, &intel_g45_info),
+	INTEL_VGA_DEVICE(0x2572, &intel_i865g_info),		/* I865_G */
+	INTEL_VGA_DEVICE(0x2582, &intel_i915g_info),		/* I915_G */
+	INTEL_VGA_DEVICE(0x258a, &intel_i915g_info),		/* E7221_G */
+	INTEL_VGA_DEVICE(0x2592, &intel_i915gm_info),		/* I915_GM */
+	INTEL_VGA_DEVICE(0x2772, &intel_i945g_info),		/* I945_G */
+	INTEL_VGA_DEVICE(0x27a2, &intel_i945gm_info),		/* I945_GM */
+	INTEL_VGA_DEVICE(0x27ae, &intel_i945gm_info),		/* I945_GME */
+	INTEL_VGA_DEVICE(0x2972, &intel_i965g_info),		/* I946_GZ */
+	INTEL_VGA_DEVICE(0x2982, &intel_i965g_info),		/* G35_G */
+	INTEL_VGA_DEVICE(0x2992, &intel_i965g_info),		/* I965_Q */
+	INTEL_VGA_DEVICE(0x29a2, &intel_i965g_info),		/* I965_G */
+	INTEL_VGA_DEVICE(0x29b2, &intel_g33_info),		/* Q35_G */
+	INTEL_VGA_DEVICE(0x29c2, &intel_g33_info),		/* G33_G */
+	INTEL_VGA_DEVICE(0x29d2, &intel_g33_info),		/* Q33_G */
+	INTEL_VGA_DEVICE(0x2a02, &intel_i965gm_info),		/* I965_GM */
+	INTEL_VGA_DEVICE(0x2a12, &intel_i965gm_info),		/* I965_GME */
+	INTEL_VGA_DEVICE(0x2a42, &intel_gm45_info),		/* GM45_G */
+	INTEL_VGA_DEVICE(0x2e02, &intel_g45_info),		/* IGD_E_G */
+	INTEL_VGA_DEVICE(0x2e12, &intel_g45_info),		/* Q45_G */
+	INTEL_VGA_DEVICE(0x2e22, &intel_g45_info),		/* G45_G */
+	INTEL_VGA_DEVICE(0x2e32, &intel_g45_info),		/* G41_G */
+	INTEL_VGA_DEVICE(0x2e42, &intel_g45_info),		/* B43_G */
+	INTEL_VGA_DEVICE(0x2e92, &intel_g45_info),		/* B43_G.1 */
 	INTEL_VGA_DEVICE(0xa001, &intel_pineview_info),
 	INTEL_VGA_DEVICE(0xa011, &intel_pineview_info),
 	INTEL_VGA_DEVICE(0x0042, &intel_ironlake_d_info),
@@ -276,11 +274,43 @@ static const struct intel_gfx_device_id 
 	INTEL_VGA_DEVICE(0x016a, &intel_ivybridge_d_info), /* GT2 server */
 	INTEL_VGA_DEVICE(0x0402, &intel_haswell_d_info), /* GT1 desktop */
 	INTEL_VGA_DEVICE(0x0412, &intel_haswell_d_info), /* GT2 desktop */
+	INTEL_VGA_DEVICE(0x0422, &intel_haswell_d_info), /* GT2 desktop */
 	INTEL_VGA_DEVICE(0x040a, &intel_haswell_d_info), /* GT1 server */
 	INTEL_VGA_DEVICE(0x041a, &intel_haswell_d_info), /* GT2 server */
+	INTEL_VGA_DEVICE(0x042a, &intel_haswell_d_info), /* GT2 server */
 	INTEL_VGA_DEVICE(0x0406, &intel_haswell_m_info), /* GT1 mobile */
 	INTEL_VGA_DEVICE(0x0416, &intel_haswell_m_info), /* GT2 mobile */
-	INTEL_VGA_DEVICE(0x0c16, &intel_haswell_d_info), /* SDV */
+	INTEL_VGA_DEVICE(0x0426, &intel_haswell_m_info), /* GT2 mobile */
+	INTEL_VGA_DEVICE(0x0C02, &intel_haswell_d_info), /* SDV GT1 desktop */
+	INTEL_VGA_DEVICE(0x0C12, &intel_haswell_d_info), /* SDV GT2 desktop */
+	INTEL_VGA_DEVICE(0x0C22, &intel_haswell_d_info), /* SDV GT2 desktop */
+	INTEL_VGA_DEVICE(0x0C0A, &intel_haswell_d_info), /* SDV GT1 server */
+	INTEL_VGA_DEVICE(0x0C1A, &intel_haswell_d_info), /* SDV GT2 server */
+	INTEL_VGA_DEVICE(0x0C2A, &intel_haswell_d_info), /* SDV GT2 server */
+	INTEL_VGA_DEVICE(0x0C06, &intel_haswell_m_info), /* SDV GT1 mobile */
+	INTEL_VGA_DEVICE(0x0C16, &intel_haswell_m_info), /* SDV GT2 mobile */
+	INTEL_VGA_DEVICE(0x0C26, &intel_haswell_m_info), /* SDV GT2 mobile */
+	INTEL_VGA_DEVICE(0x0A02, &intel_haswell_d_info), /* ULT GT1 desktop */
+	INTEL_VGA_DEVICE(0x0A12, &intel_haswell_d_info), /* ULT GT2 desktop */
+	INTEL_VGA_DEVICE(0x0A22, &intel_haswell_d_info), /* ULT GT2 desktop */
+	INTEL_VGA_DEVICE(0x0A0A, &intel_haswell_d_info), /* ULT GT1 server */
+	INTEL_VGA_DEVICE(0x0A1A, &intel_haswell_d_info), /* ULT GT2 server */
+	INTEL_VGA_DEVICE(0x0A2A, &intel_haswell_d_info), /* ULT GT2 server */
+	INTEL_VGA_DEVICE(0x0A06, &intel_haswell_m_info), /* ULT GT1 mobile */
+	INTEL_VGA_DEVICE(0x0A16, &intel_haswell_m_info), /* ULT GT2 mobile */
+	INTEL_VGA_DEVICE(0x0A26, &intel_haswell_m_info), /* ULT GT2 mobile */
+	INTEL_VGA_DEVICE(0x0D02, &intel_haswell_d_info), /* CRW GT1 desktop */
+	INTEL_VGA_DEVICE(0x0D12, &intel_haswell_d_info), /* CRW GT2 desktop */
+	INTEL_VGA_DEVICE(0x0D22, &intel_haswell_d_info), /* CRW GT2 desktop */
+	INTEL_VGA_DEVICE(0x0D0A, &intel_haswell_d_info), /* CRW GT1 server */
+	INTEL_VGA_DEVICE(0x0D1A, &intel_haswell_d_info), /* CRW GT2 server */
+	INTEL_VGA_DEVICE(0x0D2A, &intel_haswell_d_info), /* CRW GT2 server */
+	INTEL_VGA_DEVICE(0x0D06, &intel_haswell_m_info), /* CRW GT1 mobile */
+	INTEL_VGA_DEVICE(0x0D16, &intel_haswell_m_info), /* CRW GT2 mobile */
+	INTEL_VGA_DEVICE(0x0D26, &intel_haswell_m_info), /* CRW GT2 mobile */
+	INTEL_VGA_DEVICE(0x0f30, &intel_valleyview_m_info),
+	INTEL_VGA_DEVICE(0x0157, &intel_valleyview_m_info),
+	INTEL_VGA_DEVICE(0x0155, &intel_valleyview_d_info),
 	{0, 0}
 };
 
@@ -288,10 +318,8 @@ static int i915_enable_unsupported;
 
 static int i915_drm_freeze(struct drm_device *dev)
 {
-	struct drm_i915_private *dev_priv;
-	int error;
+	struct drm_i915_private *dev_priv = dev->dev_private;
 
-	dev_priv = dev->dev_private;
 	drm_kms_helper_poll_disable(dev);
 
 #if 0
@@ -300,11 +328,11 @@ static int i915_drm_freeze(struct drm_de
 
 	/* If KMS is active, we do the leavevt stuff here */
 	if (drm_core_check_feature(dev, DRIVER_MODESET)) {
-		error = i915_gem_idle(dev);
+		int error = i915_gem_idle(dev);
 		if (error) {
 			device_printf(dev->dev,
-			    "GEM idle failed, resume might fail\n");
-			return (error);
+				"GEM idle failed, resume might fail\n");
+			return error;
 		}
 		drm_irq_uninstall(dev);
 	}
@@ -319,8 +347,7 @@ static int i915_drm_freeze(struct drm_de
 	return 0;
 }
 
-static int
-i915_suspend(device_t kdev)
+static int i915_suspend(device_t kdev)
 {
 	struct drm_device *dev;
 	int error;
@@ -385,8 +412,7 @@ static int i915_drm_thaw(struct drm_devi
 	return error;
 }
 
-static int
-i915_resume(device_t kdev)
+static int i915_resume(device_t kdev)
 {
 	struct drm_device *dev;
 	int ret;
@@ -725,8 +751,7 @@ void vlv_force_wake_put(struct drm_i915_
 	POSTING_READ(FORCEWAKE_VLV);
 }
 
-static int
-i8xx_do_reset(struct drm_device *dev)
+static int i8xx_do_reset(struct drm_device *dev)
 {
 	struct drm_i915_private *dev_priv = dev->dev_private;
 	int onems;
@@ -761,8 +786,7 @@ i8xx_do_reset(struct drm_device *dev)
 	return 0;
 }
 
-static int
-i965_reset_complete(struct drm_device *dev)
+static int i965_reset_complete(struct drm_device *dev)
 {
 	u8 gdrst;
 
@@ -770,8 +794,7 @@ i965_reset_complete(struct drm_device *d
 	return (gdrst & GRDOM_RESET_ENABLE) == 0;
 }
 
-static int
-i965_do_reset(struct drm_device *dev)
+static int i965_do_reset(struct drm_device *dev)
 {
 	int ret;
 	u8 gdrst;
@@ -793,18 +816,16 @@ i965_do_reset(struct drm_device *dev)
 	gdrst = pci_read_config(dev->dev, I965_GDRST, 1);
 	pci_write_config(dev->dev, I965_GDRST,
 			 gdrst | GRDOM_MEDIA | GRDOM_RESET_ENABLE, 1);
- 
- 	return wait_for(i965_reset_complete(dev), 500);
+
+	return wait_for(i965_reset_complete(dev), 500);
 }
 
-static int
-ironlake_do_reset(struct drm_device *dev)
+static int ironlake_do_reset(struct drm_device *dev)
 {
-	struct drm_i915_private *dev_priv;
+	struct drm_i915_private *dev_priv = dev->dev_private;
 	u32 gdrst;
 	int ret;
 
-	dev_priv = dev->dev_private;
 	gdrst = I915_READ(MCHBAR_MIRROR_BASE + ILK_GDSR);
 	I915_WRITE(MCHBAR_MIRROR_BASE + ILK_GDSR,
 		   gdrst | GRDOM_RENDER | GRDOM_RESET_ENABLE);
@@ -816,16 +837,13 @@ ironlake_do_reset(struct drm_device *dev
 	gdrst = I915_READ(MCHBAR_MIRROR_BASE + ILK_GDSR);
 	I915_WRITE(MCHBAR_MIRROR_BASE + ILK_GDSR,
 		   gdrst | GRDOM_MEDIA | GRDOM_RESET_ENABLE);
- 	return wait_for(I915_READ(MCHBAR_MIRROR_BASE + ILK_GDSR) & 0x1, 500);
+	return wait_for(I915_READ(MCHBAR_MIRROR_BASE + ILK_GDSR) & 0x1, 500);
 }
 
-static int
-gen6_do_reset(struct drm_device *dev)
+static int gen6_do_reset(struct drm_device *dev)
 {
-	struct drm_i915_private *dev_priv;
-	int ret;
-
-	dev_priv = dev->dev_private;
+	struct drm_i915_private *dev_priv = dev->dev_private;
+	int	ret;
 
 	/* Hold gt_lock across reset to prevent any register access
 	 * with forcewake not set correctly
@@ -858,8 +876,7 @@ gen6_do_reset(struct drm_device *dev)
 	return (ret);
 }
 
-int
-intel_gpu_reset(struct drm_device *dev)
+int intel_gpu_reset(struct drm_device *dev)
 {
 	struct drm_i915_private *dev_priv = dev->dev_private;
 	int ret = -ENODEV;
@@ -894,13 +911,28 @@ intel_gpu_reset(struct drm_device *dev)
 	return ret;
 }
 
+/**
+ * i915_reset - reset chip after a hang
+ * @dev: drm device to reset
+ *
+ * Reset the chip.  Useful if a hang is detected. Returns zero on successful
+ * reset or otherwise an error code.
+ *
+ * Procedure is fairly simple:
+ *   - reset the chip using the reset reg
+ *   - re-init context state
+ *   - re-init hardware status page
+ *   - re-init ring buffer
+ *   - re-init interrupt state
+ *   - re-init display
+ */
 int i915_reset(struct drm_device *dev)
 {
 	drm_i915_private_t *dev_priv = dev->dev_private;
 	int ret;
 
 	if (!i915_try_reset)
-		return (0);
+		return 0;
 
 	if (!sx_try_xlock(&dev->dev_struct_lock))
 		return (-EBUSY);
@@ -919,11 +951,25 @@ int i915_reset(struct drm_device *dev)
 	if (ret) {
 		DRM_ERROR("Failed to reset chip.\n");
 		DRM_UNLOCK(dev);
-		return (ret);
+		return ret;
 	}
 
+	/* Ok, now get things going again... */
+
+	/*
+	 * Everything depends on having the GTT running, so we need to start
+	 * there.  Fortunately we don't need to do this unless we reset the
+	 * chip at a PCI level.
+	 *
+	 * Next we need to restore the context, but we don't use those
+	 * yet either...
+	 *
+	 * Ring buffer needs to be re-initialized in the KMS case, or if X
+	 * was running at the time of the reset (i.e. we weren't VT
+	 * switched away).
+	 */
 	if (drm_core_check_feature(dev, DRIVER_MODESET) ||
-	    !dev_priv->mm.suspended) {
+			!dev_priv->mm.suspended) {
 		struct intel_ring_buffer *ring;
 		int i;
 
@@ -937,6 +983,11 @@ int i915_reset(struct drm_device *dev)
 		i915_gem_context_init(dev);
 		i915_gem_init_ppgtt(dev);
 
+		/*
+		 * It would make sense to re-init all the other hw state, at
+		 * least the rps/rc6/emon init done within modeset_init_hw. For
+		 * some unknown reason, this blows up my ilk, so don't.
+		 */
 		DRM_UNLOCK(dev);
 
 		if (drm_core_check_feature(dev, DRIVER_MODESET))
@@ -944,10 +995,11 @@ int i915_reset(struct drm_device *dev)
 
 		drm_irq_uninstall(dev);
 		drm_irq_install(dev);
-	} else
+	} else {
 		DRM_UNLOCK(dev);
+	}
 
-	return (0);
+	return 0;
 }
 
 /* We give fast paths for the really cool registers */



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201508262133.t7QLXiU6067558>