Skip to content

Commit 06358cc

Browse files
committed
drm/i915/dsb: Introduce intel_dsb_chain()
In order to handle the DEwake tricks without involving the CPU we need a mechanism by which one DSB can start another one. Add a basic function to do so. We'll extend it later with additional code to actually deal with DEwake. Signed-off-by: Ville Syrjälä <[email protected]> Link: https://patchwork.freedesktop.org/patch/msgid/[email protected] Reviewed-by: Animesh Manna <[email protected]>
1 parent 2039809 commit 06358cc

File tree

2 files changed

+45
-0
lines changed

2 files changed

+45
-0
lines changed

drivers/gpu/drm/i915/display/intel_dsb.c

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -500,6 +500,48 @@ static u32 dsb_error_int_en(struct intel_display *display)
500500
return errors;
501501
}
502502

503+
static void _intel_dsb_chain(struct intel_atomic_state *state,
504+
struct intel_dsb *dsb,
505+
struct intel_dsb *chained_dsb,
506+
u32 ctrl)
507+
{
508+
struct intel_display *display = to_intel_display(state->base.dev);
509+
struct intel_crtc *crtc = dsb->crtc;
510+
enum pipe pipe = crtc->pipe;
511+
u32 tail;
512+
513+
if (drm_WARN_ON(display->drm, dsb->id == chained_dsb->id))
514+
return;
515+
516+
tail = chained_dsb->free_pos * 4;
517+
if (drm_WARN_ON(display->drm, !IS_ALIGNED(tail, CACHELINE_BYTES)))
518+
return;
519+
520+
intel_dsb_reg_write(dsb, DSB_CTRL(pipe, chained_dsb->id),
521+
ctrl | DSB_ENABLE);
522+
523+
intel_dsb_reg_write(dsb, DSB_CHICKEN(pipe, chained_dsb->id),
524+
dsb_chicken(state, crtc));
525+
526+
intel_dsb_reg_write(dsb, DSB_INTERRUPT(pipe, chained_dsb->id),
527+
dsb_error_int_status(display) | DSB_PROG_INT_STATUS |
528+
dsb_error_int_en(display));
529+
530+
intel_dsb_reg_write(dsb, DSB_HEAD(pipe, chained_dsb->id),
531+
intel_dsb_buffer_ggtt_offset(&chained_dsb->dsb_buf));
532+
533+
intel_dsb_reg_write(dsb, DSB_TAIL(pipe, chained_dsb->id),
534+
intel_dsb_buffer_ggtt_offset(&chained_dsb->dsb_buf) + tail);
535+
}
536+
537+
void intel_dsb_chain(struct intel_atomic_state *state,
538+
struct intel_dsb *dsb,
539+
struct intel_dsb *chained_dsb)
540+
{
541+
_intel_dsb_chain(state, dsb, chained_dsb,
542+
0);
543+
}
544+
503545
static void _intel_dsb_commit(struct intel_dsb *dsb, u32 ctrl,
504546
int hw_dewake_scanline)
505547
{

drivers/gpu/drm/i915/display/intel_dsb.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,9 @@ void intel_dsb_wait_scanline_in(struct intel_atomic_state *state,
4545
void intel_dsb_wait_scanline_out(struct intel_atomic_state *state,
4646
struct intel_dsb *dsb,
4747
int lower, int upper);
48+
void intel_dsb_chain(struct intel_atomic_state *state,
49+
struct intel_dsb *dsb,
50+
struct intel_dsb *chained_dsb);
4851

4952
void intel_dsb_commit(struct intel_dsb *dsb,
5053
bool wait_for_vblank);

0 commit comments

Comments
 (0)