Rev 4371 | Rev 5060 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 4371 | Rev 4560 | ||
---|---|---|---|
Line 62... | Line 62... | ||
62 | __raw_i915_write32(dev_priv, FORCEWAKE, 0); |
62 | __raw_i915_write32(dev_priv, FORCEWAKE, 0); |
63 | /* something from same cacheline, but !FORCEWAKE */ |
63 | /* something from same cacheline, but !FORCEWAKE */ |
64 | __raw_posting_read(dev_priv, ECOBUS); |
64 | __raw_posting_read(dev_priv, ECOBUS); |
65 | } |
65 | } |
Line 66... | Line 66... | ||
66 | 66 | ||
- | 67 | static void __gen6_gt_force_wake_get(struct drm_i915_private *dev_priv, |
|
67 | static void __gen6_gt_force_wake_get(struct drm_i915_private *dev_priv) |
68 | int fw_engine) |
68 | { |
69 | { |
69 | if (wait_for_atomic((__raw_i915_read32(dev_priv, FORCEWAKE_ACK) & 1) == 0, |
70 | if (wait_for_atomic((__raw_i915_read32(dev_priv, FORCEWAKE_ACK) & 1) == 0, |
70 | FORCEWAKE_ACK_TIMEOUT_MS)) |
71 | FORCEWAKE_ACK_TIMEOUT_MS)) |
Line 87... | Line 88... | ||
87 | __raw_i915_write32(dev_priv, FORCEWAKE_MT, _MASKED_BIT_DISABLE(0xffff)); |
88 | __raw_i915_write32(dev_priv, FORCEWAKE_MT, _MASKED_BIT_DISABLE(0xffff)); |
88 | /* something from same cacheline, but !FORCEWAKE_MT */ |
89 | /* something from same cacheline, but !FORCEWAKE_MT */ |
89 | __raw_posting_read(dev_priv, ECOBUS); |
90 | __raw_posting_read(dev_priv, ECOBUS); |
90 | } |
91 | } |
Line 91... | Line 92... | ||
91 | 92 | ||
- | 93 | static void __gen6_gt_force_wake_mt_get(struct drm_i915_private *dev_priv, |
|
92 | static void __gen6_gt_force_wake_mt_get(struct drm_i915_private *dev_priv) |
94 | int fw_engine) |
93 | { |
95 | { |
Line 94... | Line 96... | ||
94 | u32 forcewake_ack; |
96 | u32 forcewake_ack; |
95 | 97 | ||
96 | if (IS_HASWELL(dev_priv->dev)) |
98 | if (IS_HASWELL(dev_priv->dev) || IS_GEN8(dev_priv->dev)) |
97 | forcewake_ack = FORCEWAKE_ACK_HSW; |
99 | forcewake_ack = FORCEWAKE_ACK_HSW; |
Line 98... | Line 100... | ||
98 | else |
100 | else |
Line 110... | Line 112... | ||
110 | if (wait_for_atomic((__raw_i915_read32(dev_priv, forcewake_ack) & FORCEWAKE_KERNEL), |
112 | if (wait_for_atomic((__raw_i915_read32(dev_priv, forcewake_ack) & FORCEWAKE_KERNEL), |
111 | FORCEWAKE_ACK_TIMEOUT_MS)) |
113 | FORCEWAKE_ACK_TIMEOUT_MS)) |
112 | DRM_ERROR("Timed out waiting for forcewake to ack request.\n"); |
114 | DRM_ERROR("Timed out waiting for forcewake to ack request.\n"); |
Line 113... | Line 115... | ||
113 | 115 | ||
- | 116 | /* WaRsForcewakeWaitTC0:ivb,hsw */ |
|
114 | /* WaRsForcewakeWaitTC0:ivb,hsw */ |
117 | if (INTEL_INFO(dev_priv->dev)->gen < 8) |
115 | __gen6_gt_wait_for_thread_c0(dev_priv); |
118 | __gen6_gt_wait_for_thread_c0(dev_priv); |
Line 116... | Line 119... | ||
116 | } |
119 | } |
117 | 120 | ||
118 | static void gen6_gt_check_fifodbg(struct drm_i915_private *dev_priv) |
121 | static void gen6_gt_check_fifodbg(struct drm_i915_private *dev_priv) |
Line 119... | Line 122... | ||
119 | { |
122 | { |
120 | u32 gtfifodbg; |
- | |
121 | 123 | u32 gtfifodbg; |
|
122 | gtfifodbg = __raw_i915_read32(dev_priv, GTFIFODBG); |
124 | |
123 | if (WARN(gtfifodbg & GT_FIFO_CPU_ERROR_MASK, |
125 | gtfifodbg = __raw_i915_read32(dev_priv, GTFIFODBG); |
Line 124... | Line 126... | ||
124 | "MMIO read or write has been dropped %x\n", gtfifodbg)) |
126 | if (WARN(gtfifodbg, "GT wake FIFO error 0x%x\n", gtfifodbg)) |
- | 127 | __raw_i915_write32(dev_priv, GTFIFODBG, gtfifodbg); |
|
125 | __raw_i915_write32(dev_priv, GTFIFODBG, GT_FIFO_CPU_ERROR_MASK); |
128 | } |
126 | } |
129 | |
127 | 130 | static void __gen6_gt_force_wake_put(struct drm_i915_private *dev_priv, |
|
128 | static void __gen6_gt_force_wake_put(struct drm_i915_private *dev_priv) |
131 | int fw_engine) |
129 | { |
132 | { |
130 | __raw_i915_write32(dev_priv, FORCEWAKE, 0); |
133 | __raw_i915_write32(dev_priv, FORCEWAKE, 0); |
Line 131... | Line 134... | ||
131 | /* something from same cacheline, but !FORCEWAKE */ |
134 | /* something from same cacheline, but !FORCEWAKE */ |
- | 135 | __raw_posting_read(dev_priv, ECOBUS); |
|
132 | __raw_posting_read(dev_priv, ECOBUS); |
136 | gen6_gt_check_fifodbg(dev_priv); |
133 | gen6_gt_check_fifodbg(dev_priv); |
137 | } |
134 | } |
138 | |
135 | 139 | static void __gen6_gt_force_wake_mt_put(struct drm_i915_private *dev_priv, |
|
136 | static void __gen6_gt_force_wake_mt_put(struct drm_i915_private *dev_priv) |
140 | int fw_engine) |
Line 144... | Line 148... | ||
144 | 148 | ||
145 | static int __gen6_gt_wait_for_fifo(struct drm_i915_private *dev_priv) |
149 | static int __gen6_gt_wait_for_fifo(struct drm_i915_private *dev_priv) |
146 | { |
150 | { |
Line -... | Line 151... | ||
- | 151 | int ret = 0; |
|
- | 152 | ||
- | 153 | /* On VLV, FIFO will be shared by both SW and HW. |
|
- | 154 | * So, we need to read the FREE_ENTRIES everytime */ |
|
- | 155 | if (IS_VALLEYVIEW(dev_priv->dev)) |
|
- | 156 | dev_priv->uncore.fifo_count = |
|
- | 157 | __raw_i915_read32(dev_priv, GTFIFOCTL) & |
|
147 | int ret = 0; |
158 | GT_FIFO_FREE_ENTRIES_MASK; |
148 | 159 | ||
149 | if (dev_priv->uncore.fifo_count < GT_FIFO_NUM_RESERVED_ENTRIES) { |
160 | if (dev_priv->uncore.fifo_count < GT_FIFO_NUM_RESERVED_ENTRIES) { |
150 | int loop = 500; |
161 | int loop = 500; |
151 | u32 fifo = __raw_i915_read32(dev_priv, GT_FIFO_FREE_ENTRIES); |
162 | u32 fifo = __raw_i915_read32(dev_priv, GTFIFOCTL) & GT_FIFO_FREE_ENTRIES_MASK; |
152 | while (fifo <= GT_FIFO_NUM_RESERVED_ENTRIES && loop--) { |
163 | while (fifo <= GT_FIFO_NUM_RESERVED_ENTRIES && loop--) { |
153 | udelay(10); |
164 | udelay(10); |
154 | fifo = __raw_i915_read32(dev_priv, GT_FIFO_FREE_ENTRIES); |
165 | fifo = __raw_i915_read32(dev_priv, GTFIFOCTL) & GT_FIFO_FREE_ENTRIES_MASK; |
155 | } |
166 | } |
156 | if (WARN_ON(loop < 0 && fifo <= GT_FIFO_NUM_RESERVED_ENTRIES)) |
167 | if (WARN_ON(loop < 0 && fifo <= GT_FIFO_NUM_RESERVED_ENTRIES)) |
157 | ++ret; |
168 | ++ret; |
Line 168... | Line 179... | ||
168 | _MASKED_BIT_DISABLE(0xffff)); |
179 | _MASKED_BIT_DISABLE(0xffff)); |
169 | /* something from same cacheline, but !FORCEWAKE_VLV */ |
180 | /* something from same cacheline, but !FORCEWAKE_VLV */ |
170 | __raw_posting_read(dev_priv, FORCEWAKE_ACK_VLV); |
181 | __raw_posting_read(dev_priv, FORCEWAKE_ACK_VLV); |
171 | } |
182 | } |
Line 172... | Line 183... | ||
172 | 183 | ||
- | 184 | static void __vlv_force_wake_get(struct drm_i915_private *dev_priv, |
|
173 | static void vlv_force_wake_get(struct drm_i915_private *dev_priv) |
185 | int fw_engine) |
- | 186 | { |
|
- | 187 | /* Check for Render Engine */ |
|
174 | { |
188 | if (FORCEWAKE_RENDER & fw_engine) { |
- | 189 | if (wait_for_atomic((__raw_i915_read32(dev_priv, |
|
- | 190 | FORCEWAKE_ACK_VLV) & |
|
175 | if (wait_for_atomic((__raw_i915_read32(dev_priv, FORCEWAKE_ACK_VLV) & FORCEWAKE_KERNEL) == 0, |
191 | FORCEWAKE_KERNEL) == 0, |
176 | FORCEWAKE_ACK_TIMEOUT_MS)) |
192 | FORCEWAKE_ACK_TIMEOUT_MS)) |
Line 177... | Line 193... | ||
177 | DRM_ERROR("Timed out waiting for forcewake old ack to clear.\n"); |
193 | DRM_ERROR("Timed out: Render forcewake old ack to clear.\n"); |
178 | 194 | ||
179 | __raw_i915_write32(dev_priv, FORCEWAKE_VLV, |
- | |
180 | _MASKED_BIT_ENABLE(FORCEWAKE_KERNEL)); |
- | |
Line 181... | Line 195... | ||
181 | __raw_i915_write32(dev_priv, FORCEWAKE_MEDIA_VLV, |
195 | __raw_i915_write32(dev_priv, FORCEWAKE_VLV, |
- | 196 | _MASKED_BIT_ENABLE(FORCEWAKE_KERNEL)); |
|
- | 197 | ||
- | 198 | if (wait_for_atomic((__raw_i915_read32(dev_priv, |
|
- | 199 | FORCEWAKE_ACK_VLV) & |
|
- | 200 | FORCEWAKE_KERNEL), |
|
- | 201 | FORCEWAKE_ACK_TIMEOUT_MS)) |
|
- | 202 | DRM_ERROR("Timed out: waiting for Render to ack.\n"); |
|
- | 203 | } |
|
- | 204 | ||
- | 205 | /* Check for Media Engine */ |
|
- | 206 | if (FORCEWAKE_MEDIA & fw_engine) { |
|
182 | _MASKED_BIT_ENABLE(FORCEWAKE_KERNEL)); |
207 | if (wait_for_atomic((__raw_i915_read32(dev_priv, |
183 | 208 | FORCEWAKE_ACK_MEDIA_VLV) & |
|
Line -... | Line 209... | ||
- | 209 | FORCEWAKE_KERNEL) == 0, |
|
- | 210 | FORCEWAKE_ACK_TIMEOUT_MS)) |
|
- | 211 | DRM_ERROR("Timed out: Media forcewake old ack to clear.\n"); |
|
184 | if (wait_for_atomic((__raw_i915_read32(dev_priv, FORCEWAKE_ACK_VLV) & FORCEWAKE_KERNEL), |
212 | |
- | 213 | __raw_i915_write32(dev_priv, FORCEWAKE_MEDIA_VLV, |
|
185 | FORCEWAKE_ACK_TIMEOUT_MS)) |
214 | _MASKED_BIT_ENABLE(FORCEWAKE_KERNEL)); |
186 | DRM_ERROR("Timed out waiting for GT to ack forcewake request.\n"); |
215 | |
187 | 216 | if (wait_for_atomic((__raw_i915_read32(dev_priv, |
|
- | 217 | FORCEWAKE_ACK_MEDIA_VLV) & |
|
Line 188... | Line 218... | ||
188 | if (wait_for_atomic((__raw_i915_read32(dev_priv, FORCEWAKE_ACK_MEDIA_VLV) & |
218 | FORCEWAKE_KERNEL), |
189 | FORCEWAKE_KERNEL), |
219 | FORCEWAKE_ACK_TIMEOUT_MS)) |
- | 220 | DRM_ERROR("Timed out: waiting for media to ack.\n"); |
|
190 | FORCEWAKE_ACK_TIMEOUT_MS)) |
221 | } |
Line 191... | Line 222... | ||
191 | DRM_ERROR("Timed out waiting for media to ack forcewake request.\n"); |
222 | |
- | 223 | /* WaRsForcewakeWaitTC0:vlv */ |
|
192 | 224 | __gen6_gt_wait_for_thread_c0(dev_priv); |
|
- | 225 | ||
- | 226 | } |
|
- | 227 | ||
193 | /* WaRsForcewakeWaitTC0:vlv */ |
228 | static void __vlv_force_wake_put(struct drm_i915_private *dev_priv, |
194 | __gen6_gt_wait_for_thread_c0(dev_priv); |
229 | int fw_engine) |
- | 230 | { |
|
- | 231 | ||
- | 232 | /* Check for Render Engine */ |
|
- | 233 | if (FORCEWAKE_RENDER & fw_engine) |
|
195 | } |
234 | __raw_i915_write32(dev_priv, FORCEWAKE_VLV, |
196 | 235 | _MASKED_BIT_DISABLE(FORCEWAKE_KERNEL)); |
|
- | 236 | ||
197 | static void vlv_force_wake_put(struct drm_i915_private *dev_priv) |
237 | |
198 | { |
238 | /* Check for Media Engine */ |
- | 239 | if (FORCEWAKE_MEDIA & fw_engine) |
|
- | 240 | __raw_i915_write32(dev_priv, FORCEWAKE_MEDIA_VLV, |
|
- | 241 | _MASKED_BIT_DISABLE(FORCEWAKE_KERNEL)); |
|
- | 242 | ||
- | 243 | /* The below doubles as a POSTING_READ */ |
|
- | 244 | gen6_gt_check_fifodbg(dev_priv); |
|
- | 245 | ||
- | 246 | } |
|
- | 247 | ||
- | 248 | void vlv_force_wake_get(struct drm_i915_private *dev_priv, |
|
- | 249 | int fw_engine) |
|
- | 250 | { |
|
- | 251 | unsigned long irqflags; |
|
- | 252 | ||
- | 253 | spin_lock_irqsave(&dev_priv->uncore.lock, irqflags); |
|
- | 254 | if (FORCEWAKE_RENDER & fw_engine) { |
|
- | 255 | if (dev_priv->uncore.fw_rendercount++ == 0) |
|
- | 256 | dev_priv->uncore.funcs.force_wake_get(dev_priv, |
|
- | 257 | FORCEWAKE_RENDER); |
|
- | 258 | } |
|
- | 259 | if (FORCEWAKE_MEDIA & fw_engine) { |
|
- | 260 | if (dev_priv->uncore.fw_mediacount++ == 0) |
|
- | 261 | dev_priv->uncore.funcs.force_wake_get(dev_priv, |
|
- | 262 | FORCEWAKE_MEDIA); |
|
- | 263 | } |
|
- | 264 | ||
- | 265 | spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags); |
|
- | 266 | } |
|
- | 267 | ||
- | 268 | void vlv_force_wake_put(struct drm_i915_private *dev_priv, |
|
- | 269 | int fw_engine) |
|
- | 270 | { |
|
- | 271 | unsigned long irqflags; |
|
- | 272 | ||
- | 273 | spin_lock_irqsave(&dev_priv->uncore.lock, irqflags); |
|
- | 274 | ||
- | 275 | if (FORCEWAKE_RENDER & fw_engine) { |
|
- | 276 | WARN_ON(dev_priv->uncore.fw_rendercount == 0); |
|
- | 277 | if (--dev_priv->uncore.fw_rendercount == 0) |
|
- | 278 | dev_priv->uncore.funcs.force_wake_put(dev_priv, |
|
- | 279 | FORCEWAKE_RENDER); |
|
- | 280 | } |
|
- | 281 | ||
- | 282 | if (FORCEWAKE_MEDIA & fw_engine) { |
|
- | 283 | WARN_ON(dev_priv->uncore.fw_mediacount == 0); |
|
- | 284 | if (--dev_priv->uncore.fw_mediacount == 0) |
|
- | 285 | dev_priv->uncore.funcs.force_wake_put(dev_priv, |
|
- | 286 | FORCEWAKE_MEDIA); |
|
- | 287 | } |
|
- | 288 | ||
- | 289 | spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags); |
|
- | 290 | } |
|
- | 291 | ||
- | 292 | static void gen6_force_wake_work(struct work_struct *work) |
|
- | 293 | { |
|
- | 294 | struct drm_i915_private *dev_priv = |
|
- | 295 | container_of(work, typeof(*dev_priv), uncore.force_wake_work.work); |
|
199 | __raw_i915_write32(dev_priv, FORCEWAKE_VLV, |
296 | unsigned long irqflags; |
Line 200... | Line 297... | ||
200 | _MASKED_BIT_DISABLE(FORCEWAKE_KERNEL)); |
297 | |
201 | __raw_i915_write32(dev_priv, FORCEWAKE_MEDIA_VLV, |
298 | spin_lock_irqsave(&dev_priv->uncore.lock, irqflags); |
202 | _MASKED_BIT_DISABLE(FORCEWAKE_KERNEL)); |
299 | if (--dev_priv->uncore.forcewake_count == 0) |
Line 221... | Line 318... | ||
221 | { |
318 | { |
222 | struct drm_i915_private *dev_priv = dev->dev_private; |
319 | struct drm_i915_private *dev_priv = dev->dev_private; |
Line 223... | Line 320... | ||
223 | 320 | ||
224 | if (HAS_FPGA_DBG_UNCLAIMED(dev)) |
321 | if (HAS_FPGA_DBG_UNCLAIMED(dev)) |
225 | __raw_i915_write32(dev_priv, FPGA_DBG, FPGA_DBG_RM_NOCLAIM); |
- | |
226 | } |
- | |
227 | - | ||
228 | void intel_uncore_init(struct drm_device *dev) |
- | |
229 | { |
- | |
230 | struct drm_i915_private *dev_priv = dev->dev_private; |
- | |
231 | - | ||
232 | if (IS_VALLEYVIEW(dev)) { |
- | |
233 | dev_priv->uncore.funcs.force_wake_get = vlv_force_wake_get; |
- | |
234 | dev_priv->uncore.funcs.force_wake_put = vlv_force_wake_put; |
- | |
235 | } else if (IS_HASWELL(dev)) { |
- | |
236 | dev_priv->uncore.funcs.force_wake_get = __gen6_gt_force_wake_mt_get; |
- | |
237 | dev_priv->uncore.funcs.force_wake_put = __gen6_gt_force_wake_mt_put; |
- | |
238 | } else if (IS_IVYBRIDGE(dev)) { |
- | |
239 | u32 ecobus; |
- | |
240 | - | ||
241 | /* IVB configs may use multi-threaded forcewake */ |
- | |
242 | - | ||
243 | /* A small trick here - if the bios hasn't configured |
- | |
244 | * MT forcewake, and if the device is in RC6, then |
- | |
245 | * force_wake_mt_get will not wake the device and the |
- | |
246 | * ECOBUS read will return zero. Which will be |
- | |
247 | * (correctly) interpreted by the test below as MT |
- | |
248 | * forcewake being disabled. |
- | |
249 | */ |
- | |
250 | mutex_lock(&dev->struct_mutex); |
- | |
251 | __gen6_gt_force_wake_mt_get(dev_priv); |
- | |
252 | ecobus = __raw_i915_read32(dev_priv, ECOBUS); |
- | |
253 | __gen6_gt_force_wake_mt_put(dev_priv); |
- | |
Line 254... | Line 322... | ||
254 | mutex_unlock(&dev->struct_mutex); |
322 | __raw_i915_write32(dev_priv, FPGA_DBG, FPGA_DBG_RM_NOCLAIM); |
255 | 323 | ||
256 | if (ecobus & FORCEWAKE_MT_ENABLE) { |
324 | if (IS_HASWELL(dev) && |
257 | dev_priv->uncore.funcs.force_wake_get = |
325 | (__raw_i915_read32(dev_priv, HSW_EDRAM_PRESENT) == 1)) { |
258 | __gen6_gt_force_wake_mt_get; |
- | |
259 | dev_priv->uncore.funcs.force_wake_put = |
326 | /* The docs do not explain exactly how the calculation can be |
260 | __gen6_gt_force_wake_mt_put; |
- | |
261 | } else { |
327 | * made. It is somewhat guessable, but for now, it's always |
262 | DRM_INFO("No MT forcewake available on Ivybridge, this can result in issues\n"); |
- | |
263 | DRM_INFO("when using vblank-synced partial screen updates.\n"); |
- | |
264 | dev_priv->uncore.funcs.force_wake_get = |
- | |
265 | __gen6_gt_force_wake_get; |
- | |
266 | dev_priv->uncore.funcs.force_wake_put = |
- | |
267 | __gen6_gt_force_wake_put; |
328 | * 128MB. |
268 | } |
329 | * NB: We can't write IDICR yet because we do not have gt funcs |
269 | } else if (IS_GEN6(dev)) { |
- | |
270 | dev_priv->uncore.funcs.force_wake_get = |
330 | * set up */ |
271 | __gen6_gt_force_wake_get; |
- | |
272 | dev_priv->uncore.funcs.force_wake_put = |
331 | dev_priv->ellc_size = 128; |
Line -... | Line 332... | ||
- | 332 | DRM_INFO("Found %zuMB of eLLC\n", dev_priv->ellc_size); |
|
- | 333 | } |
|
- | 334 | ||
- | 335 | /* clear out old GT FIFO errors */ |
|
- | 336 | if (IS_GEN6(dev) || IS_GEN7(dev)) |
|
273 | __gen6_gt_force_wake_put; |
337 | __raw_i915_write32(dev_priv, GTFIFODBG, |
274 | } |
338 | __raw_i915_read32(dev_priv, GTFIFODBG)); |
Line 275... | Line 339... | ||
275 | 339 | ||
276 | intel_uncore_forcewake_reset(dev); |
340 | intel_uncore_forcewake_reset(dev); |
277 | } |
341 | } |
- | 342 | ||
Line 278... | Line 343... | ||
278 | 343 | void intel_uncore_sanitize(struct drm_device *dev) |
|
279 | void intel_uncore_sanitize(struct drm_device *dev) |
344 | { |
- | 345 | struct drm_i915_private *dev_priv = dev->dev_private; |
|
- | 346 | u32 reg_val; |
|
- | 347 | ||
- | 348 | /* BIOS often leaves RC6 enabled, but disable it for hw init */ |
|
- | 349 | intel_disable_gt_powersave(dev); |
|
- | 350 | ||
- | 351 | /* Turn off power gate, require especially for the BIOS less system */ |
|
- | 352 | if (IS_VALLEYVIEW(dev)) { |
|
- | 353 | ||
- | 354 | mutex_lock(&dev_priv->rps.hw_lock); |
|
- | 355 | reg_val = vlv_punit_read(dev_priv, PUNIT_REG_PWRGT_STATUS); |
|
- | 356 | ||
- | 357 | if (reg_val & (RENDER_PWRGT | MEDIA_PWRGT | DISP2D_PWRGT)) |
|
280 | { |
358 | vlv_punit_write(dev_priv, PUNIT_REG_PWRGT_CTRL, 0x0); |
Line 281... | Line 359... | ||
281 | intel_uncore_forcewake_reset(dev); |
359 | |
282 | 360 | mutex_unlock(&dev_priv->rps.hw_lock); |
|
283 | /* BIOS often leaves RC6 enabled, but disable it for hw init */ |
361 | |
284 | intel_disable_gt_powersave(dev); |
362 | } |
285 | } |
363 | } |
286 | 364 | ||
287 | /* |
365 | /* |
288 | * Generally this is called implicitly by the register read function. However, |
366 | * Generally this is called implicitly by the register read function. However, |
289 | * if some sequence requires the GT to not power down then this function should |
367 | * if some sequence requires the GT to not power down then this function should |
Line -... | Line 368... | ||
- | 368 | * be called at the beginning of the sequence followed by a call to |
|
- | 369 | * gen6_gt_force_wake_put() at the end of the sequence. |
|
- | 370 | */ |
|
- | 371 | void gen6_gt_force_wake_get(struct drm_i915_private *dev_priv, int fw_engine) |
|
- | 372 | { |
|
- | 373 | unsigned long irqflags; |
|
- | 374 | ||
- | 375 | if (!dev_priv->uncore.funcs.force_wake_get) |
|
- | 376 | return; |
|
290 | * be called at the beginning of the sequence followed by a call to |
377 | |
291 | * gen6_gt_force_wake_put() at the end of the sequence. |
378 | intel_runtime_pm_get(dev_priv); |
292 | */ |
379 | |
293 | void gen6_gt_force_wake_get(struct drm_i915_private *dev_priv) |
380 | /* Redirect to VLV specific routine */ |
294 | { |
381 | if (IS_VALLEYVIEW(dev_priv->dev)) |
Line 295... | Line 382... | ||
295 | unsigned long irqflags; |
382 | return vlv_force_wake_get(dev_priv, fw_engine); |
296 | 383 | ||
297 | spin_lock_irqsave(&dev_priv->uncore.lock, irqflags); |
384 | spin_lock_irqsave(&dev_priv->uncore.lock, irqflags); |
298 | if (dev_priv->uncore.forcewake_count++ == 0) |
385 | if (dev_priv->uncore.forcewake_count++ == 0) |
299 | dev_priv->uncore.funcs.force_wake_get(dev_priv); |
386 | dev_priv->uncore.funcs.force_wake_get(dev_priv, FORCEWAKE_ALL); |
300 | spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags); |
387 | spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags); |
Line -... | Line 388... | ||
- | 388 | } |
|
- | 389 | ||
- | 390 | /* |
|
- | 391 | * see gen6_gt_force_wake_get() |
|
- | 392 | */ |
|
- | 393 | void gen6_gt_force_wake_put(struct drm_i915_private *dev_priv, int fw_engine) |
|
- | 394 | { |
|
- | 395 | unsigned long irqflags; |
|
301 | } |
396 | |
302 | 397 | if (!dev_priv->uncore.funcs.force_wake_put) |
|
303 | /* |
398 | return; |
- | 399 | ||
- | 400 | /* Redirect to VLV specific routine */ |
|
- | 401 | if (IS_VALLEYVIEW(dev_priv->dev)) |
|
- | 402 | return vlv_force_wake_put(dev_priv, fw_engine); |
|
304 | * see gen6_gt_force_wake_get() |
403 | |
- | 404 | ||
- | 405 | spin_lock_irqsave(&dev_priv->uncore.lock, irqflags); |
|
305 | */ |
406 | if (--dev_priv->uncore.forcewake_count == 0) { |
Line 306... | Line 407... | ||
306 | void gen6_gt_force_wake_put(struct drm_i915_private *dev_priv) |
407 | dev_priv->uncore.forcewake_count++; |
307 | { |
408 | mod_delayed_work(dev_priv->wq, |
308 | unsigned long irqflags; |
- | |
309 | 409 | &dev_priv->uncore.force_wake_work, |
|
310 | spin_lock_irqsave(&dev_priv->uncore.lock, irqflags); |
- | |
Line 311... | Line 410... | ||
311 | if (--dev_priv->uncore.forcewake_count == 0) |
410 | 1); |
312 | dev_priv->uncore.funcs.force_wake_put(dev_priv); |
411 | } |
313 | spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags); |
412 | spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags); |
314 | } |
413 | |
Line 329... | Line 428... | ||
329 | } |
428 | } |
Line 330... | Line 429... | ||
330 | 429 | ||
331 | static void |
430 | static void |
332 | hsw_unclaimed_reg_clear(struct drm_i915_private *dev_priv, u32 reg) |
431 | hsw_unclaimed_reg_clear(struct drm_i915_private *dev_priv, u32 reg) |
333 | { |
- | |
334 | if (HAS_FPGA_DBG_UNCLAIMED(dev_priv->dev) && |
432 | { |
335 | (__raw_i915_read32(dev_priv, FPGA_DBG) & FPGA_DBG_RM_NOCLAIM)) { |
433 | if (__raw_i915_read32(dev_priv, FPGA_DBG) & FPGA_DBG_RM_NOCLAIM) { |
336 | DRM_ERROR("Unknown unclaimed register before writing to %x\n", |
434 | DRM_ERROR("Unknown unclaimed register before writing to %x\n", |
337 | reg); |
435 | reg); |
338 | __raw_i915_write32(dev_priv, FPGA_DBG, FPGA_DBG_RM_NOCLAIM); |
436 | __raw_i915_write32(dev_priv, FPGA_DBG, FPGA_DBG_RM_NOCLAIM); |
339 | } |
437 | } |
Line 340... | Line 438... | ||
340 | } |
438 | } |
341 | 439 | ||
342 | static void |
440 | static void |
343 | hsw_unclaimed_reg_check(struct drm_i915_private *dev_priv, u32 reg) |
- | |
344 | { |
441 | hsw_unclaimed_reg_check(struct drm_i915_private *dev_priv, u32 reg) |
345 | if (HAS_FPGA_DBG_UNCLAIMED(dev_priv->dev) && |
442 | { |
346 | (__raw_i915_read32(dev_priv, FPGA_DBG) & FPGA_DBG_RM_NOCLAIM)) { |
443 | if (__raw_i915_read32(dev_priv, FPGA_DBG) & FPGA_DBG_RM_NOCLAIM) { |
347 | DRM_ERROR("Unclaimed write to %x\n", reg); |
444 | DRM_ERROR("Unclaimed write to %x\n", reg); |
348 | __raw_i915_write32(dev_priv, FPGA_DBG, FPGA_DBG_RM_NOCLAIM); |
445 | __raw_i915_write32(dev_priv, FPGA_DBG, FPGA_DBG_RM_NOCLAIM); |
Line 349... | Line 446... | ||
349 | } |
446 | } |
350 | } |
447 | } |
- | 448 | ||
- | 449 | static void |
|
- | 450 | assert_device_not_suspended(struct drm_i915_private *dev_priv) |
|
- | 451 | { |
|
- | 452 | WARN(HAS_RUNTIME_PM(dev_priv->dev) && dev_priv->pm.suspended, |
|
- | 453 | "Device suspended\n"); |
|
351 | 454 | } |
|
352 | #define __i915_read(x) \ |
455 | |
353 | u##x i915_read##x(struct drm_i915_private *dev_priv, u32 reg, bool trace) { \ |
456 | #define REG_READ_HEADER(x) \ |
- | 457 | unsigned long irqflags; \ |
|
- | 458 | u##x val = 0; \ |
|
- | 459 | spin_lock_irqsave(&dev_priv->uncore.lock, irqflags) |
|
- | 460 | ||
- | 461 | #define REG_READ_FOOTER \ |
|
- | 462 | spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags); \ |
|
354 | unsigned long irqflags; \ |
463 | trace_i915_reg_rw(false, reg, val, sizeof(val), trace); \ |
- | 464 | return val |
|
- | 465 | ||
- | 466 | #define __gen4_read(x) \ |
|
- | 467 | static u##x \ |
|
- | 468 | gen4_read##x(struct drm_i915_private *dev_priv, off_t reg, bool trace) { \ |
|
- | 469 | REG_READ_HEADER(x); \ |
|
- | 470 | val = __raw_i915_read##x(dev_priv, reg); \ |
|
- | 471 | REG_READ_FOOTER; \ |
|
- | 472 | } |
|
- | 473 | ||
- | 474 | #define __gen5_read(x) \ |
|
355 | u##x val = 0; \ |
475 | static u##x \ |
- | 476 | gen5_read##x(struct drm_i915_private *dev_priv, off_t reg, bool trace) { \ |
|
- | 477 | REG_READ_HEADER(x); \ |
|
- | 478 | ilk_dummy_write(dev_priv); \ |
|
- | 479 | val = __raw_i915_read##x(dev_priv, reg); \ |
|
- | 480 | REG_READ_FOOTER; \ |
|
- | 481 | } |
|
- | 482 | ||
- | 483 | #define __gen6_read(x) \ |
|
356 | spin_lock_irqsave(&dev_priv->uncore.lock, irqflags); \ |
484 | static u##x \ |
357 | if (dev_priv->info->gen == 5) \ |
485 | gen6_read##x(struct drm_i915_private *dev_priv, off_t reg, bool trace) { \ |
358 | ilk_dummy_write(dev_priv); \ |
486 | REG_READ_HEADER(x); \ |
- | 487 | if (NEEDS_FORCE_WAKE((dev_priv), (reg))) { \ |
|
359 | if (NEEDS_FORCE_WAKE((dev_priv), (reg))) { \ |
488 | if (dev_priv->uncore.forcewake_count == 0) \ |
360 | if (dev_priv->uncore.forcewake_count == 0) \ |
489 | dev_priv->uncore.funcs.force_wake_get(dev_priv, \ |
361 | dev_priv->uncore.funcs.force_wake_get(dev_priv); \ |
490 | FORCEWAKE_ALL); \ |
- | 491 | val = __raw_i915_read##x(dev_priv, reg); \ |
|
362 | val = __raw_i915_read##x(dev_priv, reg); \ |
492 | if (dev_priv->uncore.forcewake_count == 0) \ |
363 | if (dev_priv->uncore.forcewake_count == 0) \ |
493 | dev_priv->uncore.funcs.force_wake_put(dev_priv, \ |
364 | dev_priv->uncore.funcs.force_wake_put(dev_priv); \ |
494 | FORCEWAKE_ALL); \ |
- | 495 | } else { \ |
|
- | 496 | val = __raw_i915_read##x(dev_priv, reg); \ |
|
- | 497 | } \ |
|
- | 498 | REG_READ_FOOTER; \ |
|
- | 499 | } |
|
- | 500 | ||
- | 501 | #define __vlv_read(x) \ |
|
- | 502 | static u##x \ |
|
- | 503 | vlv_read##x(struct drm_i915_private *dev_priv, off_t reg, bool trace) { \ |
|
- | 504 | unsigned fwengine = 0; \ |
|
- | 505 | unsigned *fwcount; \ |
|
365 | } else { \ |
506 | REG_READ_HEADER(x); \ |
- | 507 | if (FORCEWAKE_VLV_RENDER_RANGE_OFFSET(reg)) { \ |
|
- | 508 | fwengine = FORCEWAKE_RENDER; \ |
|
- | 509 | fwcount = &dev_priv->uncore.fw_rendercount; \ |
|
- | 510 | } \ |
|
- | 511 | else if (FORCEWAKE_VLV_MEDIA_RANGE_OFFSET(reg)) { \ |
|
- | 512 | fwengine = FORCEWAKE_MEDIA; \ |
|
- | 513 | fwcount = &dev_priv->uncore.fw_mediacount; \ |
|
- | 514 | } \ |
|
- | 515 | if (fwengine != 0) { \ |
|
366 | val = __raw_i915_read##x(dev_priv, reg); \ |
516 | if ((*fwcount)++ == 0) \ |
- | 517 | (dev_priv)->uncore.funcs.force_wake_get(dev_priv, \ |
|
- | 518 | fwengine); \ |
|
- | 519 | val = __raw_i915_read##x(dev_priv, reg); \ |
|
367 | } \ |
520 | if (--(*fwcount) == 0) \ |
- | 521 | (dev_priv)->uncore.funcs.force_wake_put(dev_priv, \ |
|
- | 522 | fwengine); \ |
|
- | 523 | } else { \ |
|
368 | spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags); \ |
524 | val = __raw_i915_read##x(dev_priv, reg); \ |
Line 369... | Line -... | ||
369 | trace_i915_reg_rw(false, reg, val, sizeof(val), trace); \ |
- | |
370 | return val; \ |
- | |
371 | } |
- | |
372 | - | ||
373 | __i915_read(8) |
- | |
Line -... | Line 525... | ||
- | 525 | } \ |
|
- | 526 | REG_READ_FOOTER; \ |
|
- | 527 | } |
|
- | 528 | ||
- | 529 | ||
- | 530 | __vlv_read(8) |
|
- | 531 | __vlv_read(16) |
|
- | 532 | __vlv_read(32) |
|
- | 533 | __vlv_read(64) |
|
- | 534 | __gen6_read(8) |
|
- | 535 | __gen6_read(16) |
|
- | 536 | __gen6_read(32) |
|
- | 537 | __gen6_read(64) |
|
- | 538 | __gen5_read(8) |
|
- | 539 | __gen5_read(16) |
|
- | 540 | __gen5_read(32) |
|
- | 541 | __gen5_read(64) |
|
- | 542 | __gen4_read(8) |
|
- | 543 | __gen4_read(16) |
|
374 | __i915_read(16) |
544 | __gen4_read(32) |
- | 545 | __gen4_read(64) |
|
- | 546 | ||
- | 547 | #undef __vlv_read |
|
- | 548 | #undef __gen6_read |
|
375 | __i915_read(32) |
549 | #undef __gen5_read |
376 | __i915_read(64) |
550 | #undef __gen4_read |
377 | #undef __i915_read |
- | |
378 | 551 | #undef REG_READ_FOOTER |
|
379 | #define __i915_write(x) \ |
552 | #undef REG_READ_HEADER |
- | 553 | ||
- | 554 | #define REG_WRITE_HEADER \ |
|
- | 555 | unsigned long irqflags; \ |
|
- | 556 | trace_i915_reg_rw(true, reg, val, sizeof(val), trace); \ |
|
- | 557 | spin_lock_irqsave(&dev_priv->uncore.lock, irqflags) |
|
- | 558 | ||
- | 559 | #define REG_WRITE_FOOTER \ |
|
- | 560 | spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags) |
|
- | 561 | ||
- | 562 | #define __gen4_write(x) \ |
|
- | 563 | static void \ |
|
- | 564 | gen4_write##x(struct drm_i915_private *dev_priv, off_t reg, u##x val, bool trace) { \ |
|
- | 565 | REG_WRITE_HEADER; \ |
|
- | 566 | __raw_i915_write##x(dev_priv, reg, val); \ |
|
- | 567 | REG_WRITE_FOOTER; \ |
|
- | 568 | } |
|
- | 569 | ||
- | 570 | #define __gen5_write(x) \ |
|
- | 571 | static void \ |
|
- | 572 | gen5_write##x(struct drm_i915_private *dev_priv, off_t reg, u##x val, bool trace) { \ |
|
- | 573 | REG_WRITE_HEADER; \ |
|
- | 574 | ilk_dummy_write(dev_priv); \ |
|
- | 575 | __raw_i915_write##x(dev_priv, reg, val); \ |
|
- | 576 | REG_WRITE_FOOTER; \ |
|
- | 577 | } |
|
- | 578 | ||
380 | void i915_write##x(struct drm_i915_private *dev_priv, u32 reg, u##x val, bool trace) { \ |
579 | #define __gen6_write(x) \ |
381 | unsigned long irqflags; \ |
580 | static void \ |
382 | u32 __fifo_ret = 0; \ |
581 | gen6_write##x(struct drm_i915_private *dev_priv, off_t reg, u##x val, bool trace) { \ |
- | 582 | u32 __fifo_ret = 0; \ |
|
- | 583 | REG_WRITE_HEADER; \ |
|
383 | trace_i915_reg_rw(true, reg, val, sizeof(val), trace); \ |
584 | if (NEEDS_FORCE_WAKE((dev_priv), (reg))) { \ |
384 | spin_lock_irqsave(&dev_priv->uncore.lock, irqflags); \ |
585 | __fifo_ret = __gen6_gt_wait_for_fifo(dev_priv); \ |
- | 586 | } \ |
|
- | 587 | assert_device_not_suspended(dev_priv); \ |
|
- | 588 | __raw_i915_write##x(dev_priv, reg, val); \ |
|
- | 589 | if (unlikely(__fifo_ret)) { \ |
|
- | 590 | gen6_gt_check_fifodbg(dev_priv); \ |
|
- | 591 | } \ |
|
- | 592 | REG_WRITE_FOOTER; \ |
|
- | 593 | } |
|
- | 594 | ||
- | 595 | #define __hsw_write(x) \ |
|
- | 596 | static void \ |
|
- | 597 | hsw_write##x(struct drm_i915_private *dev_priv, off_t reg, u##x val, bool trace) { \ |
|
- | 598 | u32 __fifo_ret = 0; \ |
|
385 | if (NEEDS_FORCE_WAKE((dev_priv), (reg))) { \ |
599 | REG_WRITE_HEADER; \ |
386 | __fifo_ret = __gen6_gt_wait_for_fifo(dev_priv); \ |
600 | if (NEEDS_FORCE_WAKE((dev_priv), (reg))) { \ |
387 | } \ |
601 | __fifo_ret = __gen6_gt_wait_for_fifo(dev_priv); \ |
388 | if (dev_priv->info->gen == 5) \ |
602 | } \ |
389 | ilk_dummy_write(dev_priv); \ |
603 | assert_device_not_suspended(dev_priv); \ |
390 | hsw_unclaimed_reg_clear(dev_priv, reg); \ |
604 | hsw_unclaimed_reg_clear(dev_priv, reg); \ |
- | 605 | __raw_i915_write##x(dev_priv, reg, val); \ |
|
- | 606 | if (unlikely(__fifo_ret)) { \ |
|
- | 607 | gen6_gt_check_fifodbg(dev_priv); \ |
|
- | 608 | } \ |
|
- | 609 | hsw_unclaimed_reg_check(dev_priv, reg); \ |
|
- | 610 | REG_WRITE_FOOTER; \ |
|
- | 611 | } |
|
- | 612 | ||
- | 613 | static const u32 gen8_shadowed_regs[] = { |
|
- | 614 | FORCEWAKE_MT, |
|
- | 615 | GEN6_RPNSWREQ, |
|
- | 616 | GEN6_RC_VIDEO_FREQ, |
|
- | 617 | RING_TAIL(RENDER_RING_BASE), |
|
- | 618 | RING_TAIL(GEN6_BSD_RING_BASE), |
|
- | 619 | RING_TAIL(VEBOX_RING_BASE), |
|
- | 620 | RING_TAIL(BLT_RING_BASE), |
|
- | 621 | /* TODO: Other registers are not yet used */ |
|
- | 622 | }; |
|
- | 623 | ||
- | 624 | static bool is_gen8_shadowed(struct drm_i915_private *dev_priv, u32 reg) |
|
- | 625 | { |
|
- | 626 | int i; |
|
- | 627 | for (i = 0; i < ARRAY_SIZE(gen8_shadowed_regs); i++) |
|
- | 628 | if (reg == gen8_shadowed_regs[i]) |
|
- | 629 | return true; |
|
- | 630 | ||
- | 631 | return false; |
|
- | 632 | } |
|
- | 633 | ||
- | 634 | #define __gen8_write(x) \ |
|
- | 635 | static void \ |
|
- | 636 | gen8_write##x(struct drm_i915_private *dev_priv, off_t reg, u##x val, bool trace) { \ |
|
- | 637 | bool __needs_put = reg < 0x40000 && !is_gen8_shadowed(dev_priv, reg); \ |
|
- | 638 | REG_WRITE_HEADER; \ |
|
- | 639 | if (__needs_put) { \ |
|
- | 640 | dev_priv->uncore.funcs.force_wake_get(dev_priv, \ |
|
- | 641 | FORCEWAKE_ALL); \ |
|
- | 642 | } \ |
|
- | 643 | __raw_i915_write##x(dev_priv, reg, val); \ |
|
- | 644 | if (__needs_put) { \ |
|
- | 645 | dev_priv->uncore.funcs.force_wake_put(dev_priv, \ |
|
- | 646 | FORCEWAKE_ALL); \ |
|
- | 647 | } \ |
|
- | 648 | REG_WRITE_FOOTER; \ |
|
- | 649 | } |
|
- | 650 | ||
- | 651 | __gen8_write(8) |
|
- | 652 | __gen8_write(16) |
|
- | 653 | __gen8_write(32) |
|
- | 654 | __gen8_write(64) |
|
- | 655 | __hsw_write(8) |
|
- | 656 | __hsw_write(16) |
|
- | 657 | __hsw_write(32) |
|
- | 658 | __hsw_write(64) |
|
- | 659 | __gen6_write(8) |
|
- | 660 | __gen6_write(16) |
|
- | 661 | __gen6_write(32) |
|
- | 662 | __gen6_write(64) |
|
- | 663 | __gen5_write(8) |
|
- | 664 | __gen5_write(16) |
|
- | 665 | __gen5_write(32) |
|
- | 666 | __gen5_write(64) |
|
- | 667 | __gen4_write(8) |
|
- | 668 | __gen4_write(16) |
|
- | 669 | __gen4_write(32) |
|
- | 670 | __gen4_write(64) |
|
- | 671 | ||
- | 672 | #undef __gen8_write |
|
- | 673 | #undef __hsw_write |
|
- | 674 | #undef __gen6_write |
|
- | 675 | #undef __gen5_write |
|
- | 676 | #undef __gen4_write |
|
- | 677 | #undef REG_WRITE_FOOTER |
|
- | 678 | #undef REG_WRITE_HEADER |
|
- | 679 | ||
- | 680 | void intel_uncore_init(struct drm_device *dev) |
|
- | 681 | { |
|
- | 682 | struct drm_i915_private *dev_priv = dev->dev_private; |
|
- | 683 | ||
- | 684 | INIT_DELAYED_WORK(&dev_priv->uncore.force_wake_work, |
|
- | 685 | gen6_force_wake_work); |
|
- | 686 | ||
- | 687 | if (IS_VALLEYVIEW(dev)) { |
|
- | 688 | dev_priv->uncore.funcs.force_wake_get = __vlv_force_wake_get; |
|
- | 689 | dev_priv->uncore.funcs.force_wake_put = __vlv_force_wake_put; |
|
- | 690 | } else if (IS_HASWELL(dev) || IS_GEN8(dev)) { |
|
- | 691 | dev_priv->uncore.funcs.force_wake_get = __gen6_gt_force_wake_mt_get; |
|
- | 692 | dev_priv->uncore.funcs.force_wake_put = __gen6_gt_force_wake_mt_put; |
|
- | 693 | } else if (IS_IVYBRIDGE(dev)) { |
|
- | 694 | u32 ecobus; |
|
- | 695 | ||
- | 696 | /* IVB configs may use multi-threaded forcewake */ |
|
- | 697 | ||
- | 698 | /* A small trick here - if the bios hasn't configured |
|
- | 699 | * MT forcewake, and if the device is in RC6, then |
|
- | 700 | * force_wake_mt_get will not wake the device and the |
|
- | 701 | * ECOBUS read will return zero. Which will be |
|
- | 702 | * (correctly) interpreted by the test below as MT |
|
- | 703 | * forcewake being disabled. |
|
- | 704 | */ |
|
- | 705 | mutex_lock(&dev->struct_mutex); |
|
- | 706 | __gen6_gt_force_wake_mt_get(dev_priv, FORCEWAKE_ALL); |
|
- | 707 | ecobus = __raw_i915_read32(dev_priv, ECOBUS); |
|
- | 708 | __gen6_gt_force_wake_mt_put(dev_priv, FORCEWAKE_ALL); |
|
- | 709 | mutex_unlock(&dev->struct_mutex); |
|
- | 710 | ||
- | 711 | if (ecobus & FORCEWAKE_MT_ENABLE) { |
|
- | 712 | dev_priv->uncore.funcs.force_wake_get = |
|
- | 713 | __gen6_gt_force_wake_mt_get; |
|
- | 714 | dev_priv->uncore.funcs.force_wake_put = |
|
- | 715 | __gen6_gt_force_wake_mt_put; |
|
- | 716 | } else { |
|
- | 717 | DRM_INFO("No MT forcewake available on Ivybridge, this can result in issues\n"); |
|
- | 718 | DRM_INFO("when using vblank-synced partial screen updates.\n"); |
|
- | 719 | dev_priv->uncore.funcs.force_wake_get = |
|
- | 720 | __gen6_gt_force_wake_get; |
|
- | 721 | dev_priv->uncore.funcs.force_wake_put = |
|
- | 722 | __gen6_gt_force_wake_put; |
|
- | 723 | } |
|
- | 724 | } else if (IS_GEN6(dev)) { |
|
- | 725 | dev_priv->uncore.funcs.force_wake_get = |
|
- | 726 | __gen6_gt_force_wake_get; |
|
- | 727 | dev_priv->uncore.funcs.force_wake_put = |
|
- | 728 | __gen6_gt_force_wake_put; |
|
- | 729 | } |
|
- | 730 | ||
- | 731 | switch (INTEL_INFO(dev)->gen) { |
|
- | 732 | default: |
|
- | 733 | dev_priv->uncore.funcs.mmio_writeb = gen8_write8; |
|
- | 734 | dev_priv->uncore.funcs.mmio_writew = gen8_write16; |
|
- | 735 | dev_priv->uncore.funcs.mmio_writel = gen8_write32; |
|
- | 736 | dev_priv->uncore.funcs.mmio_writeq = gen8_write64; |
|
- | 737 | dev_priv->uncore.funcs.mmio_readb = gen6_read8; |
|
- | 738 | dev_priv->uncore.funcs.mmio_readw = gen6_read16; |
|
- | 739 | dev_priv->uncore.funcs.mmio_readl = gen6_read32; |
|
- | 740 | dev_priv->uncore.funcs.mmio_readq = gen6_read64; |
|
- | 741 | break; |
|
- | 742 | case 7: |
|
- | 743 | case 6: |
|
- | 744 | if (IS_HASWELL(dev)) { |
|
- | 745 | dev_priv->uncore.funcs.mmio_writeb = hsw_write8; |
|
- | 746 | dev_priv->uncore.funcs.mmio_writew = hsw_write16; |
|
- | 747 | dev_priv->uncore.funcs.mmio_writel = hsw_write32; |
|
- | 748 | dev_priv->uncore.funcs.mmio_writeq = hsw_write64; |
|
- | 749 | } else { |
|
- | 750 | dev_priv->uncore.funcs.mmio_writeb = gen6_write8; |
|
- | 751 | dev_priv->uncore.funcs.mmio_writew = gen6_write16; |
|
- | 752 | dev_priv->uncore.funcs.mmio_writel = gen6_write32; |
|
- | 753 | dev_priv->uncore.funcs.mmio_writeq = gen6_write64; |
|
- | 754 | } |
|
- | 755 | ||
- | 756 | if (IS_VALLEYVIEW(dev)) { |
|
- | 757 | dev_priv->uncore.funcs.mmio_readb = vlv_read8; |
|
- | 758 | dev_priv->uncore.funcs.mmio_readw = vlv_read16; |
|
- | 759 | dev_priv->uncore.funcs.mmio_readl = vlv_read32; |
|
- | 760 | dev_priv->uncore.funcs.mmio_readq = vlv_read64; |
|
- | 761 | } else { |
|
- | 762 | dev_priv->uncore.funcs.mmio_readb = gen6_read8; |
|
- | 763 | dev_priv->uncore.funcs.mmio_readw = gen6_read16; |
|
- | 764 | dev_priv->uncore.funcs.mmio_readl = gen6_read32; |
|
- | 765 | dev_priv->uncore.funcs.mmio_readq = gen6_read64; |
|
- | 766 | } |
|
- | 767 | break; |
|
- | 768 | case 5: |
|
- | 769 | dev_priv->uncore.funcs.mmio_writeb = gen5_write8; |
|
- | 770 | dev_priv->uncore.funcs.mmio_writew = gen5_write16; |
|
- | 771 | dev_priv->uncore.funcs.mmio_writel = gen5_write32; |
|
- | 772 | dev_priv->uncore.funcs.mmio_writeq = gen5_write64; |
|
- | 773 | dev_priv->uncore.funcs.mmio_readb = gen5_read8; |
|
- | 774 | dev_priv->uncore.funcs.mmio_readw = gen5_read16; |
|
- | 775 | dev_priv->uncore.funcs.mmio_readl = gen5_read32; |
|
- | 776 | dev_priv->uncore.funcs.mmio_readq = gen5_read64; |
|
- | 777 | break; |
|
- | 778 | case 4: |
|
- | 779 | case 3: |
|
- | 780 | case 2: |
|
- | 781 | dev_priv->uncore.funcs.mmio_writeb = gen4_write8; |
|
- | 782 | dev_priv->uncore.funcs.mmio_writew = gen4_write16; |
|
- | 783 | dev_priv->uncore.funcs.mmio_writel = gen4_write32; |
|
- | 784 | dev_priv->uncore.funcs.mmio_writeq = gen4_write64; |
|
- | 785 | dev_priv->uncore.funcs.mmio_readb = gen4_read8; |
|
- | 786 | dev_priv->uncore.funcs.mmio_readw = gen4_read16; |
|
- | 787 | dev_priv->uncore.funcs.mmio_readl = gen4_read32; |
|
- | 788 | dev_priv->uncore.funcs.mmio_readq = gen4_read64; |
|
- | 789 | break; |
|
- | 790 | } |
|
- | 791 | } |
|
391 | __raw_i915_write##x(dev_priv, reg, val); \ |
792 | |
- | 793 | void intel_uncore_fini(struct drm_device *dev) |
|
- | 794 | { |
|
- | 795 | struct drm_i915_private *dev_priv = dev->dev_private; |
|
392 | if (unlikely(__fifo_ret)) { \ |
796 | |
393 | gen6_gt_check_fifodbg(dev_priv); \ |
- | |
394 | } \ |
- | |
395 | hsw_unclaimed_reg_check(dev_priv, reg); \ |
- | |
396 | spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags); \ |
- | |
397 | } |
- | |
Line 398... | Line 797... | ||
398 | __i915_write(8) |
797 | // flush_delayed_work(&dev_priv->uncore.force_wake_work); |
399 | __i915_write(16) |
798 | |
400 | __i915_write(32) |
799 | /* Paranoia: make sure we have disabled everything before we exit. */ |
401 | __i915_write(64) |
800 | intel_uncore_sanitize(dev); |
402 | #undef __i915_write |
801 | } |
403 | 802 | ||
404 | static const struct register_whitelist { |
803 | static const struct register_whitelist { |
Line 405... | Line 804... | ||
405 | uint64_t offset; |
804 | uint64_t offset; |
406 | uint32_t size; |
805 | uint32_t size; |
407 | uint32_t gen_bitmask; /* support gens, 0x10 for 4, 0x30 for 4 and 5, etc. */ |
806 | uint32_t gen_bitmask; /* support gens, 0x10 for 4, 0x30 for 4 and 5, etc. */ |
Line 445... | Line 844... | ||
445 | } |
844 | } |
Line 446... | Line 845... | ||
446 | 845 | ||
447 | return 0; |
846 | return 0; |
Line 448... | Line 847... | ||
448 | } |
847 | } |
- | 848 | ||
449 | 849 | int i915_get_reset_stats_ioctl(struct drm_device *dev, |
|
450 | static int i8xx_do_reset(struct drm_device *dev) |
850 | void *data, struct drm_file *file) |
- | 851 | { |
|
- | 852 | struct drm_i915_private *dev_priv = dev->dev_private; |
|
- | 853 | struct drm_i915_reset_stats *args = data; |
|
Line 451... | Line 854... | ||
451 | { |
854 | struct i915_ctx_hang_stats *hs; |
452 | struct drm_i915_private *dev_priv = dev->dev_private; |
855 | int ret; |
Line 453... | Line 856... | ||
453 | 856 | ||
454 | if (IS_I85X(dev)) |
857 | if (args->flags || args->pad) |
Line 455... | Line 858... | ||
455 | return -ENODEV; |
858 | return -EINVAL; |
456 | - | ||
457 | I915_WRITE(D_STATE, I915_READ(D_STATE) | DSTATE_GFX_RESET_I830); |
- | |
458 | POSTING_READ(D_STATE); |
- | |
459 | 859 | ||
460 | if (IS_I830(dev) || IS_845G(dev)) { |
- | |
461 | I915_WRITE(DEBUG_RESET_I830, |
860 | if (args->ctx_id == DEFAULT_CONTEXT_ID) |
Line -... | Line 861... | ||
- | 861 | return -EPERM; |
|
- | 862 | ||
462 | DEBUG_RESET_DISPLAY | |
863 | ret = mutex_lock_interruptible(&dev->struct_mutex); |
463 | DEBUG_RESET_RENDER | |
864 | if (ret) |
464 | DEBUG_RESET_FULL); |
865 | return ret; |
Line -... | Line 866... | ||
- | 866 | ||
- | 867 | hs = i915_gem_context_get_hang_stats(dev, file, args->ctx_id); |
|
- | 868 | if (IS_ERR(hs)) { |
|
465 | POSTING_READ(DEBUG_RESET_I830); |
869 | mutex_unlock(&dev->struct_mutex); |
Line 466... | Line -... | ||
466 | msleep(1); |
- | |
467 | 870 | return PTR_ERR(hs); |
|
Line 468... | Line 871... | ||
468 | I915_WRITE(DEBUG_RESET_I830, 0); |
871 | } |
469 | POSTING_READ(DEBUG_RESET_I830); |
872 | |
Line 470... | Line 873... | ||
470 | } |
873 | args->reset_count = i915_reset_count(&dev_priv->gpu_error); |
Line 558... | Line 961... | ||
558 | 961 | ||
Line 559... | Line 962... | ||
559 | intel_uncore_forcewake_reset(dev); |
962 | intel_uncore_forcewake_reset(dev); |
560 | 963 | ||
561 | /* If reset with a user forcewake, try to restore, otherwise turn it off */ |
964 | /* If reset with a user forcewake, try to restore, otherwise turn it off */ |
562 | if (dev_priv->uncore.forcewake_count) |
965 | if (dev_priv->uncore.forcewake_count) |
563 | dev_priv->uncore.funcs.force_wake_get(dev_priv); |
966 | dev_priv->uncore.funcs.force_wake_get(dev_priv, FORCEWAKE_ALL); |
Line 564... | Line 967... | ||
564 | else |
967 | else |
565 | dev_priv->uncore.funcs.force_wake_put(dev_priv); |
968 | dev_priv->uncore.funcs.force_wake_put(dev_priv, FORCEWAKE_ALL); |
Line 566... | Line 969... | ||
566 | 969 | ||
567 | /* Restore fifo count */ |
970 | /* Restore fifo count */ |
568 | dev_priv->uncore.fifo_count = __raw_i915_read32(dev_priv, GT_FIFO_FREE_ENTRIES); |
971 | dev_priv->uncore.fifo_count = __raw_i915_read32(dev_priv, GTFIFOCTL) & GT_FIFO_FREE_ENTRIES_MASK; |
Line 569... | Line 972... | ||
569 | 972 | ||
570 | spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags); |
973 | spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags); |
571 | return ret; |
974 | return ret; |
- | 975 | } |
|
572 | } |
976 | |
573 | 977 | int intel_gpu_reset(struct drm_device *dev) |
|
574 | int intel_gpu_reset(struct drm_device *dev) |
978 | { |
575 | { |
979 | switch (INTEL_INFO(dev)->gen) { |
576 | switch (INTEL_INFO(dev)->gen) { |
- | |
577 | case 7: |
980 | case 8: |
578 | case 6: return gen6_do_reset(dev); |
981 | case 7: |
579 | case 5: return ironlake_do_reset(dev); |
982 | case 6: return gen6_do_reset(dev); |
Line 580... | Line -... | ||
580 | case 4: return i965_do_reset(dev); |
- | |
581 | case 2: return i8xx_do_reset(dev); |
- | |
582 | default: return -ENODEV; |
- | |
583 | } |
- | |
584 | } |
- | |
585 | - | ||
586 | void intel_uncore_clear_errors(struct drm_device *dev) |
- | |
587 | { |
- | |
588 | struct drm_i915_private *dev_priv = dev->dev_private; |
- | |
589 | 983 | case 5: return ironlake_do_reset(dev); |
|
590 | /* XXX needs spinlock around caller's grouping */ |
984 | case 4: return i965_do_reset(dev); |
591 | if (HAS_FPGA_DBG_UNCLAIMED(dev)) |
985 | default: return -ENODEV; |
Line 592... | Line 986... | ||
592 | __raw_i915_write32(dev_priv, FPGA_DBG, FPGA_DBG_RM_NOCLAIM); |
986 | } |