aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorZhao Yakui <yakui.zhao@intel.com>2014-04-16 22:37:37 -0400
committerDaniel Vetter <daniel.vetter@ffwll.ch>2014-05-05 03:08:46 -0400
commit845f74a701541662bf7d4880a0f4d492b28f2d18 (patch)
tree3eedda3b84166f28ec069797670a8f6452c77933
parentb1a93306ed2686a7064ed54f99203b6db852ca27 (diff)
drm/i915:Initialize the second BSD ring on BDW GT3 machine
Based on the hardware spec, the BDW GT3 machine has two independent BSD ring that can be used to dispatch the video commands. So just initialize it. V3->V4: Follow Imre's comment to do some minor updates. For example: more comments are added to describe the semaphore between ring. Reviewed-by: Imre Deak <imre.deak@intel.com> Signed-off-by: Zhao Yakui <yakui.zhao@intel.com> [danvet: Fix up checkpatch error.] Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
-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