diff options
-rw-r--r-- | drivers/gpu/drm/i915/i915_reg.h | 1 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_ringbuffer.c | 34 |
2 files changed, 32 insertions, 3 deletions
diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h index 9ec524167c83..c696779fb85e 100644 --- a/drivers/gpu/drm/i915/i915_reg.h +++ b/drivers/gpu/drm/i915/i915_reg.h | |||
@@ -247,6 +247,7 @@ | |||
247 | #define MI_BATCH_NON_SECURE_HSW (1<<13) | 247 | #define MI_BATCH_NON_SECURE_HSW (1<<13) |
248 | #define MI_BATCH_BUFFER_START MI_INSTR(0x31, 0) | 248 | #define MI_BATCH_BUFFER_START MI_INSTR(0x31, 0) |
249 | #define MI_BATCH_GTT (2<<6) /* aliased with (1<<7) on gen4 */ | 249 | #define MI_BATCH_GTT (2<<6) /* aliased with (1<<7) on gen4 */ |
250 | #define MI_BATCH_BUFFER_START_GEN8 MI_INSTR(0x31, 1) | ||
250 | #define MI_SEMAPHORE_MBOX MI_INSTR(0x16, 1) /* gen6+ */ | 251 | #define MI_SEMAPHORE_MBOX MI_INSTR(0x16, 1) /* gen6+ */ |
251 | #define MI_SEMAPHORE_GLOBAL_GTT (1<<22) | 252 | #define MI_SEMAPHORE_GLOBAL_GTT (1<<22) |
252 | #define MI_SEMAPHORE_UPDATE (1<<21) | 253 | #define MI_SEMAPHORE_UPDATE (1<<21) |
diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.c b/drivers/gpu/drm/i915/intel_ringbuffer.c index 2fda12607b78..7070d734b84b 100644 --- a/drivers/gpu/drm/i915/intel_ringbuffer.c +++ b/drivers/gpu/drm/i915/intel_ringbuffer.c | |||
@@ -1688,6 +1688,27 @@ static int gen6_bsd_ring_flush(struct intel_ring_buffer *ring, | |||
1688 | } | 1688 | } |
1689 | 1689 | ||
1690 | static int | 1690 | static int |
1691 | gen8_ring_dispatch_execbuffer(struct intel_ring_buffer *ring, | ||
1692 | u32 offset, u32 len, | ||
1693 | unsigned flags) | ||
1694 | { | ||
1695 | int ret; | ||
1696 | |||
1697 | ret = intel_ring_begin(ring, 4); | ||
1698 | if (ret) | ||
1699 | return ret; | ||
1700 | |||
1701 | /* FIXME(BDW): Address space and security selectors. */ | ||
1702 | intel_ring_emit(ring, MI_BATCH_BUFFER_START_GEN8); | ||
1703 | intel_ring_emit(ring, offset); | ||
1704 | intel_ring_emit(ring, 0); | ||
1705 | intel_ring_emit(ring, MI_NOOP); | ||
1706 | intel_ring_advance(ring); | ||
1707 | |||
1708 | return 0; | ||
1709 | } | ||
1710 | |||
1711 | static int | ||
1691 | hsw_ring_dispatch_execbuffer(struct intel_ring_buffer *ring, | 1712 | hsw_ring_dispatch_execbuffer(struct intel_ring_buffer *ring, |
1692 | u32 offset, u32 len, | 1713 | u32 offset, u32 len, |
1693 | unsigned flags) | 1714 | unsigned flags) |
@@ -1826,6 +1847,8 @@ int intel_init_render_ring_buffer(struct drm_device *dev) | |||
1826 | ring->write_tail = ring_write_tail; | 1847 | ring->write_tail = ring_write_tail; |
1827 | if (IS_HASWELL(dev)) | 1848 | if (IS_HASWELL(dev)) |
1828 | ring->dispatch_execbuffer = hsw_ring_dispatch_execbuffer; | 1849 | ring->dispatch_execbuffer = hsw_ring_dispatch_execbuffer; |
1850 | else if (IS_GEN8(dev)) | ||
1851 | ring->dispatch_execbuffer = gen8_ring_dispatch_execbuffer; | ||
1829 | else if (INTEL_INFO(dev)->gen >= 6) | 1852 | else if (INTEL_INFO(dev)->gen >= 6) |
1830 | ring->dispatch_execbuffer = gen6_ring_dispatch_execbuffer; | 1853 | ring->dispatch_execbuffer = gen6_ring_dispatch_execbuffer; |
1831 | else if (INTEL_INFO(dev)->gen >= 4) | 1854 | else if (INTEL_INFO(dev)->gen >= 4) |
@@ -1953,12 +1976,15 @@ int intel_init_bsd_ring_buffer(struct drm_device *dev) | |||
1953 | GT_RENDER_USER_INTERRUPT << GEN8_VCS1_IRQ_SHIFT; | 1976 | GT_RENDER_USER_INTERRUPT << GEN8_VCS1_IRQ_SHIFT; |
1954 | ring->irq_get = gen8_ring_get_irq; | 1977 | ring->irq_get = gen8_ring_get_irq; |
1955 | ring->irq_put = gen8_ring_put_irq; | 1978 | ring->irq_put = gen8_ring_put_irq; |
1979 | ring->dispatch_execbuffer = | ||
1980 | gen8_ring_dispatch_execbuffer; | ||
1956 | } else { | 1981 | } else { |
1957 | ring->irq_enable_mask = GT_BSD_USER_INTERRUPT; | 1982 | ring->irq_enable_mask = GT_BSD_USER_INTERRUPT; |
1958 | ring->irq_get = gen6_ring_get_irq; | 1983 | ring->irq_get = gen6_ring_get_irq; |
1959 | ring->irq_put = gen6_ring_put_irq; | 1984 | ring->irq_put = gen6_ring_put_irq; |
1985 | ring->dispatch_execbuffer = | ||
1986 | gen6_ring_dispatch_execbuffer; | ||
1960 | } | 1987 | } |
1961 | ring->dispatch_execbuffer = gen6_ring_dispatch_execbuffer; | ||
1962 | ring->sync_to = gen6_ring_sync; | 1988 | ring->sync_to = gen6_ring_sync; |
1963 | ring->semaphore_register[RCS] = MI_SEMAPHORE_SYNC_VR; | 1989 | ring->semaphore_register[RCS] = MI_SEMAPHORE_SYNC_VR; |
1964 | ring->semaphore_register[VCS] = MI_SEMAPHORE_SYNC_INVALID; | 1990 | ring->semaphore_register[VCS] = MI_SEMAPHORE_SYNC_INVALID; |
@@ -2009,12 +2035,13 @@ int intel_init_blt_ring_buffer(struct drm_device *dev) | |||
2009 | GT_RENDER_USER_INTERRUPT << GEN8_BCS_IRQ_SHIFT; | 2035 | GT_RENDER_USER_INTERRUPT << GEN8_BCS_IRQ_SHIFT; |
2010 | ring->irq_get = gen8_ring_get_irq; | 2036 | ring->irq_get = gen8_ring_get_irq; |
2011 | ring->irq_put = gen8_ring_put_irq; | 2037 | ring->irq_put = gen8_ring_put_irq; |
2038 | ring->dispatch_execbuffer = gen8_ring_dispatch_execbuffer; | ||
2012 | } else { | 2039 | } else { |
2013 | ring->irq_enable_mask = GT_BLT_USER_INTERRUPT; | 2040 | ring->irq_enable_mask = GT_BLT_USER_INTERRUPT; |
2014 | ring->irq_get = gen6_ring_get_irq; | 2041 | ring->irq_get = gen6_ring_get_irq; |
2015 | ring->irq_put = gen6_ring_put_irq; | 2042 | ring->irq_put = gen6_ring_put_irq; |
2043 | ring->dispatch_execbuffer = gen6_ring_dispatch_execbuffer; | ||
2016 | } | 2044 | } |
2017 | ring->dispatch_execbuffer = gen6_ring_dispatch_execbuffer; | ||
2018 | ring->sync_to = gen6_ring_sync; | 2045 | ring->sync_to = gen6_ring_sync; |
2019 | ring->semaphore_register[RCS] = MI_SEMAPHORE_SYNC_BR; | 2046 | ring->semaphore_register[RCS] = MI_SEMAPHORE_SYNC_BR; |
2020 | ring->semaphore_register[VCS] = MI_SEMAPHORE_SYNC_BV; | 2047 | ring->semaphore_register[VCS] = MI_SEMAPHORE_SYNC_BV; |
@@ -2043,7 +2070,6 @@ int intel_init_vebox_ring_buffer(struct drm_device *dev) | |||
2043 | ring->add_request = gen6_add_request; | 2070 | ring->add_request = gen6_add_request; |
2044 | ring->get_seqno = gen6_ring_get_seqno; | 2071 | ring->get_seqno = gen6_ring_get_seqno; |
2045 | ring->set_seqno = ring_set_seqno; | 2072 | ring->set_seqno = ring_set_seqno; |
2046 | ring->dispatch_execbuffer = gen6_ring_dispatch_execbuffer; | ||
2047 | 2073 | ||
2048 | if (INTEL_INFO(dev)->gen >= 8) { | 2074 | if (INTEL_INFO(dev)->gen >= 8) { |
2049 | ring->irq_enable_mask = | 2075 | ring->irq_enable_mask = |
@@ -2051,10 +2077,12 @@ int intel_init_vebox_ring_buffer(struct drm_device *dev) | |||
2051 | GT_RENDER_CS_MASTER_ERROR_INTERRUPT; | 2077 | GT_RENDER_CS_MASTER_ERROR_INTERRUPT; |
2052 | ring->irq_get = gen8_ring_get_irq; | 2078 | ring->irq_get = gen8_ring_get_irq; |
2053 | ring->irq_put = gen8_ring_put_irq; | 2079 | ring->irq_put = gen8_ring_put_irq; |
2080 | ring->dispatch_execbuffer = gen8_ring_dispatch_execbuffer; | ||
2054 | } else { | 2081 | } else { |
2055 | ring->irq_enable_mask = PM_VEBOX_USER_INTERRUPT; | 2082 | ring->irq_enable_mask = PM_VEBOX_USER_INTERRUPT; |
2056 | ring->irq_get = hsw_vebox_get_irq; | 2083 | ring->irq_get = hsw_vebox_get_irq; |
2057 | ring->irq_put = hsw_vebox_put_irq; | 2084 | ring->irq_put = hsw_vebox_put_irq; |
2085 | ring->dispatch_execbuffer = gen6_ring_dispatch_execbuffer; | ||
2058 | } | 2086 | } |
2059 | ring->sync_to = gen6_ring_sync; | 2087 | ring->sync_to = gen6_ring_sync; |
2060 | ring->semaphore_register[RCS] = MI_SEMAPHORE_SYNC_VER; | 2088 | ring->semaphore_register[RCS] = MI_SEMAPHORE_SYNC_VER; |