Re: [PATCH] drm/i915: move interrupt save/restore into vblank section helpers

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Luca,

kernel test robot noticed the following build errors:

[auto build test ERROR on drm-intel/for-linux-next]
[also build test ERROR on drm-tip/drm-tip linus/master next-20240117]
[cannot apply to drm-intel/for-linux-next-fixes v6.7]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url:    https://github.com/intel-lab-lkp/linux/commits/Luca-Coelho/drm-i915-move-interrupt-save-restore-into-vblank-section-helpers/20240117-174910
base:   git://anongit.freedesktop.org/drm-intel for-linux-next
patch link:    https://lore.kernel.org/r/20240117094613.1401573-1-luciano.coelho%40intel.com
patch subject: [PATCH] drm/i915: move interrupt save/restore into vblank section helpers
config: i386-buildonly-randconfig-004-20240117 (https://download.01.org/0day-ci/archive/20240118/202401180149.BsppQD72-lkp@xxxxxxxxx/config)
compiler: gcc-7 (Ubuntu 7.5.0-6ubuntu2) 7.5.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20240118/202401180149.BsppQD72-lkp@xxxxxxxxx/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@xxxxxxxxx>
| Closes: https://lore.kernel.org/oe-kbuild-all/202401180149.BsppQD72-lkp@xxxxxxxxx/

All error/warnings (new ones prefixed by >>):

   In file included from include/linux/bitops.h:7:0,
                    from include/linux/kernel.h:23,
                    from arch/x86/include/asm/percpu.h:27,
                    from arch/x86/include/asm/current.h:10,
                    from include/linux/mutex.h:14,
                    from include/linux/notifier.h:14,
                    from include/linux/pm_qos.h:16,
                    from drivers/gpu/drm/i915/i915_drv.h:35,
                    from drivers/gpu/drm/i915/display/intel_vblank.c:6:
   drivers/gpu/drm/i915/display/intel_vblank.c: In function 'intel_vblank_section_enter':
>> drivers/gpu/drm/i915/display/intel_vblank.c:282:17: error: 'irqflags' undeclared (first use in this function); did you mean 'mf_flags'?
     local_irq_save(irqflags);
                    ^
   include/linux/typecheck.h:11:9: note: in definition of macro 'typecheck'
     typeof(x) __dummy2; \
            ^
   include/linux/irqflags.h:245:36: note: in expansion of macro 'raw_local_irq_save'
    #define local_irq_save(flags) do { raw_local_irq_save(flags); } while (0)
                                       ^~~~~~~~~~~~~~~~~~
   drivers/gpu/drm/i915/display/intel_vblank.c:282:2: note: in expansion of macro 'local_irq_save'
     local_irq_save(irqflags);
     ^~~~~~~~~~~~~~
   drivers/gpu/drm/i915/display/intel_vblank.c:282:17: note: each undeclared identifier is reported only once for each function it appears in
     local_irq_save(irqflags);
                    ^
   include/linux/typecheck.h:11:9: note: in definition of macro 'typecheck'
     typeof(x) __dummy2; \
            ^
   include/linux/irqflags.h:245:36: note: in expansion of macro 'raw_local_irq_save'
    #define local_irq_save(flags) do { raw_local_irq_save(flags); } while (0)
                                       ^~~~~~~~~~~~~~~~~~
   drivers/gpu/drm/i915/display/intel_vblank.c:282:2: note: in expansion of macro 'local_irq_save'
     local_irq_save(irqflags);
     ^~~~~~~~~~~~~~
   include/linux/typecheck.h:12:18: warning: comparison of distinct pointer types lacks a cast
     (void)(&__dummy == &__dummy2); \
                     ^
   include/linux/irqflags.h:178:3: note: in expansion of macro 'typecheck'
      typecheck(unsigned long, flags); \
      ^~~~~~~~~
   include/linux/irqflags.h:245:36: note: in expansion of macro 'raw_local_irq_save'
    #define local_irq_save(flags) do { raw_local_irq_save(flags); } while (0)
                                       ^~~~~~~~~~~~~~~~~~
   drivers/gpu/drm/i915/display/intel_vblank.c:282:2: note: in expansion of macro 'local_irq_save'
     local_irq_save(irqflags);
     ^~~~~~~~~~~~~~
   drivers/gpu/drm/i915/display/intel_vblank.c: In function 'intel_vblank_section_exit':
   drivers/gpu/drm/i915/display/intel_vblank.c:294:20: error: 'irqflags' undeclared (first use in this function); did you mean 'mf_flags'?
     local_irq_restore(irqflags);
                       ^
   include/linux/typecheck.h:11:9: note: in definition of macro 'typecheck'
     typeof(x) __dummy2; \
            ^
   include/linux/irqflags.h:246:39: note: in expansion of macro 'raw_local_irq_restore'
    #define local_irq_restore(flags) do { raw_local_irq_restore(flags); } while (0)
                                          ^~~~~~~~~~~~~~~~~~~~~
   drivers/gpu/drm/i915/display/intel_vblank.c:294:2: note: in expansion of macro 'local_irq_restore'
     local_irq_restore(irqflags);
     ^~~~~~~~~~~~~~~~~
   include/linux/typecheck.h:12:18: warning: comparison of distinct pointer types lacks a cast
     (void)(&__dummy == &__dummy2); \
                     ^
   include/linux/irqflags.h:183:3: note: in expansion of macro 'typecheck'
      typecheck(unsigned long, flags); \
      ^~~~~~~~~
   include/linux/irqflags.h:246:39: note: in expansion of macro 'raw_local_irq_restore'
    #define local_irq_restore(flags) do { raw_local_irq_restore(flags); } while (0)
                                          ^~~~~~~~~~~~~~~~~~~~~
   drivers/gpu/drm/i915/display/intel_vblank.c:294:2: note: in expansion of macro 'local_irq_restore'
     local_irq_restore(irqflags);
     ^~~~~~~~~~~~~~~~~
   drivers/gpu/drm/i915/display/intel_vblank.c: In function 'i915_get_crtc_scanoutpos':
>> drivers/gpu/drm/i915/display/intel_vblank.c:309:16: warning: unused variable 'irqflags' [-Wunused-variable]
     unsigned long irqflags;
                   ^~~~~~~~
   drivers/gpu/drm/i915/display/intel_vblank.c: In function 'intel_get_crtc_scanline':
   drivers/gpu/drm/i915/display/intel_vblank.c:441:16: warning: unused variable 'irqflags' [-Wunused-variable]
     unsigned long irqflags;
                   ^~~~~~~~


vim +282 drivers/gpu/drm/i915/display/intel_vblank.c

   267	
   268	/*
   269	 * These functions help enter and exit vblank critical sections.  When
   270	 * entering, they disable interrupts and, for i915, acquire the
   271	 * uncore's spinlock.  Conversely, when exiting, they release the
   272	 * spinlock and restore the interrupts state.
   273	 *
   274	 * This lock in i915 is needed because some old platforms (at least
   275	 * IVB and possibly HSW as well), which are not supported in Xe, need
   276	 * all register accesses to the same cacheline to be serialized,
   277	 * otherwise they may hang.
   278	 */
   279	static void intel_vblank_section_enter(struct drm_i915_private *i915)
   280		__acquires(i915->uncore.lock)
   281	{
 > 282		local_irq_save(irqflags);
   283	#ifdef I915
   284		spin_lock(&i915->uncore.lock);
   285	#endif
   286	}
   287	
   288	static void intel_vblank_section_exit(struct drm_i915_private *i915)
   289		__releases(i915->uncore.lock)
   290	{
   291	#ifdef I915
   292		spin_unlock(&i915->uncore.lock);
   293	#endif
   294		local_irq_restore(irqflags);
   295	}
   296	
   297	static bool i915_get_crtc_scanoutpos(struct drm_crtc *_crtc,
   298					     bool in_vblank_irq,
   299					     int *vpos, int *hpos,
   300					     ktime_t *stime, ktime_t *etime,
   301					     const struct drm_display_mode *mode)
   302	{
   303		struct drm_device *dev = _crtc->dev;
   304		struct drm_i915_private *dev_priv = to_i915(dev);
   305		struct intel_crtc *crtc = to_intel_crtc(_crtc);
   306		enum pipe pipe = crtc->pipe;
   307		int position;
   308		int vbl_start, vbl_end, hsync_start, htotal, vtotal;
 > 309		unsigned long irqflags;
   310		bool use_scanline_counter = DISPLAY_VER(dev_priv) >= 5 ||
   311			IS_G4X(dev_priv) || DISPLAY_VER(dev_priv) == 2 ||
   312			crtc->mode_flags & I915_MODE_FLAG_USE_SCANLINE_COUNTER;
   313	
   314		if (drm_WARN_ON(&dev_priv->drm, !mode->crtc_clock)) {
   315			drm_dbg(&dev_priv->drm,
   316				"trying to get scanoutpos for disabled pipe %c\n",
   317				pipe_name(pipe));
   318			return false;
   319		}
   320	
   321		htotal = mode->crtc_htotal;
   322		hsync_start = mode->crtc_hsync_start;
   323		vtotal = mode->crtc_vtotal;
   324		vbl_start = mode->crtc_vblank_start;
   325		vbl_end = mode->crtc_vblank_end;
   326	
   327		if (mode->flags & DRM_MODE_FLAG_INTERLACE) {
   328			vbl_start = DIV_ROUND_UP(vbl_start, 2);
   329			vbl_end /= 2;
   330			vtotal /= 2;
   331		}
   332	
   333		/*
   334		 * Enter vblank critical section, as we will do multiple
   335		 * timing critical raw register reads, potentially with
   336		 * preemption disabled, so the following code must not block.
   337		 */
   338		intel_vblank_section_enter(dev_priv);
   339	
   340		/* preempt_disable_rt() should go right here in PREEMPT_RT patchset. */
   341	
   342		/* Get optional system timestamp before query. */
   343		if (stime)
   344			*stime = ktime_get();
   345	
   346		if (crtc->mode_flags & I915_MODE_FLAG_VRR) {
   347			int scanlines = intel_crtc_scanlines_since_frame_timestamp(crtc);
   348	
   349			position = __intel_get_crtc_scanline(crtc);
   350	
   351			/*
   352			 * Already exiting vblank? If so, shift our position
   353			 * so it looks like we're already apporaching the full
   354			 * vblank end. This should make the generated timestamp
   355			 * more or less match when the active portion will start.
   356			 */
   357			if (position >= vbl_start && scanlines < position)
   358				position = min(crtc->vmax_vblank_start + scanlines, vtotal - 1);
   359		} else if (use_scanline_counter) {
   360			/* No obvious pixelcount register. Only query vertical
   361			 * scanout position from Display scan line register.
   362			 */
   363			position = __intel_get_crtc_scanline(crtc);
   364		} else {
   365			/*
   366			 * Have access to pixelcount since start of frame.
   367			 * We can split this into vertical and horizontal
   368			 * scanout position.
   369			 */
   370			position = (intel_de_read_fw(dev_priv, PIPEFRAMEPIXEL(pipe)) & PIPE_PIXEL_MASK) >> PIPE_PIXEL_SHIFT;
   371	
   372			/* convert to pixel counts */
   373			vbl_start *= htotal;
   374			vbl_end *= htotal;
   375			vtotal *= htotal;
   376	
   377			/*
   378			 * In interlaced modes, the pixel counter counts all pixels,
   379			 * so one field will have htotal more pixels. In order to avoid
   380			 * the reported position from jumping backwards when the pixel
   381			 * counter is beyond the length of the shorter field, just
   382			 * clamp the position the length of the shorter field. This
   383			 * matches how the scanline counter based position works since
   384			 * the scanline counter doesn't count the two half lines.
   385			 */
   386			position = min(position, vtotal - 1);
   387	
   388			/*
   389			 * Start of vblank interrupt is triggered at start of hsync,
   390			 * just prior to the first active line of vblank. However we
   391			 * consider lines to start at the leading edge of horizontal
   392			 * active. So, should we get here before we've crossed into
   393			 * the horizontal active of the first line in vblank, we would
   394			 * not set the DRM_SCANOUTPOS_INVBL flag. In order to fix that,
   395			 * always add htotal-hsync_start to the current pixel position.
   396			 */
   397			position = (position + htotal - hsync_start) % vtotal;
   398		}
   399	
   400		/* Get optional system timestamp after query. */
   401		if (etime)
   402			*etime = ktime_get();
   403	
   404		/* preempt_enable_rt() should go right here in PREEMPT_RT patchset. */
   405	
   406		intel_vblank_section_exit(dev_priv);
   407	
   408		/*
   409		 * While in vblank, position will be negative
   410		 * counting up towards 0 at vbl_end. And outside
   411		 * vblank, position will be positive counting
   412		 * up since vbl_end.
   413		 */
   414		if (position >= vbl_start)
   415			position -= vbl_end;
   416		else
   417			position += vtotal - vbl_end;
   418	
   419		if (use_scanline_counter) {
   420			*vpos = position;
   421			*hpos = 0;
   422		} else {
   423			*vpos = position / htotal;
   424			*hpos = position - (*vpos * htotal);
   425		}
   426	
   427		return true;
   428	}
   429	

-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki



[Index of Archives]     [AMD Graphics]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux