Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/i915: Initialize legacy semaphores from engine hw id indexed array

Build the legacy semaphore initialisation array using the engine
hardware ids instead of driver internal ones. This makes the
static array size dependent only on the number of gen6 semaphore
engines.

Also makes the per-engine semaphore wait and signal tables
hardware id indexed saving some more space.

v2: Refactor I915_GEN6_NUM_ENGINES to GEN6_SEMAPHORE_LAST. (Chris Wilson)
v3: More polish. (Chris Wilson)

Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>
Link: http://patchwork.freedesktop.org/patch/msgid/1471363461-9973-1-git-send-email-tvrtko.ursulin@linux.intel.com

+34 -28
+29 -26
drivers/gpu/drm/i915/intel_ringbuffer.c
··· 1337 1337 { 1338 1338 struct intel_ring *ring = req->ring; 1339 1339 struct drm_i915_private *dev_priv = req->i915; 1340 - struct intel_engine_cs *useless; 1341 - enum intel_engine_id id; 1340 + struct intel_engine_cs *engine; 1342 1341 int ret, num_rings; 1343 1342 1344 1343 num_rings = INTEL_INFO(dev_priv)->num_rings; ··· 1345 1346 if (ret) 1346 1347 return ret; 1347 1348 1348 - for_each_engine_id(useless, dev_priv, id) { 1349 - i915_reg_t mbox_reg = req->engine->semaphore.mbox.signal[id]; 1349 + for_each_engine(engine, dev_priv) { 1350 + i915_reg_t mbox_reg; 1350 1351 1352 + if (!(BIT(engine->hw_id) & GEN6_SEMAPHORES_MASK)) 1353 + continue; 1354 + 1355 + mbox_reg = req->engine->semaphore.mbox.signal[engine->hw_id]; 1351 1356 if (i915_mmio_reg_valid(mbox_reg)) { 1352 1357 intel_ring_emit(ring, MI_LOAD_REGISTER_IMM(1)); 1353 1358 intel_ring_emit_reg(ring, mbox_reg); ··· 1498 1495 u32 dw1 = MI_SEMAPHORE_MBOX | 1499 1496 MI_SEMAPHORE_COMPARE | 1500 1497 MI_SEMAPHORE_REGISTER; 1501 - u32 wait_mbox = signal->engine->semaphore.mbox.wait[req->engine->id]; 1498 + u32 wait_mbox = signal->engine->semaphore.mbox.wait[req->engine->hw_id]; 1502 1499 int ret; 1503 1500 1504 1501 WARN_ON(wait_mbox == MI_SEMAPHORE_SYNC_INVALID); ··· 2572 2569 * initialized as INVALID. Gen8 will initialize the 2573 2570 * sema between VCS2 and RCS later. 2574 2571 */ 2575 - for (i = 0; i < I915_NUM_ENGINES; i++) { 2572 + for (i = 0; i < GEN6_NUM_SEMAPHORES; i++) { 2576 2573 static const struct { 2577 2574 u32 wait_mbox; 2578 2575 i915_reg_t mbox_reg; 2579 - } sem_data[I915_NUM_ENGINES][I915_NUM_ENGINES] = { 2580 - [RCS] = { 2581 - [VCS] = { .wait_mbox = MI_SEMAPHORE_SYNC_RV, .mbox_reg = GEN6_VRSYNC }, 2582 - [BCS] = { .wait_mbox = MI_SEMAPHORE_SYNC_RB, .mbox_reg = GEN6_BRSYNC }, 2583 - [VECS] = { .wait_mbox = MI_SEMAPHORE_SYNC_RVE, .mbox_reg = GEN6_VERSYNC }, 2576 + } sem_data[GEN6_NUM_SEMAPHORES][GEN6_NUM_SEMAPHORES] = { 2577 + [RCS_HW] = { 2578 + [VCS_HW] = { .wait_mbox = MI_SEMAPHORE_SYNC_RV, .mbox_reg = GEN6_VRSYNC }, 2579 + [BCS_HW] = { .wait_mbox = MI_SEMAPHORE_SYNC_RB, .mbox_reg = GEN6_BRSYNC }, 2580 + [VECS_HW] = { .wait_mbox = MI_SEMAPHORE_SYNC_RVE, .mbox_reg = GEN6_VERSYNC }, 2584 2581 }, 2585 - [VCS] = { 2586 - [RCS] = { .wait_mbox = MI_SEMAPHORE_SYNC_VR, .mbox_reg = GEN6_RVSYNC }, 2587 - [BCS] = { .wait_mbox = MI_SEMAPHORE_SYNC_VB, .mbox_reg = GEN6_BVSYNC }, 2588 - [VECS] = { .wait_mbox = MI_SEMAPHORE_SYNC_VVE, .mbox_reg = GEN6_VEVSYNC }, 2582 + [VCS_HW] = { 2583 + [RCS_HW] = { .wait_mbox = MI_SEMAPHORE_SYNC_VR, .mbox_reg = GEN6_RVSYNC }, 2584 + [BCS_HW] = { .wait_mbox = MI_SEMAPHORE_SYNC_VB, .mbox_reg = GEN6_BVSYNC }, 2585 + [VECS_HW] = { .wait_mbox = MI_SEMAPHORE_SYNC_VVE, .mbox_reg = GEN6_VEVSYNC }, 2589 2586 }, 2590 - [BCS] = { 2591 - [RCS] = { .wait_mbox = MI_SEMAPHORE_SYNC_BR, .mbox_reg = GEN6_RBSYNC }, 2592 - [VCS] = { .wait_mbox = MI_SEMAPHORE_SYNC_BV, .mbox_reg = GEN6_VBSYNC }, 2593 - [VECS] = { .wait_mbox = MI_SEMAPHORE_SYNC_BVE, .mbox_reg = GEN6_VEBSYNC }, 2587 + [BCS_HW] = { 2588 + [RCS_HW] = { .wait_mbox = MI_SEMAPHORE_SYNC_BR, .mbox_reg = GEN6_RBSYNC }, 2589 + [VCS_HW] = { .wait_mbox = MI_SEMAPHORE_SYNC_BV, .mbox_reg = GEN6_VBSYNC }, 2590 + [VECS_HW] = { .wait_mbox = MI_SEMAPHORE_SYNC_BVE, .mbox_reg = GEN6_VEBSYNC }, 2594 2591 }, 2595 - [VECS] = { 2596 - [RCS] = { .wait_mbox = MI_SEMAPHORE_SYNC_VER, .mbox_reg = GEN6_RVESYNC }, 2597 - [VCS] = { .wait_mbox = MI_SEMAPHORE_SYNC_VEV, .mbox_reg = GEN6_VVESYNC }, 2598 - [BCS] = { .wait_mbox = MI_SEMAPHORE_SYNC_VEB, .mbox_reg = GEN6_BVESYNC }, 2592 + [VECS_HW] = { 2593 + [RCS_HW] = { .wait_mbox = MI_SEMAPHORE_SYNC_VER, .mbox_reg = GEN6_RVESYNC }, 2594 + [VCS_HW] = { .wait_mbox = MI_SEMAPHORE_SYNC_VEV, .mbox_reg = GEN6_VVESYNC }, 2595 + [BCS_HW] = { .wait_mbox = MI_SEMAPHORE_SYNC_VEB, .mbox_reg = GEN6_BVESYNC }, 2599 2596 }, 2600 2597 }; 2601 2598 u32 wait_mbox; 2602 2599 i915_reg_t mbox_reg; 2603 2600 2604 - if (i == engine->id || i == VCS2) { 2601 + if (i == engine->hw_id) { 2605 2602 wait_mbox = MI_SEMAPHORE_SYNC_INVALID; 2606 2603 mbox_reg = GEN6_NOSYNC; 2607 2604 } else { 2608 - wait_mbox = sem_data[engine->id][i].wait_mbox; 2609 - mbox_reg = sem_data[engine->id][i].mbox_reg; 2605 + wait_mbox = sem_data[engine->hw_id][i].wait_mbox; 2606 + mbox_reg = sem_data[engine->hw_id][i].mbox_reg; 2610 2607 } 2611 2608 2612 2609 engine->semaphore.mbox.wait[i] = wait_mbox;
+5 -2
drivers/gpu/drm/i915/intel_ringbuffer.h
··· 278 278 u32 sync_seqno[I915_NUM_ENGINES-1]; 279 279 280 280 union { 281 + #define GEN6_SEMAPHORE_LAST VECS_HW 282 + #define GEN6_NUM_SEMAPHORES (GEN6_SEMAPHORE_LAST + 1) 283 + #define GEN6_SEMAPHORES_MASK GENMASK(GEN6_SEMAPHORE_LAST, 0) 281 284 struct { 282 285 /* our mbox written by others */ 283 - u32 wait[I915_NUM_ENGINES]; 286 + u32 wait[GEN6_NUM_SEMAPHORES]; 284 287 /* mboxes this ring signals to */ 285 - i915_reg_t signal[I915_NUM_ENGINES]; 288 + i915_reg_t signal[GEN6_NUM_SEMAPHORES]; 286 289 } mbox; 287 290 u64 signal_ggtt[I915_NUM_ENGINES]; 288 291 };