intel_ringbuffer.c 25 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039
  1. /*
  2. * Copyright © 2008-2010 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. * Authors:
  24. * Eric Anholt <eric@anholt.net>
  25. * Zou Nan hai <nanhai.zou@intel.com>
  26. * Xiang Hai hao<haihao.xiang@intel.com>
  27. *
  28. */
  29. #include "drmP.h"
  30. #include "drm.h"
  31. #include "i915_drv.h"
  32. #include "i915_drm.h"
  33. #include "i915_trace.h"
  34. #include "intel_drv.h"
  35. static u32 i915_gem_get_seqno(struct drm_device *dev)
  36. {
  37. drm_i915_private_t *dev_priv = dev->dev_private;
  38. u32 seqno;
  39. seqno = dev_priv->next_seqno;
  40. /* reserve 0 for non-seqno */
  41. if (++dev_priv->next_seqno == 0)
  42. dev_priv->next_seqno = 1;
  43. return seqno;
  44. }
  45. static void
  46. render_ring_flush(struct intel_ring_buffer *ring,
  47. u32 invalidate_domains,
  48. u32 flush_domains)
  49. {
  50. struct drm_device *dev = ring->dev;
  51. drm_i915_private_t *dev_priv = dev->dev_private;
  52. u32 cmd;
  53. #if WATCH_EXEC
  54. DRM_INFO("%s: invalidate %08x flush %08x\n", __func__,
  55. invalidate_domains, flush_domains);
  56. #endif
  57. trace_i915_gem_request_flush(dev, dev_priv->next_seqno,
  58. invalidate_domains, flush_domains);
  59. if ((invalidate_domains | flush_domains) & I915_GEM_GPU_DOMAINS) {
  60. /*
  61. * read/write caches:
  62. *
  63. * I915_GEM_DOMAIN_RENDER is always invalidated, but is
  64. * only flushed if MI_NO_WRITE_FLUSH is unset. On 965, it is
  65. * also flushed at 2d versus 3d pipeline switches.
  66. *
  67. * read-only caches:
  68. *
  69. * I915_GEM_DOMAIN_SAMPLER is flushed on pre-965 if
  70. * MI_READ_FLUSH is set, and is always flushed on 965.
  71. *
  72. * I915_GEM_DOMAIN_COMMAND may not exist?
  73. *
  74. * I915_GEM_DOMAIN_INSTRUCTION, which exists on 965, is
  75. * invalidated when MI_EXE_FLUSH is set.
  76. *
  77. * I915_GEM_DOMAIN_VERTEX, which exists on 965, is
  78. * invalidated with every MI_FLUSH.
  79. *
  80. * TLBs:
  81. *
  82. * On 965, TLBs associated with I915_GEM_DOMAIN_COMMAND
  83. * and I915_GEM_DOMAIN_CPU in are invalidated at PTE write and
  84. * I915_GEM_DOMAIN_RENDER and I915_GEM_DOMAIN_SAMPLER
  85. * are flushed at any MI_FLUSH.
  86. */
  87. cmd = MI_FLUSH | MI_NO_WRITE_FLUSH;
  88. if ((invalidate_domains|flush_domains) &
  89. I915_GEM_DOMAIN_RENDER)
  90. cmd &= ~MI_NO_WRITE_FLUSH;
  91. if (INTEL_INFO(dev)->gen < 4) {
  92. /*
  93. * On the 965, the sampler cache always gets flushed
  94. * and this bit is reserved.
  95. */
  96. if (invalidate_domains & I915_GEM_DOMAIN_SAMPLER)
  97. cmd |= MI_READ_FLUSH;
  98. }
  99. if (invalidate_domains & I915_GEM_DOMAIN_INSTRUCTION)
  100. cmd |= MI_EXE_FLUSH;
  101. if (invalidate_domains & I915_GEM_DOMAIN_COMMAND &&
  102. (IS_G4X(dev) || IS_GEN5(dev)))
  103. cmd |= MI_INVALIDATE_ISP;
  104. #if WATCH_EXEC
  105. DRM_INFO("%s: queue flush %08x to ring\n", __func__, cmd);
  106. #endif
  107. if (intel_ring_begin(ring, 2) == 0) {
  108. intel_ring_emit(ring, cmd);
  109. intel_ring_emit(ring, MI_NOOP);
  110. intel_ring_advance(ring);
  111. }
  112. }
  113. }
  114. static void ring_write_tail(struct intel_ring_buffer *ring,
  115. u32 value)
  116. {
  117. drm_i915_private_t *dev_priv = ring->dev->dev_private;
  118. I915_WRITE_TAIL(ring, value);
  119. }
  120. u32 intel_ring_get_active_head(struct intel_ring_buffer *ring)
  121. {
  122. drm_i915_private_t *dev_priv = ring->dev->dev_private;
  123. u32 acthd_reg = INTEL_INFO(ring->dev)->gen >= 4 ?
  124. RING_ACTHD(ring->mmio_base) : ACTHD;
  125. return I915_READ(acthd_reg);
  126. }
  127. static int init_ring_common(struct intel_ring_buffer *ring)
  128. {
  129. drm_i915_private_t *dev_priv = ring->dev->dev_private;
  130. struct drm_i915_gem_object *obj = ring->obj;
  131. u32 head;
  132. /* Stop the ring if it's running. */
  133. I915_WRITE_CTL(ring, 0);
  134. I915_WRITE_HEAD(ring, 0);
  135. ring->write_tail(ring, 0);
  136. /* Initialize the ring. */
  137. I915_WRITE_START(ring, obj->gtt_offset);
  138. head = I915_READ_HEAD(ring) & HEAD_ADDR;
  139. /* G45 ring initialization fails to reset head to zero */
  140. if (head != 0) {
  141. DRM_ERROR("%s head not reset to zero "
  142. "ctl %08x head %08x tail %08x start %08x\n",
  143. ring->name,
  144. I915_READ_CTL(ring),
  145. I915_READ_HEAD(ring),
  146. I915_READ_TAIL(ring),
  147. I915_READ_START(ring));
  148. I915_WRITE_HEAD(ring, 0);
  149. DRM_ERROR("%s head forced to zero "
  150. "ctl %08x head %08x tail %08x start %08x\n",
  151. ring->name,
  152. I915_READ_CTL(ring),
  153. I915_READ_HEAD(ring),
  154. I915_READ_TAIL(ring),
  155. I915_READ_START(ring));
  156. }
  157. I915_WRITE_CTL(ring,
  158. ((ring->size - PAGE_SIZE) & RING_NR_PAGES)
  159. | RING_REPORT_64K | RING_VALID);
  160. /* If the head is still not zero, the ring is dead */
  161. if ((I915_READ_CTL(ring) & RING_VALID) == 0 ||
  162. I915_READ_START(ring) != obj->gtt_offset ||
  163. (I915_READ_HEAD(ring) & HEAD_ADDR) != 0) {
  164. DRM_ERROR("%s initialization failed "
  165. "ctl %08x head %08x tail %08x start %08x\n",
  166. ring->name,
  167. I915_READ_CTL(ring),
  168. I915_READ_HEAD(ring),
  169. I915_READ_TAIL(ring),
  170. I915_READ_START(ring));
  171. return -EIO;
  172. }
  173. if (!drm_core_check_feature(ring->dev, DRIVER_MODESET))
  174. i915_kernel_lost_context(ring->dev);
  175. else {
  176. ring->head = I915_READ_HEAD(ring) & HEAD_ADDR;
  177. ring->tail = I915_READ_TAIL(ring) & TAIL_ADDR;
  178. ring->space = ring->head - (ring->tail + 8);
  179. if (ring->space < 0)
  180. ring->space += ring->size;
  181. }
  182. return 0;
  183. }
  184. static int init_render_ring(struct intel_ring_buffer *ring)
  185. {
  186. struct drm_device *dev = ring->dev;
  187. struct drm_i915_private *dev_priv = dev->dev_private;
  188. int ret = init_ring_common(ring);
  189. if (INTEL_INFO(dev)->gen > 3) {
  190. int mode = VS_TIMER_DISPATCH << 16 | VS_TIMER_DISPATCH;
  191. if (IS_GEN6(dev))
  192. mode |= MI_FLUSH_ENABLE << 16 | MI_FLUSH_ENABLE;
  193. I915_WRITE(MI_MODE, mode);
  194. }
  195. return ret;
  196. }
  197. static void
  198. update_semaphore(struct intel_ring_buffer *ring, int i, u32 seqno)
  199. {
  200. struct drm_device *dev = ring->dev;
  201. struct drm_i915_private *dev_priv = dev->dev_private;
  202. int id;
  203. /*
  204. * cs -> 1 = vcs, 0 = bcs
  205. * vcs -> 1 = bcs, 0 = cs,
  206. * bcs -> 1 = cs, 0 = vcs.
  207. */
  208. id = ring - dev_priv->ring;
  209. id += 2 - i;
  210. id %= 3;
  211. intel_ring_emit(ring,
  212. MI_SEMAPHORE_MBOX |
  213. MI_SEMAPHORE_REGISTER |
  214. MI_SEMAPHORE_UPDATE);
  215. intel_ring_emit(ring, seqno);
  216. intel_ring_emit(ring,
  217. RING_SYNC_0(dev_priv->ring[id].mmio_base) + 4*i);
  218. }
  219. static int
  220. gen6_add_request(struct intel_ring_buffer *ring,
  221. u32 *result)
  222. {
  223. u32 seqno;
  224. int ret;
  225. ret = intel_ring_begin(ring, 10);
  226. if (ret)
  227. return ret;
  228. seqno = i915_gem_get_seqno(ring->dev);
  229. update_semaphore(ring, 0, seqno);
  230. update_semaphore(ring, 1, seqno);
  231. intel_ring_emit(ring, MI_STORE_DWORD_INDEX);
  232. intel_ring_emit(ring, I915_GEM_HWS_INDEX << MI_STORE_DWORD_INDEX_SHIFT);
  233. intel_ring_emit(ring, seqno);
  234. intel_ring_emit(ring, MI_USER_INTERRUPT);
  235. intel_ring_advance(ring);
  236. *result = seqno;
  237. return 0;
  238. }
  239. int
  240. intel_ring_sync(struct intel_ring_buffer *ring,
  241. struct intel_ring_buffer *to,
  242. u32 seqno)
  243. {
  244. int ret;
  245. ret = intel_ring_begin(ring, 4);
  246. if (ret)
  247. return ret;
  248. intel_ring_emit(ring,
  249. MI_SEMAPHORE_MBOX |
  250. MI_SEMAPHORE_REGISTER |
  251. intel_ring_sync_index(ring, to) << 17 |
  252. MI_SEMAPHORE_COMPARE);
  253. intel_ring_emit(ring, seqno);
  254. intel_ring_emit(ring, 0);
  255. intel_ring_emit(ring, MI_NOOP);
  256. intel_ring_advance(ring);
  257. return 0;
  258. }
  259. static int
  260. render_ring_add_request(struct intel_ring_buffer *ring,
  261. u32 *result)
  262. {
  263. struct drm_device *dev = ring->dev;
  264. u32 seqno = i915_gem_get_seqno(dev);
  265. int ret;
  266. ret = intel_ring_begin(ring, 4);
  267. if (ret)
  268. return ret;
  269. intel_ring_emit(ring, MI_STORE_DWORD_INDEX);
  270. intel_ring_emit(ring, I915_GEM_HWS_INDEX << MI_STORE_DWORD_INDEX_SHIFT);
  271. intel_ring_emit(ring, seqno);
  272. intel_ring_emit(ring, MI_USER_INTERRUPT);
  273. intel_ring_advance(ring);
  274. *result = seqno;
  275. return 0;
  276. }
  277. static u32
  278. ring_get_seqno(struct intel_ring_buffer *ring)
  279. {
  280. return intel_read_status_page(ring, I915_GEM_HWS_INDEX);
  281. }
  282. static void
  283. render_ring_get_irq(struct intel_ring_buffer *ring)
  284. {
  285. struct drm_device *dev = ring->dev;
  286. if (dev->irq_enabled && ++ring->irq_refcount == 1) {
  287. drm_i915_private_t *dev_priv = dev->dev_private;
  288. unsigned long irqflags;
  289. spin_lock_irqsave(&dev_priv->irq_lock, irqflags);
  290. if (HAS_PCH_SPLIT(dev))
  291. ironlake_enable_graphics_irq(dev_priv,
  292. GT_USER_INTERRUPT);
  293. else
  294. i915_enable_irq(dev_priv, I915_USER_INTERRUPT);
  295. spin_unlock_irqrestore(&dev_priv->irq_lock, irqflags);
  296. }
  297. }
  298. static void
  299. render_ring_put_irq(struct intel_ring_buffer *ring)
  300. {
  301. struct drm_device *dev = ring->dev;
  302. BUG_ON(dev->irq_enabled && ring->irq_refcount == 0);
  303. if (dev->irq_enabled && --ring->irq_refcount == 0) {
  304. drm_i915_private_t *dev_priv = dev->dev_private;
  305. unsigned long irqflags;
  306. spin_lock_irqsave(&dev_priv->irq_lock, irqflags);
  307. if (HAS_PCH_SPLIT(dev))
  308. ironlake_disable_graphics_irq(dev_priv,
  309. GT_USER_INTERRUPT);
  310. else
  311. i915_disable_irq(dev_priv, I915_USER_INTERRUPT);
  312. spin_unlock_irqrestore(&dev_priv->irq_lock, irqflags);
  313. }
  314. }
  315. void intel_ring_setup_status_page(struct intel_ring_buffer *ring)
  316. {
  317. drm_i915_private_t *dev_priv = ring->dev->dev_private;
  318. u32 mmio = IS_GEN6(ring->dev) ?
  319. RING_HWS_PGA_GEN6(ring->mmio_base) :
  320. RING_HWS_PGA(ring->mmio_base);
  321. I915_WRITE(mmio, (u32)ring->status_page.gfx_addr);
  322. POSTING_READ(mmio);
  323. }
  324. static void
  325. bsd_ring_flush(struct intel_ring_buffer *ring,
  326. u32 invalidate_domains,
  327. u32 flush_domains)
  328. {
  329. if ((flush_domains & I915_GEM_DOMAIN_RENDER) == 0)
  330. return;
  331. if (intel_ring_begin(ring, 2) == 0) {
  332. intel_ring_emit(ring, MI_FLUSH);
  333. intel_ring_emit(ring, MI_NOOP);
  334. intel_ring_advance(ring);
  335. }
  336. }
  337. static int
  338. ring_add_request(struct intel_ring_buffer *ring,
  339. u32 *result)
  340. {
  341. u32 seqno;
  342. int ret;
  343. ret = intel_ring_begin(ring, 4);
  344. if (ret)
  345. return ret;
  346. seqno = i915_gem_get_seqno(ring->dev);
  347. intel_ring_emit(ring, MI_STORE_DWORD_INDEX);
  348. intel_ring_emit(ring, I915_GEM_HWS_INDEX << MI_STORE_DWORD_INDEX_SHIFT);
  349. intel_ring_emit(ring, seqno);
  350. intel_ring_emit(ring, MI_USER_INTERRUPT);
  351. intel_ring_advance(ring);
  352. DRM_DEBUG_DRIVER("%s %d\n", ring->name, seqno);
  353. *result = seqno;
  354. return 0;
  355. }
  356. static void
  357. ring_get_irq(struct intel_ring_buffer *ring, u32 flag)
  358. {
  359. struct drm_device *dev = ring->dev;
  360. if (dev->irq_enabled && ++ring->irq_refcount == 1) {
  361. drm_i915_private_t *dev_priv = dev->dev_private;
  362. unsigned long irqflags;
  363. spin_lock_irqsave(&dev_priv->irq_lock, irqflags);
  364. ironlake_enable_graphics_irq(dev_priv, flag);
  365. spin_unlock_irqrestore(&dev_priv->irq_lock, irqflags);
  366. }
  367. }
  368. static void
  369. ring_put_irq(struct intel_ring_buffer *ring, u32 flag)
  370. {
  371. struct drm_device *dev = ring->dev;
  372. if (dev->irq_enabled && --ring->irq_refcount == 0) {
  373. drm_i915_private_t *dev_priv = dev->dev_private;
  374. unsigned long irqflags;
  375. spin_lock_irqsave(&dev_priv->irq_lock, irqflags);
  376. ironlake_disable_graphics_irq(dev_priv, flag);
  377. spin_unlock_irqrestore(&dev_priv->irq_lock, irqflags);
  378. }
  379. }
  380. static void
  381. bsd_ring_get_irq(struct intel_ring_buffer *ring)
  382. {
  383. ring_get_irq(ring, GT_BSD_USER_INTERRUPT);
  384. }
  385. static void
  386. bsd_ring_put_irq(struct intel_ring_buffer *ring)
  387. {
  388. ring_put_irq(ring, GT_BSD_USER_INTERRUPT);
  389. }
  390. static int
  391. ring_dispatch_execbuffer(struct intel_ring_buffer *ring, u32 offset, u32 length)
  392. {
  393. int ret;
  394. ret = intel_ring_begin(ring, 2);
  395. if (ret)
  396. return ret;
  397. intel_ring_emit(ring,
  398. MI_BATCH_BUFFER_START | (2 << 6) |
  399. MI_BATCH_NON_SECURE_I965);
  400. intel_ring_emit(ring, offset);
  401. intel_ring_advance(ring);
  402. return 0;
  403. }
  404. static int
  405. render_ring_dispatch_execbuffer(struct intel_ring_buffer *ring,
  406. u32 offset, u32 len)
  407. {
  408. struct drm_device *dev = ring->dev;
  409. drm_i915_private_t *dev_priv = dev->dev_private;
  410. int ret;
  411. trace_i915_gem_request_submit(dev, dev_priv->next_seqno + 1);
  412. if (IS_I830(dev) || IS_845G(dev)) {
  413. ret = intel_ring_begin(ring, 4);
  414. if (ret)
  415. return ret;
  416. intel_ring_emit(ring, MI_BATCH_BUFFER);
  417. intel_ring_emit(ring, offset | MI_BATCH_NON_SECURE);
  418. intel_ring_emit(ring, offset + len - 8);
  419. intel_ring_emit(ring, 0);
  420. } else {
  421. ret = intel_ring_begin(ring, 2);
  422. if (ret)
  423. return ret;
  424. if (INTEL_INFO(dev)->gen >= 4) {
  425. intel_ring_emit(ring,
  426. MI_BATCH_BUFFER_START | (2 << 6) |
  427. MI_BATCH_NON_SECURE_I965);
  428. intel_ring_emit(ring, offset);
  429. } else {
  430. intel_ring_emit(ring,
  431. MI_BATCH_BUFFER_START | (2 << 6));
  432. intel_ring_emit(ring, offset | MI_BATCH_NON_SECURE);
  433. }
  434. }
  435. intel_ring_advance(ring);
  436. return 0;
  437. }
  438. static void cleanup_status_page(struct intel_ring_buffer *ring)
  439. {
  440. drm_i915_private_t *dev_priv = ring->dev->dev_private;
  441. struct drm_i915_gem_object *obj;
  442. obj = ring->status_page.obj;
  443. if (obj == NULL)
  444. return;
  445. kunmap(obj->pages[0]);
  446. i915_gem_object_unpin(obj);
  447. drm_gem_object_unreference(&obj->base);
  448. ring->status_page.obj = NULL;
  449. memset(&dev_priv->hws_map, 0, sizeof(dev_priv->hws_map));
  450. }
  451. static int init_status_page(struct intel_ring_buffer *ring)
  452. {
  453. struct drm_device *dev = ring->dev;
  454. drm_i915_private_t *dev_priv = dev->dev_private;
  455. struct drm_i915_gem_object *obj;
  456. int ret;
  457. obj = i915_gem_alloc_object(dev, 4096);
  458. if (obj == NULL) {
  459. DRM_ERROR("Failed to allocate status page\n");
  460. ret = -ENOMEM;
  461. goto err;
  462. }
  463. obj->agp_type = AGP_USER_CACHED_MEMORY;
  464. ret = i915_gem_object_pin(obj, 4096, true);
  465. if (ret != 0) {
  466. goto err_unref;
  467. }
  468. ring->status_page.gfx_addr = obj->gtt_offset;
  469. ring->status_page.page_addr = kmap(obj->pages[0]);
  470. if (ring->status_page.page_addr == NULL) {
  471. memset(&dev_priv->hws_map, 0, sizeof(dev_priv->hws_map));
  472. goto err_unpin;
  473. }
  474. ring->status_page.obj = obj;
  475. memset(ring->status_page.page_addr, 0, PAGE_SIZE);
  476. intel_ring_setup_status_page(ring);
  477. DRM_DEBUG_DRIVER("%s hws offset: 0x%08x\n",
  478. ring->name, ring->status_page.gfx_addr);
  479. return 0;
  480. err_unpin:
  481. i915_gem_object_unpin(obj);
  482. err_unref:
  483. drm_gem_object_unreference(&obj->base);
  484. err:
  485. return ret;
  486. }
  487. int intel_init_ring_buffer(struct drm_device *dev,
  488. struct intel_ring_buffer *ring)
  489. {
  490. struct drm_i915_gem_object *obj;
  491. int ret;
  492. ring->dev = dev;
  493. INIT_LIST_HEAD(&ring->active_list);
  494. INIT_LIST_HEAD(&ring->request_list);
  495. INIT_LIST_HEAD(&ring->gpu_write_list);
  496. if (I915_NEED_GFX_HWS(dev)) {
  497. ret = init_status_page(ring);
  498. if (ret)
  499. return ret;
  500. }
  501. obj = i915_gem_alloc_object(dev, ring->size);
  502. if (obj == NULL) {
  503. DRM_ERROR("Failed to allocate ringbuffer\n");
  504. ret = -ENOMEM;
  505. goto err_hws;
  506. }
  507. ring->obj = obj;
  508. ret = i915_gem_object_pin(obj, PAGE_SIZE, true);
  509. if (ret)
  510. goto err_unref;
  511. ring->map.size = ring->size;
  512. ring->map.offset = dev->agp->base + obj->gtt_offset;
  513. ring->map.type = 0;
  514. ring->map.flags = 0;
  515. ring->map.mtrr = 0;
  516. drm_core_ioremap_wc(&ring->map, dev);
  517. if (ring->map.handle == NULL) {
  518. DRM_ERROR("Failed to map ringbuffer.\n");
  519. ret = -EINVAL;
  520. goto err_unpin;
  521. }
  522. ring->virtual_start = ring->map.handle;
  523. ret = ring->init(ring);
  524. if (ret)
  525. goto err_unmap;
  526. return 0;
  527. err_unmap:
  528. drm_core_ioremapfree(&ring->map, dev);
  529. err_unpin:
  530. i915_gem_object_unpin(obj);
  531. err_unref:
  532. drm_gem_object_unreference(&obj->base);
  533. ring->obj = NULL;
  534. err_hws:
  535. cleanup_status_page(ring);
  536. return ret;
  537. }
  538. void intel_cleanup_ring_buffer(struct intel_ring_buffer *ring)
  539. {
  540. struct drm_i915_private *dev_priv;
  541. int ret;
  542. if (ring->obj == NULL)
  543. return;
  544. /* Disable the ring buffer. The ring must be idle at this point */
  545. dev_priv = ring->dev->dev_private;
  546. ret = intel_wait_ring_buffer(ring, ring->size - 8);
  547. I915_WRITE_CTL(ring, 0);
  548. drm_core_ioremapfree(&ring->map, ring->dev);
  549. i915_gem_object_unpin(ring->obj);
  550. drm_gem_object_unreference(&ring->obj->base);
  551. ring->obj = NULL;
  552. if (ring->cleanup)
  553. ring->cleanup(ring);
  554. cleanup_status_page(ring);
  555. }
  556. static int intel_wrap_ring_buffer(struct intel_ring_buffer *ring)
  557. {
  558. unsigned int *virt;
  559. int rem;
  560. rem = ring->size - ring->tail;
  561. if (ring->space < rem) {
  562. int ret = intel_wait_ring_buffer(ring, rem);
  563. if (ret)
  564. return ret;
  565. }
  566. virt = (unsigned int *)(ring->virtual_start + ring->tail);
  567. rem /= 8;
  568. while (rem--) {
  569. *virt++ = MI_NOOP;
  570. *virt++ = MI_NOOP;
  571. }
  572. ring->tail = 0;
  573. ring->space = ring->head - 8;
  574. return 0;
  575. }
  576. int intel_wait_ring_buffer(struct intel_ring_buffer *ring, int n)
  577. {
  578. struct drm_device *dev = ring->dev;
  579. struct drm_i915_private *dev_priv = dev->dev_private;
  580. unsigned long end;
  581. u32 head;
  582. head = intel_read_status_page(ring, 4);
  583. if (head) {
  584. ring->head = head & HEAD_ADDR;
  585. ring->space = ring->head - (ring->tail + 8);
  586. if (ring->space < 0)
  587. ring->space += ring->size;
  588. if (ring->space >= n)
  589. return 0;
  590. }
  591. trace_i915_ring_wait_begin (dev);
  592. end = jiffies + 3 * HZ;
  593. do {
  594. ring->head = I915_READ_HEAD(ring) & HEAD_ADDR;
  595. ring->space = ring->head - (ring->tail + 8);
  596. if (ring->space < 0)
  597. ring->space += ring->size;
  598. if (ring->space >= n) {
  599. trace_i915_ring_wait_end(dev);
  600. return 0;
  601. }
  602. if (dev->primary->master) {
  603. struct drm_i915_master_private *master_priv = dev->primary->master->driver_priv;
  604. if (master_priv->sarea_priv)
  605. master_priv->sarea_priv->perf_boxes |= I915_BOX_WAIT;
  606. }
  607. msleep(1);
  608. if (atomic_read(&dev_priv->mm.wedged))
  609. return -EAGAIN;
  610. } while (!time_after(jiffies, end));
  611. trace_i915_ring_wait_end (dev);
  612. return -EBUSY;
  613. }
  614. int intel_ring_begin(struct intel_ring_buffer *ring,
  615. int num_dwords)
  616. {
  617. int n = 4*num_dwords;
  618. int ret;
  619. if (unlikely(ring->tail + n > ring->size)) {
  620. ret = intel_wrap_ring_buffer(ring);
  621. if (unlikely(ret))
  622. return ret;
  623. }
  624. if (unlikely(ring->space < n)) {
  625. ret = intel_wait_ring_buffer(ring, n);
  626. if (unlikely(ret))
  627. return ret;
  628. }
  629. ring->space -= n;
  630. return 0;
  631. }
  632. void intel_ring_advance(struct intel_ring_buffer *ring)
  633. {
  634. ring->tail &= ring->size - 1;
  635. ring->write_tail(ring, ring->tail);
  636. }
  637. static const struct intel_ring_buffer render_ring = {
  638. .name = "render ring",
  639. .id = RING_RENDER,
  640. .mmio_base = RENDER_RING_BASE,
  641. .size = 32 * PAGE_SIZE,
  642. .init = init_render_ring,
  643. .write_tail = ring_write_tail,
  644. .flush = render_ring_flush,
  645. .add_request = render_ring_add_request,
  646. .get_seqno = ring_get_seqno,
  647. .irq_get = render_ring_get_irq,
  648. .irq_put = render_ring_put_irq,
  649. .dispatch_execbuffer = render_ring_dispatch_execbuffer,
  650. };
  651. /* ring buffer for bit-stream decoder */
  652. static const struct intel_ring_buffer bsd_ring = {
  653. .name = "bsd ring",
  654. .id = RING_BSD,
  655. .mmio_base = BSD_RING_BASE,
  656. .size = 32 * PAGE_SIZE,
  657. .init = init_ring_common,
  658. .write_tail = ring_write_tail,
  659. .flush = bsd_ring_flush,
  660. .add_request = ring_add_request,
  661. .get_seqno = ring_get_seqno,
  662. .irq_get = bsd_ring_get_irq,
  663. .irq_put = bsd_ring_put_irq,
  664. .dispatch_execbuffer = ring_dispatch_execbuffer,
  665. };
  666. static void gen6_bsd_ring_write_tail(struct intel_ring_buffer *ring,
  667. u32 value)
  668. {
  669. drm_i915_private_t *dev_priv = ring->dev->dev_private;
  670. /* Every tail move must follow the sequence below */
  671. I915_WRITE(GEN6_BSD_SLEEP_PSMI_CONTROL,
  672. GEN6_BSD_SLEEP_PSMI_CONTROL_RC_ILDL_MESSAGE_MODIFY_MASK |
  673. GEN6_BSD_SLEEP_PSMI_CONTROL_RC_ILDL_MESSAGE_DISABLE);
  674. I915_WRITE(GEN6_BSD_RNCID, 0x0);
  675. if (wait_for((I915_READ(GEN6_BSD_SLEEP_PSMI_CONTROL) &
  676. GEN6_BSD_SLEEP_PSMI_CONTROL_IDLE_INDICATOR) == 0,
  677. 50))
  678. DRM_ERROR("timed out waiting for IDLE Indicator\n");
  679. I915_WRITE_TAIL(ring, value);
  680. I915_WRITE(GEN6_BSD_SLEEP_PSMI_CONTROL,
  681. GEN6_BSD_SLEEP_PSMI_CONTROL_RC_ILDL_MESSAGE_MODIFY_MASK |
  682. GEN6_BSD_SLEEP_PSMI_CONTROL_RC_ILDL_MESSAGE_ENABLE);
  683. }
  684. static void gen6_ring_flush(struct intel_ring_buffer *ring,
  685. u32 invalidate_domains,
  686. u32 flush_domains)
  687. {
  688. if ((flush_domains & I915_GEM_DOMAIN_RENDER) == 0)
  689. return;
  690. if (intel_ring_begin(ring, 4) == 0) {
  691. intel_ring_emit(ring, MI_FLUSH_DW);
  692. intel_ring_emit(ring, 0);
  693. intel_ring_emit(ring, 0);
  694. intel_ring_emit(ring, 0);
  695. intel_ring_advance(ring);
  696. }
  697. }
  698. static int
  699. gen6_ring_dispatch_execbuffer(struct intel_ring_buffer *ring,
  700. u32 offset, u32 len)
  701. {
  702. int ret;
  703. ret = intel_ring_begin(ring, 2);
  704. if (ret)
  705. return ret;
  706. intel_ring_emit(ring, MI_BATCH_BUFFER_START | MI_BATCH_NON_SECURE_I965);
  707. /* bit0-7 is the length on GEN6+ */
  708. intel_ring_emit(ring, offset);
  709. intel_ring_advance(ring);
  710. return 0;
  711. }
  712. static void
  713. gen6_bsd_ring_get_irq(struct intel_ring_buffer *ring)
  714. {
  715. ring_get_irq(ring, GT_GEN6_BSD_USER_INTERRUPT);
  716. }
  717. static void
  718. gen6_bsd_ring_put_irq(struct intel_ring_buffer *ring)
  719. {
  720. ring_put_irq(ring, GT_GEN6_BSD_USER_INTERRUPT);
  721. }
  722. /* ring buffer for Video Codec for Gen6+ */
  723. static const struct intel_ring_buffer gen6_bsd_ring = {
  724. .name = "gen6 bsd ring",
  725. .id = RING_BSD,
  726. .mmio_base = GEN6_BSD_RING_BASE,
  727. .size = 32 * PAGE_SIZE,
  728. .init = init_ring_common,
  729. .write_tail = gen6_bsd_ring_write_tail,
  730. .flush = gen6_ring_flush,
  731. .add_request = gen6_add_request,
  732. .get_seqno = ring_get_seqno,
  733. .irq_get = gen6_bsd_ring_get_irq,
  734. .irq_put = gen6_bsd_ring_put_irq,
  735. .dispatch_execbuffer = gen6_ring_dispatch_execbuffer,
  736. };
  737. /* Blitter support (SandyBridge+) */
  738. static void
  739. blt_ring_get_irq(struct intel_ring_buffer *ring)
  740. {
  741. ring_get_irq(ring, GT_BLT_USER_INTERRUPT);
  742. }
  743. static void
  744. blt_ring_put_irq(struct intel_ring_buffer *ring)
  745. {
  746. ring_put_irq(ring, GT_BLT_USER_INTERRUPT);
  747. }
  748. /* Workaround for some stepping of SNB,
  749. * each time when BLT engine ring tail moved,
  750. * the first command in the ring to be parsed
  751. * should be MI_BATCH_BUFFER_START
  752. */
  753. #define NEED_BLT_WORKAROUND(dev) \
  754. (IS_GEN6(dev) && (dev->pdev->revision < 8))
  755. static inline struct drm_i915_gem_object *
  756. to_blt_workaround(struct intel_ring_buffer *ring)
  757. {
  758. return ring->private;
  759. }
  760. static int blt_ring_init(struct intel_ring_buffer *ring)
  761. {
  762. if (NEED_BLT_WORKAROUND(ring->dev)) {
  763. struct drm_i915_gem_object *obj;
  764. u32 *ptr;
  765. int ret;
  766. obj = i915_gem_alloc_object(ring->dev, 4096);
  767. if (obj == NULL)
  768. return -ENOMEM;
  769. ret = i915_gem_object_pin(obj, 4096, true);
  770. if (ret) {
  771. drm_gem_object_unreference(&obj->base);
  772. return ret;
  773. }
  774. ptr = kmap(obj->pages[0]);
  775. *ptr++ = MI_BATCH_BUFFER_END;
  776. *ptr++ = MI_NOOP;
  777. kunmap(obj->pages[0]);
  778. ret = i915_gem_object_set_to_gtt_domain(obj, false);
  779. if (ret) {
  780. i915_gem_object_unpin(obj);
  781. drm_gem_object_unreference(&obj->base);
  782. return ret;
  783. }
  784. ring->private = obj;
  785. }
  786. return init_ring_common(ring);
  787. }
  788. static int blt_ring_begin(struct intel_ring_buffer *ring,
  789. int num_dwords)
  790. {
  791. if (ring->private) {
  792. int ret = intel_ring_begin(ring, num_dwords+2);
  793. if (ret)
  794. return ret;
  795. intel_ring_emit(ring, MI_BATCH_BUFFER_START);
  796. intel_ring_emit(ring, to_blt_workaround(ring)->gtt_offset);
  797. return 0;
  798. } else
  799. return intel_ring_begin(ring, 4);
  800. }
  801. static void blt_ring_flush(struct intel_ring_buffer *ring,
  802. u32 invalidate_domains,
  803. u32 flush_domains)
  804. {
  805. if ((flush_domains & I915_GEM_DOMAIN_RENDER) == 0)
  806. return;
  807. if (blt_ring_begin(ring, 4) == 0) {
  808. intel_ring_emit(ring, MI_FLUSH_DW);
  809. intel_ring_emit(ring, 0);
  810. intel_ring_emit(ring, 0);
  811. intel_ring_emit(ring, 0);
  812. intel_ring_advance(ring);
  813. }
  814. }
  815. static void blt_ring_cleanup(struct intel_ring_buffer *ring)
  816. {
  817. if (!ring->private)
  818. return;
  819. i915_gem_object_unpin(ring->private);
  820. drm_gem_object_unreference(ring->private);
  821. ring->private = NULL;
  822. }
  823. static const struct intel_ring_buffer gen6_blt_ring = {
  824. .name = "blt ring",
  825. .id = RING_BLT,
  826. .mmio_base = BLT_RING_BASE,
  827. .size = 32 * PAGE_SIZE,
  828. .init = blt_ring_init,
  829. .write_tail = ring_write_tail,
  830. .flush = blt_ring_flush,
  831. .add_request = gen6_add_request,
  832. .get_seqno = ring_get_seqno,
  833. .irq_get = blt_ring_get_irq,
  834. .irq_put = blt_ring_put_irq,
  835. .dispatch_execbuffer = gen6_ring_dispatch_execbuffer,
  836. .cleanup = blt_ring_cleanup,
  837. };
  838. int intel_init_render_ring_buffer(struct drm_device *dev)
  839. {
  840. drm_i915_private_t *dev_priv = dev->dev_private;
  841. struct intel_ring_buffer *ring = &dev_priv->ring[RCS];
  842. *ring = render_ring;
  843. if (INTEL_INFO(dev)->gen >= 6) {
  844. ring->add_request = gen6_add_request;
  845. }
  846. if (!I915_NEED_GFX_HWS(dev)) {
  847. ring->status_page.page_addr = dev_priv->status_page_dmah->vaddr;
  848. memset(ring->status_page.page_addr, 0, PAGE_SIZE);
  849. }
  850. return intel_init_ring_buffer(dev, ring);
  851. }
  852. int intel_init_bsd_ring_buffer(struct drm_device *dev)
  853. {
  854. drm_i915_private_t *dev_priv = dev->dev_private;
  855. struct intel_ring_buffer *ring = &dev_priv->ring[VCS];
  856. if (IS_GEN6(dev))
  857. *ring = gen6_bsd_ring;
  858. else
  859. *ring = bsd_ring;
  860. return intel_init_ring_buffer(dev, ring);
  861. }
  862. int intel_init_blt_ring_buffer(struct drm_device *dev)
  863. {
  864. drm_i915_private_t *dev_priv = dev->dev_private;
  865. struct intel_ring_buffer *ring = &dev_priv->ring[BCS];
  866. *ring = gen6_blt_ring;
  867. return intel_init_ring_buffer(dev, ring);
  868. }