diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/gpu/drm/i915/i915_drv.c | 4 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/i915_drv.h | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/i915_gem.c | 9 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/i915_gpu_error.c | 1 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/i915_reg.h | 1 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_ringbuffer.c | 78 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_ringbuffer.h | 4 |
7 files changed, 95 insertions, 4 deletions
diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c index 9f47aab7915f..743cddec9a18 100644 --- a/drivers/gpu/drm/i915/i915_drv.c +++ b/drivers/gpu/drm/i915/i915_drv.c | |||
@@ -282,7 +282,7 @@ static const struct intel_device_info intel_broadwell_m_info = { | |||
282 | static const struct intel_device_info intel_broadwell_gt3d_info = { | 282 | static const struct intel_device_info intel_broadwell_gt3d_info = { |
283 | .gen = 8, .num_pipes = 3, | 283 | .gen = 8, .num_pipes = 3, |
284 | .need_gfx_hws = 1, .has_hotplug = 1, | 284 | .need_gfx_hws = 1, .has_hotplug = 1, |
285 | .ring_mask = RENDER_RING | BSD_RING | BLT_RING | VEBOX_RING, | 285 | .ring_mask = RENDER_RING | BSD_RING | BLT_RING | VEBOX_RING | BSD2_RING, |
286 | .has_llc = 1, | 286 | .has_llc = 1, |
287 | .has_ddi = 1, | 287 | .has_ddi = 1, |
288 | .has_fbc = 1, | 288 | .has_fbc = 1, |
@@ -292,7 +292,7 @@ static const struct intel_device_info intel_broadwell_gt3d_info = { | |||
292 | static const struct intel_device_info intel_broadwell_gt3m_info = { | 292 | static const struct intel_device_info intel_broadwell_gt3m_info = { |
293 | .gen = 8, .is_mobile = 1, .num_pipes = 3, | 293 | .gen = 8, .is_mobile = 1, .num_pipes = 3, |
294 | .need_gfx_hws = 1, .has_hotplug = 1, | 294 | .need_gfx_hws = 1, .has_hotplug = 1, |
295 | .ring_mask = RENDER_RING | BSD_RING | BLT_RING | VEBOX_RING, | 295 | .ring_mask = RENDER_RING | BSD_RING | BLT_RING | VEBOX_RING | BSD2_RING, |
296 | .has_llc = 1, | 296 | .has_llc = 1, |
297 | .has_ddi = 1, | 297 | .has_ddi = 1, |
298 | .has_fbc = 1, | 298 | .has_fbc = 1, |
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index 7d6acb401fd9..5411079b2697 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h | |||
@@ -1834,7 +1834,9 @@ struct drm_i915_cmd_table { | |||
1834 | #define BSD_RING (1<<VCS) | 1834 | #define BSD_RING (1<<VCS) |
1835 | #define BLT_RING (1<<BCS) | 1835 | #define BLT_RING (1<<BCS) |
1836 | #define VEBOX_RING (1<<VECS) | 1836 | #define VEBOX_RING (1<<VECS) |
1837 | #define BSD2_RING (1<<VCS2) | ||
1837 | #define HAS_BSD(dev) (INTEL_INFO(dev)->ring_mask & BSD_RING) | 1838 | #define HAS_BSD(dev) (INTEL_INFO(dev)->ring_mask & BSD_RING) |
1839 | #define HAS_BSD2(dev) (INTEL_INFO(dev)->ring_mask & BSD2_RING) | ||
1838 | #define HAS_BLT(dev) (INTEL_INFO(dev)->ring_mask & BLT_RING) | 1840 | #define HAS_BLT(dev) (INTEL_INFO(dev)->ring_mask & BLT_RING) |
1839 | #define HAS_VEBOX(dev) (INTEL_INFO(dev)->ring_mask & VEBOX_RING) | 1841 | #define HAS_VEBOX(dev) (INTEL_INFO(dev)->ring_mask & VEBOX_RING) |
1840 | #define HAS_LLC(dev) (INTEL_INFO(dev)->has_llc) | 1842 | #define HAS_LLC(dev) (INTEL_INFO(dev)->has_llc) |
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index 89dbb1bb43e2..7057eab3ccfa 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c | |||
@@ -4388,13 +4388,20 @@ static int i915_gem_init_rings(struct drm_device *dev) | |||
4388 | goto cleanup_blt_ring; | 4388 | goto cleanup_blt_ring; |
4389 | } | 4389 | } |
4390 | 4390 | ||
4391 | if (HAS_BSD2(dev)) { | ||
4392 | ret = intel_init_bsd2_ring_buffer(dev); | ||
4393 | if (ret) | ||
4394 | goto cleanup_vebox_ring; | ||
4395 | } | ||
4391 | 4396 | ||
4392 | ret = i915_gem_set_seqno(dev, ((u32)~0 - 0x1000)); | 4397 | ret = i915_gem_set_seqno(dev, ((u32)~0 - 0x1000)); |
4393 | if (ret) | 4398 | if (ret) |
4394 | goto cleanup_vebox_ring; | 4399 | goto cleanup_bsd2_ring; |
4395 | 4400 | ||
4396 | return 0; | 4401 | return 0; |
4397 | 4402 | ||
4403 | cleanup_bsd2_ring: | ||
4404 | intel_cleanup_ring_buffer(&dev_priv->ring[VCS2]); | ||
4398 | cleanup_vebox_ring: | 4405 | cleanup_vebox_ring: |
4399 | intel_cleanup_ring_buffer(&dev_priv->ring[VECS]); | 4406 | intel_cleanup_ring_buffer(&dev_priv->ring[VECS]); |
4400 | cleanup_blt_ring: | 4407 | cleanup_blt_ring: |
diff --git a/drivers/gpu/drm/i915/i915_gpu_error.c b/drivers/gpu/drm/i915/i915_gpu_error.c index 4865ade71f29..282164c7a02d 100644 --- a/drivers/gpu/drm/i915/i915_gpu_error.c +++ b/drivers/gpu/drm/i915/i915_gpu_error.c | |||
@@ -42,6 +42,7 @@ static const char *ring_str(int ring) | |||
42 | case VCS: return "bsd"; | 42 | case VCS: return "bsd"; |
43 | case BCS: return "blt"; | 43 | case BCS: return "blt"; |
44 | case VECS: return "vebox"; | 44 | case VECS: return "vebox"; |
45 | case VCS2: return "bsd2"; | ||
45 | default: return ""; | 46 | default: return ""; |
46 | } | 47 | } |
47 | } | 48 | } |
diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h index 8f845556503e..0b8850816379 100644 --- a/drivers/gpu/drm/i915/i915_reg.h +++ b/drivers/gpu/drm/i915/i915_reg.h | |||
@@ -760,6 +760,7 @@ enum punit_power_well { | |||
760 | #define RENDER_RING_BASE 0x02000 | 760 | #define RENDER_RING_BASE 0x02000 |
761 | #define BSD_RING_BASE 0x04000 | 761 | #define BSD_RING_BASE 0x04000 |
762 | #define GEN6_BSD_RING_BASE 0x12000 | 762 | #define GEN6_BSD_RING_BASE 0x12000 |
763 | #define GEN8_BSD2_RING_BASE 0x1c000 | ||
763 | #define VEBOX_RING_BASE 0x1a000 | 764 | #define VEBOX_RING_BASE 0x1a000 |
764 | #define BLT_RING_BASE 0x22000 | 765 | #define BLT_RING_BASE 0x22000 |
765 | #define RING_TAIL(base) ((base)+0x30) | 766 | #define RING_TAIL(base) ((base)+0x30) |
diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.c b/drivers/gpu/drm/i915/intel_ringbuffer.c index 8a2bd5a7ea9f..ffb013dc910e 100644 --- a/drivers/gpu/drm/i915/intel_ringbuffer.c +++ b/drivers/gpu/drm/i915/intel_ringbuffer.c | |||
@@ -1917,14 +1917,22 @@ int intel_init_render_ring_buffer(struct drm_device *dev) | |||
1917 | ring->get_seqno = gen6_ring_get_seqno; | 1917 | ring->get_seqno = gen6_ring_get_seqno; |
1918 | ring->set_seqno = ring_set_seqno; | 1918 | ring->set_seqno = ring_set_seqno; |
1919 | ring->sync_to = gen6_ring_sync; | 1919 | ring->sync_to = gen6_ring_sync; |
1920 | /* | ||
1921 | * The current semaphore is only applied on pre-gen8 platform. | ||
1922 | * And there is no VCS2 ring on the pre-gen8 platform. So the | ||
1923 | * semaphore between RCS and VCS2 is initialized as INVALID. | ||
1924 | * Gen8 will initialize the sema between VCS2 and RCS later. | ||
1925 | */ | ||
1920 | ring->semaphore_register[RCS] = MI_SEMAPHORE_SYNC_INVALID; | 1926 | ring->semaphore_register[RCS] = MI_SEMAPHORE_SYNC_INVALID; |
1921 | ring->semaphore_register[VCS] = MI_SEMAPHORE_SYNC_RV; | 1927 | ring->semaphore_register[VCS] = MI_SEMAPHORE_SYNC_RV; |
1922 | ring->semaphore_register[BCS] = MI_SEMAPHORE_SYNC_RB; | 1928 | ring->semaphore_register[BCS] = MI_SEMAPHORE_SYNC_RB; |
1923 | ring->semaphore_register[VECS] = MI_SEMAPHORE_SYNC_RVE; | 1929 | ring->semaphore_register[VECS] = MI_SEMAPHORE_SYNC_RVE; |
1930 | ring->semaphore_register[VCS2] = MI_SEMAPHORE_SYNC_INVALID; | ||
1924 | ring->signal_mbox[RCS] = GEN6_NOSYNC; | 1931 | ring->signal_mbox[RCS] = GEN6_NOSYNC; |
1925 | ring->signal_mbox[VCS] = GEN6_VRSYNC; | 1932 | ring->signal_mbox[VCS] = GEN6_VRSYNC; |
1926 | ring->signal_mbox[BCS] = GEN6_BRSYNC; | 1933 | ring->signal_mbox[BCS] = GEN6_BRSYNC; |
1927 | ring->signal_mbox[VECS] = GEN6_VERSYNC; | 1934 | ring->signal_mbox[VECS] = GEN6_VERSYNC; |
1935 | ring->signal_mbox[VCS2] = GEN6_NOSYNC; | ||
1928 | } else if (IS_GEN5(dev)) { | 1936 | } else if (IS_GEN5(dev)) { |
1929 | ring->add_request = pc_render_add_request; | 1937 | ring->add_request = pc_render_add_request; |
1930 | ring->flush = gen4_render_ring_flush; | 1938 | ring->flush = gen4_render_ring_flush; |
@@ -2093,14 +2101,22 @@ int intel_init_bsd_ring_buffer(struct drm_device *dev) | |||
2093 | gen6_ring_dispatch_execbuffer; | 2101 | gen6_ring_dispatch_execbuffer; |
2094 | } | 2102 | } |
2095 | ring->sync_to = gen6_ring_sync; | 2103 | ring->sync_to = gen6_ring_sync; |
2104 | /* | ||
2105 | * The current semaphore is only applied on pre-gen8 platform. | ||
2106 | * And there is no VCS2 ring on the pre-gen8 platform. So the | ||
2107 | * semaphore between VCS and VCS2 is initialized as INVALID. | ||
2108 | * Gen8 will initialize the sema between VCS2 and VCS later. | ||
2109 | */ | ||
2096 | ring->semaphore_register[RCS] = MI_SEMAPHORE_SYNC_VR; | 2110 | ring->semaphore_register[RCS] = MI_SEMAPHORE_SYNC_VR; |
2097 | ring->semaphore_register[VCS] = MI_SEMAPHORE_SYNC_INVALID; | 2111 | ring->semaphore_register[VCS] = MI_SEMAPHORE_SYNC_INVALID; |
2098 | ring->semaphore_register[BCS] = MI_SEMAPHORE_SYNC_VB; | 2112 | ring->semaphore_register[BCS] = MI_SEMAPHORE_SYNC_VB; |
2099 | ring->semaphore_register[VECS] = MI_SEMAPHORE_SYNC_VVE; | 2113 | ring->semaphore_register[VECS] = MI_SEMAPHORE_SYNC_VVE; |
2114 | ring->semaphore_register[VCS2] = MI_SEMAPHORE_SYNC_INVALID; | ||
2100 | ring->signal_mbox[RCS] = GEN6_RVSYNC; | 2115 | ring->signal_mbox[RCS] = GEN6_RVSYNC; |
2101 | ring->signal_mbox[VCS] = GEN6_NOSYNC; | 2116 | ring->signal_mbox[VCS] = GEN6_NOSYNC; |
2102 | ring->signal_mbox[BCS] = GEN6_BVSYNC; | 2117 | ring->signal_mbox[BCS] = GEN6_BVSYNC; |
2103 | ring->signal_mbox[VECS] = GEN6_VEVSYNC; | 2118 | ring->signal_mbox[VECS] = GEN6_VEVSYNC; |
2119 | ring->signal_mbox[VCS2] = GEN6_NOSYNC; | ||
2104 | } else { | 2120 | } else { |
2105 | ring->mmio_base = BSD_RING_BASE; | 2121 | ring->mmio_base = BSD_RING_BASE; |
2106 | ring->flush = bsd_ring_flush; | 2122 | ring->flush = bsd_ring_flush; |
@@ -2123,6 +2139,58 @@ int intel_init_bsd_ring_buffer(struct drm_device *dev) | |||
2123 | return intel_init_ring_buffer(dev, ring); | 2139 | return intel_init_ring_buffer(dev, ring); |
2124 | } | 2140 | } |
2125 | 2141 | ||
2142 | /** | ||
2143 | * Initialize the second BSD ring for Broadwell GT3. | ||
2144 | * It is noted that this only exists on Broadwell GT3. | ||
2145 | */ | ||
2146 | int intel_init_bsd2_ring_buffer(struct drm_device *dev) | ||
2147 | { | ||
2148 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
2149 | struct intel_ring_buffer *ring = &dev_priv->ring[VCS2]; | ||
2150 | |||
2151 | if ((INTEL_INFO(dev)->gen != 8)) { | ||
2152 | DRM_ERROR("No dual-BSD ring on non-BDW machine\n"); | ||
2153 | return -EINVAL; | ||
2154 | } | ||
2155 | |||
2156 | ring->name = "bds2_ring"; | ||
2157 | ring->id = VCS2; | ||
2158 | |||
2159 | ring->write_tail = ring_write_tail; | ||
2160 | ring->mmio_base = GEN8_BSD2_RING_BASE; | ||
2161 | ring->flush = gen6_bsd_ring_flush; | ||
2162 | ring->add_request = gen6_add_request; | ||
2163 | ring->get_seqno = gen6_ring_get_seqno; | ||
2164 | ring->set_seqno = ring_set_seqno; | ||
2165 | ring->irq_enable_mask = | ||
2166 | GT_RENDER_USER_INTERRUPT << GEN8_VCS2_IRQ_SHIFT; | ||
2167 | ring->irq_get = gen8_ring_get_irq; | ||
2168 | ring->irq_put = gen8_ring_put_irq; | ||
2169 | ring->dispatch_execbuffer = | ||
2170 | gen8_ring_dispatch_execbuffer; | ||
2171 | ring->sync_to = gen6_ring_sync; | ||
2172 | /* | ||
2173 | * The current semaphore is only applied on the pre-gen8. And there | ||
2174 | * is no bsd2 ring on the pre-gen8. So now the semaphore_register | ||
2175 | * between VCS2 and other ring is initialized as invalid. | ||
2176 | * Gen8 will initialize the sema between VCS2 and other ring later. | ||
2177 | */ | ||
2178 | ring->semaphore_register[RCS] = MI_SEMAPHORE_SYNC_INVALID; | ||
2179 | ring->semaphore_register[VCS] = MI_SEMAPHORE_SYNC_INVALID; | ||
2180 | ring->semaphore_register[BCS] = MI_SEMAPHORE_SYNC_INVALID; | ||
2181 | ring->semaphore_register[VECS] = MI_SEMAPHORE_SYNC_INVALID; | ||
2182 | ring->semaphore_register[VCS2] = MI_SEMAPHORE_SYNC_INVALID; | ||
2183 | ring->signal_mbox[RCS] = GEN6_NOSYNC; | ||
2184 | ring->signal_mbox[VCS] = GEN6_NOSYNC; | ||
2185 | ring->signal_mbox[BCS] = GEN6_NOSYNC; | ||
2186 | ring->signal_mbox[VECS] = GEN6_NOSYNC; | ||
2187 | ring->signal_mbox[VCS2] = GEN6_NOSYNC; | ||
2188 | |||
2189 | ring->init = init_ring_common; | ||
2190 | |||
2191 | return intel_init_ring_buffer(dev, ring); | ||
2192 | } | ||
2193 | |||
2126 | int intel_init_blt_ring_buffer(struct drm_device *dev) | 2194 | int intel_init_blt_ring_buffer(struct drm_device *dev) |
2127 | { | 2195 | { |
2128 | struct drm_i915_private *dev_priv = dev->dev_private; | 2196 | struct drm_i915_private *dev_priv = dev->dev_private; |
@@ -2150,14 +2218,22 @@ int intel_init_blt_ring_buffer(struct drm_device *dev) | |||
2150 | ring->dispatch_execbuffer = gen6_ring_dispatch_execbuffer; | 2218 | ring->dispatch_execbuffer = gen6_ring_dispatch_execbuffer; |
2151 | } | 2219 | } |
2152 | ring->sync_to = gen6_ring_sync; | 2220 | ring->sync_to = gen6_ring_sync; |
2221 | /* | ||
2222 | * The current semaphore is only applied on pre-gen8 platform. And | ||
2223 | * there is no VCS2 ring on the pre-gen8 platform. So the semaphore | ||
2224 | * between BCS and VCS2 is initialized as INVALID. | ||
2225 | * Gen8 will initialize the sema between BCS and VCS2 later. | ||
2226 | */ | ||
2153 | ring->semaphore_register[RCS] = MI_SEMAPHORE_SYNC_BR; | 2227 | ring->semaphore_register[RCS] = MI_SEMAPHORE_SYNC_BR; |
2154 | ring->semaphore_register[VCS] = MI_SEMAPHORE_SYNC_BV; | 2228 | ring->semaphore_register[VCS] = MI_SEMAPHORE_SYNC_BV; |
2155 | ring->semaphore_register[BCS] = MI_SEMAPHORE_SYNC_INVALID; | 2229 | ring->semaphore_register[BCS] = MI_SEMAPHORE_SYNC_INVALID; |
2156 | ring->semaphore_register[VECS] = MI_SEMAPHORE_SYNC_BVE; | 2230 | ring->semaphore_register[VECS] = MI_SEMAPHORE_SYNC_BVE; |
2231 | ring->semaphore_register[VCS2] = MI_SEMAPHORE_SYNC_INVALID; | ||
2157 | ring->signal_mbox[RCS] = GEN6_RBSYNC; | 2232 | ring->signal_mbox[RCS] = GEN6_RBSYNC; |
2158 | ring->signal_mbox[VCS] = GEN6_VBSYNC; | 2233 | ring->signal_mbox[VCS] = GEN6_VBSYNC; |
2159 | ring->signal_mbox[BCS] = GEN6_NOSYNC; | 2234 | ring->signal_mbox[BCS] = GEN6_NOSYNC; |
2160 | ring->signal_mbox[VECS] = GEN6_VEBSYNC; | 2235 | ring->signal_mbox[VECS] = GEN6_VEBSYNC; |
2236 | ring->signal_mbox[VCS2] = GEN6_NOSYNC; | ||
2161 | ring->init = init_ring_common; | 2237 | ring->init = init_ring_common; |
2162 | 2238 | ||
2163 | return intel_init_ring_buffer(dev, ring); | 2239 | return intel_init_ring_buffer(dev, ring); |
@@ -2195,10 +2271,12 @@ int intel_init_vebox_ring_buffer(struct drm_device *dev) | |||
2195 | ring->semaphore_register[VCS] = MI_SEMAPHORE_SYNC_VEV; | 2271 | ring->semaphore_register[VCS] = MI_SEMAPHORE_SYNC_VEV; |
2196 | ring->semaphore_register[BCS] = MI_SEMAPHORE_SYNC_VEB; | 2272 | ring->semaphore_register[BCS] = MI_SEMAPHORE_SYNC_VEB; |
2197 | ring->semaphore_register[VECS] = MI_SEMAPHORE_SYNC_INVALID; | 2273 | ring->semaphore_register[VECS] = MI_SEMAPHORE_SYNC_INVALID; |
2274 | ring->semaphore_register[VCS2] = MI_SEMAPHORE_SYNC_INVALID; | ||
2198 | ring->signal_mbox[RCS] = GEN6_RVESYNC; | 2275 | ring->signal_mbox[RCS] = GEN6_RVESYNC; |
2199 | ring->signal_mbox[VCS] = GEN6_VVESYNC; | 2276 | ring->signal_mbox[VCS] = GEN6_VVESYNC; |
2200 | ring->signal_mbox[BCS] = GEN6_BVESYNC; | 2277 | ring->signal_mbox[BCS] = GEN6_BVESYNC; |
2201 | ring->signal_mbox[VECS] = GEN6_NOSYNC; | 2278 | ring->signal_mbox[VECS] = GEN6_NOSYNC; |
2279 | ring->signal_mbox[VCS2] = GEN6_NOSYNC; | ||
2202 | ring->init = init_ring_common; | 2280 | ring->init = init_ring_common; |
2203 | 2281 | ||
2204 | return intel_init_ring_buffer(dev, ring); | 2282 | return intel_init_ring_buffer(dev, ring); |
diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.h b/drivers/gpu/drm/i915/intel_ringbuffer.h index 7c0eb33d5027..13e398f17fb2 100644 --- a/drivers/gpu/drm/i915/intel_ringbuffer.h +++ b/drivers/gpu/drm/i915/intel_ringbuffer.h | |||
@@ -61,8 +61,9 @@ struct intel_ring_buffer { | |||
61 | VCS, | 61 | VCS, |
62 | BCS, | 62 | BCS, |
63 | VECS, | 63 | VECS, |
64 | VCS2 | ||
64 | } id; | 65 | } id; |
65 | #define I915_NUM_RINGS 4 | 66 | #define I915_NUM_RINGS 5 |
66 | #define LAST_USER_RING (VECS + 1) | 67 | #define LAST_USER_RING (VECS + 1) |
67 | u32 mmio_base; | 68 | u32 mmio_base; |
68 | void __iomem *virtual_start; | 69 | void __iomem *virtual_start; |
@@ -288,6 +289,7 @@ int intel_ring_invalidate_all_caches(struct intel_ring_buffer *ring); | |||
288 | 289 | ||
289 | int intel_init_render_ring_buffer(struct drm_device *dev); | 290 | int intel_init_render_ring_buffer(struct drm_device *dev); |
290 | int intel_init_bsd_ring_buffer(struct drm_device *dev); | 291 | int intel_init_bsd_ring_buffer(struct drm_device *dev); |
292 | int intel_init_bsd2_ring_buffer(struct drm_device *dev); | ||
291 | int intel_init_blt_ring_buffer(struct drm_device *dev); | 293 | int intel_init_blt_ring_buffer(struct drm_device *dev); |
292 | int intel_init_vebox_ring_buffer(struct drm_device *dev); | 294 | int intel_init_vebox_ring_buffer(struct drm_device *dev); |
293 | 295 | ||