Rev 6660 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 6660 | Rev 6937 | ||
---|---|---|---|
Line 132... | Line 132... | ||
132 | * |
132 | * |
133 | */ |
133 | */ |
Line 134... | Line 134... | ||
134 | 134 | ||
135 | #include |
135 | #include |
136 | #include |
136 | #include |
137 | #include "intel_drv.h" |
137 | #include "i915_drv.h" |
Line 138... | Line 138... | ||
138 | #include "intel_mocs.h" |
138 | #include "intel_mocs.h" |
139 | 139 | ||
140 | #define GEN9_LR_CONTEXT_RENDER_SIZE (22 * PAGE_SIZE) |
140 | #define GEN9_LR_CONTEXT_RENDER_SIZE (22 * PAGE_SIZE) |
Line 188... | Line 188... | ||
188 | #define GEN8_CTX_FORCE_PD_RESTORE (1<<1) |
188 | #define GEN8_CTX_FORCE_PD_RESTORE (1<<1) |
189 | #define GEN8_CTX_FORCE_RESTORE (1<<2) |
189 | #define GEN8_CTX_FORCE_RESTORE (1<<2) |
190 | #define GEN8_CTX_L3LLC_COHERENT (1<<5) |
190 | #define GEN8_CTX_L3LLC_COHERENT (1<<5) |
191 | #define GEN8_CTX_PRIVILEGE (1<<8) |
191 | #define GEN8_CTX_PRIVILEGE (1<<8) |
Line -... | Line 192... | ||
- | 192 | ||
- | 193 | #define ASSIGN_CTX_REG(reg_state, pos, reg, val) do { \ |
|
- | 194 | (reg_state)[(pos)+0] = i915_mmio_reg_offset(reg); \ |
|
- | 195 | (reg_state)[(pos)+1] = (val); \ |
|
- | 196 | } while (0) |
|
192 | 197 | ||
193 | #define ASSIGN_CTX_PDP(ppgtt, reg_state, n) { \ |
198 | #define ASSIGN_CTX_PDP(ppgtt, reg_state, n) do { \ |
194 | const u64 _addr = i915_page_dir_dma_addr((ppgtt), (n)); \ |
199 | const u64 _addr = i915_page_dir_dma_addr((ppgtt), (n)); \ |
195 | reg_state[CTX_PDP ## n ## _UDW+1] = upper_32_bits(_addr); \ |
200 | reg_state[CTX_PDP ## n ## _UDW+1] = upper_32_bits(_addr); \ |
196 | reg_state[CTX_PDP ## n ## _LDW+1] = lower_32_bits(_addr); \ |
201 | reg_state[CTX_PDP ## n ## _LDW+1] = lower_32_bits(_addr); \ |
Line 197... | Line 202... | ||
197 | } |
202 | } while (0) |
198 | 203 | ||
199 | #define ASSIGN_CTX_PML4(ppgtt, reg_state) { \ |
204 | #define ASSIGN_CTX_PML4(ppgtt, reg_state) do { \ |
200 | reg_state[CTX_PDP0_UDW + 1] = upper_32_bits(px_dma(&ppgtt->pml4)); \ |
205 | reg_state[CTX_PDP0_UDW + 1] = upper_32_bits(px_dma(&ppgtt->pml4)); \ |
Line 201... | Line 206... | ||
201 | reg_state[CTX_PDP0_LDW + 1] = lower_32_bits(px_dma(&ppgtt->pml4)); \ |
206 | reg_state[CTX_PDP0_LDW + 1] = lower_32_bits(px_dma(&ppgtt->pml4)); \ |
202 | } |
207 | } while (0) |
203 | 208 | ||
204 | enum { |
209 | enum { |
Line 282... | Line 287... | ||
282 | 287 | ||
283 | static bool disable_lite_restore_wa(struct intel_engine_cs *ring) |
288 | static bool disable_lite_restore_wa(struct intel_engine_cs *ring) |
284 | { |
289 | { |
Line 285... | Line 290... | ||
285 | struct drm_device *dev = ring->dev; |
290 | struct drm_device *dev = ring->dev; |
286 | 291 | ||
287 | return ((IS_SKYLAKE(dev) && INTEL_REVID(dev) <= SKL_REVID_B0) || |
292 | return (IS_SKL_REVID(dev, 0, SKL_REVID_B0) || |
288 | (IS_BROXTON(dev) && INTEL_REVID(dev) == BXT_REVID_A0)) && |
293 | IS_BXT_REVID(dev, 0, BXT_REVID_A1)) && |
Line 289... | Line 294... | ||
289 | (ring->id == VCS || ring->id == VCS2); |
294 | (ring->id == VCS || ring->id == VCS2); |
290 | } |
295 | } |
Line 365... | Line 370... | ||
365 | 370 | ||
366 | BUG_ON(!ctx_obj); |
371 | BUG_ON(!ctx_obj); |
367 | WARN_ON(!i915_gem_obj_is_pinned(ctx_obj)); |
372 | WARN_ON(!i915_gem_obj_is_pinned(ctx_obj)); |
Line 368... | Line 373... | ||
368 | WARN_ON(!i915_gem_obj_is_pinned(rb_obj)); |
373 | WARN_ON(!i915_gem_obj_is_pinned(rb_obj)); |
369 | 374 | ||
Line 370... | Line 375... | ||
370 | page = i915_gem_object_get_page(ctx_obj, LRC_STATE_PN); |
375 | page = i915_gem_object_get_dirty_page(ctx_obj, LRC_STATE_PN); |
371 | reg_state = kmap_atomic(page); |
376 | reg_state = kmap_atomic(page); |
Line 919... | Line 924... | ||
919 | if (ret) |
924 | if (ret) |
920 | return ret; |
925 | return ret; |
Line 921... | Line 926... | ||
921 | 926 | ||
922 | intel_logical_ring_emit(ringbuf, MI_NOOP); |
927 | intel_logical_ring_emit(ringbuf, MI_NOOP); |
923 | intel_logical_ring_emit(ringbuf, MI_LOAD_REGISTER_IMM(1)); |
928 | intel_logical_ring_emit(ringbuf, MI_LOAD_REGISTER_IMM(1)); |
924 | intel_logical_ring_emit(ringbuf, INSTPM); |
929 | intel_logical_ring_emit_reg(ringbuf, INSTPM); |
925 | intel_logical_ring_emit(ringbuf, instp_mask << 16 | instp_mode); |
930 | intel_logical_ring_emit(ringbuf, instp_mask << 16 | instp_mode); |
Line 926... | Line 931... | ||
926 | intel_logical_ring_advance(ringbuf); |
931 | intel_logical_ring_advance(ringbuf); |
927 | 932 | ||
Line 1094... | Line 1099... | ||
1094 | if (ret) |
1099 | if (ret) |
1095 | return ret; |
1100 | return ret; |
Line 1096... | Line 1101... | ||
1096 | 1101 | ||
1097 | intel_logical_ring_emit(ringbuf, MI_LOAD_REGISTER_IMM(w->count)); |
1102 | intel_logical_ring_emit(ringbuf, MI_LOAD_REGISTER_IMM(w->count)); |
1098 | for (i = 0; i < w->count; i++) { |
1103 | for (i = 0; i < w->count; i++) { |
1099 | intel_logical_ring_emit(ringbuf, w->reg[i].addr); |
1104 | intel_logical_ring_emit_reg(ringbuf, w->reg[i].addr); |
1100 | intel_logical_ring_emit(ringbuf, w->reg[i].value); |
1105 | intel_logical_ring_emit(ringbuf, w->reg[i].value); |
1101 | } |
1106 | } |
Line 1102... | Line 1107... | ||
1102 | intel_logical_ring_emit(ringbuf, MI_NOOP); |
1107 | intel_logical_ring_emit(ringbuf, MI_NOOP); |
Line 1118... | Line 1123... | ||
1118 | return -ENOSPC; \ |
1123 | return -ENOSPC; \ |
1119 | } \ |
1124 | } \ |
1120 | batch[__index] = (cmd); \ |
1125 | batch[__index] = (cmd); \ |
1121 | } while (0) |
1126 | } while (0) |
Line -... | Line 1127... | ||
- | 1127 | ||
- | 1128 | #define wa_ctx_emit_reg(batch, index, reg) \ |
|
Line 1122... | Line 1129... | ||
1122 | 1129 | wa_ctx_emit((batch), (index), i915_mmio_reg_offset(reg)) |
|
1123 | 1130 | ||
1124 | /* |
1131 | /* |
1125 | * In this WA we need to set GEN8_L3SQCREG4[21:21] and reset it after |
1132 | * In this WA we need to set GEN8_L3SQCREG4[21:21] and reset it after |
Line 1147... | Line 1154... | ||
1147 | * WaDisableLSQCROPERFforOCL:skl |
1154 | * WaDisableLSQCROPERFforOCL:skl |
1148 | * This WA is implemented in skl_init_clock_gating() but since |
1155 | * This WA is implemented in skl_init_clock_gating() but since |
1149 | * this batch updates GEN8_L3SQCREG4 with default value we need to |
1156 | * this batch updates GEN8_L3SQCREG4 with default value we need to |
1150 | * set this bit here to retain the WA during flush. |
1157 | * set this bit here to retain the WA during flush. |
1151 | */ |
1158 | */ |
1152 | if (IS_SKYLAKE(ring->dev) && INTEL_REVID(ring->dev) <= SKL_REVID_E0) |
1159 | if (IS_SKL_REVID(ring->dev, 0, SKL_REVID_E0)) |
1153 | l3sqc4_flush |= GEN8_LQSC_RO_PERF_DIS; |
1160 | l3sqc4_flush |= GEN8_LQSC_RO_PERF_DIS; |
Line 1154... | Line 1161... | ||
1154 | 1161 | ||
1155 | wa_ctx_emit(batch, index, (MI_STORE_REGISTER_MEM_GEN8 | |
1162 | wa_ctx_emit(batch, index, (MI_STORE_REGISTER_MEM_GEN8 | |
1156 | MI_SRM_LRM_GLOBAL_GTT)); |
1163 | MI_SRM_LRM_GLOBAL_GTT)); |
1157 | wa_ctx_emit(batch, index, GEN8_L3SQCREG4); |
1164 | wa_ctx_emit_reg(batch, index, GEN8_L3SQCREG4); |
1158 | wa_ctx_emit(batch, index, ring->scratch.gtt_offset + 256); |
1165 | wa_ctx_emit(batch, index, ring->scratch.gtt_offset + 256); |
Line 1159... | Line 1166... | ||
1159 | wa_ctx_emit(batch, index, 0); |
1166 | wa_ctx_emit(batch, index, 0); |
1160 | 1167 | ||
1161 | wa_ctx_emit(batch, index, MI_LOAD_REGISTER_IMM(1)); |
1168 | wa_ctx_emit(batch, index, MI_LOAD_REGISTER_IMM(1)); |
Line 1162... | Line 1169... | ||
1162 | wa_ctx_emit(batch, index, GEN8_L3SQCREG4); |
1169 | wa_ctx_emit_reg(batch, index, GEN8_L3SQCREG4); |
1163 | wa_ctx_emit(batch, index, l3sqc4_flush); |
1170 | wa_ctx_emit(batch, index, l3sqc4_flush); |
1164 | 1171 | ||
Line 1170... | Line 1177... | ||
1170 | wa_ctx_emit(batch, index, 0); |
1177 | wa_ctx_emit(batch, index, 0); |
1171 | wa_ctx_emit(batch, index, 0); |
1178 | wa_ctx_emit(batch, index, 0); |
Line 1172... | Line 1179... | ||
1172 | 1179 | ||
1173 | wa_ctx_emit(batch, index, (MI_LOAD_REGISTER_MEM_GEN8 | |
1180 | wa_ctx_emit(batch, index, (MI_LOAD_REGISTER_MEM_GEN8 | |
1174 | MI_SRM_LRM_GLOBAL_GTT)); |
1181 | MI_SRM_LRM_GLOBAL_GTT)); |
1175 | wa_ctx_emit(batch, index, GEN8_L3SQCREG4); |
1182 | wa_ctx_emit_reg(batch, index, GEN8_L3SQCREG4); |
1176 | wa_ctx_emit(batch, index, ring->scratch.gtt_offset + 256); |
1183 | wa_ctx_emit(batch, index, ring->scratch.gtt_offset + 256); |
Line 1177... | Line 1184... | ||
1177 | wa_ctx_emit(batch, index, 0); |
1184 | wa_ctx_emit(batch, index, 0); |
1178 | 1185 | ||
Line 1312... | Line 1319... | ||
1312 | int ret; |
1319 | int ret; |
1313 | struct drm_device *dev = ring->dev; |
1320 | struct drm_device *dev = ring->dev; |
1314 | uint32_t index = wa_ctx_start(wa_ctx, *offset, CACHELINE_DWORDS); |
1321 | uint32_t index = wa_ctx_start(wa_ctx, *offset, CACHELINE_DWORDS); |
Line 1315... | Line 1322... | ||
1315 | 1322 | ||
1316 | /* WaDisableCtxRestoreArbitration:skl,bxt */ |
1323 | /* WaDisableCtxRestoreArbitration:skl,bxt */ |
1317 | if ((IS_SKYLAKE(dev) && (INTEL_REVID(dev) <= SKL_REVID_D0)) || |
1324 | if (IS_SKL_REVID(dev, 0, SKL_REVID_D0) || |
1318 | (IS_BROXTON(dev) && (INTEL_REVID(dev) == BXT_REVID_A0))) |
1325 | IS_BXT_REVID(dev, 0, BXT_REVID_A1)) |
Line 1319... | Line 1326... | ||
1319 | wa_ctx_emit(batch, index, MI_ARB_ON_OFF | MI_ARB_DISABLE); |
1326 | wa_ctx_emit(batch, index, MI_ARB_ON_OFF | MI_ARB_DISABLE); |
1320 | 1327 | ||
1321 | /* WaFlushCoherentL3CacheLinesAtContextSwitch:skl,bxt */ |
1328 | /* WaFlushCoherentL3CacheLinesAtContextSwitch:skl,bxt */ |
Line 1338... | Line 1345... | ||
1338 | { |
1345 | { |
1339 | struct drm_device *dev = ring->dev; |
1346 | struct drm_device *dev = ring->dev; |
1340 | uint32_t index = wa_ctx_start(wa_ctx, *offset, CACHELINE_DWORDS); |
1347 | uint32_t index = wa_ctx_start(wa_ctx, *offset, CACHELINE_DWORDS); |
Line 1341... | Line 1348... | ||
1341 | 1348 | ||
1342 | /* WaSetDisablePixMaskCammingAndRhwoInCommonSliceChicken:skl,bxt */ |
1349 | /* WaSetDisablePixMaskCammingAndRhwoInCommonSliceChicken:skl,bxt */ |
1343 | if ((IS_SKYLAKE(dev) && (INTEL_REVID(dev) <= SKL_REVID_B0)) || |
1350 | if (IS_SKL_REVID(dev, 0, SKL_REVID_B0) || |
1344 | (IS_BROXTON(dev) && (INTEL_REVID(dev) == BXT_REVID_A0))) { |
1351 | IS_BXT_REVID(dev, 0, BXT_REVID_A1)) { |
1345 | wa_ctx_emit(batch, index, MI_LOAD_REGISTER_IMM(1)); |
1352 | wa_ctx_emit(batch, index, MI_LOAD_REGISTER_IMM(1)); |
1346 | wa_ctx_emit(batch, index, GEN9_SLICE_COMMON_ECO_CHICKEN0); |
1353 | wa_ctx_emit_reg(batch, index, GEN9_SLICE_COMMON_ECO_CHICKEN0); |
1347 | wa_ctx_emit(batch, index, |
1354 | wa_ctx_emit(batch, index, |
1348 | _MASKED_BIT_ENABLE(DISABLE_PIXEL_MASK_CAMMING)); |
1355 | _MASKED_BIT_ENABLE(DISABLE_PIXEL_MASK_CAMMING)); |
1349 | wa_ctx_emit(batch, index, MI_NOOP); |
1356 | wa_ctx_emit(batch, index, MI_NOOP); |
Line 1350... | Line 1357... | ||
1350 | } |
1357 | } |
1351 | 1358 | ||
1352 | /* WaDisableCtxRestoreArbitration:skl,bxt */ |
1359 | /* WaDisableCtxRestoreArbitration:skl,bxt */ |
1353 | if ((IS_SKYLAKE(dev) && (INTEL_REVID(dev) <= SKL_REVID_D0)) || |
1360 | if (IS_SKL_REVID(dev, 0, SKL_REVID_D0) || |
Line 1354... | Line 1361... | ||
1354 | (IS_BROXTON(dev) && (INTEL_REVID(dev) == BXT_REVID_A0))) |
1361 | IS_BXT_REVID(dev, 0, BXT_REVID_A1)) |
Line 1355... | Line 1362... | ||
1355 | wa_ctx_emit(batch, index, MI_ARB_ON_OFF | MI_ARB_ENABLE); |
1362 | wa_ctx_emit(batch, index, MI_ARB_ON_OFF | MI_ARB_ENABLE); |
Line 1416... | Line 1423... | ||
1416 | if (ret) { |
1423 | if (ret) { |
1417 | DRM_DEBUG_DRIVER("Failed to setup context WA page: %d\n", ret); |
1424 | DRM_DEBUG_DRIVER("Failed to setup context WA page: %d\n", ret); |
1418 | return ret; |
1425 | return ret; |
1419 | } |
1426 | } |
Line 1420... | Line 1427... | ||
1420 | 1427 | ||
1421 | page = i915_gem_object_get_page(wa_ctx->obj, 0); |
1428 | page = i915_gem_object_get_dirty_page(wa_ctx->obj, 0); |
1422 | batch = kmap_atomic(page); |
1429 | batch = kmap_atomic(page); |
Line 1423... | Line 1430... | ||
1423 | offset = 0; |
1430 | offset = 0; |
1424 | 1431 | ||
Line 1470... | Line 1477... | ||
1470 | ring->default_context->engine[ring->id].state); |
1477 | ring->default_context->engine[ring->id].state); |
Line 1471... | Line 1478... | ||
1471 | 1478 | ||
1472 | I915_WRITE_IMR(ring, ~(ring->irq_enable_mask | ring->irq_keep_mask)); |
1479 | I915_WRITE_IMR(ring, ~(ring->irq_enable_mask | ring->irq_keep_mask)); |
Line 1473... | Line -... | ||
1473 | I915_WRITE(RING_HWSTAM(ring->mmio_base), 0xffffffff); |
- | |
1474 | - | ||
1475 | if (ring->status_page.obj) { |
- | |
1476 | I915_WRITE(RING_HWS_PGA(ring->mmio_base), |
- | |
1477 | (u32)ring->status_page.gfx_addr); |
- | |
1478 | POSTING_READ(RING_HWS_PGA(ring->mmio_base)); |
- | |
1479 | } |
1480 | I915_WRITE(RING_HWSTAM(ring->mmio_base), 0xffffffff); |
1480 | 1481 | ||
1481 | I915_WRITE(RING_MODE_GEN7(ring), |
1482 | I915_WRITE(RING_MODE_GEN7(ring), |
1482 | _MASKED_BIT_DISABLE(GFX_REPLAY_MODE) | |
1483 | _MASKED_BIT_DISABLE(GFX_REPLAY_MODE) | |
Line 1560... | Line 1561... | ||
1560 | 1561 | ||
1561 | intel_logical_ring_emit(ringbuf, MI_LOAD_REGISTER_IMM(num_lri_cmds)); |
1562 | intel_logical_ring_emit(ringbuf, MI_LOAD_REGISTER_IMM(num_lri_cmds)); |
1562 | for (i = GEN8_LEGACY_PDPES - 1; i >= 0; i--) { |
1563 | for (i = GEN8_LEGACY_PDPES - 1; i >= 0; i--) { |
Line 1563... | Line 1564... | ||
1563 | const dma_addr_t pd_daddr = i915_page_dir_dma_addr(ppgtt, i); |
1564 | const dma_addr_t pd_daddr = i915_page_dir_dma_addr(ppgtt, i); |
1564 | 1565 | ||
1565 | intel_logical_ring_emit(ringbuf, GEN8_RING_PDP_UDW(ring, i)); |
1566 | intel_logical_ring_emit_reg(ringbuf, GEN8_RING_PDP_UDW(ring, i)); |
1566 | intel_logical_ring_emit(ringbuf, upper_32_bits(pd_daddr)); |
1567 | intel_logical_ring_emit(ringbuf, upper_32_bits(pd_daddr)); |
1567 | intel_logical_ring_emit(ringbuf, GEN8_RING_PDP_LDW(ring, i)); |
1568 | intel_logical_ring_emit_reg(ringbuf, GEN8_RING_PDP_LDW(ring, i)); |
Line 1568... | Line 1569... | ||
1568 | intel_logical_ring_emit(ringbuf, lower_32_bits(pd_daddr)); |
1569 | intel_logical_ring_emit(ringbuf, lower_32_bits(pd_daddr)); |
1569 | } |
1570 | } |
Line 1892... | Line 1893... | ||
1892 | if (!intel_ring_initialized(ring)) |
1893 | if (!intel_ring_initialized(ring)) |
1893 | return; |
1894 | return; |
Line 1894... | Line 1895... | ||
1894 | 1895 | ||
Line -... | Line 1896... | ||
- | 1896 | dev_priv = ring->dev->dev_private; |
|
1895 | dev_priv = ring->dev->dev_private; |
1897 | |
1896 | 1898 | if (ring->buffer) { |
|
- | 1899 | intel_logical_ring_stop(ring); |
|
Line 1897... | Line 1900... | ||
1897 | intel_logical_ring_stop(ring); |
1900 | WARN_ON((I915_READ_MODE(ring) & MODE_IDLE) == 0); |
1898 | WARN_ON((I915_READ_MODE(ring) & MODE_IDLE) == 0); |
1901 | } |
Line 1899... | Line 1902... | ||
1899 | 1902 | ||
Line 1907... | Line 1910... | ||
1907 | kunmap(sg_page(ring->status_page.obj->pages->sgl)); |
1910 | kunmap(sg_page(ring->status_page.obj->pages->sgl)); |
1908 | ring->status_page.obj = NULL; |
1911 | ring->status_page.obj = NULL; |
1909 | } |
1912 | } |
Line 1910... | Line 1913... | ||
1910 | 1913 | ||
- | 1914 | lrc_destroy_wa_ctx_obj(ring); |
|
1911 | lrc_destroy_wa_ctx_obj(ring); |
1915 | ring->dev = NULL; |
Line 1912... | Line 1916... | ||
1912 | } |
1916 | } |
1913 | 1917 | ||
1914 | static int logical_ring_init(struct drm_device *dev, struct intel_engine_cs *ring) |
1918 | static int logical_ring_init(struct drm_device *dev, struct intel_engine_cs *ring) |
Line 1922... | Line 1926... | ||
1922 | INIT_LIST_HEAD(&ring->active_list); |
1926 | INIT_LIST_HEAD(&ring->active_list); |
1923 | INIT_LIST_HEAD(&ring->request_list); |
1927 | INIT_LIST_HEAD(&ring->request_list); |
1924 | i915_gem_batch_pool_init(dev, &ring->batch_pool); |
1928 | i915_gem_batch_pool_init(dev, &ring->batch_pool); |
1925 | init_waitqueue_head(&ring->irq_queue); |
1929 | init_waitqueue_head(&ring->irq_queue); |
Line -... | Line 1930... | ||
- | 1930 | ||
1926 | 1931 | INIT_LIST_HEAD(&ring->buffers); |
|
1927 | INIT_LIST_HEAD(&ring->execlist_queue); |
1932 | INIT_LIST_HEAD(&ring->execlist_queue); |
1928 | INIT_LIST_HEAD(&ring->execlist_retired_req_list); |
1933 | INIT_LIST_HEAD(&ring->execlist_retired_req_list); |
Line 1929... | Line 1934... | ||
1929 | spin_lock_init(&ring->execlist_lock); |
1934 | spin_lock_init(&ring->execlist_lock); |
1930 | 1935 | ||
1931 | ret = i915_cmd_parser_init_ring(ring); |
1936 | ret = i915_cmd_parser_init_ring(ring); |
Line 1932... | Line 1937... | ||
1932 | if (ret) |
1937 | if (ret) |
1933 | return ret; |
1938 | goto error; |
1934 | 1939 | ||
Line 1935... | Line 1940... | ||
1935 | ret = intel_lr_context_deferred_alloc(ring->default_context, ring); |
1940 | ret = intel_lr_context_deferred_alloc(ring->default_context, ring); |
1936 | if (ret) |
1941 | if (ret) |
1937 | return ret; |
1942 | goto error; |
1938 | 1943 | ||
1939 | /* As this is the default context, always pin it */ |
1944 | /* As this is the default context, always pin it */ |
1940 | ret = intel_lr_context_do_pin( |
1945 | ret = intel_lr_context_do_pin( |
1941 | ring, |
1946 | ring, |
1942 | ring->default_context->engine[ring->id].state, |
1947 | ring->default_context->engine[ring->id].state, |
1943 | ring->default_context->engine[ring->id].ringbuf); |
1948 | ring->default_context->engine[ring->id].ringbuf); |
1944 | if (ret) { |
1949 | if (ret) { |
1945 | DRM_ERROR( |
1950 | DRM_ERROR( |
Line -... | Line 1951... | ||
- | 1951 | "Failed to pin and map ringbuffer %s: %d\n", |
|
- | 1952 | ring->name, ret); |
|
- | 1953 | goto error; |
|
- | 1954 | } |
|
1946 | "Failed to pin and map ringbuffer %s: %d\n", |
1955 | |
1947 | ring->name, ret); |
1956 | return 0; |
Line 1948... | Line 1957... | ||
1948 | return ret; |
1957 | |
1949 | } |
1958 | error: |
Line 1971... | Line 1980... | ||
1971 | ring->init_hw = gen9_init_render_ring; |
1980 | ring->init_hw = gen9_init_render_ring; |
1972 | else |
1981 | else |
1973 | ring->init_hw = gen8_init_render_ring; |
1982 | ring->init_hw = gen8_init_render_ring; |
1974 | ring->init_context = gen8_init_rcs_context; |
1983 | ring->init_context = gen8_init_rcs_context; |
1975 | ring->cleanup = intel_fini_pipe_control; |
1984 | ring->cleanup = intel_fini_pipe_control; |
1976 | if (IS_BROXTON(dev) && INTEL_REVID(dev) < BXT_REVID_B0) { |
1985 | if (IS_BXT_REVID(dev, 0, BXT_REVID_A1)) { |
1977 | ring->get_seqno = bxt_a_get_seqno; |
1986 | ring->get_seqno = bxt_a_get_seqno; |
1978 | ring->set_seqno = bxt_a_set_seqno; |
1987 | ring->set_seqno = bxt_a_set_seqno; |
1979 | } else { |
1988 | } else { |
1980 | ring->get_seqno = gen8_get_seqno; |
1989 | ring->get_seqno = gen8_get_seqno; |
1981 | ring->set_seqno = gen8_set_seqno; |
1990 | ring->set_seqno = gen8_set_seqno; |
Line 2023... | Line 2032... | ||
2023 | GT_RENDER_USER_INTERRUPT << GEN8_VCS1_IRQ_SHIFT; |
2032 | GT_RENDER_USER_INTERRUPT << GEN8_VCS1_IRQ_SHIFT; |
2024 | ring->irq_keep_mask = |
2033 | ring->irq_keep_mask = |
2025 | GT_CONTEXT_SWITCH_INTERRUPT << GEN8_VCS1_IRQ_SHIFT; |
2034 | GT_CONTEXT_SWITCH_INTERRUPT << GEN8_VCS1_IRQ_SHIFT; |
Line 2026... | Line 2035... | ||
2026 | 2035 | ||
2027 | ring->init_hw = gen8_init_common_ring; |
2036 | ring->init_hw = gen8_init_common_ring; |
2028 | if (IS_BROXTON(dev) && INTEL_REVID(dev) < BXT_REVID_B0) { |
2037 | if (IS_BXT_REVID(dev, 0, BXT_REVID_A1)) { |
2029 | ring->get_seqno = bxt_a_get_seqno; |
2038 | ring->get_seqno = bxt_a_get_seqno; |
2030 | ring->set_seqno = bxt_a_set_seqno; |
2039 | ring->set_seqno = bxt_a_set_seqno; |
2031 | } else { |
2040 | } else { |
2032 | ring->get_seqno = gen8_get_seqno; |
2041 | ring->get_seqno = gen8_get_seqno; |
Line 2078... | Line 2087... | ||
2078 | GT_RENDER_USER_INTERRUPT << GEN8_BCS_IRQ_SHIFT; |
2087 | GT_RENDER_USER_INTERRUPT << GEN8_BCS_IRQ_SHIFT; |
2079 | ring->irq_keep_mask = |
2088 | ring->irq_keep_mask = |
2080 | GT_CONTEXT_SWITCH_INTERRUPT << GEN8_BCS_IRQ_SHIFT; |
2089 | GT_CONTEXT_SWITCH_INTERRUPT << GEN8_BCS_IRQ_SHIFT; |
Line 2081... | Line 2090... | ||
2081 | 2090 | ||
2082 | ring->init_hw = gen8_init_common_ring; |
2091 | ring->init_hw = gen8_init_common_ring; |
2083 | if (IS_BROXTON(dev) && INTEL_REVID(dev) < BXT_REVID_B0) { |
2092 | if (IS_BXT_REVID(dev, 0, BXT_REVID_A1)) { |
2084 | ring->get_seqno = bxt_a_get_seqno; |
2093 | ring->get_seqno = bxt_a_get_seqno; |
2085 | ring->set_seqno = bxt_a_set_seqno; |
2094 | ring->set_seqno = bxt_a_set_seqno; |
2086 | } else { |
2095 | } else { |
2087 | ring->get_seqno = gen8_get_seqno; |
2096 | ring->get_seqno = gen8_get_seqno; |
Line 2108... | Line 2117... | ||
2108 | GT_RENDER_USER_INTERRUPT << GEN8_VECS_IRQ_SHIFT; |
2117 | GT_RENDER_USER_INTERRUPT << GEN8_VECS_IRQ_SHIFT; |
2109 | ring->irq_keep_mask = |
2118 | ring->irq_keep_mask = |
2110 | GT_CONTEXT_SWITCH_INTERRUPT << GEN8_VECS_IRQ_SHIFT; |
2119 | GT_CONTEXT_SWITCH_INTERRUPT << GEN8_VECS_IRQ_SHIFT; |
Line 2111... | Line 2120... | ||
2111 | 2120 | ||
2112 | ring->init_hw = gen8_init_common_ring; |
2121 | ring->init_hw = gen8_init_common_ring; |
2113 | if (IS_BROXTON(dev) && INTEL_REVID(dev) < BXT_REVID_B0) { |
2122 | if (IS_BXT_REVID(dev, 0, BXT_REVID_A1)) { |
2114 | ring->get_seqno = bxt_a_get_seqno; |
2123 | ring->get_seqno = bxt_a_get_seqno; |
2115 | ring->set_seqno = bxt_a_set_seqno; |
2124 | ring->set_seqno = bxt_a_set_seqno; |
2116 | } else { |
2125 | } else { |
2117 | ring->get_seqno = gen8_get_seqno; |
2126 | ring->get_seqno = gen8_get_seqno; |
Line 2254... | Line 2263... | ||
2254 | 2263 | ||
Line 2255... | Line 2264... | ||
2255 | i915_gem_object_pin_pages(ctx_obj); |
2264 | i915_gem_object_pin_pages(ctx_obj); |
2256 | 2265 | ||
2257 | /* The second page of the context object contains some fields which must |
2266 | /* The second page of the context object contains some fields which must |
2258 | * be set up prior to the first execution. */ |
2267 | * be set up prior to the first execution. */ |
Line 2259... | Line 2268... | ||
2259 | page = i915_gem_object_get_page(ctx_obj, LRC_STATE_PN); |
2268 | page = i915_gem_object_get_dirty_page(ctx_obj, LRC_STATE_PN); |
2260 | reg_state = kmap_atomic(page); |
2269 | reg_state = kmap_atomic(page); |
2261 | 2270 | ||
2262 | /* A context is actually a big batch buffer with several MI_LOAD_REGISTER_IMM |
2271 | /* A context is actually a big batch buffer with several MI_LOAD_REGISTER_IMM |
2263 | * commands followed by (reg, value) pairs. The values we are setting here are |
2272 | * commands followed by (reg, value) pairs. The values we are setting here are |
2264 | * only for the first context restore: on a subsequent save, the GPU will |
- | |
2265 | * recreate this batchbuffer with new values (including all the missing |
- | |
2266 | * MI_LOAD_REGISTER_IMM commands that we are not initializing here). */ |
- | |
2267 | if (ring->id == RCS) |
2273 | * only for the first context restore: on a subsequent save, the GPU will |
2268 | reg_state[CTX_LRI_HEADER_0] = MI_LOAD_REGISTER_IMM(14); |
2274 | * recreate this batchbuffer with new values (including all the missing |
2269 | else |
2275 | * MI_LOAD_REGISTER_IMM commands that we are not initializing here). */ |
2270 | reg_state[CTX_LRI_HEADER_0] = MI_LOAD_REGISTER_IMM(11); |
- | |
2271 | reg_state[CTX_LRI_HEADER_0] |= MI_LRI_FORCE_POSTED; |
2276 | reg_state[CTX_LRI_HEADER_0] = |
2272 | reg_state[CTX_CONTEXT_CONTROL] = RING_CONTEXT_CONTROL(ring); |
2277 | MI_LOAD_REGISTER_IMM(ring->id == RCS ? 14 : 11) | MI_LRI_FORCE_POSTED; |
2273 | reg_state[CTX_CONTEXT_CONTROL+1] = |
2278 | ASSIGN_CTX_REG(reg_state, CTX_CONTEXT_CONTROL, RING_CONTEXT_CONTROL(ring), |
2274 | _MASKED_BIT_ENABLE(CTX_CTRL_INHIBIT_SYN_CTX_SWITCH | |
2279 | _MASKED_BIT_ENABLE(CTX_CTRL_INHIBIT_SYN_CTX_SWITCH | |
2275 | CTX_CTRL_ENGINE_CTX_RESTORE_INHIBIT | |
- | |
2276 | CTX_CTRL_RS_CTX_ENABLE); |
2280 | CTX_CTRL_ENGINE_CTX_RESTORE_INHIBIT | |
2277 | reg_state[CTX_RING_HEAD] = RING_HEAD(ring->mmio_base); |
- | |
2278 | reg_state[CTX_RING_HEAD+1] = 0; |
- | |
2279 | reg_state[CTX_RING_TAIL] = RING_TAIL(ring->mmio_base); |
2281 | CTX_CTRL_RS_CTX_ENABLE)); |
2280 | reg_state[CTX_RING_TAIL+1] = 0; |
2282 | ASSIGN_CTX_REG(reg_state, CTX_RING_HEAD, RING_HEAD(ring->mmio_base), 0); |
2281 | reg_state[CTX_RING_BUFFER_START] = RING_START(ring->mmio_base); |
2283 | ASSIGN_CTX_REG(reg_state, CTX_RING_TAIL, RING_TAIL(ring->mmio_base), 0); |
2282 | /* Ring buffer start address is not known until the buffer is pinned. |
2284 | /* Ring buffer start address is not known until the buffer is pinned. |
2283 | * It is written to the context image in execlists_update_context() |
2285 | * It is written to the context image in execlists_update_context() |
2284 | */ |
2286 | */ |
2285 | reg_state[CTX_RING_BUFFER_CONTROL] = RING_CTL(ring->mmio_base); |
2287 | ASSIGN_CTX_REG(reg_state, CTX_RING_BUFFER_START, RING_START(ring->mmio_base), 0); |
2286 | reg_state[CTX_RING_BUFFER_CONTROL+1] = |
- | |
2287 | ((ringbuf->size - PAGE_SIZE) & RING_NR_PAGES) | RING_VALID; |
2288 | ASSIGN_CTX_REG(reg_state, CTX_RING_BUFFER_CONTROL, RING_CTL(ring->mmio_base), |
2288 | reg_state[CTX_BB_HEAD_U] = ring->mmio_base + 0x168; |
- | |
2289 | reg_state[CTX_BB_HEAD_U+1] = 0; |
2289 | ((ringbuf->size - PAGE_SIZE) & RING_NR_PAGES) | RING_VALID); |
2290 | reg_state[CTX_BB_HEAD_L] = ring->mmio_base + 0x140; |
2290 | ASSIGN_CTX_REG(reg_state, CTX_BB_HEAD_U, RING_BBADDR_UDW(ring->mmio_base), 0); |
2291 | reg_state[CTX_BB_HEAD_L+1] = 0; |
2291 | ASSIGN_CTX_REG(reg_state, CTX_BB_HEAD_L, RING_BBADDR(ring->mmio_base), 0); |
2292 | reg_state[CTX_BB_STATE] = ring->mmio_base + 0x110; |
- | |
2293 | reg_state[CTX_BB_STATE+1] = (1<<5); |
2292 | ASSIGN_CTX_REG(reg_state, CTX_BB_STATE, RING_BBSTATE(ring->mmio_base), |
2294 | reg_state[CTX_SECOND_BB_HEAD_U] = ring->mmio_base + 0x11c; |
- | |
2295 | reg_state[CTX_SECOND_BB_HEAD_U+1] = 0; |
2293 | RING_BB_PPGTT); |
2296 | reg_state[CTX_SECOND_BB_HEAD_L] = ring->mmio_base + 0x114; |
- | |
2297 | reg_state[CTX_SECOND_BB_HEAD_L+1] = 0; |
2294 | ASSIGN_CTX_REG(reg_state, CTX_SECOND_BB_HEAD_U, RING_SBBADDR_UDW(ring->mmio_base), 0); |
2298 | reg_state[CTX_SECOND_BB_STATE] = ring->mmio_base + 0x118; |
2295 | ASSIGN_CTX_REG(reg_state, CTX_SECOND_BB_HEAD_L, RING_SBBADDR(ring->mmio_base), 0); |
2299 | reg_state[CTX_SECOND_BB_STATE+1] = 0; |
- | |
2300 | if (ring->id == RCS) { |
2296 | ASSIGN_CTX_REG(reg_state, CTX_SECOND_BB_STATE, RING_SBBSTATE(ring->mmio_base), 0); |
2301 | reg_state[CTX_BB_PER_CTX_PTR] = ring->mmio_base + 0x1c0; |
- | |
2302 | reg_state[CTX_BB_PER_CTX_PTR+1] = 0; |
2297 | if (ring->id == RCS) { |
2303 | reg_state[CTX_RCS_INDIRECT_CTX] = ring->mmio_base + 0x1c4; |
- | |
2304 | reg_state[CTX_RCS_INDIRECT_CTX+1] = 0; |
2298 | ASSIGN_CTX_REG(reg_state, CTX_BB_PER_CTX_PTR, RING_BB_PER_CTX_PTR(ring->mmio_base), 0); |
2305 | reg_state[CTX_RCS_INDIRECT_CTX_OFFSET] = ring->mmio_base + 0x1c8; |
2299 | ASSIGN_CTX_REG(reg_state, CTX_RCS_INDIRECT_CTX, RING_INDIRECT_CTX(ring->mmio_base), 0); |
2306 | reg_state[CTX_RCS_INDIRECT_CTX_OFFSET+1] = 0; |
2300 | ASSIGN_CTX_REG(reg_state, CTX_RCS_INDIRECT_CTX_OFFSET, RING_INDIRECT_CTX_OFFSET(ring->mmio_base), 0); |
Line 2307... | Line 2301... | ||
2307 | if (ring->wa_ctx.obj) { |
2301 | if (ring->wa_ctx.obj) { |
Line 2318... | Line 2312... | ||
2318 | reg_state[CTX_BB_PER_CTX_PTR+1] = |
2312 | reg_state[CTX_BB_PER_CTX_PTR+1] = |
2319 | (ggtt_offset + wa_ctx->per_ctx.offset * sizeof(uint32_t)) | |
2313 | (ggtt_offset + wa_ctx->per_ctx.offset * sizeof(uint32_t)) | |
2320 | 0x01; |
2314 | 0x01; |
2321 | } |
2315 | } |
2322 | } |
2316 | } |
2323 | reg_state[CTX_LRI_HEADER_1] = MI_LOAD_REGISTER_IMM(9); |
2317 | reg_state[CTX_LRI_HEADER_1] = MI_LOAD_REGISTER_IMM(9) | MI_LRI_FORCE_POSTED; |
2324 | reg_state[CTX_LRI_HEADER_1] |= MI_LRI_FORCE_POSTED; |
- | |
2325 | reg_state[CTX_CTX_TIMESTAMP] = ring->mmio_base + 0x3a8; |
2318 | ASSIGN_CTX_REG(reg_state, CTX_CTX_TIMESTAMP, RING_CTX_TIMESTAMP(ring->mmio_base), 0); |
2326 | reg_state[CTX_CTX_TIMESTAMP+1] = 0; |
2319 | /* PDP values well be assigned later if needed */ |
2327 | reg_state[CTX_PDP3_UDW] = GEN8_RING_PDP_UDW(ring, 3); |
2320 | ASSIGN_CTX_REG(reg_state, CTX_PDP3_UDW, GEN8_RING_PDP_UDW(ring, 3), 0); |
2328 | reg_state[CTX_PDP3_LDW] = GEN8_RING_PDP_LDW(ring, 3); |
2321 | ASSIGN_CTX_REG(reg_state, CTX_PDP3_LDW, GEN8_RING_PDP_LDW(ring, 3), 0); |
2329 | reg_state[CTX_PDP2_UDW] = GEN8_RING_PDP_UDW(ring, 2); |
2322 | ASSIGN_CTX_REG(reg_state, CTX_PDP2_UDW, GEN8_RING_PDP_UDW(ring, 2), 0); |
2330 | reg_state[CTX_PDP2_LDW] = GEN8_RING_PDP_LDW(ring, 2); |
2323 | ASSIGN_CTX_REG(reg_state, CTX_PDP2_LDW, GEN8_RING_PDP_LDW(ring, 2), 0); |
2331 | reg_state[CTX_PDP1_UDW] = GEN8_RING_PDP_UDW(ring, 1); |
2324 | ASSIGN_CTX_REG(reg_state, CTX_PDP1_UDW, GEN8_RING_PDP_UDW(ring, 1), 0); |
2332 | reg_state[CTX_PDP1_LDW] = GEN8_RING_PDP_LDW(ring, 1); |
2325 | ASSIGN_CTX_REG(reg_state, CTX_PDP1_LDW, GEN8_RING_PDP_LDW(ring, 1), 0); |
2333 | reg_state[CTX_PDP0_UDW] = GEN8_RING_PDP_UDW(ring, 0); |
2326 | ASSIGN_CTX_REG(reg_state, CTX_PDP0_UDW, GEN8_RING_PDP_UDW(ring, 0), 0); |
2334 | reg_state[CTX_PDP0_LDW] = GEN8_RING_PDP_LDW(ring, 0); |
2327 | ASSIGN_CTX_REG(reg_state, CTX_PDP0_LDW, GEN8_RING_PDP_LDW(ring, 0), 0); |
Line 2335... | Line 2328... | ||
2335 | 2328 | ||
2336 | if (USES_FULL_48BIT_PPGTT(ppgtt->base.dev)) { |
2329 | if (USES_FULL_48BIT_PPGTT(ppgtt->base.dev)) { |
2337 | /* 64b PPGTT (48bit canonical) |
2330 | /* 64b PPGTT (48bit canonical) |
2338 | * PDP0_DESCRIPTOR contains the base address to PML4 and |
2331 | * PDP0_DESCRIPTOR contains the base address to PML4 and |
Line 2351... | Line 2344... | ||
2351 | ASSIGN_CTX_PDP(ppgtt, reg_state, 0); |
2344 | ASSIGN_CTX_PDP(ppgtt, reg_state, 0); |
2352 | } |
2345 | } |
Line 2353... | Line 2346... | ||
2353 | 2346 | ||
2354 | if (ring->id == RCS) { |
2347 | if (ring->id == RCS) { |
2355 | reg_state[CTX_LRI_HEADER_2] = MI_LOAD_REGISTER_IMM(1); |
2348 | reg_state[CTX_LRI_HEADER_2] = MI_LOAD_REGISTER_IMM(1); |
2356 | reg_state[CTX_R_PWR_CLK_STATE] = GEN8_R_PWR_CLK_STATE; |
2349 | ASSIGN_CTX_REG(reg_state, CTX_R_PWR_CLK_STATE, GEN8_R_PWR_CLK_STATE, |
2357 | reg_state[CTX_R_PWR_CLK_STATE+1] = make_rpcs(dev); |
2350 | make_rpcs(dev)); |
Line 2358... | Line 2351... | ||
2358 | } |
2351 | } |
2359 | - | ||
2360 | kunmap_atomic(reg_state); |
- | |
2361 | - | ||
2362 | ctx_obj->dirty = 1; |
2352 | |
Line 2363... | Line 2353... | ||
2363 | set_page_dirty(page); |
2353 | kunmap_atomic(reg_state); |
2364 | i915_gem_object_unpin_pages(ctx_obj); |
2354 | i915_gem_object_unpin_pages(ctx_obj); |
Line 2542... | Line 2532... | ||
2542 | 2532 | ||
2543 | if (i915_gem_object_get_pages(ctx_obj)) { |
2533 | if (i915_gem_object_get_pages(ctx_obj)) { |
2544 | WARN(1, "Failed get_pages for context obj\n"); |
2534 | WARN(1, "Failed get_pages for context obj\n"); |
2545 | continue; |
2535 | continue; |
2546 | } |
2536 | } |
2547 | page = i915_gem_object_get_page(ctx_obj, LRC_STATE_PN); |
2537 | page = i915_gem_object_get_dirty_page(ctx_obj, LRC_STATE_PN); |
Line 2548... | Line 2538... | ||
2548 | reg_state = kmap_atomic(page); |
2538 | reg_state = kmap_atomic(page); |
2549 | 2539 |