aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu')
-rw-r--r--drivers/gpu/drm/i915/i915_drv.c4
-rw-r--r--drivers/gpu/drm/i915/i915_drv.h2
-rw-r--r--drivers/gpu/drm/i915/i915_gem.c9
-rw-r--r--drivers/gpu/drm/i915/i915_gpu_error.c1
-rw-r--r--drivers/gpu/drm/i915/i915_reg.h1
-rw-r--r--drivers/gpu/drm/i915/intel_ringbuffer.c78
-rw-r--r--drivers/gpu/drm/i915/intel_ringbuffer.h4
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 = {
282static const struct intel_device_info intel_broadwell_gt3d_info = { 282static 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 = {
292static const struct intel_device_info intel_broadwell_gt3m_info = { 292static 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
4403cleanup_bsd2_ring:
4404 intel_cleanup_ring_buffer(&dev_priv->ring[VCS2]);
4398cleanup_vebox_ring: 4405cleanup_vebox_ring:
4399 intel_cleanup_ring_buffer(&dev_priv->ring[VECS]); 4406 intel_cleanup_ring_buffer(&dev_priv->ring[VECS]);
4400cleanup_blt_ring: 4407cleanup_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 */
2146int 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
2126int intel_init_blt_ring_buffer(struct drm_device *dev) 2194int 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
289int intel_init_render_ring_buffer(struct drm_device *dev); 290int intel_init_render_ring_buffer(struct drm_device *dev);
290int intel_init_bsd_ring_buffer(struct drm_device *dev); 291int intel_init_bsd_ring_buffer(struct drm_device *dev);
292int intel_init_bsd2_ring_buffer(struct drm_device *dev);
291int intel_init_blt_ring_buffer(struct drm_device *dev); 293int intel_init_blt_ring_buffer(struct drm_device *dev);
292int intel_init_vebox_ring_buffer(struct drm_device *dev); 294int intel_init_vebox_ring_buffer(struct drm_device *dev);
293 295