intel_uncore.c 31 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079
  1. /*
  2. * Copyright © 2013 Intel Corporation
  3. *
  4. * Permission is hereby granted, free of charge, to any person obtaining a
  5. * copy of this software and associated documentation files (the "Software"),
  6. * to deal in the Software without restriction, including without limitation
  7. * the rights to use, copy, modify, merge, publish, distribute, sublicense,
  8. * and/or sell copies of the Software, and to permit persons to whom the
  9. * Software is furnished to do so, subject to the following conditions:
  10. *
  11. * The above copyright notice and this permission notice (including the next
  12. * paragraph) shall be included in all copies or substantial portions of the
  13. * Software.
  14. *
  15. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  16. * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  17. * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
  18. * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  19. * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
  20. * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
  21. * IN THE SOFTWARE.
  22. */
  23. #include "i915_drv.h"
  24. #include "intel_drv.h"
  25. #define FORCEWAKE_ACK_TIMEOUT_MS 2
  26. #define __raw_i915_read8(dev_priv__, reg__) readb((dev_priv__)->regs + (reg__))
  27. #define __raw_i915_write8(dev_priv__, reg__, val__) writeb(val__, (dev_priv__)->regs + (reg__))
  28. #define __raw_i915_read16(dev_priv__, reg__) readw((dev_priv__)->regs + (reg__))
  29. #define __raw_i915_write16(dev_priv__, reg__, val__) writew(val__, (dev_priv__)->regs + (reg__))
  30. #define __raw_i915_read32(dev_priv__, reg__) readl((dev_priv__)->regs + (reg__))
  31. #define __raw_i915_write32(dev_priv__, reg__, val__) writel(val__, (dev_priv__)->regs + (reg__))
  32. #define __raw_i915_read64(dev_priv__, reg__) readq((dev_priv__)->regs + (reg__))
  33. #define __raw_i915_write64(dev_priv__, reg__, val__) writeq(val__, (dev_priv__)->regs + (reg__))
  34. #define __raw_posting_read(dev_priv__, reg__) (void)__raw_i915_read32(dev_priv__, reg__)
  35. static void
  36. assert_device_not_suspended(struct drm_i915_private *dev_priv)
  37. {
  38. WARN(HAS_RUNTIME_PM(dev_priv->dev) && dev_priv->pm.suspended,
  39. "Device suspended\n");
  40. }
  41. static void __gen6_gt_wait_for_thread_c0(struct drm_i915_private *dev_priv)
  42. {
  43. u32 gt_thread_status_mask;
  44. if (IS_HASWELL(dev_priv->dev))
  45. gt_thread_status_mask = GEN6_GT_THREAD_STATUS_CORE_MASK_HSW;
  46. else
  47. gt_thread_status_mask = GEN6_GT_THREAD_STATUS_CORE_MASK;
  48. /* w/a for a sporadic read returning 0 by waiting for the GT
  49. * thread to wake up.
  50. */
  51. if (wait_for_atomic_us((__raw_i915_read32(dev_priv, GEN6_GT_THREAD_STATUS_REG) & gt_thread_status_mask) == 0, 500))
  52. DRM_ERROR("GT thread status wait timed out\n");
  53. }
  54. static void __gen6_gt_force_wake_reset(struct drm_i915_private *dev_priv)
  55. {
  56. __raw_i915_write32(dev_priv, FORCEWAKE, 0);
  57. /* something from same cacheline, but !FORCEWAKE */
  58. __raw_posting_read(dev_priv, ECOBUS);
  59. }
  60. static void __gen6_gt_force_wake_get(struct drm_i915_private *dev_priv,
  61. int fw_engine)
  62. {
  63. if (wait_for_atomic((__raw_i915_read32(dev_priv, FORCEWAKE_ACK) & 1) == 0,
  64. FORCEWAKE_ACK_TIMEOUT_MS))
  65. DRM_ERROR("Timed out waiting for forcewake old ack to clear.\n");
  66. __raw_i915_write32(dev_priv, FORCEWAKE, 1);
  67. /* something from same cacheline, but !FORCEWAKE */
  68. __raw_posting_read(dev_priv, ECOBUS);
  69. if (wait_for_atomic((__raw_i915_read32(dev_priv, FORCEWAKE_ACK) & 1),
  70. FORCEWAKE_ACK_TIMEOUT_MS))
  71. DRM_ERROR("Timed out waiting for forcewake to ack request.\n");
  72. /* WaRsForcewakeWaitTC0:snb */
  73. __gen6_gt_wait_for_thread_c0(dev_priv);
  74. }
  75. static void __gen7_gt_force_wake_mt_reset(struct drm_i915_private *dev_priv)
  76. {
  77. __raw_i915_write32(dev_priv, FORCEWAKE_MT, _MASKED_BIT_DISABLE(0xffff));
  78. /* something from same cacheline, but !FORCEWAKE_MT */
  79. __raw_posting_read(dev_priv, ECOBUS);
  80. }
  81. static void __gen7_gt_force_wake_mt_get(struct drm_i915_private *dev_priv,
  82. int fw_engine)
  83. {
  84. u32 forcewake_ack;
  85. if (IS_HASWELL(dev_priv->dev) || IS_GEN8(dev_priv->dev))
  86. forcewake_ack = FORCEWAKE_ACK_HSW;
  87. else
  88. forcewake_ack = FORCEWAKE_MT_ACK;
  89. if (wait_for_atomic((__raw_i915_read32(dev_priv, forcewake_ack) & FORCEWAKE_KERNEL) == 0,
  90. FORCEWAKE_ACK_TIMEOUT_MS))
  91. DRM_ERROR("Timed out waiting for forcewake old ack to clear.\n");
  92. __raw_i915_write32(dev_priv, FORCEWAKE_MT,
  93. _MASKED_BIT_ENABLE(FORCEWAKE_KERNEL));
  94. /* something from same cacheline, but !FORCEWAKE_MT */
  95. __raw_posting_read(dev_priv, ECOBUS);
  96. if (wait_for_atomic((__raw_i915_read32(dev_priv, forcewake_ack) & FORCEWAKE_KERNEL),
  97. FORCEWAKE_ACK_TIMEOUT_MS))
  98. DRM_ERROR("Timed out waiting for forcewake to ack request.\n");
  99. /* WaRsForcewakeWaitTC0:ivb,hsw */
  100. if (INTEL_INFO(dev_priv->dev)->gen < 8)
  101. __gen6_gt_wait_for_thread_c0(dev_priv);
  102. }
  103. static void gen6_gt_check_fifodbg(struct drm_i915_private *dev_priv)
  104. {
  105. u32 gtfifodbg;
  106. gtfifodbg = __raw_i915_read32(dev_priv, GTFIFODBG);
  107. if (WARN(gtfifodbg, "GT wake FIFO error 0x%x\n", gtfifodbg))
  108. __raw_i915_write32(dev_priv, GTFIFODBG, gtfifodbg);
  109. }
  110. static void __gen6_gt_force_wake_put(struct drm_i915_private *dev_priv,
  111. int fw_engine)
  112. {
  113. __raw_i915_write32(dev_priv, FORCEWAKE, 0);
  114. /* something from same cacheline, but !FORCEWAKE */
  115. __raw_posting_read(dev_priv, ECOBUS);
  116. gen6_gt_check_fifodbg(dev_priv);
  117. }
  118. static void __gen7_gt_force_wake_mt_put(struct drm_i915_private *dev_priv,
  119. int fw_engine)
  120. {
  121. __raw_i915_write32(dev_priv, FORCEWAKE_MT,
  122. _MASKED_BIT_DISABLE(FORCEWAKE_KERNEL));
  123. /* something from same cacheline, but !FORCEWAKE_MT */
  124. __raw_posting_read(dev_priv, ECOBUS);
  125. if (IS_GEN7(dev_priv->dev))
  126. gen6_gt_check_fifodbg(dev_priv);
  127. }
  128. static int __gen6_gt_wait_for_fifo(struct drm_i915_private *dev_priv)
  129. {
  130. int ret = 0;
  131. /* On VLV, FIFO will be shared by both SW and HW.
  132. * So, we need to read the FREE_ENTRIES everytime */
  133. if (IS_VALLEYVIEW(dev_priv->dev))
  134. dev_priv->uncore.fifo_count =
  135. __raw_i915_read32(dev_priv, GTFIFOCTL) &
  136. GT_FIFO_FREE_ENTRIES_MASK;
  137. if (dev_priv->uncore.fifo_count < GT_FIFO_NUM_RESERVED_ENTRIES) {
  138. int loop = 500;
  139. u32 fifo = __raw_i915_read32(dev_priv, GTFIFOCTL) & GT_FIFO_FREE_ENTRIES_MASK;
  140. while (fifo <= GT_FIFO_NUM_RESERVED_ENTRIES && loop--) {
  141. udelay(10);
  142. fifo = __raw_i915_read32(dev_priv, GTFIFOCTL) & GT_FIFO_FREE_ENTRIES_MASK;
  143. }
  144. if (WARN_ON(loop < 0 && fifo <= GT_FIFO_NUM_RESERVED_ENTRIES))
  145. ++ret;
  146. dev_priv->uncore.fifo_count = fifo;
  147. }
  148. dev_priv->uncore.fifo_count--;
  149. return ret;
  150. }
  151. static void vlv_force_wake_reset(struct drm_i915_private *dev_priv)
  152. {
  153. __raw_i915_write32(dev_priv, FORCEWAKE_VLV,
  154. _MASKED_BIT_DISABLE(0xffff));
  155. __raw_i915_write32(dev_priv, FORCEWAKE_MEDIA_VLV,
  156. _MASKED_BIT_DISABLE(0xffff));
  157. /* something from same cacheline, but !FORCEWAKE_VLV */
  158. __raw_posting_read(dev_priv, FORCEWAKE_ACK_VLV);
  159. }
  160. static void __vlv_force_wake_get(struct drm_i915_private *dev_priv,
  161. int fw_engine)
  162. {
  163. /* Check for Render Engine */
  164. if (FORCEWAKE_RENDER & fw_engine) {
  165. if (wait_for_atomic((__raw_i915_read32(dev_priv,
  166. FORCEWAKE_ACK_VLV) &
  167. FORCEWAKE_KERNEL) == 0,
  168. FORCEWAKE_ACK_TIMEOUT_MS))
  169. DRM_ERROR("Timed out: Render forcewake old ack to clear.\n");
  170. __raw_i915_write32(dev_priv, FORCEWAKE_VLV,
  171. _MASKED_BIT_ENABLE(FORCEWAKE_KERNEL));
  172. if (wait_for_atomic((__raw_i915_read32(dev_priv,
  173. FORCEWAKE_ACK_VLV) &
  174. FORCEWAKE_KERNEL),
  175. FORCEWAKE_ACK_TIMEOUT_MS))
  176. DRM_ERROR("Timed out: waiting for Render to ack.\n");
  177. }
  178. /* Check for Media Engine */
  179. if (FORCEWAKE_MEDIA & fw_engine) {
  180. if (wait_for_atomic((__raw_i915_read32(dev_priv,
  181. FORCEWAKE_ACK_MEDIA_VLV) &
  182. FORCEWAKE_KERNEL) == 0,
  183. FORCEWAKE_ACK_TIMEOUT_MS))
  184. DRM_ERROR("Timed out: Media forcewake old ack to clear.\n");
  185. __raw_i915_write32(dev_priv, FORCEWAKE_MEDIA_VLV,
  186. _MASKED_BIT_ENABLE(FORCEWAKE_KERNEL));
  187. if (wait_for_atomic((__raw_i915_read32(dev_priv,
  188. FORCEWAKE_ACK_MEDIA_VLV) &
  189. FORCEWAKE_KERNEL),
  190. FORCEWAKE_ACK_TIMEOUT_MS))
  191. DRM_ERROR("Timed out: waiting for media to ack.\n");
  192. }
  193. /* WaRsForcewakeWaitTC0:vlv */
  194. __gen6_gt_wait_for_thread_c0(dev_priv);
  195. }
  196. static void __vlv_force_wake_put(struct drm_i915_private *dev_priv,
  197. int fw_engine)
  198. {
  199. /* Check for Render Engine */
  200. if (FORCEWAKE_RENDER & fw_engine)
  201. __raw_i915_write32(dev_priv, FORCEWAKE_VLV,
  202. _MASKED_BIT_DISABLE(FORCEWAKE_KERNEL));
  203. /* Check for Media Engine */
  204. if (FORCEWAKE_MEDIA & fw_engine)
  205. __raw_i915_write32(dev_priv, FORCEWAKE_MEDIA_VLV,
  206. _MASKED_BIT_DISABLE(FORCEWAKE_KERNEL));
  207. /* The below doubles as a POSTING_READ */
  208. gen6_gt_check_fifodbg(dev_priv);
  209. }
  210. static void vlv_force_wake_get(struct drm_i915_private *dev_priv, int fw_engine)
  211. {
  212. unsigned long irqflags;
  213. spin_lock_irqsave(&dev_priv->uncore.lock, irqflags);
  214. if (fw_engine & FORCEWAKE_RENDER &&
  215. dev_priv->uncore.fw_rendercount++ != 0)
  216. fw_engine &= ~FORCEWAKE_RENDER;
  217. if (fw_engine & FORCEWAKE_MEDIA &&
  218. dev_priv->uncore.fw_mediacount++ != 0)
  219. fw_engine &= ~FORCEWAKE_MEDIA;
  220. if (fw_engine)
  221. dev_priv->uncore.funcs.force_wake_get(dev_priv, fw_engine);
  222. spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags);
  223. }
  224. static void vlv_force_wake_put(struct drm_i915_private *dev_priv, int fw_engine)
  225. {
  226. unsigned long irqflags;
  227. spin_lock_irqsave(&dev_priv->uncore.lock, irqflags);
  228. if (fw_engine & FORCEWAKE_RENDER) {
  229. WARN_ON(!dev_priv->uncore.fw_rendercount);
  230. if (--dev_priv->uncore.fw_rendercount != 0)
  231. fw_engine &= ~FORCEWAKE_RENDER;
  232. }
  233. if (fw_engine & FORCEWAKE_MEDIA) {
  234. WARN_ON(!dev_priv->uncore.fw_mediacount);
  235. if (--dev_priv->uncore.fw_mediacount != 0)
  236. fw_engine &= ~FORCEWAKE_MEDIA;
  237. }
  238. if (fw_engine)
  239. dev_priv->uncore.funcs.force_wake_put(dev_priv, fw_engine);
  240. spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags);
  241. }
  242. static void gen6_force_wake_timer(unsigned long arg)
  243. {
  244. struct drm_i915_private *dev_priv = (void *)arg;
  245. unsigned long irqflags;
  246. assert_device_not_suspended(dev_priv);
  247. spin_lock_irqsave(&dev_priv->uncore.lock, irqflags);
  248. WARN_ON(!dev_priv->uncore.forcewake_count);
  249. if (--dev_priv->uncore.forcewake_count == 0)
  250. dev_priv->uncore.funcs.force_wake_put(dev_priv, FORCEWAKE_ALL);
  251. spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags);
  252. intel_runtime_pm_put(dev_priv);
  253. }
  254. static void intel_uncore_forcewake_reset(struct drm_device *dev, bool restore)
  255. {
  256. struct drm_i915_private *dev_priv = dev->dev_private;
  257. unsigned long irqflags;
  258. if (del_timer_sync(&dev_priv->uncore.force_wake_timer))
  259. gen6_force_wake_timer((unsigned long)dev_priv);
  260. /* Hold uncore.lock across reset to prevent any register access
  261. * with forcewake not set correctly
  262. */
  263. spin_lock_irqsave(&dev_priv->uncore.lock, irqflags);
  264. if (IS_VALLEYVIEW(dev))
  265. vlv_force_wake_reset(dev_priv);
  266. else if (IS_GEN6(dev) || IS_GEN7(dev))
  267. __gen6_gt_force_wake_reset(dev_priv);
  268. if (IS_IVYBRIDGE(dev) || IS_HASWELL(dev) || IS_GEN8(dev))
  269. __gen7_gt_force_wake_mt_reset(dev_priv);
  270. if (restore) { /* If reset with a user forcewake, try to restore */
  271. unsigned fw = 0;
  272. if (IS_VALLEYVIEW(dev)) {
  273. if (dev_priv->uncore.fw_rendercount)
  274. fw |= FORCEWAKE_RENDER;
  275. if (dev_priv->uncore.fw_mediacount)
  276. fw |= FORCEWAKE_MEDIA;
  277. } else {
  278. if (dev_priv->uncore.forcewake_count)
  279. fw = FORCEWAKE_ALL;
  280. }
  281. if (fw)
  282. dev_priv->uncore.funcs.force_wake_get(dev_priv, fw);
  283. if (IS_GEN6(dev) || IS_GEN7(dev))
  284. dev_priv->uncore.fifo_count =
  285. __raw_i915_read32(dev_priv, GTFIFOCTL) &
  286. GT_FIFO_FREE_ENTRIES_MASK;
  287. } else {
  288. dev_priv->uncore.forcewake_count = 0;
  289. dev_priv->uncore.fw_rendercount = 0;
  290. dev_priv->uncore.fw_mediacount = 0;
  291. }
  292. spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags);
  293. }
  294. void intel_uncore_early_sanitize(struct drm_device *dev)
  295. {
  296. struct drm_i915_private *dev_priv = dev->dev_private;
  297. if (HAS_FPGA_DBG_UNCLAIMED(dev))
  298. __raw_i915_write32(dev_priv, FPGA_DBG, FPGA_DBG_RM_NOCLAIM);
  299. if ((IS_HASWELL(dev) || IS_BROADWELL(dev)) &&
  300. (__raw_i915_read32(dev_priv, HSW_EDRAM_PRESENT) == 1)) {
  301. /* The docs do not explain exactly how the calculation can be
  302. * made. It is somewhat guessable, but for now, it's always
  303. * 128MB.
  304. * NB: We can't write IDICR yet because we do not have gt funcs
  305. * set up */
  306. dev_priv->ellc_size = 128;
  307. DRM_INFO("Found %zuMB of eLLC\n", dev_priv->ellc_size);
  308. }
  309. /* clear out old GT FIFO errors */
  310. if (IS_GEN6(dev) || IS_GEN7(dev))
  311. __raw_i915_write32(dev_priv, GTFIFODBG,
  312. __raw_i915_read32(dev_priv, GTFIFODBG));
  313. intel_uncore_forcewake_reset(dev, false);
  314. }
  315. void intel_uncore_sanitize(struct drm_device *dev)
  316. {
  317. /* BIOS often leaves RC6 enabled, but disable it for hw init */
  318. intel_disable_gt_powersave(dev);
  319. }
  320. /*
  321. * Generally this is called implicitly by the register read function. However,
  322. * if some sequence requires the GT to not power down then this function should
  323. * be called at the beginning of the sequence followed by a call to
  324. * gen6_gt_force_wake_put() at the end of the sequence.
  325. */
  326. void gen6_gt_force_wake_get(struct drm_i915_private *dev_priv, int fw_engine)
  327. {
  328. unsigned long irqflags;
  329. if (!dev_priv->uncore.funcs.force_wake_get)
  330. return;
  331. intel_runtime_pm_get(dev_priv);
  332. /* Redirect to VLV specific routine */
  333. if (IS_VALLEYVIEW(dev_priv->dev))
  334. return vlv_force_wake_get(dev_priv, fw_engine);
  335. spin_lock_irqsave(&dev_priv->uncore.lock, irqflags);
  336. if (dev_priv->uncore.forcewake_count++ == 0)
  337. dev_priv->uncore.funcs.force_wake_get(dev_priv, FORCEWAKE_ALL);
  338. spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags);
  339. }
  340. /*
  341. * see gen6_gt_force_wake_get()
  342. */
  343. void gen6_gt_force_wake_put(struct drm_i915_private *dev_priv, int fw_engine)
  344. {
  345. unsigned long irqflags;
  346. bool delayed = false;
  347. if (!dev_priv->uncore.funcs.force_wake_put)
  348. return;
  349. /* Redirect to VLV specific routine */
  350. if (IS_VALLEYVIEW(dev_priv->dev)) {
  351. vlv_force_wake_put(dev_priv, fw_engine);
  352. goto out;
  353. }
  354. spin_lock_irqsave(&dev_priv->uncore.lock, irqflags);
  355. WARN_ON(!dev_priv->uncore.forcewake_count);
  356. if (--dev_priv->uncore.forcewake_count == 0) {
  357. dev_priv->uncore.forcewake_count++;
  358. delayed = true;
  359. mod_timer_pinned(&dev_priv->uncore.force_wake_timer,
  360. jiffies + 1);
  361. }
  362. spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags);
  363. out:
  364. if (!delayed)
  365. intel_runtime_pm_put(dev_priv);
  366. }
  367. void assert_force_wake_inactive(struct drm_i915_private *dev_priv)
  368. {
  369. if (!dev_priv->uncore.funcs.force_wake_get)
  370. return;
  371. WARN_ON(dev_priv->uncore.forcewake_count > 0);
  372. }
  373. /* We give fast paths for the really cool registers */
  374. #define NEEDS_FORCE_WAKE(dev_priv, reg) \
  375. ((reg) < 0x40000 && (reg) != FORCEWAKE)
  376. #define FORCEWAKE_VLV_RENDER_RANGE_OFFSET(reg) \
  377. (((reg) >= 0x2000 && (reg) < 0x4000) ||\
  378. ((reg) >= 0x5000 && (reg) < 0x8000) ||\
  379. ((reg) >= 0xB000 && (reg) < 0x12000) ||\
  380. ((reg) >= 0x2E000 && (reg) < 0x30000))
  381. #define FORCEWAKE_VLV_MEDIA_RANGE_OFFSET(reg)\
  382. (((reg) >= 0x12000 && (reg) < 0x14000) ||\
  383. ((reg) >= 0x22000 && (reg) < 0x24000) ||\
  384. ((reg) >= 0x30000 && (reg) < 0x40000))
  385. static void
  386. ilk_dummy_write(struct drm_i915_private *dev_priv)
  387. {
  388. /* WaIssueDummyWriteToWakeupFromRC6:ilk Issue a dummy write to wake up
  389. * the chip from rc6 before touching it for real. MI_MODE is masked,
  390. * hence harmless to write 0 into. */
  391. __raw_i915_write32(dev_priv, MI_MODE, 0);
  392. }
  393. static void
  394. hsw_unclaimed_reg_clear(struct drm_i915_private *dev_priv, u32 reg)
  395. {
  396. if (__raw_i915_read32(dev_priv, FPGA_DBG) & FPGA_DBG_RM_NOCLAIM) {
  397. DRM_ERROR("Unknown unclaimed register before writing to %x\n",
  398. reg);
  399. __raw_i915_write32(dev_priv, FPGA_DBG, FPGA_DBG_RM_NOCLAIM);
  400. }
  401. }
  402. static void
  403. hsw_unclaimed_reg_check(struct drm_i915_private *dev_priv, u32 reg)
  404. {
  405. if (__raw_i915_read32(dev_priv, FPGA_DBG) & FPGA_DBG_RM_NOCLAIM) {
  406. DRM_ERROR("Unclaimed write to %x\n", reg);
  407. __raw_i915_write32(dev_priv, FPGA_DBG, FPGA_DBG_RM_NOCLAIM);
  408. }
  409. }
  410. #define REG_READ_HEADER(x) \
  411. unsigned long irqflags; \
  412. u##x val = 0; \
  413. assert_device_not_suspended(dev_priv); \
  414. spin_lock_irqsave(&dev_priv->uncore.lock, irqflags)
  415. #define REG_READ_FOOTER \
  416. spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags); \
  417. trace_i915_reg_rw(false, reg, val, sizeof(val), trace); \
  418. return val
  419. #define __gen4_read(x) \
  420. static u##x \
  421. gen4_read##x(struct drm_i915_private *dev_priv, off_t reg, bool trace) { \
  422. REG_READ_HEADER(x); \
  423. val = __raw_i915_read##x(dev_priv, reg); \
  424. REG_READ_FOOTER; \
  425. }
  426. #define __gen5_read(x) \
  427. static u##x \
  428. gen5_read##x(struct drm_i915_private *dev_priv, off_t reg, bool trace) { \
  429. REG_READ_HEADER(x); \
  430. ilk_dummy_write(dev_priv); \
  431. val = __raw_i915_read##x(dev_priv, reg); \
  432. REG_READ_FOOTER; \
  433. }
  434. #define __gen6_read(x) \
  435. static u##x \
  436. gen6_read##x(struct drm_i915_private *dev_priv, off_t reg, bool trace) { \
  437. REG_READ_HEADER(x); \
  438. if (dev_priv->uncore.forcewake_count == 0 && \
  439. NEEDS_FORCE_WAKE((dev_priv), (reg))) { \
  440. dev_priv->uncore.funcs.force_wake_get(dev_priv, \
  441. FORCEWAKE_ALL); \
  442. val = __raw_i915_read##x(dev_priv, reg); \
  443. dev_priv->uncore.funcs.force_wake_put(dev_priv, \
  444. FORCEWAKE_ALL); \
  445. } else { \
  446. val = __raw_i915_read##x(dev_priv, reg); \
  447. } \
  448. REG_READ_FOOTER; \
  449. }
  450. #define __vlv_read(x) \
  451. static u##x \
  452. vlv_read##x(struct drm_i915_private *dev_priv, off_t reg, bool trace) { \
  453. unsigned fwengine = 0; \
  454. REG_READ_HEADER(x); \
  455. if (FORCEWAKE_VLV_RENDER_RANGE_OFFSET(reg)) { \
  456. if (dev_priv->uncore.fw_rendercount == 0) \
  457. fwengine = FORCEWAKE_RENDER; \
  458. } else if (FORCEWAKE_VLV_MEDIA_RANGE_OFFSET(reg)) { \
  459. if (dev_priv->uncore.fw_mediacount == 0) \
  460. fwengine = FORCEWAKE_MEDIA; \
  461. } \
  462. if (fwengine) \
  463. dev_priv->uncore.funcs.force_wake_get(dev_priv, fwengine); \
  464. val = __raw_i915_read##x(dev_priv, reg); \
  465. if (fwengine) \
  466. dev_priv->uncore.funcs.force_wake_put(dev_priv, fwengine); \
  467. REG_READ_FOOTER; \
  468. }
  469. __vlv_read(8)
  470. __vlv_read(16)
  471. __vlv_read(32)
  472. __vlv_read(64)
  473. __gen6_read(8)
  474. __gen6_read(16)
  475. __gen6_read(32)
  476. __gen6_read(64)
  477. __gen5_read(8)
  478. __gen5_read(16)
  479. __gen5_read(32)
  480. __gen5_read(64)
  481. __gen4_read(8)
  482. __gen4_read(16)
  483. __gen4_read(32)
  484. __gen4_read(64)
  485. #undef __vlv_read
  486. #undef __gen6_read
  487. #undef __gen5_read
  488. #undef __gen4_read
  489. #undef REG_READ_FOOTER
  490. #undef REG_READ_HEADER
  491. #define REG_WRITE_HEADER \
  492. unsigned long irqflags; \
  493. trace_i915_reg_rw(true, reg, val, sizeof(val), trace); \
  494. assert_device_not_suspended(dev_priv); \
  495. spin_lock_irqsave(&dev_priv->uncore.lock, irqflags)
  496. #define REG_WRITE_FOOTER \
  497. spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags)
  498. #define __gen4_write(x) \
  499. static void \
  500. gen4_write##x(struct drm_i915_private *dev_priv, off_t reg, u##x val, bool trace) { \
  501. REG_WRITE_HEADER; \
  502. __raw_i915_write##x(dev_priv, reg, val); \
  503. REG_WRITE_FOOTER; \
  504. }
  505. #define __gen5_write(x) \
  506. static void \
  507. gen5_write##x(struct drm_i915_private *dev_priv, off_t reg, u##x val, bool trace) { \
  508. REG_WRITE_HEADER; \
  509. ilk_dummy_write(dev_priv); \
  510. __raw_i915_write##x(dev_priv, reg, val); \
  511. REG_WRITE_FOOTER; \
  512. }
  513. #define __gen6_write(x) \
  514. static void \
  515. gen6_write##x(struct drm_i915_private *dev_priv, off_t reg, u##x val, bool trace) { \
  516. u32 __fifo_ret = 0; \
  517. REG_WRITE_HEADER; \
  518. if (NEEDS_FORCE_WAKE((dev_priv), (reg))) { \
  519. __fifo_ret = __gen6_gt_wait_for_fifo(dev_priv); \
  520. } \
  521. __raw_i915_write##x(dev_priv, reg, val); \
  522. if (unlikely(__fifo_ret)) { \
  523. gen6_gt_check_fifodbg(dev_priv); \
  524. } \
  525. REG_WRITE_FOOTER; \
  526. }
  527. #define __hsw_write(x) \
  528. static void \
  529. hsw_write##x(struct drm_i915_private *dev_priv, off_t reg, u##x val, bool trace) { \
  530. u32 __fifo_ret = 0; \
  531. REG_WRITE_HEADER; \
  532. if (NEEDS_FORCE_WAKE((dev_priv), (reg))) { \
  533. __fifo_ret = __gen6_gt_wait_for_fifo(dev_priv); \
  534. } \
  535. hsw_unclaimed_reg_clear(dev_priv, reg); \
  536. __raw_i915_write##x(dev_priv, reg, val); \
  537. if (unlikely(__fifo_ret)) { \
  538. gen6_gt_check_fifodbg(dev_priv); \
  539. } \
  540. hsw_unclaimed_reg_check(dev_priv, reg); \
  541. REG_WRITE_FOOTER; \
  542. }
  543. static const u32 gen8_shadowed_regs[] = {
  544. FORCEWAKE_MT,
  545. GEN6_RPNSWREQ,
  546. GEN6_RC_VIDEO_FREQ,
  547. RING_TAIL(RENDER_RING_BASE),
  548. RING_TAIL(GEN6_BSD_RING_BASE),
  549. RING_TAIL(VEBOX_RING_BASE),
  550. RING_TAIL(BLT_RING_BASE),
  551. /* TODO: Other registers are not yet used */
  552. };
  553. static bool is_gen8_shadowed(struct drm_i915_private *dev_priv, u32 reg)
  554. {
  555. int i;
  556. for (i = 0; i < ARRAY_SIZE(gen8_shadowed_regs); i++)
  557. if (reg == gen8_shadowed_regs[i])
  558. return true;
  559. return false;
  560. }
  561. #define __gen8_write(x) \
  562. static void \
  563. gen8_write##x(struct drm_i915_private *dev_priv, off_t reg, u##x val, bool trace) { \
  564. REG_WRITE_HEADER; \
  565. if (reg < 0x40000 && !is_gen8_shadowed(dev_priv, reg)) { \
  566. if (dev_priv->uncore.forcewake_count == 0) \
  567. dev_priv->uncore.funcs.force_wake_get(dev_priv, \
  568. FORCEWAKE_ALL); \
  569. __raw_i915_write##x(dev_priv, reg, val); \
  570. if (dev_priv->uncore.forcewake_count == 0) \
  571. dev_priv->uncore.funcs.force_wake_put(dev_priv, \
  572. FORCEWAKE_ALL); \
  573. } else { \
  574. __raw_i915_write##x(dev_priv, reg, val); \
  575. } \
  576. REG_WRITE_FOOTER; \
  577. }
  578. __gen8_write(8)
  579. __gen8_write(16)
  580. __gen8_write(32)
  581. __gen8_write(64)
  582. __hsw_write(8)
  583. __hsw_write(16)
  584. __hsw_write(32)
  585. __hsw_write(64)
  586. __gen6_write(8)
  587. __gen6_write(16)
  588. __gen6_write(32)
  589. __gen6_write(64)
  590. __gen5_write(8)
  591. __gen5_write(16)
  592. __gen5_write(32)
  593. __gen5_write(64)
  594. __gen4_write(8)
  595. __gen4_write(16)
  596. __gen4_write(32)
  597. __gen4_write(64)
  598. #undef __gen8_write
  599. #undef __hsw_write
  600. #undef __gen6_write
  601. #undef __gen5_write
  602. #undef __gen4_write
  603. #undef REG_WRITE_FOOTER
  604. #undef REG_WRITE_HEADER
  605. void intel_uncore_init(struct drm_device *dev)
  606. {
  607. struct drm_i915_private *dev_priv = dev->dev_private;
  608. setup_timer(&dev_priv->uncore.force_wake_timer,
  609. gen6_force_wake_timer, (unsigned long)dev_priv);
  610. intel_uncore_early_sanitize(dev);
  611. if (IS_VALLEYVIEW(dev)) {
  612. dev_priv->uncore.funcs.force_wake_get = __vlv_force_wake_get;
  613. dev_priv->uncore.funcs.force_wake_put = __vlv_force_wake_put;
  614. } else if (IS_HASWELL(dev) || IS_GEN8(dev)) {
  615. dev_priv->uncore.funcs.force_wake_get = __gen7_gt_force_wake_mt_get;
  616. dev_priv->uncore.funcs.force_wake_put = __gen7_gt_force_wake_mt_put;
  617. } else if (IS_IVYBRIDGE(dev)) {
  618. u32 ecobus;
  619. /* IVB configs may use multi-threaded forcewake */
  620. /* A small trick here - if the bios hasn't configured
  621. * MT forcewake, and if the device is in RC6, then
  622. * force_wake_mt_get will not wake the device and the
  623. * ECOBUS read will return zero. Which will be
  624. * (correctly) interpreted by the test below as MT
  625. * forcewake being disabled.
  626. */
  627. mutex_lock(&dev->struct_mutex);
  628. __gen7_gt_force_wake_mt_get(dev_priv, FORCEWAKE_ALL);
  629. ecobus = __raw_i915_read32(dev_priv, ECOBUS);
  630. __gen7_gt_force_wake_mt_put(dev_priv, FORCEWAKE_ALL);
  631. mutex_unlock(&dev->struct_mutex);
  632. if (ecobus & FORCEWAKE_MT_ENABLE) {
  633. dev_priv->uncore.funcs.force_wake_get =
  634. __gen7_gt_force_wake_mt_get;
  635. dev_priv->uncore.funcs.force_wake_put =
  636. __gen7_gt_force_wake_mt_put;
  637. } else {
  638. DRM_INFO("No MT forcewake available on Ivybridge, this can result in issues\n");
  639. DRM_INFO("when using vblank-synced partial screen updates.\n");
  640. dev_priv->uncore.funcs.force_wake_get =
  641. __gen6_gt_force_wake_get;
  642. dev_priv->uncore.funcs.force_wake_put =
  643. __gen6_gt_force_wake_put;
  644. }
  645. } else if (IS_GEN6(dev)) {
  646. dev_priv->uncore.funcs.force_wake_get =
  647. __gen6_gt_force_wake_get;
  648. dev_priv->uncore.funcs.force_wake_put =
  649. __gen6_gt_force_wake_put;
  650. }
  651. switch (INTEL_INFO(dev)->gen) {
  652. default:
  653. dev_priv->uncore.funcs.mmio_writeb = gen8_write8;
  654. dev_priv->uncore.funcs.mmio_writew = gen8_write16;
  655. dev_priv->uncore.funcs.mmio_writel = gen8_write32;
  656. dev_priv->uncore.funcs.mmio_writeq = gen8_write64;
  657. dev_priv->uncore.funcs.mmio_readb = gen6_read8;
  658. dev_priv->uncore.funcs.mmio_readw = gen6_read16;
  659. dev_priv->uncore.funcs.mmio_readl = gen6_read32;
  660. dev_priv->uncore.funcs.mmio_readq = gen6_read64;
  661. break;
  662. case 7:
  663. case 6:
  664. if (IS_HASWELL(dev)) {
  665. dev_priv->uncore.funcs.mmio_writeb = hsw_write8;
  666. dev_priv->uncore.funcs.mmio_writew = hsw_write16;
  667. dev_priv->uncore.funcs.mmio_writel = hsw_write32;
  668. dev_priv->uncore.funcs.mmio_writeq = hsw_write64;
  669. } else {
  670. dev_priv->uncore.funcs.mmio_writeb = gen6_write8;
  671. dev_priv->uncore.funcs.mmio_writew = gen6_write16;
  672. dev_priv->uncore.funcs.mmio_writel = gen6_write32;
  673. dev_priv->uncore.funcs.mmio_writeq = gen6_write64;
  674. }
  675. if (IS_VALLEYVIEW(dev)) {
  676. dev_priv->uncore.funcs.mmio_readb = vlv_read8;
  677. dev_priv->uncore.funcs.mmio_readw = vlv_read16;
  678. dev_priv->uncore.funcs.mmio_readl = vlv_read32;
  679. dev_priv->uncore.funcs.mmio_readq = vlv_read64;
  680. } else {
  681. dev_priv->uncore.funcs.mmio_readb = gen6_read8;
  682. dev_priv->uncore.funcs.mmio_readw = gen6_read16;
  683. dev_priv->uncore.funcs.mmio_readl = gen6_read32;
  684. dev_priv->uncore.funcs.mmio_readq = gen6_read64;
  685. }
  686. break;
  687. case 5:
  688. dev_priv->uncore.funcs.mmio_writeb = gen5_write8;
  689. dev_priv->uncore.funcs.mmio_writew = gen5_write16;
  690. dev_priv->uncore.funcs.mmio_writel = gen5_write32;
  691. dev_priv->uncore.funcs.mmio_writeq = gen5_write64;
  692. dev_priv->uncore.funcs.mmio_readb = gen5_read8;
  693. dev_priv->uncore.funcs.mmio_readw = gen5_read16;
  694. dev_priv->uncore.funcs.mmio_readl = gen5_read32;
  695. dev_priv->uncore.funcs.mmio_readq = gen5_read64;
  696. break;
  697. case 4:
  698. case 3:
  699. case 2:
  700. dev_priv->uncore.funcs.mmio_writeb = gen4_write8;
  701. dev_priv->uncore.funcs.mmio_writew = gen4_write16;
  702. dev_priv->uncore.funcs.mmio_writel = gen4_write32;
  703. dev_priv->uncore.funcs.mmio_writeq = gen4_write64;
  704. dev_priv->uncore.funcs.mmio_readb = gen4_read8;
  705. dev_priv->uncore.funcs.mmio_readw = gen4_read16;
  706. dev_priv->uncore.funcs.mmio_readl = gen4_read32;
  707. dev_priv->uncore.funcs.mmio_readq = gen4_read64;
  708. break;
  709. }
  710. }
  711. void intel_uncore_fini(struct drm_device *dev)
  712. {
  713. /* Paranoia: make sure we have disabled everything before we exit. */
  714. intel_uncore_sanitize(dev);
  715. intel_uncore_forcewake_reset(dev, false);
  716. }
  717. #define GEN_RANGE(l, h) GENMASK(h, l)
  718. static const struct register_whitelist {
  719. uint64_t offset;
  720. uint32_t size;
  721. /* supported gens, 0x10 for 4, 0x30 for 4 and 5, etc. */
  722. uint32_t gen_bitmask;
  723. } whitelist[] = {
  724. { RING_TIMESTAMP(RENDER_RING_BASE), 8, GEN_RANGE(4, 8) },
  725. };
  726. int i915_reg_read_ioctl(struct drm_device *dev,
  727. void *data, struct drm_file *file)
  728. {
  729. struct drm_i915_private *dev_priv = dev->dev_private;
  730. struct drm_i915_reg_read *reg = data;
  731. struct register_whitelist const *entry = whitelist;
  732. int i, ret = 0;
  733. for (i = 0; i < ARRAY_SIZE(whitelist); i++, entry++) {
  734. if (entry->offset == reg->offset &&
  735. (1 << INTEL_INFO(dev)->gen & entry->gen_bitmask))
  736. break;
  737. }
  738. if (i == ARRAY_SIZE(whitelist))
  739. return -EINVAL;
  740. intel_runtime_pm_get(dev_priv);
  741. switch (entry->size) {
  742. case 8:
  743. reg->val = I915_READ64(reg->offset);
  744. break;
  745. case 4:
  746. reg->val = I915_READ(reg->offset);
  747. break;
  748. case 2:
  749. reg->val = I915_READ16(reg->offset);
  750. break;
  751. case 1:
  752. reg->val = I915_READ8(reg->offset);
  753. break;
  754. default:
  755. WARN_ON(1);
  756. ret = -EINVAL;
  757. goto out;
  758. }
  759. out:
  760. intel_runtime_pm_put(dev_priv);
  761. return ret;
  762. }
  763. int i915_get_reset_stats_ioctl(struct drm_device *dev,
  764. void *data, struct drm_file *file)
  765. {
  766. struct drm_i915_private *dev_priv = dev->dev_private;
  767. struct drm_i915_reset_stats *args = data;
  768. struct i915_ctx_hang_stats *hs;
  769. struct intel_context *ctx;
  770. int ret;
  771. if (args->flags || args->pad)
  772. return -EINVAL;
  773. if (args->ctx_id == DEFAULT_CONTEXT_ID && !capable(CAP_SYS_ADMIN))
  774. return -EPERM;
  775. ret = mutex_lock_interruptible(&dev->struct_mutex);
  776. if (ret)
  777. return ret;
  778. ctx = i915_gem_context_get(file->driver_priv, args->ctx_id);
  779. if (IS_ERR(ctx)) {
  780. mutex_unlock(&dev->struct_mutex);
  781. return PTR_ERR(ctx);
  782. }
  783. hs = &ctx->hang_stats;
  784. if (capable(CAP_SYS_ADMIN))
  785. args->reset_count = i915_reset_count(&dev_priv->gpu_error);
  786. else
  787. args->reset_count = 0;
  788. args->batch_active = hs->batch_active;
  789. args->batch_pending = hs->batch_pending;
  790. mutex_unlock(&dev->struct_mutex);
  791. return 0;
  792. }
  793. static int i965_reset_complete(struct drm_device *dev)
  794. {
  795. u8 gdrst;
  796. pci_read_config_byte(dev->pdev, I965_GDRST, &gdrst);
  797. return (gdrst & GRDOM_RESET_ENABLE) == 0;
  798. }
  799. static int i965_do_reset(struct drm_device *dev)
  800. {
  801. int ret;
  802. /* FIXME: i965g/gm need a display save/restore for gpu reset. */
  803. return -ENODEV;
  804. /*
  805. * Set the domains we want to reset (GRDOM/bits 2 and 3) as
  806. * well as the reset bit (GR/bit 0). Setting the GR bit
  807. * triggers the reset; when done, the hardware will clear it.
  808. */
  809. pci_write_config_byte(dev->pdev, I965_GDRST,
  810. GRDOM_RENDER | GRDOM_RESET_ENABLE);
  811. ret = wait_for(i965_reset_complete(dev), 500);
  812. if (ret)
  813. return ret;
  814. pci_write_config_byte(dev->pdev, I965_GDRST,
  815. GRDOM_MEDIA | GRDOM_RESET_ENABLE);
  816. ret = wait_for(i965_reset_complete(dev), 500);
  817. if (ret)
  818. return ret;
  819. pci_write_config_byte(dev->pdev, I965_GDRST, 0);
  820. return 0;
  821. }
  822. static int g4x_do_reset(struct drm_device *dev)
  823. {
  824. struct drm_i915_private *dev_priv = dev->dev_private;
  825. int ret;
  826. pci_write_config_byte(dev->pdev, I965_GDRST,
  827. GRDOM_RENDER | GRDOM_RESET_ENABLE);
  828. ret = wait_for(i965_reset_complete(dev), 500);
  829. if (ret)
  830. return ret;
  831. /* WaVcpClkGateDisableForMediaReset:ctg,elk */
  832. I915_WRITE(VDECCLK_GATE_D, I915_READ(VDECCLK_GATE_D) | VCP_UNIT_CLOCK_GATE_DISABLE);
  833. POSTING_READ(VDECCLK_GATE_D);
  834. pci_write_config_byte(dev->pdev, I965_GDRST,
  835. GRDOM_MEDIA | GRDOM_RESET_ENABLE);
  836. ret = wait_for(i965_reset_complete(dev), 500);
  837. if (ret)
  838. return ret;
  839. /* WaVcpClkGateDisableForMediaReset:ctg,elk */
  840. I915_WRITE(VDECCLK_GATE_D, I915_READ(VDECCLK_GATE_D) & ~VCP_UNIT_CLOCK_GATE_DISABLE);
  841. POSTING_READ(VDECCLK_GATE_D);
  842. pci_write_config_byte(dev->pdev, I965_GDRST, 0);
  843. return 0;
  844. }
  845. static int ironlake_do_reset(struct drm_device *dev)
  846. {
  847. struct drm_i915_private *dev_priv = dev->dev_private;
  848. int ret;
  849. I915_WRITE(MCHBAR_MIRROR_BASE + ILK_GDSR,
  850. ILK_GRDOM_RENDER | ILK_GRDOM_RESET_ENABLE);
  851. ret = wait_for((I915_READ(MCHBAR_MIRROR_BASE + ILK_GDSR) &
  852. ILK_GRDOM_RESET_ENABLE) == 0, 500);
  853. if (ret)
  854. return ret;
  855. I915_WRITE(MCHBAR_MIRROR_BASE + ILK_GDSR,
  856. ILK_GRDOM_MEDIA | ILK_GRDOM_RESET_ENABLE);
  857. ret = wait_for((I915_READ(MCHBAR_MIRROR_BASE + ILK_GDSR) &
  858. ILK_GRDOM_RESET_ENABLE) == 0, 500);
  859. if (ret)
  860. return ret;
  861. I915_WRITE(MCHBAR_MIRROR_BASE + ILK_GDSR, 0);
  862. return 0;
  863. }
  864. static int gen6_do_reset(struct drm_device *dev)
  865. {
  866. struct drm_i915_private *dev_priv = dev->dev_private;
  867. int ret;
  868. /* Reset the chip */
  869. /* GEN6_GDRST is not in the gt power well, no need to check
  870. * for fifo space for the write or forcewake the chip for
  871. * the read
  872. */
  873. __raw_i915_write32(dev_priv, GEN6_GDRST, GEN6_GRDOM_FULL);
  874. /* Spin waiting for the device to ack the reset request */
  875. ret = wait_for((__raw_i915_read32(dev_priv, GEN6_GDRST) & GEN6_GRDOM_FULL) == 0, 500);
  876. intel_uncore_forcewake_reset(dev, true);
  877. return ret;
  878. }
  879. int intel_gpu_reset(struct drm_device *dev)
  880. {
  881. switch (INTEL_INFO(dev)->gen) {
  882. case 8:
  883. case 7:
  884. case 6: return gen6_do_reset(dev);
  885. case 5: return ironlake_do_reset(dev);
  886. case 4:
  887. if (IS_G4X(dev))
  888. return g4x_do_reset(dev);
  889. else
  890. return i965_do_reset(dev);
  891. default: return -ENODEV;
  892. }
  893. }
  894. void intel_uncore_check_errors(struct drm_device *dev)
  895. {
  896. struct drm_i915_private *dev_priv = dev->dev_private;
  897. if (HAS_FPGA_DBG_UNCLAIMED(dev) &&
  898. (__raw_i915_read32(dev_priv, FPGA_DBG) & FPGA_DBG_RM_NOCLAIM)) {
  899. DRM_ERROR("Unclaimed register before interrupt\n");
  900. __raw_i915_write32(dev_priv, FPGA_DBG, FPGA_DBG_RM_NOCLAIM);
  901. }
  902. }