intel_ringbuffer.c 25 KB

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