]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
drm/i915/dsb: Introduce intel_dsb_poll()
authorVille Syrjälä <ville.syrjala@linux.intel.com>
Fri, 7 Feb 2025 22:31:56 +0000 (00:31 +0200)
committerVille Syrjälä <ville.syrjala@linux.intel.com>
Wed, 12 Feb 2025 17:22:06 +0000 (19:22 +0200)
Add a function for emitting a DSB poll instruction. We'll allow
the caller to specify the poll parameters.

v2: s/wait/wait_us/ (Ankit)

Reviewed-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20250207223159.14132-6-ville.syrjala@linux.intel.com
drivers/gpu/drm/i915/display/intel_dsb.c
drivers/gpu/drm/i915/display/intel_dsb.h

index 01e3bd385cacc3f820deb04a028fd329464cb089..aba57ddfbb9220343535e15d7e9fe723ca02d7d4 100644 (file)
@@ -459,6 +459,25 @@ void intel_dsb_wait_scanline_out(struct intel_atomic_state *state,
                           start, end);
 }
 
+void intel_dsb_poll(struct intel_dsb *dsb,
+                   i915_reg_t reg, u32 mask, u32 val,
+                   int wait_us, int count)
+{
+       struct intel_crtc *crtc = dsb->crtc;
+       enum pipe pipe = crtc->pipe;
+
+       intel_dsb_reg_write(dsb, DSB_POLLMASK(pipe, dsb->id), mask);
+       intel_dsb_reg_write(dsb, DSB_POLLFUNC(pipe, dsb->id),
+                           DSB_POLL_ENABLE |
+                           DSB_POLL_WAIT(wait_us) | DSB_POLL_COUNT(count));
+
+       intel_dsb_noop(dsb, 5);
+
+       intel_dsb_emit(dsb, val,
+                      (DSB_OPCODE_POLL << DSB_OPCODE_SHIFT) |
+                      i915_mmio_reg_offset(reg));
+}
+
 static void intel_dsb_align_tail(struct intel_dsb *dsb)
 {
        u32 aligned_tail, tail;
index da6df07a3c839d9ce55f2be99b214c7b2d9653e6..e843c52bf97c2b369d98bad8f5b4e1f093170ec4 100644 (file)
@@ -54,6 +54,9 @@ void intel_dsb_wait_scanline_out(struct intel_atomic_state *state,
                                 int lower, int upper);
 void intel_dsb_vblank_evade(struct intel_atomic_state *state,
                            struct intel_dsb *dsb);
+void intel_dsb_poll(struct intel_dsb *dsb,
+                   i915_reg_t reg, u32 mask, u32 val,
+                   int wait_us, int count);
 void intel_dsb_chain(struct intel_atomic_state *state,
                     struct intel_dsb *dsb,
                     struct intel_dsb *chained_dsb,