xref: /linux/drivers/gpu/drm/i915/display/intel_dsb.c (revision 3a39d672e7f48b8d6b91a09afa4b55352773b4b5)
1 // SPDX-License-Identifier: MIT
2 /*
3  * Copyright © 2019 Intel Corporation
4  *
5  */
6 
7 #include "i915_drv.h"
8 #include "i915_irq.h"
9 #include "i915_reg.h"
10 #include "intel_crtc.h"
11 #include "intel_de.h"
12 #include "intel_display_types.h"
13 #include "intel_dsb.h"
14 #include "intel_dsb_buffer.h"
15 #include "intel_dsb_regs.h"
16 #include "intel_vblank.h"
17 #include "intel_vrr.h"
18 #include "skl_watermark.h"
19 
20 #define CACHELINE_BYTES 64
21 
22 struct intel_dsb {
23 	enum intel_dsb_id id;
24 
25 	struct intel_dsb_buffer dsb_buf;
26 	struct intel_crtc *crtc;
27 
28 	/*
29 	 * maximum number of dwords the buffer will hold.
30 	 */
31 	unsigned int size;
32 
33 	/*
34 	 * free_pos will point the first free dword and
35 	 * help in calculating tail of command buffer.
36 	 */
37 	unsigned int free_pos;
38 
39 	/*
40 	 * ins_start_offset will help to store start dword of the dsb
41 	 * instuction and help in identifying the batch of auto-increment
42 	 * register.
43 	 */
44 	unsigned int ins_start_offset;
45 
46 	u32 chicken;
47 	int hw_dewake_scanline;
48 };
49 
50 /**
51  * DOC: DSB
52  *
53  * A DSB (Display State Buffer) is a queue of MMIO instructions in the memory
54  * which can be offloaded to DSB HW in Display Controller. DSB HW is a DMA
55  * engine that can be programmed to download the DSB from memory.
56  * It allows driver to batch submit display HW programming. This helps to
57  * reduce loading time and CPU activity, thereby making the context switch
58  * faster. DSB Support added from Gen12 Intel graphics based platform.
59  *
60  * DSB's can access only the pipe, plane, and transcoder Data Island Packet
61  * registers.
62  *
63  * DSB HW can support only register writes (both indexed and direct MMIO
64  * writes). There are no registers reads possible with DSB HW engine.
65  */
66 
67 /* DSB opcodes. */
68 #define DSB_OPCODE_SHIFT		24
69 #define DSB_OPCODE_NOOP			0x0
70 #define DSB_OPCODE_MMIO_WRITE		0x1
71 #define   DSB_BYTE_EN			0xf
72 #define   DSB_BYTE_EN_SHIFT		20
73 #define   DSB_REG_VALUE_MASK		0xfffff
74 #define DSB_OPCODE_WAIT_USEC		0x2
75 #define DSB_OPCODE_WAIT_SCANLINE	0x3
76 #define DSB_OPCODE_WAIT_VBLANKS		0x4
77 #define DSB_OPCODE_WAIT_DSL_IN		0x5
78 #define DSB_OPCODE_WAIT_DSL_OUT		0x6
79 #define   DSB_SCANLINE_UPPER_SHIFT	20
80 #define   DSB_SCANLINE_LOWER_SHIFT	0
81 #define DSB_OPCODE_INTERRUPT		0x7
82 #define DSB_OPCODE_INDEXED_WRITE	0x9
83 /* see DSB_REG_VALUE_MASK */
84 #define DSB_OPCODE_POLL			0xA
85 /* see DSB_REG_VALUE_MASK */
86 
pre_commit_is_vrr_active(struct intel_atomic_state * state,struct intel_crtc * crtc)87 static bool pre_commit_is_vrr_active(struct intel_atomic_state *state,
88 				     struct intel_crtc *crtc)
89 {
90 	const struct intel_crtc_state *old_crtc_state =
91 		intel_atomic_get_old_crtc_state(state, crtc);
92 	const struct intel_crtc_state *new_crtc_state =
93 		intel_atomic_get_new_crtc_state(state, crtc);
94 
95 	/* VRR will be enabled afterwards, if necessary */
96 	if (intel_crtc_needs_modeset(new_crtc_state))
97 		return false;
98 
99 	/* VRR will have been disabled during intel_pre_plane_update() */
100 	return old_crtc_state->vrr.enable && !intel_crtc_vrr_disabling(state, crtc);
101 }
102 
103 static const struct intel_crtc_state *
pre_commit_crtc_state(struct intel_atomic_state * state,struct intel_crtc * crtc)104 pre_commit_crtc_state(struct intel_atomic_state *state,
105 		      struct intel_crtc *crtc)
106 {
107 	const struct intel_crtc_state *old_crtc_state =
108 		intel_atomic_get_old_crtc_state(state, crtc);
109 	const struct intel_crtc_state *new_crtc_state =
110 		intel_atomic_get_new_crtc_state(state, crtc);
111 
112 	/*
113 	 * During fastsets/etc. the transcoder is still
114 	 * running with the old timings at this point.
115 	 */
116 	if (intel_crtc_needs_modeset(new_crtc_state))
117 		return new_crtc_state;
118 	else
119 		return old_crtc_state;
120 }
121 
dsb_vtotal(struct intel_atomic_state * state,struct intel_crtc * crtc)122 static int dsb_vtotal(struct intel_atomic_state *state,
123 		      struct intel_crtc *crtc)
124 {
125 	const struct intel_crtc_state *crtc_state = pre_commit_crtc_state(state, crtc);
126 
127 	if (pre_commit_is_vrr_active(state, crtc))
128 		return crtc_state->vrr.vmax;
129 	else
130 		return intel_mode_vtotal(&crtc_state->hw.adjusted_mode);
131 }
132 
dsb_dewake_scanline_start(struct intel_atomic_state * state,struct intel_crtc * crtc)133 static int dsb_dewake_scanline_start(struct intel_atomic_state *state,
134 				     struct intel_crtc *crtc)
135 {
136 	const struct intel_crtc_state *crtc_state = pre_commit_crtc_state(state, crtc);
137 	struct drm_i915_private *i915 = to_i915(state->base.dev);
138 	unsigned int latency = skl_watermark_max_latency(i915, 0);
139 
140 	return intel_mode_vdisplay(&crtc_state->hw.adjusted_mode) -
141 		intel_usecs_to_scanlines(&crtc_state->hw.adjusted_mode, latency);
142 }
143 
dsb_dewake_scanline_end(struct intel_atomic_state * state,struct intel_crtc * crtc)144 static int dsb_dewake_scanline_end(struct intel_atomic_state *state,
145 				   struct intel_crtc *crtc)
146 {
147 	const struct intel_crtc_state *crtc_state = pre_commit_crtc_state(state, crtc);
148 
149 	return intel_mode_vdisplay(&crtc_state->hw.adjusted_mode);
150 }
151 
dsb_scanline_to_hw(struct intel_atomic_state * state,struct intel_crtc * crtc,int scanline)152 static int dsb_scanline_to_hw(struct intel_atomic_state *state,
153 			      struct intel_crtc *crtc, int scanline)
154 {
155 	const struct intel_crtc_state *crtc_state = pre_commit_crtc_state(state, crtc);
156 	int vtotal = dsb_vtotal(state, crtc);
157 
158 	return (scanline + vtotal - intel_crtc_scanline_offset(crtc_state)) % vtotal;
159 }
160 
dsb_chicken(struct intel_atomic_state * state,struct intel_crtc * crtc)161 static u32 dsb_chicken(struct intel_atomic_state *state,
162 		       struct intel_crtc *crtc)
163 {
164 	if (pre_commit_is_vrr_active(state, crtc))
165 		return DSB_SKIP_WAITS_EN |
166 			DSB_CTRL_WAIT_SAFE_WINDOW |
167 			DSB_CTRL_NO_WAIT_VBLANK |
168 			DSB_INST_WAIT_SAFE_WINDOW |
169 			DSB_INST_NO_WAIT_VBLANK;
170 	else
171 		return DSB_SKIP_WAITS_EN;
172 }
173 
assert_dsb_has_room(struct intel_dsb * dsb)174 static bool assert_dsb_has_room(struct intel_dsb *dsb)
175 {
176 	struct intel_crtc *crtc = dsb->crtc;
177 	struct intel_display *display = to_intel_display(crtc->base.dev);
178 
179 	/* each instruction is 2 dwords */
180 	return !drm_WARN(display->drm, dsb->free_pos > dsb->size - 2,
181 			 "[CRTC:%d:%s] DSB %d buffer overflow\n",
182 			 crtc->base.base.id, crtc->base.name, dsb->id);
183 }
184 
intel_dsb_dump(struct intel_dsb * dsb)185 static void intel_dsb_dump(struct intel_dsb *dsb)
186 {
187 	struct intel_crtc *crtc = dsb->crtc;
188 	struct intel_display *display = to_intel_display(crtc->base.dev);
189 	int i;
190 
191 	drm_dbg_kms(display->drm, "[CRTC:%d:%s] DSB %d commands {\n",
192 		    crtc->base.base.id, crtc->base.name, dsb->id);
193 	for (i = 0; i < ALIGN(dsb->free_pos, 64 / 4); i += 4)
194 		drm_dbg_kms(display->drm,
195 			    " 0x%08x: 0x%08x 0x%08x 0x%08x 0x%08x\n", i * 4,
196 			    intel_dsb_buffer_read(&dsb->dsb_buf, i),
197 			    intel_dsb_buffer_read(&dsb->dsb_buf, i + 1),
198 			    intel_dsb_buffer_read(&dsb->dsb_buf, i + 2),
199 			    intel_dsb_buffer_read(&dsb->dsb_buf, i + 3));
200 	drm_dbg_kms(display->drm, "}\n");
201 }
202 
is_dsb_busy(struct intel_display * display,enum pipe pipe,enum intel_dsb_id dsb_id)203 static bool is_dsb_busy(struct intel_display *display, enum pipe pipe,
204 			enum intel_dsb_id dsb_id)
205 {
206 	return intel_de_read_fw(display, DSB_CTRL(pipe, dsb_id)) & DSB_STATUS_BUSY;
207 }
208 
intel_dsb_emit(struct intel_dsb * dsb,u32 ldw,u32 udw)209 static void intel_dsb_emit(struct intel_dsb *dsb, u32 ldw, u32 udw)
210 {
211 	if (!assert_dsb_has_room(dsb))
212 		return;
213 
214 	/* Every instruction should be 8 byte aligned. */
215 	dsb->free_pos = ALIGN(dsb->free_pos, 2);
216 
217 	dsb->ins_start_offset = dsb->free_pos;
218 
219 	intel_dsb_buffer_write(&dsb->dsb_buf, dsb->free_pos++, ldw);
220 	intel_dsb_buffer_write(&dsb->dsb_buf, dsb->free_pos++, udw);
221 }
222 
intel_dsb_prev_ins_is_write(struct intel_dsb * dsb,u32 opcode,i915_reg_t reg)223 static bool intel_dsb_prev_ins_is_write(struct intel_dsb *dsb,
224 					u32 opcode, i915_reg_t reg)
225 {
226 	u32 prev_opcode, prev_reg;
227 
228 	/*
229 	 * Nothing emitted yet? Must check before looking
230 	 * at the actual data since i915_gem_object_create_internal()
231 	 * does *not* give you zeroed memory!
232 	 */
233 	if (dsb->free_pos == 0)
234 		return false;
235 
236 	prev_opcode = intel_dsb_buffer_read(&dsb->dsb_buf,
237 					    dsb->ins_start_offset + 1) & ~DSB_REG_VALUE_MASK;
238 	prev_reg =  intel_dsb_buffer_read(&dsb->dsb_buf,
239 					  dsb->ins_start_offset + 1) & DSB_REG_VALUE_MASK;
240 
241 	return prev_opcode == opcode && prev_reg == i915_mmio_reg_offset(reg);
242 }
243 
intel_dsb_prev_ins_is_mmio_write(struct intel_dsb * dsb,i915_reg_t reg)244 static bool intel_dsb_prev_ins_is_mmio_write(struct intel_dsb *dsb, i915_reg_t reg)
245 {
246 	/* only full byte-enables can be converted to indexed writes */
247 	return intel_dsb_prev_ins_is_write(dsb,
248 					   DSB_OPCODE_MMIO_WRITE << DSB_OPCODE_SHIFT |
249 					   DSB_BYTE_EN << DSB_BYTE_EN_SHIFT,
250 					   reg);
251 }
252 
intel_dsb_prev_ins_is_indexed_write(struct intel_dsb * dsb,i915_reg_t reg)253 static bool intel_dsb_prev_ins_is_indexed_write(struct intel_dsb *dsb, i915_reg_t reg)
254 {
255 	return intel_dsb_prev_ins_is_write(dsb,
256 					   DSB_OPCODE_INDEXED_WRITE << DSB_OPCODE_SHIFT,
257 					   reg);
258 }
259 
260 /**
261  * intel_dsb_reg_write() - Emit register wriite to the DSB context
262  * @dsb: DSB context
263  * @reg: register address.
264  * @val: value.
265  *
266  * This function is used for writing register-value pair in command
267  * buffer of DSB.
268  */
intel_dsb_reg_write(struct intel_dsb * dsb,i915_reg_t reg,u32 val)269 void intel_dsb_reg_write(struct intel_dsb *dsb,
270 			 i915_reg_t reg, u32 val)
271 {
272 	u32 old_val;
273 
274 	/*
275 	 * For example the buffer will look like below for 3 dwords for auto
276 	 * increment register:
277 	 * +--------------------------------------------------------+
278 	 * | size = 3 | offset &| value1 | value2 | value3 | zero   |
279 	 * |          | opcode  |        |        |        |        |
280 	 * +--------------------------------------------------------+
281 	 * +          +         +        +        +        +        +
282 	 * 0          4         8        12       16       20       24
283 	 * Byte
284 	 *
285 	 * As every instruction is 8 byte aligned the index of dsb instruction
286 	 * will start always from even number while dealing with u32 array. If
287 	 * we are writing odd no of dwords, Zeros will be added in the end for
288 	 * padding.
289 	 */
290 	if (!intel_dsb_prev_ins_is_mmio_write(dsb, reg) &&
291 	    !intel_dsb_prev_ins_is_indexed_write(dsb, reg)) {
292 		intel_dsb_emit(dsb, val,
293 			       (DSB_OPCODE_MMIO_WRITE << DSB_OPCODE_SHIFT) |
294 			       (DSB_BYTE_EN << DSB_BYTE_EN_SHIFT) |
295 			       i915_mmio_reg_offset(reg));
296 	} else {
297 		if (!assert_dsb_has_room(dsb))
298 			return;
299 
300 		/* convert to indexed write? */
301 		if (intel_dsb_prev_ins_is_mmio_write(dsb, reg)) {
302 			u32 prev_val = intel_dsb_buffer_read(&dsb->dsb_buf,
303 							     dsb->ins_start_offset + 0);
304 
305 			intel_dsb_buffer_write(&dsb->dsb_buf,
306 					       dsb->ins_start_offset + 0, 1); /* count */
307 			intel_dsb_buffer_write(&dsb->dsb_buf, dsb->ins_start_offset + 1,
308 					       (DSB_OPCODE_INDEXED_WRITE << DSB_OPCODE_SHIFT) |
309 					       i915_mmio_reg_offset(reg));
310 			intel_dsb_buffer_write(&dsb->dsb_buf, dsb->ins_start_offset + 2, prev_val);
311 
312 			dsb->free_pos++;
313 		}
314 
315 		intel_dsb_buffer_write(&dsb->dsb_buf, dsb->free_pos++, val);
316 		/* Update the count */
317 		old_val = intel_dsb_buffer_read(&dsb->dsb_buf, dsb->ins_start_offset);
318 		intel_dsb_buffer_write(&dsb->dsb_buf, dsb->ins_start_offset, old_val + 1);
319 
320 		/* if number of data words is odd, then the last dword should be 0.*/
321 		if (dsb->free_pos & 0x1)
322 			intel_dsb_buffer_write(&dsb->dsb_buf, dsb->free_pos, 0);
323 	}
324 }
325 
intel_dsb_mask_to_byte_en(u32 mask)326 static u32 intel_dsb_mask_to_byte_en(u32 mask)
327 {
328 	return (!!(mask & 0xff000000) << 3 |
329 		!!(mask & 0x00ff0000) << 2 |
330 		!!(mask & 0x0000ff00) << 1 |
331 		!!(mask & 0x000000ff) << 0);
332 }
333 
334 /* Note: mask implemented via byte enables! */
intel_dsb_reg_write_masked(struct intel_dsb * dsb,i915_reg_t reg,u32 mask,u32 val)335 void intel_dsb_reg_write_masked(struct intel_dsb *dsb,
336 				i915_reg_t reg, u32 mask, u32 val)
337 {
338 	intel_dsb_emit(dsb, val,
339 		       (DSB_OPCODE_MMIO_WRITE << DSB_OPCODE_SHIFT) |
340 		       (intel_dsb_mask_to_byte_en(mask) << DSB_BYTE_EN_SHIFT) |
341 		       i915_mmio_reg_offset(reg));
342 }
343 
intel_dsb_noop(struct intel_dsb * dsb,int count)344 void intel_dsb_noop(struct intel_dsb *dsb, int count)
345 {
346 	int i;
347 
348 	for (i = 0; i < count; i++)
349 		intel_dsb_emit(dsb, 0,
350 			       DSB_OPCODE_NOOP << DSB_OPCODE_SHIFT);
351 }
352 
intel_dsb_nonpost_start(struct intel_dsb * dsb)353 void intel_dsb_nonpost_start(struct intel_dsb *dsb)
354 {
355 	struct intel_crtc *crtc = dsb->crtc;
356 	enum pipe pipe = crtc->pipe;
357 
358 	intel_dsb_reg_write_masked(dsb, DSB_CTRL(pipe, dsb->id),
359 				   DSB_NON_POSTED, DSB_NON_POSTED);
360 	intel_dsb_noop(dsb, 4);
361 }
362 
intel_dsb_nonpost_end(struct intel_dsb * dsb)363 void intel_dsb_nonpost_end(struct intel_dsb *dsb)
364 {
365 	struct intel_crtc *crtc = dsb->crtc;
366 	enum pipe pipe = crtc->pipe;
367 
368 	intel_dsb_reg_write_masked(dsb, DSB_CTRL(pipe, dsb->id),
369 				   DSB_NON_POSTED, 0);
370 	intel_dsb_noop(dsb, 4);
371 }
372 
intel_dsb_emit_wait_dsl(struct intel_dsb * dsb,u32 opcode,int lower,int upper)373 static void intel_dsb_emit_wait_dsl(struct intel_dsb *dsb,
374 				    u32 opcode, int lower, int upper)
375 {
376 	u64 window = ((u64)upper << DSB_SCANLINE_UPPER_SHIFT) |
377 		((u64)lower << DSB_SCANLINE_LOWER_SHIFT);
378 
379 	intel_dsb_emit(dsb, lower_32_bits(window),
380 		       (opcode << DSB_OPCODE_SHIFT) |
381 		       upper_32_bits(window));
382 }
383 
intel_dsb_wait_dsl(struct intel_atomic_state * state,struct intel_dsb * dsb,int lower_in,int upper_in,int lower_out,int upper_out)384 static void intel_dsb_wait_dsl(struct intel_atomic_state *state,
385 			       struct intel_dsb *dsb,
386 			       int lower_in, int upper_in,
387 			       int lower_out, int upper_out)
388 {
389 	struct intel_crtc *crtc = dsb->crtc;
390 
391 	lower_in = dsb_scanline_to_hw(state, crtc, lower_in);
392 	upper_in = dsb_scanline_to_hw(state, crtc, upper_in);
393 
394 	lower_out = dsb_scanline_to_hw(state, crtc, lower_out);
395 	upper_out = dsb_scanline_to_hw(state, crtc, upper_out);
396 
397 	if (upper_in >= lower_in)
398 		intel_dsb_emit_wait_dsl(dsb, DSB_OPCODE_WAIT_DSL_IN,
399 					lower_in, upper_in);
400 	else if (upper_out >= lower_out)
401 		intel_dsb_emit_wait_dsl(dsb, DSB_OPCODE_WAIT_DSL_OUT,
402 					lower_out, upper_out);
403 	else
404 		drm_WARN_ON(crtc->base.dev, 1); /* assert_dsl_ok() should have caught it already */
405 }
406 
assert_dsl_ok(struct intel_atomic_state * state,struct intel_dsb * dsb,int start,int end)407 static void assert_dsl_ok(struct intel_atomic_state *state,
408 			  struct intel_dsb *dsb,
409 			  int start, int end)
410 {
411 	struct intel_crtc *crtc = dsb->crtc;
412 	int vtotal = dsb_vtotal(state, crtc);
413 
414 	/*
415 	 * Waiting for the entire frame doesn't make sense,
416 	 * (IN==don't wait, OUT=wait forever).
417 	 */
418 	drm_WARN(crtc->base.dev, (end - start + vtotal) % vtotal == vtotal - 1,
419 		 "[CRTC:%d:%s] DSB %d bad scanline window wait: %d-%d (vt=%d)\n",
420 		 crtc->base.base.id, crtc->base.name, dsb->id,
421 		 start, end, vtotal);
422 }
423 
intel_dsb_wait_scanline_in(struct intel_atomic_state * state,struct intel_dsb * dsb,int start,int end)424 void intel_dsb_wait_scanline_in(struct intel_atomic_state *state,
425 				struct intel_dsb *dsb,
426 				int start, int end)
427 {
428 	assert_dsl_ok(state, dsb, start, end);
429 
430 	intel_dsb_wait_dsl(state, dsb,
431 			   start, end,
432 			   end + 1, start - 1);
433 }
434 
intel_dsb_wait_scanline_out(struct intel_atomic_state * state,struct intel_dsb * dsb,int start,int end)435 void intel_dsb_wait_scanline_out(struct intel_atomic_state *state,
436 				 struct intel_dsb *dsb,
437 				 int start, int end)
438 {
439 	assert_dsl_ok(state, dsb, start, end);
440 
441 	intel_dsb_wait_dsl(state, dsb,
442 			   end + 1, start - 1,
443 			   start, end);
444 }
445 
intel_dsb_align_tail(struct intel_dsb * dsb)446 static void intel_dsb_align_tail(struct intel_dsb *dsb)
447 {
448 	u32 aligned_tail, tail;
449 
450 	tail = dsb->free_pos * 4;
451 	aligned_tail = ALIGN(tail, CACHELINE_BYTES);
452 
453 	if (aligned_tail > tail)
454 		intel_dsb_buffer_memset(&dsb->dsb_buf, dsb->free_pos, 0,
455 					aligned_tail - tail);
456 
457 	dsb->free_pos = aligned_tail / 4;
458 }
459 
intel_dsb_finish(struct intel_dsb * dsb)460 void intel_dsb_finish(struct intel_dsb *dsb)
461 {
462 	struct intel_crtc *crtc = dsb->crtc;
463 
464 	/*
465 	 * DSB_FORCE_DEWAKE remains active even after DSB is
466 	 * disabled, so make sure to clear it (if set during
467 	 * intel_dsb_commit()). And clear DSB_ENABLE_DEWAKE as
468 	 * well for good measure.
469 	 */
470 	intel_dsb_reg_write(dsb, DSB_PMCTRL(crtc->pipe, dsb->id), 0);
471 	intel_dsb_reg_write_masked(dsb, DSB_PMCTRL_2(crtc->pipe, dsb->id),
472 				   DSB_FORCE_DEWAKE, 0);
473 
474 	intel_dsb_align_tail(dsb);
475 
476 	intel_dsb_buffer_flush_map(&dsb->dsb_buf);
477 }
478 
dsb_error_int_status(struct intel_display * display)479 static u32 dsb_error_int_status(struct intel_display *display)
480 {
481 	u32 errors;
482 
483 	errors = DSB_GTT_FAULT_INT_STATUS |
484 		DSB_RSPTIMEOUT_INT_STATUS |
485 		DSB_POLL_ERR_INT_STATUS;
486 
487 	/*
488 	 * All the non-existing status bits operate as
489 	 * normal r/w bits, so any attempt to clear them
490 	 * will just end up setting them. Never do that so
491 	 * we won't mistake them for actual error interrupts.
492 	 */
493 	if (DISPLAY_VER(display) >= 14)
494 		errors |= DSB_ATS_FAULT_INT_STATUS;
495 
496 	return errors;
497 }
498 
dsb_error_int_en(struct intel_display * display)499 static u32 dsb_error_int_en(struct intel_display *display)
500 {
501 	u32 errors;
502 
503 	errors = DSB_GTT_FAULT_INT_EN |
504 		DSB_RSPTIMEOUT_INT_EN |
505 		DSB_POLL_ERR_INT_EN;
506 
507 	if (DISPLAY_VER(display) >= 14)
508 		errors |= DSB_ATS_FAULT_INT_EN;
509 
510 	return errors;
511 }
512 
_intel_dsb_chain(struct intel_atomic_state * state,struct intel_dsb * dsb,struct intel_dsb * chained_dsb,u32 ctrl)513 static void _intel_dsb_chain(struct intel_atomic_state *state,
514 			     struct intel_dsb *dsb,
515 			     struct intel_dsb *chained_dsb,
516 			     u32 ctrl)
517 {
518 	struct intel_display *display = to_intel_display(state->base.dev);
519 	struct intel_crtc *crtc = dsb->crtc;
520 	enum pipe pipe = crtc->pipe;
521 	u32 tail;
522 
523 	if (drm_WARN_ON(display->drm, dsb->id == chained_dsb->id))
524 		return;
525 
526 	tail = chained_dsb->free_pos * 4;
527 	if (drm_WARN_ON(display->drm, !IS_ALIGNED(tail, CACHELINE_BYTES)))
528 		return;
529 
530 	intel_dsb_reg_write(dsb, DSB_CTRL(pipe, chained_dsb->id),
531 			    ctrl | DSB_ENABLE);
532 
533 	intel_dsb_reg_write(dsb, DSB_CHICKEN(pipe, chained_dsb->id),
534 			    dsb_chicken(state, crtc));
535 
536 	intel_dsb_reg_write(dsb, DSB_INTERRUPT(pipe, chained_dsb->id),
537 			    dsb_error_int_status(display) | DSB_PROG_INT_STATUS |
538 			    dsb_error_int_en(display));
539 
540 	if (ctrl & DSB_WAIT_FOR_VBLANK) {
541 		int dewake_scanline = dsb_dewake_scanline_start(state, crtc);
542 		int hw_dewake_scanline = dsb_scanline_to_hw(state, crtc, dewake_scanline);
543 
544 		intel_dsb_reg_write(dsb, DSB_PMCTRL(pipe, chained_dsb->id),
545 				    DSB_ENABLE_DEWAKE |
546 				    DSB_SCANLINE_FOR_DEWAKE(hw_dewake_scanline));
547 	}
548 
549 	intel_dsb_reg_write(dsb, DSB_HEAD(pipe, chained_dsb->id),
550 			    intel_dsb_buffer_ggtt_offset(&chained_dsb->dsb_buf));
551 
552 	intel_dsb_reg_write(dsb, DSB_TAIL(pipe, chained_dsb->id),
553 			    intel_dsb_buffer_ggtt_offset(&chained_dsb->dsb_buf) + tail);
554 
555 	if (ctrl & DSB_WAIT_FOR_VBLANK) {
556 		/*
557 		 * Keep DEwake alive via the first DSB, in
558 		 * case we're already past dewake_scanline,
559 		 * and thus DSB_ENABLE_DEWAKE on the second
560 		 * DSB won't do its job.
561 		 */
562 		intel_dsb_reg_write_masked(dsb, DSB_PMCTRL_2(pipe, dsb->id),
563 					   DSB_FORCE_DEWAKE, DSB_FORCE_DEWAKE);
564 
565 		intel_dsb_wait_scanline_out(state, dsb,
566 					    dsb_dewake_scanline_start(state, crtc),
567 					    dsb_dewake_scanline_end(state, crtc));
568 	}
569 }
570 
intel_dsb_chain(struct intel_atomic_state * state,struct intel_dsb * dsb,struct intel_dsb * chained_dsb,bool wait_for_vblank)571 void intel_dsb_chain(struct intel_atomic_state *state,
572 		     struct intel_dsb *dsb,
573 		     struct intel_dsb *chained_dsb,
574 		     bool wait_for_vblank)
575 {
576 	_intel_dsb_chain(state, dsb, chained_dsb,
577 			 wait_for_vblank ? DSB_WAIT_FOR_VBLANK : 0);
578 }
579 
_intel_dsb_commit(struct intel_dsb * dsb,u32 ctrl,int hw_dewake_scanline)580 static void _intel_dsb_commit(struct intel_dsb *dsb, u32 ctrl,
581 			      int hw_dewake_scanline)
582 {
583 	struct intel_crtc *crtc = dsb->crtc;
584 	struct intel_display *display = to_intel_display(crtc->base.dev);
585 	enum pipe pipe = crtc->pipe;
586 	u32 tail;
587 
588 	tail = dsb->free_pos * 4;
589 	if (drm_WARN_ON(display->drm, !IS_ALIGNED(tail, CACHELINE_BYTES)))
590 		return;
591 
592 	if (is_dsb_busy(display, pipe, dsb->id)) {
593 		drm_err(display->drm, "[CRTC:%d:%s] DSB %d is busy\n",
594 			crtc->base.base.id, crtc->base.name, dsb->id);
595 		return;
596 	}
597 
598 	intel_de_write_fw(display, DSB_CTRL(pipe, dsb->id),
599 			  ctrl | DSB_ENABLE);
600 
601 	intel_de_write_fw(display, DSB_CHICKEN(pipe, dsb->id),
602 			  dsb->chicken);
603 
604 	intel_de_write_fw(display, DSB_INTERRUPT(pipe, dsb->id),
605 			  dsb_error_int_status(display) | DSB_PROG_INT_STATUS |
606 			  dsb_error_int_en(display));
607 
608 	intel_de_write_fw(display, DSB_HEAD(pipe, dsb->id),
609 			  intel_dsb_buffer_ggtt_offset(&dsb->dsb_buf));
610 
611 	if (hw_dewake_scanline >= 0) {
612 		int diff, position;
613 
614 		intel_de_write_fw(display, DSB_PMCTRL(pipe, dsb->id),
615 				  DSB_ENABLE_DEWAKE |
616 				  DSB_SCANLINE_FOR_DEWAKE(hw_dewake_scanline));
617 
618 		/*
619 		 * Force DEwake immediately if we're already past
620 		 * or close to racing past the target scanline.
621 		 */
622 		position = intel_de_read_fw(display, PIPEDSL(display, pipe)) & PIPEDSL_LINE_MASK;
623 
624 		diff = hw_dewake_scanline - position;
625 		intel_de_write_fw(display, DSB_PMCTRL_2(pipe, dsb->id),
626 				  (diff >= 0 && diff < 5 ? DSB_FORCE_DEWAKE : 0) |
627 				  DSB_BLOCK_DEWAKE_EXTENSION);
628 	}
629 
630 	intel_de_write_fw(display, DSB_TAIL(pipe, dsb->id),
631 			  intel_dsb_buffer_ggtt_offset(&dsb->dsb_buf) + tail);
632 }
633 
634 /**
635  * intel_dsb_commit() - Trigger workload execution of DSB.
636  * @dsb: DSB context
637  * @wait_for_vblank: wait for vblank before executing
638  *
639  * This function is used to do actual write to hardware using DSB.
640  */
intel_dsb_commit(struct intel_dsb * dsb,bool wait_for_vblank)641 void intel_dsb_commit(struct intel_dsb *dsb,
642 		      bool wait_for_vblank)
643 {
644 	_intel_dsb_commit(dsb,
645 			  wait_for_vblank ? DSB_WAIT_FOR_VBLANK : 0,
646 			  wait_for_vblank ? dsb->hw_dewake_scanline : -1);
647 }
648 
intel_dsb_wait(struct intel_dsb * dsb)649 void intel_dsb_wait(struct intel_dsb *dsb)
650 {
651 	struct intel_crtc *crtc = dsb->crtc;
652 	struct intel_display *display = to_intel_display(crtc->base.dev);
653 	enum pipe pipe = crtc->pipe;
654 
655 	if (wait_for(!is_dsb_busy(display, pipe, dsb->id), 1)) {
656 		u32 offset = intel_dsb_buffer_ggtt_offset(&dsb->dsb_buf);
657 
658 		intel_de_write_fw(display, DSB_CTRL(pipe, dsb->id),
659 				  DSB_ENABLE | DSB_HALT);
660 
661 		drm_err(display->drm,
662 			"[CRTC:%d:%s] DSB %d timed out waiting for idle (current head=0x%x, head=0x%x, tail=0x%x)\n",
663 			crtc->base.base.id, crtc->base.name, dsb->id,
664 			intel_de_read_fw(display, DSB_CURRENT_HEAD(pipe, dsb->id)) - offset,
665 			intel_de_read_fw(display, DSB_HEAD(pipe, dsb->id)) - offset,
666 			intel_de_read_fw(display, DSB_TAIL(pipe, dsb->id)) - offset);
667 
668 		intel_dsb_dump(dsb);
669 	}
670 
671 	/* Attempt to reset it */
672 	dsb->free_pos = 0;
673 	dsb->ins_start_offset = 0;
674 	intel_de_write_fw(display, DSB_CTRL(pipe, dsb->id), 0);
675 
676 	intel_de_write_fw(display, DSB_INTERRUPT(pipe, dsb->id),
677 			  dsb_error_int_status(display) | DSB_PROG_INT_STATUS);
678 }
679 
680 /**
681  * intel_dsb_prepare() - Allocate, pin and map the DSB command buffer.
682  * @state: the atomic state
683  * @crtc: the CRTC
684  * @dsb_id: the DSB engine to use
685  * @max_cmds: number of commands we need to fit into command buffer
686  *
687  * This function prepare the command buffer which is used to store dsb
688  * instructions with data.
689  *
690  * Returns:
691  * DSB context, NULL on failure
692  */
intel_dsb_prepare(struct intel_atomic_state * state,struct intel_crtc * crtc,enum intel_dsb_id dsb_id,unsigned int max_cmds)693 struct intel_dsb *intel_dsb_prepare(struct intel_atomic_state *state,
694 				    struct intel_crtc *crtc,
695 				    enum intel_dsb_id dsb_id,
696 				    unsigned int max_cmds)
697 {
698 	struct drm_i915_private *i915 = to_i915(state->base.dev);
699 	intel_wakeref_t wakeref;
700 	struct intel_dsb *dsb;
701 	unsigned int size;
702 
703 	if (!HAS_DSB(i915))
704 		return NULL;
705 
706 	if (!i915->display.params.enable_dsb)
707 		return NULL;
708 
709 	/* TODO: DSB is broken in Xe KMD, so disabling it until fixed */
710 	if (!IS_ENABLED(I915))
711 		return NULL;
712 
713 	dsb = kzalloc(sizeof(*dsb), GFP_KERNEL);
714 	if (!dsb)
715 		goto out;
716 
717 	wakeref = intel_runtime_pm_get(&i915->runtime_pm);
718 
719 	/* ~1 qword per instruction, full cachelines */
720 	size = ALIGN(max_cmds * 8, CACHELINE_BYTES);
721 
722 	if (!intel_dsb_buffer_create(crtc, &dsb->dsb_buf, size))
723 		goto out_put_rpm;
724 
725 	intel_runtime_pm_put(&i915->runtime_pm, wakeref);
726 
727 	dsb->id = dsb_id;
728 	dsb->crtc = crtc;
729 	dsb->size = size / 4; /* in dwords */
730 	dsb->free_pos = 0;
731 	dsb->ins_start_offset = 0;
732 
733 	dsb->chicken = dsb_chicken(state, crtc);
734 	dsb->hw_dewake_scanline =
735 		dsb_scanline_to_hw(state, crtc, dsb_dewake_scanline_start(state, crtc));
736 
737 	return dsb;
738 
739 out_put_rpm:
740 	intel_runtime_pm_put(&i915->runtime_pm, wakeref);
741 	kfree(dsb);
742 out:
743 	drm_info_once(&i915->drm,
744 		      "[CRTC:%d:%s] DSB %d queue setup failed, will fallback to MMIO for display HW programming\n",
745 		      crtc->base.base.id, crtc->base.name, dsb_id);
746 
747 	return NULL;
748 }
749 
750 /**
751  * intel_dsb_cleanup() - To cleanup DSB context.
752  * @dsb: DSB context
753  *
754  * This function cleanup the DSB context by unpinning and releasing
755  * the VMA object associated with it.
756  */
intel_dsb_cleanup(struct intel_dsb * dsb)757 void intel_dsb_cleanup(struct intel_dsb *dsb)
758 {
759 	intel_dsb_buffer_cleanup(&dsb->dsb_buf);
760 	kfree(dsb);
761 }
762 
intel_dsb_irq_handler(struct intel_display * display,enum pipe pipe,enum intel_dsb_id dsb_id)763 void intel_dsb_irq_handler(struct intel_display *display,
764 			   enum pipe pipe, enum intel_dsb_id dsb_id)
765 {
766 	struct intel_crtc *crtc = intel_crtc_for_pipe(to_i915(display->drm), pipe);
767 	u32 tmp, errors;
768 
769 	tmp = intel_de_read_fw(display, DSB_INTERRUPT(pipe, dsb_id));
770 	intel_de_write_fw(display, DSB_INTERRUPT(pipe, dsb_id), tmp);
771 
772 	errors = tmp & dsb_error_int_status(display);
773 	if (errors)
774 		drm_err(display->drm, "[CRTC:%d:%s] DSB %d error interrupt: 0x%x\n",
775 			crtc->base.base.id, crtc->base.name, dsb_id, errors);
776 }
777