| From df17af4a02da8dc65abe33d9517038e2482adbb5 Mon Sep 17 00:00:00 2001 |
| From: Ben Widawsky <ben@bwidawsk.net> |
| Date: Tue, 28 May 2013 19:22:23 -0700 |
| Subject: drm/i915: Vebox ringbuffer init |
| |
| v2: Add set_seqno which didn't exist before rebase (Haihao) |
| |
| Signed-off-by: Ben Widawsky <ben@bwidawsk.net> |
| Reviewed-by: Damien Lespiau <damien.lespiau@intel.com> |
| Signed-off-by: Xiang, Haihao <haihao.xiang@intel.com> |
| Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch> |
| (cherry picked from commit 9a8a2213a778509b724c8fda04be70528a1f7130) |
| Signed-off-by: Darren Hart <dvhart@linux.intel.com> |
| --- |
| drivers/gpu/drm/i915/i915_gem.c | 11 +++++++++- |
| drivers/gpu/drm/i915/i915_reg.h | 1 |
| drivers/gpu/drm/i915/intel_ringbuffer.c | 35 +++++++++++++++++++++++++++++++- |
| drivers/gpu/drm/i915/intel_ringbuffer.h | 1 |
| 4 files changed, 46 insertions(+), 2 deletions(-) |
| |
| --- a/drivers/gpu/drm/i915/i915_gem.c |
| +++ b/drivers/gpu/drm/i915/i915_gem.c |
| @@ -4043,12 +4043,21 @@ static int i915_gem_init_rings(struct dr |
| goto cleanup_bsd_ring; |
| } |
| |
| + if (HAS_VEBOX(dev)) { |
| + ret = intel_init_vebox_ring_buffer(dev); |
| + if (ret) |
| + goto cleanup_blt_ring; |
| + } |
| + |
| + |
| ret = i915_gem_set_seqno(dev, ((u32)~0 - 0x1000)); |
| if (ret) |
| - goto cleanup_blt_ring; |
| + goto cleanup_vebox_ring; |
| |
| return 0; |
| |
| +cleanup_vebox_ring: |
| + intel_cleanup_ring_buffer(&dev_priv->ring[VECS]); |
| cleanup_blt_ring: |
| intel_cleanup_ring_buffer(&dev_priv->ring[BCS]); |
| cleanup_bsd_ring: |
| --- a/drivers/gpu/drm/i915/i915_reg.h |
| +++ b/drivers/gpu/drm/i915/i915_reg.h |
| @@ -621,6 +621,7 @@ |
| #define DONE_REG 0x40b0 |
| #define BSD_HWS_PGA_GEN7 (0x04180) |
| #define BLT_HWS_PGA_GEN7 (0x04280) |
| +#define VEBOX_HWS_PGA_GEN7 (0x04380) |
| #define RING_ACTHD(base) ((base)+0x74) |
| #define RING_NOPID(base) ((base)+0x94) |
| #define RING_IMR(base) ((base)+0xa8) |
| --- a/drivers/gpu/drm/i915/intel_ringbuffer.c |
| +++ b/drivers/gpu/drm/i915/intel_ringbuffer.c |
| @@ -921,7 +921,8 @@ void intel_ring_setup_status_page(struct |
| mmio = BSD_HWS_PGA_GEN7; |
| break; |
| case VECS: |
| - BUG(); |
| + mmio = VEBOX_HWS_PGA_GEN7; |
| + break; |
| } |
| } else if (IS_GEN6(ring->dev)) { |
| mmio = RING_HWS_PGA_GEN6(ring->mmio_base); |
| @@ -1928,6 +1929,38 @@ int intel_init_blt_ring_buffer(struct dr |
| ring->init = init_ring_common; |
| |
| return intel_init_ring_buffer(dev, ring); |
| +} |
| + |
| +int intel_init_vebox_ring_buffer(struct drm_device *dev) |
| +{ |
| + drm_i915_private_t *dev_priv = dev->dev_private; |
| + struct intel_ring_buffer *ring = &dev_priv->ring[VECS]; |
| + |
| + ring->name = "video enhancement ring"; |
| + ring->id = VECS; |
| + |
| + ring->mmio_base = VEBOX_RING_BASE; |
| + ring->write_tail = ring_write_tail; |
| + ring->flush = gen6_ring_flush; |
| + ring->add_request = gen6_add_request; |
| + ring->get_seqno = gen6_ring_get_seqno; |
| + ring->set_seqno = ring_set_seqno; |
| + ring->irq_enable_mask = 0; |
| + ring->irq_get = NULL; |
| + ring->irq_put = NULL; |
| + ring->dispatch_execbuffer = gen6_ring_dispatch_execbuffer; |
| + ring->sync_to = gen6_ring_sync; |
| + ring->semaphore_register[RCS] = MI_SEMAPHORE_SYNC_VER; |
| + ring->semaphore_register[VCS] = MI_SEMAPHORE_SYNC_VEV; |
| + ring->semaphore_register[BCS] = MI_SEMAPHORE_SYNC_VEB; |
| + ring->semaphore_register[VECS] = MI_SEMAPHORE_SYNC_INVALID; |
| + ring->signal_mbox[RCS] = GEN6_RVESYNC; |
| + ring->signal_mbox[VCS] = GEN6_VVESYNC; |
| + ring->signal_mbox[BCS] = GEN6_BVESYNC; |
| + ring->signal_mbox[VECS] = GEN6_NOSYNC; |
| + ring->init = init_ring_common; |
| + |
| + return intel_init_ring_buffer(dev, ring); |
| } |
| |
| int |
| --- a/drivers/gpu/drm/i915/intel_ringbuffer.h |
| +++ b/drivers/gpu/drm/i915/intel_ringbuffer.h |
| @@ -234,6 +234,7 @@ int intel_ring_invalidate_all_caches(str |
| int intel_init_render_ring_buffer(struct drm_device *dev); |
| int intel_init_bsd_ring_buffer(struct drm_device *dev); |
| int intel_init_blt_ring_buffer(struct drm_device *dev); |
| +int intel_init_vebox_ring_buffer(struct drm_device *dev); |
| |
| u32 intel_ring_get_active_head(struct intel_ring_buffer *ring); |
| void intel_ring_setup_status_page(struct intel_ring_buffer *ring); |