summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm
diff options
context:
space:
mode:
authorMika Kuoppala <mika.kuoppala@linux.intel.com>2015-01-28 07:43:24 -0500
committerDaniel Vetter <daniel.vetter@ffwll.ch>2015-01-30 11:15:31 -0500
commitf9b3927afbb97649f5c89f0815820167b7c5cba8 (patch)
tree0be20931cdfbffbc1ebf74819a48a0bec37cedb8 /drivers/gpu/drm
parent21a11fff7c0d53abf1d80cd003202e8a7a1c80a5 (diff)
drm/i915: Do uncore early sanitize after domain init
intel_uncore_early_sanitize() will reset the forcewake registers. When forcewake domains were introduced, the domain init was done after the sanitization of the forcewake registers. And as the resetting of registers use the domain accessors, we tried to reset the forcewake registers with unitialized forcewake domains and failed. Fix this by sanitizing after all the domains have been initialized. Do per domain clearing of forcewake register on domain init so that IVB can do early access to ECOBUS do determine the final configuration. This regression was introduced in commit 05a2fb157e44a53c79133805d30eaada43911941 Author: Mika Kuoppala <mika.kuoppala@linux.intel.com> Date: Mon Jan 19 16:20:43 2015 +0200 drm/i915: Consolidate forcewake code v2: Carve out ellc detect, fw_domain_reset for ivb/ecobus (Chris) Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=88805 Cc: Chris Wilson <chris@chris-wilson.co.uk> Reported-by: Olof Johansson <olof@lixom.net> Tested-by: Darren Hart <dvhart@linux.intel.com> (v1) Signed-off-by: Mika Kuoppala <mika.kuoppala@intel.com> Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Diffstat (limited to 'drivers/gpu/drm')
-rw-r--r--drivers/gpu/drm/i915/intel_uncore.c38
1 files changed, 30 insertions, 8 deletions
diff --git a/drivers/gpu/drm/i915/intel_uncore.c b/drivers/gpu/drm/i915/intel_uncore.c
index b3951f288a90..be2c7fcf5f1f 100644
--- a/drivers/gpu/drm/i915/intel_uncore.c
+++ b/drivers/gpu/drm/i915/intel_uncore.c
@@ -72,6 +72,7 @@ assert_device_not_suspended(struct drm_i915_private *dev_priv)
72static inline void 72static inline void
73fw_domain_reset(const struct intel_uncore_forcewake_domain *d) 73fw_domain_reset(const struct intel_uncore_forcewake_domain *d)
74{ 74{
75 WARN_ON(d->reg_set == 0);
75 __raw_i915_write32(d->i915, d->reg_set, d->val_reset); 76 __raw_i915_write32(d->i915, d->reg_set, d->val_reset);
76} 77}
77 78
@@ -166,6 +167,8 @@ fw_domains_reset(struct drm_i915_private *dev_priv, enum forcewake_domains fw_do
166 struct intel_uncore_forcewake_domain *d; 167 struct intel_uncore_forcewake_domain *d;
167 enum forcewake_domain_id id; 168 enum forcewake_domain_id id;
168 169
170 WARN_ON(dev_priv->uncore.fw_domains == 0);
171
169 for_each_fw_domain_mask(d, fw_domains, dev_priv, id) 172 for_each_fw_domain_mask(d, fw_domains, dev_priv, id)
170 fw_domain_reset(d); 173 fw_domain_reset(d);
171 174
@@ -321,14 +324,10 @@ void intel_uncore_forcewake_reset(struct drm_device *dev, bool restore)
321 spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags); 324 spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags);
322} 325}
323 326
324static void __intel_uncore_early_sanitize(struct drm_device *dev, 327static void intel_uncore_ellc_detect(struct drm_device *dev)
325 bool restore_forcewake)
326{ 328{
327 struct drm_i915_private *dev_priv = dev->dev_private; 329 struct drm_i915_private *dev_priv = dev->dev_private;
328 330
329 if (HAS_FPGA_DBG_UNCLAIMED(dev))
330 __raw_i915_write32(dev_priv, FPGA_DBG, FPGA_DBG_RM_NOCLAIM);
331
332 if ((IS_HASWELL(dev) || IS_BROADWELL(dev)) && 331 if ((IS_HASWELL(dev) || IS_BROADWELL(dev)) &&
333 (__raw_i915_read32(dev_priv, HSW_EDRAM_PRESENT) == 1)) { 332 (__raw_i915_read32(dev_priv, HSW_EDRAM_PRESENT) == 1)) {
334 /* The docs do not explain exactly how the calculation can be 333 /* The docs do not explain exactly how the calculation can be
@@ -339,6 +338,15 @@ static void __intel_uncore_early_sanitize(struct drm_device *dev,
339 dev_priv->ellc_size = 128; 338 dev_priv->ellc_size = 128;
340 DRM_INFO("Found %zuMB of eLLC\n", dev_priv->ellc_size); 339 DRM_INFO("Found %zuMB of eLLC\n", dev_priv->ellc_size);
341 } 340 }
341}
342
343static void __intel_uncore_early_sanitize(struct drm_device *dev,
344 bool restore_forcewake)
345{
346 struct drm_i915_private *dev_priv = dev->dev_private;
347
348 if (HAS_FPGA_DBG_UNCLAIMED(dev))
349 __raw_i915_write32(dev_priv, FPGA_DBG, FPGA_DBG_RM_NOCLAIM);
342 350
343 /* clear out old GT FIFO errors */ 351 /* clear out old GT FIFO errors */
344 if (IS_GEN6(dev) || IS_GEN7(dev)) 352 if (IS_GEN6(dev) || IS_GEN7(dev))
@@ -982,14 +990,14 @@ static void fw_domain_init(struct drm_i915_private *dev_priv,
982 setup_timer(&d->timer, intel_uncore_fw_release_timer, (unsigned long)d); 990 setup_timer(&d->timer, intel_uncore_fw_release_timer, (unsigned long)d);
983 991
984 dev_priv->uncore.fw_domains |= (1 << domain_id); 992 dev_priv->uncore.fw_domains |= (1 << domain_id);
993
994 fw_domain_reset(d);
985} 995}
986 996
987void intel_uncore_init(struct drm_device *dev) 997static void intel_uncore_fw_domains_init(struct drm_device *dev)
988{ 998{
989 struct drm_i915_private *dev_priv = dev->dev_private; 999 struct drm_i915_private *dev_priv = dev->dev_private;
990 1000
991 __intel_uncore_early_sanitize(dev, false);
992
993 if (IS_GEN9(dev)) { 1001 if (IS_GEN9(dev)) {
994 dev_priv->uncore.funcs.force_wake_get = fw_domains_get; 1002 dev_priv->uncore.funcs.force_wake_get = fw_domains_get;
995 dev_priv->uncore.funcs.force_wake_put = fw_domains_put; 1003 dev_priv->uncore.funcs.force_wake_put = fw_domains_put;
@@ -1035,8 +1043,13 @@ void intel_uncore_init(struct drm_device *dev)
1035 dev_priv->uncore.funcs.force_wake_put = 1043 dev_priv->uncore.funcs.force_wake_put =
1036 fw_domains_put_with_fifo; 1044 fw_domains_put_with_fifo;
1037 1045
1046 /* We need to init first for ECOBUS access and then
1047 * determine later if we want to reinit, in case of MT access is
1048 * not working
1049 */
1038 fw_domain_init(dev_priv, FW_DOMAIN_ID_RENDER, 1050 fw_domain_init(dev_priv, FW_DOMAIN_ID_RENDER,
1039 FORCEWAKE_MT, FORCEWAKE_MT_ACK); 1051 FORCEWAKE_MT, FORCEWAKE_MT_ACK);
1052
1040 mutex_lock(&dev->struct_mutex); 1053 mutex_lock(&dev->struct_mutex);
1041 fw_domains_get_with_thread_status(dev_priv, FORCEWAKE_ALL); 1054 fw_domains_get_with_thread_status(dev_priv, FORCEWAKE_ALL);
1042 ecobus = __raw_i915_read32(dev_priv, ECOBUS); 1055 ecobus = __raw_i915_read32(dev_priv, ECOBUS);
@@ -1057,6 +1070,15 @@ void intel_uncore_init(struct drm_device *dev)
1057 fw_domain_init(dev_priv, FW_DOMAIN_ID_RENDER, 1070 fw_domain_init(dev_priv, FW_DOMAIN_ID_RENDER,
1058 FORCEWAKE, FORCEWAKE_ACK); 1071 FORCEWAKE, FORCEWAKE_ACK);
1059 } 1072 }
1073}
1074
1075void intel_uncore_init(struct drm_device *dev)
1076{
1077 struct drm_i915_private *dev_priv = dev->dev_private;
1078
1079 intel_uncore_ellc_detect(dev);
1080 intel_uncore_fw_domains_init(dev);
1081 __intel_uncore_early_sanitize(dev, false);
1060 1082
1061 switch (INTEL_INFO(dev)->gen) { 1083 switch (INTEL_INFO(dev)->gen) {
1062 default: 1084 default: