Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0ffe37de authored by Linus Torvalds's avatar Linus Torvalds
Browse files
* 'drm-intel-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/ickle/drm-intel:
  drm/i915: Hold a reference to the object whilst unbinding the eviction list
  drm/i915,agp/intel: Add second set of PCI-IDs for B43
  drm/i915: Fix Sandybridge fence registers
  drm/i915/crt: Downgrade warnings for hotplug failures
  drm/i915: Ensure that the crtcinfo is populated during mode_fixup()
parents 4e24db5b db8c076b
Loading
Loading
Loading
Loading
+2 −0
Original line number Original line Diff line number Diff line
@@ -806,6 +806,8 @@ static const struct intel_driver_description {
	    "G45/G43", NULL, &intel_i965_driver },
	    "G45/G43", NULL, &intel_i965_driver },
	{ PCI_DEVICE_ID_INTEL_B43_HB, PCI_DEVICE_ID_INTEL_B43_IG,
	{ PCI_DEVICE_ID_INTEL_B43_HB, PCI_DEVICE_ID_INTEL_B43_IG,
	    "B43", NULL, &intel_i965_driver },
	    "B43", NULL, &intel_i965_driver },
	{ PCI_DEVICE_ID_INTEL_B43_1_HB, PCI_DEVICE_ID_INTEL_B43_1_IG,
	    "B43", NULL, &intel_i965_driver },
	{ PCI_DEVICE_ID_INTEL_G41_HB, PCI_DEVICE_ID_INTEL_G41_IG,
	{ PCI_DEVICE_ID_INTEL_G41_HB, PCI_DEVICE_ID_INTEL_G41_IG,
	    "G41", NULL, &intel_i965_driver },
	    "G41", NULL, &intel_i965_driver },
	{ PCI_DEVICE_ID_INTEL_IRONLAKE_D_HB, PCI_DEVICE_ID_INTEL_IRONLAKE_D_IG,
	{ PCI_DEVICE_ID_INTEL_IRONLAKE_D_HB, PCI_DEVICE_ID_INTEL_IRONLAKE_D_IG,
+2 −0
Original line number Original line Diff line number Diff line
@@ -186,6 +186,8 @@
#define PCI_DEVICE_ID_INTEL_Q33_IG          0x29D2
#define PCI_DEVICE_ID_INTEL_Q33_IG          0x29D2
#define PCI_DEVICE_ID_INTEL_B43_HB          0x2E40
#define PCI_DEVICE_ID_INTEL_B43_HB          0x2E40
#define PCI_DEVICE_ID_INTEL_B43_IG          0x2E42
#define PCI_DEVICE_ID_INTEL_B43_IG          0x2E42
#define PCI_DEVICE_ID_INTEL_B43_1_HB        0x2E90
#define PCI_DEVICE_ID_INTEL_B43_1_IG        0x2E92
#define PCI_DEVICE_ID_INTEL_GM45_HB         0x2A40
#define PCI_DEVICE_ID_INTEL_GM45_HB         0x2A40
#define PCI_DEVICE_ID_INTEL_GM45_IG         0x2A42
#define PCI_DEVICE_ID_INTEL_GM45_IG         0x2A42
#define PCI_DEVICE_ID_INTEL_EAGLELAKE_HB        0x2E00
#define PCI_DEVICE_ID_INTEL_EAGLELAKE_HB        0x2E00
+1 −0
Original line number Original line Diff line number Diff line
@@ -170,6 +170,7 @@ static const struct pci_device_id pciidlist[] = { /* aka */
	INTEL_VGA_DEVICE(0x2e22, &intel_g45_info),		/* G45_G */
	INTEL_VGA_DEVICE(0x2e22, &intel_g45_info),		/* G45_G */
	INTEL_VGA_DEVICE(0x2e32, &intel_g45_info),		/* G41_G */
	INTEL_VGA_DEVICE(0x2e32, &intel_g45_info),		/* G41_G */
	INTEL_VGA_DEVICE(0x2e42, &intel_g45_info),		/* B43_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(0xa001, &intel_pineview_info),
	INTEL_VGA_DEVICE(0xa011, &intel_pineview_info),
	INTEL_VGA_DEVICE(0xa011, &intel_pineview_info),
	INTEL_VGA_DEVICE(0x0042, &intel_ironlake_d_info),
	INTEL_VGA_DEVICE(0x0042, &intel_ironlake_d_info),
+24 −13
Original line number Original line Diff line number Diff line
@@ -2351,14 +2351,21 @@ i915_gem_object_get_fence_reg(struct drm_gem_object *obj)


	reg->obj = obj;
	reg->obj = obj;


	if (IS_GEN6(dev))
	switch (INTEL_INFO(dev)->gen) {
	case 6:
		sandybridge_write_fence_reg(reg);
		sandybridge_write_fence_reg(reg);
	else if (IS_I965G(dev))
		break;
	case 5:
	case 4:
		i965_write_fence_reg(reg);
		i965_write_fence_reg(reg);
	else if (IS_I9XX(dev))
		break;
	case 3:
		i915_write_fence_reg(reg);
		i915_write_fence_reg(reg);
	else
		break;
	case 2:
		i830_write_fence_reg(reg);
		i830_write_fence_reg(reg);
		break;
	}


	trace_i915_gem_object_get_fence(obj, obj_priv->fence_reg,
	trace_i915_gem_object_get_fence(obj, obj_priv->fence_reg,
			obj_priv->tiling_mode);
			obj_priv->tiling_mode);
@@ -2381,22 +2388,26 @@ i915_gem_clear_fence_reg(struct drm_gem_object *obj)
	struct drm_i915_gem_object *obj_priv = to_intel_bo(obj);
	struct drm_i915_gem_object *obj_priv = to_intel_bo(obj);
	struct drm_i915_fence_reg *reg =
	struct drm_i915_fence_reg *reg =
		&dev_priv->fence_regs[obj_priv->fence_reg];
		&dev_priv->fence_regs[obj_priv->fence_reg];
	uint32_t fence_reg;


	if (IS_GEN6(dev)) {
	switch (INTEL_INFO(dev)->gen) {
	case 6:
		I915_WRITE64(FENCE_REG_SANDYBRIDGE_0 +
		I915_WRITE64(FENCE_REG_SANDYBRIDGE_0 +
			     (obj_priv->fence_reg * 8), 0);
			     (obj_priv->fence_reg * 8), 0);
	} else if (IS_I965G(dev)) {
		break;
	case 5:
	case 4:
		I915_WRITE64(FENCE_REG_965_0 + (obj_priv->fence_reg * 8), 0);
		I915_WRITE64(FENCE_REG_965_0 + (obj_priv->fence_reg * 8), 0);
	} else {
		break;
		uint32_t fence_reg;
	case 3:

		if (obj_priv->fence_reg > 8)
		if (obj_priv->fence_reg < 8)
			fence_reg = FENCE_REG_945_8 + (obj_priv->fence_reg - 8) * 4;
			fence_reg = FENCE_REG_830_0 + obj_priv->fence_reg * 4;
		else
		else
			fence_reg = FENCE_REG_945_8 + (obj_priv->fence_reg -
	case 2:
						       8) * 4;
			fence_reg = FENCE_REG_830_0 + obj_priv->fence_reg * 4;


		I915_WRITE(fence_reg, 0);
		I915_WRITE(fence_reg, 0);
		break;
	}
	}


	reg->obj = NULL;
	reg->obj = NULL;
+7 −2
Original line number Original line Diff line number Diff line
@@ -79,6 +79,7 @@ mark_free(struct drm_i915_gem_object *obj_priv,
	   struct list_head *unwind)
	   struct list_head *unwind)
{
{
	list_add(&obj_priv->evict_list, unwind);
	list_add(&obj_priv->evict_list, unwind);
	drm_gem_object_reference(&obj_priv->base);
	return drm_mm_scan_add_block(obj_priv->gtt_space);
	return drm_mm_scan_add_block(obj_priv->gtt_space);
}
}


@@ -165,6 +166,7 @@ i915_gem_evict_something(struct drm_device *dev, int min_size, unsigned alignmen
	list_for_each_entry(obj_priv, &unwind_list, evict_list) {
	list_for_each_entry(obj_priv, &unwind_list, evict_list) {
		ret = drm_mm_scan_remove_block(obj_priv->gtt_space);
		ret = drm_mm_scan_remove_block(obj_priv->gtt_space);
		BUG_ON(ret);
		BUG_ON(ret);
		drm_gem_object_unreference(&obj_priv->base);
	}
	}


	/* We expect the caller to unpin, evict all and try again, or give up.
	/* We expect the caller to unpin, evict all and try again, or give up.
@@ -181,18 +183,21 @@ i915_gem_evict_something(struct drm_device *dev, int min_size, unsigned alignmen
			 * scanning, therefore store to be evicted objects on a
			 * scanning, therefore store to be evicted objects on a
			 * temporary list. */
			 * temporary list. */
			list_move(&obj_priv->evict_list, &eviction_list);
			list_move(&obj_priv->evict_list, &eviction_list);
		}
		} else
			drm_gem_object_unreference(&obj_priv->base);
	}
	}


	/* Unbinding will emit any required flushes */
	/* Unbinding will emit any required flushes */
	list_for_each_entry_safe(obj_priv, tmp_obj_priv,
	list_for_each_entry_safe(obj_priv, tmp_obj_priv,
				 &eviction_list, evict_list) {
				 &eviction_list, evict_list) {
#if WATCH_LRU
#if WATCH_LRU
		DRM_INFO("%s: evicting %p\n", __func__, obj);
		DRM_INFO("%s: evicting %p\n", __func__, &obj_priv->base);
#endif
#endif
		ret = i915_gem_object_unbind(&obj_priv->base);
		ret = i915_gem_object_unbind(&obj_priv->base);
		if (ret)
		if (ret)
			return ret;
			return ret;

		drm_gem_object_unreference(&obj_priv->base);
	}
	}


	/* The just created free hole should be on the top of the free stack
	/* The just created free hole should be on the top of the free stack
Loading