* [Intel-gfx] [PATCH 0/7] drm/i915: extract vblank/scanline code to a separate file
@ 2022-12-12 14:29 Jani Nikula
2022-12-12 14:29 ` [Intel-gfx] [PATCH 1/7] drm/i915/irq: split out vblank/scanline code to intel_vblank.[ch] Jani Nikula
` (10 more replies)
0 siblings, 11 replies; 28+ messages in thread
From: Jani Nikula @ 2022-12-12 14:29 UTC (permalink / raw)
To: intel-gfx; +Cc: jani.nikula
Add new intel_vblank.[ch] and dump a bunch of the vblank/scanline code
there.
Jani Nikula (7):
drm/i915/irq: split out vblank/scanline code to intel_vblank.[ch]
drm/i915/display: move more scanline functions to intel_vblank.[ch]
drm/i915/display: use common function for checking scanline is moving
drm/i915/hdmi: abstract scanline range wait into intel_vblank.[ch]
drm/i915/vblank: use intel_de_read()
drm/i915/vblank: add and use intel_de_read64_2x32() to read vblank
counter
drm/i915/reg: split out vblank/scanline regs
drivers/gpu/drm/i915/Makefile | 1 +
drivers/gpu/drm/i915/display/intel_crt.c | 1 +
drivers/gpu/drm/i915/display/intel_crtc.c | 1 +
drivers/gpu/drm/i915/display/intel_de.h | 7 +
drivers/gpu/drm/i915/display/intel_display.c | 54 +--
.../drm/i915/display/intel_display_trace.h | 1 +
drivers/gpu/drm/i915/display/intel_hdmi.c | 9 +-
drivers/gpu/drm/i915/display/intel_vblank.c | 456 ++++++++++++++++++
drivers/gpu/drm/i915/display/intel_vblank.h | 24 +
.../gpu/drm/i915/display/intel_vblank_regs.h | 42 ++
drivers/gpu/drm/i915/gvt/cmd_parser.c | 1 +
drivers/gpu/drm/i915/gvt/display.c | 1 +
drivers/gpu/drm/i915/gvt/handlers.c | 1 +
drivers/gpu/drm/i915/i915_irq.c | 408 ----------------
drivers/gpu/drm/i915/i915_irq.h | 6 -
drivers/gpu/drm/i915/i915_reg.h | 35 --
drivers/gpu/drm/i915/intel_gvt_mmio_table.c | 1 +
17 files changed, 541 insertions(+), 508 deletions(-)
create mode 100644 drivers/gpu/drm/i915/display/intel_vblank.c
create mode 100644 drivers/gpu/drm/i915/display/intel_vblank.h
create mode 100644 drivers/gpu/drm/i915/display/intel_vblank_regs.h
--
2.34.1
^ permalink raw reply [flat|nested] 28+ messages in thread
* [Intel-gfx] [PATCH 1/7] drm/i915/irq: split out vblank/scanline code to intel_vblank.[ch]
2022-12-12 14:29 [Intel-gfx] [PATCH 0/7] drm/i915: extract vblank/scanline code to a separate file Jani Nikula
@ 2022-12-12 14:29 ` Jani Nikula
2022-12-12 14:29 ` [Intel-gfx] [PATCH 2/7] drm/i915/display: move more scanline functions " Jani Nikula
` (9 subsequent siblings)
10 siblings, 0 replies; 28+ messages in thread
From: Jani Nikula @ 2022-12-12 14:29 UTC (permalink / raw)
To: intel-gfx; +Cc: jani.nikula
The vblank/scanline code is fairly isolated in i915_irq.c. Split it out
to new intel_vblank.[ch].
Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
drivers/gpu/drm/i915/Makefile | 1 +
drivers/gpu/drm/i915/display/intel_crtc.c | 1 +
.../drm/i915/display/intel_display_trace.h | 1 +
drivers/gpu/drm/i915/display/intel_vblank.c | 419 ++++++++++++++++++
drivers/gpu/drm/i915/display/intel_vblank.h | 21 +
drivers/gpu/drm/i915/i915_irq.c | 408 -----------------
drivers/gpu/drm/i915/i915_irq.h | 6 -
7 files changed, 443 insertions(+), 414 deletions(-)
create mode 100644 drivers/gpu/drm/i915/display/intel_vblank.c
create mode 100644 drivers/gpu/drm/i915/display/intel_vblank.h
diff --git a/drivers/gpu/drm/i915/Makefile b/drivers/gpu/drm/i915/Makefile
index dfa211451a1d..fc6d7885ad1d 100644
--- a/drivers/gpu/drm/i915/Makefile
+++ b/drivers/gpu/drm/i915/Makefile
@@ -263,6 +263,7 @@ i915-y += \
display/intel_quirks.o \
display/intel_sprite.o \
display/intel_tc.o \
+ display/intel_vblank.o \
display/intel_vga.o \
display/i9xx_plane.o \
display/skl_scaler.o \
diff --git a/drivers/gpu/drm/i915/display/intel_crtc.c b/drivers/gpu/drm/i915/display/intel_crtc.c
index 037fc140b585..82be0fbe9934 100644
--- a/drivers/gpu/drm/i915/display/intel_crtc.c
+++ b/drivers/gpu/drm/i915/display/intel_crtc.c
@@ -28,6 +28,7 @@
#include "intel_pipe_crc.h"
#include "intel_psr.h"
#include "intel_sprite.h"
+#include "intel_vblank.h"
#include "intel_vrr.h"
#include "skl_universal_plane.h"
diff --git a/drivers/gpu/drm/i915/display/intel_display_trace.h b/drivers/gpu/drm/i915/display/intel_display_trace.h
index 725aba3fa531..651ea8564e1b 100644
--- a/drivers/gpu/drm/i915/display/intel_display_trace.h
+++ b/drivers/gpu/drm/i915/display/intel_display_trace.h
@@ -17,6 +17,7 @@
#include "i915_irq.h"
#include "intel_crtc.h"
#include "intel_display_types.h"
+#include "intel_vblank.h"
#define __dev_name_i915(i915) dev_name((i915)->drm.dev)
#define __dev_name_kms(obj) dev_name((obj)->base.dev->dev)
diff --git a/drivers/gpu/drm/i915/display/intel_vblank.c b/drivers/gpu/drm/i915/display/intel_vblank.c
new file mode 100644
index 000000000000..78a579496ad1
--- /dev/null
+++ b/drivers/gpu/drm/i915/display/intel_vblank.c
@@ -0,0 +1,419 @@
+// SPDX-License-Identifier: MIT
+/*
+ * Copyright © 2022 Intel Corporation
+ */
+
+#include "i915_drv.h"
+#include "i915_reg.h"
+#include "intel_de.h"
+#include "intel_display_types.h"
+#include "intel_vblank.h"
+
+/*
+ * This timing diagram depicts the video signal in and
+ * around the vertical blanking period.
+ *
+ * Assumptions about the fictitious mode used in this example:
+ * vblank_start >= 3
+ * vsync_start = vblank_start + 1
+ * vsync_end = vblank_start + 2
+ * vtotal = vblank_start + 3
+ *
+ * start of vblank:
+ * latch double buffered registers
+ * increment frame counter (ctg+)
+ * generate start of vblank interrupt (gen4+)
+ * |
+ * | frame start:
+ * | generate frame start interrupt (aka. vblank interrupt) (gmch)
+ * | may be shifted forward 1-3 extra lines via PIPECONF
+ * | |
+ * | | start of vsync:
+ * | | generate vsync interrupt
+ * | | |
+ * ___xxxx___ ___xxxx___ ___xxxx___ ___xxxx___ ___xxxx___ ___xxxx
+ * . \hs/ . \hs/ \hs/ \hs/ . \hs/
+ * ----va---> <-----------------vb--------------------> <--------va-------------
+ * | | <----vs-----> |
+ * -vbs-----> <---vbs+1---> <---vbs+2---> <-----0-----> <-----1-----> <-----2--- (scanline counter gen2)
+ * -vbs-2---> <---vbs-1---> <---vbs-----> <---vbs+1---> <---vbs+2---> <-----0--- (scanline counter gen3+)
+ * -vbs-2---> <---vbs-2---> <---vbs-1---> <---vbs-----> <---vbs+1---> <---vbs+2- (scanline counter hsw+ hdmi)
+ * | | |
+ * last visible pixel first visible pixel
+ * | increment frame counter (gen3/4)
+ * pixel counter = vblank_start * htotal pixel counter = 0 (gen3/4)
+ *
+ * x = horizontal active
+ * _ = horizontal blanking
+ * hs = horizontal sync
+ * va = vertical active
+ * vb = vertical blanking
+ * vs = vertical sync
+ * vbs = vblank_start (number)
+ *
+ * Summary:
+ * - most events happen at the start of horizontal sync
+ * - frame start happens at the start of horizontal blank, 1-4 lines
+ * (depending on PIPECONF settings) after the start of vblank
+ * - gen3/4 pixel and frame counter are synchronized with the start
+ * of horizontal active on the first line of vertical active
+ */
+
+/*
+ * Called from drm generic code, passed a 'crtc', which we use as a pipe index.
+ */
+u32 i915_get_vblank_counter(struct drm_crtc *crtc)
+{
+ struct drm_i915_private *dev_priv = to_i915(crtc->dev);
+ struct drm_vblank_crtc *vblank = &dev_priv->drm.vblank[drm_crtc_index(crtc)];
+ const struct drm_display_mode *mode = &vblank->hwmode;
+ enum pipe pipe = to_intel_crtc(crtc)->pipe;
+ i915_reg_t high_frame, low_frame;
+ u32 high1, high2, low, pixel, vbl_start, hsync_start, htotal;
+ unsigned long irqflags;
+
+ /*
+ * On i965gm TV output the frame counter only works up to
+ * the point when we enable the TV encoder. After that the
+ * frame counter ceases to work and reads zero. We need a
+ * vblank wait before enabling the TV encoder and so we
+ * have to enable vblank interrupts while the frame counter
+ * is still in a working state. However the core vblank code
+ * does not like us returning non-zero frame counter values
+ * when we've told it that we don't have a working frame
+ * counter. Thus we must stop non-zero values leaking out.
+ */
+ if (!vblank->max_vblank_count)
+ return 0;
+
+ htotal = mode->crtc_htotal;
+ hsync_start = mode->crtc_hsync_start;
+ vbl_start = mode->crtc_vblank_start;
+ if (mode->flags & DRM_MODE_FLAG_INTERLACE)
+ vbl_start = DIV_ROUND_UP(vbl_start, 2);
+
+ /* Convert to pixel count */
+ vbl_start *= htotal;
+
+ /* Start of vblank event occurs at start of hsync */
+ vbl_start -= htotal - hsync_start;
+
+ high_frame = PIPEFRAME(pipe);
+ low_frame = PIPEFRAMEPIXEL(pipe);
+
+ spin_lock_irqsave(&dev_priv->uncore.lock, irqflags);
+
+ /*
+ * High & low register fields aren't synchronized, so make sure
+ * we get a low value that's stable across two reads of the high
+ * register.
+ */
+ do {
+ high1 = intel_de_read_fw(dev_priv, high_frame) & PIPE_FRAME_HIGH_MASK;
+ low = intel_de_read_fw(dev_priv, low_frame);
+ high2 = intel_de_read_fw(dev_priv, high_frame) & PIPE_FRAME_HIGH_MASK;
+ } while (high1 != high2);
+
+ spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags);
+
+ high1 >>= PIPE_FRAME_HIGH_SHIFT;
+ pixel = low & PIPE_PIXEL_MASK;
+ low >>= PIPE_FRAME_LOW_SHIFT;
+
+ /*
+ * The frame counter increments at beginning of active.
+ * Cook up a vblank counter by also checking the pixel
+ * counter against vblank start.
+ */
+ return (((high1 << 8) | low) + (pixel >= vbl_start)) & 0xffffff;
+}
+
+u32 g4x_get_vblank_counter(struct drm_crtc *crtc)
+{
+ struct drm_i915_private *dev_priv = to_i915(crtc->dev);
+ struct drm_vblank_crtc *vblank = &dev_priv->drm.vblank[drm_crtc_index(crtc)];
+ enum pipe pipe = to_intel_crtc(crtc)->pipe;
+
+ if (!vblank->max_vblank_count)
+ return 0;
+
+ return intel_uncore_read(&dev_priv->uncore, PIPE_FRMCOUNT_G4X(pipe));
+}
+
+static u32 intel_crtc_scanlines_since_frame_timestamp(struct intel_crtc *crtc)
+{
+ struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
+ struct drm_vblank_crtc *vblank =
+ &crtc->base.dev->vblank[drm_crtc_index(&crtc->base)];
+ const struct drm_display_mode *mode = &vblank->hwmode;
+ u32 htotal = mode->crtc_htotal;
+ u32 clock = mode->crtc_clock;
+ u32 scan_prev_time, scan_curr_time, scan_post_time;
+
+ /*
+ * To avoid the race condition where we might cross into the
+ * next vblank just between the PIPE_FRMTMSTMP and TIMESTAMP_CTR
+ * reads. We make sure we read PIPE_FRMTMSTMP and TIMESTAMP_CTR
+ * during the same frame.
+ */
+ do {
+ /*
+ * This field provides read back of the display
+ * pipe frame time stamp. The time stamp value
+ * is sampled at every start of vertical blank.
+ */
+ scan_prev_time = intel_de_read_fw(dev_priv,
+ PIPE_FRMTMSTMP(crtc->pipe));
+
+ /*
+ * The TIMESTAMP_CTR register has the current
+ * time stamp value.
+ */
+ scan_curr_time = intel_de_read_fw(dev_priv, IVB_TIMESTAMP_CTR);
+
+ scan_post_time = intel_de_read_fw(dev_priv,
+ PIPE_FRMTMSTMP(crtc->pipe));
+ } while (scan_post_time != scan_prev_time);
+
+ return div_u64(mul_u32_u32(scan_curr_time - scan_prev_time,
+ clock), 1000 * htotal);
+}
+
+/*
+ * On certain encoders on certain platforms, pipe
+ * scanline register will not work to get the scanline,
+ * since the timings are driven from the PORT or issues
+ * with scanline register updates.
+ * This function will use Framestamp and current
+ * timestamp registers to calculate the scanline.
+ */
+static u32 __intel_get_crtc_scanline_from_timestamp(struct intel_crtc *crtc)
+{
+ struct drm_vblank_crtc *vblank =
+ &crtc->base.dev->vblank[drm_crtc_index(&crtc->base)];
+ const struct drm_display_mode *mode = &vblank->hwmode;
+ u32 vblank_start = mode->crtc_vblank_start;
+ u32 vtotal = mode->crtc_vtotal;
+ u32 scanline;
+
+ scanline = intel_crtc_scanlines_since_frame_timestamp(crtc);
+ scanline = min(scanline, vtotal - 1);
+ scanline = (scanline + vblank_start) % vtotal;
+
+ return scanline;
+}
+
+/*
+ * intel_de_read_fw(), only for fast reads of display block, no need for
+ * forcewake etc.
+ */
+static int __intel_get_crtc_scanline(struct intel_crtc *crtc)
+{
+ struct drm_device *dev = crtc->base.dev;
+ struct drm_i915_private *dev_priv = to_i915(dev);
+ const struct drm_display_mode *mode;
+ struct drm_vblank_crtc *vblank;
+ enum pipe pipe = crtc->pipe;
+ int position, vtotal;
+
+ if (!crtc->active)
+ return 0;
+
+ vblank = &crtc->base.dev->vblank[drm_crtc_index(&crtc->base)];
+ mode = &vblank->hwmode;
+
+ if (crtc->mode_flags & I915_MODE_FLAG_GET_SCANLINE_FROM_TIMESTAMP)
+ return __intel_get_crtc_scanline_from_timestamp(crtc);
+
+ vtotal = mode->crtc_vtotal;
+ if (mode->flags & DRM_MODE_FLAG_INTERLACE)
+ vtotal /= 2;
+
+ position = intel_de_read_fw(dev_priv, PIPEDSL(pipe)) & PIPEDSL_LINE_MASK;
+
+ /*
+ * On HSW, the DSL reg (0x70000) appears to return 0 if we
+ * read it just before the start of vblank. So try it again
+ * so we don't accidentally end up spanning a vblank frame
+ * increment, causing the pipe_update_end() code to squak at us.
+ *
+ * The nature of this problem means we can't simply check the ISR
+ * bit and return the vblank start value; nor can we use the scanline
+ * debug register in the transcoder as it appears to have the same
+ * problem. We may need to extend this to include other platforms,
+ * but so far testing only shows the problem on HSW.
+ */
+ if (HAS_DDI(dev_priv) && !position) {
+ int i, temp;
+
+ for (i = 0; i < 100; i++) {
+ udelay(1);
+ temp = intel_de_read_fw(dev_priv, PIPEDSL(pipe)) & PIPEDSL_LINE_MASK;
+ if (temp != position) {
+ position = temp;
+ break;
+ }
+ }
+ }
+
+ /*
+ * See update_scanline_offset() for the details on the
+ * scanline_offset adjustment.
+ */
+ return (position + crtc->scanline_offset) % vtotal;
+}
+
+static bool i915_get_crtc_scanoutpos(struct drm_crtc *_crtc,
+ bool in_vblank_irq,
+ int *vpos, int *hpos,
+ ktime_t *stime, ktime_t *etime,
+ const struct drm_display_mode *mode)
+{
+ struct drm_device *dev = _crtc->dev;
+ struct drm_i915_private *dev_priv = to_i915(dev);
+ struct intel_crtc *crtc = to_intel_crtc(_crtc);
+ enum pipe pipe = crtc->pipe;
+ int position;
+ int vbl_start, vbl_end, hsync_start, htotal, vtotal;
+ unsigned long irqflags;
+ bool use_scanline_counter = DISPLAY_VER(dev_priv) >= 5 ||
+ IS_G4X(dev_priv) || DISPLAY_VER(dev_priv) == 2 ||
+ crtc->mode_flags & I915_MODE_FLAG_USE_SCANLINE_COUNTER;
+
+ if (drm_WARN_ON(&dev_priv->drm, !mode->crtc_clock)) {
+ drm_dbg(&dev_priv->drm,
+ "trying to get scanoutpos for disabled pipe %c\n",
+ pipe_name(pipe));
+ return false;
+ }
+
+ htotal = mode->crtc_htotal;
+ hsync_start = mode->crtc_hsync_start;
+ vtotal = mode->crtc_vtotal;
+ vbl_start = mode->crtc_vblank_start;
+ vbl_end = mode->crtc_vblank_end;
+
+ if (mode->flags & DRM_MODE_FLAG_INTERLACE) {
+ vbl_start = DIV_ROUND_UP(vbl_start, 2);
+ vbl_end /= 2;
+ vtotal /= 2;
+ }
+
+ /*
+ * Lock uncore.lock, as we will do multiple timing critical raw
+ * register reads, potentially with preemption disabled, so the
+ * following code must not block on uncore.lock.
+ */
+ spin_lock_irqsave(&dev_priv->uncore.lock, irqflags);
+
+ /* preempt_disable_rt() should go right here in PREEMPT_RT patchset. */
+
+ /* Get optional system timestamp before query. */
+ if (stime)
+ *stime = ktime_get();
+
+ if (crtc->mode_flags & I915_MODE_FLAG_VRR) {
+ int scanlines = intel_crtc_scanlines_since_frame_timestamp(crtc);
+
+ position = __intel_get_crtc_scanline(crtc);
+
+ /*
+ * Already exiting vblank? If so, shift our position
+ * so it looks like we're already apporaching the full
+ * vblank end. This should make the generated timestamp
+ * more or less match when the active portion will start.
+ */
+ if (position >= vbl_start && scanlines < position)
+ position = min(crtc->vmax_vblank_start + scanlines, vtotal - 1);
+ } else if (use_scanline_counter) {
+ /* No obvious pixelcount register. Only query vertical
+ * scanout position from Display scan line register.
+ */
+ position = __intel_get_crtc_scanline(crtc);
+ } else {
+ /*
+ * Have access to pixelcount since start of frame.
+ * We can split this into vertical and horizontal
+ * scanout position.
+ */
+ position = (intel_de_read_fw(dev_priv, PIPEFRAMEPIXEL(pipe)) & PIPE_PIXEL_MASK) >> PIPE_PIXEL_SHIFT;
+
+ /* convert to pixel counts */
+ vbl_start *= htotal;
+ vbl_end *= htotal;
+ vtotal *= htotal;
+
+ /*
+ * In interlaced modes, the pixel counter counts all pixels,
+ * so one field will have htotal more pixels. In order to avoid
+ * the reported position from jumping backwards when the pixel
+ * counter is beyond the length of the shorter field, just
+ * clamp the position the length of the shorter field. This
+ * matches how the scanline counter based position works since
+ * the scanline counter doesn't count the two half lines.
+ */
+ if (position >= vtotal)
+ position = vtotal - 1;
+
+ /*
+ * Start of vblank interrupt is triggered at start of hsync,
+ * just prior to the first active line of vblank. However we
+ * consider lines to start at the leading edge of horizontal
+ * active. So, should we get here before we've crossed into
+ * the horizontal active of the first line in vblank, we would
+ * not set the DRM_SCANOUTPOS_INVBL flag. In order to fix that,
+ * always add htotal-hsync_start to the current pixel position.
+ */
+ position = (position + htotal - hsync_start) % vtotal;
+ }
+
+ /* Get optional system timestamp after query. */
+ if (etime)
+ *etime = ktime_get();
+
+ /* preempt_enable_rt() should go right here in PREEMPT_RT patchset. */
+
+ spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags);
+
+ /*
+ * While in vblank, position will be negative
+ * counting up towards 0 at vbl_end. And outside
+ * vblank, position will be positive counting
+ * up since vbl_end.
+ */
+ if (position >= vbl_start)
+ position -= vbl_end;
+ else
+ position += vtotal - vbl_end;
+
+ if (use_scanline_counter) {
+ *vpos = position;
+ *hpos = 0;
+ } else {
+ *vpos = position / htotal;
+ *hpos = position - (*vpos * htotal);
+ }
+
+ return true;
+}
+
+bool intel_crtc_get_vblank_timestamp(struct drm_crtc *crtc, int *max_error,
+ ktime_t *vblank_time, bool in_vblank_irq)
+{
+ return drm_crtc_vblank_helper_get_vblank_timestamp_internal(
+ crtc, max_error, vblank_time, in_vblank_irq,
+ i915_get_crtc_scanoutpos);
+}
+
+int intel_get_crtc_scanline(struct intel_crtc *crtc)
+{
+ struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
+ unsigned long irqflags;
+ int position;
+
+ spin_lock_irqsave(&dev_priv->uncore.lock, irqflags);
+ position = __intel_get_crtc_scanline(crtc);
+ spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags);
+
+ return position;
+}
diff --git a/drivers/gpu/drm/i915/display/intel_vblank.h b/drivers/gpu/drm/i915/display/intel_vblank.h
new file mode 100644
index 000000000000..9c0034d7454d
--- /dev/null
+++ b/drivers/gpu/drm/i915/display/intel_vblank.h
@@ -0,0 +1,21 @@
+/* SPDX-License-Identifier: MIT */
+/*
+ * Copyright © 2022 Intel Corporation
+ */
+
+#ifndef __INTEL_VBLANK_H__
+#define __INTEL_VBLANK_H__
+
+#include <linux/ktime.h>
+#include <linux/types.h>
+
+struct drm_crtc;
+struct intel_crtc;
+
+u32 i915_get_vblank_counter(struct drm_crtc *crtc);
+u32 g4x_get_vblank_counter(struct drm_crtc *crtc);
+bool intel_crtc_get_vblank_timestamp(struct drm_crtc *crtc, int *max_error,
+ ktime_t *vblank_time, bool in_vblank_irq);
+int intel_get_crtc_scanline(struct intel_crtc *crtc);
+
+#endif /* __INTEL_VBLANK_H__ */
diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c
index edfe363af838..3ef86a80c401 100644
--- a/drivers/gpu/drm/i915/i915_irq.c
+++ b/drivers/gpu/drm/i915/i915_irq.c
@@ -614,414 +614,6 @@ static void i915_enable_asle_pipestat(struct drm_i915_private *dev_priv)
spin_unlock_irq(&dev_priv->irq_lock);
}
-/*
- * This timing diagram depicts the video signal in and
- * around the vertical blanking period.
- *
- * Assumptions about the fictitious mode used in this example:
- * vblank_start >= 3
- * vsync_start = vblank_start + 1
- * vsync_end = vblank_start + 2
- * vtotal = vblank_start + 3
- *
- * start of vblank:
- * latch double buffered registers
- * increment frame counter (ctg+)
- * generate start of vblank interrupt (gen4+)
- * |
- * | frame start:
- * | generate frame start interrupt (aka. vblank interrupt) (gmch)
- * | may be shifted forward 1-3 extra lines via PIPECONF
- * | |
- * | | start of vsync:
- * | | generate vsync interrupt
- * | | |
- * ___xxxx___ ___xxxx___ ___xxxx___ ___xxxx___ ___xxxx___ ___xxxx
- * . \hs/ . \hs/ \hs/ \hs/ . \hs/
- * ----va---> <-----------------vb--------------------> <--------va-------------
- * | | <----vs-----> |
- * -vbs-----> <---vbs+1---> <---vbs+2---> <-----0-----> <-----1-----> <-----2--- (scanline counter gen2)
- * -vbs-2---> <---vbs-1---> <---vbs-----> <---vbs+1---> <---vbs+2---> <-----0--- (scanline counter gen3+)
- * -vbs-2---> <---vbs-2---> <---vbs-1---> <---vbs-----> <---vbs+1---> <---vbs+2- (scanline counter hsw+ hdmi)
- * | | |
- * last visible pixel first visible pixel
- * | increment frame counter (gen3/4)
- * pixel counter = vblank_start * htotal pixel counter = 0 (gen3/4)
- *
- * x = horizontal active
- * _ = horizontal blanking
- * hs = horizontal sync
- * va = vertical active
- * vb = vertical blanking
- * vs = vertical sync
- * vbs = vblank_start (number)
- *
- * Summary:
- * - most events happen at the start of horizontal sync
- * - frame start happens at the start of horizontal blank, 1-4 lines
- * (depending on PIPECONF settings) after the start of vblank
- * - gen3/4 pixel and frame counter are synchronized with the start
- * of horizontal active on the first line of vertical active
- */
-
-/* Called from drm generic code, passed a 'crtc', which
- * we use as a pipe index
- */
-u32 i915_get_vblank_counter(struct drm_crtc *crtc)
-{
- struct drm_i915_private *dev_priv = to_i915(crtc->dev);
- struct drm_vblank_crtc *vblank = &dev_priv->drm.vblank[drm_crtc_index(crtc)];
- const struct drm_display_mode *mode = &vblank->hwmode;
- enum pipe pipe = to_intel_crtc(crtc)->pipe;
- i915_reg_t high_frame, low_frame;
- u32 high1, high2, low, pixel, vbl_start, hsync_start, htotal;
- unsigned long irqflags;
-
- /*
- * On i965gm TV output the frame counter only works up to
- * the point when we enable the TV encoder. After that the
- * frame counter ceases to work and reads zero. We need a
- * vblank wait before enabling the TV encoder and so we
- * have to enable vblank interrupts while the frame counter
- * is still in a working state. However the core vblank code
- * does not like us returning non-zero frame counter values
- * when we've told it that we don't have a working frame
- * counter. Thus we must stop non-zero values leaking out.
- */
- if (!vblank->max_vblank_count)
- return 0;
-
- htotal = mode->crtc_htotal;
- hsync_start = mode->crtc_hsync_start;
- vbl_start = mode->crtc_vblank_start;
- if (mode->flags & DRM_MODE_FLAG_INTERLACE)
- vbl_start = DIV_ROUND_UP(vbl_start, 2);
-
- /* Convert to pixel count */
- vbl_start *= htotal;
-
- /* Start of vblank event occurs at start of hsync */
- vbl_start -= htotal - hsync_start;
-
- high_frame = PIPEFRAME(pipe);
- low_frame = PIPEFRAMEPIXEL(pipe);
-
- spin_lock_irqsave(&dev_priv->uncore.lock, irqflags);
-
- /*
- * High & low register fields aren't synchronized, so make sure
- * we get a low value that's stable across two reads of the high
- * register.
- */
- do {
- high1 = intel_de_read_fw(dev_priv, high_frame) & PIPE_FRAME_HIGH_MASK;
- low = intel_de_read_fw(dev_priv, low_frame);
- high2 = intel_de_read_fw(dev_priv, high_frame) & PIPE_FRAME_HIGH_MASK;
- } while (high1 != high2);
-
- spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags);
-
- high1 >>= PIPE_FRAME_HIGH_SHIFT;
- pixel = low & PIPE_PIXEL_MASK;
- low >>= PIPE_FRAME_LOW_SHIFT;
-
- /*
- * The frame counter increments at beginning of active.
- * Cook up a vblank counter by also checking the pixel
- * counter against vblank start.
- */
- return (((high1 << 8) | low) + (pixel >= vbl_start)) & 0xffffff;
-}
-
-u32 g4x_get_vblank_counter(struct drm_crtc *crtc)
-{
- struct drm_i915_private *dev_priv = to_i915(crtc->dev);
- struct drm_vblank_crtc *vblank = &dev_priv->drm.vblank[drm_crtc_index(crtc)];
- enum pipe pipe = to_intel_crtc(crtc)->pipe;
-
- if (!vblank->max_vblank_count)
- return 0;
-
- return intel_uncore_read(&dev_priv->uncore, PIPE_FRMCOUNT_G4X(pipe));
-}
-
-static u32 intel_crtc_scanlines_since_frame_timestamp(struct intel_crtc *crtc)
-{
- struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
- struct drm_vblank_crtc *vblank =
- &crtc->base.dev->vblank[drm_crtc_index(&crtc->base)];
- const struct drm_display_mode *mode = &vblank->hwmode;
- u32 htotal = mode->crtc_htotal;
- u32 clock = mode->crtc_clock;
- u32 scan_prev_time, scan_curr_time, scan_post_time;
-
- /*
- * To avoid the race condition where we might cross into the
- * next vblank just between the PIPE_FRMTMSTMP and TIMESTAMP_CTR
- * reads. We make sure we read PIPE_FRMTMSTMP and TIMESTAMP_CTR
- * during the same frame.
- */
- do {
- /*
- * This field provides read back of the display
- * pipe frame time stamp. The time stamp value
- * is sampled at every start of vertical blank.
- */
- scan_prev_time = intel_de_read_fw(dev_priv,
- PIPE_FRMTMSTMP(crtc->pipe));
-
- /*
- * The TIMESTAMP_CTR register has the current
- * time stamp value.
- */
- scan_curr_time = intel_de_read_fw(dev_priv, IVB_TIMESTAMP_CTR);
-
- scan_post_time = intel_de_read_fw(dev_priv,
- PIPE_FRMTMSTMP(crtc->pipe));
- } while (scan_post_time != scan_prev_time);
-
- return div_u64(mul_u32_u32(scan_curr_time - scan_prev_time,
- clock), 1000 * htotal);
-}
-
-/*
- * On certain encoders on certain platforms, pipe
- * scanline register will not work to get the scanline,
- * since the timings are driven from the PORT or issues
- * with scanline register updates.
- * This function will use Framestamp and current
- * timestamp registers to calculate the scanline.
- */
-static u32 __intel_get_crtc_scanline_from_timestamp(struct intel_crtc *crtc)
-{
- struct drm_vblank_crtc *vblank =
- &crtc->base.dev->vblank[drm_crtc_index(&crtc->base)];
- const struct drm_display_mode *mode = &vblank->hwmode;
- u32 vblank_start = mode->crtc_vblank_start;
- u32 vtotal = mode->crtc_vtotal;
- u32 scanline;
-
- scanline = intel_crtc_scanlines_since_frame_timestamp(crtc);
- scanline = min(scanline, vtotal - 1);
- scanline = (scanline + vblank_start) % vtotal;
-
- return scanline;
-}
-
-/*
- * intel_de_read_fw(), only for fast reads of display block, no need for
- * forcewake etc.
- */
-static int __intel_get_crtc_scanline(struct intel_crtc *crtc)
-{
- struct drm_device *dev = crtc->base.dev;
- struct drm_i915_private *dev_priv = to_i915(dev);
- const struct drm_display_mode *mode;
- struct drm_vblank_crtc *vblank;
- enum pipe pipe = crtc->pipe;
- int position, vtotal;
-
- if (!crtc->active)
- return 0;
-
- vblank = &crtc->base.dev->vblank[drm_crtc_index(&crtc->base)];
- mode = &vblank->hwmode;
-
- if (crtc->mode_flags & I915_MODE_FLAG_GET_SCANLINE_FROM_TIMESTAMP)
- return __intel_get_crtc_scanline_from_timestamp(crtc);
-
- vtotal = mode->crtc_vtotal;
- if (mode->flags & DRM_MODE_FLAG_INTERLACE)
- vtotal /= 2;
-
- position = intel_de_read_fw(dev_priv, PIPEDSL(pipe)) & PIPEDSL_LINE_MASK;
-
- /*
- * On HSW, the DSL reg (0x70000) appears to return 0 if we
- * read it just before the start of vblank. So try it again
- * so we don't accidentally end up spanning a vblank frame
- * increment, causing the pipe_update_end() code to squak at us.
- *
- * The nature of this problem means we can't simply check the ISR
- * bit and return the vblank start value; nor can we use the scanline
- * debug register in the transcoder as it appears to have the same
- * problem. We may need to extend this to include other platforms,
- * but so far testing only shows the problem on HSW.
- */
- if (HAS_DDI(dev_priv) && !position) {
- int i, temp;
-
- for (i = 0; i < 100; i++) {
- udelay(1);
- temp = intel_de_read_fw(dev_priv, PIPEDSL(pipe)) & PIPEDSL_LINE_MASK;
- if (temp != position) {
- position = temp;
- break;
- }
- }
- }
-
- /*
- * See update_scanline_offset() for the details on the
- * scanline_offset adjustment.
- */
- return (position + crtc->scanline_offset) % vtotal;
-}
-
-static bool i915_get_crtc_scanoutpos(struct drm_crtc *_crtc,
- bool in_vblank_irq,
- int *vpos, int *hpos,
- ktime_t *stime, ktime_t *etime,
- const struct drm_display_mode *mode)
-{
- struct drm_device *dev = _crtc->dev;
- struct drm_i915_private *dev_priv = to_i915(dev);
- struct intel_crtc *crtc = to_intel_crtc(_crtc);
- enum pipe pipe = crtc->pipe;
- int position;
- int vbl_start, vbl_end, hsync_start, htotal, vtotal;
- unsigned long irqflags;
- bool use_scanline_counter = DISPLAY_VER(dev_priv) >= 5 ||
- IS_G4X(dev_priv) || DISPLAY_VER(dev_priv) == 2 ||
- crtc->mode_flags & I915_MODE_FLAG_USE_SCANLINE_COUNTER;
-
- if (drm_WARN_ON(&dev_priv->drm, !mode->crtc_clock)) {
- drm_dbg(&dev_priv->drm,
- "trying to get scanoutpos for disabled "
- "pipe %c\n", pipe_name(pipe));
- return false;
- }
-
- htotal = mode->crtc_htotal;
- hsync_start = mode->crtc_hsync_start;
- vtotal = mode->crtc_vtotal;
- vbl_start = mode->crtc_vblank_start;
- vbl_end = mode->crtc_vblank_end;
-
- if (mode->flags & DRM_MODE_FLAG_INTERLACE) {
- vbl_start = DIV_ROUND_UP(vbl_start, 2);
- vbl_end /= 2;
- vtotal /= 2;
- }
-
- /*
- * Lock uncore.lock, as we will do multiple timing critical raw
- * register reads, potentially with preemption disabled, so the
- * following code must not block on uncore.lock.
- */
- spin_lock_irqsave(&dev_priv->uncore.lock, irqflags);
-
- /* preempt_disable_rt() should go right here in PREEMPT_RT patchset. */
-
- /* Get optional system timestamp before query. */
- if (stime)
- *stime = ktime_get();
-
- if (crtc->mode_flags & I915_MODE_FLAG_VRR) {
- int scanlines = intel_crtc_scanlines_since_frame_timestamp(crtc);
-
- position = __intel_get_crtc_scanline(crtc);
-
- /*
- * Already exiting vblank? If so, shift our position
- * so it looks like we're already apporaching the full
- * vblank end. This should make the generated timestamp
- * more or less match when the active portion will start.
- */
- if (position >= vbl_start && scanlines < position)
- position = min(crtc->vmax_vblank_start + scanlines, vtotal - 1);
- } else if (use_scanline_counter) {
- /* No obvious pixelcount register. Only query vertical
- * scanout position from Display scan line register.
- */
- position = __intel_get_crtc_scanline(crtc);
- } else {
- /* Have access to pixelcount since start of frame.
- * We can split this into vertical and horizontal
- * scanout position.
- */
- position = (intel_de_read_fw(dev_priv, PIPEFRAMEPIXEL(pipe)) & PIPE_PIXEL_MASK) >> PIPE_PIXEL_SHIFT;
-
- /* convert to pixel counts */
- vbl_start *= htotal;
- vbl_end *= htotal;
- vtotal *= htotal;
-
- /*
- * In interlaced modes, the pixel counter counts all pixels,
- * so one field will have htotal more pixels. In order to avoid
- * the reported position from jumping backwards when the pixel
- * counter is beyond the length of the shorter field, just
- * clamp the position the length of the shorter field. This
- * matches how the scanline counter based position works since
- * the scanline counter doesn't count the two half lines.
- */
- if (position >= vtotal)
- position = vtotal - 1;
-
- /*
- * Start of vblank interrupt is triggered at start of hsync,
- * just prior to the first active line of vblank. However we
- * consider lines to start at the leading edge of horizontal
- * active. So, should we get here before we've crossed into
- * the horizontal active of the first line in vblank, we would
- * not set the DRM_SCANOUTPOS_INVBL flag. In order to fix that,
- * always add htotal-hsync_start to the current pixel position.
- */
- position = (position + htotal - hsync_start) % vtotal;
- }
-
- /* Get optional system timestamp after query. */
- if (etime)
- *etime = ktime_get();
-
- /* preempt_enable_rt() should go right here in PREEMPT_RT patchset. */
-
- spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags);
-
- /*
- * While in vblank, position will be negative
- * counting up towards 0 at vbl_end. And outside
- * vblank, position will be positive counting
- * up since vbl_end.
- */
- if (position >= vbl_start)
- position -= vbl_end;
- else
- position += vtotal - vbl_end;
-
- if (use_scanline_counter) {
- *vpos = position;
- *hpos = 0;
- } else {
- *vpos = position / htotal;
- *hpos = position - (*vpos * htotal);
- }
-
- return true;
-}
-
-bool intel_crtc_get_vblank_timestamp(struct drm_crtc *crtc, int *max_error,
- ktime_t *vblank_time, bool in_vblank_irq)
-{
- return drm_crtc_vblank_helper_get_vblank_timestamp_internal(
- crtc, max_error, vblank_time, in_vblank_irq,
- i915_get_crtc_scanoutpos);
-}
-
-int intel_get_crtc_scanline(struct intel_crtc *crtc)
-{
- struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
- unsigned long irqflags;
- int position;
-
- spin_lock_irqsave(&dev_priv->uncore.lock, irqflags);
- position = __intel_get_crtc_scanline(crtc);
- spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags);
-
- return position;
-}
-
/**
* ivb_parity_work - Workqueue called when a parity error interrupt
* occurred.
diff --git a/drivers/gpu/drm/i915/i915_irq.h b/drivers/gpu/drm/i915/i915_irq.h
index 9b004fc3444e..03ee4c8b1ed3 100644
--- a/drivers/gpu/drm/i915/i915_irq.h
+++ b/drivers/gpu/drm/i915/i915_irq.h
@@ -66,18 +66,12 @@ bool intel_irqs_enabled(struct drm_i915_private *dev_priv);
void intel_synchronize_irq(struct drm_i915_private *i915);
void intel_synchronize_hardirq(struct drm_i915_private *i915);
-int intel_get_crtc_scanline(struct intel_crtc *crtc);
void gen8_irq_power_well_post_enable(struct drm_i915_private *dev_priv,
u8 pipe_mask);
void gen8_irq_power_well_pre_disable(struct drm_i915_private *dev_priv,
u8 pipe_mask);
u32 gen8_de_pipe_underrun_mask(struct drm_i915_private *dev_priv);
-bool intel_crtc_get_vblank_timestamp(struct drm_crtc *crtc, int *max_error,
- ktime_t *vblank_time, bool in_vblank_irq);
-
-u32 i915_get_vblank_counter(struct drm_crtc *crtc);
-u32 g4x_get_vblank_counter(struct drm_crtc *crtc);
int i8xx_enable_vblank(struct drm_crtc *crtc);
int i915gm_enable_vblank(struct drm_crtc *crtc);
--
2.34.1
^ permalink raw reply related [flat|nested] 28+ messages in thread
* [Intel-gfx] [PATCH 2/7] drm/i915/display: move more scanline functions to intel_vblank.[ch]
2022-12-12 14:29 [Intel-gfx] [PATCH 0/7] drm/i915: extract vblank/scanline code to a separate file Jani Nikula
2022-12-12 14:29 ` [Intel-gfx] [PATCH 1/7] drm/i915/irq: split out vblank/scanline code to intel_vblank.[ch] Jani Nikula
@ 2022-12-12 14:29 ` Jani Nikula
2022-12-14 4:15 ` Murthy, Arun R
2022-12-12 14:29 ` [Intel-gfx] [PATCH 3/7] drm/i915/display: use common function for checking scanline is moving Jani Nikula
` (8 subsequent siblings)
10 siblings, 1 reply; 28+ messages in thread
From: Jani Nikula @ 2022-12-12 14:29 UTC (permalink / raw)
To: intel-gfx; +Cc: jani.nikula
Reduce clutter in intel_display.c by moving the scanline moving/stopped
wait functions to intel_vblank.[ch].
Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
drivers/gpu/drm/i915/display/intel_display.c | 36 +-------------------
drivers/gpu/drm/i915/display/intel_vblank.c | 35 +++++++++++++++++++
drivers/gpu/drm/i915/display/intel_vblank.h | 2 ++
3 files changed, 38 insertions(+), 35 deletions(-)
diff --git a/drivers/gpu/drm/i915/display/intel_display.c b/drivers/gpu/drm/i915/display/intel_display.c
index 6cdfdae2c712..0cdb514d7ee0 100644
--- a/drivers/gpu/drm/i915/display/intel_display.c
+++ b/drivers/gpu/drm/i915/display/intel_display.c
@@ -115,6 +115,7 @@
#include "intel_quirks.h"
#include "intel_sprite.h"
#include "intel_tc.h"
+#include "intel_vblank.h"
#include "intel_vga.h"
#include "i9xx_plane.h"
#include "skl_scaler.h"
@@ -386,41 +387,6 @@ struct intel_crtc *intel_master_crtc(const struct intel_crtc_state *crtc_state)
return to_intel_crtc(crtc_state->uapi.crtc);
}
-static bool pipe_scanline_is_moving(struct drm_i915_private *dev_priv,
- enum pipe pipe)
-{
- i915_reg_t reg = PIPEDSL(pipe);
- u32 line1, line2;
-
- line1 = intel_de_read(dev_priv, reg) & PIPEDSL_LINE_MASK;
- msleep(5);
- line2 = intel_de_read(dev_priv, reg) & PIPEDSL_LINE_MASK;
-
- return line1 != line2;
-}
-
-static void wait_for_pipe_scanline_moving(struct intel_crtc *crtc, bool state)
-{
- struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
- enum pipe pipe = crtc->pipe;
-
- /* Wait for the display line to settle/start moving */
- if (wait_for(pipe_scanline_is_moving(dev_priv, pipe) == state, 100))
- drm_err(&dev_priv->drm,
- "pipe %c scanline %s wait timed out\n",
- pipe_name(pipe), str_on_off(state));
-}
-
-static void intel_wait_for_pipe_scanline_stopped(struct intel_crtc *crtc)
-{
- wait_for_pipe_scanline_moving(crtc, false);
-}
-
-static void intel_wait_for_pipe_scanline_moving(struct intel_crtc *crtc)
-{
- wait_for_pipe_scanline_moving(crtc, true);
-}
-
static void
intel_wait_for_pipe_off(const struct intel_crtc_state *old_crtc_state)
{
diff --git a/drivers/gpu/drm/i915/display/intel_vblank.c b/drivers/gpu/drm/i915/display/intel_vblank.c
index 78a579496ad1..f25ec643a0a3 100644
--- a/drivers/gpu/drm/i915/display/intel_vblank.c
+++ b/drivers/gpu/drm/i915/display/intel_vblank.c
@@ -417,3 +417,38 @@ int intel_get_crtc_scanline(struct intel_crtc *crtc)
return position;
}
+
+static bool pipe_scanline_is_moving(struct drm_i915_private *dev_priv,
+ enum pipe pipe)
+{
+ i915_reg_t reg = PIPEDSL(pipe);
+ u32 line1, line2;
+
+ line1 = intel_de_read(dev_priv, reg) & PIPEDSL_LINE_MASK;
+ msleep(5);
+ line2 = intel_de_read(dev_priv, reg) & PIPEDSL_LINE_MASK;
+
+ return line1 != line2;
+}
+
+static void wait_for_pipe_scanline_moving(struct intel_crtc *crtc, bool state)
+{
+ struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
+ enum pipe pipe = crtc->pipe;
+
+ /* Wait for the display line to settle/start moving */
+ if (wait_for(pipe_scanline_is_moving(dev_priv, pipe) == state, 100))
+ drm_err(&dev_priv->drm,
+ "pipe %c scanline %s wait timed out\n",
+ pipe_name(pipe), str_on_off(state));
+}
+
+void intel_wait_for_pipe_scanline_stopped(struct intel_crtc *crtc)
+{
+ wait_for_pipe_scanline_moving(crtc, false);
+}
+
+void intel_wait_for_pipe_scanline_moving(struct intel_crtc *crtc)
+{
+ wait_for_pipe_scanline_moving(crtc, true);
+}
diff --git a/drivers/gpu/drm/i915/display/intel_vblank.h b/drivers/gpu/drm/i915/display/intel_vblank.h
index 9c0034d7454d..54870cabd734 100644
--- a/drivers/gpu/drm/i915/display/intel_vblank.h
+++ b/drivers/gpu/drm/i915/display/intel_vblank.h
@@ -17,5 +17,7 @@ u32 g4x_get_vblank_counter(struct drm_crtc *crtc);
bool intel_crtc_get_vblank_timestamp(struct drm_crtc *crtc, int *max_error,
ktime_t *vblank_time, bool in_vblank_irq);
int intel_get_crtc_scanline(struct intel_crtc *crtc);
+void intel_wait_for_pipe_scanline_stopped(struct intel_crtc *crtc);
+void intel_wait_for_pipe_scanline_moving(struct intel_crtc *crtc);
#endif /* __INTEL_VBLANK_H__ */
--
2.34.1
^ permalink raw reply related [flat|nested] 28+ messages in thread
* [Intel-gfx] [PATCH 3/7] drm/i915/display: use common function for checking scanline is moving
2022-12-12 14:29 [Intel-gfx] [PATCH 0/7] drm/i915: extract vblank/scanline code to a separate file Jani Nikula
2022-12-12 14:29 ` [Intel-gfx] [PATCH 1/7] drm/i915/irq: split out vblank/scanline code to intel_vblank.[ch] Jani Nikula
2022-12-12 14:29 ` [Intel-gfx] [PATCH 2/7] drm/i915/display: move more scanline functions " Jani Nikula
@ 2022-12-12 14:29 ` Jani Nikula
2022-12-14 4:01 ` Murthy, Arun R
2022-12-12 14:29 ` [Intel-gfx] [PATCH 4/7] drm/i915/hdmi: abstract scanline range wait into intel_vblank.[ch] Jani Nikula
` (7 subsequent siblings)
10 siblings, 1 reply; 28+ messages in thread
From: Jani Nikula @ 2022-12-12 14:29 UTC (permalink / raw)
To: intel-gfx; +Cc: jani.nikula
cpt_verify_modeset() is roughly the same as
intel_wait_for_pipe_scanline_moving(). Assume it's close enough.
Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
drivers/gpu/drm/i915/display/intel_display.c | 18 +-----------------
1 file changed, 1 insertion(+), 17 deletions(-)
diff --git a/drivers/gpu/drm/i915/display/intel_display.c b/drivers/gpu/drm/i915/display/intel_display.c
index 0cdb514d7ee0..ef15cc2b1fa9 100644
--- a/drivers/gpu/drm/i915/display/intel_display.c
+++ b/drivers/gpu/drm/i915/display/intel_display.c
@@ -1062,22 +1062,6 @@ intel_get_crtc_new_encoder(const struct intel_atomic_state *state,
return encoder;
}
-static void cpt_verify_modeset(struct drm_i915_private *dev_priv,
- enum pipe pipe)
-{
- i915_reg_t dslreg = PIPEDSL(pipe);
- u32 temp;
-
- temp = intel_de_read(dev_priv, dslreg);
- udelay(500);
- if (wait_for(intel_de_read(dev_priv, dslreg) != temp, 5)) {
- if (wait_for(intel_de_read(dev_priv, dslreg) != temp, 5))
- drm_err(&dev_priv->drm,
- "mode set failed: pipe %c stuck\n",
- pipe_name(pipe));
- }
-}
-
static void ilk_pfit_enable(const struct intel_crtc_state *crtc_state)
{
struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
@@ -1772,7 +1756,7 @@ static void ilk_crtc_enable(struct intel_atomic_state *state,
intel_encoders_enable(state, crtc);
if (HAS_PCH_CPT(dev_priv))
- cpt_verify_modeset(dev_priv, pipe);
+ intel_wait_for_pipe_scanline_moving(crtc);
/*
* Must wait for vblank to avoid spurious PCH FIFO underruns.
--
2.34.1
^ permalink raw reply related [flat|nested] 28+ messages in thread
* [Intel-gfx] [PATCH 4/7] drm/i915/hdmi: abstract scanline range wait into intel_vblank.[ch]
2022-12-12 14:29 [Intel-gfx] [PATCH 0/7] drm/i915: extract vblank/scanline code to a separate file Jani Nikula
` (2 preceding siblings ...)
2022-12-12 14:29 ` [Intel-gfx] [PATCH 3/7] drm/i915/display: use common function for checking scanline is moving Jani Nikula
@ 2022-12-12 14:29 ` Jani Nikula
2022-12-14 4:17 ` Murthy, Arun R
2022-12-14 14:16 ` Ville Syrjälä
2022-12-12 14:29 ` [Intel-gfx] [PATCH 5/7] drm/i915/vblank: use intel_de_read() Jani Nikula
` (6 subsequent siblings)
10 siblings, 2 replies; 28+ messages in thread
From: Jani Nikula @ 2022-12-12 14:29 UTC (permalink / raw)
To: intel-gfx; +Cc: jani.nikula
Let's not have scanline waits inline in hdmi code.
This kind of waits should really have timeouts; add a FIXME comment.
Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
drivers/gpu/drm/i915/display/intel_hdmi.c | 9 ++-------
drivers/gpu/drm/i915/display/intel_vblank.c | 14 ++++++++++++++
drivers/gpu/drm/i915/display/intel_vblank.h | 1 +
3 files changed, 17 insertions(+), 7 deletions(-)
diff --git a/drivers/gpu/drm/i915/display/intel_hdmi.c b/drivers/gpu/drm/i915/display/intel_hdmi.c
index e82f8a07e2b0..af6ef665368e 100644
--- a/drivers/gpu/drm/i915/display/intel_hdmi.c
+++ b/drivers/gpu/drm/i915/display/intel_hdmi.c
@@ -56,6 +56,7 @@
#include "intel_lspcon.h"
#include "intel_panel.h"
#include "intel_snps_phy.h"
+#include "intel_vblank.h"
static struct drm_i915_private *intel_hdmi_to_i915(struct intel_hdmi *intel_hdmi)
{
@@ -1476,15 +1477,9 @@ static int kbl_repositioning_enc_en_signal(struct intel_connector *connector,
struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
struct intel_digital_port *dig_port = intel_attached_dig_port(connector);
struct intel_crtc *crtc = to_intel_crtc(connector->base.state->crtc);
- u32 scanline;
int ret;
- for (;;) {
- scanline = intel_de_read(dev_priv, PIPEDSL(crtc->pipe));
- if (scanline > 100 && scanline < 200)
- break;
- usleep_range(25, 50);
- }
+ intel_wait_for_pipe_scanline_range(crtc, 100, 200);
ret = intel_ddi_toggle_hdcp_bits(&dig_port->base, cpu_transcoder,
false, TRANS_DDI_HDCP_SIGNALLING);
diff --git a/drivers/gpu/drm/i915/display/intel_vblank.c b/drivers/gpu/drm/i915/display/intel_vblank.c
index f25ec643a0a3..aec7758ef917 100644
--- a/drivers/gpu/drm/i915/display/intel_vblank.c
+++ b/drivers/gpu/drm/i915/display/intel_vblank.c
@@ -452,3 +452,17 @@ void intel_wait_for_pipe_scanline_moving(struct intel_crtc *crtc)
{
wait_for_pipe_scanline_moving(crtc, true);
}
+
+void intel_wait_for_pipe_scanline_range(struct intel_crtc *crtc, u32 start, u32 end)
+{
+ struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
+ u32 scanline;
+
+ /* FIXME: This needs to timeout and/or check that scanline is moving. */
+ for (;;) {
+ scanline = intel_de_read(dev_priv, PIPEDSL(crtc->pipe));
+ if (scanline > start && scanline < end)
+ break;
+ usleep_range(25, 50);
+ }
+}
diff --git a/drivers/gpu/drm/i915/display/intel_vblank.h b/drivers/gpu/drm/i915/display/intel_vblank.h
index 54870cabd734..e88addfccea8 100644
--- a/drivers/gpu/drm/i915/display/intel_vblank.h
+++ b/drivers/gpu/drm/i915/display/intel_vblank.h
@@ -19,5 +19,6 @@ bool intel_crtc_get_vblank_timestamp(struct drm_crtc *crtc, int *max_error,
int intel_get_crtc_scanline(struct intel_crtc *crtc);
void intel_wait_for_pipe_scanline_stopped(struct intel_crtc *crtc);
void intel_wait_for_pipe_scanline_moving(struct intel_crtc *crtc);
+void intel_wait_for_pipe_scanline_range(struct intel_crtc *crtc, u32 start, u32 end);
#endif /* __INTEL_VBLANK_H__ */
--
2.34.1
^ permalink raw reply related [flat|nested] 28+ messages in thread
* [Intel-gfx] [PATCH 5/7] drm/i915/vblank: use intel_de_read()
2022-12-12 14:29 [Intel-gfx] [PATCH 0/7] drm/i915: extract vblank/scanline code to a separate file Jani Nikula
` (3 preceding siblings ...)
2022-12-12 14:29 ` [Intel-gfx] [PATCH 4/7] drm/i915/hdmi: abstract scanline range wait into intel_vblank.[ch] Jani Nikula
@ 2022-12-12 14:29 ` Jani Nikula
2022-12-14 4:05 ` Murthy, Arun R
2022-12-12 14:29 ` [Intel-gfx] [PATCH 6/7] drm/i915/vblank: add and use intel_de_read64_2x32() to read vblank counter Jani Nikula
` (5 subsequent siblings)
10 siblings, 1 reply; 28+ messages in thread
From: Jani Nikula @ 2022-12-12 14:29 UTC (permalink / raw)
To: intel-gfx; +Cc: jani.nikula
Use the intel_de_* functions for display registers.
Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
drivers/gpu/drm/i915/display/intel_vblank.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/gpu/drm/i915/display/intel_vblank.c b/drivers/gpu/drm/i915/display/intel_vblank.c
index aec7758ef917..cf1215631b27 100644
--- a/drivers/gpu/drm/i915/display/intel_vblank.c
+++ b/drivers/gpu/drm/i915/display/intel_vblank.c
@@ -137,7 +137,7 @@ u32 g4x_get_vblank_counter(struct drm_crtc *crtc)
if (!vblank->max_vblank_count)
return 0;
- return intel_uncore_read(&dev_priv->uncore, PIPE_FRMCOUNT_G4X(pipe));
+ return intel_de_read(dev_priv, PIPE_FRMCOUNT_G4X(pipe));
}
static u32 intel_crtc_scanlines_since_frame_timestamp(struct intel_crtc *crtc)
--
2.34.1
^ permalink raw reply related [flat|nested] 28+ messages in thread
* [Intel-gfx] [PATCH 6/7] drm/i915/vblank: add and use intel_de_read64_2x32() to read vblank counter
2022-12-12 14:29 [Intel-gfx] [PATCH 0/7] drm/i915: extract vblank/scanline code to a separate file Jani Nikula
` (4 preceding siblings ...)
2022-12-12 14:29 ` [Intel-gfx] [PATCH 5/7] drm/i915/vblank: use intel_de_read() Jani Nikula
@ 2022-12-12 14:29 ` Jani Nikula
2022-12-12 14:29 ` [Intel-gfx] [PATCH 7/7] drm/i915/reg: split out vblank/scanline regs Jani Nikula
` (4 subsequent siblings)
10 siblings, 0 replies; 28+ messages in thread
From: Jani Nikula @ 2022-12-12 14:29 UTC (permalink / raw)
To: intel-gfx; +Cc: jani.nikula
Add intel_de_read64_2x32() wrapper for the uncore version of the same,
and use it to read the high and low frame registers. Avoid duplicating
code for existing helpers.
The slight functional difference is checking that the entire high
register remains the same across two reads, instead of just the part
we're interested in. This should be of no consequence. (Unless those
bits function as a PRNG.)
Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
drivers/gpu/drm/i915/display/intel_de.h | 7 ++++++
drivers/gpu/drm/i915/display/intel_vblank.c | 25 +++++----------------
2 files changed, 13 insertions(+), 19 deletions(-)
diff --git a/drivers/gpu/drm/i915/display/intel_de.h b/drivers/gpu/drm/i915/display/intel_de.h
index 3dbd76fdabd6..42552d8c151e 100644
--- a/drivers/gpu/drm/i915/display/intel_de.h
+++ b/drivers/gpu/drm/i915/display/intel_de.h
@@ -22,6 +22,13 @@ intel_de_read8(struct drm_i915_private *i915, i915_reg_t reg)
return intel_uncore_read8(&i915->uncore, reg);
}
+static inline u64
+intel_de_read64_2x32(struct drm_i915_private *i915,
+ i915_reg_t lower_reg, i915_reg_t upper_reg)
+{
+ return intel_uncore_read64_2x32(&i915->uncore, lower_reg, upper_reg);
+}
+
static inline void
intel_de_posting_read(struct drm_i915_private *i915, i915_reg_t reg)
{
diff --git a/drivers/gpu/drm/i915/display/intel_vblank.c b/drivers/gpu/drm/i915/display/intel_vblank.c
index cf1215631b27..729c39180469 100644
--- a/drivers/gpu/drm/i915/display/intel_vblank.c
+++ b/drivers/gpu/drm/i915/display/intel_vblank.c
@@ -68,9 +68,8 @@ u32 i915_get_vblank_counter(struct drm_crtc *crtc)
struct drm_vblank_crtc *vblank = &dev_priv->drm.vblank[drm_crtc_index(crtc)];
const struct drm_display_mode *mode = &vblank->hwmode;
enum pipe pipe = to_intel_crtc(crtc)->pipe;
- i915_reg_t high_frame, low_frame;
- u32 high1, high2, low, pixel, vbl_start, hsync_start, htotal;
- unsigned long irqflags;
+ u32 pixel, vbl_start, hsync_start, htotal;
+ u64 frame;
/*
* On i965gm TV output the frame counter only works up to
@@ -98,34 +97,22 @@ u32 i915_get_vblank_counter(struct drm_crtc *crtc)
/* Start of vblank event occurs at start of hsync */
vbl_start -= htotal - hsync_start;
- high_frame = PIPEFRAME(pipe);
- low_frame = PIPEFRAMEPIXEL(pipe);
-
- spin_lock_irqsave(&dev_priv->uncore.lock, irqflags);
-
/*
* High & low register fields aren't synchronized, so make sure
* we get a low value that's stable across two reads of the high
* register.
*/
- do {
- high1 = intel_de_read_fw(dev_priv, high_frame) & PIPE_FRAME_HIGH_MASK;
- low = intel_de_read_fw(dev_priv, low_frame);
- high2 = intel_de_read_fw(dev_priv, high_frame) & PIPE_FRAME_HIGH_MASK;
- } while (high1 != high2);
-
- spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags);
+ frame = intel_de_read64_2x32(dev_priv, PIPEFRAMEPIXEL(pipe), PIPEFRAME(pipe));
- high1 >>= PIPE_FRAME_HIGH_SHIFT;
- pixel = low & PIPE_PIXEL_MASK;
- low >>= PIPE_FRAME_LOW_SHIFT;
+ pixel = frame & PIPE_PIXEL_MASK;
+ frame = (frame >> PIPE_FRAME_LOW_SHIFT) & 0xffffff;
/*
* The frame counter increments at beginning of active.
* Cook up a vblank counter by also checking the pixel
* counter against vblank start.
*/
- return (((high1 << 8) | low) + (pixel >= vbl_start)) & 0xffffff;
+ return (frame + (pixel >= vbl_start)) & 0xffffff;
}
u32 g4x_get_vblank_counter(struct drm_crtc *crtc)
--
2.34.1
^ permalink raw reply related [flat|nested] 28+ messages in thread
* [Intel-gfx] [PATCH 7/7] drm/i915/reg: split out vblank/scanline regs
2022-12-12 14:29 [Intel-gfx] [PATCH 0/7] drm/i915: extract vblank/scanline code to a separate file Jani Nikula
` (5 preceding siblings ...)
2022-12-12 14:29 ` [Intel-gfx] [PATCH 6/7] drm/i915/vblank: add and use intel_de_read64_2x32() to read vblank counter Jani Nikula
@ 2022-12-12 14:29 ` Jani Nikula
2022-12-14 4:24 ` Murthy, Arun R
2022-12-14 13:42 ` Ville Syrjälä
2022-12-12 14:46 ` [Intel-gfx] ✗ Fi.CI.CHECKPATCH: warning for drm/i915: extract vblank/scanline code to a separate file Patchwork
` (3 subsequent siblings)
10 siblings, 2 replies; 28+ messages in thread
From: Jani Nikula @ 2022-12-12 14:29 UTC (permalink / raw)
To: intel-gfx; +Cc: jani.nikula
Reduce clutter in i915_reg.h by splitting out the vblank/scanline
registers.
Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
drivers/gpu/drm/i915/display/intel_crt.c | 1 +
drivers/gpu/drm/i915/display/intel_vblank.c | 1 +
.../gpu/drm/i915/display/intel_vblank_regs.h | 42 +++++++++++++++++++
drivers/gpu/drm/i915/gvt/cmd_parser.c | 1 +
drivers/gpu/drm/i915/gvt/display.c | 1 +
drivers/gpu/drm/i915/gvt/handlers.c | 1 +
drivers/gpu/drm/i915/i915_reg.h | 35 ----------------
drivers/gpu/drm/i915/intel_gvt_mmio_table.c | 1 +
8 files changed, 48 insertions(+), 35 deletions(-)
create mode 100644 drivers/gpu/drm/i915/display/intel_vblank_regs.h
diff --git a/drivers/gpu/drm/i915/display/intel_crt.c b/drivers/gpu/drm/i915/display/intel_crt.c
index 7267ffc7f539..e7482fc9f726 100644
--- a/drivers/gpu/drm/i915/display/intel_crt.c
+++ b/drivers/gpu/drm/i915/display/intel_crt.c
@@ -49,6 +49,7 @@
#include "intel_hotplug.h"
#include "intel_pch_display.h"
#include "intel_pch_refclk.h"
+#include "intel_vblank_regs.h"
/* Here's the desired hotplug mode */
#define ADPA_HOTPLUG_BITS (ADPA_CRT_HOTPLUG_PERIOD_128 | \
diff --git a/drivers/gpu/drm/i915/display/intel_vblank.c b/drivers/gpu/drm/i915/display/intel_vblank.c
index 729c39180469..b017c2d00a3b 100644
--- a/drivers/gpu/drm/i915/display/intel_vblank.c
+++ b/drivers/gpu/drm/i915/display/intel_vblank.c
@@ -8,6 +8,7 @@
#include "intel_de.h"
#include "intel_display_types.h"
#include "intel_vblank.h"
+#include "intel_vblank_regs.h"
/*
* This timing diagram depicts the video signal in and
diff --git a/drivers/gpu/drm/i915/display/intel_vblank_regs.h b/drivers/gpu/drm/i915/display/intel_vblank_regs.h
new file mode 100644
index 000000000000..a851255ac2f1
--- /dev/null
+++ b/drivers/gpu/drm/i915/display/intel_vblank_regs.h
@@ -0,0 +1,42 @@
+/* SPDX-License-Identifier: MIT */
+/*
+ * Copyright © 2022 Intel Corporation
+ */
+
+#ifndef __INTEL_VBLANK_REGS_H__
+#define __INTEL_VBLANK_REGS_H__
+
+#include "intel_display_reg_defs.h"
+
+#define _PIPEADSL 0x70000
+#define PIPEDSL_CURR_FIELD REG_BIT(31) /* ctg+ */
+#define PIPEDSL_LINE_MASK REG_GENMASK(19, 0)
+#define PIPEDSL(pipe) _MMIO_PIPE2(pipe, _PIPEADSL)
+
+/*
+ * The two pipe frame counter registers are not synchronized, so reading a
+ * stable value is somewhat tricky. Use:
+ *
+ * u64 frame = intel_de_read64_2x32(dev_priv, PIPEFRAMEPIXEL(pipe), PIPEFRAME(pipe));
+ */
+
+#define _PIPEAFRAMEHIGH 0x70040
+#define PIPEFRAME(pipe) _MMIO_PIPE2(pipe, _PIPEAFRAMEHIGH)
+#define PIPE_FRAME_HIGH_MASK 0x0000ffff
+#define PIPE_FRAME_HIGH_SHIFT 0
+
+#define _PIPEAFRAMEPIXEL 0x70044
+#define PIPEFRAMEPIXEL(pipe) _MMIO_PIPE2(pipe, _PIPEAFRAMEPIXEL)
+#define PIPE_FRAME_LOW_MASK 0xff000000
+#define PIPE_FRAME_LOW_SHIFT 24
+#define PIPE_PIXEL_MASK 0x00ffffff
+#define PIPE_PIXEL_SHIFT 0
+
+/* GM45+ just has to be different */
+#define _PIPEA_FRMCOUNT_G4X 0x70040
+#define PIPE_FRMCOUNT_G4X(pipe) _MMIO_PIPE2(pipe, _PIPEA_FRMCOUNT_G4X)
+
+#define _PIPEA_FLIPCOUNT_G4X 0x70044
+#define PIPE_FLIPCOUNT_G4X(pipe) _MMIO_PIPE2(pipe, _PIPEA_FLIPCOUNT_G4X)
+
+#endif /* __INTEL_VBLANK_REGS_H__ */
diff --git a/drivers/gpu/drm/i915/gvt/cmd_parser.c b/drivers/gpu/drm/i915/gvt/cmd_parser.c
index 0ebf5fbf0e39..8a72c75943c6 100644
--- a/drivers/gpu/drm/i915/gvt/cmd_parser.c
+++ b/drivers/gpu/drm/i915/gvt/cmd_parser.c
@@ -38,6 +38,7 @@
#include "i915_drv.h"
#include "i915_reg.h"
+#include "display/intel_vblank_regs.h"
#include "gt/intel_engine_regs.h"
#include "gt/intel_gpu_commands.h"
#include "gt/intel_gt_regs.h"
diff --git a/drivers/gpu/drm/i915/gvt/display.c b/drivers/gpu/drm/i915/gvt/display.c
index c033249e73f4..894c8497961f 100644
--- a/drivers/gpu/drm/i915/gvt/display.c
+++ b/drivers/gpu/drm/i915/gvt/display.c
@@ -37,6 +37,7 @@
#include "gvt.h"
#include "display/intel_dpio_phy.h"
+#include "display/intel_vblank_regs.h"
static int get_edp_pipe(struct intel_vgpu *vgpu)
{
diff --git a/drivers/gpu/drm/i915/gvt/handlers.c b/drivers/gpu/drm/i915/gvt/handlers.c
index 735fc83e7026..efd613c2e068 100644
--- a/drivers/gpu/drm/i915/gvt/handlers.c
+++ b/drivers/gpu/drm/i915/gvt/handlers.c
@@ -45,6 +45,7 @@
#include "display/intel_dmc_regs.h"
#include "display/intel_dpio_phy.h"
#include "display/intel_fbc.h"
+#include "display/intel_vblank_regs.h"
#include "display/vlv_dsi_pll_regs.h"
#include "gt/intel_gt_regs.h"
diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
index 2b7a63754e4d..f3d9797ceb52 100644
--- a/drivers/gpu/drm/i915/i915_reg.h
+++ b/drivers/gpu/drm/i915/i915_reg.h
@@ -3489,9 +3489,6 @@
/* Display & cursor control */
/* Pipe A */
-#define _PIPEADSL 0x70000
-#define PIPEDSL_CURR_FIELD REG_BIT(31) /* ctg+ */
-#define PIPEDSL_LINE_MASK REG_GENMASK(19, 0)
#define _PIPEACONF 0x70008
#define PIPECONF_ENABLE REG_BIT(31)
#define PIPECONF_DOUBLE_WIDE REG_BIT(30) /* pre-i965 */
@@ -3616,9 +3613,6 @@
#define PIPE_DSI1_OFFSET 0x7b800
#define PIPECONF(pipe) _MMIO_PIPE2(pipe, _PIPEACONF)
-#define PIPEDSL(pipe) _MMIO_PIPE2(pipe, _PIPEADSL)
-#define PIPEFRAME(pipe) _MMIO_PIPE2(pipe, _PIPEAFRAMEHIGH)
-#define PIPEFRAMEPIXEL(pipe) _MMIO_PIPE2(pipe, _PIPEAFRAMEPIXEL)
#define PIPESTAT(pipe) _MMIO_PIPE2(pipe, _PIPEASTAT)
#define _PIPEAGCMAX 0x70010
@@ -4034,35 +4028,6 @@
#define WM_LP_SPRITE_MASK REG_GENMASK(10, 0)
#define WM_LP_SPRITE(x) REG_FIELD_PREP(WM_LP_SPRITE_MASK, (x))
-/*
- * The two pipe frame counter registers are not synchronized, so
- * reading a stable value is somewhat tricky. The following code
- * should work:
- *
- * do {
- * high1 = ((INREG(PIPEAFRAMEHIGH) & PIPE_FRAME_HIGH_MASK) >>
- * PIPE_FRAME_HIGH_SHIFT;
- * low1 = ((INREG(PIPEAFRAMEPIXEL) & PIPE_FRAME_LOW_MASK) >>
- * PIPE_FRAME_LOW_SHIFT);
- * high2 = ((INREG(PIPEAFRAMEHIGH) & PIPE_FRAME_HIGH_MASK) >>
- * PIPE_FRAME_HIGH_SHIFT);
- * } while (high1 != high2);
- * frame = (high1 << 8) | low1;
- */
-#define _PIPEAFRAMEHIGH 0x70040
-#define PIPE_FRAME_HIGH_MASK 0x0000ffff
-#define PIPE_FRAME_HIGH_SHIFT 0
-#define _PIPEAFRAMEPIXEL 0x70044
-#define PIPE_FRAME_LOW_MASK 0xff000000
-#define PIPE_FRAME_LOW_SHIFT 24
-#define PIPE_PIXEL_MASK 0x00ffffff
-#define PIPE_PIXEL_SHIFT 0
-/* GM45+ just has to be different */
-#define _PIPEA_FRMCOUNT_G4X 0x70040
-#define _PIPEA_FLIPCOUNT_G4X 0x70044
-#define PIPE_FRMCOUNT_G4X(pipe) _MMIO_PIPE2(pipe, _PIPEA_FRMCOUNT_G4X)
-#define PIPE_FLIPCOUNT_G4X(pipe) _MMIO_PIPE2(pipe, _PIPEA_FLIPCOUNT_G4X)
-
/* Cursor A & B regs */
#define _CURACNTR 0x70080
/* Old style CUR*CNTR flags (desktop 8xx) */
diff --git a/drivers/gpu/drm/i915/intel_gvt_mmio_table.c b/drivers/gpu/drm/i915/intel_gvt_mmio_table.c
index ce6b3c3b636a..604cc7ea8dac 100644
--- a/drivers/gpu/drm/i915/intel_gvt_mmio_table.c
+++ b/drivers/gpu/drm/i915/intel_gvt_mmio_table.c
@@ -7,6 +7,7 @@
#include "display/intel_backlight_regs.h"
#include "display/intel_dmc_regs.h"
#include "display/intel_dpio_phy.h"
+#include "display/intel_vblank_regs.h"
#include "display/vlv_dsi_pll_regs.h"
#include "gt/intel_gt_regs.h"
#include "gvt/gvt.h"
--
2.34.1
^ permalink raw reply related [flat|nested] 28+ messages in thread
* [Intel-gfx] ✗ Fi.CI.CHECKPATCH: warning for drm/i915: extract vblank/scanline code to a separate file
2022-12-12 14:29 [Intel-gfx] [PATCH 0/7] drm/i915: extract vblank/scanline code to a separate file Jani Nikula
` (6 preceding siblings ...)
2022-12-12 14:29 ` [Intel-gfx] [PATCH 7/7] drm/i915/reg: split out vblank/scanline regs Jani Nikula
@ 2022-12-12 14:46 ` Patchwork
2022-12-12 14:46 ` [Intel-gfx] ✗ Fi.CI.SPARSE: " Patchwork
` (2 subsequent siblings)
10 siblings, 0 replies; 28+ messages in thread
From: Patchwork @ 2022-12-12 14:46 UTC (permalink / raw)
To: Jani Nikula; +Cc: intel-gfx
== Series Details ==
Series: drm/i915: extract vblank/scanline code to a separate file
URL : https://patchwork.freedesktop.org/series/111854/
State : warning
== Summary ==
Error: dim checkpatch failed
1ab2fa26774a drm/i915/irq: split out vblank/scanline code to intel_vblank.[ch]
Traceback (most recent call last):
File "scripts/spdxcheck.py", line 11, in <module>
import git
ModuleNotFoundError: No module named 'git'
Traceback (most recent call last):
File "scripts/spdxcheck.py", line 11, in <module>
import git
ModuleNotFoundError: No module named 'git'
-:53: WARNING:FILE_PATH_CHANGES: added, moved or deleted file(s), does MAINTAINERS need updating?
#53:
new file mode 100644
-:95: WARNING:LONG_LINE_COMMENT: line length of 104 exceeds 100 columns
#95: FILE: drivers/gpu/drm/i915/display/intel_vblank.c:38:
+ * -vbs-----> <---vbs+1---> <---vbs+2---> <-----0-----> <-----1-----> <-----2--- (scanline counter gen2)
-:96: WARNING:LONG_LINE_COMMENT: line length of 105 exceeds 100 columns
#96: FILE: drivers/gpu/drm/i915/display/intel_vblank.c:39:
+ * -vbs-2---> <---vbs-1---> <---vbs-----> <---vbs+1---> <---vbs+2---> <-----0--- (scanline counter gen3+)
-:97: WARNING:LONG_LINE_COMMENT: line length of 109 exceeds 100 columns
#97: FILE: drivers/gpu/drm/i915/display/intel_vblank.c:40:
+ * -vbs-2---> <---vbs-2---> <---vbs-1---> <---vbs-----> <---vbs+1---> <---vbs+2- (scanline counter hsw+ hdmi)
-:396: WARNING:LONG_LINE: line length of 116 exceeds 100 columns
#396: FILE: drivers/gpu/drm/i915/display/intel_vblank.c:339:
+ position = (intel_de_read_fw(dev_priv, PIPEFRAMEPIXEL(pipe)) & PIPE_PIXEL_MASK) >> PIPE_PIXEL_SHIFT;
-:460: CHECK:OPEN_ENDED_LINE: Lines should not end with a '('
#460: FILE: drivers/gpu/drm/i915/display/intel_vblank.c:403:
+ return drm_crtc_vblank_helper_get_vblank_timestamp_internal(
total: 0 errors, 5 warnings, 1 checks, 893 lines checked
f01494675c93 drm/i915/display: move more scanline functions to intel_vblank.[ch]
-:86: WARNING:MSLEEP: msleep < 20ms can sleep for up to 20ms; see Documentation/timers/timers-howto.rst
#86: FILE: drivers/gpu/drm/i915/display/intel_vblank.c:428:
+ msleep(5);
total: 0 errors, 1 warnings, 0 checks, 93 lines checked
95e14852bdca drm/i915/display: use common function for checking scanline is moving
52a99694085f drm/i915/hdmi: abstract scanline range wait into intel_vblank.[ch]
77b221471a62 drm/i915/vblank: use intel_de_read()
861132b4e91f drm/i915/vblank: add and use intel_de_read64_2x32() to read vblank counter
ad911901f7a8 drm/i915/reg: split out vblank/scanline regs
Traceback (most recent call last):
File "scripts/spdxcheck.py", line 11, in <module>
import git
ModuleNotFoundError: No module named 'git'
-:40: WARNING:FILE_PATH_CHANGES: added, moved or deleted file(s), does MAINTAINERS need updating?
#40:
new file mode 100644
total: 0 errors, 1 warnings, 0 checks, 137 lines checked
^ permalink raw reply [flat|nested] 28+ messages in thread
* [Intel-gfx] ✗ Fi.CI.SPARSE: warning for drm/i915: extract vblank/scanline code to a separate file
2022-12-12 14:29 [Intel-gfx] [PATCH 0/7] drm/i915: extract vblank/scanline code to a separate file Jani Nikula
` (7 preceding siblings ...)
2022-12-12 14:46 ` [Intel-gfx] ✗ Fi.CI.CHECKPATCH: warning for drm/i915: extract vblank/scanline code to a separate file Patchwork
@ 2022-12-12 14:46 ` Patchwork
2022-12-12 15:05 ` [Intel-gfx] ✗ Fi.CI.BAT: failure " Patchwork
2022-12-14 4:12 ` [Intel-gfx] [PATCH 0/7] " Murthy, Arun R
10 siblings, 0 replies; 28+ messages in thread
From: Patchwork @ 2022-12-12 14:46 UTC (permalink / raw)
To: Jani Nikula; +Cc: intel-gfx
== Series Details ==
Series: drm/i915: extract vblank/scanline code to a separate file
URL : https://patchwork.freedesktop.org/series/111854/
State : warning
== Summary ==
Error: dim sparse failed
Sparse version: v0.6.2
Fast mode used, each commit won't be checked separately.
+./arch/x86/include/asm/bitops.h:117:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:117:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:117:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:117:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:117:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:148:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:148:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:148:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:148:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:148:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:150:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:150:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:150:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:150:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:150:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:154:26: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:154:26: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:154:26: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:154:26: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:154:26: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:156:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:156:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:156:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:156:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:156:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:156:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:156:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:156:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:156:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:156:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:174:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:174:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:174:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:174:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:174:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:176:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:176:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:176:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:176:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:176:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:180:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:180:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:180:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:180:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:180:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:182:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:182:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:182:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:182:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:182:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:182:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:182:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:182:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:182:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:182:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:186:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:186:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:186:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:186:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:186:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:188:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:188:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:188:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:188:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:188:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:192:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:192:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:192:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:192:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:192:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:195:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:195:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:195:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:195:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:195:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:195:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:195:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:195:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:195:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:195:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:237:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:237:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:237:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:237:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:237:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:239:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:239:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:239:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:239:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:239:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:66:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:66:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:66:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:66:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:66:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:92:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:92:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:92:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:92:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:92:1: warning: unreplaced symbol 'return'
+./include/asm-generic/bitops/generic-non-atomic.h:100:17: warning: unreplaced symbol 'old'
+./include/asm-generic/bitops/generic-non-atomic.h:100:17: warning: unreplaced symbol 'old'
+./include/asm-generic/bitops/generic-non-atomic.h:100:17: warning: unreplaced symbol 'old'
+./include/asm-generic/bitops/generic-non-atomic.h:100:17: warning: unreplaced symbol 'old'
+./include/asm-generic/bitops/generic-non-atomic.h:100:17: warning: unreplaced symbol 'old'
+./include/asm-generic/bitops/generic-non-atomic.h:100:23: warning: unreplaced symbol 'mask'
+./include/asm-generic/bitops/generic-non-atomic.h:100:23: warning: unreplaced symbol 'mask'
+./include/asm-generic/bitops/generic-non-atomic.h:100:23: warning: unreplaced symbol 'mask'
+./include/asm-generic/bitops/generic-non-atomic.h:100:23: warning: unreplaced symbol 'mask'
+./include/asm-generic/bitops/generic-non-atomic.h:100:23: warning: unreplaced symbol 'mask'
+./include/asm-generic/bitops/generic-non-atomic.h:100:9: warning: unreplaced symbol 'return'
+./include/asm-generic/bitops/generic-non-atomic.h:100:9: warning: unreplaced symbol 'return'
+./include/asm-generic/bitops/generic-non-atomic.h:100:9: warning: unreplaced symbol 'return'
+./include/asm-generic/bitops/generic-non-atomic.h:100:9: warning: unreplaced symbol 'return'
+./include/asm-generic/bitops/generic-non-atomic.h:100:9: warning: unreplaced symbol 'return'
+./include/asm-generic/bitops/generic-non-atomic.h:105:1: warning: unreplaced symbol 'return'
+./include/asm-generic/bitops/generic-non-atomic.h:105:1: warning: unreplaced symbol 'return'
+./include/asm-generic/bitops/generic-non-atomic.h:105:1: warning: unreplaced symbol 'return'
+./include/asm-generic/bitops/generic-non-atomic.h:105:1: warning: unreplaced symbol 'return'
+./include/asm-generic/bitops/generic-non-atomic.h:105:1: warning: unreplaced symbol 'return'
+./include/asm-generic/bitops/generic-non-atomic.h:107:9: warning: unreplaced symbol 'mask'
+./include/asm-generic/bitops/generic-non-atomic.h:107:9: warning: unreplaced symbol 'mask'
+./include/asm-generic/bitops/generic-non-atomic.h:107:9: warning: unreplaced symbol 'mask'
+./include/asm-generic/bitops/generic-non-atomic.h:107:9: warning: unreplaced symbol 'mask'
+./include/asm-generic/bitops/generic-non-atomic.h:107:9: warning: unreplaced symbol 'mask'
+./include/asm-generic/bitops/generic-non-atomic.h:108:9: warning: unreplaced symbol 'p'
+./include/asm-generic/bitops/generic-non-atomic.h:108:9: warning: unreplaced symbol 'p'
+./include/asm-generic/bitops/generic-non-atomic.h:108:9: warning: unreplaced symbol 'p'
+./include/asm-generic/bitops/generic-non-atomic.h:108:9: warning: unreplaced symbol 'p'
+./include/asm-generic/bitops/generic-non-atomic.h:108:9: warning: unreplaced symbol 'p'
+./include/asm-generic/bitops/generic-non-atomic.h:109:9: warning: unreplaced symbol 'old'
+./include/asm-generic/bitops/generic-non-atomic.h:109:9: warning: unreplaced symbol 'old'
+./include/asm-generic/bitops/generic-non-atomic.h:109:9: warning: unreplaced symbol 'old'
+./include/asm-generic/bitops/generic-non-atomic.h:109:9: warning: unreplaced symbol 'old'
+./include/asm-generic/bitops/generic-non-atomic.h:109:9: warning: unreplaced symbol 'old'
+./include/asm-generic/bitops/generic-non-atomic.h:111:10: warning: unreplaced symbol 'p'
+./include/asm-generic/bitops/generic-non-atomic.h:111:10: warning: unreplaced symbol 'p'
+./include/asm-generic/bitops/generic-non-atomic.h:111:10: warning: unreplaced symbol 'p'
+./include/asm-generic/bitops/generic-non-atomic.h:111:10: warning: unreplaced symbol 'p'
+./include/asm-generic/bitops/generic-non-atomic.h:111:10: warning: unreplaced symbol 'p'
+./include/asm-generic/bitops/generic-non-atomic.h:111:14: warning: unreplaced symbol 'old'
+./include/asm-generic/bitops/generic-non-atomic.h:111:14: warning: unreplaced symbol 'old'
+./include/asm-generic/bitops/generic-non-atomic.h:111:14: warning: unreplaced symbol 'old'
+./include/asm-generic/bitops/generic-non-atomic.h:111:14: warning: unreplaced symbol 'old'
+./include/asm-generic/bitops/generic-non-atomic.h:111:14: warning: unreplaced symbol 'old'
+./include/asm-generic/bitops/generic-non-atomic.h:111:20: warning: unreplaced symbol 'mask'
+./include/asm-generic/bitops/generic-non-atomic.h:111:20: warning: unreplaced symbol 'mask'
+./include/asm-generic/bitops/generic-non-atomic.h:111:20: warning: unreplaced symbol 'mask'
+./include/asm-generic/bitops/generic-non-atomic.h:111:20: warning: unreplaced symbol 'mask'
+./include/asm-generic/bitops/generic-non-atomic.h:111:20: warning: unreplaced symbol 'mask'
+./include/asm-generic/bitops/generic-non-atomic.h:112:17: warning: unreplaced symbol 'old'
+./include/asm-generic/bitops/generic-non-atomic.h:112:17: warning: unreplaced symbol 'old'
+./include/asm-generic/bitops/generic-non-atomic.h:112:17: warning: unreplaced symbol 'old'
+./include/asm-generic/bitops/generic-non-atomic.h:112:17: warning: unreplaced symbol 'old'
+./include/asm-generic/bitops/generic-non-atomic.h:112:17: warning: unreplaced symbol 'old'
+./include/asm-generic/bitops/generic-non-atomic.h:112:23: warning: unreplaced symbol 'mask'
+./include/asm-generic/bitops/generic-non-atomic.h:112:23: warning: unreplaced symbol 'mask'
+./include/asm-generic/bitops/generic-non-atomic.h:112:23: warning: unreplaced symbol 'mask'
+./include/asm-generic/bitops/generic-non-atomic.h:112:23: warning: unreplaced symbol 'mask'
+./include/asm-generic/bitops/generic-non-atomic.h:112:23: warning: unreplaced symbol 'mask'
+./include/asm-generic/bitops/generic-non-atomic.h:112:9: warning: unreplaced symbol 'return'
+./include/asm-generic/bitops/generic-non-atomic.h:112:9: warning: unreplaced symbol 'return'
+./include/asm-generic/bitops/generic-non-atomic.h:112:9: warning: unreplaced symbol 'return'
+./include/asm-generic/bitops/generic-non-atomic.h:112:9: warning: unreplaced symbol 'return'
+./include/asm-generic/bitops/generic-non-atomic.h:112:9: warning: unreplaced symbol 'return'
+./include/asm-generic/bitops/generic-non-atomic.h:121:1: warning: unreplaced symbol 'return'
+./include/asm-generic/bitops/generic-non-atomic.h:121:1: warning: unreplaced symbol 'return'
+./include/asm-generic/bitops/generic-non-atomic.h:121:1: warning: unreplaced symbol 'return'
+./include/asm-generic/bitops/generic-non-atomic.h:121:1: warning: unreplaced symbol 'return'
+./include/asm-generic/bitops/generic-non-atomic.h:121:1: warning: unreplaced symbol 'return'
+./include/asm-generic/bitops/generic-non-atomic.h:128:9: warning: unreplaced symbol 'return'
+./include/asm-generic/bitops/generic-non-atomic.h:128:9: warning: unreplaced symbol 'return'
+./include/asm-generic/bitops/generic-non-atomic.h:128:9: warning: unreplaced symbol 'return'
+./include/asm-generic/bitops/generic-non-atomic.h:128:9: warning: unreplaced symbol 'return'
+./include/asm-generic/bitops/generic-non-atomic.h:128:9: warning: unreplaced symbol 'return'
+./include/asm-generic/bitops/generic-non-atomic.h:166:1: warning: unreplaced symbol 'return'
+./include/asm-generic/bitops/generic-non-atomic.h:166:1: warning: unreplaced symbol 'return'
+./include/asm-generic/bitops/generic-non-atomic.h:166:1: warning: unreplaced symbol 'return'
+./include/asm-generic/bitops/generic-non-atomic.h:166:1: warning: unreplaced symbol 'return'
+./include/asm-generic/bitops/generic-non-atomic.h:166:1: warning: unreplaced symbol 'return'
+./include/asm-generic/bitops/generic-non-atomic.h:168:9: warning: unreplaced symbol 'p'
+./include/asm-generic/bitops/generic-non-atomic.h:168:9: warning: unreplaced symbol 'p'
+./include/asm-generic/bitops/generic-non-atomic.h:168:9: warning: unreplaced symbol 'p'
+./include/asm-generic/bitops/generic-non-atomic.h:168:9: warning: unreplaced symbol 'p'
+./include/asm-generic/bitops/generic-non-atomic.h:168:9: warning: unreplaced symbol 'p'
+./include/asm-generic/bitops/generic-non-atomic.h:169:9: warning: unreplaced symbol 'mask'
+./include/asm-generic/bitops/generic-non-atomic.h:169:9: warning: unreplaced symbol 'mask'
+./include/asm-generic/bitops/generic-non-atomic.h:169:9: warning: unreplaced symbol 'mask'
+./include/asm-generic/bitops/generic-non-atomic.h:169:9: warning: unreplaced symbol 'mask'
+./include/asm-generic/bitops/generic-non-atomic.h:169:9: warning: unreplaced symbol 'mask'
+./include/asm-generic/bitops/generic-non-atomic.h:170:9: warning: unreplaced symbol 'val'
+./include/asm-generic/bitops/generic-non-atomic.h:170:9: warning: unreplaced symbol 'val'
+./include/asm-generic/bitops/generic-non-atomic.h:170:9: warning: unreplaced symbol 'val'
+./include/asm-generic/bitops/generic-non-atomic.h:170:9: warning: unreplaced symbol 'val'
+./include/asm-generic/bitops/generic-non-atomic.h:170:9: warning: unreplaced symbol 'val'
+./include/asm-generic/bitops/generic-non-atomic.h:172:19: warning: unreplaced symbol 'val'
+./include/asm-generic/bitops/generic-non-atomic.h:172:19: warning: unreplaced symbol 'val'
+./include/asm-generic/bitops/generic-non-atomic.h:172:19: warning: unreplaced symbol 'val'
+./include/asm-generic/bitops/generic-non-atomic.h:172:19: warning: unreplaced symbol 'val'
+./include/asm-generic/bitops/generic-non-atomic.h:172:19: warning: unreplaced symbol 'val'
+./include/asm-generic/bitops/generic-non-atomic.h:172:25: warning: unreplaced symbol 'mask'
+./include/asm-generic/bitops/generic-non-atomic.h:172:25: warning: unreplaced symbol 'mask'
+./include/asm-generic/bitops/generic-non-atomic.h:172:25: warning: unreplaced symbol 'mask'
+./include/asm-generic/bitops/generic-non-atomic.h:172:25: warning: unreplaced symbol 'mask'
+./include/asm-generic/bitops/generic-non-atomic.h:172:25: warning: unreplaced symbol 'mask'
+./include/asm-generic/bitops/generic-non-atomic.h:172:9: warning: unreplaced symbol 'return'
+./include/asm-generic/bitops/generic-non-atomic.h:172:9: warning: unreplaced symbol 'return'
+./include/asm-generic/bitops/generic-non-atomic.h:172:9: warning: unreplaced symbol 'return'
+./include/asm-generic/bitops/generic-non-atomic.h:172:9: warning: unreplaced symbol 'return'
+./include/asm-generic/bitops/generic-non-atomic.h:172:9: warning: unreplaced symbol 'return'
+./include/asm-generic/bitops/generic-non-atomic.h:28:1: warning: unreplaced symbol 'return'
+./include/asm-generic/bitops/generic-non-atomic.h:28:1: warning: unreplaced symbol 'return'
+./include/asm-generic/bitops/generic-non-atomic.h:28:1: warning: unreplaced symbol 'return'
+./include/asm-generic/bitops/generic-non-atomic.h:28:1: warning: unreplaced symbol 'return'
+./include/asm-generic/bitops/generic-non-atomic.h:28:1: warning: unreplaced symbol 'return'
+./include/asm-generic/bitops/generic-non-atomic.h:30:9: warning: unreplaced symbol 'mask'
+./include/asm-generic/bitops/generic-non-atomic.h:30:9: warning: unreplaced symbol 'mask'
+./include/asm-generic/bitops/generic-non-atomic.h:30:9: warning: unreplaced symbol 'mask'
+./include/asm-generic/bitops/generic-non-atomic.h:30:9: warning: unreplaced symbol 'mask'
+./include/asm-generic/bitops/generic-non-atomic.h:30:9: warning: unreplaced symbol 'mask'
+./include/asm-generic/bitops/generic-non-atomic.h:31:9: warning: unreplaced symbol 'p'
+./include/asm-generic/bitops/generic-non-atomic.h:31:9: warning: unreplaced symbol 'p'
+./include/asm-generic/bitops/generic-non-atomic.h:31:9: warning: unreplaced symbol 'p'
+./include/asm-generic/bitops/generic-non-atomic.h:31:9: warning: unreplaced symbol 'p'
+./include/asm-generic/bitops/generic-non-atomic.h:31:9: warning: unreplaced symbol 'p'
+./include/asm-generic/bitops/generic-non-atomic.h:33:10: warning: unreplaced symbol 'p'
+./include/asm-generic/bitops/generic-non-atomic.h:33:10: warning: unreplaced symbol 'p'
+./include/asm-generic/bitops/generic-non-atomic.h:33:10: warning: unreplaced symbol 'p'
+./include/asm-generic/bitops/generic-non-atomic.h:33:10: warning: unreplaced symbol 'p'
+./include/asm-generic/bitops/generic-non-atomic.h:33:10: warning: unreplaced symbol 'p'
+./include/asm-generic/bitops/generic-non-atomic.h:33:16: warning: unreplaced symbol 'mask'
+./include/asm-generic/bitops/generic-non-atomic.h:33:16: warning: unreplaced symbol 'mask'
+./include/asm-generic/bitops/generic-non-atomic.h:33:16: warning: unreplaced symbol 'mask'
+./include/asm-generic/bitops/generic-non-atomic.h:33:16: warning: unreplaced symbol 'mask'
+./include/asm-generic/bitops/generic-non-atomic.h:33:16: warning: unreplaced symbol 'mask'
+./include/asm-generic/bitops/generic-non-atomic.h:37:1: warning: unreplaced symbol 'return'
+./include/asm-generic/bitops/generic-non-atomic.h:37:1: warning: unreplaced symbol 'return'
+./include/asm-generic/bitops/generic-non-atomic.h:37:1: warning: unreplaced symbol 'return'
+./include/asm-generic/bitops/generic-non-atomic.h:37:1: warning: unreplaced symbol 'return'
+./include/asm-generic/bitops/generic-non-atomic.h:37:1: warning: unreplaced symbol 'return'
+./include/asm-generic/bitops/generic-non-atomic.h:39:9: warning: unreplaced symbol 'mask'
+./include/asm-generic/bitops/generic-non-atomic.h:39:9: warning: unreplaced symbol 'mask'
+./include/asm-generic/bitops/generic-non-atomic.h:39:9: warning: unreplaced symbol 'mask'
+./include/asm-generic/bitops/generic-non-atomic.h:39:9: warning: unreplaced symbol 'mask'
+./include/asm-generic/bitops/generic-non-atomic.h:39:9: warning: unreplaced symbol 'mask'
+./include/asm-generic/bitops/generic-non-atomic.h:40:9: warning: unreplaced symbol 'p'
+./include/asm-generic/bitops/generic-non-atomic.h:40:9: warning: unreplaced symbol 'p'
+./include/asm-generic/bitops/generic-non-atomic.h:40:9: warning: unreplaced symbol 'p'
+./include/asm-generic/bitops/generic-non-atomic.h:40:9: warning: unreplaced symbol 'p'
+./include/asm-generic/bitops/generic-non-atomic.h:40:9: warning: unreplaced symbol 'p'
+./include/asm-generic/bitops/generic-non-atomic.h:42:10: warning: unreplaced symbol 'p'
+./include/asm-generic/bitops/generic-non-atomic.h:42:10: warning: unreplaced symbol 'p'
+./include/asm-generic/bitops/generic-non-atomic.h:42:10: warning: unreplaced symbol 'p'
+./include/asm-generic/bitops/generic-non-atomic.h:42:10: warning: unreplaced symbol 'p'
+./include/asm-generic/bitops/generic-non-atomic.h:42:10: warning: unreplaced symbol 'p'
+./include/asm-generic/bitops/generic-non-atomic.h:42:16: warning: unreplaced symbol 'mask'
+./include/asm-generic/bitops/generic-non-atomic.h:42:16: warning: unreplaced symbol 'mask'
+./include/asm-generic/bitops/generic-non-atomic.h:42:16: warning: unreplaced symbol 'mask'
+./include/asm-generic/bitops/generic-non-atomic.h:42:16: warning: unreplaced symbol 'mask'
+./include/asm-generic/bitops/generic-non-atomic.h:42:16: warning: unreplaced symbol 'mask'
+./include/asm-generic/bitops/generic-non-atomic.h:55:1: warning: unreplaced symbol 'return'
+./include/asm-generic/bitops/generic-non-atomic.h:55:1: warning: unreplaced symbol 'return'
+./include/asm-generic/bitops/generic-non-atomic.h:55:1: warning: unreplaced symbol 'return'
+./include/asm-generic/bitops/generic-non-atomic.h:55:1: warning: unreplaced symbol 'return'
+./include/asm-generic/bitops/generic-non-atomic.h:55:1: warning: unreplaced symbol 'return'
+./include/asm-generic/bitops/generic-non-atomic.h:57:9: warning: unreplaced symbol 'mask'
+./include/asm-generic/bitops/generic-non-atomic.h:57:9: warning: unreplaced symbol 'mask'
+./include/asm-generic/bitops/generic-non-atomic.h:57:9: warning: unreplaced symbol 'mask'
+./include/asm-generic/bitops/generic-non-atomic.h:57:9: warning: unreplaced symbol 'mask'
+./include/asm-generic/bitops/generic-non-atomic.h:57:9: warning: unreplaced symbol 'mask'
+./include/asm-generic/bitops/generic-non-atomic.h:58:9: warning: unreplaced symbol 'p'
+./include/asm-generic/bitops/generic-non-atomic.h:58:9: warning: unreplaced symbol 'p'
+./include/asm-generic/bitops/generic-non-atomic.h:58:9: warning: unreplaced symbol 'p'
+./include/asm-generic/bitops/generic-non-atomic.h:58:9: warning: unreplaced symbol 'p'
+./include/asm-generic/bitops/generic-non-atomic.h:58:9: warning: unreplaced symbol 'p'
+./include/asm-generic/bitops/generic-non-atomic.h:60:10: warning: unreplaced symbol 'p'
+./include/asm-generic/bitops/generic-non-atomic.h:60:10: warning: unreplaced symbol 'p'
+./include/asm-generic/bitops/generic-non-atomic.h:60:10: warning: unreplaced symbol 'p'
+./include/asm-generic/bitops/generic-non-atomic.h:60:10: warning: unreplaced symbol 'p'
+./include/asm-generic/bitops/generic-non-atomic.h:60:10: warning: unreplaced symbol 'p'
+./include/asm-generic/bitops/generic-non-atomic.h:60:15: warning: unreplaced symbol 'mask'
+./include/asm-generic/bitops/generic-non-atomic.h:60:15: warning: unreplaced symbol 'mask'
+./include/asm-generic/bitops/generic-non-atomic.h:60:15: warning: unreplaced symbol 'mask'
+./include/asm-generic/bitops/generic-non-atomic.h:60:15: warning: unreplaced symbol 'mask'
+./include/asm-generic/bitops/generic-non-atomic.h:60:15: warning: unreplaced symbol 'mask'
+./include/asm-generic/bitops/generic-non-atomic.h:73:1: warning: unreplaced symbol 'return'
+./include/asm-generic/bitops/generic-non-atomic.h:73:1: warning: unreplaced symbol 'return'
+./include/asm-generic/bitops/generic-non-atomic.h:73:1: warning: unreplaced symbol 'return'
+./include/asm-generic/bitops/generic-non-atomic.h:73:1: warning: unreplaced symbol 'return'
+./include/asm-generic/bitops/generic-non-atomic.h:73:1: warning: unreplaced symbol 'return'
+./include/asm-generic/bitops/generic-non-atomic.h:75:9: warning: unreplaced symbol 'mask'
+./include/asm-generic/bitops/generic-non-atomic.h:75:9: warning: unreplaced symbol 'mask'
+./include/asm-generic/bitops/generic-non-atomic.h:75:9: warning: unreplaced symbol 'mask'
+./include/asm-generic/bitops/generic-non-atomic.h:75:9: warning: unreplaced symbol 'mask'
+./include/asm-generic/bitops/generic-non-atomic.h:75:9: warning: unreplaced symbol 'mask'
+./include/asm-generic/bitops/generic-non-atomic.h:76:9: warning: unreplaced symbol 'p'
+./include/asm-generic/bitops/generic-non-atomic.h:76:9: warning: unreplaced symbol 'p'
+./include/asm-generic/bitops/generic-non-atomic.h:76:9: warning: unreplaced symbol 'p'
+./include/asm-generic/bitops/generic-non-atomic.h:76:9: warning: unreplaced symbol 'p'
+./include/asm-generic/bitops/generic-non-atomic.h:76:9: warning: unreplaced symbol 'p'
+./include/asm-generic/bitops/generic-non-atomic.h:77:9: warning: unreplaced symbol 'old'
+./include/asm-generic/bitops/generic-non-atomic.h:77:9: warning: unreplaced symbol 'old'
+./include/asm-generic/bitops/generic-non-atomic.h:77:9: warning: unreplaced symbol 'old'
+./include/asm-generic/bitops/generic-non-atomic.h:77:9: warning: unreplaced symbol 'old'
+./include/asm-generic/bitops/generic-non-atomic.h:77:9: warning: unreplaced symbol 'old'
+./include/asm-generic/bitops/generic-non-atomic.h:79:10: warning: unreplaced symbol 'p'
+./include/asm-generic/bitops/generic-non-atomic.h:79:10: warning: unreplaced symbol 'p'
+./include/asm-generic/bitops/generic-non-atomic.h:79:10: warning: unreplaced symbol 'p'
+./include/asm-generic/bitops/generic-non-atomic.h:79:10: warning: unreplaced symbol 'p'
+./include/asm-generic/bitops/generic-non-atomic.h:79:10: warning: unreplaced symbol 'p'
+./include/asm-generic/bitops/generic-non-atomic.h:79:14: warning: unreplaced symbol 'old'
+./include/asm-generic/bitops/generic-non-atomic.h:79:14: warning: unreplaced symbol 'old'
+./include/asm-generic/bitops/generic-non-atomic.h:79:14: warning: unreplaced symbol 'old'
+./include/asm-generic/bitops/generic-non-atomic.h:79:14: warning: unreplaced symbol 'old'
+./include/asm-generic/bitops/generic-non-atomic.h:79:14: warning: unreplaced symbol 'old'
+./include/asm-generic/bitops/generic-non-atomic.h:79:20: warning: unreplaced symbol 'mask'
+./include/asm-generic/bitops/generic-non-atomic.h:79:20: warning: unreplaced symbol 'mask'
+./include/asm-generic/bitops/generic-non-atomic.h:79:20: warning: unreplaced symbol 'mask'
+./include/asm-generic/bitops/generic-non-atomic.h:79:20: warning: unreplaced symbol 'mask'
+./include/asm-generic/bitops/generic-non-atomic.h:79:20: warning: unreplaced symbol 'mask'
+./include/asm-generic/bitops/generic-non-atomic.h:80:17: warning: unreplaced symbol 'old'
+./include/asm-generic/bitops/generic-non-atomic.h:80:17: warning: unreplaced symbol 'old'
+./include/asm-generic/bitops/generic-non-atomic.h:80:17: warning: unreplaced symbol 'old'
+./include/asm-generic/bitops/generic-non-atomic.h:80:17: warning: unreplaced symbol 'old'
+./include/asm-generic/bitops/generic-non-atomic.h:80:17: warning: unreplaced symbol 'old'
+./include/asm-generic/bitops/generic-non-atomic.h:80:23: warning: unreplaced symbol 'mask'
+./include/asm-generic/bitops/generic-non-atomic.h:80:23: warning: unreplaced symbol 'mask'
+./include/asm-generic/bitops/generic-non-atomic.h:80:23: warning: unreplaced symbol 'mask'
+./include/asm-generic/bitops/generic-non-atomic.h:80:23: warning: unreplaced symbol 'mask'
+./include/asm-generic/bitops/generic-non-atomic.h:80:23: warning: unreplaced symbol 'mask'
+./include/asm-generic/bitops/generic-non-atomic.h:80:9: warning: unreplaced symbol 'return'
+./include/asm-generic/bitops/generic-non-atomic.h:80:9: warning: unreplaced symbol 'return'
+./include/asm-generic/bitops/generic-non-atomic.h:80:9: warning: unreplaced symbol 'return'
+./include/asm-generic/bitops/generic-non-atomic.h:80:9: warning: unreplaced symbol 'return'
+./include/asm-generic/bitops/generic-non-atomic.h:80:9: warning: unreplaced symbol 'return'
+./include/asm-generic/bitops/generic-non-atomic.h:93:1: warning: unreplaced symbol 'return'
+./include/asm-generic/bitops/generic-non-atomic.h:93:1: warning: unreplaced symbol 'return'
+./include/asm-generic/bitops/generic-non-atomic.h:93:1: warning: unreplaced symbol 'return'
+./include/asm-generic/bitops/generic-non-atomic.h:93:1: warning: unreplaced symbol 'return'
+./include/asm-generic/bitops/generic-non-atomic.h:93:1: warning: unreplaced symbol 'return'
+./include/asm-generic/bitops/generic-non-atomic.h:95:9: warning: unreplaced symbol 'mask'
+./include/asm-generic/bitops/generic-non-atomic.h:95:9: warning: unreplaced symbol 'mask'
+./include/asm-generic/bitops/generic-non-atomic.h:95:9: warning: unreplaced symbol 'mask'
+./include/asm-generic/bitops/generic-non-atomic.h:95:9: warning: unreplaced symbol 'mask'
+./include/asm-generic/bitops/generic-non-atomic.h:95:9: warning: unreplaced symbol 'mask'
+./include/asm-generic/bitops/generic-non-atomic.h:96:9: warning: unreplaced symbol 'p'
+./include/asm-generic/bitops/generic-non-atomic.h:96:9: warning: unreplaced symbol 'p'
+./include/asm-generic/bitops/generic-non-atomic.h:96:9: warning: unreplaced symbol 'p'
+./include/asm-generic/bitops/generic-non-atomic.h:96:9: warning: unreplaced symbol 'p'
+./include/asm-generic/bitops/generic-non-atomic.h:96:9: warning: unreplaced symbol 'p'
+./include/asm-generic/bitops/generic-non-atomic.h:97:9: warning: unreplaced symbol 'old'
+./include/asm-generic/bitops/generic-non-atomic.h:97:9: warning: unreplaced symbol 'old'
+./include/asm-generic/bitops/generic-non-atomic.h:97:9: warning: unreplaced symbol 'old'
+./include/asm-generic/bitops/generic-non-atomic.h:97:9: warning: unreplaced symbol 'old'
+./include/asm-generic/bitops/generic-non-atomic.h:97:9: warning: unreplaced symbol 'old'
+./include/asm-generic/bitops/generic-non-atomic.h:99:10: warning: unreplaced symbol 'p'
+./include/asm-generic/bitops/generic-non-atomic.h:99:10: warning: unreplaced symbol 'p'
+./include/asm-generic/bitops/generic-non-atomic.h:99:10: warning: unreplaced symbol 'p'
+./include/asm-generic/bitops/generic-non-atomic.h:99:10: warning: unreplaced symbol 'p'
+./include/asm-generic/bitops/generic-non-atomic.h:99:10: warning: unreplaced symbol 'p'
+./include/asm-generic/bitops/generic-non-atomic.h:99:14: warning: unreplaced symbol 'old'
+./include/asm-generic/bitops/generic-non-atomic.h:99:14: warning: unreplaced symbol 'old'
+./include/asm-generic/bitops/generic-non-atomic.h:99:14: warning: unreplaced symbol 'old'
+./include/asm-generic/bitops/generic-non-atomic.h:99:14: warning: unreplaced symbol 'old'
+./include/asm-generic/bitops/generic-non-atomic.h:99:14: warning: unreplaced symbol 'old'
+./include/asm-generic/bitops/generic-non-atomic.h:99:21: warning: unreplaced symbol 'mask'
+./include/asm-generic/bitops/generic-non-atomic.h:99:21: warning: unreplaced symbol 'mask'
+./include/asm-generic/bitops/generic-non-atomic.h:99:21: warning: unreplaced symbol 'mask'
+./include/asm-generic/bitops/generic-non-atomic.h:99:21: warning: unreplaced symbol 'mask'
+./include/asm-generic/bitops/generic-non-atomic.h:99:21: warning: unreplaced symbol 'mask'
+./include/asm-generic/bitops/instrumented-non-atomic.h:100:9: warning: unreplaced symbol 'return'
+./include/asm-generic/bitops/instrumented-non-atomic.h:100:9: warning: unreplaced symbol 'return'
+./include/asm-generic/bitops/instrumented-non-atomic.h:100:9: warning: unreplaced symbol 'return'
+./include/asm-generic/bitops/instrumented-non-atomic.h:100:9: warning: unreplaced symbol 'return'
+./include/asm-generic/bitops/instrumented-non-atomic.h:100:9: warning: unreplaced symbol 'return'
+./include/asm-generic/bitops/instrumented-non-atomic.h:112:1: warning: unreplaced symbol 'return'
+./include/asm-generic/bitops/instrumented-non-atomic.h:112:1: warning: unreplaced symbol 'return'
+./include/asm-generic/bitops/instrumented-non-atomic.h:112:1: warning: unreplaced symbol 'return'
+./include/asm-generic/bitops/instrumented-non-atomic.h:112:1: warning: unreplaced symbol 'return'
+./include/asm-generic/bitops/instrumented-non-atomic.h:112:1: warning: unreplaced symbol 'return'
+./include/asm-generic/bitops/instrumented-non-atomic.h:115:9: warning: unreplaced symbol 'return'
+./include/asm-generic/bitops/instrumented-non-atomic.h:115:9: warning: unreplaced symbol 'return'
+./include/asm-generic/bitops/instrumented-non-atomic.h:115:9: warning: unreplaced symbol 'return'
+./include/asm-generic/bitops/instrumented-non-atomic.h:115:9: warning: unreplaced symbol 'return'
+./include/asm-generic/bitops/instrumented-non-atomic.h:115:9: warning: unreplaced symbol 'return'
+./include/asm-generic/bitops/instrumented-non-atomic.h:127:1: warning: unreplaced symbol 'return'
+./include/asm-generic/bitops/instrumented-non-atomic.h:127:1: warning: unreplaced symbol 'return'
+./include/asm-generic/bitops/instrumented-non-atomic.h:127:1: warning: unreplaced symbol 'return'
+./include/asm-generic/bitops/instrumented-non-atomic.h:127:1: warning: unreplaced symbol 'return'
+./include/asm-generic/bitops/instrumented-non-atomic.h:127:1: warning: unreplaced symbol 'return'
+./include/asm-generic/bitops/instrumented-non-atomic.h:130:9: warning: unreplaced symbol 'return'
+./include/asm-generic/bitops/instrumented-non-atomic.h:130:9: warning: unreplaced symbol 'return'
+./include/asm-generic/bitops/instrumented-non-atomic.h:130:9: warning: unreplaced symbol 'return'
+./include/asm-generic/bitops/instrumented-non-atomic.h:130:9: warning: unreplaced symbol 'return'
+./include/asm-generic/bitops/instrumented-non-atomic.h:130:9: warning: unreplaced symbol 'return'
+./include/asm-generic/bitops/instrumented-non-atomic.h:139:1: warning: unreplaced symbol 'return'
+./include/asm-generic/bitops/instrumented-non-atomic.h:139:1: warning: unreplaced symbol 'return'
+./include/asm-generic/bitops/instrumented-non-atomic.h:139:1: warning: unreplaced symbol 'return'
+./include/asm-generic/bitops/instrumented-non-atomic.h:139:1: warning: unreplaced symbol 'return'
+./include/asm-generic/bitops/instrumented-non-atomic.h:139:1: warning: unreplaced symbol 'return'
+./include/asm-generic/bitops/instrumented-non-atomic.h:142:9: warning: unreplaced symbol 'return'
+./include/asm-generic/bitops/instrumented-non-atomic.h:142:9: warning: unreplaced symbol 'return'
+./include/asm-generic/bitops/instrumented-non-atomic.h:142:9: warning: unreplaced symbol 'return'
+./include/asm-generic/bitops/instrumented-non-atomic.h:142:9: warning: unreplaced symbol 'return'
+./include/asm-generic/bitops/instrumented-non-atomic.h:142:9: warning: unreplaced symbol 'return'
+./include/asm-generic/bitops/instrumented-non-atomic.h:26:1: warning: unreplaced symbol 'return'
+./include/asm-generic/bitops/instrumented-non-atomic.h:26:1: warning: unreplaced symbol 'return'
+./include/asm-generic/bitops/instrumented-non-atomic.h:26:1: warning: unreplaced symbol 'return'
+./include/asm-generic/bitops/instrumented-non-atomic.h:26:1: warning: unreplaced symbol 'return'
+./include/asm-generic/bitops/instrumented-non-atomic.h:26:1: warning: unreplaced symbol 'return'
+./include/asm-generic/bitops/instrumented-non-atomic.h:42:1: warning: unreplaced symbol 'return'
+./include/asm-generic/bitops/instrumented-non-atomic.h:42:1: warning: unreplaced symbol 'return'
+./include/asm-generic/bitops/instrumented-non-atomic.h:42:1: warning: unreplaced symbol 'return'
+./include/asm-generic/bitops/instrumented-non-atomic.h:42:1: warning: unreplaced symbol 'return'
+./include/asm-generic/bitops/instrumented-non-atomic.h:42:1: warning: unreplaced symbol 'return'
+./include/asm-generic/bitops/instrumented-non-atomic.h:58:1: warning: unreplaced symbol 'return'
+./include/asm-generic/bitops/instrumented-non-atomic.h:58:1: warning: unreplaced symbol 'return'
+./include/asm-generic/bitops/instrumented-non-atomic.h:58:1: warning: unreplaced symbol 'return'
+./include/asm-generic/bitops/instrumented-non-atomic.h:58:1: warning: unreplaced symbol 'return'
+./include/asm-generic/bitops/instrumented-non-atomic.h:58:1: warning: unreplaced symbol 'return'
+./include/asm-generic/bitops/instrumented-non-atomic.h:97:1: warning: unreplaced symbol 'return'
+./include/asm-generic/bitops/instrumented-non-atomic.h:97:1: warning: unreplaced symbol 'return'
+./include/asm-generic/bitops/instrumented-non-atomic.h:97:1: warning: unreplaced symbol 'return'
+./include/asm-generic/bitops/instrumented-non-atomic.h:97:1: warning: unreplaced symbol 'return'
+./include/asm-generic/bitops/instrumented-non-atomic.h:97:1: warning: unreplaced symbol 'return'
^ permalink raw reply [flat|nested] 28+ messages in thread
* [Intel-gfx] ✗ Fi.CI.BAT: failure for drm/i915: extract vblank/scanline code to a separate file
2022-12-12 14:29 [Intel-gfx] [PATCH 0/7] drm/i915: extract vblank/scanline code to a separate file Jani Nikula
` (8 preceding siblings ...)
2022-12-12 14:46 ` [Intel-gfx] ✗ Fi.CI.SPARSE: " Patchwork
@ 2022-12-12 15:05 ` Patchwork
2022-12-14 4:12 ` [Intel-gfx] [PATCH 0/7] " Murthy, Arun R
10 siblings, 0 replies; 28+ messages in thread
From: Patchwork @ 2022-12-12 15:05 UTC (permalink / raw)
To: Jani Nikula; +Cc: intel-gfx
[-- Attachment #1: Type: text/plain, Size: 4002 bytes --]
== Series Details ==
Series: drm/i915: extract vblank/scanline code to a separate file
URL : https://patchwork.freedesktop.org/series/111854/
State : failure
== Summary ==
CI Bug Log - changes from CI_DRM_12493 -> Patchwork_111854v1
====================================================
Summary
-------
**FAILURE**
Serious unknown changes coming with Patchwork_111854v1 absolutely need to be
verified manually.
If you think the reported changes have nothing to do with the changes
introduced in Patchwork_111854v1, please notify your bug team to allow them
to document this new failure mode, which will reduce false positives in CI.
External URL: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111854v1/index.html
Participating hosts (40 -> 19)
------------------------------
ERROR: It appears as if the changes made in Patchwork_111854v1 prevented too many machines from booting.
Missing (21): fi-kbl-soraka bat-adls-5 bat-dg1-6 bat-dg1-5 bat-adlp-6 bat-rpls-2 fi-skl-6600u fi-bsw-n3050 bat-dg2-8 bat-adlm-1 bat-dg2-9 bat-adln-1 bat-jsl-3 bat-rplp-1 bat-dg2-11 fi-bsw-nick bat-dg1-7 bat-kbl-2 bat-adlp-9 bat-jsl-1 bat-adlp-4
Known issues
------------
Here are the changes found in Patchwork_111854v1 that come from known issues:
### IGT changes ###
#### Issues hit ####
* igt@kms_chamelium@common-hpd-after-suspend:
- fi-hsw-4770: NOTRUN -> [SKIP][1] ([fdo#109271] / [fdo#111827])
[1]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111854v1/fi-hsw-4770/igt@kms_chamelium@common-hpd-after-suspend.html
#### Possible fixes ####
* igt@gem_exec_gttfill@basic:
- fi-pnv-d510: [FAIL][2] ([i915#7229]) -> [PASS][3]
[2]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12493/fi-pnv-d510/igt@gem_exec_gttfill@basic.html
[3]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111854v1/fi-pnv-d510/igt@gem_exec_gttfill@basic.html
* igt@gem_exec_suspend@basic-s3@smem:
- fi-rkl-11600: [FAIL][4] ([fdo#103375]) -> [PASS][5]
[4]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12493/fi-rkl-11600/igt@gem_exec_suspend@basic-s3@smem.html
[5]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111854v1/fi-rkl-11600/igt@gem_exec_suspend@basic-s3@smem.html
* igt@i915_selftest@live@hangcheck:
- fi-hsw-4770: [INCOMPLETE][6] ([i915#4785]) -> [PASS][7]
[6]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12493/fi-hsw-4770/igt@i915_selftest@live@hangcheck.html
[7]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111854v1/fi-hsw-4770/igt@i915_selftest@live@hangcheck.html
[fdo#103375]: https://bugs.freedesktop.org/show_bug.cgi?id=103375
[fdo#109271]: https://bugs.freedesktop.org/show_bug.cgi?id=109271
[fdo#111827]: https://bugs.freedesktop.org/show_bug.cgi?id=111827
[i915#4785]: https://gitlab.freedesktop.org/drm/intel/issues/4785
[i915#7229]: https://gitlab.freedesktop.org/drm/intel/issues/7229
Build changes
-------------
* Linux: CI_DRM_12493 -> Patchwork_111854v1
CI-20190529: 20190529
CI_DRM_12493: a6dc4d045339e2817103e99539e3efaa554c941f @ git://anongit.freedesktop.org/gfx-ci/linux
IGT_7090: 5aafcf060b6dfbb2fa7aace76c8074d98ac7da8f @ https://gitlab.freedesktop.org/drm/igt-gpu-tools.git
Patchwork_111854v1: a6dc4d045339e2817103e99539e3efaa554c941f @ git://anongit.freedesktop.org/gfx-ci/linux
### Linux commits
85e6ae772631 drm/i915/reg: split out vblank/scanline regs
f51910697280 drm/i915/vblank: add and use intel_de_read64_2x32() to read vblank counter
dc0371955fd7 drm/i915/vblank: use intel_de_read()
9d717beba06e drm/i915/hdmi: abstract scanline range wait into intel_vblank.[ch]
d8e0ae4dbd16 drm/i915/display: use common function for checking scanline is moving
d3c5f97e4088 drm/i915/display: move more scanline functions to intel_vblank.[ch]
37bf1cfb7723 drm/i915/irq: split out vblank/scanline code to intel_vblank.[ch]
== Logs ==
For more details see: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111854v1/index.html
[-- Attachment #2: Type: text/html, Size: 4743 bytes --]
^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: [Intel-gfx] [PATCH 3/7] drm/i915/display: use common function for checking scanline is moving
2022-12-12 14:29 ` [Intel-gfx] [PATCH 3/7] drm/i915/display: use common function for checking scanline is moving Jani Nikula
@ 2022-12-14 4:01 ` Murthy, Arun R
0 siblings, 0 replies; 28+ messages in thread
From: Murthy, Arun R @ 2022-12-14 4:01 UTC (permalink / raw)
To: Nikula, Jani, intel-gfx@lists.freedesktop.org; +Cc: Nikula, Jani
> -----Original Message-----
> From: Intel-gfx <intel-gfx-bounces@lists.freedesktop.org> On Behalf Of Jani
> Nikula
> Sent: Monday, December 12, 2022 7:59 PM
> To: intel-gfx@lists.freedesktop.org
> Cc: Nikula, Jani <jani.nikula@intel.com>
> Subject: [Intel-gfx] [PATCH 3/7] drm/i915/display: use common function for
> checking scanline is moving
>
> cpt_verify_modeset() is roughly the same as
> intel_wait_for_pipe_scanline_moving(). Assume it's close enough.
>
> Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
> Signed-off-by: Jani Nikula <jani.nikula@intel.com>
> ---
Reviewed-by: Arun R Murthy <arun.r.murthy@intel.com>
Thanks and Regards,
Arun R Murthy
--------------------
> drivers/gpu/drm/i915/display/intel_display.c | 18 +-----------------
> 1 file changed, 1 insertion(+), 17 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/display/intel_display.c
> b/drivers/gpu/drm/i915/display/intel_display.c
> index 0cdb514d7ee0..ef15cc2b1fa9 100644
> --- a/drivers/gpu/drm/i915/display/intel_display.c
> +++ b/drivers/gpu/drm/i915/display/intel_display.c
> @@ -1062,22 +1062,6 @@ intel_get_crtc_new_encoder(const struct
> intel_atomic_state *state,
> return encoder;
> }
>
> -static void cpt_verify_modeset(struct drm_i915_private *dev_priv,
> - enum pipe pipe)
> -{
> - i915_reg_t dslreg = PIPEDSL(pipe);
> - u32 temp;
> -
> - temp = intel_de_read(dev_priv, dslreg);
> - udelay(500);
> - if (wait_for(intel_de_read(dev_priv, dslreg) != temp, 5)) {
> - if (wait_for(intel_de_read(dev_priv, dslreg) != temp, 5))
> - drm_err(&dev_priv->drm,
> - "mode set failed: pipe %c stuck\n",
> - pipe_name(pipe));
> - }
> -}
> -
> static void ilk_pfit_enable(const struct intel_crtc_state *crtc_state) {
> struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
> @@ -1772,7 +1756,7 @@ static void ilk_crtc_enable(struct
> intel_atomic_state *state,
> intel_encoders_enable(state, crtc);
>
> if (HAS_PCH_CPT(dev_priv))
> - cpt_verify_modeset(dev_priv, pipe);
> + intel_wait_for_pipe_scanline_moving(crtc);
>
> /*
> * Must wait for vblank to avoid spurious PCH FIFO underruns.
> --
> 2.34.1
^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: [Intel-gfx] [PATCH 5/7] drm/i915/vblank: use intel_de_read()
2022-12-12 14:29 ` [Intel-gfx] [PATCH 5/7] drm/i915/vblank: use intel_de_read() Jani Nikula
@ 2022-12-14 4:05 ` Murthy, Arun R
0 siblings, 0 replies; 28+ messages in thread
From: Murthy, Arun R @ 2022-12-14 4:05 UTC (permalink / raw)
To: Nikula, Jani, intel-gfx@lists.freedesktop.org; +Cc: Nikula, Jani
> -----Original Message-----
> From: Intel-gfx <intel-gfx-bounces@lists.freedesktop.org> On Behalf Of Jani
> Nikula
> Sent: Monday, December 12, 2022 7:59 PM
> To: intel-gfx@lists.freedesktop.org
> Cc: Nikula, Jani <jani.nikula@intel.com>
> Subject: [Intel-gfx] [PATCH 5/7] drm/i915/vblank: use intel_de_read()
>
> Use the intel_de_* functions for display registers.
>
> Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
> Signed-off-by: Jani Nikula <jani.nikula@intel.com>
> ---
Reviewed-by: Arun R Murthy <arun.r.murthy@intel.com>
Thanks and Regards,
Arun R Murthy
--------------------
> drivers/gpu/drm/i915/display/intel_vblank.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/drivers/gpu/drm/i915/display/intel_vblank.c
> b/drivers/gpu/drm/i915/display/intel_vblank.c
> index aec7758ef917..cf1215631b27 100644
> --- a/drivers/gpu/drm/i915/display/intel_vblank.c
> +++ b/drivers/gpu/drm/i915/display/intel_vblank.c
> @@ -137,7 +137,7 @@ u32 g4x_get_vblank_counter(struct drm_crtc *crtc)
> if (!vblank->max_vblank_count)
> return 0;
>
> - return intel_uncore_read(&dev_priv->uncore,
> PIPE_FRMCOUNT_G4X(pipe));
> + return intel_de_read(dev_priv, PIPE_FRMCOUNT_G4X(pipe));
> }
>
> static u32 intel_crtc_scanlines_since_frame_timestamp(struct intel_crtc
> *crtc)
> --
> 2.34.1
^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: [Intel-gfx] [PATCH 0/7] drm/i915: extract vblank/scanline code to a separate file
2022-12-12 14:29 [Intel-gfx] [PATCH 0/7] drm/i915: extract vblank/scanline code to a separate file Jani Nikula
` (9 preceding siblings ...)
2022-12-12 15:05 ` [Intel-gfx] ✗ Fi.CI.BAT: failure " Patchwork
@ 2022-12-14 4:12 ` Murthy, Arun R
2022-12-14 9:18 ` Jani Nikula
10 siblings, 1 reply; 28+ messages in thread
From: Murthy, Arun R @ 2022-12-14 4:12 UTC (permalink / raw)
To: Nikula, Jani, intel-gfx@lists.freedesktop.org; +Cc: Nikula, Jani
> -----Original Message-----
> From: Intel-gfx <intel-gfx-bounces@lists.freedesktop.org> On Behalf Of Jani
> Nikula
> Sent: Monday, December 12, 2022 7:59 PM
> To: intel-gfx@lists.freedesktop.org
> Cc: Nikula, Jani <jani.nikula@intel.com>
> Subject: [Intel-gfx] [PATCH 0/7] drm/i915: extract vblank/scanline code to a
> separate file
>
> Add new intel_vblank.[ch] and dump a bunch of the vblank/scanline code
> there.
>
> Jani Nikula (7):
> drm/i915/irq: split out vblank/scanline code to intel_vblank.[ch]
Can the function naming convention such as i915_get_vblank_counter be changed to intel_get_vblank_counter in the same series?
Thanks and Regards,
Arun R Murthy
--------------------
> drm/i915/display: move more scanline functions to intel_vblank.[ch]
> drm/i915/display: use common function for checking scanline is moving
> drm/i915/hdmi: abstract scanline range wait into intel_vblank.[ch]
> drm/i915/vblank: use intel_de_read()
> drm/i915/vblank: add and use intel_de_read64_2x32() to read vblank
> counter
> drm/i915/reg: split out vblank/scanline regs
>
> drivers/gpu/drm/i915/Makefile | 1 +
> drivers/gpu/drm/i915/display/intel_crt.c | 1 +
> drivers/gpu/drm/i915/display/intel_crtc.c | 1 +
> drivers/gpu/drm/i915/display/intel_de.h | 7 +
> drivers/gpu/drm/i915/display/intel_display.c | 54 +--
> .../drm/i915/display/intel_display_trace.h | 1 +
> drivers/gpu/drm/i915/display/intel_hdmi.c | 9 +-
> drivers/gpu/drm/i915/display/intel_vblank.c | 456 ++++++++++++++++++
> drivers/gpu/drm/i915/display/intel_vblank.h | 24 +
> .../gpu/drm/i915/display/intel_vblank_regs.h | 42 ++
> drivers/gpu/drm/i915/gvt/cmd_parser.c | 1 +
> drivers/gpu/drm/i915/gvt/display.c | 1 +
> drivers/gpu/drm/i915/gvt/handlers.c | 1 +
> drivers/gpu/drm/i915/i915_irq.c | 408 ----------------
> drivers/gpu/drm/i915/i915_irq.h | 6 -
> drivers/gpu/drm/i915/i915_reg.h | 35 --
> drivers/gpu/drm/i915/intel_gvt_mmio_table.c | 1 +
> 17 files changed, 541 insertions(+), 508 deletions(-) create mode 100644
> drivers/gpu/drm/i915/display/intel_vblank.c
> create mode 100644 drivers/gpu/drm/i915/display/intel_vblank.h
> create mode 100644 drivers/gpu/drm/i915/display/intel_vblank_regs.h
>
> --
> 2.34.1
^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: [Intel-gfx] [PATCH 2/7] drm/i915/display: move more scanline functions to intel_vblank.[ch]
2022-12-12 14:29 ` [Intel-gfx] [PATCH 2/7] drm/i915/display: move more scanline functions " Jani Nikula
@ 2022-12-14 4:15 ` Murthy, Arun R
2022-12-14 9:15 ` Jani Nikula
0 siblings, 1 reply; 28+ messages in thread
From: Murthy, Arun R @ 2022-12-14 4:15 UTC (permalink / raw)
To: Nikula, Jani, intel-gfx@lists.freedesktop.org; +Cc: Nikula, Jani
> -----Original Message-----
> From: Intel-gfx <intel-gfx-bounces@lists.freedesktop.org> On Behalf Of Jani
> Nikula
> Sent: Monday, December 12, 2022 7:59 PM
> To: intel-gfx@lists.freedesktop.org
> Cc: Nikula, Jani <jani.nikula@intel.com>
> Subject: [Intel-gfx] [PATCH 2/7] drm/i915/display: move more scanline
> functions to intel_vblank.[ch]
>
> Reduce clutter in intel_display.c by moving the scanline moving/stopped wait
> functions to intel_vblank.[ch].
>
> Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
> Signed-off-by: Jani Nikula <jani.nikula@intel.com>
> ---
> drivers/gpu/drm/i915/display/intel_display.c | 36 +-------------------
> drivers/gpu/drm/i915/display/intel_vblank.c | 35 +++++++++++++++++++
> drivers/gpu/drm/i915/display/intel_vblank.h | 2 ++
> 3 files changed, 38 insertions(+), 35 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/display/intel_display.c
> b/drivers/gpu/drm/i915/display/intel_display.c
> index 6cdfdae2c712..0cdb514d7ee0 100644
> --- a/drivers/gpu/drm/i915/display/intel_display.c
> +++ b/drivers/gpu/drm/i915/display/intel_display.c
> @@ -115,6 +115,7 @@
> #include "intel_quirks.h"
> #include "intel_sprite.h"
> #include "intel_tc.h"
> +#include "intel_vblank.h"
> #include "intel_vga.h"
> #include "i9xx_plane.h"
> #include "skl_scaler.h"
> @@ -386,41 +387,6 @@ struct intel_crtc *intel_master_crtc(const struct
> intel_crtc_state *crtc_state)
> return to_intel_crtc(crtc_state->uapi.crtc);
> }
>
> -static bool pipe_scanline_is_moving(struct drm_i915_private *dev_priv,
> - enum pipe pipe)
> -{
> - i915_reg_t reg = PIPEDSL(pipe);
> - u32 line1, line2;
> -
> - line1 = intel_de_read(dev_priv, reg) & PIPEDSL_LINE_MASK;
> - msleep(5);
> - line2 = intel_de_read(dev_priv, reg) & PIPEDSL_LINE_MASK;
> -
> - return line1 != line2;
> -}
> -
> -static void wait_for_pipe_scanline_moving(struct intel_crtc *crtc, bool state)
> -{
> - struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
> - enum pipe pipe = crtc->pipe;
> -
> - /* Wait for the display line to settle/start moving */
> - if (wait_for(pipe_scanline_is_moving(dev_priv, pipe) == state, 100))
> - drm_err(&dev_priv->drm,
> - "pipe %c scanline %s wait timed out\n",
> - pipe_name(pipe), str_on_off(state));
> -}
> -
> -static void intel_wait_for_pipe_scanline_stopped(struct intel_crtc *crtc) -{
> - wait_for_pipe_scanline_moving(crtc, false);
> -}
> -
> -static void intel_wait_for_pipe_scanline_moving(struct intel_crtc *crtc) -{
> - wait_for_pipe_scanline_moving(crtc, true);
> -}
> -
> static void
> intel_wait_for_pipe_off(const struct intel_crtc_state *old_crtc_state) { diff --
> git a/drivers/gpu/drm/i915/display/intel_vblank.c
> b/drivers/gpu/drm/i915/display/intel_vblank.c
> index 78a579496ad1..f25ec643a0a3 100644
> --- a/drivers/gpu/drm/i915/display/intel_vblank.c
> +++ b/drivers/gpu/drm/i915/display/intel_vblank.c
> @@ -417,3 +417,38 @@ int intel_get_crtc_scanline(struct intel_crtc *crtc)
>
> return position;
> }
> +
> +static bool pipe_scanline_is_moving(struct drm_i915_private *dev_priv,
> + enum pipe pipe)
> +{
> + i915_reg_t reg = PIPEDSL(pipe);
> + u32 line1, line2;
> +
> + line1 = intel_de_read(dev_priv, reg) & PIPEDSL_LINE_MASK;
> + msleep(5);
> + line2 = intel_de_read(dev_priv, reg) & PIPEDSL_LINE_MASK;
> +
> + return line1 != line2;
> +}
> +
> +static void wait_for_pipe_scanline_moving(struct intel_crtc *crtc, bool
> +state) {
> + struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
> + enum pipe pipe = crtc->pipe;
> +
> + /* Wait for the display line to settle/start moving */
> + if (wait_for(pipe_scanline_is_moving(dev_priv, pipe) == state, 100))
> + drm_err(&dev_priv->drm,
> + "pipe %c scanline %s wait timed out\n",
> + pipe_name(pipe), str_on_off(state)); }
> +
> +void intel_wait_for_pipe_scanline_stopped(struct intel_crtc *crtc) {
> + wait_for_pipe_scanline_moving(crtc, false); }
> +
Is this wrapper function required, since nothing else is being other than calling the function wait_for_pipe_scanline_moving, can this be replaced?
Thanks and Regards,
Arun R Murthy
--------------------
> +void intel_wait_for_pipe_scanline_moving(struct intel_crtc *crtc) {
> + wait_for_pipe_scanline_moving(crtc, true); }
> diff --git a/drivers/gpu/drm/i915/display/intel_vblank.h
> b/drivers/gpu/drm/i915/display/intel_vblank.h
> index 9c0034d7454d..54870cabd734 100644
> --- a/drivers/gpu/drm/i915/display/intel_vblank.h
> +++ b/drivers/gpu/drm/i915/display/intel_vblank.h
> @@ -17,5 +17,7 @@ u32 g4x_get_vblank_counter(struct drm_crtc *crtc);
> bool intel_crtc_get_vblank_timestamp(struct drm_crtc *crtc, int *max_error,
> ktime_t *vblank_time, bool in_vblank_irq);
> int intel_get_crtc_scanline(struct intel_crtc *crtc);
> +void intel_wait_for_pipe_scanline_stopped(struct intel_crtc *crtc);
> +void intel_wait_for_pipe_scanline_moving(struct intel_crtc *crtc);
>
> #endif /* __INTEL_VBLANK_H__ */
> --
> 2.34.1
^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: [Intel-gfx] [PATCH 4/7] drm/i915/hdmi: abstract scanline range wait into intel_vblank.[ch]
2022-12-12 14:29 ` [Intel-gfx] [PATCH 4/7] drm/i915/hdmi: abstract scanline range wait into intel_vblank.[ch] Jani Nikula
@ 2022-12-14 4:17 ` Murthy, Arun R
2022-12-14 14:16 ` Ville Syrjälä
1 sibling, 0 replies; 28+ messages in thread
From: Murthy, Arun R @ 2022-12-14 4:17 UTC (permalink / raw)
To: Nikula, Jani, intel-gfx@lists.freedesktop.org; +Cc: Nikula, Jani
> -----Original Message-----
> From: Intel-gfx <intel-gfx-bounces@lists.freedesktop.org> On Behalf Of Jani
> Nikula
> Sent: Monday, December 12, 2022 7:59 PM
> To: intel-gfx@lists.freedesktop.org
> Cc: Nikula, Jani <jani.nikula@intel.com>
> Subject: [Intel-gfx] [PATCH 4/7] drm/i915/hdmi: abstract scanline range wait
> into intel_vblank.[ch]
>
> Let's not have scanline waits inline in hdmi code.
>
> This kind of waits should really have timeouts; add a FIXME comment.
>
> Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
> Signed-off-by: Jani Nikula <jani.nikula@intel.com>
> ---
Reviewed-by: Arun R Murthy <arun.r.murthy@intel.com>
Thanks and Regards,
Arun R Murthy
--------------------
> drivers/gpu/drm/i915/display/intel_hdmi.c | 9 ++-------
> drivers/gpu/drm/i915/display/intel_vblank.c | 14 ++++++++++++++
> drivers/gpu/drm/i915/display/intel_vblank.h | 1 +
> 3 files changed, 17 insertions(+), 7 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/display/intel_hdmi.c
> b/drivers/gpu/drm/i915/display/intel_hdmi.c
> index e82f8a07e2b0..af6ef665368e 100644
> --- a/drivers/gpu/drm/i915/display/intel_hdmi.c
> +++ b/drivers/gpu/drm/i915/display/intel_hdmi.c
> @@ -56,6 +56,7 @@
> #include "intel_lspcon.h"
> #include "intel_panel.h"
> #include "intel_snps_phy.h"
> +#include "intel_vblank.h"
>
> static struct drm_i915_private *intel_hdmi_to_i915(struct intel_hdmi
> *intel_hdmi) { @@ -1476,15 +1477,9 @@ static int
> kbl_repositioning_enc_en_signal(struct intel_connector *connector,
> struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
> struct intel_digital_port *dig_port =
> intel_attached_dig_port(connector);
> struct intel_crtc *crtc = to_intel_crtc(connector->base.state->crtc);
> - u32 scanline;
> int ret;
>
> - for (;;) {
> - scanline = intel_de_read(dev_priv, PIPEDSL(crtc->pipe));
> - if (scanline > 100 && scanline < 200)
> - break;
> - usleep_range(25, 50);
> - }
> + intel_wait_for_pipe_scanline_range(crtc, 100, 200);
>
> ret = intel_ddi_toggle_hdcp_bits(&dig_port->base, cpu_transcoder,
> false,
> TRANS_DDI_HDCP_SIGNALLING); diff --git
> a/drivers/gpu/drm/i915/display/intel_vblank.c
> b/drivers/gpu/drm/i915/display/intel_vblank.c
> index f25ec643a0a3..aec7758ef917 100644
> --- a/drivers/gpu/drm/i915/display/intel_vblank.c
> +++ b/drivers/gpu/drm/i915/display/intel_vblank.c
> @@ -452,3 +452,17 @@ void intel_wait_for_pipe_scanline_moving(struct
> intel_crtc *crtc) {
> wait_for_pipe_scanline_moving(crtc, true); }
> +
> +void intel_wait_for_pipe_scanline_range(struct intel_crtc *crtc, u32
> +start, u32 end) {
> + struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
> + u32 scanline;
> +
> + /* FIXME: This needs to timeout and/or check that scanline is
> moving. */
> + for (;;) {
> + scanline = intel_de_read(dev_priv, PIPEDSL(crtc->pipe));
> + if (scanline > start && scanline < end)
> + break;
> + usleep_range(25, 50);
> + }
> +}
> diff --git a/drivers/gpu/drm/i915/display/intel_vblank.h
> b/drivers/gpu/drm/i915/display/intel_vblank.h
> index 54870cabd734..e88addfccea8 100644
> --- a/drivers/gpu/drm/i915/display/intel_vblank.h
> +++ b/drivers/gpu/drm/i915/display/intel_vblank.h
> @@ -19,5 +19,6 @@ bool intel_crtc_get_vblank_timestamp(struct drm_crtc
> *crtc, int *max_error, int intel_get_crtc_scanline(struct intel_crtc *crtc); void
> intel_wait_for_pipe_scanline_stopped(struct intel_crtc *crtc); void
> intel_wait_for_pipe_scanline_moving(struct intel_crtc *crtc);
> +void intel_wait_for_pipe_scanline_range(struct intel_crtc *crtc, u32
> +start, u32 end);
>
> #endif /* __INTEL_VBLANK_H__ */
> --
> 2.34.1
^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: [Intel-gfx] [PATCH 7/7] drm/i915/reg: split out vblank/scanline regs
2022-12-12 14:29 ` [Intel-gfx] [PATCH 7/7] drm/i915/reg: split out vblank/scanline regs Jani Nikula
@ 2022-12-14 4:24 ` Murthy, Arun R
2022-12-14 13:42 ` Ville Syrjälä
1 sibling, 0 replies; 28+ messages in thread
From: Murthy, Arun R @ 2022-12-14 4:24 UTC (permalink / raw)
To: Nikula, Jani, intel-gfx@lists.freedesktop.org; +Cc: Nikula, Jani
> -----Original Message-----
> From: Intel-gfx <intel-gfx-bounces@lists.freedesktop.org> On Behalf Of Jani
> Nikula
> Sent: Monday, December 12, 2022 7:59 PM
> To: intel-gfx@lists.freedesktop.org
> Cc: Nikula, Jani <jani.nikula@intel.com>
> Subject: [Intel-gfx] [PATCH 7/7] drm/i915/reg: split out vblank/scanline regs
>
> Reduce clutter in i915_reg.h by splitting out the vblank/scanline registers.
>
> Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
> Signed-off-by: Jani Nikula <jani.nikula@intel.com>
> ---
Reviewed-by: Arun R Murthy <arun.r.murthy@intel.com>
Thanks and Regards,
Arun R Murthy
---------------------
> drivers/gpu/drm/i915/display/intel_crt.c | 1 +
> drivers/gpu/drm/i915/display/intel_vblank.c | 1 +
> .../gpu/drm/i915/display/intel_vblank_regs.h | 42 +++++++++++++++++++
> drivers/gpu/drm/i915/gvt/cmd_parser.c | 1 +
> drivers/gpu/drm/i915/gvt/display.c | 1 +
> drivers/gpu/drm/i915/gvt/handlers.c | 1 +
> drivers/gpu/drm/i915/i915_reg.h | 35 ----------------
> drivers/gpu/drm/i915/intel_gvt_mmio_table.c | 1 +
> 8 files changed, 48 insertions(+), 35 deletions(-) create mode 100644
> drivers/gpu/drm/i915/display/intel_vblank_regs.h
>
> diff --git a/drivers/gpu/drm/i915/display/intel_crt.c
> b/drivers/gpu/drm/i915/display/intel_crt.c
> index 7267ffc7f539..e7482fc9f726 100644
> --- a/drivers/gpu/drm/i915/display/intel_crt.c
> +++ b/drivers/gpu/drm/i915/display/intel_crt.c
> @@ -49,6 +49,7 @@
> #include "intel_hotplug.h"
> #include "intel_pch_display.h"
> #include "intel_pch_refclk.h"
> +#include "intel_vblank_regs.h"
>
> /* Here's the desired hotplug mode */
> #define ADPA_HOTPLUG_BITS (ADPA_CRT_HOTPLUG_PERIOD_128 |
> \
> diff --git a/drivers/gpu/drm/i915/display/intel_vblank.c
> b/drivers/gpu/drm/i915/display/intel_vblank.c
> index 729c39180469..b017c2d00a3b 100644
> --- a/drivers/gpu/drm/i915/display/intel_vblank.c
> +++ b/drivers/gpu/drm/i915/display/intel_vblank.c
> @@ -8,6 +8,7 @@
> #include "intel_de.h"
> #include "intel_display_types.h"
> #include "intel_vblank.h"
> +#include "intel_vblank_regs.h"
>
> /*
> * This timing diagram depicts the video signal in and diff --git
> a/drivers/gpu/drm/i915/display/intel_vblank_regs.h
> b/drivers/gpu/drm/i915/display/intel_vblank_regs.h
> new file mode 100644
> index 000000000000..a851255ac2f1
> --- /dev/null
> +++ b/drivers/gpu/drm/i915/display/intel_vblank_regs.h
> @@ -0,0 +1,42 @@
> +/* SPDX-License-Identifier: MIT */
> +/*
> + * Copyright © 2022 Intel Corporation
> + */
> +
> +#ifndef __INTEL_VBLANK_REGS_H__
> +#define __INTEL_VBLANK_REGS_H__
> +
> +#include "intel_display_reg_defs.h"
> +
> +#define _PIPEADSL 0x70000
> +#define PIPEDSL_CURR_FIELD REG_BIT(31) /* ctg+ */
> +#define PIPEDSL_LINE_MASK REG_GENMASK(19, 0)
> +#define PIPEDSL(pipe) _MMIO_PIPE2(pipe, _PIPEADSL)
> +
> +/*
> + * The two pipe frame counter registers are not synchronized, so
> +reading a
> + * stable value is somewhat tricky. Use:
> + *
> + * u64 frame = intel_de_read64_2x32(dev_priv, PIPEFRAMEPIXEL(pipe),
> +PIPEFRAME(pipe)); */
> +
> +#define _PIPEAFRAMEHIGH 0x70040
> +#define PIPEFRAME(pipe) _MMIO_PIPE2(pipe,
> _PIPEAFRAMEHIGH)
> +#define PIPE_FRAME_HIGH_MASK 0x0000ffff
> +#define PIPE_FRAME_HIGH_SHIFT 0
> +
> +#define _PIPEAFRAMEPIXEL 0x70044
> +#define PIPEFRAMEPIXEL(pipe) _MMIO_PIPE2(pipe,
> _PIPEAFRAMEPIXEL)
> +#define PIPE_FRAME_LOW_MASK 0xff000000
> +#define PIPE_FRAME_LOW_SHIFT 24
> +#define PIPE_PIXEL_MASK 0x00ffffff
> +#define PIPE_PIXEL_SHIFT 0
> +
> +/* GM45+ just has to be different */
> +#define _PIPEA_FRMCOUNT_G4X 0x70040
> +#define PIPE_FRMCOUNT_G4X(pipe) _MMIO_PIPE2(pipe,
> _PIPEA_FRMCOUNT_G4X)
> +
> +#define _PIPEA_FLIPCOUNT_G4X 0x70044
> +#define PIPE_FLIPCOUNT_G4X(pipe) _MMIO_PIPE2(pipe,
> +_PIPEA_FLIPCOUNT_G4X)
> +
> +#endif /* __INTEL_VBLANK_REGS_H__ */
> diff --git a/drivers/gpu/drm/i915/gvt/cmd_parser.c
> b/drivers/gpu/drm/i915/gvt/cmd_parser.c
> index 0ebf5fbf0e39..8a72c75943c6 100644
> --- a/drivers/gpu/drm/i915/gvt/cmd_parser.c
> +++ b/drivers/gpu/drm/i915/gvt/cmd_parser.c
> @@ -38,6 +38,7 @@
>
> #include "i915_drv.h"
> #include "i915_reg.h"
> +#include "display/intel_vblank_regs.h"
> #include "gt/intel_engine_regs.h"
> #include "gt/intel_gpu_commands.h"
> #include "gt/intel_gt_regs.h"
> diff --git a/drivers/gpu/drm/i915/gvt/display.c
> b/drivers/gpu/drm/i915/gvt/display.c
> index c033249e73f4..894c8497961f 100644
> --- a/drivers/gpu/drm/i915/gvt/display.c
> +++ b/drivers/gpu/drm/i915/gvt/display.c
> @@ -37,6 +37,7 @@
> #include "gvt.h"
>
> #include "display/intel_dpio_phy.h"
> +#include "display/intel_vblank_regs.h"
>
> static int get_edp_pipe(struct intel_vgpu *vgpu) { diff --git
> a/drivers/gpu/drm/i915/gvt/handlers.c
> b/drivers/gpu/drm/i915/gvt/handlers.c
> index 735fc83e7026..efd613c2e068 100644
> --- a/drivers/gpu/drm/i915/gvt/handlers.c
> +++ b/drivers/gpu/drm/i915/gvt/handlers.c
> @@ -45,6 +45,7 @@
> #include "display/intel_dmc_regs.h"
> #include "display/intel_dpio_phy.h"
> #include "display/intel_fbc.h"
> +#include "display/intel_vblank_regs.h"
> #include "display/vlv_dsi_pll_regs.h"
> #include "gt/intel_gt_regs.h"
>
> diff --git a/drivers/gpu/drm/i915/i915_reg.h
> b/drivers/gpu/drm/i915/i915_reg.h index 2b7a63754e4d..f3d9797ceb52
> 100644
> --- a/drivers/gpu/drm/i915/i915_reg.h
> +++ b/drivers/gpu/drm/i915/i915_reg.h
> @@ -3489,9 +3489,6 @@
> /* Display & cursor control */
>
> /* Pipe A */
> -#define _PIPEADSL 0x70000
> -#define PIPEDSL_CURR_FIELD REG_BIT(31) /* ctg+ */
> -#define PIPEDSL_LINE_MASK REG_GENMASK(19, 0)
> #define _PIPEACONF 0x70008
> #define PIPECONF_ENABLE REG_BIT(31)
> #define PIPECONF_DOUBLE_WIDE REG_BIT(30) /* pre-
> i965 */
> @@ -3616,9 +3613,6 @@
> #define PIPE_DSI1_OFFSET 0x7b800
>
> #define PIPECONF(pipe) _MMIO_PIPE2(pipe, _PIPEACONF)
> -#define PIPEDSL(pipe) _MMIO_PIPE2(pipe, _PIPEADSL)
> -#define PIPEFRAME(pipe) _MMIO_PIPE2(pipe,
> _PIPEAFRAMEHIGH)
> -#define PIPEFRAMEPIXEL(pipe) _MMIO_PIPE2(pipe,
> _PIPEAFRAMEPIXEL)
> #define PIPESTAT(pipe) _MMIO_PIPE2(pipe, _PIPEASTAT)
>
> #define _PIPEAGCMAX 0x70010
> @@ -4034,35 +4028,6 @@
> #define WM_LP_SPRITE_MASK REG_GENMASK(10, 0)
> #define WM_LP_SPRITE(x) REG_FIELD_PREP(WM_LP_SPRITE_MASK, (x))
>
> -/*
> - * The two pipe frame counter registers are not synchronized, so
> - * reading a stable value is somewhat tricky. The following code
> - * should work:
> - *
> - * do {
> - * high1 = ((INREG(PIPEAFRAMEHIGH) & PIPE_FRAME_HIGH_MASK) >>
> - * PIPE_FRAME_HIGH_SHIFT;
> - * low1 = ((INREG(PIPEAFRAMEPIXEL) & PIPE_FRAME_LOW_MASK) >>
> - * PIPE_FRAME_LOW_SHIFT);
> - * high2 = ((INREG(PIPEAFRAMEHIGH) & PIPE_FRAME_HIGH_MASK) >>
> - * PIPE_FRAME_HIGH_SHIFT);
> - * } while (high1 != high2);
> - * frame = (high1 << 8) | low1;
> - */
> -#define _PIPEAFRAMEHIGH 0x70040
> -#define PIPE_FRAME_HIGH_MASK 0x0000ffff
> -#define PIPE_FRAME_HIGH_SHIFT 0
> -#define _PIPEAFRAMEPIXEL 0x70044
> -#define PIPE_FRAME_LOW_MASK 0xff000000
> -#define PIPE_FRAME_LOW_SHIFT 24
> -#define PIPE_PIXEL_MASK 0x00ffffff
> -#define PIPE_PIXEL_SHIFT 0
> -/* GM45+ just has to be different */
> -#define _PIPEA_FRMCOUNT_G4X 0x70040
> -#define _PIPEA_FLIPCOUNT_G4X 0x70044
> -#define PIPE_FRMCOUNT_G4X(pipe) _MMIO_PIPE2(pipe,
> _PIPEA_FRMCOUNT_G4X) -#define PIPE_FLIPCOUNT_G4X(pipe)
> _MMIO_PIPE2(pipe, _PIPEA_FLIPCOUNT_G4X)
> -
> /* Cursor A & B regs */
> #define _CURACNTR 0x70080
> /* Old style CUR*CNTR flags (desktop 8xx) */ diff --git
> a/drivers/gpu/drm/i915/intel_gvt_mmio_table.c
> b/drivers/gpu/drm/i915/intel_gvt_mmio_table.c
> index ce6b3c3b636a..604cc7ea8dac 100644
> --- a/drivers/gpu/drm/i915/intel_gvt_mmio_table.c
> +++ b/drivers/gpu/drm/i915/intel_gvt_mmio_table.c
> @@ -7,6 +7,7 @@
> #include "display/intel_backlight_regs.h"
> #include "display/intel_dmc_regs.h"
> #include "display/intel_dpio_phy.h"
> +#include "display/intel_vblank_regs.h"
> #include "display/vlv_dsi_pll_regs.h"
> #include "gt/intel_gt_regs.h"
> #include "gvt/gvt.h"
> --
> 2.34.1
^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: [Intel-gfx] [PATCH 2/7] drm/i915/display: move more scanline functions to intel_vblank.[ch]
2022-12-14 4:15 ` Murthy, Arun R
@ 2022-12-14 9:15 ` Jani Nikula
2022-12-15 2:11 ` Murthy, Arun R
0 siblings, 1 reply; 28+ messages in thread
From: Jani Nikula @ 2022-12-14 9:15 UTC (permalink / raw)
To: Murthy, Arun R, intel-gfx@lists.freedesktop.org
On Wed, 14 Dec 2022, "Murthy, Arun R" <arun.r.murthy@intel.com> wrote:
>> -----Original Message-----
>> From: Intel-gfx <intel-gfx-bounces@lists.freedesktop.org> On Behalf Of Jani
>> Nikula
>> Sent: Monday, December 12, 2022 7:59 PM
>> To: intel-gfx@lists.freedesktop.org
>> Cc: Nikula, Jani <jani.nikula@intel.com>
>> Subject: [Intel-gfx] [PATCH 2/7] drm/i915/display: move more scanline
>> functions to intel_vblank.[ch]
>>
>> Reduce clutter in intel_display.c by moving the scanline moving/stopped wait
>> functions to intel_vblank.[ch].
>>
>> Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
>> Signed-off-by: Jani Nikula <jani.nikula@intel.com>
>> ---
>> drivers/gpu/drm/i915/display/intel_display.c | 36 +-------------------
>> drivers/gpu/drm/i915/display/intel_vblank.c | 35 +++++++++++++++++++
>> drivers/gpu/drm/i915/display/intel_vblank.h | 2 ++
>> 3 files changed, 38 insertions(+), 35 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/i915/display/intel_display.c
>> b/drivers/gpu/drm/i915/display/intel_display.c
>> index 6cdfdae2c712..0cdb514d7ee0 100644
>> --- a/drivers/gpu/drm/i915/display/intel_display.c
>> +++ b/drivers/gpu/drm/i915/display/intel_display.c
>> @@ -115,6 +115,7 @@
>> #include "intel_quirks.h"
>> #include "intel_sprite.h"
>> #include "intel_tc.h"
>> +#include "intel_vblank.h"
>> #include "intel_vga.h"
>> #include "i9xx_plane.h"
>> #include "skl_scaler.h"
>> @@ -386,41 +387,6 @@ struct intel_crtc *intel_master_crtc(const struct
>> intel_crtc_state *crtc_state)
>> return to_intel_crtc(crtc_state->uapi.crtc);
>> }
>>
>> -static bool pipe_scanline_is_moving(struct drm_i915_private *dev_priv,
>> - enum pipe pipe)
>> -{
>> - i915_reg_t reg = PIPEDSL(pipe);
>> - u32 line1, line2;
>> -
>> - line1 = intel_de_read(dev_priv, reg) & PIPEDSL_LINE_MASK;
>> - msleep(5);
>> - line2 = intel_de_read(dev_priv, reg) & PIPEDSL_LINE_MASK;
>> -
>> - return line1 != line2;
>> -}
>> -
>> -static void wait_for_pipe_scanline_moving(struct intel_crtc *crtc, bool state)
>> -{
>> - struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
>> - enum pipe pipe = crtc->pipe;
>> -
>> - /* Wait for the display line to settle/start moving */
>> - if (wait_for(pipe_scanline_is_moving(dev_priv, pipe) == state, 100))
>> - drm_err(&dev_priv->drm,
>> - "pipe %c scanline %s wait timed out\n",
>> - pipe_name(pipe), str_on_off(state));
>> -}
>> -
>> -static void intel_wait_for_pipe_scanline_stopped(struct intel_crtc *crtc) -{
>> - wait_for_pipe_scanline_moving(crtc, false);
>> -}
>> -
>> -static void intel_wait_for_pipe_scanline_moving(struct intel_crtc *crtc) -{
>> - wait_for_pipe_scanline_moving(crtc, true);
>> -}
>> -
>> static void
>> intel_wait_for_pipe_off(const struct intel_crtc_state *old_crtc_state) { diff --
>> git a/drivers/gpu/drm/i915/display/intel_vblank.c
>> b/drivers/gpu/drm/i915/display/intel_vblank.c
>> index 78a579496ad1..f25ec643a0a3 100644
>> --- a/drivers/gpu/drm/i915/display/intel_vblank.c
>> +++ b/drivers/gpu/drm/i915/display/intel_vblank.c
>> @@ -417,3 +417,38 @@ int intel_get_crtc_scanline(struct intel_crtc *crtc)
>>
>> return position;
>> }
>> +
>> +static bool pipe_scanline_is_moving(struct drm_i915_private *dev_priv,
>> + enum pipe pipe)
>> +{
>> + i915_reg_t reg = PIPEDSL(pipe);
>> + u32 line1, line2;
>> +
>> + line1 = intel_de_read(dev_priv, reg) & PIPEDSL_LINE_MASK;
>> + msleep(5);
>> + line2 = intel_de_read(dev_priv, reg) & PIPEDSL_LINE_MASK;
>> +
>> + return line1 != line2;
>> +}
>> +
>> +static void wait_for_pipe_scanline_moving(struct intel_crtc *crtc, bool
>> +state) {
>> + struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
>> + enum pipe pipe = crtc->pipe;
>> +
>> + /* Wait for the display line to settle/start moving */
>> + if (wait_for(pipe_scanline_is_moving(dev_priv, pipe) == state, 100))
>> + drm_err(&dev_priv->drm,
>> + "pipe %c scanline %s wait timed out\n",
>> + pipe_name(pipe), str_on_off(state)); }
>> +
>> +void intel_wait_for_pipe_scanline_stopped(struct intel_crtc *crtc) {
>> + wait_for_pipe_scanline_moving(crtc, false); }
>> +
> Is this wrapper function required, since nothing else is being other
> than calling the function wait_for_pipe_scanline_moving, can this be
> replaced?
Well, first, this patch is only about code *movement*. Any changes like
that would have to be separate.
And how would you propose to drop the wrapper? The wrappers are all
about readability in the caller side:
intel_wait_for_pipe_scanline_stopped(crtc)
vs.
intel_wait_for_pipe_scanline_moving(crtc, false)
BR,
Jani.
>
> Thanks and Regards,
> Arun R Murthy
> --------------------
>
>> +void intel_wait_for_pipe_scanline_moving(struct intel_crtc *crtc) {
>> + wait_for_pipe_scanline_moving(crtc, true); }
>> diff --git a/drivers/gpu/drm/i915/display/intel_vblank.h
>> b/drivers/gpu/drm/i915/display/intel_vblank.h
>> index 9c0034d7454d..54870cabd734 100644
>> --- a/drivers/gpu/drm/i915/display/intel_vblank.h
>> +++ b/drivers/gpu/drm/i915/display/intel_vblank.h
>> @@ -17,5 +17,7 @@ u32 g4x_get_vblank_counter(struct drm_crtc *crtc);
>> bool intel_crtc_get_vblank_timestamp(struct drm_crtc *crtc, int *max_error,
>> ktime_t *vblank_time, bool in_vblank_irq);
>> int intel_get_crtc_scanline(struct intel_crtc *crtc);
>> +void intel_wait_for_pipe_scanline_stopped(struct intel_crtc *crtc);
>> +void intel_wait_for_pipe_scanline_moving(struct intel_crtc *crtc);
>>
>> #endif /* __INTEL_VBLANK_H__ */
>> --
>> 2.34.1
>
--
Jani Nikula, Intel Open Source Graphics Center
^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: [Intel-gfx] [PATCH 0/7] drm/i915: extract vblank/scanline code to a separate file
2022-12-14 4:12 ` [Intel-gfx] [PATCH 0/7] " Murthy, Arun R
@ 2022-12-14 9:18 ` Jani Nikula
2022-12-15 2:05 ` Murthy, Arun R
0 siblings, 1 reply; 28+ messages in thread
From: Jani Nikula @ 2022-12-14 9:18 UTC (permalink / raw)
To: Murthy, Arun R, intel-gfx@lists.freedesktop.org
On Wed, 14 Dec 2022, "Murthy, Arun R" <arun.r.murthy@intel.com> wrote:
>> -----Original Message-----
>> From: Intel-gfx <intel-gfx-bounces@lists.freedesktop.org> On Behalf Of Jani
>> Nikula
>> Sent: Monday, December 12, 2022 7:59 PM
>> To: intel-gfx@lists.freedesktop.org
>> Cc: Nikula, Jani <jani.nikula@intel.com>
>> Subject: [Intel-gfx] [PATCH 0/7] drm/i915: extract vblank/scanline code to a
>> separate file
>>
>> Add new intel_vblank.[ch] and dump a bunch of the vblank/scanline code
>> there.
>>
>> Jani Nikula (7):
>> drm/i915/irq: split out vblank/scanline code to intel_vblank.[ch]
> Can the function naming convention such as i915_get_vblank_counter be
> changed to intel_get_vblank_counter in the same series?
In this case i915_ is a platform prefix, contrast with
g4x_get_vblank_counter().
There's more naming to be sorted out, and I wanted to see what the
response was to this split with the scanline functions being included
here before embarking on doing a bunch of tedious renames.
BR,
Jani.
>
> Thanks and Regards,
> Arun R Murthy
> --------------------
>
>> drm/i915/display: move more scanline functions to intel_vblank.[ch]
>> drm/i915/display: use common function for checking scanline is moving
>> drm/i915/hdmi: abstract scanline range wait into intel_vblank.[ch]
>> drm/i915/vblank: use intel_de_read()
>> drm/i915/vblank: add and use intel_de_read64_2x32() to read vblank
>> counter
>> drm/i915/reg: split out vblank/scanline regs
>>
>> drivers/gpu/drm/i915/Makefile | 1 +
>> drivers/gpu/drm/i915/display/intel_crt.c | 1 +
>> drivers/gpu/drm/i915/display/intel_crtc.c | 1 +
>> drivers/gpu/drm/i915/display/intel_de.h | 7 +
>> drivers/gpu/drm/i915/display/intel_display.c | 54 +--
>> .../drm/i915/display/intel_display_trace.h | 1 +
>> drivers/gpu/drm/i915/display/intel_hdmi.c | 9 +-
>> drivers/gpu/drm/i915/display/intel_vblank.c | 456 ++++++++++++++++++
>> drivers/gpu/drm/i915/display/intel_vblank.h | 24 +
>> .../gpu/drm/i915/display/intel_vblank_regs.h | 42 ++
>> drivers/gpu/drm/i915/gvt/cmd_parser.c | 1 +
>> drivers/gpu/drm/i915/gvt/display.c | 1 +
>> drivers/gpu/drm/i915/gvt/handlers.c | 1 +
>> drivers/gpu/drm/i915/i915_irq.c | 408 ----------------
>> drivers/gpu/drm/i915/i915_irq.h | 6 -
>> drivers/gpu/drm/i915/i915_reg.h | 35 --
>> drivers/gpu/drm/i915/intel_gvt_mmio_table.c | 1 +
>> 17 files changed, 541 insertions(+), 508 deletions(-) create mode 100644
>> drivers/gpu/drm/i915/display/intel_vblank.c
>> create mode 100644 drivers/gpu/drm/i915/display/intel_vblank.h
>> create mode 100644 drivers/gpu/drm/i915/display/intel_vblank_regs.h
>>
>> --
>> 2.34.1
>
--
Jani Nikula, Intel Open Source Graphics Center
^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: [Intel-gfx] [PATCH 7/7] drm/i915/reg: split out vblank/scanline regs
2022-12-12 14:29 ` [Intel-gfx] [PATCH 7/7] drm/i915/reg: split out vblank/scanline regs Jani Nikula
2022-12-14 4:24 ` Murthy, Arun R
@ 2022-12-14 13:42 ` Ville Syrjälä
1 sibling, 0 replies; 28+ messages in thread
From: Ville Syrjälä @ 2022-12-14 13:42 UTC (permalink / raw)
To: Jani Nikula; +Cc: intel-gfx
On Mon, Dec 12, 2022 at 04:29:25PM +0200, Jani Nikula wrote:
> Reduce clutter in i915_reg.h by splitting out the vblank/scanline
> registers.
>
> Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
> Signed-off-by: Jani Nikula <jani.nikula@intel.com>
> ---
> drivers/gpu/drm/i915/display/intel_crt.c | 1 +
> drivers/gpu/drm/i915/display/intel_vblank.c | 1 +
> .../gpu/drm/i915/display/intel_vblank_regs.h | 42 +++++++++++++++++++
> drivers/gpu/drm/i915/gvt/cmd_parser.c | 1 +
> drivers/gpu/drm/i915/gvt/display.c | 1 +
> drivers/gpu/drm/i915/gvt/handlers.c | 1 +
> drivers/gpu/drm/i915/i915_reg.h | 35 ----------------
> drivers/gpu/drm/i915/intel_gvt_mmio_table.c | 1 +
> 8 files changed, 48 insertions(+), 35 deletions(-)
> create mode 100644 drivers/gpu/drm/i915/display/intel_vblank_regs.h
>
> diff --git a/drivers/gpu/drm/i915/display/intel_crt.c b/drivers/gpu/drm/i915/display/intel_crt.c
> index 7267ffc7f539..e7482fc9f726 100644
> --- a/drivers/gpu/drm/i915/display/intel_crt.c
> +++ b/drivers/gpu/drm/i915/display/intel_crt.c
> @@ -49,6 +49,7 @@
> #include "intel_hotplug.h"
> #include "intel_pch_display.h"
> #include "intel_pch_refclk.h"
> +#include "intel_vblank_regs.h"
That doesn't match any actual hardware block structure
so not really a fan. We could perhaps try something
like intel_{pipe,transcoder}_regs.h, but IIRC some of the
registers have more or less been moved between the pipe
vs. transcoder so not sure that makes total sense either.
Perhaps just intel_de_regs.h/etc. could be sufficient for
most things on this level?
>
> /* Here's the desired hotplug mode */
> #define ADPA_HOTPLUG_BITS (ADPA_CRT_HOTPLUG_PERIOD_128 | \
> diff --git a/drivers/gpu/drm/i915/display/intel_vblank.c b/drivers/gpu/drm/i915/display/intel_vblank.c
> index 729c39180469..b017c2d00a3b 100644
> --- a/drivers/gpu/drm/i915/display/intel_vblank.c
> +++ b/drivers/gpu/drm/i915/display/intel_vblank.c
> @@ -8,6 +8,7 @@
> #include "intel_de.h"
> #include "intel_display_types.h"
> #include "intel_vblank.h"
> +#include "intel_vblank_regs.h"
>
> /*
> * This timing diagram depicts the video signal in and
> diff --git a/drivers/gpu/drm/i915/display/intel_vblank_regs.h b/drivers/gpu/drm/i915/display/intel_vblank_regs.h
> new file mode 100644
> index 000000000000..a851255ac2f1
> --- /dev/null
> +++ b/drivers/gpu/drm/i915/display/intel_vblank_regs.h
> @@ -0,0 +1,42 @@
> +/* SPDX-License-Identifier: MIT */
> +/*
> + * Copyright © 2022 Intel Corporation
> + */
> +
> +#ifndef __INTEL_VBLANK_REGS_H__
> +#define __INTEL_VBLANK_REGS_H__
> +
> +#include "intel_display_reg_defs.h"
> +
> +#define _PIPEADSL 0x70000
> +#define PIPEDSL_CURR_FIELD REG_BIT(31) /* ctg+ */
> +#define PIPEDSL_LINE_MASK REG_GENMASK(19, 0)
> +#define PIPEDSL(pipe) _MMIO_PIPE2(pipe, _PIPEADSL)
> +
> +/*
> + * The two pipe frame counter registers are not synchronized, so reading a
> + * stable value is somewhat tricky. Use:
> + *
> + * u64 frame = intel_de_read64_2x32(dev_priv, PIPEFRAMEPIXEL(pipe), PIPEFRAME(pipe));
> + */
> +
> +#define _PIPEAFRAMEHIGH 0x70040
> +#define PIPEFRAME(pipe) _MMIO_PIPE2(pipe, _PIPEAFRAMEHIGH)
> +#define PIPE_FRAME_HIGH_MASK 0x0000ffff
> +#define PIPE_FRAME_HIGH_SHIFT 0
> +
> +#define _PIPEAFRAMEPIXEL 0x70044
> +#define PIPEFRAMEPIXEL(pipe) _MMIO_PIPE2(pipe, _PIPEAFRAMEPIXEL)
> +#define PIPE_FRAME_LOW_MASK 0xff000000
> +#define PIPE_FRAME_LOW_SHIFT 24
> +#define PIPE_PIXEL_MASK 0x00ffffff
> +#define PIPE_PIXEL_SHIFT 0
> +
> +/* GM45+ just has to be different */
> +#define _PIPEA_FRMCOUNT_G4X 0x70040
> +#define PIPE_FRMCOUNT_G4X(pipe) _MMIO_PIPE2(pipe, _PIPEA_FRMCOUNT_G4X)
> +
> +#define _PIPEA_FLIPCOUNT_G4X 0x70044
> +#define PIPE_FLIPCOUNT_G4X(pipe) _MMIO_PIPE2(pipe, _PIPEA_FLIPCOUNT_G4X)
> +
> +#endif /* __INTEL_VBLANK_REGS_H__ */
> diff --git a/drivers/gpu/drm/i915/gvt/cmd_parser.c b/drivers/gpu/drm/i915/gvt/cmd_parser.c
> index 0ebf5fbf0e39..8a72c75943c6 100644
> --- a/drivers/gpu/drm/i915/gvt/cmd_parser.c
> +++ b/drivers/gpu/drm/i915/gvt/cmd_parser.c
> @@ -38,6 +38,7 @@
>
> #include "i915_drv.h"
> #include "i915_reg.h"
> +#include "display/intel_vblank_regs.h"
> #include "gt/intel_engine_regs.h"
> #include "gt/intel_gpu_commands.h"
> #include "gt/intel_gt_regs.h"
> diff --git a/drivers/gpu/drm/i915/gvt/display.c b/drivers/gpu/drm/i915/gvt/display.c
> index c033249e73f4..894c8497961f 100644
> --- a/drivers/gpu/drm/i915/gvt/display.c
> +++ b/drivers/gpu/drm/i915/gvt/display.c
> @@ -37,6 +37,7 @@
> #include "gvt.h"
>
> #include "display/intel_dpio_phy.h"
> +#include "display/intel_vblank_regs.h"
>
> static int get_edp_pipe(struct intel_vgpu *vgpu)
> {
> diff --git a/drivers/gpu/drm/i915/gvt/handlers.c b/drivers/gpu/drm/i915/gvt/handlers.c
> index 735fc83e7026..efd613c2e068 100644
> --- a/drivers/gpu/drm/i915/gvt/handlers.c
> +++ b/drivers/gpu/drm/i915/gvt/handlers.c
> @@ -45,6 +45,7 @@
> #include "display/intel_dmc_regs.h"
> #include "display/intel_dpio_phy.h"
> #include "display/intel_fbc.h"
> +#include "display/intel_vblank_regs.h"
> #include "display/vlv_dsi_pll_regs.h"
> #include "gt/intel_gt_regs.h"
>
> diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
> index 2b7a63754e4d..f3d9797ceb52 100644
> --- a/drivers/gpu/drm/i915/i915_reg.h
> +++ b/drivers/gpu/drm/i915/i915_reg.h
> @@ -3489,9 +3489,6 @@
> /* Display & cursor control */
>
> /* Pipe A */
> -#define _PIPEADSL 0x70000
> -#define PIPEDSL_CURR_FIELD REG_BIT(31) /* ctg+ */
> -#define PIPEDSL_LINE_MASK REG_GENMASK(19, 0)
> #define _PIPEACONF 0x70008
> #define PIPECONF_ENABLE REG_BIT(31)
> #define PIPECONF_DOUBLE_WIDE REG_BIT(30) /* pre-i965 */
> @@ -3616,9 +3613,6 @@
> #define PIPE_DSI1_OFFSET 0x7b800
>
> #define PIPECONF(pipe) _MMIO_PIPE2(pipe, _PIPEACONF)
> -#define PIPEDSL(pipe) _MMIO_PIPE2(pipe, _PIPEADSL)
> -#define PIPEFRAME(pipe) _MMIO_PIPE2(pipe, _PIPEAFRAMEHIGH)
> -#define PIPEFRAMEPIXEL(pipe) _MMIO_PIPE2(pipe, _PIPEAFRAMEPIXEL)
> #define PIPESTAT(pipe) _MMIO_PIPE2(pipe, _PIPEASTAT)
>
> #define _PIPEAGCMAX 0x70010
> @@ -4034,35 +4028,6 @@
> #define WM_LP_SPRITE_MASK REG_GENMASK(10, 0)
> #define WM_LP_SPRITE(x) REG_FIELD_PREP(WM_LP_SPRITE_MASK, (x))
>
> -/*
> - * The two pipe frame counter registers are not synchronized, so
> - * reading a stable value is somewhat tricky. The following code
> - * should work:
> - *
> - * do {
> - * high1 = ((INREG(PIPEAFRAMEHIGH) & PIPE_FRAME_HIGH_MASK) >>
> - * PIPE_FRAME_HIGH_SHIFT;
> - * low1 = ((INREG(PIPEAFRAMEPIXEL) & PIPE_FRAME_LOW_MASK) >>
> - * PIPE_FRAME_LOW_SHIFT);
> - * high2 = ((INREG(PIPEAFRAMEHIGH) & PIPE_FRAME_HIGH_MASK) >>
> - * PIPE_FRAME_HIGH_SHIFT);
> - * } while (high1 != high2);
> - * frame = (high1 << 8) | low1;
> - */
> -#define _PIPEAFRAMEHIGH 0x70040
> -#define PIPE_FRAME_HIGH_MASK 0x0000ffff
> -#define PIPE_FRAME_HIGH_SHIFT 0
> -#define _PIPEAFRAMEPIXEL 0x70044
> -#define PIPE_FRAME_LOW_MASK 0xff000000
> -#define PIPE_FRAME_LOW_SHIFT 24
> -#define PIPE_PIXEL_MASK 0x00ffffff
> -#define PIPE_PIXEL_SHIFT 0
> -/* GM45+ just has to be different */
> -#define _PIPEA_FRMCOUNT_G4X 0x70040
> -#define _PIPEA_FLIPCOUNT_G4X 0x70044
> -#define PIPE_FRMCOUNT_G4X(pipe) _MMIO_PIPE2(pipe, _PIPEA_FRMCOUNT_G4X)
> -#define PIPE_FLIPCOUNT_G4X(pipe) _MMIO_PIPE2(pipe, _PIPEA_FLIPCOUNT_G4X)
> -
> /* Cursor A & B regs */
> #define _CURACNTR 0x70080
> /* Old style CUR*CNTR flags (desktop 8xx) */
> diff --git a/drivers/gpu/drm/i915/intel_gvt_mmio_table.c b/drivers/gpu/drm/i915/intel_gvt_mmio_table.c
> index ce6b3c3b636a..604cc7ea8dac 100644
> --- a/drivers/gpu/drm/i915/intel_gvt_mmio_table.c
> +++ b/drivers/gpu/drm/i915/intel_gvt_mmio_table.c
> @@ -7,6 +7,7 @@
> #include "display/intel_backlight_regs.h"
> #include "display/intel_dmc_regs.h"
> #include "display/intel_dpio_phy.h"
> +#include "display/intel_vblank_regs.h"
> #include "display/vlv_dsi_pll_regs.h"
> #include "gt/intel_gt_regs.h"
> #include "gvt/gvt.h"
> --
> 2.34.1
--
Ville Syrjälä
Intel
^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: [Intel-gfx] [PATCH 4/7] drm/i915/hdmi: abstract scanline range wait into intel_vblank.[ch]
2022-12-12 14:29 ` [Intel-gfx] [PATCH 4/7] drm/i915/hdmi: abstract scanline range wait into intel_vblank.[ch] Jani Nikula
2022-12-14 4:17 ` Murthy, Arun R
@ 2022-12-14 14:16 ` Ville Syrjälä
1 sibling, 0 replies; 28+ messages in thread
From: Ville Syrjälä @ 2022-12-14 14:16 UTC (permalink / raw)
To: Jani Nikula; +Cc: intel-gfx
On Mon, Dec 12, 2022 at 04:29:22PM +0200, Jani Nikula wrote:
> Let's not have scanline waits inline in hdmi code.
>
> This kind of waits should really have timeouts; add a FIXME comment.
>
> Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
> Signed-off-by: Jani Nikula <jani.nikula@intel.com>
> ---
> drivers/gpu/drm/i915/display/intel_hdmi.c | 9 ++-------
> drivers/gpu/drm/i915/display/intel_vblank.c | 14 ++++++++++++++
> drivers/gpu/drm/i915/display/intel_vblank.h | 1 +
> 3 files changed, 17 insertions(+), 7 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/display/intel_hdmi.c b/drivers/gpu/drm/i915/display/intel_hdmi.c
> index e82f8a07e2b0..af6ef665368e 100644
> --- a/drivers/gpu/drm/i915/display/intel_hdmi.c
> +++ b/drivers/gpu/drm/i915/display/intel_hdmi.c
> @@ -56,6 +56,7 @@
> #include "intel_lspcon.h"
> #include "intel_panel.h"
> #include "intel_snps_phy.h"
> +#include "intel_vblank.h"
>
> static struct drm_i915_private *intel_hdmi_to_i915(struct intel_hdmi *intel_hdmi)
> {
> @@ -1476,15 +1477,9 @@ static int kbl_repositioning_enc_en_signal(struct intel_connector *connector,
> struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
> struct intel_digital_port *dig_port = intel_attached_dig_port(connector);
> struct intel_crtc *crtc = to_intel_crtc(connector->base.state->crtc);
> - u32 scanline;
> int ret;
>
> - for (;;) {
> - scanline = intel_de_read(dev_priv, PIPEDSL(crtc->pipe));
> - if (scanline > 100 && scanline < 200)
> - break;
> - usleep_range(25, 50);
> - }
> + intel_wait_for_pipe_scanline_range(crtc, 100, 200);
>
> ret = intel_ddi_toggle_hdcp_bits(&dig_port->base, cpu_transcoder,
> false, TRANS_DDI_HDCP_SIGNALLING);
> diff --git a/drivers/gpu/drm/i915/display/intel_vblank.c b/drivers/gpu/drm/i915/display/intel_vblank.c
> index f25ec643a0a3..aec7758ef917 100644
> --- a/drivers/gpu/drm/i915/display/intel_vblank.c
> +++ b/drivers/gpu/drm/i915/display/intel_vblank.c
> @@ -452,3 +452,17 @@ void intel_wait_for_pipe_scanline_moving(struct intel_crtc *crtc)
> {
> wait_for_pipe_scanline_moving(crtc, true);
> }
> +
> +void intel_wait_for_pipe_scanline_range(struct intel_crtc *crtc, u32 start, u32 end)
> +{
> + struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
> + u32 scanline;
> +
> + /* FIXME: This needs to timeout and/or check that scanline is moving. */
> + for (;;) {
> + scanline = intel_de_read(dev_priv, PIPEDSL(crtc->pipe));
If we want to advertise this as any kind of official thing then
it should really use intel_get_crtc_scanline() which eg. accounts
for crtc->scanline_offset.
But I have no solid idea what this thing is even trying to do.
There is one workaround I see that says some hdcp bits must be
toggled during a single frame, and if this is that then it
should probably be rewritten to make proper sense, or at least
it should have a comment stating what the heck it's trying to do.
> + if (scanline > start && scanline < end)
> + break;
> + usleep_range(25, 50);
> + }
> +}
> diff --git a/drivers/gpu/drm/i915/display/intel_vblank.h b/drivers/gpu/drm/i915/display/intel_vblank.h
> index 54870cabd734..e88addfccea8 100644
> --- a/drivers/gpu/drm/i915/display/intel_vblank.h
> +++ b/drivers/gpu/drm/i915/display/intel_vblank.h
> @@ -19,5 +19,6 @@ bool intel_crtc_get_vblank_timestamp(struct drm_crtc *crtc, int *max_error,
> int intel_get_crtc_scanline(struct intel_crtc *crtc);
> void intel_wait_for_pipe_scanline_stopped(struct intel_crtc *crtc);
> void intel_wait_for_pipe_scanline_moving(struct intel_crtc *crtc);
> +void intel_wait_for_pipe_scanline_range(struct intel_crtc *crtc, u32 start, u32 end);
>
> #endif /* __INTEL_VBLANK_H__ */
> --
> 2.34.1
--
Ville Syrjälä
Intel
^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: [Intel-gfx] [PATCH 0/7] drm/i915: extract vblank/scanline code to a separate file
2022-12-14 9:18 ` Jani Nikula
@ 2022-12-15 2:05 ` Murthy, Arun R
0 siblings, 0 replies; 28+ messages in thread
From: Murthy, Arun R @ 2022-12-15 2:05 UTC (permalink / raw)
To: Nikula, Jani, intel-gfx@lists.freedesktop.org
> -----Original Message-----
> From: Nikula, Jani <jani.nikula@intel.com>
> Sent: Wednesday, December 14, 2022 2:49 PM
> To: Murthy, Arun R <arun.r.murthy@intel.com>; intel-
> gfx@lists.freedesktop.org
> Subject: RE: [Intel-gfx] [PATCH 0/7] drm/i915: extract vblank/scanline code to
> a separate file
>
> On Wed, 14 Dec 2022, "Murthy, Arun R" <arun.r.murthy@intel.com> wrote:
> >> -----Original Message-----
> >> From: Intel-gfx <intel-gfx-bounces@lists.freedesktop.org> On Behalf
> >> Of Jani Nikula
> >> Sent: Monday, December 12, 2022 7:59 PM
> >> To: intel-gfx@lists.freedesktop.org
> >> Cc: Nikula, Jani <jani.nikula@intel.com>
> >> Subject: [Intel-gfx] [PATCH 0/7] drm/i915: extract vblank/scanline
> >> code to a separate file
> >>
> >> Add new intel_vblank.[ch] and dump a bunch of the vblank/scanline
> >> code there.
> >>
> >> Jani Nikula (7):
> >> drm/i915/irq: split out vblank/scanline code to intel_vblank.[ch]
> > Can the function naming convention such as i915_get_vblank_counter be
> > changed to intel_get_vblank_counter in the same series?
>
> In this case i915_ is a platform prefix, contrast with
> g4x_get_vblank_counter().
>
> There's more naming to be sorted out, and I wanted to see what the
> response was to this split with the scanline functions being included here
> before embarking on doing a bunch of tedious renames.
>
Just commented to see if these changes are coming in the same series. Understand that its more tedious and will be taken later. Thanks for the clarification.
Thanks and Regards,
Arun R Murthy
--------------------
> BR,
> Jani.
>
> >
> > Thanks and Regards,
> > Arun R Murthy
> > --------------------
> >
> >> drm/i915/display: move more scanline functions to intel_vblank.[ch]
> >> drm/i915/display: use common function for checking scanline is moving
> >> drm/i915/hdmi: abstract scanline range wait into intel_vblank.[ch]
> >> drm/i915/vblank: use intel_de_read()
> >> drm/i915/vblank: add and use intel_de_read64_2x32() to read vblank
> >> counter
> >> drm/i915/reg: split out vblank/scanline regs
> >>
> >> drivers/gpu/drm/i915/Makefile | 1 +
> >> drivers/gpu/drm/i915/display/intel_crt.c | 1 +
> >> drivers/gpu/drm/i915/display/intel_crtc.c | 1 +
> >> drivers/gpu/drm/i915/display/intel_de.h | 7 +
> >> drivers/gpu/drm/i915/display/intel_display.c | 54 +--
> >> .../drm/i915/display/intel_display_trace.h | 1 +
> >> drivers/gpu/drm/i915/display/intel_hdmi.c | 9 +-
> >> drivers/gpu/drm/i915/display/intel_vblank.c | 456
> ++++++++++++++++++
> >> drivers/gpu/drm/i915/display/intel_vblank.h | 24 +
> >> .../gpu/drm/i915/display/intel_vblank_regs.h | 42 ++
> >> drivers/gpu/drm/i915/gvt/cmd_parser.c | 1 +
> >> drivers/gpu/drm/i915/gvt/display.c | 1 +
> >> drivers/gpu/drm/i915/gvt/handlers.c | 1 +
> >> drivers/gpu/drm/i915/i915_irq.c | 408 ----------------
> >> drivers/gpu/drm/i915/i915_irq.h | 6 -
> >> drivers/gpu/drm/i915/i915_reg.h | 35 --
> >> drivers/gpu/drm/i915/intel_gvt_mmio_table.c | 1 +
> >> 17 files changed, 541 insertions(+), 508 deletions(-) create mode
> >> 100644 drivers/gpu/drm/i915/display/intel_vblank.c
> >> create mode 100644 drivers/gpu/drm/i915/display/intel_vblank.h
> >> create mode 100644 drivers/gpu/drm/i915/display/intel_vblank_regs.h
> >>
> >> --
> >> 2.34.1
> >
>
> --
> Jani Nikula, Intel Open Source Graphics Center
^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: [Intel-gfx] [PATCH 2/7] drm/i915/display: move more scanline functions to intel_vblank.[ch]
2022-12-14 9:15 ` Jani Nikula
@ 2022-12-15 2:11 ` Murthy, Arun R
2022-12-15 9:12 ` Jani Nikula
0 siblings, 1 reply; 28+ messages in thread
From: Murthy, Arun R @ 2022-12-15 2:11 UTC (permalink / raw)
To: Nikula, Jani, intel-gfx@lists.freedesktop.org
> -----Original Message-----
> From: Nikula, Jani <jani.nikula@intel.com>
> Sent: Wednesday, December 14, 2022 2:45 PM
> To: Murthy, Arun R <arun.r.murthy@intel.com>; intel-
> gfx@lists.freedesktop.org
> Subject: RE: [Intel-gfx] [PATCH 2/7] drm/i915/display: move more scanline
> functions to intel_vblank.[ch]
>
> On Wed, 14 Dec 2022, "Murthy, Arun R" <arun.r.murthy@intel.com> wrote:
> >> -----Original Message-----
> >> From: Intel-gfx <intel-gfx-bounces@lists.freedesktop.org> On Behalf
> >> Of Jani Nikula
> >> Sent: Monday, December 12, 2022 7:59 PM
> >> To: intel-gfx@lists.freedesktop.org
> >> Cc: Nikula, Jani <jani.nikula@intel.com>
> >> Subject: [Intel-gfx] [PATCH 2/7] drm/i915/display: move more scanline
> >> functions to intel_vblank.[ch]
> >>
> >> Reduce clutter in intel_display.c by moving the scanline
> >> moving/stopped wait functions to intel_vblank.[ch].
> >>
> >> Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
> >> Signed-off-by: Jani Nikula <jani.nikula@intel.com>
> >> ---
> >> drivers/gpu/drm/i915/display/intel_display.c | 36
> >> +------------------- drivers/gpu/drm/i915/display/intel_vblank.c |
> >> 35 +++++++++++++++++++ drivers/gpu/drm/i915/display/intel_vblank.h |
> >> 2 ++
> >> 3 files changed, 38 insertions(+), 35 deletions(-)
> >>
> >> diff --git a/drivers/gpu/drm/i915/display/intel_display.c
> >> b/drivers/gpu/drm/i915/display/intel_display.c
> >> index 6cdfdae2c712..0cdb514d7ee0 100644
> >> --- a/drivers/gpu/drm/i915/display/intel_display.c
> >> +++ b/drivers/gpu/drm/i915/display/intel_display.c
> >> @@ -115,6 +115,7 @@
> >> #include "intel_quirks.h"
> >> #include "intel_sprite.h"
> >> #include "intel_tc.h"
> >> +#include "intel_vblank.h"
> >> #include "intel_vga.h"
> >> #include "i9xx_plane.h"
> >> #include "skl_scaler.h"
> >> @@ -386,41 +387,6 @@ struct intel_crtc *intel_master_crtc(const
> >> struct intel_crtc_state *crtc_state)
> >> return to_intel_crtc(crtc_state->uapi.crtc);
> >> }
> >>
> >> -static bool pipe_scanline_is_moving(struct drm_i915_private *dev_priv,
> >> - enum pipe pipe)
> >> -{
> >> - i915_reg_t reg = PIPEDSL(pipe);
> >> - u32 line1, line2;
> >> -
> >> - line1 = intel_de_read(dev_priv, reg) & PIPEDSL_LINE_MASK;
> >> - msleep(5);
> >> - line2 = intel_de_read(dev_priv, reg) & PIPEDSL_LINE_MASK;
> >> -
> >> - return line1 != line2;
> >> -}
> >> -
> >> -static void wait_for_pipe_scanline_moving(struct intel_crtc *crtc,
> >> bool state) -{
> >> - struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
> >> - enum pipe pipe = crtc->pipe;
> >> -
> >> - /* Wait for the display line to settle/start moving */
> >> - if (wait_for(pipe_scanline_is_moving(dev_priv, pipe) == state, 100))
> >> - drm_err(&dev_priv->drm,
> >> - "pipe %c scanline %s wait timed out\n",
> >> - pipe_name(pipe), str_on_off(state));
> >> -}
> >> -
> >> -static void intel_wait_for_pipe_scanline_stopped(struct intel_crtc *crtc) -{
> >> - wait_for_pipe_scanline_moving(crtc, false);
> >> -}
> >> -
> >> -static void intel_wait_for_pipe_scanline_moving(struct intel_crtc *crtc) -{
> >> - wait_for_pipe_scanline_moving(crtc, true);
> >> -}
> >> -
> >> static void
> >> intel_wait_for_pipe_off(const struct intel_crtc_state
> >> *old_crtc_state) { diff -- git
> >> a/drivers/gpu/drm/i915/display/intel_vblank.c
> >> b/drivers/gpu/drm/i915/display/intel_vblank.c
> >> index 78a579496ad1..f25ec643a0a3 100644
> >> --- a/drivers/gpu/drm/i915/display/intel_vblank.c
> >> +++ b/drivers/gpu/drm/i915/display/intel_vblank.c
> >> @@ -417,3 +417,38 @@ int intel_get_crtc_scanline(struct intel_crtc
> >> *crtc)
> >>
> >> return position;
> >> }
> >> +
> >> +static bool pipe_scanline_is_moving(struct drm_i915_private *dev_priv,
> >> + enum pipe pipe) {
> >> + i915_reg_t reg = PIPEDSL(pipe);
> >> + u32 line1, line2;
> >> +
> >> + line1 = intel_de_read(dev_priv, reg) & PIPEDSL_LINE_MASK;
> >> + msleep(5);
> >> + line2 = intel_de_read(dev_priv, reg) & PIPEDSL_LINE_MASK;
> >> +
> >> + return line1 != line2;
> >> +}
> >> +
> >> +static void wait_for_pipe_scanline_moving(struct intel_crtc *crtc,
> >> +bool
> >> +state) {
> >> + struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
> >> + enum pipe pipe = crtc->pipe;
> >> +
> >> + /* Wait for the display line to settle/start moving */
> >> + if (wait_for(pipe_scanline_is_moving(dev_priv, pipe) == state, 100))
> >> + drm_err(&dev_priv->drm,
> >> + "pipe %c scanline %s wait timed out\n",
> >> + pipe_name(pipe), str_on_off(state)); }
> >> +
> >> +void intel_wait_for_pipe_scanline_stopped(struct intel_crtc *crtc) {
> >> + wait_for_pipe_scanline_moving(crtc, false); }
> >> +
> > Is this wrapper function required, since nothing else is being other
> > than calling the function wait_for_pipe_scanline_moving, can this be
> > replaced?
>
> Well, first, this patch is only about code *movement*. Any changes like that
> would have to be separate.
>
Ok.
Reviewed-by: Arun R Murthy <arun.r.murthy@intel.com>
> And how would you propose to drop the wrapper? The wrappers are all
> about readability in the caller side:
>
I didn’t mean to drop the wrapper, understand that wrapper is more readable, what I meant is to replace wait_for_pipe_scanline_moving/stopped with its function contents.
Thanks and Regards,
Arun R Murthy
--------------------
> intel_wait_for_pipe_scanline_stopped(crtc)
>
> vs.
>
> intel_wait_for_pipe_scanline_moving(crtc, false)
>
> BR,
> Jani.
>
> >
> > Thanks and Regards,
> > Arun R Murthy
> > --------------------
> >
> >> +void intel_wait_for_pipe_scanline_moving(struct intel_crtc *crtc) {
> >> + wait_for_pipe_scanline_moving(crtc, true); }
> >> diff --git a/drivers/gpu/drm/i915/display/intel_vblank.h
> >> b/drivers/gpu/drm/i915/display/intel_vblank.h
> >> index 9c0034d7454d..54870cabd734 100644
> >> --- a/drivers/gpu/drm/i915/display/intel_vblank.h
> >> +++ b/drivers/gpu/drm/i915/display/intel_vblank.h
> >> @@ -17,5 +17,7 @@ u32 g4x_get_vblank_counter(struct drm_crtc *crtc);
> >> bool intel_crtc_get_vblank_timestamp(struct drm_crtc *crtc, int
> *max_error,
> >> ktime_t *vblank_time, bool
> >> in_vblank_irq); int intel_get_crtc_scanline(struct intel_crtc *crtc);
> >> +void intel_wait_for_pipe_scanline_stopped(struct intel_crtc *crtc);
> >> +void intel_wait_for_pipe_scanline_moving(struct intel_crtc *crtc);
> >>
> >> #endif /* __INTEL_VBLANK_H__ */
> >> --
> >> 2.34.1
> >
>
> --
> Jani Nikula, Intel Open Source Graphics Center
^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: [Intel-gfx] [PATCH 2/7] drm/i915/display: move more scanline functions to intel_vblank.[ch]
2022-12-15 2:11 ` Murthy, Arun R
@ 2022-12-15 9:12 ` Jani Nikula
2022-12-15 9:59 ` Murthy, Arun R
0 siblings, 1 reply; 28+ messages in thread
From: Jani Nikula @ 2022-12-15 9:12 UTC (permalink / raw)
To: Murthy, Arun R, intel-gfx@lists.freedesktop.org
On Thu, 15 Dec 2022, "Murthy, Arun R" <arun.r.murthy@intel.com> wrote:
>> -----Original Message-----
>> From: Nikula, Jani <jani.nikula@intel.com>
>> Sent: Wednesday, December 14, 2022 2:45 PM
>> To: Murthy, Arun R <arun.r.murthy@intel.com>; intel-
>> gfx@lists.freedesktop.org
>> Subject: RE: [Intel-gfx] [PATCH 2/7] drm/i915/display: move more scanline
>> functions to intel_vblank.[ch]
>>
>> On Wed, 14 Dec 2022, "Murthy, Arun R" <arun.r.murthy@intel.com> wrote:
>> >> -----Original Message-----
>> >> From: Intel-gfx <intel-gfx-bounces@lists.freedesktop.org> On Behalf
>> >> Of Jani Nikula
>> >> Sent: Monday, December 12, 2022 7:59 PM
>> >> To: intel-gfx@lists.freedesktop.org
>> >> Cc: Nikula, Jani <jani.nikula@intel.com>
>> >> Subject: [Intel-gfx] [PATCH 2/7] drm/i915/display: move more scanline
>> >> functions to intel_vblank.[ch]
>> >>
>> >> Reduce clutter in intel_display.c by moving the scanline
>> >> moving/stopped wait functions to intel_vblank.[ch].
>> >>
>> >> Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
>> >> Signed-off-by: Jani Nikula <jani.nikula@intel.com>
>> >> ---
>> >> drivers/gpu/drm/i915/display/intel_display.c | 36
>> >> +------------------- drivers/gpu/drm/i915/display/intel_vblank.c |
>> >> 35 +++++++++++++++++++ drivers/gpu/drm/i915/display/intel_vblank.h |
>> >> 2 ++
>> >> 3 files changed, 38 insertions(+), 35 deletions(-)
>> >>
>> >> diff --git a/drivers/gpu/drm/i915/display/intel_display.c
>> >> b/drivers/gpu/drm/i915/display/intel_display.c
>> >> index 6cdfdae2c712..0cdb514d7ee0 100644
>> >> --- a/drivers/gpu/drm/i915/display/intel_display.c
>> >> +++ b/drivers/gpu/drm/i915/display/intel_display.c
>> >> @@ -115,6 +115,7 @@
>> >> #include "intel_quirks.h"
>> >> #include "intel_sprite.h"
>> >> #include "intel_tc.h"
>> >> +#include "intel_vblank.h"
>> >> #include "intel_vga.h"
>> >> #include "i9xx_plane.h"
>> >> #include "skl_scaler.h"
>> >> @@ -386,41 +387,6 @@ struct intel_crtc *intel_master_crtc(const
>> >> struct intel_crtc_state *crtc_state)
>> >> return to_intel_crtc(crtc_state->uapi.crtc);
>> >> }
>> >>
>> >> -static bool pipe_scanline_is_moving(struct drm_i915_private *dev_priv,
>> >> - enum pipe pipe)
>> >> -{
>> >> - i915_reg_t reg = PIPEDSL(pipe);
>> >> - u32 line1, line2;
>> >> -
>> >> - line1 = intel_de_read(dev_priv, reg) & PIPEDSL_LINE_MASK;
>> >> - msleep(5);
>> >> - line2 = intel_de_read(dev_priv, reg) & PIPEDSL_LINE_MASK;
>> >> -
>> >> - return line1 != line2;
>> >> -}
>> >> -
>> >> -static void wait_for_pipe_scanline_moving(struct intel_crtc *crtc,
>> >> bool state) -{
>> >> - struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
>> >> - enum pipe pipe = crtc->pipe;
>> >> -
>> >> - /* Wait for the display line to settle/start moving */
>> >> - if (wait_for(pipe_scanline_is_moving(dev_priv, pipe) == state, 100))
>> >> - drm_err(&dev_priv->drm,
>> >> - "pipe %c scanline %s wait timed out\n",
>> >> - pipe_name(pipe), str_on_off(state));
>> >> -}
>> >> -
>> >> -static void intel_wait_for_pipe_scanline_stopped(struct intel_crtc *crtc) -{
>> >> - wait_for_pipe_scanline_moving(crtc, false);
>> >> -}
>> >> -
>> >> -static void intel_wait_for_pipe_scanline_moving(struct intel_crtc *crtc) -{
>> >> - wait_for_pipe_scanline_moving(crtc, true);
>> >> -}
>> >> -
>> >> static void
>> >> intel_wait_for_pipe_off(const struct intel_crtc_state
>> >> *old_crtc_state) { diff -- git
>> >> a/drivers/gpu/drm/i915/display/intel_vblank.c
>> >> b/drivers/gpu/drm/i915/display/intel_vblank.c
>> >> index 78a579496ad1..f25ec643a0a3 100644
>> >> --- a/drivers/gpu/drm/i915/display/intel_vblank.c
>> >> +++ b/drivers/gpu/drm/i915/display/intel_vblank.c
>> >> @@ -417,3 +417,38 @@ int intel_get_crtc_scanline(struct intel_crtc
>> >> *crtc)
>> >>
>> >> return position;
>> >> }
>> >> +
>> >> +static bool pipe_scanline_is_moving(struct drm_i915_private *dev_priv,
>> >> + enum pipe pipe) {
>> >> + i915_reg_t reg = PIPEDSL(pipe);
>> >> + u32 line1, line2;
>> >> +
>> >> + line1 = intel_de_read(dev_priv, reg) & PIPEDSL_LINE_MASK;
>> >> + msleep(5);
>> >> + line2 = intel_de_read(dev_priv, reg) & PIPEDSL_LINE_MASK;
>> >> +
>> >> + return line1 != line2;
>> >> +}
>> >> +
>> >> +static void wait_for_pipe_scanline_moving(struct intel_crtc *crtc,
>> >> +bool
>> >> +state) {
>> >> + struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
>> >> + enum pipe pipe = crtc->pipe;
>> >> +
>> >> + /* Wait for the display line to settle/start moving */
>> >> + if (wait_for(pipe_scanline_is_moving(dev_priv, pipe) == state, 100))
>> >> + drm_err(&dev_priv->drm,
>> >> + "pipe %c scanline %s wait timed out\n",
>> >> + pipe_name(pipe), str_on_off(state)); }
>> >> +
>> >> +void intel_wait_for_pipe_scanline_stopped(struct intel_crtc *crtc) {
>> >> + wait_for_pipe_scanline_moving(crtc, false); }
>> >> +
>> > Is this wrapper function required, since nothing else is being other
>> > than calling the function wait_for_pipe_scanline_moving, can this be
>> > replaced?
>>
>> Well, first, this patch is only about code *movement*. Any changes like that
>> would have to be separate.
>>
> Ok.
> Reviewed-by: Arun R Murthy <arun.r.murthy@intel.com>
>
>> And how would you propose to drop the wrapper? The wrappers are all
>> about readability in the caller side:
>>
> I didn’t mean to drop the wrapper, understand that wrapper is more readable, what I meant is to replace wait_for_pipe_scanline_moving/stopped with its function contents.
Why should we duplicate the code?
BR,
Jani.
>
> Thanks and Regards,
> Arun R Murthy
> --------------------
>> intel_wait_for_pipe_scanline_stopped(crtc)
>>
>> vs.
>>
>> intel_wait_for_pipe_scanline_moving(crtc, false)
>>
>> BR,
>> Jani.
>>
>> >
>> > Thanks and Regards,
>> > Arun R Murthy
>> > --------------------
>> >
>> >> +void intel_wait_for_pipe_scanline_moving(struct intel_crtc *crtc) {
>> >> + wait_for_pipe_scanline_moving(crtc, true); }
>> >> diff --git a/drivers/gpu/drm/i915/display/intel_vblank.h
>> >> b/drivers/gpu/drm/i915/display/intel_vblank.h
>> >> index 9c0034d7454d..54870cabd734 100644
>> >> --- a/drivers/gpu/drm/i915/display/intel_vblank.h
>> >> +++ b/drivers/gpu/drm/i915/display/intel_vblank.h
>> >> @@ -17,5 +17,7 @@ u32 g4x_get_vblank_counter(struct drm_crtc *crtc);
>> >> bool intel_crtc_get_vblank_timestamp(struct drm_crtc *crtc, int
>> *max_error,
>> >> ktime_t *vblank_time, bool
>> >> in_vblank_irq); int intel_get_crtc_scanline(struct intel_crtc *crtc);
>> >> +void intel_wait_for_pipe_scanline_stopped(struct intel_crtc *crtc);
>> >> +void intel_wait_for_pipe_scanline_moving(struct intel_crtc *crtc);
>> >>
>> >> #endif /* __INTEL_VBLANK_H__ */
>> >> --
>> >> 2.34.1
>> >
>>
>> --
>> Jani Nikula, Intel Open Source Graphics Center
--
Jani Nikula, Intel Open Source Graphics Center
^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: [Intel-gfx] [PATCH 2/7] drm/i915/display: move more scanline functions to intel_vblank.[ch]
2022-12-15 9:12 ` Jani Nikula
@ 2022-12-15 9:59 ` Murthy, Arun R
2022-12-15 10:20 ` Jani Nikula
0 siblings, 1 reply; 28+ messages in thread
From: Murthy, Arun R @ 2022-12-15 9:59 UTC (permalink / raw)
To: Nikula, Jani, intel-gfx@lists.freedesktop.org
> -----Original Message-----
> From: Nikula, Jani <jani.nikula@intel.com>
> Sent: Thursday, December 15, 2022 2:43 PM
> To: Murthy, Arun R <arun.r.murthy@intel.com>; intel-
> gfx@lists.freedesktop.org
> Subject: RE: [Intel-gfx] [PATCH 2/7] drm/i915/display: move more scanline
> functions to intel_vblank.[ch]
>
> On Thu, 15 Dec 2022, "Murthy, Arun R" <arun.r.murthy@intel.com> wrote:
> >> -----Original Message-----
> >> From: Nikula, Jani <jani.nikula@intel.com>
> >> Sent: Wednesday, December 14, 2022 2:45 PM
> >> To: Murthy, Arun R <arun.r.murthy@intel.com>; intel-
> >> gfx@lists.freedesktop.org
> >> Subject: RE: [Intel-gfx] [PATCH 2/7] drm/i915/display: move more
> >> scanline functions to intel_vblank.[ch]
> >>
> >> On Wed, 14 Dec 2022, "Murthy, Arun R" <arun.r.murthy@intel.com>
> wrote:
> >> >> -----Original Message-----
> >> >> From: Intel-gfx <intel-gfx-bounces@lists.freedesktop.org> On
> >> >> Behalf Of Jani Nikula
> >> >> Sent: Monday, December 12, 2022 7:59 PM
> >> >> To: intel-gfx@lists.freedesktop.org
> >> >> Cc: Nikula, Jani <jani.nikula@intel.com>
> >> >> Subject: [Intel-gfx] [PATCH 2/7] drm/i915/display: move more
> >> >> scanline functions to intel_vblank.[ch]
> >> >>
> >> >> Reduce clutter in intel_display.c by moving the scanline
> >> >> moving/stopped wait functions to intel_vblank.[ch].
> >> >>
> >> >> Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
> >> >> Signed-off-by: Jani Nikula <jani.nikula@intel.com>
> >> >> ---
> >> >> drivers/gpu/drm/i915/display/intel_display.c | 36
> >> >> +------------------- drivers/gpu/drm/i915/display/intel_vblank.c
> >> >> +|
> >> >> 35 +++++++++++++++++++
> drivers/gpu/drm/i915/display/intel_vblank.h
> >> >> |
> >> >> 2 ++
> >> >> 3 files changed, 38 insertions(+), 35 deletions(-)
> >> >>
> >> >> diff --git a/drivers/gpu/drm/i915/display/intel_display.c
> >> >> b/drivers/gpu/drm/i915/display/intel_display.c
> >> >> index 6cdfdae2c712..0cdb514d7ee0 100644
> >> >> --- a/drivers/gpu/drm/i915/display/intel_display.c
> >> >> +++ b/drivers/gpu/drm/i915/display/intel_display.c
> >> >> @@ -115,6 +115,7 @@
> >> >> #include "intel_quirks.h"
> >> >> #include "intel_sprite.h"
> >> >> #include "intel_tc.h"
> >> >> +#include "intel_vblank.h"
> >> >> #include "intel_vga.h"
> >> >> #include "i9xx_plane.h"
> >> >> #include "skl_scaler.h"
> >> >> @@ -386,41 +387,6 @@ struct intel_crtc *intel_master_crtc(const
> >> >> struct intel_crtc_state *crtc_state)
> >> >> return to_intel_crtc(crtc_state->uapi.crtc);
> >> >> }
> >> >>
> >> >> -static bool pipe_scanline_is_moving(struct drm_i915_private
> *dev_priv,
> >> >> - enum pipe pipe)
> >> >> -{
> >> >> - i915_reg_t reg = PIPEDSL(pipe);
> >> >> - u32 line1, line2;
> >> >> -
> >> >> - line1 = intel_de_read(dev_priv, reg) & PIPEDSL_LINE_MASK;
> >> >> - msleep(5);
> >> >> - line2 = intel_de_read(dev_priv, reg) & PIPEDSL_LINE_MASK;
> >> >> -
> >> >> - return line1 != line2;
> >> >> -}
> >> >> -
> >> >> -static void wait_for_pipe_scanline_moving(struct intel_crtc
> >> >> *crtc, bool state) -{
> >> >> - struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
> >> >> - enum pipe pipe = crtc->pipe;
> >> >> -
> >> >> - /* Wait for the display line to settle/start moving */
> >> >> - if (wait_for(pipe_scanline_is_moving(dev_priv, pipe) == state, 100))
> >> >> - drm_err(&dev_priv->drm,
> >> >> - "pipe %c scanline %s wait timed out\n",
> >> >> - pipe_name(pipe), str_on_off(state));
> >> >> -}
> >> >> -
> >> >> -static void intel_wait_for_pipe_scanline_stopped(struct intel_crtc
> *crtc) -{
> >> >> - wait_for_pipe_scanline_moving(crtc, false);
> >> >> -}
> >> >> -
> >> >> -static void intel_wait_for_pipe_scanline_moving(struct intel_crtc *crtc)
> -{
> >> >> - wait_for_pipe_scanline_moving(crtc, true);
> >> >> -}
> >> >> -
> >> >> static void
> >> >> intel_wait_for_pipe_off(const struct intel_crtc_state
> >> >> *old_crtc_state) { diff -- git
> >> >> a/drivers/gpu/drm/i915/display/intel_vblank.c
> >> >> b/drivers/gpu/drm/i915/display/intel_vblank.c
> >> >> index 78a579496ad1..f25ec643a0a3 100644
> >> >> --- a/drivers/gpu/drm/i915/display/intel_vblank.c
> >> >> +++ b/drivers/gpu/drm/i915/display/intel_vblank.c
> >> >> @@ -417,3 +417,38 @@ int intel_get_crtc_scanline(struct intel_crtc
> >> >> *crtc)
> >> >>
> >> >> return position;
> >> >> }
> >> >> +
> >> >> +static bool pipe_scanline_is_moving(struct drm_i915_private
> *dev_priv,
> >> >> + enum pipe pipe) {
> >> >> + i915_reg_t reg = PIPEDSL(pipe);
> >> >> + u32 line1, line2;
> >> >> +
> >> >> + line1 = intel_de_read(dev_priv, reg) & PIPEDSL_LINE_MASK;
> >> >> + msleep(5);
> >> >> + line2 = intel_de_read(dev_priv, reg) & PIPEDSL_LINE_MASK;
> >> >> +
> >> >> + return line1 != line2;
> >> >> +}
> >> >> +
> >> >> +static void wait_for_pipe_scanline_moving(struct intel_crtc
> >> >> +*crtc, bool
> >> >> +state) {
> >> >> + struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
> >> >> + enum pipe pipe = crtc->pipe;
> >> >> +
> >> >> + /* Wait for the display line to settle/start moving */
> >> >> + if (wait_for(pipe_scanline_is_moving(dev_priv, pipe) == state, 100))
> >> >> + drm_err(&dev_priv->drm,
> >> >> + "pipe %c scanline %s wait timed out\n",
> >> >> + pipe_name(pipe), str_on_off(state)); }
> >> >> +
> >> >> +void intel_wait_for_pipe_scanline_stopped(struct intel_crtc *crtc) {
> >> >> + wait_for_pipe_scanline_moving(crtc, false); }
> >> >> +
> >> > Is this wrapper function required, since nothing else is being
> >> > other than calling the function wait_for_pipe_scanline_moving, can
> >> > this be replaced?
> >>
> >> Well, first, this patch is only about code *movement*. Any changes
> >> like that would have to be separate.
> >>
> > Ok.
> > Reviewed-by: Arun R Murthy <arun.r.murthy@intel.com>
> >
> >> And how would you propose to drop the wrapper? The wrappers are all
> >> about readability in the caller side:
> >>
> > I didn’t mean to drop the wrapper, understand that wrapper is more
> readable, what I meant is to replace
> wait_for_pipe_scanline_moving/stopped with its function contents.
>
> Why should we duplicate the code?
static void intel_wait_for_pipe_scanline_moving(struct intel_crtc *crtc) {
struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
enum pipe pipe = crtc->pipe
/* Wait for the display line to settle/start moving */
if (wait_for(pipe_scanline_is_moving(dev_priv, pipe) == state, 100))
drm_err(&dev_priv->drm,
"pipe %c scanline %s wait timed out\n",
pipe_name(pipe), str_on_off(state));
}
>
> BR,
> Jani.
>
> >
> > Thanks and Regards,
> > Arun R Murthy
> > --------------------
> >> intel_wait_for_pipe_scanline_stopped(crtc)
> >>
> >> vs.
> >>
> >> intel_wait_for_pipe_scanline_moving(crtc, false)
> >>
> >> BR,
> >> Jani.
> >>
> >> >
> >> > Thanks and Regards,
> >> > Arun R Murthy
> >> > --------------------
> >> >
> >> >> +void intel_wait_for_pipe_scanline_moving(struct intel_crtc *crtc) {
> >> >> + wait_for_pipe_scanline_moving(crtc, true); }
> >> >> diff --git a/drivers/gpu/drm/i915/display/intel_vblank.h
> >> >> b/drivers/gpu/drm/i915/display/intel_vblank.h
> >> >> index 9c0034d7454d..54870cabd734 100644
> >> >> --- a/drivers/gpu/drm/i915/display/intel_vblank.h
> >> >> +++ b/drivers/gpu/drm/i915/display/intel_vblank.h
> >> >> @@ -17,5 +17,7 @@ u32 g4x_get_vblank_counter(struct drm_crtc
> >> >> *crtc); bool intel_crtc_get_vblank_timestamp(struct drm_crtc
> >> >> *crtc, int
> >> *max_error,
> >> >> ktime_t *vblank_time, bool
> >> >> in_vblank_irq); int intel_get_crtc_scanline(struct intel_crtc
> >> >> *crtc);
> >> >> +void intel_wait_for_pipe_scanline_stopped(struct intel_crtc
> >> >> +*crtc); void intel_wait_for_pipe_scanline_moving(struct
> >> >> +intel_crtc *crtc);
> >> >>
> >> >> #endif /* __INTEL_VBLANK_H__ */
> >> >> --
> >> >> 2.34.1
> >> >
> >>
> >> --
> >> Jani Nikula, Intel Open Source Graphics Center
>
> --
> Jani Nikula, Intel Open Source Graphics Center
^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: [Intel-gfx] [PATCH 2/7] drm/i915/display: move more scanline functions to intel_vblank.[ch]
2022-12-15 9:59 ` Murthy, Arun R
@ 2022-12-15 10:20 ` Jani Nikula
2022-12-15 10:39 ` Murthy, Arun R
0 siblings, 1 reply; 28+ messages in thread
From: Jani Nikula @ 2022-12-15 10:20 UTC (permalink / raw)
To: Murthy, Arun R, intel-gfx@lists.freedesktop.org
On Thu, 15 Dec 2022, "Murthy, Arun R" <arun.r.murthy@intel.com> wrote:
>> >> And how would you propose to drop the wrapper? The wrappers are all
>> >> about readability in the caller side:
>> >>
>> > I didn’t mean to drop the wrapper, understand that wrapper is more
>> readable, what I meant is to replace
>> wait_for_pipe_scanline_moving/stopped with its function contents.
>>
>> Why should we duplicate the code?
>
> static void intel_wait_for_pipe_scanline_moving(struct intel_crtc *crtc) {
> struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
> enum pipe pipe = crtc->pipe
>
> /* Wait for the display line to settle/start moving */
> if (wait_for(pipe_scanline_is_moving(dev_priv, pipe) == state, 100))
>
> drm_err(&dev_priv->drm,
> "pipe %c scanline %s wait timed out\n",
> pipe_name(pipe), str_on_off(state));
> }
And the state variable comes from where?
BR,
Jani.
--
Jani Nikula, Intel Open Source Graphics Center
^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: [Intel-gfx] [PATCH 2/7] drm/i915/display: move more scanline functions to intel_vblank.[ch]
2022-12-15 10:20 ` Jani Nikula
@ 2022-12-15 10:39 ` Murthy, Arun R
2022-12-15 11:03 ` Jani Nikula
0 siblings, 1 reply; 28+ messages in thread
From: Murthy, Arun R @ 2022-12-15 10:39 UTC (permalink / raw)
To: Nikula, Jani, intel-gfx@lists.freedesktop.org
> -----Original Message-----
> From: Nikula, Jani <jani.nikula@intel.com>
> Sent: Thursday, December 15, 2022 3:50 PM
> To: Murthy, Arun R <arun.r.murthy@intel.com>; intel-
> gfx@lists.freedesktop.org
> Subject: RE: [Intel-gfx] [PATCH 2/7] drm/i915/display: move more scanline
> functions to intel_vblank.[ch]
>
> On Thu, 15 Dec 2022, "Murthy, Arun R" <arun.r.murthy@intel.com> wrote:
> >> >> And how would you propose to drop the wrapper? The wrappers are
> >> >> all about readability in the caller side:
> >> >>
> >> > I didn’t mean to drop the wrapper, understand that wrapper is more
> >> readable, what I meant is to replace
> >> wait_for_pipe_scanline_moving/stopped with its function contents.
> >>
> >> Why should we duplicate the code?
> >
> > static void intel_wait_for_pipe_scanline_moving(struct intel_crtc *crtc) {
Bool state can be added as a parameter to this function, on the other hand, can have state = false as a magic value as well.
Thanks and Regards,
Arun R Murthy
-------------------
> > struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
> > enum pipe pipe = crtc->pipe
> >
> > /* Wait for the display line to settle/start moving */
> > if (wait_for(pipe_scanline_is_moving(dev_priv, pipe) == state,
> > 100))
> >
> > drm_err(&dev_priv->drm,
> > "pipe %c scanline %s wait timed out\n",
> > pipe_name(pipe), str_on_off(state)); }
>
> And the state variable comes from where?
>
> BR,
> Jani.
>
>
> --
> Jani Nikula, Intel Open Source Graphics Center
^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: [Intel-gfx] [PATCH 2/7] drm/i915/display: move more scanline functions to intel_vblank.[ch]
2022-12-15 10:39 ` Murthy, Arun R
@ 2022-12-15 11:03 ` Jani Nikula
0 siblings, 0 replies; 28+ messages in thread
From: Jani Nikula @ 2022-12-15 11:03 UTC (permalink / raw)
To: Murthy, Arun R, intel-gfx@lists.freedesktop.org
On Thu, 15 Dec 2022, "Murthy, Arun R" <arun.r.murthy@intel.com> wrote:
>> -----Original Message-----
>> From: Nikula, Jani <jani.nikula@intel.com>
>> Sent: Thursday, December 15, 2022 3:50 PM
>> To: Murthy, Arun R <arun.r.murthy@intel.com>; intel-
>> gfx@lists.freedesktop.org
>> Subject: RE: [Intel-gfx] [PATCH 2/7] drm/i915/display: move more scanline
>> functions to intel_vblank.[ch]
>>
>> On Thu, 15 Dec 2022, "Murthy, Arun R" <arun.r.murthy@intel.com> wrote:
>> >> >> And how would you propose to drop the wrapper? The wrappers are
>> >> >> all about readability in the caller side:
>> >> >>
>> >> > I didn’t mean to drop the wrapper, understand that wrapper is more
>> >> readable, what I meant is to replace
>> >> wait_for_pipe_scanline_moving/stopped with its function contents.
>> >>
>> >> Why should we duplicate the code?
>> >
>> > static void intel_wait_for_pipe_scanline_moving(struct intel_crtc *crtc) {
> Bool state can be added as a parameter to this function, on the other hand, can have state = false as a magic value as well.
Then it boils down to what we already have?
Too much talk now, please send actual working code instead.
BR,
Jani.
>
> Thanks and Regards,
> Arun R Murthy
> -------------------
>> > struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
>> > enum pipe pipe = crtc->pipe
>> >
>> > /* Wait for the display line to settle/start moving */
>> > if (wait_for(pipe_scanline_is_moving(dev_priv, pipe) == state,
>> > 100))
>> >
>> > drm_err(&dev_priv->drm,
>> > "pipe %c scanline %s wait timed out\n",
>> > pipe_name(pipe), str_on_off(state)); }
>>
>> And the state variable comes from where?
>>
>> BR,
>> Jani.
>>
>>
>> --
>> Jani Nikula, Intel Open Source Graphics Center
--
Jani Nikula, Intel Open Source Graphics Center
^ permalink raw reply [flat|nested] 28+ messages in thread
end of thread, other threads:[~2022-12-15 11:03 UTC | newest]
Thread overview: 28+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2022-12-12 14:29 [Intel-gfx] [PATCH 0/7] drm/i915: extract vblank/scanline code to a separate file Jani Nikula
2022-12-12 14:29 ` [Intel-gfx] [PATCH 1/7] drm/i915/irq: split out vblank/scanline code to intel_vblank.[ch] Jani Nikula
2022-12-12 14:29 ` [Intel-gfx] [PATCH 2/7] drm/i915/display: move more scanline functions " Jani Nikula
2022-12-14 4:15 ` Murthy, Arun R
2022-12-14 9:15 ` Jani Nikula
2022-12-15 2:11 ` Murthy, Arun R
2022-12-15 9:12 ` Jani Nikula
2022-12-15 9:59 ` Murthy, Arun R
2022-12-15 10:20 ` Jani Nikula
2022-12-15 10:39 ` Murthy, Arun R
2022-12-15 11:03 ` Jani Nikula
2022-12-12 14:29 ` [Intel-gfx] [PATCH 3/7] drm/i915/display: use common function for checking scanline is moving Jani Nikula
2022-12-14 4:01 ` Murthy, Arun R
2022-12-12 14:29 ` [Intel-gfx] [PATCH 4/7] drm/i915/hdmi: abstract scanline range wait into intel_vblank.[ch] Jani Nikula
2022-12-14 4:17 ` Murthy, Arun R
2022-12-14 14:16 ` Ville Syrjälä
2022-12-12 14:29 ` [Intel-gfx] [PATCH 5/7] drm/i915/vblank: use intel_de_read() Jani Nikula
2022-12-14 4:05 ` Murthy, Arun R
2022-12-12 14:29 ` [Intel-gfx] [PATCH 6/7] drm/i915/vblank: add and use intel_de_read64_2x32() to read vblank counter Jani Nikula
2022-12-12 14:29 ` [Intel-gfx] [PATCH 7/7] drm/i915/reg: split out vblank/scanline regs Jani Nikula
2022-12-14 4:24 ` Murthy, Arun R
2022-12-14 13:42 ` Ville Syrjälä
2022-12-12 14:46 ` [Intel-gfx] ✗ Fi.CI.CHECKPATCH: warning for drm/i915: extract vblank/scanline code to a separate file Patchwork
2022-12-12 14:46 ` [Intel-gfx] ✗ Fi.CI.SPARSE: " Patchwork
2022-12-12 15:05 ` [Intel-gfx] ✗ Fi.CI.BAT: failure " Patchwork
2022-12-14 4:12 ` [Intel-gfx] [PATCH 0/7] " Murthy, Arun R
2022-12-14 9:18 ` Jani Nikula
2022-12-15 2:05 ` Murthy, Arun R
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox