diff options
Diffstat (limited to 'drivers/gpu/drm/i915/i915_sysfs.c')
-rw-r--r-- | drivers/gpu/drm/i915/i915_sysfs.c | 37 |
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 | ||
156 | out: | ||
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 | ||