intel_ringbuffer.c 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916
  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 drm_device *dev,
  47. struct intel_ring_buffer *ring,
  48. u32 invalidate_domains,
  49. u32 flush_domains)
  50. {
  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 WATCH_EXEC
  102. DRM_INFO("%s: queue flush %08x to ring\n", __func__, cmd);
  103. #endif
  104. intel_ring_begin(dev, ring, 2);
  105. intel_ring_emit(dev, ring, cmd);
  106. intel_ring_emit(dev, ring, MI_NOOP);
  107. intel_ring_advance(dev, ring);
  108. }
  109. }
  110. static void ring_set_tail(struct drm_device *dev,
  111. struct intel_ring_buffer *ring,
  112. u32 value)
  113. {
  114. drm_i915_private_t *dev_priv = dev->dev_private;
  115. I915_WRITE_TAIL(ring, ring->tail);
  116. }
  117. static unsigned int render_ring_get_active_head(struct drm_device *dev,
  118. struct intel_ring_buffer *ring)
  119. {
  120. drm_i915_private_t *dev_priv = dev->dev_private;
  121. u32 acthd_reg = INTEL_INFO(dev)->gen ? ACTHD_I965 : ACTHD;
  122. return I915_READ(acthd_reg);
  123. }
  124. static int init_ring_common(struct drm_device *dev,
  125. struct intel_ring_buffer *ring)
  126. {
  127. u32 head;
  128. drm_i915_private_t *dev_priv = dev->dev_private;
  129. struct drm_i915_gem_object *obj_priv;
  130. obj_priv = to_intel_bo(ring->gem_object);
  131. /* Stop the ring if it's running. */
  132. I915_WRITE_CTL(ring, 0);
  133. I915_WRITE_HEAD(ring, 0);
  134. ring->set_tail(dev, ring, 0);
  135. /* Initialize the ring. */
  136. I915_WRITE_START(ring, obj_priv->gtt_offset);
  137. head = I915_READ_HEAD(ring) & HEAD_ADDR;
  138. /* G45 ring initialization fails to reset head to zero */
  139. if (head != 0) {
  140. DRM_ERROR("%s head not reset to zero "
  141. "ctl %08x head %08x tail %08x start %08x\n",
  142. ring->name,
  143. I915_READ_CTL(ring),
  144. I915_READ_HEAD(ring),
  145. I915_READ_TAIL(ring),
  146. I915_READ_START(ring));
  147. I915_WRITE_HEAD(ring, 0);
  148. DRM_ERROR("%s head forced to zero "
  149. "ctl %08x head %08x tail %08x start %08x\n",
  150. ring->name,
  151. I915_READ_CTL(ring),
  152. I915_READ_HEAD(ring),
  153. I915_READ_TAIL(ring),
  154. I915_READ_START(ring));
  155. }
  156. I915_WRITE_CTL(ring,
  157. ((ring->gem_object->size - PAGE_SIZE) & RING_NR_PAGES)
  158. | RING_NO_REPORT | RING_VALID);
  159. head = I915_READ_HEAD(ring) & HEAD_ADDR;
  160. /* If the head is still not zero, the ring is dead */
  161. if (head != 0) {
  162. DRM_ERROR("%s initialization failed "
  163. "ctl %08x head %08x tail %08x start %08x\n",
  164. ring->name,
  165. I915_READ_CTL(ring),
  166. I915_READ_HEAD(ring),
  167. I915_READ_TAIL(ring),
  168. I915_READ_START(ring));
  169. return -EIO;
  170. }
  171. if (!drm_core_check_feature(dev, DRIVER_MODESET))
  172. i915_kernel_lost_context(dev);
  173. else {
  174. ring->head = I915_READ_HEAD(ring) & HEAD_ADDR;
  175. ring->tail = I915_READ_TAIL(ring) & TAIL_ADDR;
  176. ring->space = ring->head - (ring->tail + 8);
  177. if (ring->space < 0)
  178. ring->space += ring->size;
  179. }
  180. return 0;
  181. }
  182. static int init_render_ring(struct drm_device *dev,
  183. struct intel_ring_buffer *ring)
  184. {
  185. drm_i915_private_t *dev_priv = dev->dev_private;
  186. int ret = init_ring_common(dev, ring);
  187. int mode;
  188. if (INTEL_INFO(dev)->gen > 3) {
  189. mode = VS_TIMER_DISPATCH << 16 | VS_TIMER_DISPATCH;
  190. if (IS_GEN6(dev))
  191. mode |= MI_FLUSH_ENABLE << 16 | MI_FLUSH_ENABLE;
  192. I915_WRITE(MI_MODE, mode);
  193. }
  194. return ret;
  195. }
  196. #define PIPE_CONTROL_FLUSH(addr) \
  197. do { \
  198. OUT_RING(GFX_OP_PIPE_CONTROL | PIPE_CONTROL_QW_WRITE | \
  199. PIPE_CONTROL_DEPTH_STALL | 2); \
  200. OUT_RING(addr | PIPE_CONTROL_GLOBAL_GTT); \
  201. OUT_RING(0); \
  202. OUT_RING(0); \
  203. } while (0)
  204. /**
  205. * Creates a new sequence number, emitting a write of it to the status page
  206. * plus an interrupt, which will trigger i915_user_interrupt_handler.
  207. *
  208. * Must be called with struct_lock held.
  209. *
  210. * Returned sequence numbers are nonzero on success.
  211. */
  212. static u32
  213. render_ring_add_request(struct drm_device *dev,
  214. struct intel_ring_buffer *ring,
  215. u32 flush_domains)
  216. {
  217. drm_i915_private_t *dev_priv = dev->dev_private;
  218. u32 seqno;
  219. seqno = i915_gem_get_seqno(dev);
  220. if (IS_GEN6(dev)) {
  221. BEGIN_LP_RING(6);
  222. OUT_RING(GFX_OP_PIPE_CONTROL | 3);
  223. OUT_RING(PIPE_CONTROL_QW_WRITE |
  224. PIPE_CONTROL_WC_FLUSH | PIPE_CONTROL_IS_FLUSH |
  225. PIPE_CONTROL_NOTIFY);
  226. OUT_RING(dev_priv->seqno_gfx_addr | PIPE_CONTROL_GLOBAL_GTT);
  227. OUT_RING(seqno);
  228. OUT_RING(0);
  229. OUT_RING(0);
  230. ADVANCE_LP_RING();
  231. } else if (HAS_PIPE_CONTROL(dev)) {
  232. u32 scratch_addr = dev_priv->seqno_gfx_addr + 128;
  233. /*
  234. * Workaround qword write incoherence by flushing the
  235. * PIPE_NOTIFY buffers out to memory before requesting
  236. * an interrupt.
  237. */
  238. BEGIN_LP_RING(32);
  239. OUT_RING(GFX_OP_PIPE_CONTROL | PIPE_CONTROL_QW_WRITE |
  240. PIPE_CONTROL_WC_FLUSH | PIPE_CONTROL_TC_FLUSH);
  241. OUT_RING(dev_priv->seqno_gfx_addr | PIPE_CONTROL_GLOBAL_GTT);
  242. OUT_RING(seqno);
  243. OUT_RING(0);
  244. PIPE_CONTROL_FLUSH(scratch_addr);
  245. scratch_addr += 128; /* write to separate cachelines */
  246. PIPE_CONTROL_FLUSH(scratch_addr);
  247. scratch_addr += 128;
  248. PIPE_CONTROL_FLUSH(scratch_addr);
  249. scratch_addr += 128;
  250. PIPE_CONTROL_FLUSH(scratch_addr);
  251. scratch_addr += 128;
  252. PIPE_CONTROL_FLUSH(scratch_addr);
  253. scratch_addr += 128;
  254. PIPE_CONTROL_FLUSH(scratch_addr);
  255. OUT_RING(GFX_OP_PIPE_CONTROL | PIPE_CONTROL_QW_WRITE |
  256. PIPE_CONTROL_WC_FLUSH | PIPE_CONTROL_TC_FLUSH |
  257. PIPE_CONTROL_NOTIFY);
  258. OUT_RING(dev_priv->seqno_gfx_addr | PIPE_CONTROL_GLOBAL_GTT);
  259. OUT_RING(seqno);
  260. OUT_RING(0);
  261. ADVANCE_LP_RING();
  262. } else {
  263. BEGIN_LP_RING(4);
  264. OUT_RING(MI_STORE_DWORD_INDEX);
  265. OUT_RING(I915_GEM_HWS_INDEX << MI_STORE_DWORD_INDEX_SHIFT);
  266. OUT_RING(seqno);
  267. OUT_RING(MI_USER_INTERRUPT);
  268. ADVANCE_LP_RING();
  269. }
  270. return seqno;
  271. }
  272. static u32
  273. render_ring_get_seqno(struct drm_device *dev,
  274. struct intel_ring_buffer *ring)
  275. {
  276. drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
  277. if (HAS_PIPE_CONTROL(dev))
  278. return ((volatile u32 *)(dev_priv->seqno_page))[0];
  279. else
  280. return intel_read_status_page(ring, I915_GEM_HWS_INDEX);
  281. }
  282. static void
  283. render_ring_get_user_irq(struct drm_device *dev,
  284. struct intel_ring_buffer *ring)
  285. {
  286. drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
  287. unsigned long irqflags;
  288. spin_lock_irqsave(&dev_priv->user_irq_lock, irqflags);
  289. if (dev->irq_enabled && (++ring->user_irq_refcount == 1)) {
  290. if (HAS_PCH_SPLIT(dev))
  291. ironlake_enable_graphics_irq(dev_priv, GT_PIPE_NOTIFY);
  292. else
  293. i915_enable_irq(dev_priv, I915_USER_INTERRUPT);
  294. }
  295. spin_unlock_irqrestore(&dev_priv->user_irq_lock, irqflags);
  296. }
  297. static void
  298. render_ring_put_user_irq(struct drm_device *dev,
  299. struct intel_ring_buffer *ring)
  300. {
  301. drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
  302. unsigned long irqflags;
  303. spin_lock_irqsave(&dev_priv->user_irq_lock, irqflags);
  304. BUG_ON(dev->irq_enabled && ring->user_irq_refcount <= 0);
  305. if (dev->irq_enabled && (--ring->user_irq_refcount == 0)) {
  306. if (HAS_PCH_SPLIT(dev))
  307. ironlake_disable_graphics_irq(dev_priv, GT_PIPE_NOTIFY);
  308. else
  309. i915_disable_irq(dev_priv, I915_USER_INTERRUPT);
  310. }
  311. spin_unlock_irqrestore(&dev_priv->user_irq_lock, irqflags);
  312. }
  313. static void render_setup_status_page(struct drm_device *dev,
  314. struct intel_ring_buffer *ring)
  315. {
  316. drm_i915_private_t *dev_priv = dev->dev_private;
  317. if (IS_GEN6(dev)) {
  318. I915_WRITE(HWS_PGA_GEN6, ring->status_page.gfx_addr);
  319. I915_READ(HWS_PGA_GEN6); /* posting read */
  320. } else {
  321. I915_WRITE(HWS_PGA, ring->status_page.gfx_addr);
  322. I915_READ(HWS_PGA); /* posting read */
  323. }
  324. }
  325. static void
  326. bsd_ring_flush(struct drm_device *dev,
  327. struct intel_ring_buffer *ring,
  328. u32 invalidate_domains,
  329. u32 flush_domains)
  330. {
  331. intel_ring_begin(dev, ring, 2);
  332. intel_ring_emit(dev, ring, MI_FLUSH);
  333. intel_ring_emit(dev, ring, MI_NOOP);
  334. intel_ring_advance(dev, ring);
  335. }
  336. static unsigned int bsd_ring_get_active_head(struct drm_device *dev,
  337. struct intel_ring_buffer *ring)
  338. {
  339. drm_i915_private_t *dev_priv = dev->dev_private;
  340. return I915_READ(BSD_RING_ACTHD);
  341. }
  342. static int init_bsd_ring(struct drm_device *dev,
  343. struct intel_ring_buffer *ring)
  344. {
  345. return init_ring_common(dev, ring);
  346. }
  347. static u32
  348. bsd_ring_add_request(struct drm_device *dev,
  349. struct intel_ring_buffer *ring,
  350. u32 flush_domains)
  351. {
  352. u32 seqno;
  353. seqno = i915_gem_get_seqno(dev);
  354. intel_ring_begin(dev, ring, 4);
  355. intel_ring_emit(dev, ring, MI_STORE_DWORD_INDEX);
  356. intel_ring_emit(dev, ring,
  357. I915_GEM_HWS_INDEX << MI_STORE_DWORD_INDEX_SHIFT);
  358. intel_ring_emit(dev, ring, seqno);
  359. intel_ring_emit(dev, ring, MI_USER_INTERRUPT);
  360. intel_ring_advance(dev, ring);
  361. DRM_DEBUG_DRIVER("%s %d\n", ring->name, seqno);
  362. return seqno;
  363. }
  364. static void bsd_setup_status_page(struct drm_device *dev,
  365. struct intel_ring_buffer *ring)
  366. {
  367. drm_i915_private_t *dev_priv = dev->dev_private;
  368. I915_WRITE(BSD_HWS_PGA, ring->status_page.gfx_addr);
  369. I915_READ(BSD_HWS_PGA);
  370. }
  371. static void
  372. bsd_ring_get_user_irq(struct drm_device *dev,
  373. struct intel_ring_buffer *ring)
  374. {
  375. /* do nothing */
  376. }
  377. static void
  378. bsd_ring_put_user_irq(struct drm_device *dev,
  379. struct intel_ring_buffer *ring)
  380. {
  381. /* do nothing */
  382. }
  383. static u32
  384. bsd_ring_get_seqno(struct drm_device *dev,
  385. struct intel_ring_buffer *ring)
  386. {
  387. return intel_read_status_page(ring, I915_GEM_HWS_INDEX);
  388. }
  389. static int
  390. bsd_ring_dispatch_gem_execbuffer(struct drm_device *dev,
  391. struct intel_ring_buffer *ring,
  392. struct drm_i915_gem_execbuffer2 *exec,
  393. struct drm_clip_rect *cliprects,
  394. uint64_t exec_offset)
  395. {
  396. uint32_t exec_start;
  397. exec_start = (uint32_t) exec_offset + exec->batch_start_offset;
  398. intel_ring_begin(dev, ring, 2);
  399. intel_ring_emit(dev, ring, MI_BATCH_BUFFER_START |
  400. (2 << 6) | MI_BATCH_NON_SECURE_I965);
  401. intel_ring_emit(dev, ring, exec_start);
  402. intel_ring_advance(dev, ring);
  403. return 0;
  404. }
  405. static int
  406. render_ring_dispatch_gem_execbuffer(struct drm_device *dev,
  407. struct intel_ring_buffer *ring,
  408. struct drm_i915_gem_execbuffer2 *exec,
  409. struct drm_clip_rect *cliprects,
  410. uint64_t exec_offset)
  411. {
  412. drm_i915_private_t *dev_priv = dev->dev_private;
  413. int nbox = exec->num_cliprects;
  414. int i = 0, count;
  415. uint32_t exec_start, exec_len;
  416. exec_start = (uint32_t) exec_offset + exec->batch_start_offset;
  417. exec_len = (uint32_t) exec->batch_len;
  418. trace_i915_gem_request_submit(dev, dev_priv->next_seqno + 1);
  419. count = nbox ? nbox : 1;
  420. for (i = 0; i < count; i++) {
  421. if (i < nbox) {
  422. int ret = i915_emit_box(dev, cliprects, i,
  423. exec->DR1, exec->DR4);
  424. if (ret)
  425. return ret;
  426. }
  427. if (IS_I830(dev) || IS_845G(dev)) {
  428. intel_ring_begin(dev, ring, 4);
  429. intel_ring_emit(dev, ring, MI_BATCH_BUFFER);
  430. intel_ring_emit(dev, ring,
  431. exec_start | MI_BATCH_NON_SECURE);
  432. intel_ring_emit(dev, ring, exec_start + exec_len - 4);
  433. intel_ring_emit(dev, ring, 0);
  434. } else {
  435. intel_ring_begin(dev, ring, 4);
  436. if (INTEL_INFO(dev)->gen >= 4) {
  437. intel_ring_emit(dev, ring,
  438. MI_BATCH_BUFFER_START | (2 << 6)
  439. | MI_BATCH_NON_SECURE_I965);
  440. intel_ring_emit(dev, ring, exec_start);
  441. } else {
  442. intel_ring_emit(dev, ring, MI_BATCH_BUFFER_START
  443. | (2 << 6));
  444. intel_ring_emit(dev, ring, exec_start |
  445. MI_BATCH_NON_SECURE);
  446. }
  447. }
  448. intel_ring_advance(dev, ring);
  449. }
  450. if (IS_G4X(dev) || IS_IRONLAKE(dev)) {
  451. intel_ring_begin(dev, ring, 2);
  452. intel_ring_emit(dev, ring, MI_FLUSH |
  453. MI_NO_WRITE_FLUSH |
  454. MI_INVALIDATE_ISP );
  455. intel_ring_emit(dev, ring, MI_NOOP);
  456. intel_ring_advance(dev, ring);
  457. }
  458. /* XXX breadcrumb */
  459. return 0;
  460. }
  461. static void cleanup_status_page(struct drm_device *dev,
  462. struct intel_ring_buffer *ring)
  463. {
  464. drm_i915_private_t *dev_priv = dev->dev_private;
  465. struct drm_gem_object *obj;
  466. struct drm_i915_gem_object *obj_priv;
  467. obj = ring->status_page.obj;
  468. if (obj == NULL)
  469. return;
  470. obj_priv = to_intel_bo(obj);
  471. kunmap(obj_priv->pages[0]);
  472. i915_gem_object_unpin(obj);
  473. drm_gem_object_unreference(obj);
  474. ring->status_page.obj = NULL;
  475. memset(&dev_priv->hws_map, 0, sizeof(dev_priv->hws_map));
  476. }
  477. static int init_status_page(struct drm_device *dev,
  478. struct intel_ring_buffer *ring)
  479. {
  480. drm_i915_private_t *dev_priv = dev->dev_private;
  481. struct drm_gem_object *obj;
  482. struct drm_i915_gem_object *obj_priv;
  483. int ret;
  484. obj = i915_gem_alloc_object(dev, 4096);
  485. if (obj == NULL) {
  486. DRM_ERROR("Failed to allocate status page\n");
  487. ret = -ENOMEM;
  488. goto err;
  489. }
  490. obj_priv = to_intel_bo(obj);
  491. obj_priv->agp_type = AGP_USER_CACHED_MEMORY;
  492. ret = i915_gem_object_pin(obj, 4096);
  493. if (ret != 0) {
  494. goto err_unref;
  495. }
  496. ring->status_page.gfx_addr = obj_priv->gtt_offset;
  497. ring->status_page.page_addr = kmap(obj_priv->pages[0]);
  498. if (ring->status_page.page_addr == NULL) {
  499. memset(&dev_priv->hws_map, 0, sizeof(dev_priv->hws_map));
  500. goto err_unpin;
  501. }
  502. ring->status_page.obj = obj;
  503. memset(ring->status_page.page_addr, 0, PAGE_SIZE);
  504. ring->setup_status_page(dev, ring);
  505. DRM_DEBUG_DRIVER("%s hws offset: 0x%08x\n",
  506. ring->name, ring->status_page.gfx_addr);
  507. return 0;
  508. err_unpin:
  509. i915_gem_object_unpin(obj);
  510. err_unref:
  511. drm_gem_object_unreference(obj);
  512. err:
  513. return ret;
  514. }
  515. int intel_init_ring_buffer(struct drm_device *dev,
  516. struct intel_ring_buffer *ring)
  517. {
  518. struct drm_i915_private *dev_priv = dev->dev_private;
  519. struct drm_i915_gem_object *obj_priv;
  520. struct drm_gem_object *obj;
  521. int ret;
  522. ring->dev = dev;
  523. if (I915_NEED_GFX_HWS(dev)) {
  524. ret = init_status_page(dev, ring);
  525. if (ret)
  526. return ret;
  527. }
  528. obj = i915_gem_alloc_object(dev, ring->size);
  529. if (obj == NULL) {
  530. DRM_ERROR("Failed to allocate ringbuffer\n");
  531. ret = -ENOMEM;
  532. goto err_hws;
  533. }
  534. ring->gem_object = obj;
  535. ret = i915_gem_object_pin(obj, PAGE_SIZE);
  536. if (ret)
  537. goto err_unref;
  538. obj_priv = to_intel_bo(obj);
  539. ring->map.size = ring->size;
  540. ring->map.offset = dev->agp->base + obj_priv->gtt_offset;
  541. ring->map.type = 0;
  542. ring->map.flags = 0;
  543. ring->map.mtrr = 0;
  544. drm_core_ioremap_wc(&ring->map, dev);
  545. if (ring->map.handle == NULL) {
  546. DRM_ERROR("Failed to map ringbuffer.\n");
  547. ret = -EINVAL;
  548. goto err_unpin;
  549. }
  550. ring->virtual_start = ring->map.handle;
  551. ret = ring->init(dev, ring);
  552. if (ret)
  553. goto err_unmap;
  554. if (!drm_core_check_feature(dev, DRIVER_MODESET))
  555. i915_kernel_lost_context(dev);
  556. else {
  557. ring->head = I915_READ_HEAD(ring) & HEAD_ADDR;
  558. ring->tail = I915_READ_TAIL(ring) & TAIL_ADDR;
  559. ring->space = ring->head - (ring->tail + 8);
  560. if (ring->space < 0)
  561. ring->space += ring->size;
  562. }
  563. INIT_LIST_HEAD(&ring->active_list);
  564. INIT_LIST_HEAD(&ring->request_list);
  565. return ret;
  566. err_unmap:
  567. drm_core_ioremapfree(&ring->map, dev);
  568. err_unpin:
  569. i915_gem_object_unpin(obj);
  570. err_unref:
  571. drm_gem_object_unreference(obj);
  572. ring->gem_object = NULL;
  573. err_hws:
  574. cleanup_status_page(dev, ring);
  575. return ret;
  576. }
  577. void intel_cleanup_ring_buffer(struct drm_device *dev,
  578. struct intel_ring_buffer *ring)
  579. {
  580. if (ring->gem_object == NULL)
  581. return;
  582. drm_core_ioremapfree(&ring->map, dev);
  583. i915_gem_object_unpin(ring->gem_object);
  584. drm_gem_object_unreference(ring->gem_object);
  585. ring->gem_object = NULL;
  586. cleanup_status_page(dev, ring);
  587. }
  588. static int intel_wrap_ring_buffer(struct drm_device *dev,
  589. struct intel_ring_buffer *ring)
  590. {
  591. unsigned int *virt;
  592. int rem;
  593. rem = ring->size - ring->tail;
  594. if (ring->space < rem) {
  595. int ret = intel_wait_ring_buffer(dev, ring, rem);
  596. if (ret)
  597. return ret;
  598. }
  599. virt = (unsigned int *)(ring->virtual_start + ring->tail);
  600. rem /= 8;
  601. while (rem--) {
  602. *virt++ = MI_NOOP;
  603. *virt++ = MI_NOOP;
  604. }
  605. ring->tail = 0;
  606. ring->space = ring->head - 8;
  607. return 0;
  608. }
  609. int intel_wait_ring_buffer(struct drm_device *dev,
  610. struct intel_ring_buffer *ring, int n)
  611. {
  612. unsigned long end;
  613. drm_i915_private_t *dev_priv = dev->dev_private;
  614. trace_i915_ring_wait_begin (dev);
  615. end = jiffies + 3 * HZ;
  616. do {
  617. ring->head = I915_READ_HEAD(ring) & HEAD_ADDR;
  618. ring->space = ring->head - (ring->tail + 8);
  619. if (ring->space < 0)
  620. ring->space += ring->size;
  621. if (ring->space >= n) {
  622. trace_i915_ring_wait_end (dev);
  623. return 0;
  624. }
  625. if (dev->primary->master) {
  626. struct drm_i915_master_private *master_priv = dev->primary->master->driver_priv;
  627. if (master_priv->sarea_priv)
  628. master_priv->sarea_priv->perf_boxes |= I915_BOX_WAIT;
  629. }
  630. yield();
  631. } while (!time_after(jiffies, end));
  632. trace_i915_ring_wait_end (dev);
  633. return -EBUSY;
  634. }
  635. void intel_ring_begin(struct drm_device *dev,
  636. struct intel_ring_buffer *ring,
  637. int num_dwords)
  638. {
  639. int n = 4*num_dwords;
  640. if (unlikely(ring->tail + n > ring->size))
  641. intel_wrap_ring_buffer(dev, ring);
  642. if (unlikely(ring->space < n))
  643. intel_wait_ring_buffer(dev, ring, n);
  644. ring->space -= n;
  645. }
  646. void intel_ring_advance(struct drm_device *dev,
  647. struct intel_ring_buffer *ring)
  648. {
  649. ring->tail &= ring->size - 1;
  650. ring->set_tail(dev, ring, ring->tail);
  651. }
  652. void intel_fill_struct(struct drm_device *dev,
  653. struct intel_ring_buffer *ring,
  654. void *data,
  655. unsigned int len)
  656. {
  657. unsigned int *virt = ring->virtual_start + ring->tail;
  658. BUG_ON((len&~(4-1)) != 0);
  659. intel_ring_begin(dev, ring, len/4);
  660. memcpy(virt, data, len);
  661. ring->tail += len;
  662. ring->tail &= ring->size - 1;
  663. ring->space -= len;
  664. intel_ring_advance(dev, ring);
  665. }
  666. static const struct intel_ring_buffer render_ring = {
  667. .name = "render ring",
  668. .id = RING_RENDER,
  669. .mmio_base = RENDER_RING_BASE,
  670. .size = 32 * PAGE_SIZE,
  671. .setup_status_page = render_setup_status_page,
  672. .init = init_render_ring,
  673. .set_tail = ring_set_tail,
  674. .get_active_head = render_ring_get_active_head,
  675. .flush = render_ring_flush,
  676. .add_request = render_ring_add_request,
  677. .get_seqno = render_ring_get_seqno,
  678. .user_irq_get = render_ring_get_user_irq,
  679. .user_irq_put = render_ring_put_user_irq,
  680. .dispatch_gem_execbuffer = render_ring_dispatch_gem_execbuffer,
  681. };
  682. /* ring buffer for bit-stream decoder */
  683. static const struct intel_ring_buffer bsd_ring = {
  684. .name = "bsd ring",
  685. .id = RING_BSD,
  686. .mmio_base = BSD_RING_BASE,
  687. .size = 32 * PAGE_SIZE,
  688. .setup_status_page = bsd_setup_status_page,
  689. .init = init_bsd_ring,
  690. .set_tail = ring_set_tail,
  691. .get_active_head = bsd_ring_get_active_head,
  692. .flush = bsd_ring_flush,
  693. .add_request = bsd_ring_add_request,
  694. .get_seqno = bsd_ring_get_seqno,
  695. .user_irq_get = bsd_ring_get_user_irq,
  696. .user_irq_put = bsd_ring_put_user_irq,
  697. .dispatch_gem_execbuffer = bsd_ring_dispatch_gem_execbuffer,
  698. };
  699. static void gen6_bsd_setup_status_page(struct drm_device *dev,
  700. struct intel_ring_buffer *ring)
  701. {
  702. drm_i915_private_t *dev_priv = dev->dev_private;
  703. I915_WRITE(GEN6_BSD_HWS_PGA, ring->status_page.gfx_addr);
  704. I915_READ(GEN6_BSD_HWS_PGA);
  705. }
  706. static void gen6_bsd_ring_set_tail(struct drm_device *dev,
  707. struct intel_ring_buffer *ring,
  708. u32 value)
  709. {
  710. drm_i915_private_t *dev_priv = dev->dev_private;
  711. /* Every tail move must follow the sequence below */
  712. I915_WRITE(GEN6_BSD_SLEEP_PSMI_CONTROL,
  713. GEN6_BSD_SLEEP_PSMI_CONTROL_RC_ILDL_MESSAGE_MODIFY_MASK |
  714. GEN6_BSD_SLEEP_PSMI_CONTROL_RC_ILDL_MESSAGE_DISABLE);
  715. I915_WRITE(GEN6_BSD_RNCID, 0x0);
  716. if (wait_for((I915_READ(GEN6_BSD_SLEEP_PSMI_CONTROL) &
  717. GEN6_BSD_SLEEP_PSMI_CONTROL_IDLE_INDICATOR) == 0,
  718. 50))
  719. DRM_ERROR("timed out waiting for IDLE Indicator\n");
  720. I915_WRITE_TAIL(ring, value);
  721. I915_WRITE(GEN6_BSD_SLEEP_PSMI_CONTROL,
  722. GEN6_BSD_SLEEP_PSMI_CONTROL_RC_ILDL_MESSAGE_MODIFY_MASK |
  723. GEN6_BSD_SLEEP_PSMI_CONTROL_RC_ILDL_MESSAGE_ENABLE);
  724. }
  725. static unsigned int gen6_bsd_ring_get_active_head(struct drm_device *dev,
  726. struct intel_ring_buffer *ring)
  727. {
  728. drm_i915_private_t *dev_priv = dev->dev_private;
  729. return I915_READ(GEN6_BSD_RING_ACTHD);
  730. }
  731. static void gen6_bsd_ring_flush(struct drm_device *dev,
  732. struct intel_ring_buffer *ring,
  733. u32 invalidate_domains,
  734. u32 flush_domains)
  735. {
  736. intel_ring_begin(dev, ring, 4);
  737. intel_ring_emit(dev, ring, MI_FLUSH_DW);
  738. intel_ring_emit(dev, ring, 0);
  739. intel_ring_emit(dev, ring, 0);
  740. intel_ring_emit(dev, ring, 0);
  741. intel_ring_advance(dev, ring);
  742. }
  743. static int
  744. gen6_bsd_ring_dispatch_gem_execbuffer(struct drm_device *dev,
  745. struct intel_ring_buffer *ring,
  746. struct drm_i915_gem_execbuffer2 *exec,
  747. struct drm_clip_rect *cliprects,
  748. uint64_t exec_offset)
  749. {
  750. uint32_t exec_start;
  751. exec_start = (uint32_t) exec_offset + exec->batch_start_offset;
  752. intel_ring_begin(dev, ring, 2);
  753. intel_ring_emit(dev, ring,
  754. MI_BATCH_BUFFER_START | MI_BATCH_NON_SECURE_I965);
  755. /* bit0-7 is the length on GEN6+ */
  756. intel_ring_emit(dev, ring, exec_start);
  757. intel_ring_advance(dev, ring);
  758. return 0;
  759. }
  760. /* ring buffer for Video Codec for Gen6+ */
  761. static const struct intel_ring_buffer gen6_bsd_ring = {
  762. .name = "gen6 bsd ring",
  763. .id = RING_BSD,
  764. .mmio_base = GEN6_BSD_RING_BASE,
  765. .size = 32 * PAGE_SIZE,
  766. .setup_status_page = gen6_bsd_setup_status_page,
  767. .init = init_bsd_ring,
  768. .set_tail = gen6_bsd_ring_set_tail,
  769. .get_active_head = gen6_bsd_ring_get_active_head,
  770. .flush = gen6_bsd_ring_flush,
  771. .add_request = bsd_ring_add_request,
  772. .get_seqno = bsd_ring_get_seqno,
  773. .user_irq_get = bsd_ring_get_user_irq,
  774. .user_irq_put = bsd_ring_put_user_irq,
  775. .dispatch_gem_execbuffer = gen6_bsd_ring_dispatch_gem_execbuffer,
  776. };
  777. int intel_init_render_ring_buffer(struct drm_device *dev)
  778. {
  779. drm_i915_private_t *dev_priv = dev->dev_private;
  780. dev_priv->render_ring = render_ring;
  781. if (!I915_NEED_GFX_HWS(dev)) {
  782. dev_priv->render_ring.status_page.page_addr
  783. = dev_priv->status_page_dmah->vaddr;
  784. memset(dev_priv->render_ring.status_page.page_addr,
  785. 0, PAGE_SIZE);
  786. }
  787. return intel_init_ring_buffer(dev, &dev_priv->render_ring);
  788. }
  789. int intel_init_bsd_ring_buffer(struct drm_device *dev)
  790. {
  791. drm_i915_private_t *dev_priv = dev->dev_private;
  792. if (IS_GEN6(dev))
  793. dev_priv->bsd_ring = gen6_bsd_ring;
  794. else
  795. dev_priv->bsd_ring = bsd_ring;
  796. return intel_init_ring_buffer(dev, &dev_priv->bsd_ring);
  797. }