aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/gpu/drm/i915/intel_ringbuffer.c55
1 files changed, 39 insertions, 16 deletions
diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.c b/drivers/gpu/drm/i915/intel_ringbuffer.c
index 4ae651bb1c97..6f610f28b1be 100644
--- a/drivers/gpu/drm/i915/intel_ringbuffer.c
+++ b/drivers/gpu/drm/i915/intel_ringbuffer.c
@@ -53,9 +53,35 @@ static inline int ring_space(struct intel_ring_buffer *ring)
53} 53}
54 54
55static int 55static int
56render_ring_flush(struct intel_ring_buffer *ring, 56gen2_render_ring_flush(struct intel_ring_buffer *ring,
57 u32 invalidate_domains, 57 u32 invalidate_domains,
58 u32 flush_domains) 58 u32 flush_domains)
59{
60 u32 cmd;
61 int ret;
62
63 cmd = MI_FLUSH;
64 if ((flush_domains & I915_GEM_DOMAIN_RENDER) == 0)
65 cmd |= MI_NO_WRITE_FLUSH;
66
67 if (invalidate_domains & I915_GEM_DOMAIN_SAMPLER)
68 cmd |= MI_READ_FLUSH;
69
70 ret = intel_ring_begin(ring, 2);
71 if (ret)
72 return ret;
73
74 intel_ring_emit(ring, cmd);
75 intel_ring_emit(ring, MI_NOOP);
76 intel_ring_advance(ring);
77
78 return 0;
79}
80
81static int
82gen4_render_ring_flush(struct intel_ring_buffer *ring,
83 u32 invalidate_domains,
84 u32 flush_domains)
59{ 85{
60 struct drm_device *dev = ring->dev; 86 struct drm_device *dev = ring->dev;
61 u32 cmd; 87 u32 cmd;
@@ -90,17 +116,8 @@ render_ring_flush(struct intel_ring_buffer *ring,
90 */ 116 */
91 117
92 cmd = MI_FLUSH | MI_NO_WRITE_FLUSH; 118 cmd = MI_FLUSH | MI_NO_WRITE_FLUSH;
93 if ((invalidate_domains|flush_domains) & 119 if ((invalidate_domains|flush_domains) & I915_GEM_DOMAIN_RENDER)
94 I915_GEM_DOMAIN_RENDER)
95 cmd &= ~MI_NO_WRITE_FLUSH; 120 cmd &= ~MI_NO_WRITE_FLUSH;
96 if (INTEL_INFO(dev)->gen < 4) {
97 /*
98 * On the 965, the sampler cache always gets flushed
99 * and this bit is reserved.
100 */
101 if (invalidate_domains & I915_GEM_DOMAIN_SAMPLER)
102 cmd |= MI_READ_FLUSH;
103 }
104 if (invalidate_domains & I915_GEM_DOMAIN_INSTRUCTION) 121 if (invalidate_domains & I915_GEM_DOMAIN_INSTRUCTION)
105 cmd |= MI_EXE_FLUSH; 122 cmd |= MI_EXE_FLUSH;
106 123
@@ -1281,14 +1298,17 @@ int intel_init_render_ring_buffer(struct drm_device *dev)
1281 ring->signal_mbox[1] = GEN6_BRSYNC; 1298 ring->signal_mbox[1] = GEN6_BRSYNC;
1282 } else if (IS_GEN5(dev)) { 1299 } else if (IS_GEN5(dev)) {
1283 ring->add_request = pc_render_add_request; 1300 ring->add_request = pc_render_add_request;
1284 ring->flush = render_ring_flush; 1301 ring->flush = gen4_render_ring_flush;
1285 ring->get_seqno = pc_render_get_seqno; 1302 ring->get_seqno = pc_render_get_seqno;
1286 ring->irq_get = gen5_ring_get_irq; 1303 ring->irq_get = gen5_ring_get_irq;
1287 ring->irq_put = gen5_ring_put_irq; 1304 ring->irq_put = gen5_ring_put_irq;
1288 ring->irq_enable_mask = GT_USER_INTERRUPT | GT_PIPE_NOTIFY; 1305 ring->irq_enable_mask = GT_USER_INTERRUPT | GT_PIPE_NOTIFY;
1289 } else { 1306 } else {
1290 ring->add_request = i9xx_add_request; 1307 ring->add_request = i9xx_add_request;
1291 ring->flush = render_ring_flush; 1308 if (INTEL_INFO(dev)->gen < 4)
1309 ring->flush = gen2_render_ring_flush;
1310 else
1311 ring->flush = gen4_render_ring_flush;
1292 ring->get_seqno = ring_get_seqno; 1312 ring->get_seqno = ring_get_seqno;
1293 ring->irq_get = i9xx_ring_get_irq; 1313 ring->irq_get = i9xx_ring_get_irq;
1294 ring->irq_put = i9xx_ring_put_irq; 1314 ring->irq_put = i9xx_ring_put_irq;
@@ -1333,7 +1353,10 @@ int intel_render_ring_init_dri(struct drm_device *dev, u64 start, u32 size)
1333 * gem_init ioctl returns with -ENODEV). Hence we do not need to set up 1353 * gem_init ioctl returns with -ENODEV). Hence we do not need to set up
1334 * the special gen5 functions. */ 1354 * the special gen5 functions. */
1335 ring->add_request = i9xx_add_request; 1355 ring->add_request = i9xx_add_request;
1336 ring->flush = render_ring_flush; 1356 if (INTEL_INFO(dev)->gen < 4)
1357 ring->flush = gen2_render_ring_flush;
1358 else
1359 ring->flush = gen4_render_ring_flush;
1337 ring->get_seqno = ring_get_seqno; 1360 ring->get_seqno = ring_get_seqno;
1338 ring->irq_get = i9xx_ring_get_irq; 1361 ring->irq_get = i9xx_ring_get_irq;
1339 ring->irq_put = i9xx_ring_put_irq; 1362 ring->irq_put = i9xx_ring_put_irq;