diff options
| -rw-r--r-- | drivers/gpu/drm/i915/intel_ringbuffer.c | 55 |
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 | ||
| 55 | static int | 55 | static int |
| 56 | render_ring_flush(struct intel_ring_buffer *ring, | 56 | gen2_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 | |||
| 81 | static int | ||
| 82 | gen4_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; |
