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