Subversion Repositories Kolibri OS

Rev

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