aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915/i915_sysfs.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/i915/i915_sysfs.c')
-rw-r--r--drivers/gpu/drm/i915/i915_sysfs.c37
1 files changed, 14 insertions, 23 deletions
diff --git a/drivers/gpu/drm/i915/i915_sysfs.c b/drivers/gpu/drm/i915/i915_sysfs.c
index b07bdfb8892d..deb8787308d6 100644
--- a/drivers/gpu/drm/i915/i915_sysfs.c
+++ b/drivers/gpu/drm/i915/i915_sysfs.c
@@ -118,9 +118,8 @@ i915_l3_read(struct file *filp, struct kobject *kobj,
118 struct drm_minor *dminor = container_of(dev, struct drm_minor, kdev); 118 struct drm_minor *dminor = container_of(dev, struct drm_minor, kdev);
119 struct drm_device *drm_dev = dminor->dev; 119 struct drm_device *drm_dev = dminor->dev;
120 struct drm_i915_private *dev_priv = drm_dev->dev_private; 120 struct drm_i915_private *dev_priv = drm_dev->dev_private;
121 uint32_t misccpctl;
122 int slice = (int)(uintptr_t)attr->private; 121 int slice = (int)(uintptr_t)attr->private;
123 int i, ret; 122 int ret;
124 123
125 count = round_down(count, 4); 124 count = round_down(count, 4);
126 125
@@ -134,26 +133,13 @@ i915_l3_read(struct file *filp, struct kobject *kobj,
134 if (ret) 133 if (ret)
135 return ret; 134 return ret;
136 135
137 if (IS_HASWELL(drm_dev)) { 136 if (dev_priv->l3_parity.remap_info[slice])
138 if (dev_priv->l3_parity.remap_info[slice]) 137 memcpy(buf,
139 memcpy(buf, 138 dev_priv->l3_parity.remap_info[slice] + (offset/4),
140 dev_priv->l3_parity.remap_info[slice] + (offset/4), 139 count);
141 count); 140 else
142 else 141 memset(buf, 0, count);
143 memset(buf, 0, count);
144
145 goto out;
146 }
147
148 misccpctl = I915_READ(GEN7_MISCCPCTL);
149 I915_WRITE(GEN7_MISCCPCTL, misccpctl & ~GEN7_DOP_CLOCK_GATE_ENABLE);
150
151 for (i = 0; i < count; i += 4)
152 *((uint32_t *)(&buf[i])) = I915_READ(GEN7_L3LOG_BASE + offset + i);
153
154 I915_WRITE(GEN7_MISCCPCTL, misccpctl);
155 142
156out:
157 mutex_unlock(&drm_dev->struct_mutex); 143 mutex_unlock(&drm_dev->struct_mutex);
158 144
159 return count; 145 return count;
@@ -168,6 +154,7 @@ i915_l3_write(struct file *filp, struct kobject *kobj,
168 struct drm_minor *dminor = container_of(dev, struct drm_minor, kdev); 154 struct drm_minor *dminor = container_of(dev, struct drm_minor, kdev);
169 struct drm_device *drm_dev = dminor->dev; 155 struct drm_device *drm_dev = dminor->dev;
170 struct drm_i915_private *dev_priv = drm_dev->dev_private; 156 struct drm_i915_private *dev_priv = drm_dev->dev_private;
157 struct i915_hw_context *ctx;
171 u32 *temp = NULL; /* Just here to make handling failures easy */ 158 u32 *temp = NULL; /* Just here to make handling failures easy */
172 int slice = (int)(uintptr_t)attr->private; 159 int slice = (int)(uintptr_t)attr->private;
173 int ret; 160 int ret;
@@ -176,6 +163,9 @@ i915_l3_write(struct file *filp, struct kobject *kobj,
176 if (ret) 163 if (ret)
177 return ret; 164 return ret;
178 165
166 if (dev_priv->hw_contexts_disabled)
167 return -ENXIO;
168
179 ret = i915_mutex_lock_interruptible(drm_dev); 169 ret = i915_mutex_lock_interruptible(drm_dev);
180 if (ret) 170 if (ret)
181 return ret; 171 return ret;
@@ -204,8 +194,9 @@ i915_l3_write(struct file *filp, struct kobject *kobj,
204 194
205 memcpy(dev_priv->l3_parity.remap_info[slice] + (offset/4), buf, count); 195 memcpy(dev_priv->l3_parity.remap_info[slice] + (offset/4), buf, count);
206 196
207 if (i915_gem_l3_remap(&dev_priv->ring[RCS], slice)) 197 /* NB: We defer the remapping until we switch to the context */
208 count = 0; 198 list_for_each_entry(ctx, &dev_priv->context_list, link)
199 ctx->remap_slice |= (1<<slice);
209 200
210 mutex_unlock(&drm_dev->struct_mutex); 201 mutex_unlock(&drm_dev->struct_mutex);
211 202