Re: [Intel-gfx] [PATCH 5/6] drm/rcar_du: changes to rcar-du driver resulting from drm_writeback_connector structure changes

2022-02-21 Thread Laurent Pinchart
Hi Dmitry,

On Tue, Feb 22, 2022 at 06:32:50AM +0300, Dmitry Baryshkov wrote:
> On Thu, 10 Feb 2022 at 07:59, Laurent Pinchart wrote:
> > On Wed, Feb 09, 2022 at 05:40:29PM -0800, Abhinav Kumar wrote:
> > > Hi Laurent
> > >
> > > Gentle reminder on this.
> >
> > I won't have time before next week I'm afraid.
> 
> Laurent, another gentle ping.

I'm really late on this so I probably deserve a bit of a rougher ping,
but thanks for being gentle :-)

> > > On 2/6/2022 11:20 PM, Abhinav Kumar wrote:
> > > > On 2/6/2022 3:32 PM, Dmitry Baryshkov wrote:
> > > >> On Wed, 2 Feb 2022 at 16:26, Laurent Pinchart wrote:
> > > >>> On Wed, Feb 02, 2022 at 03:15:03PM +0200, Jani Nikula wrote:
> > >  On Wed, 02 Feb 2022, Laurent Pinchart wrote:
> > > > On Wed, Feb 02, 2022 at 02:24:28PM +0530, Kandpal Suraj wrote:
> > > >> Changing rcar_du driver to accomadate the change of
> > > >> drm_writeback_connector.base and drm_writeback_connector.encoder
> > > >> to a pointer the reason for which is explained in the
> > > >> Patch(drm: add writeback pointers to drm_connector).
> > > >>
> > > >> Signed-off-by: Kandpal Suraj 
> > > >> ---
> > > >>   drivers/gpu/drm/rcar-du/rcar_du_crtc.h  | 2 ++
> > > >>   drivers/gpu/drm/rcar-du/rcar_du_writeback.c | 8 +---
> > > >>   2 files changed, 7 insertions(+), 3 deletions(-)
> > > >>
> > > >> diff --git a/drivers/gpu/drm/rcar-du/rcar_du_crtc.h
> > > >> b/drivers/gpu/drm/rcar-du/rcar_du_crtc.h
> > > >> index 66e8839db708..68f387a04502 100644
> > > >> --- a/drivers/gpu/drm/rcar-du/rcar_du_crtc.h
> > > >> +++ b/drivers/gpu/drm/rcar-du/rcar_du_crtc.h
> > > >> @@ -72,6 +72,8 @@ struct rcar_du_crtc {
> > > >> const char *const *sources;
> > > >> unsigned int sources_count;
> > > >>
> > > >> +  struct drm_connector connector;
> > > >> +  struct drm_encoder encoder;
> > > >
> > > > Those fields are, at best, poorly named. Furthermore, there's no 
> > > > need in
> > > > this driver or in other drivers using drm_writeback_connector to 
> > > > create
> > > > an encoder or connector manually. Let's not polute all drivers 
> > > > because
> > > > i915 doesn't have its abstractions right.
> > > 
> > >  i915 uses the quite common model for struct inheritance:
> > > 
> > > struct intel_connector {
> > > struct drm_connector base;
> > > /* ... */
> > > }
> > > 
> > >  Same with at least amd, ast, fsl-dcu, hisilicon, mga200, msm, 
> > >  nouveau,
> > >  radeon, tilcdc, and vboxvideo.
> > > 
> > >  We could argue about the relative merits of that abstraction, but I
> > >  think the bottom line is that it's popular and the drivers using it 
> > >  are
> > >  not going to be persuaded to move away from it.
> > > >>>
> > > >>> Nobody said inheritance is bad.
> > > >>>
> > >  It's no coincidence that the drivers who've implemented writeback so 
> > >  far
> > >  (komeda, mali, rcar-du, vc4, and vkms) do not use the abstraction,
> > >  because the drm_writeback_connector midlayer does, forcing the issue.
> > > >>>
> > > >>> Are you sure it's not a coincidence ? :-)
> > > >>>
> > > >>> The encoder and especially connector created by 
> > > >>> drm_writeback_connector
> > > >>> are there only because KMS requires a drm_encoder and a drm_connector 
> > > >>> to
> > > >>> be exposed to userspace (and I could argue that using a connector for
> > > >>> writeback is a hack, but that won't change). The connector is 
> > > >>> "virtual",
> > > >>> I still fail to see why i915 or any other driver would need to wrap it
> > > >>> into something else. The whole point of the drm_writeback_connector
> > > >>> abstraction is that drivers do not have to manage the writeback
> > > >>> drm_connector manually, they shouldn't touch it at all.
> > > >>
> > > >> Laurent, I wanted to shift a bit from the question of drm_connector to
> > > >> the question of drm_encoder being embedded in the 
> > > >> drm_writeback_connector.
> > > >> In case of the msm driver the drm_encoder is not a lightweight entity,
> > > >> but a full-featured driver part. Significant part of it can be shared
> > > >> with the writeback implementation, if we allow using a pointer to the
> > > >> external drm_encoder with the drm_writeback_connector.
> > > >> Does the following patch set stand a chance to receive your ack?
> > > >>   - Switch drm_writeback_connector to point to drm_encoder rather than
> > > >> embedding it?
> > > >>   - Create drm_encoder for the drm_writeback_connector when one is not
> > > >> specified, so the current drivers can be left unchanged.

The situation is a bit different for the encoder indeed.

The encoder concept is loosely defined nowadays, with more and more of
the "real" encoders being implemented as a drm_bridge. That's what I
usually recommend when reviewing new 

Re: [Intel-gfx] [PATCH v3 08/11] drm/i915: Separate wakeref tracking

2022-02-21 Thread Ville Syrjälä
On Tue, Feb 22, 2022 at 12:25:39AM +0100, Andrzej Hajda wrote:
> -static noinline depot_stack_handle_t
> +static intel_wakeref_t
>  track_intel_runtime_pm_wakeref(struct intel_runtime_pm *rpm)
>  {
> - depot_stack_handle_t stack, *stacks;
> - unsigned long flags;
> -
> - if (rpm->no_wakeref_tracking)
> - return -1;
> -
> - stack = __save_depot_stack();
> - if (!stack)
> + if (!rpm->available)
>   return -1;

Still not the same.

-- 
Ville Syrjälä
Intel


[Intel-gfx] ✓ Fi.CI.IGT: success for drm/i915: fix one mem leak in mmap_offset_attach()

2022-02-21 Thread Patchwork
== Series Details ==

Series: drm/i915: fix one mem leak in mmap_offset_attach()
URL   : https://patchwork.freedesktop.org/series/100532/
State : success

== Summary ==

CI Bug Log - changes from CI_DRM_11264_full -> Patchwork_22347_full


Summary
---

  **SUCCESS**

  No regressions found.

  

Participating hosts (13 -> 13)
--

  No changes in participating hosts

Known issues


  Here are the changes found in Patchwork_22347_full that come from known 
issues:

### IGT changes ###

 Issues hit 

  * igt@gem_eio@in-flight-10ms:
- shard-tglb: [PASS][1] -> [TIMEOUT][2] ([i915#3063])
   [1]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11264/shard-tglb5/igt@gem_...@in-flight-10ms.html
   [2]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22347/shard-tglb2/igt@gem_...@in-flight-10ms.html

  * igt@gem_exec_capture@pi@bcs0:
- shard-skl:  NOTRUN -> [INCOMPLETE][3] ([i915#4547])
   [3]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22347/shard-skl8/igt@gem_exec_capture@p...@bcs0.html

  * igt@gem_exec_fair@basic-none@vecs0:
- shard-kbl:  [PASS][4] -> [FAIL][5] ([i915#2842])
   [4]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11264/shard-kbl4/igt@gem_exec_fair@basic-n...@vecs0.html
   [5]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22347/shard-kbl7/igt@gem_exec_fair@basic-n...@vecs0.html
- shard-apl:  [PASS][6] -> [FAIL][7] ([i915#2842])
   [6]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11264/shard-apl8/igt@gem_exec_fair@basic-n...@vecs0.html
   [7]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22347/shard-apl7/igt@gem_exec_fair@basic-n...@vecs0.html

  * igt@gem_exec_fair@basic-pace@rcs0:
- shard-iclb: [PASS][8] -> [FAIL][9] ([i915#2842]) +1 similar issue
   [8]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11264/shard-iclb7/igt@gem_exec_fair@basic-p...@rcs0.html
   [9]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22347/shard-iclb2/igt@gem_exec_fair@basic-p...@rcs0.html

  * igt@gem_exec_fair@basic-pace@vcs1:
- shard-iclb: NOTRUN -> [FAIL][10] ([i915#2842])
   [10]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22347/shard-iclb2/igt@gem_exec_fair@basic-p...@vcs1.html

  * igt@gem_lmem_swapping@heavy-multi:
- shard-skl:  NOTRUN -> [SKIP][11] ([fdo#109271] / [i915#4613]) +1 
similar issue
   [11]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22347/shard-skl3/igt@gem_lmem_swapp...@heavy-multi.html

  * igt@gem_lmem_swapping@heavy-verify-random:
- shard-kbl:  NOTRUN -> [SKIP][12] ([fdo#109271] / [i915#4613]) +1 
similar issue
   [12]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22347/shard-kbl1/igt@gem_lmem_swapp...@heavy-verify-random.html

  * igt@gem_lmem_swapping@smem-oom:
- shard-apl:  NOTRUN -> [SKIP][13] ([fdo#109271] / [i915#4613])
   [13]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22347/shard-apl7/igt@gem_lmem_swapp...@smem-oom.html

  * igt@gem_pwrite@basic-exhaustion:
- shard-skl:  NOTRUN -> [WARN][14] ([i915#2658])
   [14]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22347/shard-skl9/igt@gem_pwr...@basic-exhaustion.html

  * igt@gem_pxp@reject-modify-context-protection-off-1:
- shard-iclb: NOTRUN -> [SKIP][15] ([i915#4270])
   [15]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22347/shard-iclb8/igt@gem_...@reject-modify-context-protection-off-1.html

  * igt@gem_render_copy@y-tiled-mc-ccs-to-vebox-y-tiled:
- shard-iclb: NOTRUN -> [SKIP][16] ([i915#768]) +2 similar issues
   [16]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22347/shard-iclb8/igt@gem_render_c...@y-tiled-mc-ccs-to-vebox-y-tiled.html

  * igt@gem_userptr_blits@dmabuf-sync:
- shard-kbl:  NOTRUN -> [SKIP][17] ([fdo#109271] / [i915#3323])
   [17]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22347/shard-kbl1/igt@gem_userptr_bl...@dmabuf-sync.html

  * igt@i915_module_load@reload-with-fault-injection:
- shard-skl:  [PASS][18] -> [DMESG-WARN][19] ([i915#1982])
   [18]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11264/shard-skl3/igt@i915_module_l...@reload-with-fault-injection.html
   [19]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22347/shard-skl4/igt@i915_module_l...@reload-with-fault-injection.html

  * igt@i915_pm_dc@dc6-dpms:
- shard-skl:  NOTRUN -> [FAIL][20] ([i915#454])
   [20]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22347/shard-skl3/igt@i915_pm...@dc6-dpms.html

  * igt@i915_pm_dc@dc6-psr:
- shard-iclb: [PASS][21] -> [FAIL][22] ([i915#454])
   [21]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11264/shard-iclb6/igt@i915_pm...@dc6-psr.html
   [22]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22347/shard-iclb6/igt@i915_pm...@dc6-psr.html

  * igt@i915_pm_rpm@gem-execbuf-stress-pc8:
- 

[Intel-gfx] ✓ Fi.CI.IGT: success for drm/i915/tgl: Simply subplatform detection

2022-02-21 Thread Patchwork
== Series Details ==

Series: drm/i915/tgl: Simply subplatform detection
URL   : https://patchwork.freedesktop.org/series/100517/
State : success

== Summary ==

CI Bug Log - changes from CI_DRM_11264_full -> Patchwork_22345_full


Summary
---

  **SUCCESS**

  No regressions found.

  

Participating hosts (13 -> 13)
--

  No changes in participating hosts

Known issues


  Here are the changes found in Patchwork_22345_full that come from known 
issues:

### IGT changes ###

 Issues hit 

  * igt@gem_exec_capture@pi@bcs0:
- shard-iclb: [PASS][1] -> [INCOMPLETE][2] ([i915#3371])
   [1]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11264/shard-iclb8/igt@gem_exec_capture@p...@bcs0.html
   [2]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22345/shard-iclb6/igt@gem_exec_capture@p...@bcs0.html

  * igt@gem_exec_fair@basic-pace-share@rcs0:
- shard-tglb: [PASS][3] -> [FAIL][4] ([i915#2842])
   [3]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11264/shard-tglb7/igt@gem_exec_fair@basic-pace-sh...@rcs0.html
   [4]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22345/shard-tglb5/igt@gem_exec_fair@basic-pace-sh...@rcs0.html

  * igt@gem_exec_fair@basic-pace-solo@rcs0:
- shard-kbl:  [PASS][5] -> [FAIL][6] ([i915#2842])
   [5]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11264/shard-kbl6/igt@gem_exec_fair@basic-pace-s...@rcs0.html
   [6]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22345/shard-kbl6/igt@gem_exec_fair@basic-pace-s...@rcs0.html

  * igt@gem_exec_fair@basic-pace@bcs0:
- shard-iclb: [PASS][7] -> [FAIL][8] ([i915#2842])
   [7]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11264/shard-iclb7/igt@gem_exec_fair@basic-p...@bcs0.html
   [8]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22345/shard-iclb8/igt@gem_exec_fair@basic-p...@bcs0.html

  * igt@gem_exec_whisper@basic-forked:
- shard-glk:  [PASS][9] -> [DMESG-WARN][10] ([i915#118]) +2 similar 
issues
   [9]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11264/shard-glk2/igt@gem_exec_whis...@basic-forked.html
   [10]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22345/shard-glk2/igt@gem_exec_whis...@basic-forked.html

  * igt@gem_lmem_swapping@heavy-verify-random:
- shard-kbl:  NOTRUN -> [SKIP][11] ([fdo#109271] / [i915#4613]) +1 
similar issue
   [11]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22345/shard-kbl7/igt@gem_lmem_swapp...@heavy-verify-random.html

  * igt@gem_lmem_swapping@parallel-random-engines:
- shard-skl:  NOTRUN -> [SKIP][12] ([fdo#109271] / [i915#4613])
   [12]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22345/shard-skl4/igt@gem_lmem_swapp...@parallel-random-engines.html

  * igt@gem_lmem_swapping@smem-oom:
- shard-apl:  NOTRUN -> [SKIP][13] ([fdo#109271] / [i915#4613])
   [13]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22345/shard-apl1/igt@gem_lmem_swapp...@smem-oom.html

  * igt@gem_pwrite@basic-exhaustion:
- shard-skl:  NOTRUN -> [WARN][14] ([i915#2658])
   [14]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22345/shard-skl4/igt@gem_pwr...@basic-exhaustion.html

  * igt@gem_pxp@reject-modify-context-protection-off-1:
- shard-iclb: NOTRUN -> [SKIP][15] ([i915#4270])
   [15]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22345/shard-iclb3/igt@gem_...@reject-modify-context-protection-off-1.html

  * igt@gem_render_copy@y-tiled-mc-ccs-to-vebox-y-tiled:
- shard-iclb: NOTRUN -> [SKIP][16] ([i915#768]) +1 similar issue
   [16]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22345/shard-iclb5/igt@gem_render_c...@y-tiled-mc-ccs-to-vebox-y-tiled.html

  * igt@gem_userptr_blits@dmabuf-sync:
- shard-kbl:  NOTRUN -> [SKIP][17] ([fdo#109271] / [i915#3323])
   [17]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22345/shard-kbl7/igt@gem_userptr_bl...@dmabuf-sync.html

  * igt@i915_selftest@mock@hugepages:
- shard-kbl:  NOTRUN -> [INCOMPLETE][18] ([i915#5123])
   [18]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22345/shard-kbl4/igt@i915_selftest@m...@hugepages.html

  * igt@i915_suspend@fence-restore-tiled2untiled:
- shard-apl:  [PASS][19] -> [DMESG-WARN][20] ([i915#180]) +1 
similar issue
   [19]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11264/shard-apl4/igt@i915_susp...@fence-restore-tiled2untiled.html
   [20]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22345/shard-apl6/igt@i915_susp...@fence-restore-tiled2untiled.html

  * igt@kms_big_fb@x-tiled-max-hw-stride-32bpp-rotate-180-hflip-async-flip:
- shard-kbl:  NOTRUN -> [SKIP][21] ([fdo#109271] / [i915#3777])
   [21]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22345/shard-kbl7/igt@kms_big...@x-tiled-max-hw-stride-32bpp-rotate-180-hflip-async-flip.html

  * 

[Intel-gfx] ✓ Fi.CI.BAT: success for drm/i915: fix one mem leak in mmap_offset_attach()

2022-02-21 Thread Patchwork
== Series Details ==

Series: drm/i915: fix one mem leak in mmap_offset_attach()
URL   : https://patchwork.freedesktop.org/series/100532/
State : success

== Summary ==

CI Bug Log - changes from CI_DRM_11264 -> Patchwork_22347


Summary
---

  **SUCCESS**

  No regressions found.

  External URL: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22347/index.html

Participating hosts (44 -> 42)
--

  Additional (2): bat-dg2-8 fi-bdw-5557u 
  Missing(4): fi-bsw-cyan shard-rkl shard-dg1 shard-tglu 

Known issues


  Here are the changes found in Patchwork_22347 that come from known issues:

### IGT changes ###

 Issues hit 

  * igt@gem_huc_copy@huc-copy:
- fi-skl-6600u:   NOTRUN -> [SKIP][1] ([fdo#109271] / [i915#2190])
   [1]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22347/fi-skl-6600u/igt@gem_huc_c...@huc-copy.html

  * igt@gem_lmem_swapping@verify-random:
- fi-skl-6600u:   NOTRUN -> [SKIP][2] ([fdo#109271] / [i915#4613]) +3 
similar issues
   [2]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22347/fi-skl-6600u/igt@gem_lmem_swapp...@verify-random.html

  * igt@kms_chamelium@vga-edid-read:
- fi-skl-6600u:   NOTRUN -> [SKIP][3] ([fdo#109271] / [fdo#111827]) +8 
similar issues
   [3]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22347/fi-skl-6600u/igt@kms_chamel...@vga-edid-read.html

  * igt@kms_cursor_legacy@basic-busy-flip-before-cursor-legacy:
- fi-skl-6600u:   NOTRUN -> [SKIP][4] ([fdo#109271]) +21 similar issues
   [4]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22347/fi-skl-6600u/igt@kms_cursor_leg...@basic-busy-flip-before-cursor-legacy.html

  * igt@kms_pipe_crc_basic@compare-crc-sanitycheck-pipe-d:
- fi-skl-6600u:   NOTRUN -> [SKIP][5] ([fdo#109271] / [i915#533])
   [5]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22347/fi-skl-6600u/igt@kms_pipe_crc_ba...@compare-crc-sanitycheck-pipe-d.html

  * igt@kms_pipe_crc_basic@read-crc-pipe-b:
- fi-cfl-8109u:   [PASS][6] -> [DMESG-WARN][7] ([i915#295]) +11 similar 
issues
   [6]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11264/fi-cfl-8109u/igt@kms_pipe_crc_ba...@read-crc-pipe-b.html
   [7]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22347/fi-cfl-8109u/igt@kms_pipe_crc_ba...@read-crc-pipe-b.html

  * igt@runner@aborted:
- fi-bdw-5557u:   NOTRUN -> [FAIL][8] ([i915#2426] / [i915#4312])
   [8]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22347/fi-bdw-5557u/igt@run...@aborted.html

  
 Possible fixes 

  * igt@gem_exec_suspend@basic-s3@smem:
- fi-skl-6600u:   [INCOMPLETE][9] ([i915#4547]) -> [PASS][10]
   [9]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11264/fi-skl-6600u/igt@gem_exec_suspend@basic...@smem.html
   [10]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22347/fi-skl-6600u/igt@gem_exec_suspend@basic...@smem.html

  * igt@i915_selftest@live@gt_pm:
- fi-tgl-1115g4:  [DMESG-FAIL][11] ([i915#3987]) -> [PASS][12]
   [11]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11264/fi-tgl-1115g4/igt@i915_selftest@live@gt_pm.html
   [12]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22347/fi-tgl-1115g4/igt@i915_selftest@live@gt_pm.html

  * igt@i915_selftest@live@gt_timelines:
- {fi-tgl-dsi}:   [INCOMPLETE][13] -> [PASS][14]
   [13]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11264/fi-tgl-dsi/igt@i915_selftest@live@gt_timelines.html
   [14]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22347/fi-tgl-dsi/igt@i915_selftest@live@gt_timelines.html

  
 Warnings 

  * igt@i915_selftest@live@hangcheck:
- bat-dg1-6:  [DMESG-FAIL][15] ([i915#4494] / [i915#4957]) -> 
[DMESG-FAIL][16] ([i915#4957])
   [15]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11264/bat-dg1-6/igt@i915_selftest@l...@hangcheck.html
   [16]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22347/bat-dg1-6/igt@i915_selftest@l...@hangcheck.html

  
  {name}: This element is suppressed. This means it is ignored when computing
  the status of the difference (SUCCESS, WARNING, or FAILURE).

  [fdo#109271]: https://bugs.freedesktop.org/show_bug.cgi?id=109271
  [fdo#109315]: https://bugs.freedesktop.org/show_bug.cgi?id=109315
  [fdo#111827]: https://bugs.freedesktop.org/show_bug.cgi?id=111827
  [i915#1759]: https://gitlab.freedesktop.org/drm/intel/issues/1759
  [i915#2190]: https://gitlab.freedesktop.org/drm/intel/issues/2190
  [i915#2373]: https://gitlab.freedesktop.org/drm/intel/issues/2373
  [i915#2426]: https://gitlab.freedesktop.org/drm/intel/issues/2426
  [i915#2575]: https://gitlab.freedesktop.org/drm/intel/issues/2575
  [i915#2582]: https://gitlab.freedesktop.org/drm/intel/issues/2582
  [i915#295]: https://gitlab.freedesktop.org/drm/intel/issues/295
  [i915#3987]: https://gitlab.freedesktop.org/drm/intel/issues/3987
  [i915#4312]: 

[Intel-gfx] ✓ Fi.CI.IGT: success for series starting with [v13,1/5] drm: improve drm_buddy_alloc function

2022-02-21 Thread Patchwork
== Series Details ==

Series: series starting with [v13,1/5] drm: improve drm_buddy_alloc function
URL   : https://patchwork.freedesktop.org/series/100509/
State : success

== Summary ==

CI Bug Log - changes from CI_DRM_11264_full -> Patchwork_22344_full


Summary
---

  **SUCCESS**

  No regressions found.

  

Participating hosts (13 -> 13)
--

  No changes in participating hosts

Known issues


  Here are the changes found in Patchwork_22344_full that come from known 
issues:

### IGT changes ###

 Issues hit 

  * igt@gem_ctx_persistence@many-contexts:
- shard-glk:  [PASS][1] -> [DMESG-WARN][2] ([i915#118]) +3 similar 
issues
   [1]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11264/shard-glk5/igt@gem_ctx_persiste...@many-contexts.html
   [2]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22344/shard-glk7/igt@gem_ctx_persiste...@many-contexts.html

  * igt@gem_exec_balancer@parallel-ordering:
- shard-kbl:  NOTRUN -> [DMESG-FAIL][3] ([i915#5076])
   [3]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22344/shard-kbl1/igt@gem_exec_balan...@parallel-ordering.html

  * igt@gem_exec_fair@basic-pace@rcs0:
- shard-kbl:  NOTRUN -> [FAIL][4] ([i915#2842])
   [4]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22344/shard-kbl3/igt@gem_exec_fair@basic-p...@rcs0.html
- shard-iclb: [PASS][5] -> [FAIL][6] ([i915#2842]) +1 similar issue
   [5]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11264/shard-iclb7/igt@gem_exec_fair@basic-p...@rcs0.html
   [6]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22344/shard-iclb3/igt@gem_exec_fair@basic-p...@rcs0.html

  * igt@gem_lmem_swapping@heavy-multi:
- shard-kbl:  NOTRUN -> [SKIP][7] ([fdo#109271] / [i915#4613])
   [7]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22344/shard-kbl1/igt@gem_lmem_swapp...@heavy-multi.html

  * igt@gem_lmem_swapping@parallel-random-engines:
- shard-skl:  NOTRUN -> [SKIP][8] ([fdo#109271] / [i915#4613])
   [8]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22344/shard-skl1/igt@gem_lmem_swapp...@parallel-random-engines.html

  * igt@gem_lmem_swapping@smem-oom:
- shard-apl:  NOTRUN -> [SKIP][9] ([fdo#109271] / [i915#4613])
   [9]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22344/shard-apl2/igt@gem_lmem_swapp...@smem-oom.html

  * igt@gem_pwrite@basic-exhaustion:
- shard-skl:  NOTRUN -> [WARN][10] ([i915#2658])
   [10]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22344/shard-skl1/igt@gem_pwr...@basic-exhaustion.html

  * igt@gem_render_copy@y-tiled-mc-ccs-to-vebox-y-tiled:
- shard-iclb: NOTRUN -> [SKIP][11] ([i915#768]) +1 similar issue
   [11]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22344/shard-iclb8/igt@gem_render_c...@y-tiled-mc-ccs-to-vebox-y-tiled.html

  * igt@i915_pm_dc@dc6-dpms:
- shard-kbl:  NOTRUN -> [FAIL][12] ([i915#454])
   [12]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22344/shard-kbl1/igt@i915_pm...@dc6-dpms.html

  * igt@i915_pm_rpm@cursor:
- shard-iclb: [PASS][13] -> [INCOMPLETE][14] ([i915#5096])
   [13]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11264/shard-iclb8/igt@i915_pm_...@cursor.html
   [14]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22344/shard-iclb4/igt@i915_pm_...@cursor.html

  * igt@i915_pm_rpm@system-suspend-execbuf:
- shard-skl:  [PASS][15] -> [INCOMPLETE][16] ([i915#151])
   [15]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11264/shard-skl4/igt@i915_pm_...@system-suspend-execbuf.html
   [16]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22344/shard-skl2/igt@i915_pm_...@system-suspend-execbuf.html

  * igt@i915_selftest@mock@hugepages:
- shard-skl:  NOTRUN -> [INCOMPLETE][17] ([i915#5123])
   [17]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22344/shard-skl1/igt@i915_selftest@m...@hugepages.html
- shard-kbl:  NOTRUN -> [INCOMPLETE][18] ([i915#5123])
   [18]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22344/shard-kbl7/igt@i915_selftest@m...@hugepages.html

  * igt@i915_suspend@sysfs-reader:
- shard-apl:  [PASS][19] -> [DMESG-WARN][20] ([i915#180]) +4 
similar issues
   [19]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11264/shard-apl2/igt@i915_susp...@sysfs-reader.html
   [20]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22344/shard-apl6/igt@i915_susp...@sysfs-reader.html
- shard-kbl:  NOTRUN -> [DMESG-WARN][21] ([i915#180])
   [21]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22344/shard-kbl4/igt@i915_susp...@sysfs-reader.html

  * igt@kms_async_flips@alternate-sync-async-flip:
- shard-skl:  [PASS][22] -> [FAIL][23] ([i915#2521])
   [22]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11264/shard-skl7/igt@kms_async_fl...@alternate-sync-async-flip.html
   [23]: 

[Intel-gfx] ✗ Fi.CI.CHECKPATCH: warning for drm/i915: fix one mem leak in mmap_offset_attach()

2022-02-21 Thread Patchwork
== Series Details ==

Series: drm/i915: fix one mem leak in mmap_offset_attach()
URL   : https://patchwork.freedesktop.org/series/100532/
State : warning

== Summary ==

$ dim checkpatch origin/drm-tip
7dffc282c26b drm/i915: fix one mem leak in mmap_offset_attach()
-:9: WARNING:COMMIT_MESSAGE: Missing commit description - Add an appropriate one

-:20: ERROR:MISSING_SIGN_OFF: Missing Signed-off-by: line(s)

total: 1 errors, 1 warnings, 0 checks, 8 lines checked




[Intel-gfx] 2022 X.Org Board of Directors Elections Nomination period is NOW

2022-02-21 Thread Lyude Paul
We are seeking nominations for candidates for election to the X.Org Foundation
Board of Directors. All X.Org Foundation members are eligible for election to
the board.

Nominations for the 2022 election are now open and will remain open until
23:59 UTC on 06 March 2022.

The Board consists of directors elected from the membership. Each year, an
election is held to bring the total number of directors to eight. The four
members receiving the highest vote totals will serve as directors for two year
terms.

The directors who received two year terms starting in 2021 were Lyude Paul,
Samuel Iglesias Gonsálvez, Manasi D Navare and Daniel Vetter. They will
continue to serve until their term ends in 2023. Current directors whose term
expires in 2022 are Emma Anholt, Keith Packard, Harry Wentland and Mark
Filion.

A director is expected to participate in the fortnightly IRC meeting to
discuss current business and to attend the annual meeting of the X.Org
Foundation, which will be held at a location determined in advance by the
Board of Directors.

A member may nominate themselves or any other member they feel is qualified.
Nominations should be sent to the Election Committee at elections at x.org.

Nominees shall be required to be current members of the X.Org Foundation, and
submit a personal statement of up to 200 words that will be provided to
prospective voters. The collected statements, along with the statement of
contribution to the X.Org Foundation in the member's account page on
http://members.x.org, will be made available to all voters to help them make
their voting decisions.

Nominations, membership applications or renewals and completed personal
statements must be received no later than 23:59 UTC on 6th March 2022.

The slate of candidates will be published 14 March 2022 and candidate Q will
begin then. The deadline for Xorg membership applications and renewals is 17
March 2022.

Cheers, Lyude Paul, on behalf of the X.Org BoD




[Intel-gfx] [PATCH] drm/i915: fix one mem leak in mmap_offset_attach()

2022-02-21 Thread Chuansheng Liu
The below memory leak information is caught:

---
unreferenced object 0x997dd4e3b240 (size 64):
  comm "gem_tiled_fence", pid 10332, jiffies 4294959326 (age
220778.420s)
  hex dump (first 32 bytes):
01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  
00 00 00 00 00 00 00 00 00 be f2 d4 7d 99 ff ff  }...
  backtrace:
[] kmem_cache_alloc_trace+0x2e5/0x450
[] drm_vma_node_allow+0x2c/0xe0 [drm]
[] __assign_mmap_offset_handle+0x1da/0x4a0 [i915]
[] i915_gem_mmap_offset_ioctl+0x55/0xb0 [i915]
[] drm_ioctl_kernel+0xb4/0x140 [drm]
[] drm_ioctl+0x257/0x410 [drm]
[] __x64_sys_ioctl+0x8e/0xc0
[] do_syscall_64+0x38/0xc0
[] entry_SYSCALL_64_after_hwframe+0x44/0xae
---

The issue is always reproduced with the test:
gem_tiled_fence_blits --run-subtest basic

It tries to mmap_gtt the same object several times, it is like:
create BO
mmap_gtt BO
unmap BO
mmap_gtt BO <== second time mmap_gtt
unmap

The leak happens at the second time mmap_gtt in function mmap_offset_attach(),
it will simply increase the reference count to 2 by calling drm_vma_node_allow()
directly since the mmo has been created at the first time.
However the driver just revokes the vma_node one time when closing the object,
it leads to memory leak easily.

This patch is to fix the memory leak by calling drm_vma_node_allow() one
time also.

Signed-off-by: Chuansheng Liu 
---
 drivers/gpu/drm/i915/gem/i915_gem_mman.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/i915/gem/i915_gem_mman.c 
b/drivers/gpu/drm/i915/gem/i915_gem_mman.c
index efe69d6b86f4..aa2d770d4280 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_mman.c
+++ b/drivers/gpu/drm/i915/gem/i915_gem_mman.c
@@ -680,7 +680,7 @@ mmap_offset_attach(struct drm_i915_gem_object *obj,
mmo = insert_mmo(obj, mmo);
GEM_BUG_ON(lookup_mmo(obj, mmap_type) != mmo);
 out:
-   if (file)
+   if (!drm_vma_node_is_allowed(>vma_node, file))
drm_vma_node_allow(>vma_node, file);
return mmo;
 
-- 
2.25.0.rc2



Re: [Intel-gfx] [PATCH] drm/i915: Check input parameter for NULL

2022-02-21 Thread kernel test robot
Hi Yongzhi,

Thank you for the patch! Yet something to improve:

[auto build test ERROR on drm-intel/for-linux-next]
[also build test ERROR on v5.17-rc5 next-20220217]
[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]

url:
https://github.com/0day-ci/linux/commits/Yongzhi-Liu/drm-i915-Check-input-parameter-for-NULL/20220221-225508
base:   git://anongit.freedesktop.org/drm-intel for-linux-next
config: i386-randconfig-a004-20220221 
(https://download.01.org/0day-ci/archive/20220222/202202220935.3r4emo4y-...@intel.com/config)
compiler: gcc-9 (Debian 9.3.0-22) 9.3.0
reproduce (this is a W=1 build):
# 
https://github.com/0day-ci/linux/commit/c54be425a38b3f4cb82c5badecf6b343f9e24a90
git remote add linux-review https://github.com/0day-ci/linux
git fetch --no-tags linux-review 
Yongzhi-Liu/drm-i915-Check-input-parameter-for-NULL/20220221-225508
git checkout c54be425a38b3f4cb82c5badecf6b343f9e24a90
# save the config file to linux build tree
mkdir build_dir
make W=1 O=build_dir ARCH=i386 SHELL=/bin/bash

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot 

All errors (new ones prefixed by >>):

   drivers/gpu/drm/i915/gem/i915_gem_phys.c: In function 
'i915_gem_object_put_pages_phys':
>> drivers/gpu/drm/i915/gem/i915_gem_phys.c:100:2: error: ISO C90 forbids mixed 
>> declarations and code [-Werror=declaration-after-statement]
 100 |  dma_addr_t dma = sg_dma_address(pages->sgl);
 |  ^~
   cc1: all warnings being treated as errors


vim +100 drivers/gpu/drm/i915/gem/i915_gem_phys.c

f033428db28bdf Chris Wilson  2019-05-28   93  
a61170975718d5 Maarten Lankhorst 2021-03-23   94  void
f033428db28bdf Chris Wilson  2019-05-28   95  
i915_gem_object_put_pages_phys(struct drm_i915_gem_object *obj,
f033428db28bdf Chris Wilson  2019-05-28   96   
struct sg_table *pages)
f033428db28bdf Chris Wilson  2019-05-28   97  {
c54be425a38b3f Yongzhi Liu   2022-02-21   98if (!pages)
c54be425a38b3f Yongzhi Liu   2022-02-21   99return;
c6790dc22312f5 Chris Wilson  2020-02-02 @100dma_addr_t dma = 
sg_dma_address(pages->sgl);
c6790dc22312f5 Chris Wilson  2020-02-02  101void *vaddr = 
sg_page(pages->sgl);
c6790dc22312f5 Chris Wilson  2020-02-02  102  
f033428db28bdf Chris Wilson  2019-05-28  103
__i915_gem_object_release_shmem(obj, pages, false);
f033428db28bdf Chris Wilson  2019-05-28  104  
f033428db28bdf Chris Wilson  2019-05-28  105if (obj->mm.dirty) {
f033428db28bdf Chris Wilson  2019-05-28  106struct 
address_space *mapping = obj->base.filp->f_mapping;
c6790dc22312f5 Chris Wilson  2020-02-02  107void *src = 
vaddr;
f033428db28bdf Chris Wilson  2019-05-28  108int i;
f033428db28bdf Chris Wilson  2019-05-28  109  
f033428db28bdf Chris Wilson  2019-05-28  110for (i = 0; i < 
obj->base.size / PAGE_SIZE; i++) {
f033428db28bdf Chris Wilson  2019-05-28  111struct 
page *page;
f033428db28bdf Chris Wilson  2019-05-28  112char 
*dst;
f033428db28bdf Chris Wilson  2019-05-28  113  
f033428db28bdf Chris Wilson  2019-05-28  114page = 
shmem_read_mapping_page(mapping, i);
f033428db28bdf Chris Wilson  2019-05-28  115if 
(IS_ERR(page))
f033428db28bdf Chris Wilson  2019-05-28  116
continue;
f033428db28bdf Chris Wilson  2019-05-28  117  
f033428db28bdf Chris Wilson  2019-05-28  118dst = 
kmap_atomic(page);
c6790dc22312f5 Chris Wilson  2020-02-02  119
drm_clflush_virt_range(src, PAGE_SIZE);
c6790dc22312f5 Chris Wilson  2020-02-02  120
memcpy(dst, src, PAGE_SIZE);
f033428db28bdf Chris Wilson  2019-05-28  121
kunmap_atomic(dst);
f033428db28bdf Chris Wilson  2019-05-28  122  
f033428db28bdf Chris Wilson  2019-05-28  123
set_page_dirty(page);
f033428db28bdf Chris Wilson  2019-05-28  124if 
(obj->mm.madv == I915_MADV_WILLNEED)
f033428db28bdf Chris Wilson  2019-05-28  125
mark_page_accessed(page);
f033428db28bdf Chris Wilson  2019-05-28  126
put_page(page);
c6790dc22312f5 Chris Wilson  2020-02-02  127  
c6790dc22312f5 Chris Wilson  2020-02-02  128src += 
PAGE_SIZE;
f033428db28bdf Chris Wilson  2019-05-28  129}
f033428db28bdf Chris Wilson  2019-05-28  130obj->mm.dirty = 
false;

[Intel-gfx] ✓ Fi.CI.IGT: success for drm/i915/ttm: fixup the mock_bo (rev3)

2022-02-21 Thread Patchwork
== Series Details ==

Series: drm/i915/ttm: fixup the mock_bo (rev3)
URL   : https://patchwork.freedesktop.org/series/100255/
State : success

== Summary ==

CI Bug Log - changes from CI_DRM_11264_full -> Patchwork_22342_full


Summary
---

  **SUCCESS**

  No regressions found.

  

Participating hosts (13 -> 13)
--

  No changes in participating hosts

Known issues


  Here are the changes found in Patchwork_22342_full that come from known 
issues:

### CI changes ###

 Issues hit 

  * boot:
- shard-apl:  ([PASS][1], [PASS][2], [PASS][3], [PASS][4], 
[PASS][5], [PASS][6], [PASS][7], [PASS][8], [PASS][9], [PASS][10], [PASS][11], 
[PASS][12], [PASS][13], [PASS][14], [PASS][15], [PASS][16], [PASS][17], 
[PASS][18], [PASS][19], [PASS][20], [PASS][21], [PASS][22], [PASS][23], 
[PASS][24], [PASS][25]) -> ([PASS][26], [PASS][27], [PASS][28], [PASS][29], 
[PASS][30], [PASS][31], [PASS][32], [PASS][33], [PASS][34], [PASS][35], 
[PASS][36], [PASS][37], [PASS][38], [PASS][39], [PASS][40], [PASS][41], 
[PASS][42], [PASS][43], [PASS][44], [PASS][45], [PASS][46], [PASS][47], 
[PASS][48], [PASS][49], [FAIL][50]) ([i915#4386])
   [1]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11264/shard-apl1/boot.html
   [2]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11264/shard-apl1/boot.html
   [3]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11264/shard-apl1/boot.html
   [4]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11264/shard-apl1/boot.html
   [5]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11264/shard-apl1/boot.html
   [6]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11264/shard-apl2/boot.html
   [7]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11264/shard-apl2/boot.html
   [8]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11264/shard-apl2/boot.html
   [9]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11264/shard-apl2/boot.html
   [10]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11264/shard-apl3/boot.html
   [11]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11264/shard-apl3/boot.html
   [12]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11264/shard-apl3/boot.html
   [13]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11264/shard-apl4/boot.html
   [14]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11264/shard-apl4/boot.html
   [15]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11264/shard-apl4/boot.html
   [16]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11264/shard-apl6/boot.html
   [17]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11264/shard-apl6/boot.html
   [18]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11264/shard-apl6/boot.html
   [19]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11264/shard-apl7/boot.html
   [20]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11264/shard-apl7/boot.html
   [21]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11264/shard-apl7/boot.html
   [22]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11264/shard-apl8/boot.html
   [23]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11264/shard-apl8/boot.html
   [24]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11264/shard-apl8/boot.html
   [25]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11264/shard-apl8/boot.html
   [26]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22342/shard-apl8/boot.html
   [27]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22342/shard-apl8/boot.html
   [28]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22342/shard-apl8/boot.html
   [29]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22342/shard-apl7/boot.html
   [30]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22342/shard-apl7/boot.html
   [31]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22342/shard-apl7/boot.html
   [32]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22342/shard-apl7/boot.html
   [33]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22342/shard-apl6/boot.html
   [34]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22342/shard-apl6/boot.html
   [35]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22342/shard-apl6/boot.html
   [36]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22342/shard-apl4/boot.html
   [37]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22342/shard-apl4/boot.html
   [38]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22342/shard-apl4/boot.html
   [39]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22342/shard-apl4/boot.html
   [40]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22342/shard-apl4/boot.html
   [41]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22342/shard-apl3/boot.html
   [42]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22342/shard-apl3/boot.html
   [43]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22342/shard-apl3/boot.html
   [44]: 

Re: [Intel-gfx] [PATCH] drm/i915: Check input parameter for NULL

2022-02-21 Thread kernel test robot
Hi Yongzhi,

Thank you for the patch! Perhaps something to improve:

[auto build test WARNING on drm-intel/for-linux-next]
[also build test WARNING on v5.17-rc5 next-20220217]
[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]

url:
https://github.com/0day-ci/linux/commits/Yongzhi-Liu/drm-i915-Check-input-parameter-for-NULL/20220221-225508
base:   git://anongit.freedesktop.org/drm-intel for-linux-next
config: x86_64-randconfig-a001-20220221 
(https://download.01.org/0day-ci/archive/20220222/202202220847.76w2ewnu-...@intel.com/config)
compiler: gcc-9 (Debian 9.3.0-22) 9.3.0
reproduce (this is a W=1 build):
# 
https://github.com/0day-ci/linux/commit/c54be425a38b3f4cb82c5badecf6b343f9e24a90
git remote add linux-review https://github.com/0day-ci/linux
git fetch --no-tags linux-review 
Yongzhi-Liu/drm-i915-Check-input-parameter-for-NULL/20220221-225508
git checkout c54be425a38b3f4cb82c5badecf6b343f9e24a90
# save the config file to linux build tree
mkdir build_dir
make W=1 O=build_dir ARCH=x86_64 SHELL=/bin/bash drivers/gpu/drm/i915/

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot 

All warnings (new ones prefixed by >>):

   drivers/gpu/drm/i915/gem/i915_gem_phys.c: In function 
'i915_gem_object_put_pages_phys':
>> drivers/gpu/drm/i915/gem/i915_gem_phys.c:100:2: warning: ISO C90 forbids 
>> mixed declarations and code [-Wdeclaration-after-statement]
 100 |  dma_addr_t dma = sg_dma_address(pages->sgl);
 |  ^~


vim +100 drivers/gpu/drm/i915/gem/i915_gem_phys.c

f033428db28bdf Chris Wilson  2019-05-28   93  
a61170975718d5 Maarten Lankhorst 2021-03-23   94  void
f033428db28bdf Chris Wilson  2019-05-28   95  
i915_gem_object_put_pages_phys(struct drm_i915_gem_object *obj,
f033428db28bdf Chris Wilson  2019-05-28   96   
struct sg_table *pages)
f033428db28bdf Chris Wilson  2019-05-28   97  {
c54be425a38b3f Yongzhi Liu   2022-02-21   98if (!pages)
c54be425a38b3f Yongzhi Liu   2022-02-21   99return;
c6790dc22312f5 Chris Wilson  2020-02-02 @100dma_addr_t dma = 
sg_dma_address(pages->sgl);
c6790dc22312f5 Chris Wilson  2020-02-02  101void *vaddr = 
sg_page(pages->sgl);
c6790dc22312f5 Chris Wilson  2020-02-02  102  
f033428db28bdf Chris Wilson  2019-05-28  103
__i915_gem_object_release_shmem(obj, pages, false);
f033428db28bdf Chris Wilson  2019-05-28  104  
f033428db28bdf Chris Wilson  2019-05-28  105if (obj->mm.dirty) {
f033428db28bdf Chris Wilson  2019-05-28  106struct 
address_space *mapping = obj->base.filp->f_mapping;
c6790dc22312f5 Chris Wilson  2020-02-02  107void *src = 
vaddr;
f033428db28bdf Chris Wilson  2019-05-28  108int i;
f033428db28bdf Chris Wilson  2019-05-28  109  
f033428db28bdf Chris Wilson  2019-05-28  110for (i = 0; i < 
obj->base.size / PAGE_SIZE; i++) {
f033428db28bdf Chris Wilson  2019-05-28  111struct 
page *page;
f033428db28bdf Chris Wilson  2019-05-28  112char 
*dst;
f033428db28bdf Chris Wilson  2019-05-28  113  
f033428db28bdf Chris Wilson  2019-05-28  114page = 
shmem_read_mapping_page(mapping, i);
f033428db28bdf Chris Wilson  2019-05-28  115if 
(IS_ERR(page))
f033428db28bdf Chris Wilson  2019-05-28  116
continue;
f033428db28bdf Chris Wilson  2019-05-28  117  
f033428db28bdf Chris Wilson  2019-05-28  118dst = 
kmap_atomic(page);
c6790dc22312f5 Chris Wilson  2020-02-02  119
drm_clflush_virt_range(src, PAGE_SIZE);
c6790dc22312f5 Chris Wilson  2020-02-02  120
memcpy(dst, src, PAGE_SIZE);
f033428db28bdf Chris Wilson  2019-05-28  121
kunmap_atomic(dst);
f033428db28bdf Chris Wilson  2019-05-28  122  
f033428db28bdf Chris Wilson  2019-05-28  123
set_page_dirty(page);
f033428db28bdf Chris Wilson  2019-05-28  124if 
(obj->mm.madv == I915_MADV_WILLNEED)
f033428db28bdf Chris Wilson  2019-05-28  125
mark_page_accessed(page);
f033428db28bdf Chris Wilson  2019-05-28  126
put_page(page);
c6790dc22312f5 Chris Wilson  2020-02-02  127  
c6790dc22312f5 Chris Wilson  2020-02-02  128src += 
PAGE_SIZE;
f033428db28bdf Chris Wilson  2019-05-28  129}
f033428db28bdf Chris Wilson  2019-05-28  130obj->mm.dirty = 
false;
f033428db28bdf Chris Wilson   

[Intel-gfx] ✗ Fi.CI.BAT: failure for drm/i915: use ref_tracker library for tracking wakerefs (rev3)

2022-02-21 Thread Patchwork
== Series Details ==

Series: drm/i915: use ref_tracker library for tracking wakerefs (rev3)
URL   : https://patchwork.freedesktop.org/series/100327/
State : failure

== Summary ==

CI Bug Log - changes from CI_DRM_11264 -> Patchwork_22346


Summary
---

  **FAILURE**

  Serious unknown changes coming with Patchwork_22346 absolutely need to be
  verified manually.
  
  If you think the reported changes have nothing to do with the changes
  introduced in Patchwork_22346, 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_22346/index.html

Participating hosts (44 -> 43)
--

  Additional (3): fi-bdw-5557u bat-adls-5 fi-pnv-d510 
  Missing(4): fi-bsw-cyan shard-rkl shard-dg1 shard-tglu 

Possible new issues
---

  Here are the unknown changes that may have been introduced in Patchwork_22346:

### IGT changes ###

 Possible regressions 

  * igt@runner@aborted:
- fi-snb-2600:NOTRUN -> [FAIL][1]
   [1]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22346/fi-snb-2600/igt@run...@aborted.html
- fi-ilk-650: NOTRUN -> [FAIL][2]
   [2]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22346/fi-ilk-650/igt@run...@aborted.html
- fi-kbl-x1275:   NOTRUN -> [FAIL][3]
   [3]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22346/fi-kbl-x1275/igt@run...@aborted.html
- fi-bsw-kefka:   NOTRUN -> [FAIL][4]
   [4]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22346/fi-bsw-kefka/igt@run...@aborted.html
- fi-bdw-gvtdvm:  NOTRUN -> [FAIL][5]
   [5]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22346/fi-bdw-gvtdvm/igt@run...@aborted.html
- fi-cfl-8700k:   NOTRUN -> [FAIL][6]
   [6]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22346/fi-cfl-8700k/igt@run...@aborted.html
- fi-cfl-8109u:   NOTRUN -> [FAIL][7]
   [7]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22346/fi-cfl-8109u/igt@run...@aborted.html
- bat-dg1-5:  NOTRUN -> [FAIL][8]
   [8]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22346/bat-dg1-5/igt@run...@aborted.html
- fi-bsw-nick:NOTRUN -> [FAIL][9]
   [9]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22346/fi-bsw-nick/igt@run...@aborted.html
- fi-kbl-8809g:   NOTRUN -> [FAIL][10]
   [10]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22346/fi-kbl-8809g/igt@run...@aborted.html
- fi-snb-2520m:   NOTRUN -> [FAIL][11]
   [11]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22346/fi-snb-2520m/igt@run...@aborted.html
- fi-bdw-5557u:   NOTRUN -> [FAIL][12]
   [12]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22346/fi-bdw-5557u/igt@run...@aborted.html
- fi-bwr-2160:NOTRUN -> [FAIL][13]
   [13]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22346/fi-bwr-2160/igt@run...@aborted.html
- fi-kbl-soraka:  NOTRUN -> [FAIL][14]
   [14]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22346/fi-kbl-soraka/igt@run...@aborted.html
- fi-kbl-7500u:   NOTRUN -> [FAIL][15]
   [15]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22346/fi-kbl-7500u/igt@run...@aborted.html
- fi-kbl-guc: NOTRUN -> [FAIL][16]
   [16]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22346/fi-kbl-guc/igt@run...@aborted.html
- fi-cml-u2:  NOTRUN -> [FAIL][17]
   [17]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22346/fi-cml-u2/igt@run...@aborted.html
- fi-rkl-guc: NOTRUN -> [FAIL][18]
   [18]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22346/fi-rkl-guc/igt@run...@aborted.html
- fi-ivb-3770:NOTRUN -> [FAIL][19]
   [19]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22346/fi-ivb-3770/igt@run...@aborted.html
- fi-tgl-1115g4:  NOTRUN -> [FAIL][20]
   [20]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22346/fi-tgl-1115g4/igt@run...@aborted.html
- bat-dg1-6:  NOTRUN -> [FAIL][21]
   [21]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22346/bat-dg1-6/igt@run...@aborted.html
- fi-elk-e7500:   NOTRUN -> [FAIL][22]
   [22]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22346/fi-elk-e7500/igt@run...@aborted.html
- fi-cfl-guc: NOTRUN -> [FAIL][23]
   [23]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22346/fi-cfl-guc/igt@run...@aborted.html
- fi-skl-guc: NOTRUN -> [FAIL][24]
   [24]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22346/fi-skl-guc/igt@run...@aborted.html
- fi-skl-6700k2:  NOTRUN -> [FAIL][25]
   [25]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22346/fi-skl-6700k2/igt@run...@aborted.html
- fi-bsw-n3050:   NOTRUN -> [FAIL][26]
   [26]: 

[Intel-gfx] ✗ Fi.CI.SPARSE: warning for drm/i915: use ref_tracker library for tracking wakerefs (rev3)

2022-02-21 Thread Patchwork
== Series Details ==

Series: drm/i915: use ref_tracker library for tracking wakerefs (rev3)
URL   : https://patchwork.freedesktop.org/series/100327/
State : warning

== Summary ==

$ dim sparse --fast origin/drm-tip
Sparse version: v0.6.2
Fast mode used, each commit won't be checked separately.




[Intel-gfx] ✗ Fi.CI.CHECKPATCH: warning for drm/i915: use ref_tracker library for tracking wakerefs (rev3)

2022-02-21 Thread Patchwork
== Series Details ==

Series: drm/i915: use ref_tracker library for tracking wakerefs (rev3)
URL   : https://patchwork.freedesktop.org/series/100327/
State : warning

== Summary ==

$ dim checkpatch origin/drm-tip
eec39ef01f2c ref_tracker: implement use-after-free detection
e7636c41be32 ref_tracker: add a count of untracked references
414f58d98e73 ref_tracker: remove filter_irq_stacks() call
5a389d9482be lib/ref_tracker: add unlocked leak print helper
-:6: WARNING:COMMIT_LOG_LONG_LINE: Possible unwrapped commit description 
(prefer a maximum 75 chars per line)
#6: 
To have reliable detection of leaks, caller must be able to check under the same

-:23: CHECK:PARENTHESIS_ALIGNMENT: Alignment should match open parenthesis
#23: FILE: include/linux/ref_tracker.h:40:
+void __ref_tracker_dir_print(struct ref_tracker_dir *dir,
+  unsigned int display_limit);

-:49: CHECK:PARENTHESIS_ALIGNMENT: Alignment should match open parenthesis
#49: FILE: lib/ref_tracker.c:18:
+void __ref_tracker_dir_print(struct ref_tracker_dir *dir,
+  unsigned int display_limit)

total: 0 errors, 1 warnings, 2 checks, 105 lines checked
36bd9e9d6260 lib/ref_tracker: __ref_tracker_dir_print improve printing
-:37: CHECK:PARENTHESIS_ALIGNMENT: Alignment should match open parenthesis
#37: FILE: include/linux/ref_tracker.h:31:
+static inline void __ref_tracker_dir_init(struct ref_tracker_dir *dir,
+   unsigned int quarantine_count,

-:46: WARNING:STRLCPY: Prefer strscpy over strlcpy - see: 
https://lore.kernel.org/r/CAHk-=wgfRnXz0W3D37d01q3JFkr_i_uTL=v6a6g1ouzcprm...@mail.gmail.com/
#46: FILE: include/linux/ref_tracker.h:41:
+   strlcpy(dir->name, name, sizeof(dir->name));

-:140: CHECK:PARENTHESIS_ALIGNMENT: Alignment should match open parenthesis
#140: FILE: lib/ref_tracker.c:66:
+void __ref_tracker_dir_print(struct ref_tracker_dir *dir,
+  unsigned int display_limit)

total: 0 errors, 1 warnings, 2 checks, 151 lines checked
bd88fd5cf435 lib/ref_tracker: add printing to memory buffer
-:52: CHECK:MACRO_ARG_REUSE: Macro argument reuse 'fmt' - possible side-effects?
#52: FILE: lib/ref_tracker.c:70:
+#define pr_ostream(stream, fmt, args...) \
+({ \
+   struct ostream *_s = (stream); \
+\
+   if (!_s->buf) { \
+   pr_err(fmt, ##args); \
+   } else { \
+   int ret, len = _s->size - _s->used; \
+   ret = snprintf(_s->buf + _s->used, len, pr_fmt(fmt), ##args); \
+   _s->used += min(ret, len); \
+   } \
+})

-:105: CHECK:PARENTHESIS_ALIGNMENT: Alignment should match open parenthesis
#105: FILE: lib/ref_tracker.c:125:
+void __ref_tracker_dir_print(struct ref_tracker_dir *dir,
+  unsigned int display_limit)

total: 0 errors, 0 warnings, 2 checks, 109 lines checked
359c7ae0d260 lib/ref_tracker: remove warnings in case of allocation failure
e1a8bc8a2d3a drm/i915: Separate wakeref tracking
-:7: WARNING:REPEATED_WORD: Possible repeated word: 'that'
#7: 
utility so that that we can reuse it for other online debugging of

-:453: WARNING:FILE_PATH_CHANGES: added, moved or deleted file(s), does 
MAINTAINERS need updating?
#453: 
new file mode 100644

-:710: WARNING:NEW_TYPEDEFS: do not add new typedefs
#710: FILE: drivers/gpu/drm/i915/intel_wakeref_tracker.h:13:
+typedef depot_stack_handle_t intel_wakeref_t;

-:715: CHECK:UNCOMMENTED_DEFINITION: spinlock_t definition without comment
#715: FILE: drivers/gpu/drm/i915/intel_wakeref_tracker.h:18:
+   spinlock_t lock;

-:731: CHECK:PARENTHESIS_ALIGNMENT: Alignment should match open parenthesis
#731: FILE: drivers/gpu/drm/i915/intel_wakeref_tracker.h:34:
+void intel_wakeref_tracker_remove(struct intel_wakeref_tracker *w,
+  intel_wakeref_t handle);

-:768: WARNING:LONG_LINE: line length of 112 exceeds 100 columns
#768: FILE: drivers/gpu/drm/i915/intel_wakeref_tracker.h:71:
+static inline void __intel_wakeref_tracker_show(const struct 
intel_wakeref_tracker *w, struct drm_printer *p) {}

-:769: WARNING:LONG_LINE: line length of 104 exceeds 100 columns
#769: FILE: drivers/gpu/drm/i915/intel_wakeref_tracker.h:72:
+static inline void intel_wakeref_tracker_show(struct intel_wakeref_tracker *w, 
struct drm_printer *p) {}

-:773: WARNING:FROM_SIGN_OFF_MISMATCH: From:/Signed-off-by: email address 
mismatch: 'From: Chris Wilson ' != 'Signed-off-by: 
Chris Wilson '

total: 0 errors, 6 warnings, 2 checks, 713 lines checked
29a2d4b63b37 drm/i915: Track leaked gt->wakerefs
-:450: CHECK:MACRO_ARG_REUSE: Macro argument reuse 'gt' - possible side-effects?
#450: FILE: drivers/gpu/drm/i915/gt/intel_gt_pm.h:75:
+#define with_intel_gt_pm(gt, wf) \
+   for (wf = intel_gt_pm_get(gt); wf; intel_gt_pm_put(gt, wf), wf = 0)

-:450: CHECK:MACRO_ARG_REUSE: Macro argument reuse 'wf' - possible side-effects?
#450: FILE: drivers/gpu/drm/i915/gt/intel_gt_pm.h:75:
+#define with_intel_gt_pm(gt, wf) \
+   for (wf = 

Re: [Intel-gfx] [PATCH] drm/i915: Check input parameter for NULL

2022-02-21 Thread kernel test robot
Hi Yongzhi,

Thank you for the patch! Perhaps something to improve:

[auto build test WARNING on drm-intel/for-linux-next]
[also build test WARNING on v5.17-rc5 next-20220217]
[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]

url:
https://github.com/0day-ci/linux/commits/Yongzhi-Liu/drm-i915-Check-input-parameter-for-NULL/20220221-225508
base:   git://anongit.freedesktop.org/drm-intel for-linux-next
config: i386-randconfig-a014-20220221 
(https://download.01.org/0day-ci/archive/20220222/202202220722.25bhjj6r-...@intel.com/config)
compiler: clang version 15.0.0 (https://github.com/llvm/llvm-project 
d271fc04d5b97b12e6b797c6067d3c96a8d7470e)
reproduce (this is a W=1 build):
wget 
https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O 
~/bin/make.cross
chmod +x ~/bin/make.cross
# 
https://github.com/0day-ci/linux/commit/c54be425a38b3f4cb82c5badecf6b343f9e24a90
git remote add linux-review https://github.com/0day-ci/linux
git fetch --no-tags linux-review 
Yongzhi-Liu/drm-i915-Check-input-parameter-for-NULL/20220221-225508
git checkout c54be425a38b3f4cb82c5badecf6b343f9e24a90
# save the config file to linux build tree
mkdir build_dir
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross W=1 
O=build_dir ARCH=i386 SHELL=/bin/bash drivers/gpu/drm/i915/

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot 

All warnings (new ones prefixed by >>):

>> drivers/gpu/drm/i915/gem/i915_gem_phys.c:100:13: warning: mixing 
>> declarations and code is a C99 extension [-Wdeclaration-after-statement]
   dma_addr_t dma = sg_dma_address(pages->sgl);
  ^
   1 warning generated.


vim +100 drivers/gpu/drm/i915/gem/i915_gem_phys.c

f033428db28bdf Chris Wilson  2019-05-28   93  
a61170975718d5 Maarten Lankhorst 2021-03-23   94  void
f033428db28bdf Chris Wilson  2019-05-28   95  
i915_gem_object_put_pages_phys(struct drm_i915_gem_object *obj,
f033428db28bdf Chris Wilson  2019-05-28   96   
struct sg_table *pages)
f033428db28bdf Chris Wilson  2019-05-28   97  {
c54be425a38b3f Yongzhi Liu   2022-02-21   98if (!pages)
c54be425a38b3f Yongzhi Liu   2022-02-21   99return;
c6790dc22312f5 Chris Wilson  2020-02-02 @100dma_addr_t dma = 
sg_dma_address(pages->sgl);
c6790dc22312f5 Chris Wilson  2020-02-02  101void *vaddr = 
sg_page(pages->sgl);
c6790dc22312f5 Chris Wilson  2020-02-02  102  
f033428db28bdf Chris Wilson  2019-05-28  103
__i915_gem_object_release_shmem(obj, pages, false);
f033428db28bdf Chris Wilson  2019-05-28  104  
f033428db28bdf Chris Wilson  2019-05-28  105if (obj->mm.dirty) {
f033428db28bdf Chris Wilson  2019-05-28  106struct 
address_space *mapping = obj->base.filp->f_mapping;
c6790dc22312f5 Chris Wilson  2020-02-02  107void *src = 
vaddr;
f033428db28bdf Chris Wilson  2019-05-28  108int i;
f033428db28bdf Chris Wilson  2019-05-28  109  
f033428db28bdf Chris Wilson  2019-05-28  110for (i = 0; i < 
obj->base.size / PAGE_SIZE; i++) {
f033428db28bdf Chris Wilson  2019-05-28  111struct 
page *page;
f033428db28bdf Chris Wilson  2019-05-28  112char 
*dst;
f033428db28bdf Chris Wilson  2019-05-28  113  
f033428db28bdf Chris Wilson  2019-05-28  114page = 
shmem_read_mapping_page(mapping, i);
f033428db28bdf Chris Wilson  2019-05-28  115if 
(IS_ERR(page))
f033428db28bdf Chris Wilson  2019-05-28  116
continue;
f033428db28bdf Chris Wilson  2019-05-28  117  
f033428db28bdf Chris Wilson  2019-05-28  118dst = 
kmap_atomic(page);
c6790dc22312f5 Chris Wilson  2020-02-02  119
drm_clflush_virt_range(src, PAGE_SIZE);
c6790dc22312f5 Chris Wilson  2020-02-02  120
memcpy(dst, src, PAGE_SIZE);
f033428db28bdf Chris Wilson  2019-05-28  121
kunmap_atomic(dst);
f033428db28bdf Chris Wilson  2019-05-28  122  
f033428db28bdf Chris Wilson  2019-05-28  123
set_page_dirty(page);
f033428db28bdf Chris Wilson  2019-05-28  124if 
(obj->mm.madv == I915_MADV_WILLNEED)
f033428db28bdf Chris Wilson  2019-05-28  125
mark_page_accessed(page);
f033428db28bdf Chris Wilson  2019-05-28  126
put_page(page);
c6790dc22312f5 Chris Wilson  2020-02-02  127  
c6790dc22312f5 Chris Wilson  2020-02-02  128s

[Intel-gfx] [PATCH v3 09/11] drm/i915: Track leaked gt->wakerefs

2022-02-21 Thread Andrzej Hajda
From: Chris Wilson 

Track every intel_gt_pm_get() until its corresponding release in
intel_gt_pm_put() by returning a cookie to the caller for acquire that
must be passed by on rleased. When there is an imbalance, we can see who
either tried to free a stale wakeref, or who forgot to free theirs.

v2: Rebase from backporting wakeref leak (Umesh)

Signed-off-by: Chris Wilson 
Reviewed-by: Andrzej Hajda 
Signed-off-by: Andrzej Hajda 
---
 drivers/gpu/drm/i915/Kconfig.debug| 15 +++
 .../gpu/drm/i915/gem/i915_gem_execbuffer.c|  7 ++--
 .../i915/gem/selftests/i915_gem_coherency.c   | 10 +++--
 .../drm/i915/gem/selftests/i915_gem_mman.c| 14 ---
 drivers/gpu/drm/i915/gt/intel_breadcrumbs.c   | 13 --
 .../gpu/drm/i915/gt/intel_breadcrumbs_types.h |  3 +-
 drivers/gpu/drm/i915/gt/intel_engine_pm.c |  4 +-
 drivers/gpu/drm/i915/gt/intel_engine_types.h  |  2 +
 .../drm/i915/gt/intel_execlists_submission.c  |  2 +-
 drivers/gpu/drm/i915/gt/intel_gt_pm.c | 10 +++--
 drivers/gpu/drm/i915/gt/intel_gt_pm.h | 36 
 drivers/gpu/drm/i915/gt/intel_gt_pm_debugfs.c |  4 +-
 drivers/gpu/drm/i915/gt/selftest_engine_cs.c  | 20 +
 drivers/gpu/drm/i915/gt/selftest_gt_pm.c  |  5 ++-
 drivers/gpu/drm/i915/gt/selftest_reset.c  | 10 +++--
 drivers/gpu/drm/i915/gt/selftest_rps.c| 17 
 drivers/gpu/drm/i915/gt/selftest_slpc.c   | 10 +++--
 .../gpu/drm/i915/gt/uc/intel_guc_submission.c |  9 ++--
 drivers/gpu/drm/i915/i915_pmu.c   | 16 +++
 drivers/gpu/drm/i915/intel_wakeref.c  |  4 ++
 drivers/gpu/drm/i915/intel_wakeref.h  | 42 +++
 21 files changed, 182 insertions(+), 71 deletions(-)

diff --git a/drivers/gpu/drm/i915/Kconfig.debug 
b/drivers/gpu/drm/i915/Kconfig.debug
index 8b1973146e848..3bdc73f30a9e1 100644
--- a/drivers/gpu/drm/i915/Kconfig.debug
+++ b/drivers/gpu/drm/i915/Kconfig.debug
@@ -48,6 +48,7 @@ config DRM_I915_DEBUG
select DRM_I915_DEBUG_MMIO
select DRM_I915_TRACK_WAKEREF
select DRM_I915_DEBUG_RUNTIME_PM
+   select DRM_I915_DEBUG_WAKEREF
select DRM_I915_SW_FENCE_DEBUG_OBJECTS
select DRM_I915_SELFTEST
select BROKEN # for prototype uAPI
@@ -257,3 +258,17 @@ config DRM_I915_DEBUG_RUNTIME_PM
  Recommended for driver developers only.
 
  If in doubt, say "N"
+
+config DRM_I915_DEBUG_WAKEREF
+   bool "Enable extra tracking for wakerefs"
+   depends on DRM_I915
+   default n
+   select STACKDEPOT
+   select STACKTRACE
+   select DRM_I915_TRACK_WAKEREF
+   help
+ Choose this option to turn on extra state checking and usage
+ tracking for the wakerefPM functionality. This may introduce
+ overhead during driver runtime.
+
+ If in doubt, say "N"
diff --git a/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c 
b/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c
index 13c975da77474..4b6c144f706da 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c
+++ b/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c
@@ -252,6 +252,7 @@ struct i915_execbuffer {
struct intel_gt *gt; /* gt for the execbuf */
struct intel_context *context; /* logical state for the request */
struct i915_gem_context *gem_context; /** caller's context */
+   intel_wakeref_t wakeref;
 
/** our requests to build */
struct i915_request *requests[MAX_ENGINE_INSTANCE + 1];
@@ -2679,7 +2680,7 @@ eb_select_engine(struct i915_execbuffer *eb)
 
for_each_child(ce, child)
intel_context_get(child);
-   intel_gt_pm_get(ce->engine->gt);
+   eb->wakeref = intel_gt_pm_get(ce->engine->gt);
 
if (!test_bit(CONTEXT_ALLOC_BIT, >flags)) {
err = intel_context_alloc_state(ce);
@@ -2713,7 +2714,7 @@ eb_select_engine(struct i915_execbuffer *eb)
return err;
 
 err:
-   intel_gt_pm_put(ce->engine->gt);
+   intel_gt_pm_put(ce->engine->gt, eb->wakeref);
for_each_child(ce, child)
intel_context_put(child);
intel_context_put(ce);
@@ -2725,7 +2726,7 @@ eb_put_engine(struct i915_execbuffer *eb)
 {
struct intel_context *child;
 
-   intel_gt_pm_put(eb->gt);
+   intel_gt_pm_put(eb->context->engine->gt, eb->wakeref);
for_each_child(eb->context, child)
intel_context_put(child);
intel_context_put(eb->context);
diff --git a/drivers/gpu/drm/i915/gem/selftests/i915_gem_coherency.c 
b/drivers/gpu/drm/i915/gem/selftests/i915_gem_coherency.c
index 13b088cc787eb..553f2730c2a76 100644
--- a/drivers/gpu/drm/i915/gem/selftests/i915_gem_coherency.c
+++ b/drivers/gpu/drm/i915/gem/selftests/i915_gem_coherency.c
@@ -85,6 +85,7 @@ static int cpu_get(struct context *ctx, unsigned long offset, 
u32 *v)
 
 static int gtt_set(struct context *ctx, unsigned long offset, u32 v)
 {
+   intel_wakeref_t wakeref;
struct i915_vma *vma;
u32 __iomem *map;
  

[Intel-gfx] [PATCH v3 11/11] drm/i915: replace Intel internal tracker with kernel core ref_tracker

2022-02-21 Thread Andrzej Hajda
Beside reusing existing code, the main advantage of ref_tracker is
tracking per instance of wakeref. It allows also to catch double
put.
On the other side we lose information about the first acquire and
the last release, but the advantages outweigh it.

Signed-off-by: Andrzej Hajda 
Reviewed-by: Chris Wilson 
---
 drivers/gpu/drm/i915/Kconfig.debug|  11 +-
 drivers/gpu/drm/i915/Makefile |   3 -
 .../drm/i915/display/intel_display_power.c|   2 +-
 drivers/gpu/drm/i915/gt/intel_engine_pm.c |   2 +-
 drivers/gpu/drm/i915/gt/intel_gt_pm.c |   2 +-
 drivers/gpu/drm/i915/intel_runtime_pm.c   |  25 +-
 drivers/gpu/drm/i915/intel_runtime_pm.h   |   2 +-
 drivers/gpu/drm/i915/intel_wakeref.c  |   8 +-
 drivers/gpu/drm/i915/intel_wakeref.h  |  72 +-
 drivers/gpu/drm/i915/intel_wakeref_tracker.c  | 234 --
 drivers/gpu/drm/i915/intel_wakeref_tracker.h  |  76 --
 11 files changed, 87 insertions(+), 350 deletions(-)
 delete mode 100644 drivers/gpu/drm/i915/intel_wakeref_tracker.c
 delete mode 100644 drivers/gpu/drm/i915/intel_wakeref_tracker.h

diff --git a/drivers/gpu/drm/i915/Kconfig.debug 
b/drivers/gpu/drm/i915/Kconfig.debug
index 3bdc73f30a9e1..6c57f3e265f20 100644
--- a/drivers/gpu/drm/i915/Kconfig.debug
+++ b/drivers/gpu/drm/i915/Kconfig.debug
@@ -32,6 +32,7 @@ config DRM_I915_DEBUG
select DEBUG_FS
select PREEMPT_COUNT
select I2C_CHARDEV
+   select REF_TRACKER
select STACKDEPOT
select STACKTRACE
select DRM_DP_AUX_CHARDEV
@@ -46,7 +47,6 @@ config DRM_I915_DEBUG
select DRM_I915_DEBUG_GEM
select DRM_I915_DEBUG_GEM_ONCE
select DRM_I915_DEBUG_MMIO
-   select DRM_I915_TRACK_WAKEREF
select DRM_I915_DEBUG_RUNTIME_PM
select DRM_I915_DEBUG_WAKEREF
select DRM_I915_SW_FENCE_DEBUG_OBJECTS
@@ -238,18 +238,13 @@ config DRM_I915_DEBUG_VBLANK_EVADE
 
  If in doubt, say "N".
 
-config DRM_I915_TRACK_WAKEREF
-   depends on STACKDEPOT
-   depends on STACKTRACE
-   bool
-
 config DRM_I915_DEBUG_RUNTIME_PM
bool "Enable extra state checking for runtime PM"
depends on DRM_I915
default n
+   select REF_TRACKER
select STACKDEPOT
select STACKTRACE
-   select DRM_I915_TRACK_WAKEREF
help
  Choose this option to turn on extra state checking for the
  runtime PM functionality. This may introduce overhead during
@@ -263,9 +258,9 @@ config DRM_I915_DEBUG_WAKEREF
bool "Enable extra tracking for wakerefs"
depends on DRM_I915
default n
+   select REF_TRACKER
select STACKDEPOT
select STACKTRACE
-   select DRM_I915_TRACK_WAKEREF
help
  Choose this option to turn on extra state checking and usage
  tracking for the wakerefPM functionality. This may introduce
diff --git a/drivers/gpu/drm/i915/Makefile b/drivers/gpu/drm/i915/Makefile
index 88a403d3294cb..1f8d71430e2e6 100644
--- a/drivers/gpu/drm/i915/Makefile
+++ b/drivers/gpu/drm/i915/Makefile
@@ -76,9 +76,6 @@ i915-$(CONFIG_DEBUG_FS) += \
display/intel_display_debugfs.o \
display/intel_pipe_crc.o
 
-i915-$(CONFIG_DRM_I915_TRACK_WAKEREF) += \
-   intel_wakeref_tracker.o
-
 i915-$(CONFIG_PERF_EVENTS) += i915_pmu.o
 
 # "Graphics Technology" (aka we talk to the gpu)
diff --git a/drivers/gpu/drm/i915/display/intel_display_power.c 
b/drivers/gpu/drm/i915/display/intel_display_power.c
index 9ebae7ac32356..0e1bf724f89b5 100644
--- a/drivers/gpu/drm/i915/display/intel_display_power.c
+++ b/drivers/gpu/drm/i915/display/intel_display_power.c
@@ -2107,7 +2107,7 @@ print_async_put_domains_state(struct i915_power_domains 
*power_domains)
 struct drm_i915_private,
 power_domains);
 
-   drm_dbg(>drm, "async_put_wakeref %u\n",
+   drm_dbg(>drm, "async_put_wakeref %lu\n",
power_domains->async_put_wakeref);
 
print_power_domains(power_domains, "async_put_domains[0]",
diff --git a/drivers/gpu/drm/i915/gt/intel_engine_pm.c 
b/drivers/gpu/drm/i915/gt/intel_engine_pm.c
index 52e46e7830ff5..cf8cc348942cb 100644
--- a/drivers/gpu/drm/i915/gt/intel_engine_pm.c
+++ b/drivers/gpu/drm/i915/gt/intel_engine_pm.c
@@ -273,7 +273,7 @@ void intel_engine_init__pm(struct intel_engine_cs *engine)
 {
struct intel_runtime_pm *rpm = engine->uncore->rpm;
 
-   intel_wakeref_init(>wakeref, rpm, _ops);
+   intel_wakeref_init(>wakeref, rpm, _ops, engine->name);
intel_engine_init_heartbeat(engine);
 }
 
diff --git a/drivers/gpu/drm/i915/gt/intel_gt_pm.c 
b/drivers/gpu/drm/i915/gt/intel_gt_pm.c
index 7ee65a93f926f..01a055d0d0989 100644
--- a/drivers/gpu/drm/i915/gt/intel_gt_pm.c
+++ b/drivers/gpu/drm/i915/gt/intel_gt_pm.c
@@ -129,7 +129,7 @@ static const struct intel_wakeref_ops wf_ops = {
 
 void 

[Intel-gfx] [PATCH v3 06/11] lib/ref_tracker: add printing to memory buffer

2022-02-21 Thread Andrzej Hajda
In case one wants to show stats via debugfs.

Signed-off-by: Andrzej Hajda 
Reviewed-by: Chris Wilson 
---
 include/linux/ref_tracker.h |  8 ++
 lib/ref_tracker.c   | 56 +++--
 2 files changed, 56 insertions(+), 8 deletions(-)

diff --git a/include/linux/ref_tracker.h b/include/linux/ref_tracker.h
index a2cf1f6309adb..2fdbfd2e14797 100644
--- a/include/linux/ref_tracker.h
+++ b/include/linux/ref_tracker.h
@@ -50,6 +50,8 @@ void __ref_tracker_dir_print(struct ref_tracker_dir *dir,
 void ref_tracker_dir_print(struct ref_tracker_dir *dir,
   unsigned int display_limit);
 
+int ref_tracker_dir_snprint(struct ref_tracker_dir *dir, char *buf, size_t 
size);
+
 int ref_tracker_alloc(struct ref_tracker_dir *dir,
  struct ref_tracker **trackerp, gfp_t gfp);
 
@@ -78,6 +80,12 @@ static inline void ref_tracker_dir_print(struct 
ref_tracker_dir *dir,
 {
 }
 
+static inline int ref_tracker_dir_snprint(struct ref_tracker_dir *dir,
+ char *buf, size_t size)
+{
+   return 0;
+}
+
 static inline int ref_tracker_alloc(struct ref_tracker_dir *dir,
struct ref_tracker **trackerp,
gfp_t gfp)
diff --git a/lib/ref_tracker.c b/lib/ref_tracker.c
index ab1253fde244e..2ef4596b6b36f 100644
--- a/lib/ref_tracker.c
+++ b/lib/ref_tracker.c
@@ -62,8 +62,27 @@ ref_tracker_get_stats(struct ref_tracker_dir *dir, unsigned 
int limit)
return stats;
 }
 
-void __ref_tracker_dir_print(struct ref_tracker_dir *dir,
-  unsigned int display_limit)
+struct ostream {
+   char *buf;
+   int size, used;
+};
+
+#define pr_ostream(stream, fmt, args...) \
+({ \
+   struct ostream *_s = (stream); \
+\
+   if (!_s->buf) { \
+   pr_err(fmt, ##args); \
+   } else { \
+   int ret, len = _s->size - _s->used; \
+   ret = snprintf(_s->buf + _s->used, len, pr_fmt(fmt), ##args); \
+   _s->used += min(ret, len); \
+   } \
+})
+
+static void
+__ref_tracker_dir_pr_ostream(struct ref_tracker_dir *dir,
+unsigned int display_limit, struct ostream *s)
 {
struct ref_tracker_dir_stats *stats;
unsigned int i = 0, skipped;
@@ -77,8 +96,8 @@ void __ref_tracker_dir_print(struct ref_tracker_dir *dir,
 
stats = ref_tracker_get_stats(dir, display_limit);
if (IS_ERR(stats)) {
-   pr_err("%s@%pK: couldn't get stats, error %pe\n",
-  dir->name, dir, stats);
+   pr_ostream(s, "%s@%pK: couldn't get stats, error %pe\n",
+  dir->name, dir, stats);
return;
}
 
@@ -88,19 +107,27 @@ void __ref_tracker_dir_print(struct ref_tracker_dir *dir,
stack = stats->stacks[i].stack_handle;
if (sbuf && !stack_depot_snprint(stack, sbuf, STACK_BUF_SIZE, 
4))
sbuf[0] = 0;
-   pr_err("%s@%pK has %d/%d users at\n%s\n", dir->name, dir,
-  stats->stacks[i].count, stats->total, sbuf);
+   pr_ostream(s, "%s@%pK has %d/%d users at\n%s\n", dir->name, dir,
+  stats->stacks[i].count, stats->total, sbuf);
skipped -= stats->stacks[i].count;
}
 
if (skipped)
-   pr_err("%s@%pK skipped reports about %d/%d users.\n",
-  dir->name, dir, skipped, stats->total);
+   pr_ostream(s, "%s@%pK skipped reports about %d/%d users.\n",
+  dir->name, dir, skipped, stats->total);
 
kfree(sbuf);
 
kfree(stats);
 }
+
+void __ref_tracker_dir_print(struct ref_tracker_dir *dir,
+  unsigned int display_limit)
+{
+   struct ostream os = {};
+
+   __ref_tracker_dir_pr_ostream(dir, display_limit, );
+}
 EXPORT_SYMBOL(__ref_tracker_dir_print);
 
 void ref_tracker_dir_print(struct ref_tracker_dir *dir,
@@ -114,6 +141,19 @@ void ref_tracker_dir_print(struct ref_tracker_dir *dir,
 }
 EXPORT_SYMBOL(ref_tracker_dir_print);
 
+int ref_tracker_dir_snprint(struct ref_tracker_dir *dir, char *buf, size_t 
size)
+{
+   struct ostream os = { .buf = buf, .size = size };
+   unsigned long flags;
+
+   spin_lock_irqsave(>lock, flags);
+   __ref_tracker_dir_pr_ostream(dir, 16, );
+   spin_unlock_irqrestore(>lock, flags);
+
+   return os.used;
+}
+EXPORT_SYMBOL(ref_tracker_dir_snprint);
+
 void ref_tracker_dir_exit(struct ref_tracker_dir *dir)
 {
struct ref_tracker *tracker, *n;
-- 
2.25.1



[Intel-gfx] [PATCH v3 10/11] drm/i915: Correct type of wakeref variable

2022-02-21 Thread Andrzej Hajda
Wakeref has dedicated type. Assumption it will be int
compatible forever is incorrect.

Signed-off-by: Andrzej Hajda 
---
 drivers/gpu/drm/i915/gt/uc/intel_guc_submission.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/i915/gt/uc/intel_guc_submission.c 
b/drivers/gpu/drm/i915/gt/uc/intel_guc_submission.c
index 7799939c38945..b308dd0866eaf 100644
--- a/drivers/gpu/drm/i915/gt/uc/intel_guc_submission.c
+++ b/drivers/gpu/drm/i915/gt/uc/intel_guc_submission.c
@@ -2797,7 +2797,7 @@ static void destroyed_worker_func(struct work_struct *w)
struct intel_guc *guc = container_of(w, struct intel_guc,
 submission_state.destroyed_worker);
struct intel_gt *gt = guc_to_gt(guc);
-   int tmp;
+   intel_wakeref_t tmp;
 
with_intel_gt_pm(gt, tmp)
deregister_destroyed_contexts(guc);
-- 
2.25.1



[Intel-gfx] [PATCH v3 08/11] drm/i915: Separate wakeref tracking

2022-02-21 Thread Andrzej Hajda
From: Chris Wilson 

Extract the callstack tracking of intel_runtime_pm.c into its own
utility so that that we can reuse it for other online debugging of
scoped wakerefs.

Signed-off-by: Chris Wilson 
Reviewed-by: Andrzej Hajda 
Signed-off-by: Andrzej Hajda 
---
 drivers/gpu/drm/i915/Kconfig.debug   |   9 +
 drivers/gpu/drm/i915/Makefile|   4 +
 drivers/gpu/drm/i915/intel_runtime_pm.c  | 244 +++
 drivers/gpu/drm/i915/intel_runtime_pm.h  |  10 +-
 drivers/gpu/drm/i915/intel_wakeref.h |   6 +-
 drivers/gpu/drm/i915/intel_wakeref_tracker.c | 234 ++
 drivers/gpu/drm/i915/intel_wakeref_tracker.h |  76 ++
 7 files changed, 355 insertions(+), 228 deletions(-)
 create mode 100644 drivers/gpu/drm/i915/intel_wakeref_tracker.c
 create mode 100644 drivers/gpu/drm/i915/intel_wakeref_tracker.h

diff --git a/drivers/gpu/drm/i915/Kconfig.debug 
b/drivers/gpu/drm/i915/Kconfig.debug
index e7fd3e76f8a20..8b1973146e848 100644
--- a/drivers/gpu/drm/i915/Kconfig.debug
+++ b/drivers/gpu/drm/i915/Kconfig.debug
@@ -33,6 +33,7 @@ config DRM_I915_DEBUG
select PREEMPT_COUNT
select I2C_CHARDEV
select STACKDEPOT
+   select STACKTRACE
select DRM_DP_AUX_CHARDEV
select X86_MSR # used by igt/pm_rpm
select DRM_VGEM # used by igt/prime_vgem (dmabuf interop checks)
@@ -45,6 +46,7 @@ config DRM_I915_DEBUG
select DRM_I915_DEBUG_GEM
select DRM_I915_DEBUG_GEM_ONCE
select DRM_I915_DEBUG_MMIO
+   select DRM_I915_TRACK_WAKEREF
select DRM_I915_DEBUG_RUNTIME_PM
select DRM_I915_SW_FENCE_DEBUG_OBJECTS
select DRM_I915_SELFTEST
@@ -235,11 +237,18 @@ config DRM_I915_DEBUG_VBLANK_EVADE
 
  If in doubt, say "N".
 
+config DRM_I915_TRACK_WAKEREF
+   depends on STACKDEPOT
+   depends on STACKTRACE
+   bool
+
 config DRM_I915_DEBUG_RUNTIME_PM
bool "Enable extra state checking for runtime PM"
depends on DRM_I915
default n
select STACKDEPOT
+   select STACKTRACE
+   select DRM_I915_TRACK_WAKEREF
help
  Choose this option to turn on extra state checking for the
  runtime PM functionality. This may introduce overhead during
diff --git a/drivers/gpu/drm/i915/Makefile b/drivers/gpu/drm/i915/Makefile
index 9d588d936e3dc..88a403d3294cb 100644
--- a/drivers/gpu/drm/i915/Makefile
+++ b/drivers/gpu/drm/i915/Makefile
@@ -75,6 +75,10 @@ i915-$(CONFIG_DEBUG_FS) += \
i915_debugfs_params.o \
display/intel_display_debugfs.o \
display/intel_pipe_crc.o
+
+i915-$(CONFIG_DRM_I915_TRACK_WAKEREF) += \
+   intel_wakeref_tracker.o
+
 i915-$(CONFIG_PERF_EVENTS) += i915_pmu.o
 
 # "Graphics Technology" (aka we talk to the gpu)
diff --git a/drivers/gpu/drm/i915/intel_runtime_pm.c 
b/drivers/gpu/drm/i915/intel_runtime_pm.c
index 6ed5786bcd299..7bd10efa56bf3 100644
--- a/drivers/gpu/drm/i915/intel_runtime_pm.c
+++ b/drivers/gpu/drm/i915/intel_runtime_pm.c
@@ -52,182 +52,37 @@
 
 #if IS_ENABLED(CONFIG_DRM_I915_DEBUG_RUNTIME_PM)
 
-#include 
-
-#define STACKDEPTH 8
-
-static noinline depot_stack_handle_t __save_depot_stack(void)
-{
-   unsigned long entries[STACKDEPTH];
-   unsigned int n;
-
-   n = stack_trace_save(entries, ARRAY_SIZE(entries), 1);
-   return stack_depot_save(entries, n, GFP_NOWAIT | __GFP_NOWARN);
-}
-
 static void init_intel_runtime_pm_wakeref(struct intel_runtime_pm *rpm)
 {
-   spin_lock_init(>debug.lock);
-   stack_depot_init();
+   intel_wakeref_tracker_init(>debug);
 }
 
-static noinline depot_stack_handle_t
+static intel_wakeref_t
 track_intel_runtime_pm_wakeref(struct intel_runtime_pm *rpm)
 {
-   depot_stack_handle_t stack, *stacks;
-   unsigned long flags;
-
-   if (rpm->no_wakeref_tracking)
-   return -1;
-
-   stack = __save_depot_stack();
-   if (!stack)
+   if (!rpm->available)
return -1;
 
-   spin_lock_irqsave(>debug.lock, flags);
-
-   if (!rpm->debug.count)
-   rpm->debug.last_acquire = stack;
-
-   stacks = krealloc(rpm->debug.owners,
- (rpm->debug.count + 1) * sizeof(*stacks),
- GFP_NOWAIT | __GFP_NOWARN);
-   if (stacks) {
-   stacks[rpm->debug.count++] = stack;
-   rpm->debug.owners = stacks;
-   } else {
-   stack = -1;
-   }
-
-   spin_unlock_irqrestore(>debug.lock, flags);
-
-   return stack;
+   return intel_wakeref_tracker_add(>debug);
 }
 
 static void untrack_intel_runtime_pm_wakeref(struct intel_runtime_pm *rpm,
-depot_stack_handle_t stack)
+intel_wakeref_t wakeref)
 {
-   struct drm_i915_private *i915 = container_of(rpm,
-struct drm_i915_private,
-

[Intel-gfx] [PATCH v3 07/11] lib/ref_tracker: remove warnings in case of allocation failure

2022-02-21 Thread Andrzej Hajda
Library can handle allocation failures. To avoid allocation warnings
__GFP_NOWARN has been added everywhere. Moreover GFP_ATOMIC has been
replaced with GFP_NOWAIT in case of stack allocation on tracker free
call.

Signed-off-by: Andrzej Hajda 
---
 lib/ref_tracker.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/lib/ref_tracker.c b/lib/ref_tracker.c
index 2ef4596b6b36f..cae4498fcfd70 100644
--- a/lib/ref_tracker.c
+++ b/lib/ref_tracker.c
@@ -189,7 +189,7 @@ int ref_tracker_alloc(struct ref_tracker_dir *dir,
unsigned long entries[REF_TRACKER_STACK_ENTRIES];
struct ref_tracker *tracker;
unsigned int nr_entries;
-   gfp_t gfp_mask = gfp;
+   gfp_t gfp_mask = gfp | __GFP_NOWARN;
unsigned long flags;
 
WARN_ON_ONCE(dir->dead);
@@ -237,7 +237,8 @@ int ref_tracker_free(struct ref_tracker_dir *dir,
return -EEXIST;
}
nr_entries = stack_trace_save(entries, ARRAY_SIZE(entries), 1);
-   stack_handle = stack_depot_save(entries, nr_entries, GFP_ATOMIC);
+   stack_handle = stack_depot_save(entries, nr_entries,
+   GFP_NOWAIT | __GFP_NOWARN);
 
spin_lock_irqsave(>lock, flags);
if (tracker->dead) {
-- 
2.25.1



[Intel-gfx] [PATCH v3 05/11] lib/ref_tracker: __ref_tracker_dir_print improve printing

2022-02-21 Thread Andrzej Hajda
To improve readibility of ref_tracker printing following changes
have been performed:
- reports are printed per stack_handle - log is more compact,
- added display name for ref_tracker_dir,
- stack trace is printed indented, in the same printk call,
- total number of references is printed every time,
- print info about dropped references.

Signed-off-by: Andrzej Hajda 
---
 include/linux/ref_tracker.h | 15 +--
 lib/ref_tracker.c   | 90 -
 2 files changed, 91 insertions(+), 14 deletions(-)

diff --git a/include/linux/ref_tracker.h b/include/linux/ref_tracker.h
index 3e9e9df2a41f5..a2cf1f6309adb 100644
--- a/include/linux/ref_tracker.h
+++ b/include/linux/ref_tracker.h
@@ -17,12 +17,19 @@ struct ref_tracker_dir {
booldead;
struct list_headlist; /* List of active trackers */
struct list_headquarantine; /* List of dead trackers */
+   charname[32];
 #endif
 };
 
 #ifdef CONFIG_REF_TRACKER
-static inline void ref_tracker_dir_init(struct ref_tracker_dir *dir,
-   unsigned int quarantine_count)
+
+// Temporary allow two and three arguments, until consumers are converted
+#define ref_tracker_dir_init(_d, _q, args...) _ref_tracker_dir_init(_d, _q, 
##args, #_d)
+#define _ref_tracker_dir_init(_d, _q, _n, ...) __ref_tracker_dir_init(_d, _q, 
_n)
+
+static inline void __ref_tracker_dir_init(struct ref_tracker_dir *dir,
+   unsigned int quarantine_count,
+   const char *name)
 {
INIT_LIST_HEAD(>list);
INIT_LIST_HEAD(>quarantine);
@@ -31,6 +38,7 @@ static inline void ref_tracker_dir_init(struct 
ref_tracker_dir *dir,
dir->dead = false;
refcount_set(>untracked, 1);
refcount_set(>no_tracker, 1);
+   strlcpy(dir->name, name, sizeof(dir->name));
stack_depot_init();
 }
 
@@ -51,7 +59,8 @@ int ref_tracker_free(struct ref_tracker_dir *dir,
 #else /* CONFIG_REF_TRACKER */
 
 static inline void ref_tracker_dir_init(struct ref_tracker_dir *dir,
-   unsigned int quarantine_count)
+   unsigned int quarantine_count,
+   ...)
 {
 }
 
diff --git a/lib/ref_tracker.c b/lib/ref_tracker.c
index 5e9f90bbf771b..ab1253fde244e 100644
--- a/lib/ref_tracker.c
+++ b/lib/ref_tracker.c
@@ -1,11 +1,16 @@
 // SPDX-License-Identifier: GPL-2.0-or-later
+
+#define pr_fmt(fmt) "ref_tracker: " fmt
+
 #include 
+#include 
 #include 
 #include 
 #include 
 #include 
 
 #define REF_TRACKER_STACK_ENTRIES 16
+#define STACK_BUF_SIZE 1024
 
 struct ref_tracker {
struct list_headhead;   /* anchor into dir->list or 
dir->quarantine */
@@ -14,24 +19,87 @@ struct ref_tracker {
depot_stack_handle_tfree_stack_handle;
 };
 
-void __ref_tracker_dir_print(struct ref_tracker_dir *dir,
-  unsigned int display_limit)
+struct ref_tracker_dir_stats {
+   int total;
+   int count;
+   struct {
+   depot_stack_handle_t stack_handle;
+   unsigned int count;
+   } stacks[];
+};
+
+static struct ref_tracker_dir_stats *
+ref_tracker_get_stats(struct ref_tracker_dir *dir, unsigned int limit)
 {
+   struct ref_tracker_dir_stats *stats;
struct ref_tracker *tracker;
-   unsigned int i = 0;
 
-   lockdep_assert_held(>lock);
+   stats = kmalloc(struct_size(stats, stacks, limit),
+   GFP_NOWAIT | __GFP_NOWARN);
+   if (!stats)
+   return ERR_PTR(-ENOMEM);
+   stats->total = 0;
+   stats->count = 0;
 
list_for_each_entry(tracker, >list, head) {
-   if (i < display_limit) {
-   pr_err("leaked reference.\n");
-   if (tracker->alloc_stack_handle)
-   stack_depot_print(tracker->alloc_stack_handle);
-   i++;
-   } else {
-   break;
+   depot_stack_handle_t stack = tracker->alloc_stack_handle;
+   int i;
+
+   ++stats->total;
+   for (i = 0; i < stats->count; ++i)
+   if (stats->stacks[i].stack_handle == stack)
+   break;
+   if (i >= limit)
+   continue;
+   if (i >= stats->count) {
+   stats->stacks[i].stack_handle = stack;
+   stats->stacks[i].count = 0;
+   ++stats->count;
}
+   ++stats->stacks[i].count;
+   }
+
+   return stats;
+}
+
+void __ref_tracker_dir_print(struct ref_tracker_dir *dir,
+  unsigned int display_limit)
+{
+   struct ref_tracker_dir_stats *stats;
+   unsigned int i = 0, skipped;
+   depot_stack_handle_t stack;
+  

[Intel-gfx] [PATCH v3 04/11] lib/ref_tracker: add unlocked leak print helper

2022-02-21 Thread Andrzej Hajda
To have reliable detection of leaks, caller must be able to check under the same
lock both: tracked counter and the leaks. dir.lock is natural candidate for such
lock and unlocked print helper can be called with this lock taken.
As a bonus we can reuse this helper in ref_tracker_dir_exit.

Signed-off-by: Andrzej Hajda 
Reviewed-by: Chris Wilson 
---
 include/linux/ref_tracker.h |  8 +
 lib/ref_tracker.c   | 66 +
 2 files changed, 46 insertions(+), 28 deletions(-)

diff --git a/include/linux/ref_tracker.h b/include/linux/ref_tracker.h
index 9ca353ab712b5..3e9e9df2a41f5 100644
--- a/include/linux/ref_tracker.h
+++ b/include/linux/ref_tracker.h
@@ -36,6 +36,9 @@ static inline void ref_tracker_dir_init(struct 
ref_tracker_dir *dir,
 
 void ref_tracker_dir_exit(struct ref_tracker_dir *dir);
 
+void __ref_tracker_dir_print(struct ref_tracker_dir *dir,
+  unsigned int display_limit);
+
 void ref_tracker_dir_print(struct ref_tracker_dir *dir,
   unsigned int display_limit);
 
@@ -56,6 +59,11 @@ static inline void ref_tracker_dir_exit(struct 
ref_tracker_dir *dir)
 {
 }
 
+static inline void __ref_tracker_dir_print(struct ref_tracker_dir *dir,
+  unsigned int display_limit)
+{
+}
+
 static inline void ref_tracker_dir_print(struct ref_tracker_dir *dir,
 unsigned int display_limit)
 {
diff --git a/lib/ref_tracker.c b/lib/ref_tracker.c
index dc7b14aa3431e..5e9f90bbf771b 100644
--- a/lib/ref_tracker.c
+++ b/lib/ref_tracker.c
@@ -14,6 +14,38 @@ struct ref_tracker {
depot_stack_handle_tfree_stack_handle;
 };
 
+void __ref_tracker_dir_print(struct ref_tracker_dir *dir,
+  unsigned int display_limit)
+{
+   struct ref_tracker *tracker;
+   unsigned int i = 0;
+
+   lockdep_assert_held(>lock);
+
+   list_for_each_entry(tracker, >list, head) {
+   if (i < display_limit) {
+   pr_err("leaked reference.\n");
+   if (tracker->alloc_stack_handle)
+   stack_depot_print(tracker->alloc_stack_handle);
+   i++;
+   } else {
+   break;
+   }
+   }
+}
+EXPORT_SYMBOL(__ref_tracker_dir_print);
+
+void ref_tracker_dir_print(struct ref_tracker_dir *dir,
+  unsigned int display_limit)
+{
+   unsigned long flags;
+
+   spin_lock_irqsave(>lock, flags);
+   __ref_tracker_dir_print(dir, display_limit);
+   spin_unlock_irqrestore(>lock, flags);
+}
+EXPORT_SYMBOL(ref_tracker_dir_print);
+
 void ref_tracker_dir_exit(struct ref_tracker_dir *dir)
 {
struct ref_tracker *tracker, *n;
@@ -27,13 +59,13 @@ void ref_tracker_dir_exit(struct ref_tracker_dir *dir)
kfree(tracker);
dir->quarantine_avail++;
}
-   list_for_each_entry_safe(tracker, n, >list, head) {
-   pr_err("leaked reference.\n");
-   if (tracker->alloc_stack_handle)
-   stack_depot_print(tracker->alloc_stack_handle);
+   if (!list_empty(>list)) {
+   __ref_tracker_dir_print(dir, 16);
leak = true;
-   list_del(>head);
-   kfree(tracker);
+   list_for_each_entry_safe(tracker, n, >list, head) {
+   list_del(>head);
+   kfree(tracker);
+   }
}
spin_unlock_irqrestore(>lock, flags);
WARN_ON_ONCE(leak);
@@ -42,28 +74,6 @@ void ref_tracker_dir_exit(struct ref_tracker_dir *dir)
 }
 EXPORT_SYMBOL(ref_tracker_dir_exit);
 
-void ref_tracker_dir_print(struct ref_tracker_dir *dir,
-  unsigned int display_limit)
-{
-   struct ref_tracker *tracker;
-   unsigned long flags;
-   unsigned int i = 0;
-
-   spin_lock_irqsave(>lock, flags);
-   list_for_each_entry(tracker, >list, head) {
-   if (i < display_limit) {
-   pr_err("leaked reference.\n");
-   if (tracker->alloc_stack_handle)
-   stack_depot_print(tracker->alloc_stack_handle);
-   i++;
-   } else {
-   break;
-   }
-   }
-   spin_unlock_irqrestore(>lock, flags);
-}
-EXPORT_SYMBOL(ref_tracker_dir_print);
-
 int ref_tracker_alloc(struct ref_tracker_dir *dir,
  struct ref_tracker **trackerp,
  gfp_t gfp)
-- 
2.25.1



[Intel-gfx] [PATCH v3 03/11] [DO NOT MERGE] ref_tracker: remove filter_irq_stacks() call

2022-02-21 Thread Andrzej Hajda
From: Eric Dumazet 

After commit e94006608949 ("lib/stackdepot: always do filter_irq_stacks()
in stack_depot_save()") it became unnecessary to filter the stack
before calling stack_depot_save().

Signed-off-by: Eric Dumazet 
Cc: Marco Elver 
Cc: Alexander Potapenko 
Cc: Dmitry Vyukov 
Signed-off-by: David S. Miller 
Signed-off-by: Andrzej Hajda 
---
 lib/ref_tracker.c | 2 --
 1 file changed, 2 deletions(-)

diff --git a/lib/ref_tracker.c b/lib/ref_tracker.c
index 9c0c2e09df666..dc7b14aa3431e 100644
--- a/lib/ref_tracker.c
+++ b/lib/ref_tracker.c
@@ -89,7 +89,6 @@ int ref_tracker_alloc(struct ref_tracker_dir *dir,
return -ENOMEM;
}
nr_entries = stack_trace_save(entries, ARRAY_SIZE(entries), 1);
-   nr_entries = filter_irq_stacks(entries, nr_entries);
tracker->alloc_stack_handle = stack_depot_save(entries, nr_entries, 
gfp);
 
spin_lock_irqsave(>lock, flags);
@@ -120,7 +119,6 @@ int ref_tracker_free(struct ref_tracker_dir *dir,
return -EEXIST;
}
nr_entries = stack_trace_save(entries, ARRAY_SIZE(entries), 1);
-   nr_entries = filter_irq_stacks(entries, nr_entries);
stack_handle = stack_depot_save(entries, nr_entries, GFP_ATOMIC);
 
spin_lock_irqsave(>lock, flags);
-- 
2.25.1



[Intel-gfx] [PATCH v3 02/11] [DO NOT MERGE] ref_tracker: add a count of untracked references

2022-02-21 Thread Andrzej Hajda
From: Eric Dumazet 

We are still chasing a netdev refcount imbalance, and we suspect
we have one rogue dev_put() that is consuming a reference taken
from a dev_hold_track()

To detect this case, allow ref_tracker_alloc() and ref_tracker_free()
to be called with a NULL @trackerp parameter, and use a dedicated
refcount_t just for them.

Signed-off-by: Eric Dumazet 
Signed-off-by: David S. Miller 
Signed-off-by: Andrzej Hajda 
---
 include/linux/ref_tracker.h |  2 ++
 lib/ref_tracker.c   | 12 +++-
 2 files changed, 13 insertions(+), 1 deletion(-)

diff --git a/include/linux/ref_tracker.h b/include/linux/ref_tracker.h
index a443abda937d8..9ca353ab712b5 100644
--- a/include/linux/ref_tracker.h
+++ b/include/linux/ref_tracker.h
@@ -13,6 +13,7 @@ struct ref_tracker_dir {
spinlock_t  lock;
unsigned intquarantine_avail;
refcount_t  untracked;
+   refcount_t  no_tracker;
booldead;
struct list_headlist; /* List of active trackers */
struct list_headquarantine; /* List of dead trackers */
@@ -29,6 +30,7 @@ static inline void ref_tracker_dir_init(struct 
ref_tracker_dir *dir,
dir->quarantine_avail = quarantine_count;
dir->dead = false;
refcount_set(>untracked, 1);
+   refcount_set(>no_tracker, 1);
stack_depot_init();
 }
 
diff --git a/lib/ref_tracker.c b/lib/ref_tracker.c
index 32ff6bd497f8e..9c0c2e09df666 100644
--- a/lib/ref_tracker.c
+++ b/lib/ref_tracker.c
@@ -38,6 +38,7 @@ void ref_tracker_dir_exit(struct ref_tracker_dir *dir)
spin_unlock_irqrestore(>lock, flags);
WARN_ON_ONCE(leak);
WARN_ON_ONCE(refcount_read(>untracked) != 1);
+   WARN_ON_ONCE(refcount_read(>no_tracker) != 1);
 }
 EXPORT_SYMBOL(ref_tracker_dir_exit);
 
@@ -75,6 +76,10 @@ int ref_tracker_alloc(struct ref_tracker_dir *dir,
 
WARN_ON_ONCE(dir->dead);
 
+   if (!trackerp) {
+   refcount_inc(>no_tracker);
+   return 0;
+   }
if (gfp & __GFP_DIRECT_RECLAIM)
gfp_mask |= __GFP_NOFAIL;
*trackerp = tracker = kzalloc(sizeof(*tracker), gfp_mask);
@@ -98,13 +103,18 @@ int ref_tracker_free(struct ref_tracker_dir *dir,
 struct ref_tracker **trackerp)
 {
unsigned long entries[REF_TRACKER_STACK_ENTRIES];
-   struct ref_tracker *tracker = *trackerp;
depot_stack_handle_t stack_handle;
+   struct ref_tracker *tracker;
unsigned int nr_entries;
unsigned long flags;
 
WARN_ON_ONCE(dir->dead);
 
+   if (!trackerp) {
+   refcount_dec(>no_tracker);
+   return 0;
+   }
+   tracker = *trackerp;
if (!tracker) {
refcount_dec(>untracked);
return -EEXIST;
-- 
2.25.1



[Intel-gfx] [PATCH v3 01/11] [DO NOT MERGE] ref_tracker: implement use-after-free detection

2022-02-21 Thread Andrzej Hajda
From: Eric Dumazet 

Whenever ref_tracker_dir_init() is called, mark the struct ref_tracker_dir
as dead.

Test the dead status from ref_tracker_alloc() and ref_tracker_free()

This should detect buggy dev_put()/dev_hold() happening too late
in netdevice dismantle process.

Signed-off-by: Eric Dumazet 
Signed-off-by: David S. Miller 
Signed-off-by: Andrzej Hajda 
---
 include/linux/ref_tracker.h | 2 ++
 lib/ref_tracker.c   | 5 +
 2 files changed, 7 insertions(+)

diff --git a/include/linux/ref_tracker.h b/include/linux/ref_tracker.h
index 60f3453be23e6..a443abda937d8 100644
--- a/include/linux/ref_tracker.h
+++ b/include/linux/ref_tracker.h
@@ -13,6 +13,7 @@ struct ref_tracker_dir {
spinlock_t  lock;
unsigned intquarantine_avail;
refcount_t  untracked;
+   booldead;
struct list_headlist; /* List of active trackers */
struct list_headquarantine; /* List of dead trackers */
 #endif
@@ -26,6 +27,7 @@ static inline void ref_tracker_dir_init(struct 
ref_tracker_dir *dir,
INIT_LIST_HEAD(>quarantine);
spin_lock_init(>lock);
dir->quarantine_avail = quarantine_count;
+   dir->dead = false;
refcount_set(>untracked, 1);
stack_depot_init();
 }
diff --git a/lib/ref_tracker.c b/lib/ref_tracker.c
index a6789c0c626b0..32ff6bd497f8e 100644
--- a/lib/ref_tracker.c
+++ b/lib/ref_tracker.c
@@ -20,6 +20,7 @@ void ref_tracker_dir_exit(struct ref_tracker_dir *dir)
unsigned long flags;
bool leak = false;
 
+   dir->dead = true;
spin_lock_irqsave(>lock, flags);
list_for_each_entry_safe(tracker, n, >quarantine, head) {
list_del(>head);
@@ -72,6 +73,8 @@ int ref_tracker_alloc(struct ref_tracker_dir *dir,
gfp_t gfp_mask = gfp;
unsigned long flags;
 
+   WARN_ON_ONCE(dir->dead);
+
if (gfp & __GFP_DIRECT_RECLAIM)
gfp_mask |= __GFP_NOFAIL;
*trackerp = tracker = kzalloc(sizeof(*tracker), gfp_mask);
@@ -100,6 +103,8 @@ int ref_tracker_free(struct ref_tracker_dir *dir,
unsigned int nr_entries;
unsigned long flags;
 
+   WARN_ON_ONCE(dir->dead);
+
if (!tracker) {
refcount_dec(>untracked);
return -EEXIST;
-- 
2.25.1



[Intel-gfx] [PATCH v3 00/11] drm/i915: use ref_tracker library for tracking wakerefs

2022-02-21 Thread Andrzej Hajda
Hi,

Appearance of ref_tracker library allows to drop custom solution for wakeref
tracking used in i915 and reuse the library.
For this few adjustements has been made to ref_tracker, details in patches.
I hope changes are OK for original author.

The patchset has been rebased on top of drm-tip to allow test changes by CI.
Patches marked "[DO NOT MERGE]" are cherry-picked from linux-next (they are
not yet in drm-tip), to allow build and run CI on the patchset (it works only
on drm-tip tree).

Added CC to netdev as the only user of the library atm.

v2:
  - replaced list_sort with ref_tracker_dir_stats, to avoid potentially
extensive sorting, if number of reports is expected to be big enough (???)
we can replace linear search in ref_tracker_dir_stats.stacks with binary
heap (min_heap),
  - refactored gfp flags,
  - fixed i915 handling of no-tracking flag.
v3:
  - fixed mess with duplicated mails

Regards
Andrzej


Andrzej Hajda (6):
  lib/ref_tracker: add unlocked leak print helper
  lib/ref_tracker: __ref_tracker_dir_print improve printing
  lib/ref_tracker: add printing to memory buffer
  lib/ref_tracker: remove warnings in case of allocation failure
  drm/i915: Correct type of wakeref variable
  drm/i915: replace Intel internal tracker with kernel core ref_tracker

Chris Wilson (2):
  drm/i915: Separate wakeref tracking
  drm/i915: Track leaked gt->wakerefs

Eric Dumazet (3):
  [DO NOT MERGE] ref_tracker: implement use-after-free detection
  [DO NOT MERGE] ref_tracker: add a count of untracked references
  [DO NOT MERGE] ref_tracker: remove filter_irq_stacks() call

 drivers/gpu/drm/i915/Kconfig.debug|  19 ++
 drivers/gpu/drm/i915/Makefile |   1 +
 .../drm/i915/display/intel_display_power.c|   2 +-
 .../gpu/drm/i915/gem/i915_gem_execbuffer.c|   7 +-
 .../i915/gem/selftests/i915_gem_coherency.c   |  10 +-
 .../drm/i915/gem/selftests/i915_gem_mman.c|  14 +-
 drivers/gpu/drm/i915/gt/intel_breadcrumbs.c   |  13 +-
 .../gpu/drm/i915/gt/intel_breadcrumbs_types.h |   3 +-
 drivers/gpu/drm/i915/gt/intel_engine_pm.c |   6 +-
 drivers/gpu/drm/i915/gt/intel_engine_types.h  |   2 +
 .../drm/i915/gt/intel_execlists_submission.c  |   2 +-
 drivers/gpu/drm/i915/gt/intel_gt_pm.c |  12 +-
 drivers/gpu/drm/i915/gt/intel_gt_pm.h |  36 ++-
 drivers/gpu/drm/i915/gt/intel_gt_pm_debugfs.c |   4 +-
 drivers/gpu/drm/i915/gt/selftest_engine_cs.c  |  20 +-
 drivers/gpu/drm/i915/gt/selftest_gt_pm.c  |   5 +-
 drivers/gpu/drm/i915/gt/selftest_reset.c  |  10 +-
 drivers/gpu/drm/i915/gt/selftest_rps.c|  17 +-
 drivers/gpu/drm/i915/gt/selftest_slpc.c   |  10 +-
 .../gpu/drm/i915/gt/uc/intel_guc_submission.c |  11 +-
 drivers/gpu/drm/i915/i915_pmu.c   |  16 +-
 drivers/gpu/drm/i915/intel_runtime_pm.c   | 239 ++
 drivers/gpu/drm/i915/intel_runtime_pm.h   |  10 +-
 drivers/gpu/drm/i915/intel_wakeref.c  |  10 +-
 drivers/gpu/drm/i915/intel_wakeref.h  | 112 +++-
 include/linux/ref_tracker.h   |  35 ++-
 lib/ref_tracker.c | 198 ---
 27 files changed, 480 insertions(+), 344 deletions(-)

-- 
2.25.1



Re: [Intel-gfx] [PATCH v2 00/11] drm/i915: use ref_tracker library for tracking wakerefs

2022-02-21 Thread Andrzej Hajda



On 22.02.2022 00:16, Andrzej Hajda wrote:

Hi,

Appearance of ref_tracker library allows to drop custom solution for wakeref
tracking used in i915 and reuse the library.
For this few adjustements has been made to ref_tracker, details in patches.
I hope changes are OK for original author.

The patchset has been rebased on top of drm-tip to allow test changes by CI.
Patches marked "[DO NOT MERGE]" are cherry-picked from linux-next (they are
not yet in drm-tip), to allow build and run CI on the patchset (it works only
on drm-tip tree).

Added CC to netdev as the only user of the library atm.

v2:
   - replaced list_sort with ref_tracker_dir_stats, to avoid potentially
 extensive sorting, if number of reports is expected to be big enough (???)
 we can replace linear search in ref_tracker_dir_stats.stacks with binary
 heap (min_heap),
   - refactored gfp flags,
   - fixed i915 handling of no-tracking flag.

Regards
Andrzej


Sorry for the mess, sth wrong happened to my scripts and I've messed 
patches, I will resend it properly.


Regards
Andrzej



[Intel-gfx] [PATCH v2 11/11] drm/i915: replace Intel internal tracker with kernel core ref_tracker

2022-02-21 Thread Andrzej Hajda
Beside reusing existing code, the main advantage of ref_tracker is
tracking per instance of wakeref. It allows also to catch double
put.
On the other side we lose information about the first acquire and
the last release, but the advantages outweigh it.

Signed-off-by: Andrzej Hajda 
Reviewed-by: Chris Wilson 
---
 drivers/gpu/drm/i915/Kconfig.debug|  11 +-
 drivers/gpu/drm/i915/Makefile |   3 -
 .../drm/i915/display/intel_display_power.c|   2 +-
 drivers/gpu/drm/i915/gt/intel_engine_pm.c |   2 +-
 drivers/gpu/drm/i915/gt/intel_gt_pm.c |   2 +-
 drivers/gpu/drm/i915/intel_runtime_pm.c   |  25 +-
 drivers/gpu/drm/i915/intel_runtime_pm.h   |   2 +-
 drivers/gpu/drm/i915/intel_wakeref.c  |   8 +-
 drivers/gpu/drm/i915/intel_wakeref.h  |  72 +-
 drivers/gpu/drm/i915/intel_wakeref_tracker.c  | 234 --
 drivers/gpu/drm/i915/intel_wakeref_tracker.h  |  76 --
 11 files changed, 87 insertions(+), 350 deletions(-)
 delete mode 100644 drivers/gpu/drm/i915/intel_wakeref_tracker.c
 delete mode 100644 drivers/gpu/drm/i915/intel_wakeref_tracker.h

diff --git a/drivers/gpu/drm/i915/Kconfig.debug 
b/drivers/gpu/drm/i915/Kconfig.debug
index 3bdc73f30a9e1..6c57f3e265f20 100644
--- a/drivers/gpu/drm/i915/Kconfig.debug
+++ b/drivers/gpu/drm/i915/Kconfig.debug
@@ -32,6 +32,7 @@ config DRM_I915_DEBUG
select DEBUG_FS
select PREEMPT_COUNT
select I2C_CHARDEV
+   select REF_TRACKER
select STACKDEPOT
select STACKTRACE
select DRM_DP_AUX_CHARDEV
@@ -46,7 +47,6 @@ config DRM_I915_DEBUG
select DRM_I915_DEBUG_GEM
select DRM_I915_DEBUG_GEM_ONCE
select DRM_I915_DEBUG_MMIO
-   select DRM_I915_TRACK_WAKEREF
select DRM_I915_DEBUG_RUNTIME_PM
select DRM_I915_DEBUG_WAKEREF
select DRM_I915_SW_FENCE_DEBUG_OBJECTS
@@ -238,18 +238,13 @@ config DRM_I915_DEBUG_VBLANK_EVADE
 
  If in doubt, say "N".
 
-config DRM_I915_TRACK_WAKEREF
-   depends on STACKDEPOT
-   depends on STACKTRACE
-   bool
-
 config DRM_I915_DEBUG_RUNTIME_PM
bool "Enable extra state checking for runtime PM"
depends on DRM_I915
default n
+   select REF_TRACKER
select STACKDEPOT
select STACKTRACE
-   select DRM_I915_TRACK_WAKEREF
help
  Choose this option to turn on extra state checking for the
  runtime PM functionality. This may introduce overhead during
@@ -263,9 +258,9 @@ config DRM_I915_DEBUG_WAKEREF
bool "Enable extra tracking for wakerefs"
depends on DRM_I915
default n
+   select REF_TRACKER
select STACKDEPOT
select STACKTRACE
-   select DRM_I915_TRACK_WAKEREF
help
  Choose this option to turn on extra state checking and usage
  tracking for the wakerefPM functionality. This may introduce
diff --git a/drivers/gpu/drm/i915/Makefile b/drivers/gpu/drm/i915/Makefile
index 88a403d3294cb..1f8d71430e2e6 100644
--- a/drivers/gpu/drm/i915/Makefile
+++ b/drivers/gpu/drm/i915/Makefile
@@ -76,9 +76,6 @@ i915-$(CONFIG_DEBUG_FS) += \
display/intel_display_debugfs.o \
display/intel_pipe_crc.o
 
-i915-$(CONFIG_DRM_I915_TRACK_WAKEREF) += \
-   intel_wakeref_tracker.o
-
 i915-$(CONFIG_PERF_EVENTS) += i915_pmu.o
 
 # "Graphics Technology" (aka we talk to the gpu)
diff --git a/drivers/gpu/drm/i915/display/intel_display_power.c 
b/drivers/gpu/drm/i915/display/intel_display_power.c
index 9ebae7ac32356..0e1bf724f89b5 100644
--- a/drivers/gpu/drm/i915/display/intel_display_power.c
+++ b/drivers/gpu/drm/i915/display/intel_display_power.c
@@ -2107,7 +2107,7 @@ print_async_put_domains_state(struct i915_power_domains 
*power_domains)
 struct drm_i915_private,
 power_domains);
 
-   drm_dbg(>drm, "async_put_wakeref %u\n",
+   drm_dbg(>drm, "async_put_wakeref %lu\n",
power_domains->async_put_wakeref);
 
print_power_domains(power_domains, "async_put_domains[0]",
diff --git a/drivers/gpu/drm/i915/gt/intel_engine_pm.c 
b/drivers/gpu/drm/i915/gt/intel_engine_pm.c
index 52e46e7830ff5..cf8cc348942cb 100644
--- a/drivers/gpu/drm/i915/gt/intel_engine_pm.c
+++ b/drivers/gpu/drm/i915/gt/intel_engine_pm.c
@@ -273,7 +273,7 @@ void intel_engine_init__pm(struct intel_engine_cs *engine)
 {
struct intel_runtime_pm *rpm = engine->uncore->rpm;
 
-   intel_wakeref_init(>wakeref, rpm, _ops);
+   intel_wakeref_init(>wakeref, rpm, _ops, engine->name);
intel_engine_init_heartbeat(engine);
 }
 
diff --git a/drivers/gpu/drm/i915/gt/intel_gt_pm.c 
b/drivers/gpu/drm/i915/gt/intel_gt_pm.c
index 7ee65a93f926f..01a055d0d0989 100644
--- a/drivers/gpu/drm/i915/gt/intel_gt_pm.c
+++ b/drivers/gpu/drm/i915/gt/intel_gt_pm.c
@@ -129,7 +129,7 @@ static const struct intel_wakeref_ops wf_ops = {
 
 void 

[Intel-gfx] [PATCH v2 10/11] drm/i915: Correct type of wakeref variable

2022-02-21 Thread Andrzej Hajda
Wakeref has dedicated type. Assumption it will be int
compatible forever is incorrect.

Signed-off-by: Andrzej Hajda 
---
 drivers/gpu/drm/i915/gt/uc/intel_guc_submission.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/i915/gt/uc/intel_guc_submission.c 
b/drivers/gpu/drm/i915/gt/uc/intel_guc_submission.c
index 7799939c38945..b308dd0866eaf 100644
--- a/drivers/gpu/drm/i915/gt/uc/intel_guc_submission.c
+++ b/drivers/gpu/drm/i915/gt/uc/intel_guc_submission.c
@@ -2797,7 +2797,7 @@ static void destroyed_worker_func(struct work_struct *w)
struct intel_guc *guc = container_of(w, struct intel_guc,
 submission_state.destroyed_worker);
struct intel_gt *gt = guc_to_gt(guc);
-   int tmp;
+   intel_wakeref_t tmp;
 
with_intel_gt_pm(gt, tmp)
deregister_destroyed_contexts(guc);
-- 
2.25.1



[Intel-gfx] [PATCH v2 09/11] drm/i915: Track leaked gt->wakerefs

2022-02-21 Thread Andrzej Hajda
From: Chris Wilson 

Track every intel_gt_pm_get() until its corresponding release in
intel_gt_pm_put() by returning a cookie to the caller for acquire that
must be passed by on rleased. When there is an imbalance, we can see who
either tried to free a stale wakeref, or who forgot to free theirs.

v2: Rebase from backporting wakeref leak (Umesh)

Signed-off-by: Chris Wilson 
Reviewed-by: Andrzej Hajda 
Signed-off-by: Andrzej Hajda 
---
 drivers/gpu/drm/i915/Kconfig.debug| 15 +++
 .../gpu/drm/i915/gem/i915_gem_execbuffer.c|  7 ++--
 .../i915/gem/selftests/i915_gem_coherency.c   | 10 +++--
 .../drm/i915/gem/selftests/i915_gem_mman.c| 14 ---
 drivers/gpu/drm/i915/gt/intel_breadcrumbs.c   | 13 --
 .../gpu/drm/i915/gt/intel_breadcrumbs_types.h |  3 +-
 drivers/gpu/drm/i915/gt/intel_engine_pm.c |  4 +-
 drivers/gpu/drm/i915/gt/intel_engine_types.h  |  2 +
 .../drm/i915/gt/intel_execlists_submission.c  |  2 +-
 drivers/gpu/drm/i915/gt/intel_gt_pm.c | 10 +++--
 drivers/gpu/drm/i915/gt/intel_gt_pm.h | 36 
 drivers/gpu/drm/i915/gt/intel_gt_pm_debugfs.c |  4 +-
 drivers/gpu/drm/i915/gt/selftest_engine_cs.c  | 20 +
 drivers/gpu/drm/i915/gt/selftest_gt_pm.c  |  5 ++-
 drivers/gpu/drm/i915/gt/selftest_reset.c  | 10 +++--
 drivers/gpu/drm/i915/gt/selftest_rps.c| 17 
 drivers/gpu/drm/i915/gt/selftest_slpc.c   | 10 +++--
 .../gpu/drm/i915/gt/uc/intel_guc_submission.c |  9 ++--
 drivers/gpu/drm/i915/i915_pmu.c   | 16 +++
 drivers/gpu/drm/i915/intel_wakeref.c  |  4 ++
 drivers/gpu/drm/i915/intel_wakeref.h  | 42 +++
 21 files changed, 182 insertions(+), 71 deletions(-)

diff --git a/drivers/gpu/drm/i915/Kconfig.debug 
b/drivers/gpu/drm/i915/Kconfig.debug
index 8b1973146e848..3bdc73f30a9e1 100644
--- a/drivers/gpu/drm/i915/Kconfig.debug
+++ b/drivers/gpu/drm/i915/Kconfig.debug
@@ -48,6 +48,7 @@ config DRM_I915_DEBUG
select DRM_I915_DEBUG_MMIO
select DRM_I915_TRACK_WAKEREF
select DRM_I915_DEBUG_RUNTIME_PM
+   select DRM_I915_DEBUG_WAKEREF
select DRM_I915_SW_FENCE_DEBUG_OBJECTS
select DRM_I915_SELFTEST
select BROKEN # for prototype uAPI
@@ -257,3 +258,17 @@ config DRM_I915_DEBUG_RUNTIME_PM
  Recommended for driver developers only.
 
  If in doubt, say "N"
+
+config DRM_I915_DEBUG_WAKEREF
+   bool "Enable extra tracking for wakerefs"
+   depends on DRM_I915
+   default n
+   select STACKDEPOT
+   select STACKTRACE
+   select DRM_I915_TRACK_WAKEREF
+   help
+ Choose this option to turn on extra state checking and usage
+ tracking for the wakerefPM functionality. This may introduce
+ overhead during driver runtime.
+
+ If in doubt, say "N"
diff --git a/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c 
b/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c
index 13c975da77474..4b6c144f706da 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c
+++ b/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c
@@ -252,6 +252,7 @@ struct i915_execbuffer {
struct intel_gt *gt; /* gt for the execbuf */
struct intel_context *context; /* logical state for the request */
struct i915_gem_context *gem_context; /** caller's context */
+   intel_wakeref_t wakeref;
 
/** our requests to build */
struct i915_request *requests[MAX_ENGINE_INSTANCE + 1];
@@ -2679,7 +2680,7 @@ eb_select_engine(struct i915_execbuffer *eb)
 
for_each_child(ce, child)
intel_context_get(child);
-   intel_gt_pm_get(ce->engine->gt);
+   eb->wakeref = intel_gt_pm_get(ce->engine->gt);
 
if (!test_bit(CONTEXT_ALLOC_BIT, >flags)) {
err = intel_context_alloc_state(ce);
@@ -2713,7 +2714,7 @@ eb_select_engine(struct i915_execbuffer *eb)
return err;
 
 err:
-   intel_gt_pm_put(ce->engine->gt);
+   intel_gt_pm_put(ce->engine->gt, eb->wakeref);
for_each_child(ce, child)
intel_context_put(child);
intel_context_put(ce);
@@ -2725,7 +2726,7 @@ eb_put_engine(struct i915_execbuffer *eb)
 {
struct intel_context *child;
 
-   intel_gt_pm_put(eb->gt);
+   intel_gt_pm_put(eb->context->engine->gt, eb->wakeref);
for_each_child(eb->context, child)
intel_context_put(child);
intel_context_put(eb->context);
diff --git a/drivers/gpu/drm/i915/gem/selftests/i915_gem_coherency.c 
b/drivers/gpu/drm/i915/gem/selftests/i915_gem_coherency.c
index 13b088cc787eb..553f2730c2a76 100644
--- a/drivers/gpu/drm/i915/gem/selftests/i915_gem_coherency.c
+++ b/drivers/gpu/drm/i915/gem/selftests/i915_gem_coherency.c
@@ -85,6 +85,7 @@ static int cpu_get(struct context *ctx, unsigned long offset, 
u32 *v)
 
 static int gtt_set(struct context *ctx, unsigned long offset, u32 v)
 {
+   intel_wakeref_t wakeref;
struct i915_vma *vma;
u32 __iomem *map;
  

[Intel-gfx] [PATCH v2 9/9] drm/i915: replace Intel internal tracker with kernel core ref_tracker

2022-02-21 Thread Andrzej Hajda
Beside reusing existing code, the main advantage of ref_tracker is
tracking per instance of wakeref. It allows also to catch double
put.
On the other side we lose information about the first acquire and
the last release, but the advantages outweigh it.

Signed-off-by: Andrzej Hajda 
Reviewed-by: Chris Wilson 
---
 drivers/gpu/drm/i915/Kconfig.debug|  11 +-
 drivers/gpu/drm/i915/Makefile |   3 -
 .../drm/i915/display/intel_display_power.c|   2 +-
 drivers/gpu/drm/i915/gt/intel_engine_pm.c |   2 +-
 drivers/gpu/drm/i915/gt/intel_gt_pm.c |   2 +-
 drivers/gpu/drm/i915/intel_runtime_pm.c   |  23 +-
 drivers/gpu/drm/i915/intel_runtime_pm.h   |   2 +-
 drivers/gpu/drm/i915/intel_wakeref.c  |   8 +-
 drivers/gpu/drm/i915/intel_wakeref.h  |  72 +-
 drivers/gpu/drm/i915/intel_wakeref_tracker.c  | 234 --
 drivers/gpu/drm/i915/intel_wakeref_tracker.h  |  76 --
 11 files changed, 86 insertions(+), 349 deletions(-)
 delete mode 100644 drivers/gpu/drm/i915/intel_wakeref_tracker.c
 delete mode 100644 drivers/gpu/drm/i915/intel_wakeref_tracker.h

diff --git a/drivers/gpu/drm/i915/Kconfig.debug 
b/drivers/gpu/drm/i915/Kconfig.debug
index 3bdc73f30a9e1..6c57f3e265f20 100644
--- a/drivers/gpu/drm/i915/Kconfig.debug
+++ b/drivers/gpu/drm/i915/Kconfig.debug
@@ -32,6 +32,7 @@ config DRM_I915_DEBUG
select DEBUG_FS
select PREEMPT_COUNT
select I2C_CHARDEV
+   select REF_TRACKER
select STACKDEPOT
select STACKTRACE
select DRM_DP_AUX_CHARDEV
@@ -46,7 +47,6 @@ config DRM_I915_DEBUG
select DRM_I915_DEBUG_GEM
select DRM_I915_DEBUG_GEM_ONCE
select DRM_I915_DEBUG_MMIO
-   select DRM_I915_TRACK_WAKEREF
select DRM_I915_DEBUG_RUNTIME_PM
select DRM_I915_DEBUG_WAKEREF
select DRM_I915_SW_FENCE_DEBUG_OBJECTS
@@ -238,18 +238,13 @@ config DRM_I915_DEBUG_VBLANK_EVADE
 
  If in doubt, say "N".
 
-config DRM_I915_TRACK_WAKEREF
-   depends on STACKDEPOT
-   depends on STACKTRACE
-   bool
-
 config DRM_I915_DEBUG_RUNTIME_PM
bool "Enable extra state checking for runtime PM"
depends on DRM_I915
default n
+   select REF_TRACKER
select STACKDEPOT
select STACKTRACE
-   select DRM_I915_TRACK_WAKEREF
help
  Choose this option to turn on extra state checking for the
  runtime PM functionality. This may introduce overhead during
@@ -263,9 +258,9 @@ config DRM_I915_DEBUG_WAKEREF
bool "Enable extra tracking for wakerefs"
depends on DRM_I915
default n
+   select REF_TRACKER
select STACKDEPOT
select STACKTRACE
-   select DRM_I915_TRACK_WAKEREF
help
  Choose this option to turn on extra state checking and usage
  tracking for the wakerefPM functionality. This may introduce
diff --git a/drivers/gpu/drm/i915/Makefile b/drivers/gpu/drm/i915/Makefile
index 88a403d3294cb..1f8d71430e2e6 100644
--- a/drivers/gpu/drm/i915/Makefile
+++ b/drivers/gpu/drm/i915/Makefile
@@ -76,9 +76,6 @@ i915-$(CONFIG_DEBUG_FS) += \
display/intel_display_debugfs.o \
display/intel_pipe_crc.o
 
-i915-$(CONFIG_DRM_I915_TRACK_WAKEREF) += \
-   intel_wakeref_tracker.o
-
 i915-$(CONFIG_PERF_EVENTS) += i915_pmu.o
 
 # "Graphics Technology" (aka we talk to the gpu)
diff --git a/drivers/gpu/drm/i915/display/intel_display_power.c 
b/drivers/gpu/drm/i915/display/intel_display_power.c
index 9ebae7ac32356..0e1bf724f89b5 100644
--- a/drivers/gpu/drm/i915/display/intel_display_power.c
+++ b/drivers/gpu/drm/i915/display/intel_display_power.c
@@ -2107,7 +2107,7 @@ print_async_put_domains_state(struct i915_power_domains 
*power_domains)
 struct drm_i915_private,
 power_domains);
 
-   drm_dbg(>drm, "async_put_wakeref %u\n",
+   drm_dbg(>drm, "async_put_wakeref %lu\n",
power_domains->async_put_wakeref);
 
print_power_domains(power_domains, "async_put_domains[0]",
diff --git a/drivers/gpu/drm/i915/gt/intel_engine_pm.c 
b/drivers/gpu/drm/i915/gt/intel_engine_pm.c
index 52e46e7830ff5..cf8cc348942cb 100644
--- a/drivers/gpu/drm/i915/gt/intel_engine_pm.c
+++ b/drivers/gpu/drm/i915/gt/intel_engine_pm.c
@@ -273,7 +273,7 @@ void intel_engine_init__pm(struct intel_engine_cs *engine)
 {
struct intel_runtime_pm *rpm = engine->uncore->rpm;
 
-   intel_wakeref_init(>wakeref, rpm, _ops);
+   intel_wakeref_init(>wakeref, rpm, _ops, engine->name);
intel_engine_init_heartbeat(engine);
 }
 
diff --git a/drivers/gpu/drm/i915/gt/intel_gt_pm.c 
b/drivers/gpu/drm/i915/gt/intel_gt_pm.c
index 7ee65a93f926f..01a055d0d0989 100644
--- a/drivers/gpu/drm/i915/gt/intel_gt_pm.c
+++ b/drivers/gpu/drm/i915/gt/intel_gt_pm.c
@@ -129,7 +129,7 @@ static const struct intel_wakeref_ops wf_ops = {
 
 void 

[Intel-gfx] [PATCH v2 08/11] drm/i915: Separate wakeref tracking

2022-02-21 Thread Andrzej Hajda
From: Chris Wilson 

Extract the callstack tracking of intel_runtime_pm.c into its own
utility so that that we can reuse it for other online debugging of
scoped wakerefs.

Signed-off-by: Chris Wilson 
Reviewed-by: Andrzej Hajda 
Signed-off-by: Andrzej Hajda 
---
 drivers/gpu/drm/i915/Kconfig.debug   |   9 +
 drivers/gpu/drm/i915/Makefile|   4 +
 drivers/gpu/drm/i915/intel_runtime_pm.c  | 244 +++
 drivers/gpu/drm/i915/intel_runtime_pm.h  |  10 +-
 drivers/gpu/drm/i915/intel_wakeref.h |   6 +-
 drivers/gpu/drm/i915/intel_wakeref_tracker.c | 234 ++
 drivers/gpu/drm/i915/intel_wakeref_tracker.h |  76 ++
 7 files changed, 355 insertions(+), 228 deletions(-)
 create mode 100644 drivers/gpu/drm/i915/intel_wakeref_tracker.c
 create mode 100644 drivers/gpu/drm/i915/intel_wakeref_tracker.h

diff --git a/drivers/gpu/drm/i915/Kconfig.debug 
b/drivers/gpu/drm/i915/Kconfig.debug
index e7fd3e76f8a20..8b1973146e848 100644
--- a/drivers/gpu/drm/i915/Kconfig.debug
+++ b/drivers/gpu/drm/i915/Kconfig.debug
@@ -33,6 +33,7 @@ config DRM_I915_DEBUG
select PREEMPT_COUNT
select I2C_CHARDEV
select STACKDEPOT
+   select STACKTRACE
select DRM_DP_AUX_CHARDEV
select X86_MSR # used by igt/pm_rpm
select DRM_VGEM # used by igt/prime_vgem (dmabuf interop checks)
@@ -45,6 +46,7 @@ config DRM_I915_DEBUG
select DRM_I915_DEBUG_GEM
select DRM_I915_DEBUG_GEM_ONCE
select DRM_I915_DEBUG_MMIO
+   select DRM_I915_TRACK_WAKEREF
select DRM_I915_DEBUG_RUNTIME_PM
select DRM_I915_SW_FENCE_DEBUG_OBJECTS
select DRM_I915_SELFTEST
@@ -235,11 +237,18 @@ config DRM_I915_DEBUG_VBLANK_EVADE
 
  If in doubt, say "N".
 
+config DRM_I915_TRACK_WAKEREF
+   depends on STACKDEPOT
+   depends on STACKTRACE
+   bool
+
 config DRM_I915_DEBUG_RUNTIME_PM
bool "Enable extra state checking for runtime PM"
depends on DRM_I915
default n
select STACKDEPOT
+   select STACKTRACE
+   select DRM_I915_TRACK_WAKEREF
help
  Choose this option to turn on extra state checking for the
  runtime PM functionality. This may introduce overhead during
diff --git a/drivers/gpu/drm/i915/Makefile b/drivers/gpu/drm/i915/Makefile
index 9d588d936e3dc..88a403d3294cb 100644
--- a/drivers/gpu/drm/i915/Makefile
+++ b/drivers/gpu/drm/i915/Makefile
@@ -75,6 +75,10 @@ i915-$(CONFIG_DEBUG_FS) += \
i915_debugfs_params.o \
display/intel_display_debugfs.o \
display/intel_pipe_crc.o
+
+i915-$(CONFIG_DRM_I915_TRACK_WAKEREF) += \
+   intel_wakeref_tracker.o
+
 i915-$(CONFIG_PERF_EVENTS) += i915_pmu.o
 
 # "Graphics Technology" (aka we talk to the gpu)
diff --git a/drivers/gpu/drm/i915/intel_runtime_pm.c 
b/drivers/gpu/drm/i915/intel_runtime_pm.c
index 6ed5786bcd299..7bd10efa56bf3 100644
--- a/drivers/gpu/drm/i915/intel_runtime_pm.c
+++ b/drivers/gpu/drm/i915/intel_runtime_pm.c
@@ -52,182 +52,37 @@
 
 #if IS_ENABLED(CONFIG_DRM_I915_DEBUG_RUNTIME_PM)
 
-#include 
-
-#define STACKDEPTH 8
-
-static noinline depot_stack_handle_t __save_depot_stack(void)
-{
-   unsigned long entries[STACKDEPTH];
-   unsigned int n;
-
-   n = stack_trace_save(entries, ARRAY_SIZE(entries), 1);
-   return stack_depot_save(entries, n, GFP_NOWAIT | __GFP_NOWARN);
-}
-
 static void init_intel_runtime_pm_wakeref(struct intel_runtime_pm *rpm)
 {
-   spin_lock_init(>debug.lock);
-   stack_depot_init();
+   intel_wakeref_tracker_init(>debug);
 }
 
-static noinline depot_stack_handle_t
+static intel_wakeref_t
 track_intel_runtime_pm_wakeref(struct intel_runtime_pm *rpm)
 {
-   depot_stack_handle_t stack, *stacks;
-   unsigned long flags;
-
-   if (rpm->no_wakeref_tracking)
-   return -1;
-
-   stack = __save_depot_stack();
-   if (!stack)
+   if (!rpm->available)
return -1;
 
-   spin_lock_irqsave(>debug.lock, flags);
-
-   if (!rpm->debug.count)
-   rpm->debug.last_acquire = stack;
-
-   stacks = krealloc(rpm->debug.owners,
- (rpm->debug.count + 1) * sizeof(*stacks),
- GFP_NOWAIT | __GFP_NOWARN);
-   if (stacks) {
-   stacks[rpm->debug.count++] = stack;
-   rpm->debug.owners = stacks;
-   } else {
-   stack = -1;
-   }
-
-   spin_unlock_irqrestore(>debug.lock, flags);
-
-   return stack;
+   return intel_wakeref_tracker_add(>debug);
 }
 
 static void untrack_intel_runtime_pm_wakeref(struct intel_runtime_pm *rpm,
-depot_stack_handle_t stack)
+intel_wakeref_t wakeref)
 {
-   struct drm_i915_private *i915 = container_of(rpm,
-struct drm_i915_private,
-

[Intel-gfx] [PATCH v2 8/9] drm/i915: Correct type of wakeref variable

2022-02-21 Thread Andrzej Hajda
Wakeref has dedicated type. Assumption it will be int
compatible forever is incorrect.

Signed-off-by: Andrzej Hajda 
---
 drivers/gpu/drm/i915/gt/uc/intel_guc_submission.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/i915/gt/uc/intel_guc_submission.c 
b/drivers/gpu/drm/i915/gt/uc/intel_guc_submission.c
index 7799939c38945..b308dd0866eaf 100644
--- a/drivers/gpu/drm/i915/gt/uc/intel_guc_submission.c
+++ b/drivers/gpu/drm/i915/gt/uc/intel_guc_submission.c
@@ -2797,7 +2797,7 @@ static void destroyed_worker_func(struct work_struct *w)
struct intel_guc *guc = container_of(w, struct intel_guc,
 submission_state.destroyed_worker);
struct intel_gt *gt = guc_to_gt(guc);
-   int tmp;
+   intel_wakeref_t tmp;
 
with_intel_gt_pm(gt, tmp)
deregister_destroyed_contexts(guc);
-- 
2.25.1



[Intel-gfx] [PATCH v2 07/11] lib/ref_tracker: remove warnings in case of allocation failure

2022-02-21 Thread Andrzej Hajda
Library can handle allocation failures. To avoid allocation warnings
__GFP_NOWARN has been added everywhere. Moreover GFP_ATOMIC has been
replaced with GFP_NOWAIT in case of stack allocation on tracker free
call.

Signed-off-by: Andrzej Hajda 
---
 lib/ref_tracker.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/lib/ref_tracker.c b/lib/ref_tracker.c
index 2ef4596b6b36f..cae4498fcfd70 100644
--- a/lib/ref_tracker.c
+++ b/lib/ref_tracker.c
@@ -189,7 +189,7 @@ int ref_tracker_alloc(struct ref_tracker_dir *dir,
unsigned long entries[REF_TRACKER_STACK_ENTRIES];
struct ref_tracker *tracker;
unsigned int nr_entries;
-   gfp_t gfp_mask = gfp;
+   gfp_t gfp_mask = gfp | __GFP_NOWARN;
unsigned long flags;
 
WARN_ON_ONCE(dir->dead);
@@ -237,7 +237,8 @@ int ref_tracker_free(struct ref_tracker_dir *dir,
return -EEXIST;
}
nr_entries = stack_trace_save(entries, ARRAY_SIZE(entries), 1);
-   stack_handle = stack_depot_save(entries, nr_entries, GFP_ATOMIC);
+   stack_handle = stack_depot_save(entries, nr_entries,
+   GFP_NOWAIT | __GFP_NOWARN);
 
spin_lock_irqsave(>lock, flags);
if (tracker->dead) {
-- 
2.25.1



[Intel-gfx] [PATCH v2 7/9] drm/i915: Track leaked gt->wakerefs

2022-02-21 Thread Andrzej Hajda
From: Chris Wilson 

Track every intel_gt_pm_get() until its corresponding release in
intel_gt_pm_put() by returning a cookie to the caller for acquire that
must be passed by on rleased. When there is an imbalance, we can see who
either tried to free a stale wakeref, or who forgot to free theirs.

v2: Rebase from backporting wakeref leak (Umesh)

Signed-off-by: Chris Wilson 
Reviewed-by: Andrzej Hajda 
Signed-off-by: Andrzej Hajda 
---
 drivers/gpu/drm/i915/Kconfig.debug| 15 +++
 .../gpu/drm/i915/gem/i915_gem_execbuffer.c|  7 ++--
 .../i915/gem/selftests/i915_gem_coherency.c   | 10 +++--
 .../drm/i915/gem/selftests/i915_gem_mman.c| 14 ---
 drivers/gpu/drm/i915/gt/intel_breadcrumbs.c   | 13 --
 .../gpu/drm/i915/gt/intel_breadcrumbs_types.h |  3 +-
 drivers/gpu/drm/i915/gt/intel_engine_pm.c |  4 +-
 drivers/gpu/drm/i915/gt/intel_engine_types.h  |  2 +
 .../drm/i915/gt/intel_execlists_submission.c  |  2 +-
 drivers/gpu/drm/i915/gt/intel_gt_pm.c | 10 +++--
 drivers/gpu/drm/i915/gt/intel_gt_pm.h | 36 
 drivers/gpu/drm/i915/gt/intel_gt_pm_debugfs.c |  4 +-
 drivers/gpu/drm/i915/gt/selftest_engine_cs.c  | 20 +
 drivers/gpu/drm/i915/gt/selftest_gt_pm.c  |  5 ++-
 drivers/gpu/drm/i915/gt/selftest_reset.c  | 10 +++--
 drivers/gpu/drm/i915/gt/selftest_rps.c| 17 
 drivers/gpu/drm/i915/gt/selftest_slpc.c   | 10 +++--
 .../gpu/drm/i915/gt/uc/intel_guc_submission.c |  9 ++--
 drivers/gpu/drm/i915/i915_pmu.c   | 16 +++
 drivers/gpu/drm/i915/intel_wakeref.c  |  4 ++
 drivers/gpu/drm/i915/intel_wakeref.h  | 42 +++
 21 files changed, 182 insertions(+), 71 deletions(-)

diff --git a/drivers/gpu/drm/i915/Kconfig.debug 
b/drivers/gpu/drm/i915/Kconfig.debug
index 8b1973146e848..3bdc73f30a9e1 100644
--- a/drivers/gpu/drm/i915/Kconfig.debug
+++ b/drivers/gpu/drm/i915/Kconfig.debug
@@ -48,6 +48,7 @@ config DRM_I915_DEBUG
select DRM_I915_DEBUG_MMIO
select DRM_I915_TRACK_WAKEREF
select DRM_I915_DEBUG_RUNTIME_PM
+   select DRM_I915_DEBUG_WAKEREF
select DRM_I915_SW_FENCE_DEBUG_OBJECTS
select DRM_I915_SELFTEST
select BROKEN # for prototype uAPI
@@ -257,3 +258,17 @@ config DRM_I915_DEBUG_RUNTIME_PM
  Recommended for driver developers only.
 
  If in doubt, say "N"
+
+config DRM_I915_DEBUG_WAKEREF
+   bool "Enable extra tracking for wakerefs"
+   depends on DRM_I915
+   default n
+   select STACKDEPOT
+   select STACKTRACE
+   select DRM_I915_TRACK_WAKEREF
+   help
+ Choose this option to turn on extra state checking and usage
+ tracking for the wakerefPM functionality. This may introduce
+ overhead during driver runtime.
+
+ If in doubt, say "N"
diff --git a/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c 
b/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c
index 13c975da77474..4b6c144f706da 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c
+++ b/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c
@@ -252,6 +252,7 @@ struct i915_execbuffer {
struct intel_gt *gt; /* gt for the execbuf */
struct intel_context *context; /* logical state for the request */
struct i915_gem_context *gem_context; /** caller's context */
+   intel_wakeref_t wakeref;
 
/** our requests to build */
struct i915_request *requests[MAX_ENGINE_INSTANCE + 1];
@@ -2679,7 +2680,7 @@ eb_select_engine(struct i915_execbuffer *eb)
 
for_each_child(ce, child)
intel_context_get(child);
-   intel_gt_pm_get(ce->engine->gt);
+   eb->wakeref = intel_gt_pm_get(ce->engine->gt);
 
if (!test_bit(CONTEXT_ALLOC_BIT, >flags)) {
err = intel_context_alloc_state(ce);
@@ -2713,7 +2714,7 @@ eb_select_engine(struct i915_execbuffer *eb)
return err;
 
 err:
-   intel_gt_pm_put(ce->engine->gt);
+   intel_gt_pm_put(ce->engine->gt, eb->wakeref);
for_each_child(ce, child)
intel_context_put(child);
intel_context_put(ce);
@@ -2725,7 +2726,7 @@ eb_put_engine(struct i915_execbuffer *eb)
 {
struct intel_context *child;
 
-   intel_gt_pm_put(eb->gt);
+   intel_gt_pm_put(eb->context->engine->gt, eb->wakeref);
for_each_child(eb->context, child)
intel_context_put(child);
intel_context_put(eb->context);
diff --git a/drivers/gpu/drm/i915/gem/selftests/i915_gem_coherency.c 
b/drivers/gpu/drm/i915/gem/selftests/i915_gem_coherency.c
index 13b088cc787eb..553f2730c2a76 100644
--- a/drivers/gpu/drm/i915/gem/selftests/i915_gem_coherency.c
+++ b/drivers/gpu/drm/i915/gem/selftests/i915_gem_coherency.c
@@ -85,6 +85,7 @@ static int cpu_get(struct context *ctx, unsigned long offset, 
u32 *v)
 
 static int gtt_set(struct context *ctx, unsigned long offset, u32 v)
 {
+   intel_wakeref_t wakeref;
struct i915_vma *vma;
u32 __iomem *map;
  

[Intel-gfx] [PATCH v2 06/11] lib/ref_tracker: add printing to memory buffer

2022-02-21 Thread Andrzej Hajda
In case one wants to show stats via debugfs.

Signed-off-by: Andrzej Hajda 
Reviewed-by: Chris Wilson 
---
 include/linux/ref_tracker.h |  8 ++
 lib/ref_tracker.c   | 56 +++--
 2 files changed, 56 insertions(+), 8 deletions(-)

diff --git a/include/linux/ref_tracker.h b/include/linux/ref_tracker.h
index a2cf1f6309adb..2fdbfd2e14797 100644
--- a/include/linux/ref_tracker.h
+++ b/include/linux/ref_tracker.h
@@ -50,6 +50,8 @@ void __ref_tracker_dir_print(struct ref_tracker_dir *dir,
 void ref_tracker_dir_print(struct ref_tracker_dir *dir,
   unsigned int display_limit);
 
+int ref_tracker_dir_snprint(struct ref_tracker_dir *dir, char *buf, size_t 
size);
+
 int ref_tracker_alloc(struct ref_tracker_dir *dir,
  struct ref_tracker **trackerp, gfp_t gfp);
 
@@ -78,6 +80,12 @@ static inline void ref_tracker_dir_print(struct 
ref_tracker_dir *dir,
 {
 }
 
+static inline int ref_tracker_dir_snprint(struct ref_tracker_dir *dir,
+ char *buf, size_t size)
+{
+   return 0;
+}
+
 static inline int ref_tracker_alloc(struct ref_tracker_dir *dir,
struct ref_tracker **trackerp,
gfp_t gfp)
diff --git a/lib/ref_tracker.c b/lib/ref_tracker.c
index ab1253fde244e..2ef4596b6b36f 100644
--- a/lib/ref_tracker.c
+++ b/lib/ref_tracker.c
@@ -62,8 +62,27 @@ ref_tracker_get_stats(struct ref_tracker_dir *dir, unsigned 
int limit)
return stats;
 }
 
-void __ref_tracker_dir_print(struct ref_tracker_dir *dir,
-  unsigned int display_limit)
+struct ostream {
+   char *buf;
+   int size, used;
+};
+
+#define pr_ostream(stream, fmt, args...) \
+({ \
+   struct ostream *_s = (stream); \
+\
+   if (!_s->buf) { \
+   pr_err(fmt, ##args); \
+   } else { \
+   int ret, len = _s->size - _s->used; \
+   ret = snprintf(_s->buf + _s->used, len, pr_fmt(fmt), ##args); \
+   _s->used += min(ret, len); \
+   } \
+})
+
+static void
+__ref_tracker_dir_pr_ostream(struct ref_tracker_dir *dir,
+unsigned int display_limit, struct ostream *s)
 {
struct ref_tracker_dir_stats *stats;
unsigned int i = 0, skipped;
@@ -77,8 +96,8 @@ void __ref_tracker_dir_print(struct ref_tracker_dir *dir,
 
stats = ref_tracker_get_stats(dir, display_limit);
if (IS_ERR(stats)) {
-   pr_err("%s@%pK: couldn't get stats, error %pe\n",
-  dir->name, dir, stats);
+   pr_ostream(s, "%s@%pK: couldn't get stats, error %pe\n",
+  dir->name, dir, stats);
return;
}
 
@@ -88,19 +107,27 @@ void __ref_tracker_dir_print(struct ref_tracker_dir *dir,
stack = stats->stacks[i].stack_handle;
if (sbuf && !stack_depot_snprint(stack, sbuf, STACK_BUF_SIZE, 
4))
sbuf[0] = 0;
-   pr_err("%s@%pK has %d/%d users at\n%s\n", dir->name, dir,
-  stats->stacks[i].count, stats->total, sbuf);
+   pr_ostream(s, "%s@%pK has %d/%d users at\n%s\n", dir->name, dir,
+  stats->stacks[i].count, stats->total, sbuf);
skipped -= stats->stacks[i].count;
}
 
if (skipped)
-   pr_err("%s@%pK skipped reports about %d/%d users.\n",
-  dir->name, dir, skipped, stats->total);
+   pr_ostream(s, "%s@%pK skipped reports about %d/%d users.\n",
+  dir->name, dir, skipped, stats->total);
 
kfree(sbuf);
 
kfree(stats);
 }
+
+void __ref_tracker_dir_print(struct ref_tracker_dir *dir,
+  unsigned int display_limit)
+{
+   struct ostream os = {};
+
+   __ref_tracker_dir_pr_ostream(dir, display_limit, );
+}
 EXPORT_SYMBOL(__ref_tracker_dir_print);
 
 void ref_tracker_dir_print(struct ref_tracker_dir *dir,
@@ -114,6 +141,19 @@ void ref_tracker_dir_print(struct ref_tracker_dir *dir,
 }
 EXPORT_SYMBOL(ref_tracker_dir_print);
 
+int ref_tracker_dir_snprint(struct ref_tracker_dir *dir, char *buf, size_t 
size)
+{
+   struct ostream os = { .buf = buf, .size = size };
+   unsigned long flags;
+
+   spin_lock_irqsave(>lock, flags);
+   __ref_tracker_dir_pr_ostream(dir, 16, );
+   spin_unlock_irqrestore(>lock, flags);
+
+   return os.used;
+}
+EXPORT_SYMBOL(ref_tracker_dir_snprint);
+
 void ref_tracker_dir_exit(struct ref_tracker_dir *dir)
 {
struct ref_tracker *tracker, *n;
-- 
2.25.1



[Intel-gfx] [PATCH v2 6/9] drm/i915: Separate wakeref tracking

2022-02-21 Thread Andrzej Hajda
From: Chris Wilson 

Extract the callstack tracking of intel_runtime_pm.c into its own
utility so that that we can reuse it for other online debugging of
scoped wakerefs.

Signed-off-by: Chris Wilson 
Reviewed-by: Andrzej Hajda 
Signed-off-by: Andrzej Hajda 
---
 drivers/gpu/drm/i915/Kconfig.debug   |   9 +
 drivers/gpu/drm/i915/Makefile|   4 +
 drivers/gpu/drm/i915/intel_runtime_pm.c  | 244 +++
 drivers/gpu/drm/i915/intel_runtime_pm.h  |  10 +-
 drivers/gpu/drm/i915/intel_wakeref.h |   6 +-
 drivers/gpu/drm/i915/intel_wakeref_tracker.c | 234 ++
 drivers/gpu/drm/i915/intel_wakeref_tracker.h |  76 ++
 7 files changed, 355 insertions(+), 228 deletions(-)
 create mode 100644 drivers/gpu/drm/i915/intel_wakeref_tracker.c
 create mode 100644 drivers/gpu/drm/i915/intel_wakeref_tracker.h

diff --git a/drivers/gpu/drm/i915/Kconfig.debug 
b/drivers/gpu/drm/i915/Kconfig.debug
index e7fd3e76f8a20..8b1973146e848 100644
--- a/drivers/gpu/drm/i915/Kconfig.debug
+++ b/drivers/gpu/drm/i915/Kconfig.debug
@@ -33,6 +33,7 @@ config DRM_I915_DEBUG
select PREEMPT_COUNT
select I2C_CHARDEV
select STACKDEPOT
+   select STACKTRACE
select DRM_DP_AUX_CHARDEV
select X86_MSR # used by igt/pm_rpm
select DRM_VGEM # used by igt/prime_vgem (dmabuf interop checks)
@@ -45,6 +46,7 @@ config DRM_I915_DEBUG
select DRM_I915_DEBUG_GEM
select DRM_I915_DEBUG_GEM_ONCE
select DRM_I915_DEBUG_MMIO
+   select DRM_I915_TRACK_WAKEREF
select DRM_I915_DEBUG_RUNTIME_PM
select DRM_I915_SW_FENCE_DEBUG_OBJECTS
select DRM_I915_SELFTEST
@@ -235,11 +237,18 @@ config DRM_I915_DEBUG_VBLANK_EVADE
 
  If in doubt, say "N".
 
+config DRM_I915_TRACK_WAKEREF
+   depends on STACKDEPOT
+   depends on STACKTRACE
+   bool
+
 config DRM_I915_DEBUG_RUNTIME_PM
bool "Enable extra state checking for runtime PM"
depends on DRM_I915
default n
select STACKDEPOT
+   select STACKTRACE
+   select DRM_I915_TRACK_WAKEREF
help
  Choose this option to turn on extra state checking for the
  runtime PM functionality. This may introduce overhead during
diff --git a/drivers/gpu/drm/i915/Makefile b/drivers/gpu/drm/i915/Makefile
index 9d588d936e3dc..88a403d3294cb 100644
--- a/drivers/gpu/drm/i915/Makefile
+++ b/drivers/gpu/drm/i915/Makefile
@@ -75,6 +75,10 @@ i915-$(CONFIG_DEBUG_FS) += \
i915_debugfs_params.o \
display/intel_display_debugfs.o \
display/intel_pipe_crc.o
+
+i915-$(CONFIG_DRM_I915_TRACK_WAKEREF) += \
+   intel_wakeref_tracker.o
+
 i915-$(CONFIG_PERF_EVENTS) += i915_pmu.o
 
 # "Graphics Technology" (aka we talk to the gpu)
diff --git a/drivers/gpu/drm/i915/intel_runtime_pm.c 
b/drivers/gpu/drm/i915/intel_runtime_pm.c
index 6ed5786bcd299..7bd10efa56bf3 100644
--- a/drivers/gpu/drm/i915/intel_runtime_pm.c
+++ b/drivers/gpu/drm/i915/intel_runtime_pm.c
@@ -52,182 +52,37 @@
 
 #if IS_ENABLED(CONFIG_DRM_I915_DEBUG_RUNTIME_PM)
 
-#include 
-
-#define STACKDEPTH 8
-
-static noinline depot_stack_handle_t __save_depot_stack(void)
-{
-   unsigned long entries[STACKDEPTH];
-   unsigned int n;
-
-   n = stack_trace_save(entries, ARRAY_SIZE(entries), 1);
-   return stack_depot_save(entries, n, GFP_NOWAIT | __GFP_NOWARN);
-}
-
 static void init_intel_runtime_pm_wakeref(struct intel_runtime_pm *rpm)
 {
-   spin_lock_init(>debug.lock);
-   stack_depot_init();
+   intel_wakeref_tracker_init(>debug);
 }
 
-static noinline depot_stack_handle_t
+static intel_wakeref_t
 track_intel_runtime_pm_wakeref(struct intel_runtime_pm *rpm)
 {
-   depot_stack_handle_t stack, *stacks;
-   unsigned long flags;
-
-   if (rpm->no_wakeref_tracking)
-   return -1;
-
-   stack = __save_depot_stack();
-   if (!stack)
+   if (!rpm->available)
return -1;
 
-   spin_lock_irqsave(>debug.lock, flags);
-
-   if (!rpm->debug.count)
-   rpm->debug.last_acquire = stack;
-
-   stacks = krealloc(rpm->debug.owners,
- (rpm->debug.count + 1) * sizeof(*stacks),
- GFP_NOWAIT | __GFP_NOWARN);
-   if (stacks) {
-   stacks[rpm->debug.count++] = stack;
-   rpm->debug.owners = stacks;
-   } else {
-   stack = -1;
-   }
-
-   spin_unlock_irqrestore(>debug.lock, flags);
-
-   return stack;
+   return intel_wakeref_tracker_add(>debug);
 }
 
 static void untrack_intel_runtime_pm_wakeref(struct intel_runtime_pm *rpm,
-depot_stack_handle_t stack)
+intel_wakeref_t wakeref)
 {
-   struct drm_i915_private *i915 = container_of(rpm,
-struct drm_i915_private,
-

[Intel-gfx] [PATCH v2 05/11] lib/ref_tracker: __ref_tracker_dir_print improve printing

2022-02-21 Thread Andrzej Hajda
To improve readibility of ref_tracker printing following changes
have been performed:
- reports are printed per stack_handle - log is more compact,
- added display name for ref_tracker_dir,
- stack trace is printed indented, in the same printk call,
- total number of references is printed every time,
- print info about dropped references.

Signed-off-by: Andrzej Hajda 
---
 include/linux/ref_tracker.h | 15 +--
 lib/ref_tracker.c   | 90 -
 2 files changed, 91 insertions(+), 14 deletions(-)

diff --git a/include/linux/ref_tracker.h b/include/linux/ref_tracker.h
index 3e9e9df2a41f5..a2cf1f6309adb 100644
--- a/include/linux/ref_tracker.h
+++ b/include/linux/ref_tracker.h
@@ -17,12 +17,19 @@ struct ref_tracker_dir {
booldead;
struct list_headlist; /* List of active trackers */
struct list_headquarantine; /* List of dead trackers */
+   charname[32];
 #endif
 };
 
 #ifdef CONFIG_REF_TRACKER
-static inline void ref_tracker_dir_init(struct ref_tracker_dir *dir,
-   unsigned int quarantine_count)
+
+// Temporary allow two and three arguments, until consumers are converted
+#define ref_tracker_dir_init(_d, _q, args...) _ref_tracker_dir_init(_d, _q, 
##args, #_d)
+#define _ref_tracker_dir_init(_d, _q, _n, ...) __ref_tracker_dir_init(_d, _q, 
_n)
+
+static inline void __ref_tracker_dir_init(struct ref_tracker_dir *dir,
+   unsigned int quarantine_count,
+   const char *name)
 {
INIT_LIST_HEAD(>list);
INIT_LIST_HEAD(>quarantine);
@@ -31,6 +38,7 @@ static inline void ref_tracker_dir_init(struct 
ref_tracker_dir *dir,
dir->dead = false;
refcount_set(>untracked, 1);
refcount_set(>no_tracker, 1);
+   strlcpy(dir->name, name, sizeof(dir->name));
stack_depot_init();
 }
 
@@ -51,7 +59,8 @@ int ref_tracker_free(struct ref_tracker_dir *dir,
 #else /* CONFIG_REF_TRACKER */
 
 static inline void ref_tracker_dir_init(struct ref_tracker_dir *dir,
-   unsigned int quarantine_count)
+   unsigned int quarantine_count,
+   ...)
 {
 }
 
diff --git a/lib/ref_tracker.c b/lib/ref_tracker.c
index 5e9f90bbf771b..ab1253fde244e 100644
--- a/lib/ref_tracker.c
+++ b/lib/ref_tracker.c
@@ -1,11 +1,16 @@
 // SPDX-License-Identifier: GPL-2.0-or-later
+
+#define pr_fmt(fmt) "ref_tracker: " fmt
+
 #include 
+#include 
 #include 
 #include 
 #include 
 #include 
 
 #define REF_TRACKER_STACK_ENTRIES 16
+#define STACK_BUF_SIZE 1024
 
 struct ref_tracker {
struct list_headhead;   /* anchor into dir->list or 
dir->quarantine */
@@ -14,24 +19,87 @@ struct ref_tracker {
depot_stack_handle_tfree_stack_handle;
 };
 
-void __ref_tracker_dir_print(struct ref_tracker_dir *dir,
-  unsigned int display_limit)
+struct ref_tracker_dir_stats {
+   int total;
+   int count;
+   struct {
+   depot_stack_handle_t stack_handle;
+   unsigned int count;
+   } stacks[];
+};
+
+static struct ref_tracker_dir_stats *
+ref_tracker_get_stats(struct ref_tracker_dir *dir, unsigned int limit)
 {
+   struct ref_tracker_dir_stats *stats;
struct ref_tracker *tracker;
-   unsigned int i = 0;
 
-   lockdep_assert_held(>lock);
+   stats = kmalloc(struct_size(stats, stacks, limit),
+   GFP_NOWAIT | __GFP_NOWARN);
+   if (!stats)
+   return ERR_PTR(-ENOMEM);
+   stats->total = 0;
+   stats->count = 0;
 
list_for_each_entry(tracker, >list, head) {
-   if (i < display_limit) {
-   pr_err("leaked reference.\n");
-   if (tracker->alloc_stack_handle)
-   stack_depot_print(tracker->alloc_stack_handle);
-   i++;
-   } else {
-   break;
+   depot_stack_handle_t stack = tracker->alloc_stack_handle;
+   int i;
+
+   ++stats->total;
+   for (i = 0; i < stats->count; ++i)
+   if (stats->stacks[i].stack_handle == stack)
+   break;
+   if (i >= limit)
+   continue;
+   if (i >= stats->count) {
+   stats->stacks[i].stack_handle = stack;
+   stats->stacks[i].count = 0;
+   ++stats->count;
}
+   ++stats->stacks[i].count;
+   }
+
+   return stats;
+}
+
+void __ref_tracker_dir_print(struct ref_tracker_dir *dir,
+  unsigned int display_limit)
+{
+   struct ref_tracker_dir_stats *stats;
+   unsigned int i = 0, skipped;
+   depot_stack_handle_t stack;
+  

[Intel-gfx] [PATCH v2 5/9] lib/ref_tracker: improve allocation flags

2022-02-21 Thread Andrzej Hajda
Library can be called in non-sleeping context, so it should not use
__GFP_NOFAIL. Instead it should calmly handle allocation fails, for
this __GFP_NOWARN has been added as well.

Signed-off-by: Andrzej Hajda 
---
 lib/ref_tracker.c | 11 ++-
 1 file changed, 6 insertions(+), 5 deletions(-)

diff --git a/lib/ref_tracker.c b/lib/ref_tracker.c
index 7b00bca300043..c8441ffbb058a 100644
--- a/lib/ref_tracker.c
+++ b/lib/ref_tracker.c
@@ -59,7 +59,7 @@ __ref_tracker_dir_pr_ostream(struct ref_tracker_dir *dir,
if (list_empty(>list))
return;
 
-   sbuf = kmalloc(STACK_BUF_SIZE, GFP_NOWAIT);
+   sbuf = kmalloc(STACK_BUF_SIZE, GFP_NOWAIT | __GFP_NOWARN);
 
list_for_each_entry(tracker, >list, head)
++total;
@@ -154,11 +154,11 @@ int ref_tracker_alloc(struct ref_tracker_dir *dir,
unsigned long entries[REF_TRACKER_STACK_ENTRIES];
struct ref_tracker *tracker;
unsigned int nr_entries;
-   gfp_t gfp_mask = gfp;
+   gfp_t gfp_mask;
unsigned long flags;
 
-   if (gfp & __GFP_DIRECT_RECLAIM)
-   gfp_mask |= __GFP_NOFAIL;
+   gfp |= __GFP_NOWARN;
+   gfp_mask = (gfp & __GFP_DIRECT_RECLAIM) ? (gfp | __GFP_NOFAIL) : gfp;
*trackerp = tracker = kzalloc(sizeof(*tracker), gfp_mask);
if (unlikely(!tracker)) {
pr_err_once("memory allocation failure, unreliable refcount 
tracker.\n");
@@ -191,7 +191,8 @@ int ref_tracker_free(struct ref_tracker_dir *dir,
}
nr_entries = stack_trace_save(entries, ARRAY_SIZE(entries), 1);
nr_entries = filter_irq_stacks(entries, nr_entries);
-   stack_handle = stack_depot_save(entries, nr_entries, GFP_ATOMIC);
+   stack_handle = stack_depot_save(entries, nr_entries,
+   GFP_NOWAIT | __GFP_NOWARN);
 
spin_lock_irqsave(>lock, flags);
if (tracker->dead) {
-- 
2.25.1



[Intel-gfx] [PATCH v2 4/9] lib/ref_tracker: add printing to memory buffer

2022-02-21 Thread Andrzej Hajda
In case one wants to show stats via debugfs.

Signed-off-by: Andrzej Hajda 
Reviewed-by: Chris Wilson 
---
 include/linux/ref_tracker.h |  8 ++
 lib/ref_tracker.c   | 52 -
 2 files changed, 54 insertions(+), 6 deletions(-)

diff --git a/include/linux/ref_tracker.h b/include/linux/ref_tracker.h
index 090230e5b485d..6d2634590ee5a 100644
--- a/include/linux/ref_tracker.h
+++ b/include/linux/ref_tracker.h
@@ -46,6 +46,8 @@ void __ref_tracker_dir_print(struct ref_tracker_dir *dir,
 void ref_tracker_dir_print(struct ref_tracker_dir *dir,
   unsigned int display_limit);
 
+int ref_tracker_dir_snprint(struct ref_tracker_dir *dir, char *buf, size_t 
size);
+
 int ref_tracker_alloc(struct ref_tracker_dir *dir,
  struct ref_tracker **trackerp, gfp_t gfp);
 
@@ -74,6 +76,12 @@ static inline void ref_tracker_dir_print(struct 
ref_tracker_dir *dir,
 {
 }
 
+static inline int ref_tracker_dir_snprint(struct ref_tracker_dir *dir,
+ char *buf, size_t size)
+{
+   return 0;
+}
+
 static inline int ref_tracker_alloc(struct ref_tracker_dir *dir,
struct ref_tracker **trackerp,
gfp_t gfp)
diff --git a/lib/ref_tracker.c b/lib/ref_tracker.c
index 943cff08110e3..7b00bca300043 100644
--- a/lib/ref_tracker.c
+++ b/lib/ref_tracker.c
@@ -27,8 +27,27 @@ static int ref_tracker_cmp(void *priv, const struct 
list_head *a, const struct l
return ta->alloc_stack_handle - tb->alloc_stack_handle;
 }
 
-void __ref_tracker_dir_print(struct ref_tracker_dir *dir,
-  unsigned int display_limit)
+struct ostream {
+   char *buf;
+   int size, used;
+};
+
+#define pr_ostream(stream, fmt, args...) \
+({ \
+   struct ostream *_s = (stream); \
+\
+   if (!_s->buf) { \
+   pr_err(fmt, ##args); \
+   } else { \
+   int ret, len = _s->size - _s->used; \
+   ret = snprintf(_s->buf + _s->used, len, pr_fmt(fmt), ##args); \
+   _s->used += min(ret, len); \
+   } \
+})
+
+static void
+__ref_tracker_dir_pr_ostream(struct ref_tracker_dir *dir,
+unsigned int display_limit, struct ostream *s)
 {
unsigned int i = 0, count = 0, total = 0;
struct ref_tracker *tracker;
@@ -58,16 +77,24 @@ void __ref_tracker_dir_print(struct ref_tracker_dir *dir,
 
if (sbuf && !stack_depot_snprint(stack, sbuf, STACK_BUF_SIZE, 
4))
sbuf[0] = 0;
-   pr_err("%s@%pK has %d/%d users at\n%s\n",
-  dir->name, dir, count, total, sbuf);
+   pr_ostream(s, "%s@%pK has %d/%d users at\n%s\n",
+  dir->name, dir, count, total, sbuf);
count = 0;
}
if (i > display_limit)
-   pr_err("%s@%pK skipped %d/%d reports with %d unique stacks.\n",
-  dir->name, dir, count, total, i - display_limit);
+   pr_ostream(s, "%s@%pK skipped %d/%d reports with %d unique 
stacks.\n",
+  dir->name, dir, count, total, i - display_limit);
 
kfree(sbuf);
 }
+
+void __ref_tracker_dir_print(struct ref_tracker_dir *dir,
+  unsigned int display_limit)
+{
+   struct ostream os = {};
+
+   __ref_tracker_dir_pr_ostream(dir, display_limit, );
+}
 EXPORT_SYMBOL(__ref_tracker_dir_print);
 
 void ref_tracker_dir_print(struct ref_tracker_dir *dir,
@@ -81,6 +108,19 @@ void ref_tracker_dir_print(struct ref_tracker_dir *dir,
 }
 EXPORT_SYMBOL(ref_tracker_dir_print);
 
+int ref_tracker_dir_snprint(struct ref_tracker_dir *dir, char *buf, size_t 
size)
+{
+   struct ostream os = { .buf = buf, .size = size };
+   unsigned long flags;
+
+   spin_lock_irqsave(>lock, flags);
+   __ref_tracker_dir_pr_ostream(dir, 16, );
+   spin_unlock_irqrestore(>lock, flags);
+
+   return os.used;
+}
+EXPORT_SYMBOL(ref_tracker_dir_snprint);
+
 void ref_tracker_dir_exit(struct ref_tracker_dir *dir)
 {
struct ref_tracker *tracker, *n;
-- 
2.25.1



[Intel-gfx] [PATCH v2 04/11] lib/ref_tracker: add unlocked leak print helper

2022-02-21 Thread Andrzej Hajda
To have reliable detection of leaks, caller must be able to check under the same
lock both: tracked counter and the leaks. dir.lock is natural candidate for such
lock and unlocked print helper can be called with this lock taken.
As a bonus we can reuse this helper in ref_tracker_dir_exit.

Signed-off-by: Andrzej Hajda 
Reviewed-by: Chris Wilson 
---
 include/linux/ref_tracker.h |  8 +
 lib/ref_tracker.c   | 66 +
 2 files changed, 46 insertions(+), 28 deletions(-)

diff --git a/include/linux/ref_tracker.h b/include/linux/ref_tracker.h
index 9ca353ab712b5..3e9e9df2a41f5 100644
--- a/include/linux/ref_tracker.h
+++ b/include/linux/ref_tracker.h
@@ -36,6 +36,9 @@ static inline void ref_tracker_dir_init(struct 
ref_tracker_dir *dir,
 
 void ref_tracker_dir_exit(struct ref_tracker_dir *dir);
 
+void __ref_tracker_dir_print(struct ref_tracker_dir *dir,
+  unsigned int display_limit);
+
 void ref_tracker_dir_print(struct ref_tracker_dir *dir,
   unsigned int display_limit);
 
@@ -56,6 +59,11 @@ static inline void ref_tracker_dir_exit(struct 
ref_tracker_dir *dir)
 {
 }
 
+static inline void __ref_tracker_dir_print(struct ref_tracker_dir *dir,
+  unsigned int display_limit)
+{
+}
+
 static inline void ref_tracker_dir_print(struct ref_tracker_dir *dir,
 unsigned int display_limit)
 {
diff --git a/lib/ref_tracker.c b/lib/ref_tracker.c
index dc7b14aa3431e..5e9f90bbf771b 100644
--- a/lib/ref_tracker.c
+++ b/lib/ref_tracker.c
@@ -14,6 +14,38 @@ struct ref_tracker {
depot_stack_handle_tfree_stack_handle;
 };
 
+void __ref_tracker_dir_print(struct ref_tracker_dir *dir,
+  unsigned int display_limit)
+{
+   struct ref_tracker *tracker;
+   unsigned int i = 0;
+
+   lockdep_assert_held(>lock);
+
+   list_for_each_entry(tracker, >list, head) {
+   if (i < display_limit) {
+   pr_err("leaked reference.\n");
+   if (tracker->alloc_stack_handle)
+   stack_depot_print(tracker->alloc_stack_handle);
+   i++;
+   } else {
+   break;
+   }
+   }
+}
+EXPORT_SYMBOL(__ref_tracker_dir_print);
+
+void ref_tracker_dir_print(struct ref_tracker_dir *dir,
+  unsigned int display_limit)
+{
+   unsigned long flags;
+
+   spin_lock_irqsave(>lock, flags);
+   __ref_tracker_dir_print(dir, display_limit);
+   spin_unlock_irqrestore(>lock, flags);
+}
+EXPORT_SYMBOL(ref_tracker_dir_print);
+
 void ref_tracker_dir_exit(struct ref_tracker_dir *dir)
 {
struct ref_tracker *tracker, *n;
@@ -27,13 +59,13 @@ void ref_tracker_dir_exit(struct ref_tracker_dir *dir)
kfree(tracker);
dir->quarantine_avail++;
}
-   list_for_each_entry_safe(tracker, n, >list, head) {
-   pr_err("leaked reference.\n");
-   if (tracker->alloc_stack_handle)
-   stack_depot_print(tracker->alloc_stack_handle);
+   if (!list_empty(>list)) {
+   __ref_tracker_dir_print(dir, 16);
leak = true;
-   list_del(>head);
-   kfree(tracker);
+   list_for_each_entry_safe(tracker, n, >list, head) {
+   list_del(>head);
+   kfree(tracker);
+   }
}
spin_unlock_irqrestore(>lock, flags);
WARN_ON_ONCE(leak);
@@ -42,28 +74,6 @@ void ref_tracker_dir_exit(struct ref_tracker_dir *dir)
 }
 EXPORT_SYMBOL(ref_tracker_dir_exit);
 
-void ref_tracker_dir_print(struct ref_tracker_dir *dir,
-  unsigned int display_limit)
-{
-   struct ref_tracker *tracker;
-   unsigned long flags;
-   unsigned int i = 0;
-
-   spin_lock_irqsave(>lock, flags);
-   list_for_each_entry(tracker, >list, head) {
-   if (i < display_limit) {
-   pr_err("leaked reference.\n");
-   if (tracker->alloc_stack_handle)
-   stack_depot_print(tracker->alloc_stack_handle);
-   i++;
-   } else {
-   break;
-   }
-   }
-   spin_unlock_irqrestore(>lock, flags);
-}
-EXPORT_SYMBOL(ref_tracker_dir_print);
-
 int ref_tracker_alloc(struct ref_tracker_dir *dir,
  struct ref_tracker **trackerp,
  gfp_t gfp)
-- 
2.25.1



[Intel-gfx] [PATCH v2 03/11] ref_tracker: remove filter_irq_stacks() call

2022-02-21 Thread Andrzej Hajda
From: Eric Dumazet 

After commit e94006608949 ("lib/stackdepot: always do filter_irq_stacks()
in stack_depot_save()") it became unnecessary to filter the stack
before calling stack_depot_save().

Signed-off-by: Eric Dumazet 
Cc: Marco Elver 
Cc: Alexander Potapenko 
Cc: Dmitry Vyukov 
Signed-off-by: David S. Miller 
Signed-off-by: Andrzej Hajda 
---
 lib/ref_tracker.c | 2 --
 1 file changed, 2 deletions(-)

diff --git a/lib/ref_tracker.c b/lib/ref_tracker.c
index 9c0c2e09df666..dc7b14aa3431e 100644
--- a/lib/ref_tracker.c
+++ b/lib/ref_tracker.c
@@ -89,7 +89,6 @@ int ref_tracker_alloc(struct ref_tracker_dir *dir,
return -ENOMEM;
}
nr_entries = stack_trace_save(entries, ARRAY_SIZE(entries), 1);
-   nr_entries = filter_irq_stacks(entries, nr_entries);
tracker->alloc_stack_handle = stack_depot_save(entries, nr_entries, 
gfp);
 
spin_lock_irqsave(>lock, flags);
@@ -120,7 +119,6 @@ int ref_tracker_free(struct ref_tracker_dir *dir,
return -EEXIST;
}
nr_entries = stack_trace_save(entries, ARRAY_SIZE(entries), 1);
-   nr_entries = filter_irq_stacks(entries, nr_entries);
stack_handle = stack_depot_save(entries, nr_entries, GFP_ATOMIC);
 
spin_lock_irqsave(>lock, flags);
-- 
2.25.1



[Intel-gfx] [PATCH v2 3/9] lib/ref_tracker: __ref_tracker_dir_print improve printing

2022-02-21 Thread Andrzej Hajda
To improve readibility of ref_tracker printing following changes
have been performed:
- added display name for ref_tracker_dir,
- stack trace is printed indented, in the same printk call,
- total number of references is printed every time,
- print info about dropped references.

Signed-off-by: Andrzej Hajda 
Reviewed-by: Chris Wilson 
---
 include/linux/ref_tracker.h | 15 ---
 lib/ref_tracker.c   | 28 ++--
 2 files changed, 34 insertions(+), 9 deletions(-)

diff --git a/include/linux/ref_tracker.h b/include/linux/ref_tracker.h
index b9c968a716483..090230e5b485d 100644
--- a/include/linux/ref_tracker.h
+++ b/include/linux/ref_tracker.h
@@ -15,18 +15,26 @@ struct ref_tracker_dir {
refcount_t  untracked;
struct list_headlist; /* List of active trackers */
struct list_headquarantine; /* List of dead trackers */
+   charname[32];
 #endif
 };
 
 #ifdef CONFIG_REF_TRACKER
-static inline void ref_tracker_dir_init(struct ref_tracker_dir *dir,
-   unsigned int quarantine_count)
+
+// Temporary allow two and three arguments, until consumers are converted
+#define ref_tracker_dir_init(_d, _q, args...) _ref_tracker_dir_init(_d, _q, 
##args, #_d)
+#define _ref_tracker_dir_init(_d, _q, _n, ...) __ref_tracker_dir_init(_d, _q, 
_n)
+
+static inline void __ref_tracker_dir_init(struct ref_tracker_dir *dir,
+   unsigned int quarantine_count,
+   const char *name)
 {
INIT_LIST_HEAD(>list);
INIT_LIST_HEAD(>quarantine);
spin_lock_init(>lock);
dir->quarantine_avail = quarantine_count;
refcount_set(>untracked, 1);
+   strlcpy(dir->name, name, sizeof(dir->name));
stack_depot_init();
 }
 
@@ -47,7 +55,8 @@ int ref_tracker_free(struct ref_tracker_dir *dir,
 #else /* CONFIG_REF_TRACKER */
 
 static inline void ref_tracker_dir_init(struct ref_tracker_dir *dir,
-   unsigned int quarantine_count)
+   unsigned int quarantine_count,
+   ...)
 {
 }
 
diff --git a/lib/ref_tracker.c b/lib/ref_tracker.c
index 0e9c7d2828ccb..943cff08110e3 100644
--- a/lib/ref_tracker.c
+++ b/lib/ref_tracker.c
@@ -1,4 +1,7 @@
 // SPDX-License-Identifier: GPL-2.0-or-later
+
+#define pr_fmt(fmt) "ref_tracker: " fmt
+
 #include 
 #include 
 #include 
@@ -7,6 +10,7 @@
 #include 
 
 #define REF_TRACKER_STACK_ENTRIES 16
+#define STACK_BUF_SIZE 1024
 
 struct ref_tracker {
struct list_headhead;   /* anchor into dir->list or 
dir->quarantine */
@@ -26,31 +30,43 @@ static int ref_tracker_cmp(void *priv, const struct 
list_head *a, const struct l
 void __ref_tracker_dir_print(struct ref_tracker_dir *dir,
   unsigned int display_limit)
 {
-   unsigned int i = 0, count = 0;
+   unsigned int i = 0, count = 0, total = 0;
struct ref_tracker *tracker;
depot_stack_handle_t stack;
+   char *sbuf;
 
lockdep_assert_held(>lock);
 
if (list_empty(>list))
return;
 
+   sbuf = kmalloc(STACK_BUF_SIZE, GFP_NOWAIT);
+
+   list_for_each_entry(tracker, >list, head)
+   ++total;
+
list_sort(NULL, >list, ref_tracker_cmp);
 
list_for_each_entry(tracker, >list, head) {
-   if (i++ >= display_limit)
-   break;
if (!count++)
stack = tracker->alloc_stack_handle;
if (stack == tracker->alloc_stack_handle &&
!list_is_last(>head, >list))
continue;
+   if (i++ >= display_limit)
+   continue;
 
-   pr_err("leaked %d references.\n", count);
-   if (stack)
-   stack_depot_print(stack);
+   if (sbuf && !stack_depot_snprint(stack, sbuf, STACK_BUF_SIZE, 
4))
+   sbuf[0] = 0;
+   pr_err("%s@%pK has %d/%d users at\n%s\n",
+  dir->name, dir, count, total, sbuf);
count = 0;
}
+   if (i > display_limit)
+   pr_err("%s@%pK skipped %d/%d reports with %d unique stacks.\n",
+  dir->name, dir, count, total, i - display_limit);
+
+   kfree(sbuf);
 }
 EXPORT_SYMBOL(__ref_tracker_dir_print);
 
-- 
2.25.1



[Intel-gfx] [PATCH v2 02/11] ref_tracker: add a count of untracked references

2022-02-21 Thread Andrzej Hajda
From: Eric Dumazet 

We are still chasing a netdev refcount imbalance, and we suspect
we have one rogue dev_put() that is consuming a reference taken
from a dev_hold_track()

To detect this case, allow ref_tracker_alloc() and ref_tracker_free()
to be called with a NULL @trackerp parameter, and use a dedicated
refcount_t just for them.

Signed-off-by: Eric Dumazet 
Signed-off-by: David S. Miller 
Signed-off-by: Andrzej Hajda 
---
 include/linux/ref_tracker.h |  2 ++
 lib/ref_tracker.c   | 12 +++-
 2 files changed, 13 insertions(+), 1 deletion(-)

diff --git a/include/linux/ref_tracker.h b/include/linux/ref_tracker.h
index a443abda937d8..9ca353ab712b5 100644
--- a/include/linux/ref_tracker.h
+++ b/include/linux/ref_tracker.h
@@ -13,6 +13,7 @@ struct ref_tracker_dir {
spinlock_t  lock;
unsigned intquarantine_avail;
refcount_t  untracked;
+   refcount_t  no_tracker;
booldead;
struct list_headlist; /* List of active trackers */
struct list_headquarantine; /* List of dead trackers */
@@ -29,6 +30,7 @@ static inline void ref_tracker_dir_init(struct 
ref_tracker_dir *dir,
dir->quarantine_avail = quarantine_count;
dir->dead = false;
refcount_set(>untracked, 1);
+   refcount_set(>no_tracker, 1);
stack_depot_init();
 }
 
diff --git a/lib/ref_tracker.c b/lib/ref_tracker.c
index 32ff6bd497f8e..9c0c2e09df666 100644
--- a/lib/ref_tracker.c
+++ b/lib/ref_tracker.c
@@ -38,6 +38,7 @@ void ref_tracker_dir_exit(struct ref_tracker_dir *dir)
spin_unlock_irqrestore(>lock, flags);
WARN_ON_ONCE(leak);
WARN_ON_ONCE(refcount_read(>untracked) != 1);
+   WARN_ON_ONCE(refcount_read(>no_tracker) != 1);
 }
 EXPORT_SYMBOL(ref_tracker_dir_exit);
 
@@ -75,6 +76,10 @@ int ref_tracker_alloc(struct ref_tracker_dir *dir,
 
WARN_ON_ONCE(dir->dead);
 
+   if (!trackerp) {
+   refcount_inc(>no_tracker);
+   return 0;
+   }
if (gfp & __GFP_DIRECT_RECLAIM)
gfp_mask |= __GFP_NOFAIL;
*trackerp = tracker = kzalloc(sizeof(*tracker), gfp_mask);
@@ -98,13 +103,18 @@ int ref_tracker_free(struct ref_tracker_dir *dir,
 struct ref_tracker **trackerp)
 {
unsigned long entries[REF_TRACKER_STACK_ENTRIES];
-   struct ref_tracker *tracker = *trackerp;
depot_stack_handle_t stack_handle;
+   struct ref_tracker *tracker;
unsigned int nr_entries;
unsigned long flags;
 
WARN_ON_ONCE(dir->dead);
 
+   if (!trackerp) {
+   refcount_dec(>no_tracker);
+   return 0;
+   }
+   tracker = *trackerp;
if (!tracker) {
refcount_dec(>untracked);
return -EEXIST;
-- 
2.25.1



[Intel-gfx] [PATCH v2 03/11] [DO NOT MERGE] ref_tracker: remove filter_irq_stacks() call

2022-02-21 Thread Andrzej Hajda
From: Eric Dumazet 

After commit e94006608949 ("lib/stackdepot: always do filter_irq_stacks()
in stack_depot_save()") it became unnecessary to filter the stack
before calling stack_depot_save().

Signed-off-by: Eric Dumazet 
Cc: Marco Elver 
Cc: Alexander Potapenko 
Cc: Dmitry Vyukov 
Signed-off-by: David S. Miller 
Signed-off-by: Andrzej Hajda 
---
 lib/ref_tracker.c | 2 --
 1 file changed, 2 deletions(-)

diff --git a/lib/ref_tracker.c b/lib/ref_tracker.c
index 9c0c2e09df666..dc7b14aa3431e 100644
--- a/lib/ref_tracker.c
+++ b/lib/ref_tracker.c
@@ -89,7 +89,6 @@ int ref_tracker_alloc(struct ref_tracker_dir *dir,
return -ENOMEM;
}
nr_entries = stack_trace_save(entries, ARRAY_SIZE(entries), 1);
-   nr_entries = filter_irq_stacks(entries, nr_entries);
tracker->alloc_stack_handle = stack_depot_save(entries, nr_entries, 
gfp);
 
spin_lock_irqsave(>lock, flags);
@@ -120,7 +119,6 @@ int ref_tracker_free(struct ref_tracker_dir *dir,
return -EEXIST;
}
nr_entries = stack_trace_save(entries, ARRAY_SIZE(entries), 1);
-   nr_entries = filter_irq_stacks(entries, nr_entries);
stack_handle = stack_depot_save(entries, nr_entries, GFP_ATOMIC);
 
spin_lock_irqsave(>lock, flags);
-- 
2.25.1



[Intel-gfx] [PATCH v2 2/9] lib/ref_tracker: compact stacktraces before printing

2022-02-21 Thread Andrzej Hajda
In cases references are taken alternately on multiple exec paths leak
report can grow substantially, sorting and grouping leaks by stack_handle
allows to compact it.

Signed-off-by: Andrzej Hajda 
Reviewed-by: Chris Wilson 
---
 lib/ref_tracker.c | 35 +++
 1 file changed, 27 insertions(+), 8 deletions(-)

diff --git a/lib/ref_tracker.c b/lib/ref_tracker.c
index 1b0c6d645d64a..0e9c7d2828ccb 100644
--- a/lib/ref_tracker.c
+++ b/lib/ref_tracker.c
@@ -1,5 +1,6 @@
 // SPDX-License-Identifier: GPL-2.0-or-later
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -14,23 +15,41 @@ struct ref_tracker {
depot_stack_handle_tfree_stack_handle;
 };
 
+static int ref_tracker_cmp(void *priv, const struct list_head *a, const struct 
list_head *b)
+{
+   const struct ref_tracker *ta = list_entry(a, const struct ref_tracker, 
head);
+   const struct ref_tracker *tb = list_entry(b, const struct ref_tracker, 
head);
+
+   return ta->alloc_stack_handle - tb->alloc_stack_handle;
+}
+
 void __ref_tracker_dir_print(struct ref_tracker_dir *dir,
   unsigned int display_limit)
 {
+   unsigned int i = 0, count = 0;
struct ref_tracker *tracker;
-   unsigned int i = 0;
+   depot_stack_handle_t stack;
 
lockdep_assert_held(>lock);
 
+   if (list_empty(>list))
+   return;
+
+   list_sort(NULL, >list, ref_tracker_cmp);
+
list_for_each_entry(tracker, >list, head) {
-   if (i < display_limit) {
-   pr_err("leaked reference.\n");
-   if (tracker->alloc_stack_handle)
-   stack_depot_print(tracker->alloc_stack_handle);
-   i++;
-   } else {
+   if (i++ >= display_limit)
break;
-   }
+   if (!count++)
+   stack = tracker->alloc_stack_handle;
+   if (stack == tracker->alloc_stack_handle &&
+   !list_is_last(>head, >list))
+   continue;
+
+   pr_err("leaked %d references.\n", count);
+   if (stack)
+   stack_depot_print(stack);
+   count = 0;
}
 }
 EXPORT_SYMBOL(__ref_tracker_dir_print);
-- 
2.25.1



[Intel-gfx] [PATCH v2 02/11] [DO NOT MERGE] ref_tracker: add a count of untracked references

2022-02-21 Thread Andrzej Hajda
From: Eric Dumazet 

We are still chasing a netdev refcount imbalance, and we suspect
we have one rogue dev_put() that is consuming a reference taken
from a dev_hold_track()

To detect this case, allow ref_tracker_alloc() and ref_tracker_free()
to be called with a NULL @trackerp parameter, and use a dedicated
refcount_t just for them.

Signed-off-by: Eric Dumazet 
Signed-off-by: David S. Miller 
Signed-off-by: Andrzej Hajda 
---
 include/linux/ref_tracker.h |  2 ++
 lib/ref_tracker.c   | 12 +++-
 2 files changed, 13 insertions(+), 1 deletion(-)

diff --git a/include/linux/ref_tracker.h b/include/linux/ref_tracker.h
index a443abda937d8..9ca353ab712b5 100644
--- a/include/linux/ref_tracker.h
+++ b/include/linux/ref_tracker.h
@@ -13,6 +13,7 @@ struct ref_tracker_dir {
spinlock_t  lock;
unsigned intquarantine_avail;
refcount_t  untracked;
+   refcount_t  no_tracker;
booldead;
struct list_headlist; /* List of active trackers */
struct list_headquarantine; /* List of dead trackers */
@@ -29,6 +30,7 @@ static inline void ref_tracker_dir_init(struct 
ref_tracker_dir *dir,
dir->quarantine_avail = quarantine_count;
dir->dead = false;
refcount_set(>untracked, 1);
+   refcount_set(>no_tracker, 1);
stack_depot_init();
 }
 
diff --git a/lib/ref_tracker.c b/lib/ref_tracker.c
index 32ff6bd497f8e..9c0c2e09df666 100644
--- a/lib/ref_tracker.c
+++ b/lib/ref_tracker.c
@@ -38,6 +38,7 @@ void ref_tracker_dir_exit(struct ref_tracker_dir *dir)
spin_unlock_irqrestore(>lock, flags);
WARN_ON_ONCE(leak);
WARN_ON_ONCE(refcount_read(>untracked) != 1);
+   WARN_ON_ONCE(refcount_read(>no_tracker) != 1);
 }
 EXPORT_SYMBOL(ref_tracker_dir_exit);
 
@@ -75,6 +76,10 @@ int ref_tracker_alloc(struct ref_tracker_dir *dir,
 
WARN_ON_ONCE(dir->dead);
 
+   if (!trackerp) {
+   refcount_inc(>no_tracker);
+   return 0;
+   }
if (gfp & __GFP_DIRECT_RECLAIM)
gfp_mask |= __GFP_NOFAIL;
*trackerp = tracker = kzalloc(sizeof(*tracker), gfp_mask);
@@ -98,13 +103,18 @@ int ref_tracker_free(struct ref_tracker_dir *dir,
 struct ref_tracker **trackerp)
 {
unsigned long entries[REF_TRACKER_STACK_ENTRIES];
-   struct ref_tracker *tracker = *trackerp;
depot_stack_handle_t stack_handle;
+   struct ref_tracker *tracker;
unsigned int nr_entries;
unsigned long flags;
 
WARN_ON_ONCE(dir->dead);
 
+   if (!trackerp) {
+   refcount_dec(>no_tracker);
+   return 0;
+   }
+   tracker = *trackerp;
if (!tracker) {
refcount_dec(>untracked);
return -EEXIST;
-- 
2.25.1



[Intel-gfx] [PATCH v2 01/11] ref_tracker: implement use-after-free detection

2022-02-21 Thread Andrzej Hajda
From: Eric Dumazet 

Whenever ref_tracker_dir_init() is called, mark the struct ref_tracker_dir
as dead.

Test the dead status from ref_tracker_alloc() and ref_tracker_free()

This should detect buggy dev_put()/dev_hold() happening too late
in netdevice dismantle process.

Signed-off-by: Eric Dumazet 
Signed-off-by: David S. Miller 
Signed-off-by: Andrzej Hajda 
---
 include/linux/ref_tracker.h | 2 ++
 lib/ref_tracker.c   | 5 +
 2 files changed, 7 insertions(+)

diff --git a/include/linux/ref_tracker.h b/include/linux/ref_tracker.h
index 60f3453be23e6..a443abda937d8 100644
--- a/include/linux/ref_tracker.h
+++ b/include/linux/ref_tracker.h
@@ -13,6 +13,7 @@ struct ref_tracker_dir {
spinlock_t  lock;
unsigned intquarantine_avail;
refcount_t  untracked;
+   booldead;
struct list_headlist; /* List of active trackers */
struct list_headquarantine; /* List of dead trackers */
 #endif
@@ -26,6 +27,7 @@ static inline void ref_tracker_dir_init(struct 
ref_tracker_dir *dir,
INIT_LIST_HEAD(>quarantine);
spin_lock_init(>lock);
dir->quarantine_avail = quarantine_count;
+   dir->dead = false;
refcount_set(>untracked, 1);
stack_depot_init();
 }
diff --git a/lib/ref_tracker.c b/lib/ref_tracker.c
index a6789c0c626b0..32ff6bd497f8e 100644
--- a/lib/ref_tracker.c
+++ b/lib/ref_tracker.c
@@ -20,6 +20,7 @@ void ref_tracker_dir_exit(struct ref_tracker_dir *dir)
unsigned long flags;
bool leak = false;
 
+   dir->dead = true;
spin_lock_irqsave(>lock, flags);
list_for_each_entry_safe(tracker, n, >quarantine, head) {
list_del(>head);
@@ -72,6 +73,8 @@ int ref_tracker_alloc(struct ref_tracker_dir *dir,
gfp_t gfp_mask = gfp;
unsigned long flags;
 
+   WARN_ON_ONCE(dir->dead);
+
if (gfp & __GFP_DIRECT_RECLAIM)
gfp_mask |= __GFP_NOFAIL;
*trackerp = tracker = kzalloc(sizeof(*tracker), gfp_mask);
@@ -100,6 +103,8 @@ int ref_tracker_free(struct ref_tracker_dir *dir,
unsigned int nr_entries;
unsigned long flags;
 
+   WARN_ON_ONCE(dir->dead);
+
if (!tracker) {
refcount_dec(>untracked);
return -EEXIST;
-- 
2.25.1



[Intel-gfx] [PATCH v2 1/9] lib/ref_tracker: add unlocked leak print helper

2022-02-21 Thread Andrzej Hajda
To have reliable detection of leaks, caller must be able to check under the same
lock both: tracked counter and the leaks. dir.lock is natural candidate for such
lock and unlocked print helper can be called with this lock taken.
As a bonus we can reuse this helper in ref_tracker_dir_exit.

Signed-off-by: Andrzej Hajda 
Reviewed-by: Chris Wilson 
---
 include/linux/ref_tracker.h |  8 +
 lib/ref_tracker.c   | 66 +
 2 files changed, 46 insertions(+), 28 deletions(-)

diff --git a/include/linux/ref_tracker.h b/include/linux/ref_tracker.h
index 60f3453be23e6..b9c968a716483 100644
--- a/include/linux/ref_tracker.h
+++ b/include/linux/ref_tracker.h
@@ -32,6 +32,9 @@ static inline void ref_tracker_dir_init(struct 
ref_tracker_dir *dir,
 
 void ref_tracker_dir_exit(struct ref_tracker_dir *dir);
 
+void __ref_tracker_dir_print(struct ref_tracker_dir *dir,
+  unsigned int display_limit);
+
 void ref_tracker_dir_print(struct ref_tracker_dir *dir,
   unsigned int display_limit);
 
@@ -52,6 +55,11 @@ static inline void ref_tracker_dir_exit(struct 
ref_tracker_dir *dir)
 {
 }
 
+static inline void __ref_tracker_dir_print(struct ref_tracker_dir *dir,
+  unsigned int display_limit)
+{
+}
+
 static inline void ref_tracker_dir_print(struct ref_tracker_dir *dir,
 unsigned int display_limit)
 {
diff --git a/lib/ref_tracker.c b/lib/ref_tracker.c
index a6789c0c626b0..1b0c6d645d64a 100644
--- a/lib/ref_tracker.c
+++ b/lib/ref_tracker.c
@@ -14,6 +14,38 @@ struct ref_tracker {
depot_stack_handle_tfree_stack_handle;
 };
 
+void __ref_tracker_dir_print(struct ref_tracker_dir *dir,
+  unsigned int display_limit)
+{
+   struct ref_tracker *tracker;
+   unsigned int i = 0;
+
+   lockdep_assert_held(>lock);
+
+   list_for_each_entry(tracker, >list, head) {
+   if (i < display_limit) {
+   pr_err("leaked reference.\n");
+   if (tracker->alloc_stack_handle)
+   stack_depot_print(tracker->alloc_stack_handle);
+   i++;
+   } else {
+   break;
+   }
+   }
+}
+EXPORT_SYMBOL(__ref_tracker_dir_print);
+
+void ref_tracker_dir_print(struct ref_tracker_dir *dir,
+  unsigned int display_limit)
+{
+   unsigned long flags;
+
+   spin_lock_irqsave(>lock, flags);
+   __ref_tracker_dir_print(dir, display_limit);
+   spin_unlock_irqrestore(>lock, flags);
+}
+EXPORT_SYMBOL(ref_tracker_dir_print);
+
 void ref_tracker_dir_exit(struct ref_tracker_dir *dir)
 {
struct ref_tracker *tracker, *n;
@@ -26,13 +58,13 @@ void ref_tracker_dir_exit(struct ref_tracker_dir *dir)
kfree(tracker);
dir->quarantine_avail++;
}
-   list_for_each_entry_safe(tracker, n, >list, head) {
-   pr_err("leaked reference.\n");
-   if (tracker->alloc_stack_handle)
-   stack_depot_print(tracker->alloc_stack_handle);
+   if (!list_empty(>list)) {
+   __ref_tracker_dir_print(dir, 16);
leak = true;
-   list_del(>head);
-   kfree(tracker);
+   list_for_each_entry_safe(tracker, n, >list, head) {
+   list_del(>head);
+   kfree(tracker);
+   }
}
spin_unlock_irqrestore(>lock, flags);
WARN_ON_ONCE(leak);
@@ -40,28 +72,6 @@ void ref_tracker_dir_exit(struct ref_tracker_dir *dir)
 }
 EXPORT_SYMBOL(ref_tracker_dir_exit);
 
-void ref_tracker_dir_print(struct ref_tracker_dir *dir,
-  unsigned int display_limit)
-{
-   struct ref_tracker *tracker;
-   unsigned long flags;
-   unsigned int i = 0;
-
-   spin_lock_irqsave(>lock, flags);
-   list_for_each_entry(tracker, >list, head) {
-   if (i < display_limit) {
-   pr_err("leaked reference.\n");
-   if (tracker->alloc_stack_handle)
-   stack_depot_print(tracker->alloc_stack_handle);
-   i++;
-   } else {
-   break;
-   }
-   }
-   spin_unlock_irqrestore(>lock, flags);
-}
-EXPORT_SYMBOL(ref_tracker_dir_print);
-
 int ref_tracker_alloc(struct ref_tracker_dir *dir,
  struct ref_tracker **trackerp,
  gfp_t gfp)
-- 
2.25.1



[Intel-gfx] [PATCH v2 01/11] [DO NOT MERGE] ref_tracker: implement use-after-free detection

2022-02-21 Thread Andrzej Hajda
From: Eric Dumazet 

Whenever ref_tracker_dir_init() is called, mark the struct ref_tracker_dir
as dead.

Test the dead status from ref_tracker_alloc() and ref_tracker_free()

This should detect buggy dev_put()/dev_hold() happening too late
in netdevice dismantle process.

Signed-off-by: Eric Dumazet 
Signed-off-by: David S. Miller 
Signed-off-by: Andrzej Hajda 
---
 include/linux/ref_tracker.h | 2 ++
 lib/ref_tracker.c   | 5 +
 2 files changed, 7 insertions(+)

diff --git a/include/linux/ref_tracker.h b/include/linux/ref_tracker.h
index 60f3453be23e6..a443abda937d8 100644
--- a/include/linux/ref_tracker.h
+++ b/include/linux/ref_tracker.h
@@ -13,6 +13,7 @@ struct ref_tracker_dir {
spinlock_t  lock;
unsigned intquarantine_avail;
refcount_t  untracked;
+   booldead;
struct list_headlist; /* List of active trackers */
struct list_headquarantine; /* List of dead trackers */
 #endif
@@ -26,6 +27,7 @@ static inline void ref_tracker_dir_init(struct 
ref_tracker_dir *dir,
INIT_LIST_HEAD(>quarantine);
spin_lock_init(>lock);
dir->quarantine_avail = quarantine_count;
+   dir->dead = false;
refcount_set(>untracked, 1);
stack_depot_init();
 }
diff --git a/lib/ref_tracker.c b/lib/ref_tracker.c
index a6789c0c626b0..32ff6bd497f8e 100644
--- a/lib/ref_tracker.c
+++ b/lib/ref_tracker.c
@@ -20,6 +20,7 @@ void ref_tracker_dir_exit(struct ref_tracker_dir *dir)
unsigned long flags;
bool leak = false;
 
+   dir->dead = true;
spin_lock_irqsave(>lock, flags);
list_for_each_entry_safe(tracker, n, >quarantine, head) {
list_del(>head);
@@ -72,6 +73,8 @@ int ref_tracker_alloc(struct ref_tracker_dir *dir,
gfp_t gfp_mask = gfp;
unsigned long flags;
 
+   WARN_ON_ONCE(dir->dead);
+
if (gfp & __GFP_DIRECT_RECLAIM)
gfp_mask |= __GFP_NOFAIL;
*trackerp = tracker = kzalloc(sizeof(*tracker), gfp_mask);
@@ -100,6 +103,8 @@ int ref_tracker_free(struct ref_tracker_dir *dir,
unsigned int nr_entries;
unsigned long flags;
 
+   WARN_ON_ONCE(dir->dead);
+
if (!tracker) {
refcount_dec(>untracked);
return -EEXIST;
-- 
2.25.1



[Intel-gfx] [PATCH v2 00/11] drm/i915: use ref_tracker library for tracking wakerefs

2022-02-21 Thread Andrzej Hajda
Hi,

Appearance of ref_tracker library allows to drop custom solution for wakeref
tracking used in i915 and reuse the library.
For this few adjustements has been made to ref_tracker, details in patches.
I hope changes are OK for original author.

The patchset has been rebased on top of drm-tip to allow test changes by CI.
Patches marked "[DO NOT MERGE]" are cherry-picked from linux-next (they are
not yet in drm-tip), to allow build and run CI on the patchset (it works only
on drm-tip tree).

Added CC to netdev as the only user of the library atm.

v2:
  - replaced list_sort with ref_tracker_dir_stats, to avoid potentially
extensive sorting, if number of reports is expected to be big enough (???)
we can replace linear search in ref_tracker_dir_stats.stacks with binary
heap (min_heap),
  - refactored gfp flags,
  - fixed i915 handling of no-tracking flag.

Regards
Andrzej


Andrzej Hajda (6):
  lib/ref_tracker: add unlocked leak print helper
  lib/ref_tracker: __ref_tracker_dir_print improve printing
  lib/ref_tracker: add printing to memory buffer
  lib/ref_tracker: remove warnings in case of allocation failure
  drm/i915: Correct type of wakeref variable
  drm/i915: replace Intel internal tracker with kernel core ref_tracker

Chris Wilson (2):
  drm/i915: Separate wakeref tracking
  drm/i915: Track leaked gt->wakerefs

Eric Dumazet (3):
  [DO NOT MERGE] ref_tracker: implement use-after-free detection
  [DO NOT MERGE] ref_tracker: add a count of untracked references
  [DO NOT MERGE] ref_tracker: remove filter_irq_stacks() call

 drivers/gpu/drm/i915/Kconfig.debug|  19 ++
 drivers/gpu/drm/i915/Makefile |   1 +
 .../drm/i915/display/intel_display_power.c|   2 +-
 .../gpu/drm/i915/gem/i915_gem_execbuffer.c|   7 +-
 .../i915/gem/selftests/i915_gem_coherency.c   |  10 +-
 .../drm/i915/gem/selftests/i915_gem_mman.c|  14 +-
 drivers/gpu/drm/i915/gt/intel_breadcrumbs.c   |  13 +-
 .../gpu/drm/i915/gt/intel_breadcrumbs_types.h |   3 +-
 drivers/gpu/drm/i915/gt/intel_engine_pm.c |   6 +-
 drivers/gpu/drm/i915/gt/intel_engine_types.h  |   2 +
 .../drm/i915/gt/intel_execlists_submission.c  |   2 +-
 drivers/gpu/drm/i915/gt/intel_gt_pm.c |  12 +-
 drivers/gpu/drm/i915/gt/intel_gt_pm.h |  36 ++-
 drivers/gpu/drm/i915/gt/intel_gt_pm_debugfs.c |   4 +-
 drivers/gpu/drm/i915/gt/selftest_engine_cs.c  |  20 +-
 drivers/gpu/drm/i915/gt/selftest_gt_pm.c  |   5 +-
 drivers/gpu/drm/i915/gt/selftest_reset.c  |  10 +-
 drivers/gpu/drm/i915/gt/selftest_rps.c|  17 +-
 drivers/gpu/drm/i915/gt/selftest_slpc.c   |  10 +-
 .../gpu/drm/i915/gt/uc/intel_guc_submission.c |  11 +-
 drivers/gpu/drm/i915/i915_pmu.c   |  16 +-
 drivers/gpu/drm/i915/intel_runtime_pm.c   | 239 ++
 drivers/gpu/drm/i915/intel_runtime_pm.h   |  10 +-
 drivers/gpu/drm/i915/intel_wakeref.c  |  10 +-
 drivers/gpu/drm/i915/intel_wakeref.h  | 112 +++-
 include/linux/ref_tracker.h   |  35 ++-
 lib/ref_tracker.c | 198 ---
 27 files changed, 480 insertions(+), 344 deletions(-)

-- 
2.25.1



[Intel-gfx] ✗ Fi.CI.IGT: failure for series starting with [1/4] drm/i915: Move framestart_delay to crtc_state

2022-02-21 Thread Patchwork
== Series Details ==

Series: series starting with [1/4] drm/i915: Move framestart_delay to crtc_state
URL   : https://patchwork.freedesktop.org/series/100484/
State : failure

== Summary ==

CI Bug Log - changes from CI_DRM_11263_full -> Patchwork_22341_full


Summary
---

  **FAILURE**

  Serious unknown changes coming with Patchwork_22341_full absolutely need to be
  verified manually.
  
  If you think the reported changes have nothing to do with the changes
  introduced in Patchwork_22341_full, please notify your bug team to allow them
  to document this new failure mode, which will reduce false positives in CI.

  

Participating hosts (13 -> 13)
--

  No changes in participating hosts

Possible new issues
---

  Here are the unknown changes that may have been introduced in 
Patchwork_22341_full:

### IGT changes ###

 Possible regressions 

  * igt@i915_suspend@debugfs-reader:
- shard-skl:  [PASS][1] -> [INCOMPLETE][2]
   [1]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11263/shard-skl2/igt@i915_susp...@debugfs-reader.html
   [2]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22341/shard-skl3/igt@i915_susp...@debugfs-reader.html

  
Known issues


  Here are the changes found in Patchwork_22341_full that come from known 
issues:

### IGT changes ###

 Issues hit 

  * igt@gem_eio@in-flight-contexts-immediate:
- shard-tglb: [PASS][3] -> [TIMEOUT][4] ([i915#3063])
   [3]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11263/shard-tglb7/igt@gem_...@in-flight-contexts-immediate.html
   [4]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22341/shard-tglb6/igt@gem_...@in-flight-contexts-immediate.html

  * igt@gem_exec_capture@pi@vecs0:
- shard-iclb: NOTRUN -> [INCOMPLETE][5] ([i915#3371])
   [5]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22341/shard-iclb8/igt@gem_exec_capture@p...@vecs0.html

  * igt@gem_exec_fair@basic-none@vcs0:
- shard-kbl:  [PASS][6] -> [FAIL][7] ([i915#2842]) +2 similar issues
   [6]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11263/shard-kbl1/igt@gem_exec_fair@basic-n...@vcs0.html
   [7]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22341/shard-kbl6/igt@gem_exec_fair@basic-n...@vcs0.html

  * igt@gem_exec_fair@basic-pace-share@rcs0:
- shard-tglb: [PASS][8] -> [FAIL][9] ([i915#2842])
   [8]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11263/shard-tglb3/igt@gem_exec_fair@basic-pace-sh...@rcs0.html
   [9]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22341/shard-tglb5/igt@gem_exec_fair@basic-pace-sh...@rcs0.html

  * igt@gem_exec_fair@basic-pace-solo@rcs0:
- shard-apl:  [PASS][10] -> [FAIL][11] ([i915#2842])
   [10]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11263/shard-apl6/igt@gem_exec_fair@basic-pace-s...@rcs0.html
   [11]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22341/shard-apl1/igt@gem_exec_fair@basic-pace-s...@rcs0.html

  * igt@gem_exec_fair@basic-pace@vcs1:
- shard-iclb: NOTRUN -> [FAIL][12] ([i915#2842])
   [12]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22341/shard-iclb2/igt@gem_exec_fair@basic-p...@vcs1.html

  * igt@gem_lmem_swapping@smem-oom:
- shard-kbl:  NOTRUN -> [SKIP][13] ([fdo#109271] / [i915#4613]) +1 
similar issue
   [13]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22341/shard-kbl6/igt@gem_lmem_swapp...@smem-oom.html

  * igt@gem_pwrite@basic-exhaustion:
- shard-skl:  NOTRUN -> [WARN][14] ([i915#2658])
   [14]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22341/shard-skl2/igt@gem_pwr...@basic-exhaustion.html

  * igt@gem_pxp@reject-modify-context-protection-off-1:
- shard-iclb: NOTRUN -> [SKIP][15] ([i915#4270])
   [15]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22341/shard-iclb7/igt@gem_...@reject-modify-context-protection-off-1.html

  * igt@gem_pxp@verify-pxp-stale-buf-optout-execution:
- shard-tglb: NOTRUN -> [SKIP][16] ([i915#4270])
   [16]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22341/shard-tglb7/igt@gem_...@verify-pxp-stale-buf-optout-execution.html

  * igt@gem_render_copy@yf-tiled-to-vebox-yf-tiled:
- shard-iclb: NOTRUN -> [SKIP][17] ([i915#768])
   [17]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22341/shard-iclb8/igt@gem_render_c...@yf-tiled-to-vebox-yf-tiled.html

  * igt@gem_softpin@allocator-evict-all-engines:
- shard-glk:  [PASS][18] -> [FAIL][19] ([i915#4171])
   [18]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11263/shard-glk2/igt@gem_soft...@allocator-evict-all-engines.html
   [19]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22341/shard-glk1/igt@gem_soft...@allocator-evict-all-engines.html

  * igt@gen9_exec_parse@allowed-all:
- shard-apl:  [PASS][20] -> [DMESG-WARN][21] ([i915#1436] / 
[i915#716])
   [20]: 

[Intel-gfx] ✓ Fi.CI.BAT: success for drm/i915/tgl: Simply subplatform detection

2022-02-21 Thread Patchwork
== Series Details ==

Series: drm/i915/tgl: Simply subplatform detection
URL   : https://patchwork.freedesktop.org/series/100517/
State : success

== Summary ==

CI Bug Log - changes from CI_DRM_11264 -> Patchwork_22345


Summary
---

  **SUCCESS**

  No regressions found.

  External URL: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22345/index.html

Participating hosts (44 -> 42)
--

  Additional (2): bat-dg2-8 fi-bdw-5557u 
  Missing(4): fi-bsw-cyan shard-rkl shard-dg1 shard-tglu 

Known issues


  Here are the changes found in Patchwork_22345 that come from known issues:

### IGT changes ###

 Issues hit 

  * igt@gem_huc_copy@huc-copy:
- fi-skl-6600u:   NOTRUN -> [SKIP][1] ([fdo#109271] / [i915#2190])
   [1]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22345/fi-skl-6600u/igt@gem_huc_c...@huc-copy.html

  * igt@gem_lmem_swapping@verify-random:
- fi-skl-6600u:   NOTRUN -> [SKIP][2] ([fdo#109271] / [i915#4613]) +3 
similar issues
   [2]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22345/fi-skl-6600u/igt@gem_lmem_swapp...@verify-random.html

  * igt@i915_selftest@live@gem_contexts:
- fi-kbl-soraka:  [PASS][3] -> [DMESG-WARN][4] ([i915#4391])
   [3]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11264/fi-kbl-soraka/igt@i915_selftest@live@gem_contexts.html
   [4]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22345/fi-kbl-soraka/igt@i915_selftest@live@gem_contexts.html

  * igt@i915_selftest@live@hangcheck:
- fi-bdw-5557u:   NOTRUN -> [INCOMPLETE][5] ([i915#3921])
   [5]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22345/fi-bdw-5557u/igt@i915_selftest@l...@hangcheck.html

  * igt@kms_chamelium@vga-edid-read:
- fi-skl-6600u:   NOTRUN -> [SKIP][6] ([fdo#109271] / [fdo#111827]) +8 
similar issues
   [6]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22345/fi-skl-6600u/igt@kms_chamel...@vga-edid-read.html
- fi-bdw-5557u:   NOTRUN -> [SKIP][7] ([fdo#109271] / [fdo#111827]) +8 
similar issues
   [7]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22345/fi-bdw-5557u/igt@kms_chamel...@vga-edid-read.html

  * igt@kms_cursor_legacy@basic-busy-flip-before-cursor-legacy:
- fi-skl-6600u:   NOTRUN -> [SKIP][8] ([fdo#109271]) +2 similar issues
   [8]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22345/fi-skl-6600u/igt@kms_cursor_leg...@basic-busy-flip-before-cursor-legacy.html

  * igt@kms_pipe_crc_basic@compare-crc-sanitycheck-pipe-d:
- fi-skl-6600u:   NOTRUN -> [SKIP][9] ([fdo#109271] / [i915#533])
   [9]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22345/fi-skl-6600u/igt@kms_pipe_crc_ba...@compare-crc-sanitycheck-pipe-d.html

  * igt@kms_psr@cursor_plane_move:
- fi-bdw-5557u:   NOTRUN -> [SKIP][10] ([fdo#109271]) +13 similar issues
   [10]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22345/fi-bdw-5557u/igt@kms_psr@cursor_plane_move.html

  * igt@kms_psr@primary_page_flip:
- fi-skl-6600u:   NOTRUN -> [FAIL][11] ([i915#4547])
   [11]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22345/fi-skl-6600u/igt@kms_psr@primary_page_flip.html

  
 Possible fixes 

  * igt@gem_exec_suspend@basic-s3@smem:
- fi-skl-6600u:   [INCOMPLETE][12] ([i915#4547]) -> [PASS][13]
   [12]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11264/fi-skl-6600u/igt@gem_exec_suspend@basic...@smem.html
   [13]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22345/fi-skl-6600u/igt@gem_exec_suspend@basic...@smem.html

  * igt@i915_selftest@live@gt_pm:
- fi-tgl-1115g4:  [DMESG-FAIL][14] ([i915#3987]) -> [PASS][15]
   [14]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11264/fi-tgl-1115g4/igt@i915_selftest@live@gt_pm.html
   [15]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22345/fi-tgl-1115g4/igt@i915_selftest@live@gt_pm.html

  * igt@i915_selftest@live@gt_timelines:
- {fi-tgl-dsi}:   [INCOMPLETE][16] -> [PASS][17]
   [16]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11264/fi-tgl-dsi/igt@i915_selftest@live@gt_timelines.html
   [17]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22345/fi-tgl-dsi/igt@i915_selftest@live@gt_timelines.html

  
  {name}: This element is suppressed. This means it is ignored when computing
  the status of the difference (SUCCESS, WARNING, or FAILURE).

  [fdo#109271]: https://bugs.freedesktop.org/show_bug.cgi?id=109271
  [fdo#109315]: https://bugs.freedesktop.org/show_bug.cgi?id=109315
  [fdo#111827]: https://bugs.freedesktop.org/show_bug.cgi?id=111827
  [i915#1759]: https://gitlab.freedesktop.org/drm/intel/issues/1759
  [i915#2190]: https://gitlab.freedesktop.org/drm/intel/issues/2190
  [i915#2373]: https://gitlab.freedesktop.org/drm/intel/issues/2373
  [i915#2575]: https://gitlab.freedesktop.org/drm/intel/issues/2575
  [i915#2582]: https://gitlab.freedesktop.org/drm/intel/issues/2582
  [i915#3921]: 

[Intel-gfx] ✗ Fi.CI.SPARSE: warning for drm/i915/tgl: Simply subplatform detection

2022-02-21 Thread Patchwork
== Series Details ==

Series: drm/i915/tgl: Simply subplatform detection
URL   : https://patchwork.freedesktop.org/series/100517/
State : warning

== Summary ==

$ dim sparse --fast origin/drm-tip
Sparse version: v0.6.2
Fast mode used, each commit won't be checked separately.




[Intel-gfx] ✓ Fi.CI.BAT: success for series starting with [v13,1/5] drm: improve drm_buddy_alloc function

2022-02-21 Thread Patchwork
== Series Details ==

Series: series starting with [v13,1/5] drm: improve drm_buddy_alloc function
URL   : https://patchwork.freedesktop.org/series/100509/
State : success

== Summary ==

CI Bug Log - changes from CI_DRM_11264 -> Patchwork_22344


Summary
---

  **SUCCESS**

  No regressions found.

  External URL: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22344/index.html

Participating hosts (44 -> 42)
--

  Additional (3): bat-dg2-8 fi-bdw-5557u fi-pnv-d510 
  Missing(5): shard-tglu fi-bsw-cyan fi-kbl-8809g shard-rkl shard-dg1 

Known issues


  Here are the changes found in Patchwork_22344 that come from known issues:

### IGT changes ###

 Issues hit 

  * igt@amdgpu/amd_basic@semaphore:
- fi-hsw-4770:NOTRUN -> [SKIP][1] ([fdo#109271] / [fdo#109315]) +17 
similar issues
   [1]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22344/fi-hsw-4770/igt@amdgpu/amd_ba...@semaphore.html

  * igt@gem_huc_copy@huc-copy:
- fi-skl-6600u:   NOTRUN -> [SKIP][2] ([fdo#109271] / [i915#2190])
   [2]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22344/fi-skl-6600u/igt@gem_huc_c...@huc-copy.html
- fi-pnv-d510:NOTRUN -> [SKIP][3] ([fdo#109271]) +57 similar issues
   [3]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22344/fi-pnv-d510/igt@gem_huc_c...@huc-copy.html

  * igt@gem_lmem_swapping@verify-random:
- fi-skl-6600u:   NOTRUN -> [SKIP][4] ([fdo#109271] / [i915#4613]) +3 
similar issues
   [4]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22344/fi-skl-6600u/igt@gem_lmem_swapp...@verify-random.html

  * igt@i915_selftest@live:
- fi-skl-6600u:   NOTRUN -> [FAIL][5] ([i915#4547])
   [5]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22344/fi-skl-6600u/igt@i915_selft...@live.html

  * igt@i915_selftest@live@execlists:
- fi-bsw-kefka:   [PASS][6] -> [INCOMPLETE][7] ([i915#2940])
   [6]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11264/fi-bsw-kefka/igt@i915_selftest@l...@execlists.html
   [7]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22344/fi-bsw-kefka/igt@i915_selftest@l...@execlists.html

  * igt@kms_chamelium@vga-edid-read:
- fi-skl-6600u:   NOTRUN -> [SKIP][8] ([fdo#109271] / [fdo#111827]) +8 
similar issues
   [8]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22344/fi-skl-6600u/igt@kms_chamel...@vga-edid-read.html

  * igt@kms_cursor_legacy@basic-busy-flip-before-cursor-legacy:
- fi-skl-6600u:   NOTRUN -> [SKIP][9] ([fdo#109271]) +3 similar issues
   [9]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22344/fi-skl-6600u/igt@kms_cursor_leg...@basic-busy-flip-before-cursor-legacy.html

  * igt@kms_pipe_crc_basic@compare-crc-sanitycheck-pipe-d:
- fi-skl-6600u:   NOTRUN -> [SKIP][10] ([fdo#109271] / [i915#533])
   [10]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22344/fi-skl-6600u/igt@kms_pipe_crc_ba...@compare-crc-sanitycheck-pipe-d.html

  * igt@kms_pipe_crc_basic@read-crc-pipe-b:
- fi-cfl-8109u:   [PASS][11] -> [DMESG-WARN][12] ([i915#295]) +12 
similar issues
   [11]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11264/fi-cfl-8109u/igt@kms_pipe_crc_ba...@read-crc-pipe-b.html
   [12]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22344/fi-cfl-8109u/igt@kms_pipe_crc_ba...@read-crc-pipe-b.html

  * igt@runner@aborted:
- fi-bsw-kefka:   NOTRUN -> [FAIL][13] ([fdo#109271] / [i915#1436] / 
[i915#2722] / [i915#3428] / [i915#4312])
   [13]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22344/fi-bsw-kefka/igt@run...@aborted.html
- fi-bdw-5557u:   NOTRUN -> [FAIL][14] ([i915#2426] / [i915#4312])
   [14]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22344/fi-bdw-5557u/igt@run...@aborted.html

  
 Possible fixes 

  * igt@gem_exec_suspend@basic-s3@smem:
- fi-skl-6600u:   [INCOMPLETE][15] ([i915#4547]) -> [PASS][16]
   [15]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11264/fi-skl-6600u/igt@gem_exec_suspend@basic...@smem.html
   [16]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22344/fi-skl-6600u/igt@gem_exec_suspend@basic...@smem.html

  * igt@i915_selftest@live@gt_pm:
- fi-tgl-1115g4:  [DMESG-FAIL][17] ([i915#3987]) -> [PASS][18]
   [17]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11264/fi-tgl-1115g4/igt@i915_selftest@live@gt_pm.html
   [18]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22344/fi-tgl-1115g4/igt@i915_selftest@live@gt_pm.html

  * igt@i915_selftest@live@gt_timelines:
- {fi-tgl-dsi}:   [INCOMPLETE][19] -> [PASS][20]
   [19]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11264/fi-tgl-dsi/igt@i915_selftest@live@gt_timelines.html
   [20]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22344/fi-tgl-dsi/igt@i915_selftest@live@gt_timelines.html

  * igt@i915_selftest@live@hangcheck:
- fi-hsw-4770:[INCOMPLETE][21] ([i915#3303]) -> [PASS][22]

[Intel-gfx] ✗ Fi.CI.CHECKPATCH: warning for series starting with [v13,1/5] drm: improve drm_buddy_alloc function

2022-02-21 Thread Patchwork
== Series Details ==

Series: series starting with [v13,1/5] drm: improve drm_buddy_alloc function
URL   : https://patchwork.freedesktop.org/series/100509/
State : warning

== Summary ==

$ dim checkpatch origin/drm-tip
1ae185a2649e drm: improve drm_buddy_alloc function
-:372: WARNING:AVOID_BUG: Avoid crashing the kernel - try using WARN_ON & 
recovery code rather than BUG() or BUG_ON()
#372: FILE: drivers/gpu/drm/drm_buddy.c:562:
+   BUG_ON(order > mm->max_order);

-:373: WARNING:AVOID_BUG: Avoid crashing the kernel - try using WARN_ON & 
recovery code rather than BUG() or BUG_ON()
#373: FILE: drivers/gpu/drm/drm_buddy.c:563:
+   BUG_ON(order < min_order);

total: 0 errors, 2 warnings, 0 checks, 483 lines checked
cf3ca8204216 drm: implement top-down allocation method
520affca2185 drm: implement a method to free unused pages
c101b2692614 drm/amdgpu: move vram inline functions into a header
-:12: WARNING:FILE_PATH_CHANGES: added, moved or deleted file(s), does 
MAINTAINERS need updating?
#12: 
new file mode 100644

total: 0 errors, 1 warnings, 0 checks, 51 lines checked
824dc64040ae drm/amdgpu: add drm buddy support to amdgpu
-:67: CHECK:PREFER_KERNEL_TYPES: Prefer kernel type 'u32' over 'uint32_t'
#67: FILE: drivers/gpu/drm/amd/amdgpu/amdgpu_res_cursor.h:41:
+   uint32_tmem_type;

-:426: CHECK:BRACES: Unbalanced braces around else statement
#426: FILE: drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c:383:
+   else {

-:459: WARNING:AVOID_BUG: Avoid crashing the kernel - try using WARN_ON & 
recovery code rather than BUG() or BUG_ON()
#459: FILE: drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c:416:
+   BUG_ON(min_page_size < mm->chunk_size);

total: 0 errors, 1 warnings, 2 checks, 594 lines checked




[Intel-gfx] ✗ Fi.CI.BAT: failure for linux-next: manual merge of the drm-intel-gt tree with the drm-intel tree (rev3)

2022-02-21 Thread Patchwork
== Series Details ==

Series: linux-next: manual merge of the drm-intel-gt tree with the drm-intel 
tree (rev3)
URL   : https://patchwork.freedesktop.org/series/99294/
State : failure

== Summary ==

Applying: linux-next: manual merge of the drm-intel-gt tree with the drm-intel 
tree
Using index info to reconstruct a base tree...
M   drivers/gpu/drm/i915/i915_gem_evict.h
Falling back to patching base and 3-way merge...
Auto-merging drivers/gpu/drm/i915/i915_gem_evict.h
No changes -- Patch already applied.




[Intel-gfx] [PATCH] drm/i915/tgl: Simply subplatform detection

2022-02-21 Thread José Roberto de Souza
In the past we had a need to differentiate TGL U and TGL Y, there
was a different voltage swing table for each subplatform and some PCI
ids of this subplatforms are shared but it turned out that it was a
specification mistake and the voltage swing table was indeed the same
but we went ahead with that patch because we needed to differentiate
TGL U and Y from TGL H and by that time TGL H was embargoed so that
was the perfect way to land it upstream.

Now the embargo for TGL H is long past and now we even have
INTEL_TGL_12_GT1_IDS with all TGL H ids, so we can drop this PCI root
check and only rely in the PCI ids to differentiate TGL U and Y from
TGL H that actually has code differences.

Besides the simplification this will fix issues in virtualization
environments where the PCI root is virtualized and don't have the same
id as actual hardware.

Cc: Fred Gao 
Signed-off-by: José Roberto de Souza 
---
 .../drm/i915/display/intel_ddi_buf_trans.c|  2 +-
 drivers/gpu/drm/i915/i915_drv.h   |  9 +++--
 drivers/gpu/drm/i915/i915_reg.h   |  6 --
 drivers/gpu/drm/i915/intel_device_info.c  | 20 +--
 drivers/gpu/drm/i915/intel_step.c |  2 +-
 5 files changed, 6 insertions(+), 33 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_ddi_buf_trans.c 
b/drivers/gpu/drm/i915/display/intel_ddi_buf_trans.c
index 0c32210bf5031..934a9f9e7dabb 100644
--- a/drivers/gpu/drm/i915/display/intel_ddi_buf_trans.c
+++ b/drivers/gpu/drm/i915/display/intel_ddi_buf_trans.c
@@ -1321,7 +1321,7 @@ tgl_get_combo_buf_trans_dp(struct intel_encoder *encoder,
struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
 
if (crtc_state->port_clock > 27) {
-   if (IS_TGL_U(dev_priv) || IS_TGL_Y(dev_priv)) {
+   if (IS_TGL_UY(dev_priv)) {
return 
intel_get_buf_trans(_uy_combo_phy_trans_dp_hbr2,
   n_entries);
} else {
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index 1c2f4ae4ebf98..c5eb2a3a1a590 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -1147,12 +1147,9 @@ IS_SUBPLATFORM(const struct drm_i915_private *i915,
 #define IS_ICL_WITH_PORT_F(dev_priv) \
IS_SUBPLATFORM(dev_priv, INTEL_ICELAKE, INTEL_SUBPLATFORM_PORTF)
 
-#define IS_TGL_U(dev_priv) \
+#define IS_TGL_UY(dev_priv) \
IS_SUBPLATFORM(dev_priv, INTEL_TIGERLAKE, INTEL_SUBPLATFORM_ULT)
 
-#define IS_TGL_Y(dev_priv) \
-   IS_SUBPLATFORM(dev_priv, INTEL_TIGERLAKE, INTEL_SUBPLATFORM_ULX)
-
 #define IS_SKL_GRAPHICS_STEP(p, since, until) (IS_SKYLAKE(p) && 
IS_GRAPHICS_STEP(p, since, until))
 
 #define IS_KBL_GRAPHICS_STEP(dev_priv, since, until) \
@@ -1170,11 +1167,11 @@ IS_SUBPLATFORM(const struct drm_i915_private *i915,
 IS_DISPLAY_STEP(__i915, since, until))
 
 #define IS_TGL_UY_GRAPHICS_STEP(__i915, since, until) \
-   ((IS_TGL_U(__i915) || IS_TGL_Y(__i915)) && \
+   (IS_TGL_UY(__i915) && \
 IS_GRAPHICS_STEP(__i915, since, until))
 
 #define IS_TGL_GRAPHICS_STEP(__i915, since, until) \
-   (IS_TIGERLAKE(__i915) && !(IS_TGL_U(__i915) || IS_TGL_Y(__i915)) && \
+   (IS_TIGERLAKE(__i915) && !IS_TGL_UY(__i915)) && \
 IS_GRAPHICS_STEP(__i915, since, until))
 
 #define IS_RKL_DISPLAY_STEP(p, since, until) \
diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
index 2b8a3086ed35a..30aa1d99f2244 100644
--- a/drivers/gpu/drm/i915/i915_reg.h
+++ b/drivers/gpu/drm/i915/i915_reg.h
@@ -8823,12 +8823,6 @@ enum skl_power_gate {
 #define   DSB_ENABLE   (1 << 31)
 #define   DSB_STATUS   (1 << 0)
 
-#define TGL_ROOT_DEVICE_ID 0x9A00
-#define TGL_ROOT_DEVICE_MASK   0xFF00
-#define TGL_ROOT_DEVICE_SKU_MASK   0xF
-#define TGL_ROOT_DEVICE_SKU_ULX0x2
-#define TGL_ROOT_DEVICE_SKU_ULT0x4
-
 #define CLKREQ_POLICY  _MMIO(0x101038)
 #define  CLKREQ_POLICY_MEM_UP_OVRD REG_BIT(1)
 
diff --git a/drivers/gpu/drm/i915/intel_device_info.c 
b/drivers/gpu/drm/i915/intel_device_info.c
index ae13bc3c7970e..4329828b0db25 100644
--- a/drivers/gpu/drm/i915/intel_device_info.c
+++ b/drivers/gpu/drm/i915/intel_device_info.c
@@ -149,6 +149,7 @@ static const u16 subplatform_ult_ids[] = {
INTEL_WHL_U_GT3_IDS(0),
INTEL_CML_U_GT1_IDS(0),
INTEL_CML_U_GT2_IDS(0),
+   INTEL_TGL_12_GT2_IDS(0),
 };
 
 static const u16 subplatform_ulx_ids[] = {
@@ -243,25 +244,6 @@ void intel_device_info_subplatform_init(struct 
drm_i915_private *i915)
mask = BIT(INTEL_SUBPLATFORM_G12);
}
 
-   if (IS_TIGERLAKE(i915)) {
-   struct pci_dev *root, *pdev = to_pci_dev(i915->drm.dev);
-
-   root = list_first_entry(>bus->devices, typeof(*root), 
bus_list);
-
-   drm_WARN_ON(>drm, mask);
-   

[Intel-gfx] ✓ Fi.CI.BAT: success for drm/i915/ttm: fixup the mock_bo (rev3)

2022-02-21 Thread Patchwork
== Series Details ==

Series: drm/i915/ttm: fixup the mock_bo (rev3)
URL   : https://patchwork.freedesktop.org/series/100255/
State : success

== Summary ==

CI Bug Log - changes from CI_DRM_11264 -> Patchwork_22342


Summary
---

  **SUCCESS**

  No regressions found.

  External URL: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22342/index.html

Participating hosts (42 -> 43)
--

  Additional (3): bat-dg2-8 fi-bdw-5557u fi-pnv-d510 
  Missing(2): fi-bsw-cyan shard-tglu 

Known issues


  Here are the changes found in Patchwork_22342 that come from known issues:

### IGT changes ###

 Issues hit 

  * igt@amdgpu/amd_cs_nop@sync-fork-gfx0:
- fi-skl-6600u:   NOTRUN -> [SKIP][1] ([fdo#109271]) +21 similar issues
   [1]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22342/fi-skl-6600u/igt@amdgpu/amd_cs_...@sync-fork-gfx0.html

  * igt@gem_huc_copy@huc-copy:
- fi-skl-6600u:   NOTRUN -> [SKIP][2] ([fdo#109271] / [i915#2190])
   [2]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22342/fi-skl-6600u/igt@gem_huc_c...@huc-copy.html

  * igt@gem_lmem_swapping@verify-random:
- fi-skl-6600u:   NOTRUN -> [SKIP][3] ([fdo#109271] / [i915#4613]) +3 
similar issues
   [3]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22342/fi-skl-6600u/igt@gem_lmem_swapp...@verify-random.html

  * igt@i915_selftest@live@requests:
- fi-blb-e6850:   [PASS][4] -> [DMESG-FAIL][5] ([i915#4528] / 
[i915#5026])
   [4]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11264/fi-blb-e6850/igt@i915_selftest@l...@requests.html
   [5]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22342/fi-blb-e6850/igt@i915_selftest@l...@requests.html

  * igt@kms_chamelium@vga-edid-read:
- fi-skl-6600u:   NOTRUN -> [SKIP][6] ([fdo#109271] / [fdo#111827]) +8 
similar issues
   [6]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22342/fi-skl-6600u/igt@kms_chamel...@vga-edid-read.html

  * igt@kms_pipe_crc_basic@compare-crc-sanitycheck-pipe-d:
- fi-skl-6600u:   NOTRUN -> [SKIP][7] ([fdo#109271] / [i915#533])
   [7]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22342/fi-skl-6600u/igt@kms_pipe_crc_ba...@compare-crc-sanitycheck-pipe-d.html

  * igt@prime_vgem@basic-userptr:
- fi-pnv-d510:NOTRUN -> [SKIP][8] ([fdo#109271]) +57 similar issues
   [8]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22342/fi-pnv-d510/igt@prime_v...@basic-userptr.html

  * igt@runner@aborted:
- fi-bdw-5557u:   NOTRUN -> [FAIL][9] ([i915#2426] / [i915#4312])
   [9]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22342/fi-bdw-5557u/igt@run...@aborted.html
- fi-blb-e6850:   NOTRUN -> [FAIL][10] ([fdo#109271] / [i915#2403] / 
[i915#2426] / [i915#4312])
   [10]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22342/fi-blb-e6850/igt@run...@aborted.html

  
 Possible fixes 

  * igt@gem_exec_suspend@basic-s3@smem:
- fi-skl-6600u:   [INCOMPLETE][11] ([i915#4547]) -> [PASS][12]
   [11]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11264/fi-skl-6600u/igt@gem_exec_suspend@basic...@smem.html
   [12]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22342/fi-skl-6600u/igt@gem_exec_suspend@basic...@smem.html

  * igt@i915_selftest@live@gt_pm:
- fi-tgl-1115g4:  [DMESG-FAIL][13] ([i915#3987]) -> [PASS][14]
   [13]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11264/fi-tgl-1115g4/igt@i915_selftest@live@gt_pm.html
   [14]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22342/fi-tgl-1115g4/igt@i915_selftest@live@gt_pm.html

  * igt@i915_selftest@live@gt_timelines:
- {fi-tgl-dsi}:   [INCOMPLETE][15] -> [PASS][16]
   [15]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11264/fi-tgl-dsi/igt@i915_selftest@live@gt_timelines.html
   [16]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22342/fi-tgl-dsi/igt@i915_selftest@live@gt_timelines.html

  * igt@i915_selftest@live@hangcheck:
- bat-dg1-5:  [DMESG-FAIL][17] ([i915#4494] / [i915#4957]) -> 
[PASS][18]
   [17]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11264/bat-dg1-5/igt@i915_selftest@l...@hangcheck.html
   [18]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22342/bat-dg1-5/igt@i915_selftest@l...@hangcheck.html

  
  {name}: This element is suppressed. This means it is ignored when computing
  the status of the difference (SUCCESS, WARNING, or FAILURE).

  [fdo#109271]: https://bugs.freedesktop.org/show_bug.cgi?id=109271
  [fdo#109315]: https://bugs.freedesktop.org/show_bug.cgi?id=109315
  [fdo#111827]: https://bugs.freedesktop.org/show_bug.cgi?id=111827
  [i915#1759]: https://gitlab.freedesktop.org/drm/intel/issues/1759
  [i915#2190]: https://gitlab.freedesktop.org/drm/intel/issues/2190
  [i915#2373]: https://gitlab.freedesktop.org/drm/intel/issues/2373
  [i915#2403]: https://gitlab.freedesktop.org/drm/intel/issues/2403
  [i915#2426]: 

[Intel-gfx] ✗ Fi.CI.CHECKPATCH: warning for drm/i915/ttm: fixup the mock_bo (rev3)

2022-02-21 Thread Patchwork
== Series Details ==

Series: drm/i915/ttm: fixup the mock_bo (rev3)
URL   : https://patchwork.freedesktop.org/series/100255/
State : warning

== Summary ==

$ dim checkpatch origin/drm-tip
a5ab96652684 drm/i915/ttm: fixup the mock_bo
-:11: WARNING:COMMIT_LOG_LONG_LINE: Possible unwrapped commit description 
(prefer a maximum 75 chars per line)
#11: 
<6> [299.836278] i915: Running 
i915_gem_huge_page_mock_selftests/igt_mock_memory_region_huge_pages

total: 0 errors, 1 warnings, 0 checks, 25 lines checked




[Intel-gfx] ✓ Fi.CI.BAT: success for series starting with [1/4] drm/i915: Move framestart_delay to crtc_state

2022-02-21 Thread Patchwork
== Series Details ==

Series: series starting with [1/4] drm/i915: Move framestart_delay to crtc_state
URL   : https://patchwork.freedesktop.org/series/100484/
State : success

== Summary ==

CI Bug Log - changes from CI_DRM_11263 -> Patchwork_22341


Summary
---

  **SUCCESS**

  No regressions found.

  External URL: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22341/index.html

Participating hosts (45 -> 41)
--

  Additional (2): bat-dg2-8 fi-apl-guc 
  Missing(6): shard-tglu fi-bsw-cyan fi-icl-u2 fi-kbl-8809g shard-rkl 
shard-dg1 

Known issues


  Here are the changes found in Patchwork_22341 that come from known issues:

### IGT changes ###

 Issues hit 

  * igt@amdgpu/amd_basic@semaphore:
- fi-hsw-4770:NOTRUN -> [SKIP][1] ([fdo#109271] / [fdo#109315]) +17 
similar issues
   [1]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22341/fi-hsw-4770/igt@amdgpu/amd_ba...@semaphore.html

  * igt@debugfs_test@read_all_entries:
- fi-apl-guc: NOTRUN -> [DMESG-WARN][2] ([i915#1610])
   [2]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22341/fi-apl-guc/igt@debugfs_test@read_all_entries.html

  * igt@gem_exec_suspend@basic-s3@smem:
- fi-skl-6600u:   [PASS][3] -> [INCOMPLETE][4] ([i915#4547])
   [3]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11263/fi-skl-6600u/igt@gem_exec_suspend@basic...@smem.html
   [4]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22341/fi-skl-6600u/igt@gem_exec_suspend@basic...@smem.html

  * igt@i915_selftest@live@hangcheck:
- fi-snb-2600:[PASS][5] -> [INCOMPLETE][6] ([i915#3921])
   [5]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11263/fi-snb-2600/igt@i915_selftest@l...@hangcheck.html
   [6]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22341/fi-snb-2600/igt@i915_selftest@l...@hangcheck.html

  * igt@runner@aborted:
- fi-skl-6600u:   NOTRUN -> [FAIL][7] ([i915#4312])
   [7]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22341/fi-skl-6600u/igt@run...@aborted.html
- fi-apl-guc: NOTRUN -> [FAIL][8] ([i915#2426] / [i915#4312])
   [8]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22341/fi-apl-guc/igt@run...@aborted.html
- fi-bdw-5557u:   NOTRUN -> [FAIL][9] ([i915#2426] / [i915#4312])
   [9]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22341/fi-bdw-5557u/igt@run...@aborted.html

  
 Possible fixes 

  * igt@gem_exec_suspend@basic-s3@smem:
- fi-bdw-5557u:   [INCOMPLETE][10] ([i915#146]) -> [PASS][11]
   [10]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11263/fi-bdw-5557u/igt@gem_exec_suspend@basic...@smem.html
   [11]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22341/fi-bdw-5557u/igt@gem_exec_suspend@basic...@smem.html

  * igt@i915_selftest@live@hangcheck:
- fi-hsw-4770:[INCOMPLETE][12] ([i915#4785]) -> [PASS][13]
   [12]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11263/fi-hsw-4770/igt@i915_selftest@l...@hangcheck.html
   [13]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22341/fi-hsw-4770/igt@i915_selftest@l...@hangcheck.html

  * igt@kms_frontbuffer_tracking@basic:
- fi-cml-u2:  [DMESG-WARN][14] ([i915#4269]) -> [PASS][15]
   [14]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11263/fi-cml-u2/igt@kms_frontbuffer_track...@basic.html
   [15]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22341/fi-cml-u2/igt@kms_frontbuffer_track...@basic.html

  
 Warnings 

  * igt@i915_pm_rpm@basic-pci-d3-state:
- fi-kbl-guc: [SKIP][16] ([fdo#109271]) -> [FAIL][17] ([i915#3049])
   [16]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11263/fi-kbl-guc/igt@i915_pm_...@basic-pci-d3-state.html
   [17]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_22341/fi-kbl-guc/igt@i915_pm_...@basic-pci-d3-state.html

  
  {name}: This element is suppressed. This means it is ignored when computing
  the status of the difference (SUCCESS, WARNING, or FAILURE).

  [fdo#109271]: https://bugs.freedesktop.org/show_bug.cgi?id=109271
  [fdo#109315]: https://bugs.freedesktop.org/show_bug.cgi?id=109315
  [i915#146]: https://gitlab.freedesktop.org/drm/intel/issues/146
  [i915#1610]: https://gitlab.freedesktop.org/drm/intel/issues/1610
  [i915#2426]: https://gitlab.freedesktop.org/drm/intel/issues/2426
  [i915#3049]: https://gitlab.freedesktop.org/drm/intel/issues/3049
  [i915#3921]: https://gitlab.freedesktop.org/drm/intel/issues/3921
  [i915#4269]: https://gitlab.freedesktop.org/drm/intel/issues/4269
  [i915#4312]: https://gitlab.freedesktop.org/drm/intel/issues/4312
  [i915#4547]: https://gitlab.freedesktop.org/drm/intel/issues/4547
  [i915#4785]: https://gitlab.freedesktop.org/drm/intel/issues/4785
  [i915#5137]: https://gitlab.freedesktop.org/drm/intel/issues/5137


Build changes
-

  * Linux: CI_DRM_11263 -> Patchwork_22341

  CI-20190529: 20190529
  CI_DRM_11263: 

Re: [Intel-gfx] [PATCH v5 5/7] drm/i915/gt: Create per-tile RC6 sysfs interface

2022-02-21 Thread Tvrtko Ursulin



On 18/02/2022 10:46, Joonas Lahtinen wrote:

Quoting Andi Shyti (2022-02-17 17:53:58)

Hi Tvrtko,


Now tiles have their own sysfs interfaces under the gt/
directory. Because RC6 is a property that can be configured on a
tile basis, then each tile should have its own interface

The new sysfs structure will have a similar layout for the 4 tile
case:

/sys/.../card0
   \u251c\u2500\u2500 gt
   \u2502   \u251c\u2500\u2500 gt0
   \u2502   \u2502   \u251c\u2500\u2500 id
   \u2502   \u2502   \u251c\u2500\u2500 rc6_enable
   \u2502   \u2502   \u251c\u2500\u2500 rc6_residency_ms
   .   .   .
   .   .   .
   .   .
   \u2502   \u2514\u2500\u2500 gtN
   \u2502   \u251c\u2500\u2500 id
   \u2502   \u251c\u2500\u2500 rc6_enable
   \u2502   \u251c\u2500\u2500 rc6_residency_ms
   \u2502   .
   \u2502   .
   \u2502
   \u2514\u2500\u2500 power/-+
\u251c\u2500\u2500 rc6_enable|Original interface
\u251c\u2500\u2500 rc6_residency_ms  +->  kept as existing ABI;
. |it multiplexes over
. |the GTs
 -+

The existing interfaces have been kept in their original location
to preserve the existing ABI. They act on all the GTs: when
reading they provide the average value from all the GTs.


Average feels very odd to me. I'd ask if we can get away providing an errno
instead? Or tile zero data?


Tile zero data is always wrong, in my opinion. If we have round-robin
scaling workloads like some media cases, part of the system load might
just disappear when it goes to tile 1.


I was thinking that in conjunction with deprecated log message it 
wouldn't be wrong - I mean if the route take was to eventually retire 
the legacy files altogether.



Real multiplexing would be providing something when reading and
when writing. The idea of average came while revieweing with
Chris the write multiplexing. Indeed it makes sense to provide
some common value, but I don't know how useful it can be to the
user (still if the user needs any average).


I think all read/write controls like min/max/boost_freq should return
an error from the global interface if all the tiles don't return same
value. Write will always overwrite per-tile values.


That would work I think, if the option chosen was not to retire the 
legacy files.



When we have frequency readbacks without control, returning MAX() across
tiles would be the logical thing. The fact that parts of the hardware can
be clocked lower when one part is fully utilized is the "new feature".

After that we're only really left with the rc6_residency_ms. And that is
the tough one. I'm inclined that MIN() across tiles would be the right
answer. If you are fully utilizing a single tile, you should be able to
see it.
 So we have MIN, AVG or SUM, or errno, or remove the file (which is 
just a different kind of errno?) to choose from. :)


Regards,

Tvrtko


This all would be what feels natural for an user who has their setup
tuned for single-tile device. And would allow simple round-robing
balancing across the tiles in somewhat coherent manner.


[Intel-gfx] ✗ Fi.CI.SPARSE: warning for series starting with [1/4] drm/i915: Move framestart_delay to crtc_state

2022-02-21 Thread Patchwork
== Series Details ==

Series: series starting with [1/4] drm/i915: Move framestart_delay to crtc_state
URL   : https://patchwork.freedesktop.org/series/100484/
State : warning

== Summary ==

$ dim sparse --fast origin/drm-tip
Sparse version: v0.6.2
Fast mode used, each commit won't be checked separately.




[Intel-gfx] linux-next: manual merge of the drm-intel-gt tree with the drm-intel tree

2022-02-21 Thread broonie
Hi all,

Today's linux-next merge of the drm-intel-gt tree got conflicts in:

  drivers/gpu/drm/i915/gem/i915_gem_ttm_move.c
  drivers/gpu/drm/i915/i915_drv.h
  drivers/gpu/drm/i915/i915_reg.h
  drivers/gpu/drm/i915/selftests/i915_gem_gtt.c

between commits:

  b508d01fa577e ("drm/i915: split out i915_gem_internal.h from i915_drv.h")
  29b9702ffe70d ("drm/i915/ttm: Return some errors instead of trying memcpy 
move")
  9a8e720fd0641 ("drm/i915: split out gem/i915_gem_domain.h from i915_drv.h")
  b508d01fa577e ("drm/i915: split out i915_gem_internal.h from i915_drv.h")

from the drm-intel tree and commits:

  3526b607b0239 ("drm/i915/ttm: Return some errors instead of trying memcpy 
move")
  a413c99fc1e49 ("drm/i915: add gtt misalignment test")
  b508d01fa577e ("drm/i915: split out i915_gem_internal.h from i915_drv.h")

from the drm-intel-gt tree.

I fixed it up (see below) and can carry the fix as necessary. This
is now fixed as far as linux-next is concerned, but any non trivial
conflicts should be mentioned to your upstream maintainer when your tree
is submitted for merging.  You may also want to consider cooperating
with the maintainer of the conflicting tree to minimise any particularly
complex conflicts.

diff --cc drivers/gpu/drm/i915/i915_drv.h
index ffde71b6b3f1f,6ffadf4b3f1ab..0
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@@ -1089,10 -1284,10 +1087,12 @@@ IS_SUBPLATFORM(const struct drm_i915_pr
IS_SUBPLATFORM(dev_priv, INTEL_DG2, INTEL_SUBPLATFORM_G10)
  #define IS_DG2_G11(dev_priv) \
IS_SUBPLATFORM(dev_priv, INTEL_DG2, INTEL_SUBPLATFORM_G11)
+ #define IS_DG2_G12(dev_priv) \
+   IS_SUBPLATFORM(dev_priv, INTEL_DG2, INTEL_SUBPLATFORM_G12)
  #define IS_ADLS_RPLS(dev_priv) \
IS_SUBPLATFORM(dev_priv, INTEL_ALDERLAKE_S, INTEL_SUBPLATFORM_RPL_S)
 +#define IS_ADLP_N(dev_priv) \
 +  IS_SUBPLATFORM(dev_priv, INTEL_ALDERLAKE_P, INTEL_SUBPLATFORM_N)
  #define IS_HSW_EARLY_SDV(dev_priv) (IS_HASWELL(dev_priv) && \
(INTEL_DEVID(dev_priv) & 0xFF00) == 0x0C00)
  #define IS_BDW_ULT(dev_priv) \
diff --cc drivers/gpu/drm/i915/i915_reg.h
index 8e1b469a4cd1b,4b95c94084d98..0
--- a/drivers/gpu/drm/i915/i915_reg.h
+++ b/drivers/gpu/drm/i915/i915_reg.h
diff --cc drivers/gpu/drm/i915/selftests/i915_gem_gtt.c
index 1b508c89468c1,ca4ed9dd909b8..0
--- a/drivers/gpu/drm/i915/selftests/i915_gem_gtt.c
+++ b/drivers/gpu/drm/i915/selftests/i915_gem_gtt.c
@@@ -26,7 -26,7 +26,8 @@@
  #include 
  
  #include "gem/i915_gem_context.h"
 +#include "gem/i915_gem_internal.h"
+ #include "gem/i915_gem_region.h"
  #include "gem/selftests/mock_context.h"
  #include "gt/intel_context.h"
  #include "gt/intel_gpu_commands.h"
diff --git a/drivers/gpu/drm/i915/i915_gem_evict.h 
b/drivers/gpu/drm/i915/i915_gem_evict.h
index d4478b6ad11bb..b7f8e9435b2c6 100644
--- a/drivers/gpu/drm/i915/i915_gem_evict.h
+++ b/drivers/gpu/drm/i915/i915_gem_evict.h
@@ -12,13 +12,16 @@ struct drm_mm_node;
 struct i915_address_space;
 
 int __must_check i915_gem_evict_something(struct i915_address_space *vm,
+ struct i915_gem_ww_ctx *ww,
  u64 min_size, u64 alignment,
  unsigned long color,
  u64 start, u64 end,
  unsigned flags);
 int __must_check i915_gem_evict_for_node(struct i915_address_space *vm,
+struct i915_gem_ww_ctx *ww,
 struct drm_mm_node *node,
 unsigned int flags);
-int i915_gem_evict_vm(struct i915_address_space *vm);
+int i915_gem_evict_vm(struct i915_address_space *vm,
+ struct i915_gem_ww_ctx *ww);
 
 #endif /* __I915_GEM_EVICT_H__ */


[Intel-gfx] [PATCH i-g-t v2 5/6] i915/tests/capture: add a negative test for NEEDS_CPU_ACCESS

2022-02-21 Thread Matthew Auld
Sanity check that the kernel does indeed reject LMEM buffers marked with
EXEC_OBJECT_CAPTURE, that are not also marked with NEEDS_CPU_ACCESS.

Signed-off-by: Matthew Auld 
Cc: Thomas Hellström 
---
 tests/i915/gem_exec_capture.c | 69 +++
 1 file changed, 69 insertions(+)

diff --git a/tests/i915/gem_exec_capture.c b/tests/i915/gem_exec_capture.c
index 24ba6036..09187f62 100644
--- a/tests/i915/gem_exec_capture.c
+++ b/tests/i915/gem_exec_capture.c
@@ -735,6 +735,71 @@ static void userptr(int fd, int dir)
gem_engine_properties_restore(fd, _engine);
 }
 
+static bool supports_needs_cpu_access(int fd)
+{
+   struct drm_i915_gem_memory_class_instance regions[] = {
+   { I915_MEMORY_CLASS_DEVICE, },
+   { I915_MEMORY_CLASS_SYSTEM, },
+   };
+   struct drm_i915_gem_create_ext_memory_regions setparam_region = {
+   .base = { .name = I915_GEM_CREATE_EXT_MEMORY_REGIONS },
+   .regions = to_user_pointer(),
+   .num_regions = ARRAY_SIZE(regions),
+   };
+   uint64_t size = 4096;
+   uint32_t handle;
+   int ret;
+
+   ret = __gem_create_ext(fd, ,
+  I915_GEM_CREATE_EXT_FLAG_NEEDS_CPU_ACCESS,
+  , _region.base);
+   if (!ret) {
+   gem_close(fd, handle);
+   igt_assert(gem_has_lmem(fd)); /* Should be dgpu only */
+   }
+
+   return ret == 0;
+}
+
+static void capture_no_cpu_access(int fd)
+{
+   struct drm_i915_gem_exec_object2 exec = {
+   .flags = EXEC_OBJECT_CAPTURE,
+   };
+   struct drm_i915_gem_execbuffer2 execbuf = {
+   .buffers_ptr = to_user_pointer(),
+   .buffer_count = 1,
+   };
+   uint64_t size = 4096;
+   uint32_t handle;
+   int ret;
+
+   igt_require(gem_has_lmem(fd));
+   igt_require(supports_needs_cpu_access(fd));
+
+   /*
+* Sanity check that execbuf rejects EXEC_OBJECT_CAPTURE marked BO, that
+* is not also tagged with I915_GEM_CREATE_EXT_FLAG_NEEDS_CPU_ACCESS, if
+* it can be placed in LMEM. This is only relevant for Dg2+.
+*/
+
+   igt_require(__gem_create_in_memory_regions(fd, , ,
+  REGION_LMEM(0)) == 0);
+
+   exec.handle = handle;
+   ret = __gem_execbuf(fd, );
+   if (IS_DG1(fd)) /* Should be no impact on existing ABI */
+   igt_assert(ret == 0);
+   else
+   igt_assert(ret == -EINVAL);
+
+   /* SMEM only buffers should work as normal */
+   igt_assert(__gem_create_in_memory_regions(fd, , ,
+ REGION_SMEM) == 0);
+   exec.handle = handle;
+   igt_assert(__gem_execbuf(fd, ) == 0);
+}
+
 static bool has_capture(int fd)
 {
drm_i915_getparam_t gp;
@@ -839,6 +904,10 @@ igt_main
igt_dynamic_f("%s", (e)->name)
prioinv(fd, dir, ctx, e);
 
+   igt_describe("Verify the ABI contract when using EXEC_OBJECT_CAPTURE 
without I915_GEM_CREATE_EXT_FLAG_NEEDS_CPU_ACCESS");
+   igt_subtest_f("capture-non-cpu-access")
+   capture_no_cpu_access(fd);
+
igt_fixture {
close(dir);
igt_disallow_hang(fd, hang);
-- 
2.34.1



[Intel-gfx] [PATCH i-g-t v2 3/6] tests/i915/gem_create: test NEEDS_CPU_ACCESS

2022-02-21 Thread Matthew Auld
Add some basic tests for this new flag.

Signed-off-by: Matthew Auld 
Cc: Thomas Hellström 
---
 tests/i915/gem_create.c | 334 
 1 file changed, 334 insertions(+)

diff --git a/tests/i915/gem_create.c b/tests/i915/gem_create.c
index a6c3c9d9..318e6491 100644
--- a/tests/i915/gem_create.c
+++ b/tests/i915/gem_create.c
@@ -43,6 +43,8 @@
 #include 
 #include 
 #include 
+#include 
+#include 
 
 #include "drm.h"
 #include "drmtest.h"
@@ -481,6 +483,327 @@ static void create_ext_placement_each(int fd)
free(regions);
 }
 
+static bool supports_needs_cpu_access(int fd)
+{
+   struct drm_i915_gem_memory_class_instance regions[] = {
+   { I915_MEMORY_CLASS_DEVICE, },
+   { I915_MEMORY_CLASS_SYSTEM, },
+   };
+   struct drm_i915_gem_create_ext_memory_regions setparam_region = {
+   .base = { .name = I915_GEM_CREATE_EXT_MEMORY_REGIONS },
+   .regions = to_user_pointer(),
+   .num_regions = ARRAY_SIZE(regions),
+   };
+   uint64_t size = PAGE_SIZE;
+   uint32_t handle;
+   int ret;
+
+   ret = __gem_create_ext(fd, ,
+  I915_GEM_CREATE_EXT_FLAG_NEEDS_CPU_ACCESS,
+  , _region.base);
+   if (!ret) {
+   gem_close(fd, handle);
+   igt_assert(gem_has_lmem(fd)); /* Should be dgpu only */
+   }
+
+   return ret == 0;
+}
+
+static uint32_t batch_create_size(int fd, uint64_t size)
+{
+   const uint32_t bbe = MI_BATCH_BUFFER_END;
+   uint32_t handle;
+
+   handle = gem_create(fd, size);
+   gem_write(fd, handle, 0, , sizeof(bbe));
+
+   return handle;
+}
+
+static int upload(int fd, uint32_t handle)
+{
+   struct drm_i915_gem_exec_object2 exec[2] = {};
+   struct drm_i915_gem_execbuffer2 execbuf = {
+   .buffers_ptr = to_user_pointer(),
+   .buffer_count = 2,
+   };
+
+   /*
+* To be reasonably sure that we are not being swindled, let's make sure
+* to 'touch' the pages from the GPU first to ensure the object is for
+* sure placed in one of requested regions.
+*/
+   exec[0].handle = handle;
+   exec[1].handle = batch_create_size(fd, PAGE_SIZE);
+
+   return __gem_execbuf(fd, );
+}
+
+static int alloc_lmem(int fd, uint32_t *handle,
+ struct drm_i915_gem_memory_class_instance ci,
+ uint64_t size, bool cpu_access, bool do_upload)
+{
+   struct drm_i915_gem_memory_class_instance regions[] = {
+   ci, { I915_MEMORY_CLASS_SYSTEM, },
+   };
+   struct drm_i915_gem_create_ext_memory_regions setparam_region = {
+   .base = { .name = I915_GEM_CREATE_EXT_MEMORY_REGIONS },
+   .regions = to_user_pointer(),
+   };
+   uint32_t flags;
+
+   igt_assert_eq(ci.memory_class, I915_MEMORY_CLASS_DEVICE);
+
+   flags = 0;
+   setparam_region.num_regions = 1;
+   if (cpu_access) {
+   flags = I915_GEM_CREATE_EXT_FLAG_NEEDS_CPU_ACCESS,
+   setparam_region.num_regions = 2;
+   }
+
+   *handle = gem_create_ext(fd, size, flags, _region.base);
+
+   if (do_upload)
+   return upload(fd, *handle);
+
+   return 0;
+}
+
+static void create_ext_cpu_access_sanity_check(int fd)
+{
+   struct drm_i915_gem_create_ext_memory_regions setparam_region = {
+   .base = { .name = I915_GEM_CREATE_EXT_MEMORY_REGIONS },
+   };
+   struct drm_i915_query_memory_regions *regions;
+   uint64_t size = PAGE_SIZE;
+   uint32_t handle;
+   int i;
+
+   /*
+* The ABI is that FLAG_NEEDS_CPU_ACCESS can only be applied to LMEM +
+* SMEM objects. Make sure the kernel follows that. Let's check if we
+* can indeed fault the object.
+*/
+
+   /* Implicit placement; should fail */
+   igt_assert_eq(__gem_create_ext(fd, ,
+  
I915_GEM_CREATE_EXT_FLAG_NEEDS_CPU_ACCESS,
+  , NULL), -EINVAL);
+
+   regions = gem_get_query_memory_regions(fd);
+   igt_assert(regions);
+   igt_assert(regions->num_regions);
+
+   for (i = 0; i < regions->num_regions; i++) {
+   struct drm_i915_gem_memory_class_instance ci_regions[2] = {
+   regions->regions[i].region,
+   { I915_MEMORY_CLASS_SYSTEM, },
+   };
+   uint32_t *ptr;
+
+   setparam_region.regions = to_user_pointer(ci_regions);
+   setparam_region.num_regions = 1;
+
+   /* Single explicit placement; should fail */
+   igt_assert_eq(__gem_create_ext(fd, ,
+  
I915_GEM_CREATE_EXT_FLAG_NEEDS_CPU_ACCESS,
+  , _region.base),
+ -EINVAL);
+
+   if 

[Intel-gfx] [PATCH i-g-t v2 4/6] lib/i915: add gem_create_with_cpu_access_in_memory_regions

2022-02-21 Thread Matthew Auld
Most users shouldn't care about such an interface, but where required,
this should be useful to aid in setting NEEDS_CPU_ACCESS for a given BO.
Underneath we try to smooth over needing to provide an explicit SMEM
region, or if this is SMEM-only, we don't want the kernel to throw an
error.

Put it to use in gem_exec_capture, where a proper hint is now required
by the kernel on DG2+, for objects marked with EXEC_OBJECT_CAPTURE, that
can also be placed in LMEM.

Signed-off-by: Matthew Auld 
Cc: Thomas Hellström 
---
 lib/i915/intel_memory_region.c | 10 +---
 lib/i915/intel_memory_region.h | 46 +++---
 tests/i915/gem_exec_capture.c  |  6 ++---
 tests/i915/gem_lmem_swapping.c |  2 +-
 4 files changed, 52 insertions(+), 12 deletions(-)

diff --git a/lib/i915/intel_memory_region.c b/lib/i915/intel_memory_region.c
index f0c8bc7c..4893c5ba 100644
--- a/lib/i915/intel_memory_region.c
+++ b/lib/i915/intel_memory_region.c
@@ -197,7 +197,7 @@ bool gem_has_lmem(int fd)
 
 /* A version of gem_create_in_memory_region_list which can be allowed to
fail so that the object creation can be retried */
-int __gem_create_in_memory_region_list(int fd, uint32_t *handle, uint64_t 
*size,
+int __gem_create_in_memory_region_list(int fd, uint32_t *handle, uint64_t 
*size, uint32_t flags,
   struct 
drm_i915_gem_memory_class_instance *mem_regions,
   int num_regions)
 {
@@ -208,7 +208,9 @@ int __gem_create_in_memory_region_list(int fd, uint32_t 
*handle, uint64_t *size,
};
int ret;
 
-   ret = __gem_create_ext(fd, size, 0, handle, _regions.base);
+   ret = __gem_create_ext(fd, size, flags, handle, _regions.base);
+   if (flags && ret == -EINVAL)
+   ret = __gem_create_ext(fd, size, 0, handle, _regions.base);
 
/*
 * Provide fallback for stable kernels if region passed in the array
@@ -231,12 +233,12 @@ int __gem_create_in_memory_region_list(int fd, uint32_t 
*handle, uint64_t *size,
  * @mem_regions: memory regions array (priority list)
  * @num_regions: @mem_regions length
  */
-uint32_t gem_create_in_memory_region_list(int fd, uint64_t size,
+uint32_t gem_create_in_memory_region_list(int fd, uint64_t size, uint32_t 
flags,
  struct 
drm_i915_gem_memory_class_instance *mem_regions,
  int num_regions)
 {
uint32_t handle;
-   int ret = __gem_create_in_memory_region_list(fd, , ,
+   int ret = __gem_create_in_memory_region_list(fd, , , flags,
 mem_regions, num_regions);
igt_assert_eq(ret, 0);
return handle;
diff --git a/lib/i915/intel_memory_region.h b/lib/i915/intel_memory_region.h
index 936e7d1c..7cc119ec 100644
--- a/lib/i915/intel_memory_region.h
+++ b/lib/i915/intel_memory_region.h
@@ -21,6 +21,7 @@
  * IN THE SOFTWARE.
  */
 #include "igt_collection.h"
+#include "i915_drm_local.h"
 
 #ifndef INTEL_MEMORY_REGION_H
 #define INTEL_MEMORY_REGION_H
@@ -64,11 +65,11 @@ bool gem_has_lmem(int fd);
 
 struct drm_i915_gem_memory_class_instance;
 
-int __gem_create_in_memory_region_list(int fd, uint32_t *handle, uint64_t 
*size,
+int __gem_create_in_memory_region_list(int fd, uint32_t *handle, uint64_t 
*size, uint32_t flags,
   struct 
drm_i915_gem_memory_class_instance *mem_regions,
   int num_regions);
 
-uint32_t gem_create_in_memory_region_list(int fd, uint64_t size,
+uint32_t gem_create_in_memory_region_list(int fd, uint64_t size, uint32_t 
flags,
  struct 
drm_i915_gem_memory_class_instance *mem_regions,
  int num_regions);
 
@@ -84,7 +85,7 @@ uint32_t gem_create_in_memory_region_list(int fd, uint64_t 
size,
arr_query__[i__].memory_class = 
MEMORY_TYPE_FROM_REGION(arr__[i__]);  \
arr_query__[i__].memory_instance = 
MEMORY_INSTANCE_FROM_REGION(arr__[i__]);  \
} \
-   __gem_create_in_memory_region_list(fd, handle, size, arr_query__, 
ARRAY_SIZE(arr_query__)); \
+   __gem_create_in_memory_region_list(fd, handle, size, 0, arr_query__, 
ARRAY_SIZE(arr_query__)); \
 })
 #define gem_create_in_memory_regions(fd, size, regions...) ({ \
unsigned int arr__[] = { regions }; \
@@ -93,7 +94,44 @@ uint32_t gem_create_in_memory_region_list(int fd, uint64_t 
size,
arr_query__[i__].memory_class = 
MEMORY_TYPE_FROM_REGION(arr__[i__]);  \
arr_query__[i__].memory_instance = 
MEMORY_INSTANCE_FROM_REGION(arr__[i__]);  \
} \
-   gem_create_in_memory_region_list(fd, size, arr_query__, 
ARRAY_SIZE(arr_query__)); \
+   gem_create_in_memory_region_list(fd, size, 0, arr_query__, 
ARRAY_SIZE(arr_query__)); \
+})
+
+/*
+ * Create an object that requires CPU access. This only becomes interesting 

[Intel-gfx] [PATCH i-g-t v2 6/6] lib/i915: request CPU_ACCESS for fb objects

2022-02-21 Thread Matthew Auld
kms_frontbuffer_tracking@basic falls over if the fb needs to be migrated
from non-mappable device memory, to the mappable part, due to being
temporarily pinned for scanout, when hitting the CPU fault handler,
which just gives us SIGBUS. If the device has a small BAR let's attempt
to use the mappable portion, if possible.

XXX: perhaps the kernel needs to somehow handle this better?

Signed-off-by: Matthew Auld 
Cc: Thomas Hellström 
---
 lib/ioctl_wrappers.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/lib/ioctl_wrappers.c b/lib/ioctl_wrappers.c
index 09eb3ce7..7713e78b 100644
--- a/lib/ioctl_wrappers.c
+++ b/lib/ioctl_wrappers.c
@@ -635,7 +635,8 @@ uint32_t gem_buffer_create_fb_obj(int fd, uint64_t size)
uint32_t handle;
 
if (gem_has_lmem(fd))
-   handle = gem_create_in_memory_regions(fd, size, REGION_LMEM(0));
+   handle = gem_create_with_cpu_access_in_memory_regions(fd, size,
+ 
REGION_LMEM(0));
else
handle = gem_create(fd, size);
 
-- 
2.34.1



[Intel-gfx] [PATCH i-g-t v2 2/6] lib/i915: wire up optional flags for gem_create_ext

2022-02-21 Thread Matthew Auld
For now limit to direct callers.

Signed-off-by: Matthew Auld 
Cc: Thomas Hellström 
---
 lib/i915/gem_create.c  |  9 ++---
 lib/i915/gem_create.h  |  5 +++--
 lib/i915/intel_memory_region.c |  2 +-
 tests/i915/gem_create.c| 24 
 tests/i915/gem_pxp.c   |  2 +-
 5 files changed, 23 insertions(+), 19 deletions(-)

diff --git a/lib/i915/gem_create.c b/lib/i915/gem_create.c
index b2e8d559..d245a32e 100644
--- a/lib/i915/gem_create.c
+++ b/lib/i915/gem_create.c
@@ -48,11 +48,12 @@ uint32_t gem_create(int fd, uint64_t size)
return handle;
 }
 
-int __gem_create_ext(int fd, uint64_t *size, uint32_t *handle,
+int __gem_create_ext(int fd, uint64_t *size, uint32_t flags, uint32_t *handle,
 struct i915_user_extension *ext)
 {
struct drm_i915_gem_create_ext create = {
.size = *size,
+   .flags = flags,
.extensions = to_user_pointer(ext),
};
int err = 0;
@@ -73,6 +74,7 @@ int __gem_create_ext(int fd, uint64_t *size, uint32_t *handle,
  * gem_create_ext:
  * @fd: open i915 drm file descriptor
  * @size: desired size of the buffer
+ * @flags: optional flags
  * @ext: optional extensions chain
  *
  * This wraps the GEM_CREATE_EXT ioctl, which allocates a new gem buffer object
@@ -80,11 +82,12 @@ int __gem_create_ext(int fd, uint64_t *size, uint32_t 
*handle,
  *
  * Returns: The file-private handle of the created buffer object
  */
-uint32_t gem_create_ext(int fd, uint64_t size, struct i915_user_extension *ext)
+uint32_t gem_create_ext(int fd, uint64_t size, uint32_t flags,
+   struct i915_user_extension *ext)
 {
uint32_t handle;
 
-   igt_assert_eq(__gem_create_ext(fd, , , ext), 0);
+   igt_assert_eq(__gem_create_ext(fd, , flags, , ext), 0);
 
return handle;
 }
diff --git a/lib/i915/gem_create.h b/lib/i915/gem_create.h
index c2b531b4..02232693 100644
--- a/lib/i915/gem_create.h
+++ b/lib/i915/gem_create.h
@@ -12,8 +12,9 @@
 
 int __gem_create(int fd, uint64_t *size, uint32_t *handle);
 uint32_t gem_create(int fd, uint64_t size);
-int __gem_create_ext(int fd, uint64_t *size, uint32_t *handle,
+int __gem_create_ext(int fd, uint64_t *size, uint32_t flags, uint32_t *handle,
  struct i915_user_extension *ext);
-uint32_t gem_create_ext(int fd, uint64_t size, struct i915_user_extension 
*ext);
+uint32_t gem_create_ext(int fd, uint64_t size, uint32_t flags,
+   struct i915_user_extension *ext);
 
 #endif /* GEM_CREATE_H */
diff --git a/lib/i915/intel_memory_region.c b/lib/i915/intel_memory_region.c
index a8759e06..f0c8bc7c 100644
--- a/lib/i915/intel_memory_region.c
+++ b/lib/i915/intel_memory_region.c
@@ -208,7 +208,7 @@ int __gem_create_in_memory_region_list(int fd, uint32_t 
*handle, uint64_t *size,
};
int ret;
 
-   ret = __gem_create_ext(fd, size, handle, _regions.base);
+   ret = __gem_create_ext(fd, size, 0, handle, _regions.base);
 
/*
 * Provide fallback for stable kernels if region passed in the array
diff --git a/tests/i915/gem_create.c b/tests/i915/gem_create.c
index 45804cde..a6c3c9d9 100644
--- a/tests/i915/gem_create.c
+++ b/tests/i915/gem_create.c
@@ -331,38 +331,38 @@ static void create_ext_placement_sanity_check(int fd)
 * behaviour.
 */
size = PAGE_SIZE;
-   igt_assert_eq(__gem_create_ext(fd, , , 0), 0);
+   igt_assert_eq(__gem_create_ext(fd, , 0, , 0), 0);
gem_close(fd, handle);
 
/* Try some uncreative invalid combinations */
setparam_region.regions = to_user_pointer(_smem);
setparam_region.num_regions = 0;
size = PAGE_SIZE;
-   igt_assert_neq(__gem_create_ext(fd, , ,
+   igt_assert_neq(__gem_create_ext(fd, , 0, ,
_region.base), 0);
 
setparam_region.regions = to_user_pointer(_smem);
setparam_region.num_regions = regions->num_regions + 1;
size = PAGE_SIZE;
-   igt_assert_neq(__gem_create_ext(fd, , ,
+   igt_assert_neq(__gem_create_ext(fd, , 0, ,
_region.base), 0);
 
setparam_region.regions = to_user_pointer(_smem);
setparam_region.num_regions = -1;
size = PAGE_SIZE;
-   igt_assert_neq(__gem_create_ext(fd, , ,
+   igt_assert_neq(__gem_create_ext(fd, , 0, ,
_region.base), 0);
 
setparam_region.regions = to_user_pointer(_invalid);
setparam_region.num_regions = 1;
size = PAGE_SIZE;
-   igt_assert_neq(__gem_create_ext(fd, , ,
+   igt_assert_neq(__gem_create_ext(fd, , 0, ,
_region.base), 0);
 
setparam_region.regions = to_user_pointer(_invalid);
setparam_region.num_regions = 0;
size = PAGE_SIZE;
-   igt_assert_neq(__gem_create_ext(fd, , ,
+   

[Intel-gfx] [PATCH i-g-t v2 1/6] lib/i915_drm_local: Add I915_GEM_CREATE_EXT_FLAG_NEEDS_CPU_ACCESS

2022-02-21 Thread Matthew Auld
For now dump into i915_drm_local.h. Once the uapi on the kernel side is
merged, and is part of drm-next, we can sync the kernel headers and
remove this.

Signed-off-by: Matthew Auld 
Cc: Thomas Hellström 
---
 lib/i915/i915_drm_local.h | 27 +++
 1 file changed, 27 insertions(+)

diff --git a/lib/i915/i915_drm_local.h b/lib/i915/i915_drm_local.h
index 9e82c968..7b5285f3 100644
--- a/lib/i915/i915_drm_local.h
+++ b/lib/i915/i915_drm_local.h
@@ -21,6 +21,33 @@ extern "C" {
  */
 #define I915_ENGINE_CLASS_COMPUTE 4
 
+/*
+ * Signal to the kernel that the object will need to be accessed via
+ * the CPU.
+ *
+ * Only valid when placing objects in I915_MEMORY_CLASS_DEVICE, and only
+ * strictly required on platforms where only some of the device memory
+ * is directly visible or mappable through the CPU, like on DG2+.
+ *
+ * One of the placements MUST also be I915_MEMORY_CLASS_SYSTEM, to
+ * ensure we can always spill the allocation to system memory, if we
+ * can't place the object in the mappable part of
+ * I915_MEMORY_CLASS_DEVICE.
+ *
+ * Note that buffers that need to be captured with EXEC_OBJECT_CAPTURE,
+ * will need to enable this hint, if the object can also be placed in
+ * I915_MEMORY_CLASS_DEVICE, starting from DG2+. The execbuf call will
+ * throw an error otherwise. This also means that such objects will need
+ * I915_MEMORY_CLASS_SYSTEM set as a possible placement.
+ *
+ * Without this hint, the kernel will assume that non-mappable
+ * I915_MEMORY_CLASS_DEVICE is preferred for this object. Note that the
+ * kernel can still migrate the object to the mappable part, as a last
+ * resort, if userspace ever CPU faults this object, but this might be
+ * expensive, and so ideally should be avoided.
+ */
+#define I915_GEM_CREATE_EXT_FLAG_NEEDS_CPU_ACCESS (1 << 0)
+
 #if defined(__cplusplus)
 }
 #endif
-- 
2.34.1



[Intel-gfx] [PATCH i-g-t v2 0/6] Exercise NEEDS_CPU_ACCESS

2022-02-21 Thread Matthew Auld
Add some initial tests for the new I915_GEM_CREATE_EXT_FLAG_NEEDS_CPU_ACCESS
flag.

v2: Add missing cover letter. Likely also needed when using 'Test-with:'

-- 
2.34.1



[Intel-gfx] [PATCH i-g-t 6/6] lib/i915: request CPU_ACCESS for fb objects

2022-02-21 Thread Matthew Auld
kms_frontbuffer_tracking@basic falls over if the fb needs to be migrated
from non-mappable device memory, to the mappable part, due to being
temporarily pinned for scanout, when hitting the CPU fault handler,
which just gives us SIGBUS. If the device has a small BAR let's attempt
to use the mappable portion, if possible.

XXX: perhaps the kernel needs to somehow handle this better?

Signed-off-by: Matthew Auld 
Cc: Thomas Hellström 
---
 lib/ioctl_wrappers.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/lib/ioctl_wrappers.c b/lib/ioctl_wrappers.c
index 09eb3ce7..7713e78b 100644
--- a/lib/ioctl_wrappers.c
+++ b/lib/ioctl_wrappers.c
@@ -635,7 +635,8 @@ uint32_t gem_buffer_create_fb_obj(int fd, uint64_t size)
uint32_t handle;
 
if (gem_has_lmem(fd))
-   handle = gem_create_in_memory_regions(fd, size, REGION_LMEM(0));
+   handle = gem_create_with_cpu_access_in_memory_regions(fd, size,
+ 
REGION_LMEM(0));
else
handle = gem_create(fd, size);
 
-- 
2.34.1



[Intel-gfx] [PATCH i-g-t 5/6] i915/tests/capture: add a negative test for NEEDS_CPU_ACCESS

2022-02-21 Thread Matthew Auld
Sanity check that the kernel does indeed reject LMEM buffers marked with
EXEC_OBJECT_CAPTURE, that are not also marked with NEEDS_CPU_ACCESS.

Signed-off-by: Matthew Auld 
Cc: Thomas Hellström 
---
 tests/i915/gem_exec_capture.c | 69 +++
 1 file changed, 69 insertions(+)

diff --git a/tests/i915/gem_exec_capture.c b/tests/i915/gem_exec_capture.c
index 24ba6036..09187f62 100644
--- a/tests/i915/gem_exec_capture.c
+++ b/tests/i915/gem_exec_capture.c
@@ -735,6 +735,71 @@ static void userptr(int fd, int dir)
gem_engine_properties_restore(fd, _engine);
 }
 
+static bool supports_needs_cpu_access(int fd)
+{
+   struct drm_i915_gem_memory_class_instance regions[] = {
+   { I915_MEMORY_CLASS_DEVICE, },
+   { I915_MEMORY_CLASS_SYSTEM, },
+   };
+   struct drm_i915_gem_create_ext_memory_regions setparam_region = {
+   .base = { .name = I915_GEM_CREATE_EXT_MEMORY_REGIONS },
+   .regions = to_user_pointer(),
+   .num_regions = ARRAY_SIZE(regions),
+   };
+   uint64_t size = 4096;
+   uint32_t handle;
+   int ret;
+
+   ret = __gem_create_ext(fd, ,
+  I915_GEM_CREATE_EXT_FLAG_NEEDS_CPU_ACCESS,
+  , _region.base);
+   if (!ret) {
+   gem_close(fd, handle);
+   igt_assert(gem_has_lmem(fd)); /* Should be dgpu only */
+   }
+
+   return ret == 0;
+}
+
+static void capture_no_cpu_access(int fd)
+{
+   struct drm_i915_gem_exec_object2 exec = {
+   .flags = EXEC_OBJECT_CAPTURE,
+   };
+   struct drm_i915_gem_execbuffer2 execbuf = {
+   .buffers_ptr = to_user_pointer(),
+   .buffer_count = 1,
+   };
+   uint64_t size = 4096;
+   uint32_t handle;
+   int ret;
+
+   igt_require(gem_has_lmem(fd));
+   igt_require(supports_needs_cpu_access(fd));
+
+   /*
+* Sanity check that execbuf rejects EXEC_OBJECT_CAPTURE marked BO, that
+* is not also tagged with I915_GEM_CREATE_EXT_FLAG_NEEDS_CPU_ACCESS, if
+* it can be placed in LMEM. This is only relevant for Dg2+.
+*/
+
+   igt_require(__gem_create_in_memory_regions(fd, , ,
+  REGION_LMEM(0)) == 0);
+
+   exec.handle = handle;
+   ret = __gem_execbuf(fd, );
+   if (IS_DG1(fd)) /* Should be no impact on existing ABI */
+   igt_assert(ret == 0);
+   else
+   igt_assert(ret == -EINVAL);
+
+   /* SMEM only buffers should work as normal */
+   igt_assert(__gem_create_in_memory_regions(fd, , ,
+ REGION_SMEM) == 0);
+   exec.handle = handle;
+   igt_assert(__gem_execbuf(fd, ) == 0);
+}
+
 static bool has_capture(int fd)
 {
drm_i915_getparam_t gp;
@@ -839,6 +904,10 @@ igt_main
igt_dynamic_f("%s", (e)->name)
prioinv(fd, dir, ctx, e);
 
+   igt_describe("Verify the ABI contract when using EXEC_OBJECT_CAPTURE 
without I915_GEM_CREATE_EXT_FLAG_NEEDS_CPU_ACCESS");
+   igt_subtest_f("capture-non-cpu-access")
+   capture_no_cpu_access(fd);
+
igt_fixture {
close(dir);
igt_disallow_hang(fd, hang);
-- 
2.34.1



[Intel-gfx] [PATCH i-g-t 4/6] lib/i915: add gem_create_with_cpu_access_in_memory_regions

2022-02-21 Thread Matthew Auld
Most users shouldn't care about such an interface, but where required,
this should be useful to aid in setting NEEDS_CPU_ACCESS for a given BO.
Underneath we try to smooth over needing to provide an explicit SMEM
region, or if this is SMEM-only, we don't want the kernel to throw an
error.

Put it to use in gem_exec_capture, where a proper hint is now required
by the kernel on DG2+, for objects marked with EXEC_OBJECT_CAPTURE, that
can also be placed in LMEM.

Signed-off-by: Matthew Auld 
Cc: Thomas Hellström 
---
 lib/i915/intel_memory_region.c | 10 +---
 lib/i915/intel_memory_region.h | 46 +++---
 tests/i915/gem_exec_capture.c  |  6 ++---
 tests/i915/gem_lmem_swapping.c |  2 +-
 4 files changed, 52 insertions(+), 12 deletions(-)

diff --git a/lib/i915/intel_memory_region.c b/lib/i915/intel_memory_region.c
index f0c8bc7c..4893c5ba 100644
--- a/lib/i915/intel_memory_region.c
+++ b/lib/i915/intel_memory_region.c
@@ -197,7 +197,7 @@ bool gem_has_lmem(int fd)
 
 /* A version of gem_create_in_memory_region_list which can be allowed to
fail so that the object creation can be retried */
-int __gem_create_in_memory_region_list(int fd, uint32_t *handle, uint64_t 
*size,
+int __gem_create_in_memory_region_list(int fd, uint32_t *handle, uint64_t 
*size, uint32_t flags,
   struct 
drm_i915_gem_memory_class_instance *mem_regions,
   int num_regions)
 {
@@ -208,7 +208,9 @@ int __gem_create_in_memory_region_list(int fd, uint32_t 
*handle, uint64_t *size,
};
int ret;
 
-   ret = __gem_create_ext(fd, size, 0, handle, _regions.base);
+   ret = __gem_create_ext(fd, size, flags, handle, _regions.base);
+   if (flags && ret == -EINVAL)
+   ret = __gem_create_ext(fd, size, 0, handle, _regions.base);
 
/*
 * Provide fallback for stable kernels if region passed in the array
@@ -231,12 +233,12 @@ int __gem_create_in_memory_region_list(int fd, uint32_t 
*handle, uint64_t *size,
  * @mem_regions: memory regions array (priority list)
  * @num_regions: @mem_regions length
  */
-uint32_t gem_create_in_memory_region_list(int fd, uint64_t size,
+uint32_t gem_create_in_memory_region_list(int fd, uint64_t size, uint32_t 
flags,
  struct 
drm_i915_gem_memory_class_instance *mem_regions,
  int num_regions)
 {
uint32_t handle;
-   int ret = __gem_create_in_memory_region_list(fd, , ,
+   int ret = __gem_create_in_memory_region_list(fd, , , flags,
 mem_regions, num_regions);
igt_assert_eq(ret, 0);
return handle;
diff --git a/lib/i915/intel_memory_region.h b/lib/i915/intel_memory_region.h
index 936e7d1c..7cc119ec 100644
--- a/lib/i915/intel_memory_region.h
+++ b/lib/i915/intel_memory_region.h
@@ -21,6 +21,7 @@
  * IN THE SOFTWARE.
  */
 #include "igt_collection.h"
+#include "i915_drm_local.h"
 
 #ifndef INTEL_MEMORY_REGION_H
 #define INTEL_MEMORY_REGION_H
@@ -64,11 +65,11 @@ bool gem_has_lmem(int fd);
 
 struct drm_i915_gem_memory_class_instance;
 
-int __gem_create_in_memory_region_list(int fd, uint32_t *handle, uint64_t 
*size,
+int __gem_create_in_memory_region_list(int fd, uint32_t *handle, uint64_t 
*size, uint32_t flags,
   struct 
drm_i915_gem_memory_class_instance *mem_regions,
   int num_regions);
 
-uint32_t gem_create_in_memory_region_list(int fd, uint64_t size,
+uint32_t gem_create_in_memory_region_list(int fd, uint64_t size, uint32_t 
flags,
  struct 
drm_i915_gem_memory_class_instance *mem_regions,
  int num_regions);
 
@@ -84,7 +85,7 @@ uint32_t gem_create_in_memory_region_list(int fd, uint64_t 
size,
arr_query__[i__].memory_class = 
MEMORY_TYPE_FROM_REGION(arr__[i__]);  \
arr_query__[i__].memory_instance = 
MEMORY_INSTANCE_FROM_REGION(arr__[i__]);  \
} \
-   __gem_create_in_memory_region_list(fd, handle, size, arr_query__, 
ARRAY_SIZE(arr_query__)); \
+   __gem_create_in_memory_region_list(fd, handle, size, 0, arr_query__, 
ARRAY_SIZE(arr_query__)); \
 })
 #define gem_create_in_memory_regions(fd, size, regions...) ({ \
unsigned int arr__[] = { regions }; \
@@ -93,7 +94,44 @@ uint32_t gem_create_in_memory_region_list(int fd, uint64_t 
size,
arr_query__[i__].memory_class = 
MEMORY_TYPE_FROM_REGION(arr__[i__]);  \
arr_query__[i__].memory_instance = 
MEMORY_INSTANCE_FROM_REGION(arr__[i__]);  \
} \
-   gem_create_in_memory_region_list(fd, size, arr_query__, 
ARRAY_SIZE(arr_query__)); \
+   gem_create_in_memory_region_list(fd, size, 0, arr_query__, 
ARRAY_SIZE(arr_query__)); \
+})
+
+/*
+ * Create an object that requires CPU access. This only becomes interesting 

[Intel-gfx] [PATCH i-g-t 3/6] tests/i915/gem_create: test NEEDS_CPU_ACCESS

2022-02-21 Thread Matthew Auld
Add some basic tests for this new flag.

Signed-off-by: Matthew Auld 
Cc: Thomas Hellström 
---
 tests/i915/gem_create.c | 334 
 1 file changed, 334 insertions(+)

diff --git a/tests/i915/gem_create.c b/tests/i915/gem_create.c
index a6c3c9d9..318e6491 100644
--- a/tests/i915/gem_create.c
+++ b/tests/i915/gem_create.c
@@ -43,6 +43,8 @@
 #include 
 #include 
 #include 
+#include 
+#include 
 
 #include "drm.h"
 #include "drmtest.h"
@@ -481,6 +483,327 @@ static void create_ext_placement_each(int fd)
free(regions);
 }
 
+static bool supports_needs_cpu_access(int fd)
+{
+   struct drm_i915_gem_memory_class_instance regions[] = {
+   { I915_MEMORY_CLASS_DEVICE, },
+   { I915_MEMORY_CLASS_SYSTEM, },
+   };
+   struct drm_i915_gem_create_ext_memory_regions setparam_region = {
+   .base = { .name = I915_GEM_CREATE_EXT_MEMORY_REGIONS },
+   .regions = to_user_pointer(),
+   .num_regions = ARRAY_SIZE(regions),
+   };
+   uint64_t size = PAGE_SIZE;
+   uint32_t handle;
+   int ret;
+
+   ret = __gem_create_ext(fd, ,
+  I915_GEM_CREATE_EXT_FLAG_NEEDS_CPU_ACCESS,
+  , _region.base);
+   if (!ret) {
+   gem_close(fd, handle);
+   igt_assert(gem_has_lmem(fd)); /* Should be dgpu only */
+   }
+
+   return ret == 0;
+}
+
+static uint32_t batch_create_size(int fd, uint64_t size)
+{
+   const uint32_t bbe = MI_BATCH_BUFFER_END;
+   uint32_t handle;
+
+   handle = gem_create(fd, size);
+   gem_write(fd, handle, 0, , sizeof(bbe));
+
+   return handle;
+}
+
+static int upload(int fd, uint32_t handle)
+{
+   struct drm_i915_gem_exec_object2 exec[2] = {};
+   struct drm_i915_gem_execbuffer2 execbuf = {
+   .buffers_ptr = to_user_pointer(),
+   .buffer_count = 2,
+   };
+
+   /*
+* To be reasonably sure that we are not being swindled, let's make sure
+* to 'touch' the pages from the GPU first to ensure the object is for
+* sure placed in one of requested regions.
+*/
+   exec[0].handle = handle;
+   exec[1].handle = batch_create_size(fd, PAGE_SIZE);
+
+   return __gem_execbuf(fd, );
+}
+
+static int alloc_lmem(int fd, uint32_t *handle,
+ struct drm_i915_gem_memory_class_instance ci,
+ uint64_t size, bool cpu_access, bool do_upload)
+{
+   struct drm_i915_gem_memory_class_instance regions[] = {
+   ci, { I915_MEMORY_CLASS_SYSTEM, },
+   };
+   struct drm_i915_gem_create_ext_memory_regions setparam_region = {
+   .base = { .name = I915_GEM_CREATE_EXT_MEMORY_REGIONS },
+   .regions = to_user_pointer(),
+   };
+   uint32_t flags;
+
+   igt_assert_eq(ci.memory_class, I915_MEMORY_CLASS_DEVICE);
+
+   flags = 0;
+   setparam_region.num_regions = 1;
+   if (cpu_access) {
+   flags = I915_GEM_CREATE_EXT_FLAG_NEEDS_CPU_ACCESS,
+   setparam_region.num_regions = 2;
+   }
+
+   *handle = gem_create_ext(fd, size, flags, _region.base);
+
+   if (do_upload)
+   return upload(fd, *handle);
+
+   return 0;
+}
+
+static void create_ext_cpu_access_sanity_check(int fd)
+{
+   struct drm_i915_gem_create_ext_memory_regions setparam_region = {
+   .base = { .name = I915_GEM_CREATE_EXT_MEMORY_REGIONS },
+   };
+   struct drm_i915_query_memory_regions *regions;
+   uint64_t size = PAGE_SIZE;
+   uint32_t handle;
+   int i;
+
+   /*
+* The ABI is that FLAG_NEEDS_CPU_ACCESS can only be applied to LMEM +
+* SMEM objects. Make sure the kernel follows that. Let's check if we
+* can indeed fault the object.
+*/
+
+   /* Implicit placement; should fail */
+   igt_assert_eq(__gem_create_ext(fd, ,
+  
I915_GEM_CREATE_EXT_FLAG_NEEDS_CPU_ACCESS,
+  , NULL), -EINVAL);
+
+   regions = gem_get_query_memory_regions(fd);
+   igt_assert(regions);
+   igt_assert(regions->num_regions);
+
+   for (i = 0; i < regions->num_regions; i++) {
+   struct drm_i915_gem_memory_class_instance ci_regions[2] = {
+   regions->regions[i].region,
+   { I915_MEMORY_CLASS_SYSTEM, },
+   };
+   uint32_t *ptr;
+
+   setparam_region.regions = to_user_pointer(ci_regions);
+   setparam_region.num_regions = 1;
+
+   /* Single explicit placement; should fail */
+   igt_assert_eq(__gem_create_ext(fd, ,
+  
I915_GEM_CREATE_EXT_FLAG_NEEDS_CPU_ACCESS,
+  , _region.base),
+ -EINVAL);
+
+   if 

[Intel-gfx] [PATCH i-g-t 1/6] lib/i915_drm_local: Add I915_GEM_CREATE_EXT_FLAG_NEEDS_CPU_ACCESS

2022-02-21 Thread Matthew Auld
For now dump into i915_drm_local.h. Once the uapi on the kernel side is
merged, and is part of drm-next, we can sync the kernel headers and
remove this.

Signed-off-by: Matthew Auld 
Cc: Thomas Hellström 
---
 lib/i915/i915_drm_local.h | 27 +++
 1 file changed, 27 insertions(+)

diff --git a/lib/i915/i915_drm_local.h b/lib/i915/i915_drm_local.h
index 9e82c968..7b5285f3 100644
--- a/lib/i915/i915_drm_local.h
+++ b/lib/i915/i915_drm_local.h
@@ -21,6 +21,33 @@ extern "C" {
  */
 #define I915_ENGINE_CLASS_COMPUTE 4
 
+/*
+ * Signal to the kernel that the object will need to be accessed via
+ * the CPU.
+ *
+ * Only valid when placing objects in I915_MEMORY_CLASS_DEVICE, and only
+ * strictly required on platforms where only some of the device memory
+ * is directly visible or mappable through the CPU, like on DG2+.
+ *
+ * One of the placements MUST also be I915_MEMORY_CLASS_SYSTEM, to
+ * ensure we can always spill the allocation to system memory, if we
+ * can't place the object in the mappable part of
+ * I915_MEMORY_CLASS_DEVICE.
+ *
+ * Note that buffers that need to be captured with EXEC_OBJECT_CAPTURE,
+ * will need to enable this hint, if the object can also be placed in
+ * I915_MEMORY_CLASS_DEVICE, starting from DG2+. The execbuf call will
+ * throw an error otherwise. This also means that such objects will need
+ * I915_MEMORY_CLASS_SYSTEM set as a possible placement.
+ *
+ * Without this hint, the kernel will assume that non-mappable
+ * I915_MEMORY_CLASS_DEVICE is preferred for this object. Note that the
+ * kernel can still migrate the object to the mappable part, as a last
+ * resort, if userspace ever CPU faults this object, but this might be
+ * expensive, and so ideally should be avoided.
+ */
+#define I915_GEM_CREATE_EXT_FLAG_NEEDS_CPU_ACCESS (1 << 0)
+
 #if defined(__cplusplus)
 }
 #endif
-- 
2.34.1



[Intel-gfx] [PATCH i-g-t 2/6] lib/i915: wire up optional flags for gem_create_ext

2022-02-21 Thread Matthew Auld
For now limit to direct callers.

Signed-off-by: Matthew Auld 
Cc: Thomas Hellström 
---
 lib/i915/gem_create.c  |  9 ++---
 lib/i915/gem_create.h  |  5 +++--
 lib/i915/intel_memory_region.c |  2 +-
 tests/i915/gem_create.c| 24 
 tests/i915/gem_pxp.c   |  2 +-
 5 files changed, 23 insertions(+), 19 deletions(-)

diff --git a/lib/i915/gem_create.c b/lib/i915/gem_create.c
index b2e8d559..d245a32e 100644
--- a/lib/i915/gem_create.c
+++ b/lib/i915/gem_create.c
@@ -48,11 +48,12 @@ uint32_t gem_create(int fd, uint64_t size)
return handle;
 }
 
-int __gem_create_ext(int fd, uint64_t *size, uint32_t *handle,
+int __gem_create_ext(int fd, uint64_t *size, uint32_t flags, uint32_t *handle,
 struct i915_user_extension *ext)
 {
struct drm_i915_gem_create_ext create = {
.size = *size,
+   .flags = flags,
.extensions = to_user_pointer(ext),
};
int err = 0;
@@ -73,6 +74,7 @@ int __gem_create_ext(int fd, uint64_t *size, uint32_t *handle,
  * gem_create_ext:
  * @fd: open i915 drm file descriptor
  * @size: desired size of the buffer
+ * @flags: optional flags
  * @ext: optional extensions chain
  *
  * This wraps the GEM_CREATE_EXT ioctl, which allocates a new gem buffer object
@@ -80,11 +82,12 @@ int __gem_create_ext(int fd, uint64_t *size, uint32_t 
*handle,
  *
  * Returns: The file-private handle of the created buffer object
  */
-uint32_t gem_create_ext(int fd, uint64_t size, struct i915_user_extension *ext)
+uint32_t gem_create_ext(int fd, uint64_t size, uint32_t flags,
+   struct i915_user_extension *ext)
 {
uint32_t handle;
 
-   igt_assert_eq(__gem_create_ext(fd, , , ext), 0);
+   igt_assert_eq(__gem_create_ext(fd, , flags, , ext), 0);
 
return handle;
 }
diff --git a/lib/i915/gem_create.h b/lib/i915/gem_create.h
index c2b531b4..02232693 100644
--- a/lib/i915/gem_create.h
+++ b/lib/i915/gem_create.h
@@ -12,8 +12,9 @@
 
 int __gem_create(int fd, uint64_t *size, uint32_t *handle);
 uint32_t gem_create(int fd, uint64_t size);
-int __gem_create_ext(int fd, uint64_t *size, uint32_t *handle,
+int __gem_create_ext(int fd, uint64_t *size, uint32_t flags, uint32_t *handle,
  struct i915_user_extension *ext);
-uint32_t gem_create_ext(int fd, uint64_t size, struct i915_user_extension 
*ext);
+uint32_t gem_create_ext(int fd, uint64_t size, uint32_t flags,
+   struct i915_user_extension *ext);
 
 #endif /* GEM_CREATE_H */
diff --git a/lib/i915/intel_memory_region.c b/lib/i915/intel_memory_region.c
index a8759e06..f0c8bc7c 100644
--- a/lib/i915/intel_memory_region.c
+++ b/lib/i915/intel_memory_region.c
@@ -208,7 +208,7 @@ int __gem_create_in_memory_region_list(int fd, uint32_t 
*handle, uint64_t *size,
};
int ret;
 
-   ret = __gem_create_ext(fd, size, handle, _regions.base);
+   ret = __gem_create_ext(fd, size, 0, handle, _regions.base);
 
/*
 * Provide fallback for stable kernels if region passed in the array
diff --git a/tests/i915/gem_create.c b/tests/i915/gem_create.c
index 45804cde..a6c3c9d9 100644
--- a/tests/i915/gem_create.c
+++ b/tests/i915/gem_create.c
@@ -331,38 +331,38 @@ static void create_ext_placement_sanity_check(int fd)
 * behaviour.
 */
size = PAGE_SIZE;
-   igt_assert_eq(__gem_create_ext(fd, , , 0), 0);
+   igt_assert_eq(__gem_create_ext(fd, , 0, , 0), 0);
gem_close(fd, handle);
 
/* Try some uncreative invalid combinations */
setparam_region.regions = to_user_pointer(_smem);
setparam_region.num_regions = 0;
size = PAGE_SIZE;
-   igt_assert_neq(__gem_create_ext(fd, , ,
+   igt_assert_neq(__gem_create_ext(fd, , 0, ,
_region.base), 0);
 
setparam_region.regions = to_user_pointer(_smem);
setparam_region.num_regions = regions->num_regions + 1;
size = PAGE_SIZE;
-   igt_assert_neq(__gem_create_ext(fd, , ,
+   igt_assert_neq(__gem_create_ext(fd, , 0, ,
_region.base), 0);
 
setparam_region.regions = to_user_pointer(_smem);
setparam_region.num_regions = -1;
size = PAGE_SIZE;
-   igt_assert_neq(__gem_create_ext(fd, , ,
+   igt_assert_neq(__gem_create_ext(fd, , 0, ,
_region.base), 0);
 
setparam_region.regions = to_user_pointer(_invalid);
setparam_region.num_regions = 1;
size = PAGE_SIZE;
-   igt_assert_neq(__gem_create_ext(fd, , ,
+   igt_assert_neq(__gem_create_ext(fd, , 0, ,
_region.base), 0);
 
setparam_region.regions = to_user_pointer(_invalid);
setparam_region.num_regions = 0;
size = PAGE_SIZE;
-   igt_assert_neq(__gem_create_ext(fd, , ,
+   

[Intel-gfx] [PATCH i-g-t 2/2] test/i915/gem_exec_await: prefer gem_mmap__device_coherent

2022-02-21 Thread Matthew Auld
Make it play nice on at least DG1.

Signed-off-by: Matthew Auld 
Cc: Thomas Hellström 
---
 tests/i915/gem_exec_await.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/tests/i915/gem_exec_await.c b/tests/i915/gem_exec_await.c
index bf8eb682..fe176595 100644
--- a/tests/i915/gem_exec_await.c
+++ b/tests/i915/gem_exec_await.c
@@ -126,8 +126,8 @@ static void wide(int fd, const intel_ctx_t *ctx, int 
ring_size,
if (ahnd)
exec[e].exec[0].flags = EXEC_OBJECT_PINNED;
 
-   exec[e].cmd = gem_mmap__wc(fd, exec[e].exec[0].handle,
-  0, 4096, PROT_WRITE);
+   exec[e].cmd = gem_mmap__device_coherent(fd, 
exec[e].exec[0].handle,
+   0, 4096, PROT_WRITE);
 
gem_set_domain(fd, exec[e].exec[0].handle,
   I915_GEM_DOMAIN_WC, I915_GEM_DOMAIN_WC);
-- 
2.34.1



[Intel-gfx] [PATCH i-g-t 1/2] test/i915/gem_ctx_shared: prefer gem_mmap__device_coherent

2022-02-21 Thread Matthew Auld
Make it play nice on at least DG1.

Signed-off-by: Matthew Auld 
Cc: Thomas Hellström 
---
 tests/i915/gem_ctx_shared.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/tests/i915/gem_ctx_shared.c b/tests/i915/gem_ctx_shared.c
index 37444185..b38b7f73 100644
--- a/tests/i915/gem_ctx_shared.c
+++ b/tests/i915/gem_ctx_shared.c
@@ -290,7 +290,7 @@ static void exec_shared_gtt(int i915, const intel_ctx_cfg_t 
*cfg,
execbuf.flags |= I915_EXEC_FENCE_IN;
 
scratch = gem_create(i915, 4096);
-   s = gem_mmap__wc(i915, scratch, 0, 4096, PROT_WRITE);
+   s = gem_mmap__device_coherent(i915, scratch, 0, 4096, PROT_WRITE);
 
gem_set_domain(i915, scratch, I915_GEM_DOMAIN_WC, I915_GEM_DOMAIN_WC);
s[0] = bbe;
-- 
2.34.1



Re: [Intel-gfx] [PATCH v2] drm/i915/adlp: Add TypeC PHY TBT->DP-alt/legacy mode switch workaround

2022-02-21 Thread Souza, Jose
On Fri, 2022-02-18 at 14:31 +0200, Imre Deak wrote:
> Add display workaround # 1309179469 , which fixes a PHY hang when
> switching from TBT mode to DP-alt/legacy mode. The workaround also
> requires an IFWI/PHY firmware change, before that this change has no
> effect (the DKL_PCS_DW5/SOFTRESET flag is always cleared).
> 
> HSDES: 18018237866
> HSDES: 16014473319
> 
> v2: Add the WA comment and make the WA func name more accurate.
> 

Reviewed-by: José Roberto de Souza 

> Signed-off-by: Imre Deak 
> ---
>  drivers/gpu/drm/i915/display/intel_ddi.c | 20 +++-
>  drivers/gpu/drm/i915/i915_reg.h  |  6 ++
>  2 files changed, 25 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/gpu/drm/i915/display/intel_ddi.c 
> b/drivers/gpu/drm/i915/display/intel_ddi.c
> index 9dee12986991c..e6e26e4cd87d7 100644
> --- a/drivers/gpu/drm/i915/display/intel_ddi.c
> +++ b/drivers/gpu/drm/i915/display/intel_ddi.c
> @@ -3101,10 +3101,24 @@ intel_ddi_pre_pll_enable(struct intel_atomic_state 
> *state,
>   
> crtc_state->lane_lat_optim_mask);
>  }
>  
> +/* Display WA #1309179469: adl-p */
> +static void adlp_tbt_to_dp_alt_legacy_switch_wa(struct intel_encoder 
> *encoder)
> +{
> + struct drm_i915_private *i915 = to_i915(encoder->base.dev);
> + enum tc_port tc_port = intel_port_to_tc(i915, encoder->port);
> + int ln;
> +
> + for (ln = 0; ln < 2; ln++) {
> + intel_de_write(i915, HIP_INDEX_REG(tc_port), 
> HIP_INDEX_VAL(tc_port, ln));
> + intel_de_rmw(i915, DKL_PCS_DW5(tc_port), 
> DKL_PCS_DW5_CORE_SOFTRESET, 0);
> + }
> +}
> +
>  static void intel_ddi_prepare_link_retrain(struct intel_dp *intel_dp,
>  const struct intel_crtc_state 
> *crtc_state)
>  {
> - struct intel_encoder *encoder = _to_dig_port(intel_dp)->base;
> + struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
> + struct intel_encoder *encoder = _port->base;
>   struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
>   enum port port = encoder->port;
>   u32 dp_tp_ctl, ddi_buf_ctl;
> @@ -3140,6 +3154,10 @@ static void intel_ddi_prepare_link_retrain(struct 
> intel_dp *intel_dp,
>   intel_de_write(dev_priv, dp_tp_ctl_reg(encoder, crtc_state), dp_tp_ctl);
>   intel_de_posting_read(dev_priv, dp_tp_ctl_reg(encoder, crtc_state));
>  
> + if (IS_ALDERLAKE_P(dev_priv) &&
> + (intel_tc_port_in_dp_alt_mode(dig_port) || 
> intel_tc_port_in_legacy_mode(dig_port)))
> + adlp_tbt_to_dp_alt_legacy_switch_wa(encoder);
> +
>   intel_dp->DP |= DDI_BUF_CTL_ENABLE;
>   intel_de_write(dev_priv, DDI_BUF_CTL(port), intel_dp->DP);
>   intel_de_posting_read(dev_priv, DDI_BUF_CTL(port));
> diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
> index 26b496fa31972..8abbdc62b981f 100644
> --- a/drivers/gpu/drm/i915/i915_reg.h
> +++ b/drivers/gpu/drm/i915/i915_reg.h
> @@ -7907,6 +7907,12 @@ enum skl_power_gate {
>  #define _DKL_PHY6_BASE   0x16D000
>  
>  /* DEKEL PHY MMIO Address = Phy base + (internal address & ~index_mask) */
> +#define _DKL_PCS_DW5 0x14
> +#define DKL_PCS_DW5(tc_port) _MMIO(_PORT(tc_port, _DKL_PHY1_BASE, \
> + _DKL_PHY2_BASE) + \
> + _DKL_PCS_DW5)
> +#define   DKL_PCS_DW5_CORE_SOFTRESET REG_BIT(11)
> +
>  #define _DKL_PLL_DIV00x200
>  #define   DKL_PLL_DIV0_INTEG_COEFF(x)((x) << 16)
>  #define   DKL_PLL_DIV0_INTEG_COEFF_MASK  (0x1F << 16)



Re: [Intel-gfx] [PATCH v2] drm/i915/ttm: fixup the mock_bo

2022-02-21 Thread Thomas Hellström
On Mon, 2022-02-21 at 12:11 +, Matthew Auld wrote:
> When running the mock selftests we currently blow up with:
> 
> <6> [299.836278] i915: Running
> i915_gem_huge_page_mock_selftests/igt_mock_memory_region_huge_pages
> <1> [299.836356] BUG: kernel NULL pointer dereference, address:
> 00c8
> <1> [299.836361] #PF: supervisor read access in kernel mode
> <1> [299.836364] #PF: error_code(0x) - not-present page
> <6> [299.836367] PGD 0 P4D 0
> <4> [299.836369] Oops:  [#1] PREEMPT SMP NOPTI
> <4> [299.836372] CPU: 1 PID: 1429 Comm: i915_selftest Tainted: G
> U    5.17.0-rc4-CI-CI_DRM_11227+ #1
> <4> [299.836376] Hardware name: Intel(R) Client Systems
> NUC11TNHi5/NUC11TNBi5, BIOS TNTGL357.0042.2020.1221.1743 12/21/2020
> <4> [299.836380] RIP: 0010:ttm_resource_init+0x57/0x90 [ttm]
> <4> [299.836392] RSP: 0018:c90001e4f680 EFLAGS: 00010203
> <4> [299.836395] RAX:  RBX: c90001e4f708 RCX:
> 
> <4> [299.836398] RDX: 888116172528 RSI: c90001e4f6f8 RDI:
> 
> <4> [299.836401] RBP: c90001e4f6f8 R08: 01b0 R09:
> 888116172528
> <4> [299.836403] R10: 0001 R11: a4cb2e51 R12:
> c90001e4fa90
> <4> [299.836406] R13: 888116172528 R14: 888130d7f4b0 R15:
> 888130d7f400
> <4> [299.836409] FS:  7ff241684500()
> GS:88849fe8() knlGS:
> <4> [299.836412] CS:  0010 DS:  ES:  CR0: 80050033
> <4> [299.836416] CR2: 00c8 CR3: 000107b80001 CR4:
> 00770ee0
> <4> [299.836418] PKRU: 5554
> <4> [299.836420] Call Trace:
> <4> [299.836422]  
> <4> [299.836423]  i915_ttm_buddy_man_alloc+0x68/0x240 [i915]
> 
> ttm_resource_init() now needs to access the bo->bdev, and also wants
> to
> store the bo reference. Try to keep both working. The mock_bo is a
> hack
> so we can interface directly with the ttm managers alloc() and free()
> hooks for
> our mock testing, without invoking other TTM features like eviction,
> moves, etc.
> 
> v2: make sure we only touch res->bo if the alloc() returns
> successfully
> 
> Closes: https://gitlab.freedesktop.org/drm/intel/-/issues/5123
> Fixes: 0e05fc49c358 ("drm/ttm: add common accounting to the resource
> mgr v3")
> Signed-off-by: Matthew Auld 
> Cc: Christian König 
> Cc: Thomas Hellström 
> Acked-by: Christian König 


Reviewed-by: Thomas Hellström 

> ---
>  drivers/gpu/drm/i915/intel_region_ttm.c | 8 
>  1 file changed, 8 insertions(+)
> 
> diff --git a/drivers/gpu/drm/i915/intel_region_ttm.c
> b/drivers/gpu/drm/i915/intel_region_ttm.c
> index f2b888c16958..7dea07c579aa 100644
> --- a/drivers/gpu/drm/i915/intel_region_ttm.c
> +++ b/drivers/gpu/drm/i915/intel_region_ttm.c
> @@ -200,11 +200,14 @@ intel_region_ttm_resource_alloc(struct
> intel_memory_region *mem,
> int ret;
>  
> mock_bo.base.size = size;
> +   mock_bo.bdev = >i915->bdev;
> place.flags = flags;
>  
> ret = man->func->alloc(man, _bo, , );
> if (ret == -ENOSPC)
> ret = -ENXIO;
> +   if (!ret)
> +   res->bo = NULL; /* Rather blow up, then some uaf */
> return ret ? ERR_PTR(ret) : res;
>  }
>  
> @@ -219,6 +222,11 @@ void intel_region_ttm_resource_free(struct
> intel_memory_region *mem,
>     struct ttm_resource *res)
>  {
> struct ttm_resource_manager *man = mem->region_private;
> +   struct ttm_buffer_object mock_bo = {};
> +
> +   mock_bo.base.size = res->num_pages << PAGE_SHIFT;
> +   mock_bo.bdev = >i915->bdev;
> +   res->bo = _bo;
>  
> man->func->free(man, res);
>  }




Re: [Intel-gfx] [PATCH 1/2] drm/mm: Add an iterator to optimally walk over holes for an allocation (v3)

2022-02-21 Thread Tvrtko Ursulin



On 16/02/2022 10:36, Christian König wrote:

Am 15.02.22 um 23:23 schrieb Vivek Kasireddy:

This iterator relies on drm_mm_first_hole() and drm_mm_next_hole()
functions to identify suitable holes for an allocation of a given
size by efficiently traversing the rbtree associated with the given
allocator.

It replaces the for loop in drm_mm_insert_node_in_range() and can
also be used by drm drivers to quickly identify holes of a certain
size within a given range.

v2: (Tvrtko)
- Prepend a double underscore for the newly exported first/next_hole
- s/each_best_hole/each_suitable_hole/g
- Mask out DRM_MM_INSERT_ONCE from the mode before calling
   first/next_hole and elsewhere.

v3: (Tvrtko)
- Reduce the number of hunks by retaining the "mode" variable name

Cc: Christian König 
Reviewed-by: Tvrtko Ursulin 
Suggested-by: Tvrtko Ursulin 
Signed-off-by: Vivek Kasireddy 


Of hand it looks like it does what the description says without any 
functional change, but I don't know the internals of drm_mm so well either.


Feel free to add an Acked-by: Christian König .


Thanks!

Can we merge this via the Intel tree as one series (one drm core plus 
one i915 patch)? Daniel?


Regards,

Tvrtko


Re: [Intel-gfx] [PATCH v2 1/3] drm/mm: Ensure that the entry is not NULL before extracting rb_node

2022-02-21 Thread Tvrtko Ursulin



On 18/02/2022 03:47, Kasireddy, Vivek wrote:

Hi Tvrtko,



On 17/02/2022 07:50, Vivek Kasireddy wrote:

While looking for next holes suitable for an allocation, although,
it is highly unlikely, make sure that the DECLARE_NEXT_HOLE_ADDR
macro is using a valid node before it extracts the rb_node from it.


Was the need for this just a consequence of insufficient locking in the
i915 patch?

[Kasireddy, Vivek] Partly, yes; but I figured since we are anyway doing
if (!entry || ..), it makes sense to dereference entry and extract the rb_node
after this check.


Unless I am blind I don't see that it makes a difference. 
">rb_hole_addr" is taking an address of, which works "fine" is 
entry is NULL. And does not get past the !entry check for the actual 
de-reference via RB_EMPTY_NODE. With your patch you move that after the 
!entry check but still have it in the RB_EMPTY_NODE macro. Again, unless 
I am blind, I think just drop this patch.


Regards,

Tvrtko



Thanks,
Vivek



Regards,

Tvrtko



Cc: Tvrtko Ursulin 
Cc: Christian König 
Signed-off-by: Vivek Kasireddy 
---
   drivers/gpu/drm/drm_mm.c | 5 +++--
   1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/drm_mm.c b/drivers/gpu/drm/drm_mm.c
index 8257f9d4f619..499d8874e4ed 100644
--- a/drivers/gpu/drm/drm_mm.c
+++ b/drivers/gpu/drm/drm_mm.c
@@ -389,11 +389,12 @@ first_hole(struct drm_mm *mm,
   #define DECLARE_NEXT_HOLE_ADDR(name, first, last)\
   static struct drm_mm_node *name(struct drm_mm_node *entry, u64 size) \
   {\
-   struct rb_node *parent, *node = >rb_hole_addr;\
+   struct rb_node *parent, *node;  \
\
-   if (!entry || RB_EMPTY_NODE(node))  \
+   if (!entry || RB_EMPTY_NODE(>rb_hole_addr))   \
return NULL;\
\
+   node = >rb_hole_addr; \
if (usable_hole_addr(node->first, size)) {   \
node = node->first;  \
while (usable_hole_addr(node->last, size))   \


[Intel-gfx] [PATCH v2] drm/i915/ttm: fixup the mock_bo

2022-02-21 Thread Matthew Auld
When running the mock selftests we currently blow up with:

<6> [299.836278] i915: Running 
i915_gem_huge_page_mock_selftests/igt_mock_memory_region_huge_pages
<1> [299.836356] BUG: kernel NULL pointer dereference, address: 00c8
<1> [299.836361] #PF: supervisor read access in kernel mode
<1> [299.836364] #PF: error_code(0x) - not-present page
<6> [299.836367] PGD 0 P4D 0
<4> [299.836369] Oops:  [#1] PREEMPT SMP NOPTI
<4> [299.836372] CPU: 1 PID: 1429 Comm: i915_selftest Tainted: G U  
  5.17.0-rc4-CI-CI_DRM_11227+ #1
<4> [299.836376] Hardware name: Intel(R) Client Systems NUC11TNHi5/NUC11TNBi5, 
BIOS TNTGL357.0042.2020.1221.1743 12/21/2020
<4> [299.836380] RIP: 0010:ttm_resource_init+0x57/0x90 [ttm]
<4> [299.836392] RSP: 0018:c90001e4f680 EFLAGS: 00010203
<4> [299.836395] RAX:  RBX: c90001e4f708 RCX: 

<4> [299.836398] RDX: 888116172528 RSI: c90001e4f6f8 RDI: 

<4> [299.836401] RBP: c90001e4f6f8 R08: 01b0 R09: 
888116172528
<4> [299.836403] R10: 0001 R11: a4cb2e51 R12: 
c90001e4fa90
<4> [299.836406] R13: 888116172528 R14: 888130d7f4b0 R15: 
888130d7f400
<4> [299.836409] FS:  7ff241684500() GS:88849fe8() 
knlGS:
<4> [299.836412] CS:  0010 DS:  ES:  CR0: 80050033
<4> [299.836416] CR2: 00c8 CR3: 000107b80001 CR4: 
00770ee0
<4> [299.836418] PKRU: 5554
<4> [299.836420] Call Trace:
<4> [299.836422]  
<4> [299.836423]  i915_ttm_buddy_man_alloc+0x68/0x240 [i915]

ttm_resource_init() now needs to access the bo->bdev, and also wants to
store the bo reference. Try to keep both working. The mock_bo is a hack
so we can interface directly with the ttm managers alloc() and free() hooks for
our mock testing, without invoking other TTM features like eviction,
moves, etc.

v2: make sure we only touch res->bo if the alloc() returns successfully

Closes: https://gitlab.freedesktop.org/drm/intel/-/issues/5123
Fixes: 0e05fc49c358 ("drm/ttm: add common accounting to the resource mgr v3")
Signed-off-by: Matthew Auld 
Cc: Christian König 
Cc: Thomas Hellström 
Acked-by: Christian König 
---
 drivers/gpu/drm/i915/intel_region_ttm.c | 8 
 1 file changed, 8 insertions(+)

diff --git a/drivers/gpu/drm/i915/intel_region_ttm.c 
b/drivers/gpu/drm/i915/intel_region_ttm.c
index f2b888c16958..7dea07c579aa 100644
--- a/drivers/gpu/drm/i915/intel_region_ttm.c
+++ b/drivers/gpu/drm/i915/intel_region_ttm.c
@@ -200,11 +200,14 @@ intel_region_ttm_resource_alloc(struct 
intel_memory_region *mem,
int ret;
 
mock_bo.base.size = size;
+   mock_bo.bdev = >i915->bdev;
place.flags = flags;
 
ret = man->func->alloc(man, _bo, , );
if (ret == -ENOSPC)
ret = -ENXIO;
+   if (!ret)
+   res->bo = NULL; /* Rather blow up, then some uaf */
return ret ? ERR_PTR(ret) : res;
 }
 
@@ -219,6 +222,11 @@ void intel_region_ttm_resource_free(struct 
intel_memory_region *mem,
struct ttm_resource *res)
 {
struct ttm_resource_manager *man = mem->region_private;
+   struct ttm_buffer_object mock_bo = {};
+
+   mock_bo.base.size = res->num_pages << PAGE_SHIFT;
+   mock_bo.bdev = >i915->bdev;
+   res->bo = _bo;
 
man->func->free(man, res);
 }
-- 
2.34.1



Re: [Intel-gfx] Enable DisplayPort MST on low cost USB-C docks

2022-02-21 Thread Imre Deak
Hi Matthias,

could you open a ticket at gitlab, providing a dmesg as described at
https://gitlab.freedesktop.org/drm/intel/-/wikis/How-to-file-i915-bugs

Thanks,
Imre

On Sun, Feb 20, 2022 at 03:33:56PM +0100, Matthias Walther wrote:
> Hm, no ideas on this?
> 
> 
> Am 28.01.22 um 20:50 schrieb Matthias Walther:
> > Hello,
> > 
> > there are a lot of quite similar, low cost USB-C docks with multiple
> > display output (usually 2x HDMI + 1x VGA) available on the big online
> > platforms such as Amazon, Ebay, and Aliexpress.
> > 
> > Internally the display outputs are connected via DisplayPort. If you
> > connect a monitor to one of the ports, it's detected as display port
> > connection in xrandr. Always the same dpX in xrandr, independently of
> > which physical port in use. This suggests that all physical outputs are
> > connected to the same DisplayPort output.
> > 
> > On Microsoft's Windows these docks support multi headed output, like a
> > different image on all displays (called expand mode in Windows). However
> > the vendor advertises, that on MacOS the adapter can only display the
> > same image on all ports of the adapter. This might be a hint, that the
> > adapter internally uses DisplayPort's Multi-Stream Transport (MST)
> > technology for the second and third display output (2nd HDMI, VGA), as
> > Apple does not support MST while Microsoft does. Linux behaves just like
> > MacOS here and only mirrors the image.
> > 
> > Linux is supposed to support MST since like around 2014. There are
> > parameters to enable it for i915, e. g. i915.enable_dp_mst={1,2}.
> > 
> > However unfortunately those USB-C docks do not support multi-headed
> > output on Linux. The second monitor is not detected, there is just a
> > mirrored image of the first monitor on monitor two and three.
> > 
> > Does Linux support MST over Thunderbolt 3/4? Is there maybe a hidden
> > command that the Windows driver uses to switch MST on in the dock's
> > chipset?
> > 
> > Any hints on how to debug this would be highly appreciated! Those
> > adapters become more and more popular, they are affordable and it would
> > be awesome to make them fully work with Linux.
> > 
> > Best,
> > Matthias
> > 
> 


Re: [Intel-gfx] [PATCH v2 1/5] drm/i915: Optimize icl+ universal plane programming

2022-02-21 Thread Lisovskiy, Stanislav
On Thu, Feb 10, 2022 at 08:23:59AM +0200, Ville Syrjala wrote:
> From: Ville Syrjälä 
> 
> On icl+ all plane registers are armed by PLANE_SURF, so we can
> move almost everything over into the update_noarm() hook.
> 
> The PLANE_CTL write has to stay in the icl_update_arm() hook though
> as it still exhibits the somewhat annoying self-arming behaviour
> when the plane transitioning from disabled to enabled.
> 
> We could either do a full split for skl+ vs. icl+, or we could try
> some other kind of split where we'd eg. keep most things in the skl+
> functions and call them from the icl+ functions. I think a full split
> is probably the cleaner approach since we've anyway accumulated quite
> a bit of icl+ specific things, so that is what I opted to do.
> 
> Some i915_update_info stats for tgl:
> before: after:
> Updates: 5043   Updates: 5043
>|   |
>1us |   1us |
>|** |***
>4us |** 4us |
>|** |***
>   16us |***   16us |**
>|   |*
>   66us |  66us |
>|   |
>  262us | 262us |
>|   |
>1ms |   1ms |
>|   |
>4ms |   4ms |
>|   |
>   17ms |  17ms |
>|   |
> Min update: 3494ns  Min update: 2983ns
> Max update: 49491ns Max update: 39986ns
> Average update: 18031ns Average update: 13423ns
> Overruns > 100us: 0 Overruns > 100us: 0
> 
> Signed-off-by: Ville Syrjälä 

Reviewed-by: Stanislav Lisovskiy 

> ---
>  .../drm/i915/display/skl_universal_plane.c| 195 ++
>  1 file changed, 155 insertions(+), 40 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/display/skl_universal_plane.c 
> b/drivers/gpu/drm/i915/display/skl_universal_plane.c
> index 1223075595ff..5b1b089e045d 100644
> --- a/drivers/gpu/drm/i915/display/skl_universal_plane.c
> +++ b/drivers/gpu/drm/i915/display/skl_universal_plane.c
> @@ -619,6 +619,25 @@ skl_plane_disable_arm(struct intel_plane *plane,
>  
>   spin_lock_irqsave(_priv->uncore.lock, irqflags);
>  
> + skl_write_plane_wm(plane, crtc_state);
> +
> + intel_de_write_fw(dev_priv, PLANE_CTL(pipe, plane_id), 0);
> + intel_de_write_fw(dev_priv, PLANE_SURF(pipe, plane_id), 0);
> +
> + spin_unlock_irqrestore(_priv->uncore.lock, irqflags);
> +}
> +
> +static void
> +icl_plane_disable_arm(struct intel_plane *plane,
> +   const struct intel_crtc_state *crtc_state)
> +{
> + struct drm_i915_private *dev_priv = to_i915(plane->base.dev);
> + enum plane_id plane_id = plane->id;
> + enum pipe pipe = plane->pipe;
> + unsigned long irqflags;
> +
> + spin_lock_irqsave(_priv->uncore.lock, irqflags);
> +
>   if (icl_is_hdr_plane(dev_priv, plane_id))
>   intel_de_write_fw(dev_priv, PLANE_CUS_CTL(pipe, plane_id), 0);
>  
> @@ -1065,7 +1084,7 @@ static void icl_plane_csc_load_black(struct intel_plane 
> *plane)
>   intel_de_write_fw(i915, PLANE_CSC_POSTOFF(pipe, plane_id, 2), 0);
>  }
>  
> -static int skl_plane_color_plane(const struct intel_plane_state *plane_state)
> +static int icl_plane_color_plane(const struct intel_plane_state *plane_state)
>  {
>   /* Program the UV plane on planar master */
>   if (plane_state->planar_linked_plane && !plane_state->planar_slave)
> @@ -1082,9 +1101,7 @@ skl_plane_update_noarm(struct intel_plane *plane,
>   struct drm_i915_private *dev_priv = to_i915(plane->base.dev);
>   enum plane_id plane_id = plane->id;
>   enum pipe pipe = plane->pipe;
> - int color_plane = skl_plane_color_plane(plane_state);
> - u32 stride = skl_plane_stride(plane_state, color_plane);
> - const struct drm_framebuffer *fb = plane_state->hw.fb;
> + u32 stride = skl_plane_stride(plane_state, 0);
>   int crtc_x = plane_state->uapi.dst.x1;
>   int crtc_y = plane_state->uapi.dst.y1;
>   u32 src_w = drm_rect_width(_state->uapi.src) >> 16;
> @@ -1099,12 +1116,109 @@ skl_plane_update_noarm(struct intel_plane *plane,
>  
>   spin_lock_irqsave(_priv->uncore.lock, irqflags);
>  
> + intel_de_write_fw(dev_priv, PLANE_STRIDE(pipe, plane_id),
> +   PLANE_STRIDE_(stride));
> + intel_de_write_fw(dev_priv, PLANE_POS(pipe, plane_id),
> +   PLANE_POS_Y(crtc_y) | PLANE_POS_X(crtc_x));
> + intel_de_write_fw(dev_priv, PLANE_SIZE(pipe, plane_id),
> +   PLANE_HEIGHT(src_h - 1) | PLANE_WIDTH(src_w - 

Re: [Intel-gfx] [PATCH v2 4/5] drm/i915: Make most pre-skl primary plane registers unlocked

2022-02-21 Thread Lisovskiy, Stanislav
On Thu, Feb 10, 2022 at 08:24:02AM +0200, Ville Syrjala wrote:
> From: Ville Syrjälä 
> 
> Drop the locks around most primary plane register writes.
> The lock isn't needed since each plane's register are neatly
> contained on their own cachelines.
> 
> The one exception we have to make is DSPADDR/DSPSURF which is
> (ab)used to also trigger FBC nukes on pre-snb (since the
> hardware doesn't seem to have any dedicated mechanism to
> trigger nukes). So we need to keep the lock around it to
> protect against the rmw performed by the fbc code.
> 
> Signed-off-by: Ville Syrjälä 

Reviewed-by: Stanislav Lisovskiy 

> ---
>  drivers/gpu/drm/i915/display/i9xx_plane.c | 24 +--
>  1 file changed, 9 insertions(+), 15 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/display/i9xx_plane.c 
> b/drivers/gpu/drm/i915/display/i9xx_plane.c
> index a87b65cd41fd..af190bacdd97 100644
> --- a/drivers/gpu/drm/i915/display/i9xx_plane.c
> +++ b/drivers/gpu/drm/i915/display/i9xx_plane.c
> @@ -418,9 +418,6 @@ static void i9xx_plane_update_noarm(struct intel_plane 
> *plane,
>  {
>   struct drm_i915_private *dev_priv = to_i915(plane->base.dev);
>   enum i9xx_plane_id i9xx_plane = plane->i9xx_plane;
> - unsigned long irqflags;
> -
> - spin_lock_irqsave(_priv->uncore.lock, irqflags);
>  
>   intel_de_write_fw(dev_priv, DSPSTRIDE(i9xx_plane),
> plane_state->view.color_plane[0].mapping_stride);
> @@ -441,8 +438,6 @@ static void i9xx_plane_update_noarm(struct intel_plane 
> *plane,
>   intel_de_write_fw(dev_priv, DSPSIZE(i9xx_plane),
> DISP_HEIGHT(crtc_h - 1) | DISP_WIDTH(crtc_w - 
> 1));
>   }
> -
> - spin_unlock_irqrestore(_priv->uncore.lock, irqflags);
>  }
>  
>  static void i9xx_plane_update_arm(struct intel_plane *plane,
> @@ -465,8 +460,6 @@ static void i9xx_plane_update_arm(struct intel_plane 
> *plane,
>   else
>   dspaddr_offset = linear_offset;
>  
> - spin_lock_irqsave(_priv->uncore.lock, irqflags);
> -
>   if (IS_CHERRYVIEW(dev_priv) && i9xx_plane == PLANE_B) {
>   int crtc_x = plane_state->uapi.dst.x1;
>   int crtc_y = plane_state->uapi.dst.y1;
> @@ -496,13 +489,15 @@ static void i9xx_plane_update_arm(struct intel_plane 
> *plane,
>* the control register just before the surface register.
>*/
>   intel_de_write_fw(dev_priv, DSPCNTR(i9xx_plane), dspcntr);
> +
> + /* lock to protect against rmw in fbc nuke */
> + spin_lock_irqsave(_priv->uncore.lock, irqflags);
>   if (DISPLAY_VER(dev_priv) >= 4)
>   intel_de_write_fw(dev_priv, DSPSURF(i9xx_plane),
> intel_plane_ggtt_offset(plane_state) + 
> dspaddr_offset);
>   else
>   intel_de_write_fw(dev_priv, DSPADDR(i9xx_plane),
> intel_plane_ggtt_offset(plane_state) + 
> dspaddr_offset);
> -
>   spin_unlock_irqrestore(_priv->uncore.lock, irqflags);
>  }
>  
> @@ -540,14 +535,14 @@ static void i9xx_plane_disable_arm(struct intel_plane 
> *plane,
>*/
>   dspcntr = i9xx_plane_ctl_crtc(crtc_state);
>  
> - spin_lock_irqsave(_priv->uncore.lock, irqflags);
> -
>   intel_de_write_fw(dev_priv, DSPCNTR(i9xx_plane), dspcntr);
> +
> + /* lock to protect against rmw in fbc nuke */
> + spin_lock_irqsave(_priv->uncore.lock, irqflags);
>   if (DISPLAY_VER(dev_priv) >= 4)
>   intel_de_write_fw(dev_priv, DSPSURF(i9xx_plane), 0);
>   else
>   intel_de_write_fw(dev_priv, DSPADDR(i9xx_plane), 0);
> -
>   spin_unlock_irqrestore(_priv->uncore.lock, irqflags);
>  }
>  
> @@ -566,8 +561,10 @@ g4x_primary_async_flip(struct intel_plane *plane,
>   if (async_flip)
>   dspcntr |= DISP_ASYNC_FLIP;
>  
> - spin_lock_irqsave(_priv->uncore.lock, irqflags);
>   intel_de_write_fw(dev_priv, DSPCNTR(i9xx_plane), dspcntr);
> +
> + /* lock to protect against rmw in fbc nuke */
> + spin_lock_irqsave(_priv->uncore.lock, irqflags);
>   intel_de_write_fw(dev_priv, DSPSURF(i9xx_plane),
> intel_plane_ggtt_offset(plane_state) + 
> dspaddr_offset);
>   spin_unlock_irqrestore(_priv->uncore.lock, irqflags);
> @@ -582,12 +579,9 @@ vlv_primary_async_flip(struct intel_plane *plane,
>   struct drm_i915_private *dev_priv = to_i915(plane->base.dev);
>   u32 dspaddr_offset = plane_state->view.color_plane[0].offset;
>   enum i9xx_plane_id i9xx_plane = plane->i9xx_plane;
> - unsigned long irqflags;
>  
> - spin_lock_irqsave(_priv->uncore.lock, irqflags);
>   intel_de_write_fw(dev_priv, DSPADDR_VLV(i9xx_plane),
> intel_plane_ggtt_offset(plane_state) + 
> dspaddr_offset);
> - spin_unlock_irqrestore(_priv->uncore.lock, irqflags);
>  }
>  
>  static void
> -- 
> 2.34.1
> 


Re: [Intel-gfx] [PATCH v2 5/5] drm/i915: Make pre-skl sprite plane registers unlocked

2022-02-21 Thread Lisovskiy, Stanislav
On Thu, Feb 10, 2022 at 08:24:03AM +0200, Ville Syrjala wrote:
> From: Ville Syrjälä 
> 
> Drop the locks around sprite plane register writes. The
> lock isn't needed since each plane's register are neatly
> contained on their own cachelines.
> 
> Signed-off-by: Ville Syrjälä 

Reviewed-by: Stanislav Lisovskiy 

> ---
>  drivers/gpu/drm/i915/display/intel_sprite.c | 45 -
>  1 file changed, 45 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/display/intel_sprite.c 
> b/drivers/gpu/drm/i915/display/intel_sprite.c
> index 2d71294aaceb..f6875a49b8cb 100644
> --- a/drivers/gpu/drm/i915/display/intel_sprite.c
> +++ b/drivers/gpu/drm/i915/display/intel_sprite.c
> @@ -430,9 +430,6 @@ vlv_sprite_update_noarm(struct intel_plane *plane,
>   int crtc_y = plane_state->uapi.dst.y1;
>   u32 crtc_w = drm_rect_width(_state->uapi.dst);
>   u32 crtc_h = drm_rect_height(_state->uapi.dst);
> - unsigned long irqflags;
> -
> - spin_lock_irqsave(_priv->uncore.lock, irqflags);
>  
>   intel_de_write_fw(dev_priv, SPSTRIDE(pipe, plane_id),
> plane_state->view.color_plane[0].mapping_stride);
> @@ -440,8 +437,6 @@ vlv_sprite_update_noarm(struct intel_plane *plane,
> SP_POS_Y(crtc_y) | SP_POS_X(crtc_x));
>   intel_de_write_fw(dev_priv, SPSIZE(pipe, plane_id),
> SP_HEIGHT(crtc_h - 1) | SP_WIDTH(crtc_w - 1));
> -
> - spin_unlock_irqrestore(_priv->uncore.lock, irqflags);
>  }
>  
>  static void
> @@ -457,14 +452,11 @@ vlv_sprite_update_arm(struct intel_plane *plane,
>   u32 x = plane_state->view.color_plane[0].x;
>   u32 y = plane_state->view.color_plane[0].y;
>   u32 sprctl, linear_offset;
> - unsigned long irqflags;
>  
>   sprctl = plane_state->ctl | vlv_sprite_ctl_crtc(crtc_state);
>  
>   linear_offset = intel_fb_xy_to_linear(x, y, plane_state, 0);
>  
> - spin_lock_irqsave(_priv->uncore.lock, irqflags);
> -
>   if (IS_CHERRYVIEW(dev_priv) && pipe == PIPE_B)
>   chv_sprite_update_csc(plane_state);
>  
> @@ -494,8 +486,6 @@ vlv_sprite_update_arm(struct intel_plane *plane,
>  
>   vlv_sprite_update_clrc(plane_state);
>   vlv_sprite_update_gamma(plane_state);
> -
> - spin_unlock_irqrestore(_priv->uncore.lock, irqflags);
>  }
>  
>  static void
> @@ -505,14 +495,9 @@ vlv_sprite_disable_arm(struct intel_plane *plane,
>   struct drm_i915_private *dev_priv = to_i915(plane->base.dev);
>   enum pipe pipe = plane->pipe;
>   enum plane_id plane_id = plane->id;
> - unsigned long irqflags;
> -
> - spin_lock_irqsave(_priv->uncore.lock, irqflags);
>  
>   intel_de_write_fw(dev_priv, SPCNTR(pipe, plane_id), 0);
>   intel_de_write_fw(dev_priv, SPSURF(pipe, plane_id), 0);
> -
> - spin_unlock_irqrestore(_priv->uncore.lock, irqflags);
>  }
>  
>  static bool
> @@ -862,15 +847,12 @@ ivb_sprite_update_noarm(struct intel_plane *plane,
>   u32 src_w = drm_rect_width(_state->uapi.src) >> 16;
>   u32 src_h = drm_rect_height(_state->uapi.src) >> 16;
>   u32 sprscale = 0;
> - unsigned long irqflags;
>  
>   if (crtc_w != src_w || crtc_h != src_h)
>   sprscale = SPRITE_SCALE_ENABLE |
>   SPRITE_SRC_WIDTH(src_w - 1) |
>   SPRITE_SRC_HEIGHT(src_h - 1);
>  
> - spin_lock_irqsave(_priv->uncore.lock, irqflags);
> -
>   intel_de_write_fw(dev_priv, SPRSTRIDE(pipe),
> plane_state->view.color_plane[0].mapping_stride);
>   intel_de_write_fw(dev_priv, SPRPOS(pipe),
> @@ -879,8 +861,6 @@ ivb_sprite_update_noarm(struct intel_plane *plane,
> SPRITE_HEIGHT(crtc_h - 1) | SPRITE_WIDTH(crtc_w - 1));
>   if (IS_IVYBRIDGE(dev_priv))
>   intel_de_write_fw(dev_priv, SPRSCALE(pipe), sprscale);
> -
> - spin_unlock_irqrestore(_priv->uncore.lock, irqflags);
>  }
>  
>  static void
> @@ -895,14 +875,11 @@ ivb_sprite_update_arm(struct intel_plane *plane,
>   u32 x = plane_state->view.color_plane[0].x;
>   u32 y = plane_state->view.color_plane[0].y;
>   u32 sprctl, linear_offset;
> - unsigned long irqflags;
>  
>   sprctl = plane_state->ctl | ivb_sprite_ctl_crtc(crtc_state);
>  
>   linear_offset = intel_fb_xy_to_linear(x, y, plane_state, 0);
>  
> - spin_lock_irqsave(_priv->uncore.lock, irqflags);
> -
>   if (key->flags) {
>   intel_de_write_fw(dev_priv, SPRKEYVAL(pipe), key->min_value);
>   intel_de_write_fw(dev_priv, SPRKEYMSK(pipe),
> @@ -931,8 +908,6 @@ ivb_sprite_update_arm(struct intel_plane *plane,
> intel_plane_ggtt_offset(plane_state) + 
> sprsurf_offset);
>  
>   ivb_sprite_update_gamma(plane_state);
> -
> - spin_unlock_irqrestore(_priv->uncore.lock, irqflags);
>  }
>  
>  static void
> @@ -941,17 +916,12 @@ ivb_sprite_disable_arm(struct intel_plane *plane,
>  {
>   struct drm_i915_private *dev_priv = to_i915(plane->base.dev);
> 

Re: [Intel-gfx] [PATCH 6/7] drm: Document fdinfo format specification

2022-02-21 Thread Tvrtko Ursulin



Hi Rob,

On 25/01/2022 10:24, Tvrtko Ursulin wrote:


On 21/01/2022 11:50, Tvrtko Ursulin wrote:

On 20/01/2022 16:44, Rob Clark wrote:


[snip]


If there is a tool somewhere that displays this info, that would be
useful for testing my implementation.


I have a patch to Intel specific intel_gpu_top (see 
https://patchwork.freedesktop.org/patch/468491/?series=98555=1). 
I'll have a look to see how much work would it be to extract common 
bits into a library and write a quick agnostic tool using it.


I factored out some code from intel_gpu_top in a quick and dirty attempt 
to make it generic and made a very rudimentary tools/gputop:


https://cgit.freedesktop.org/~tursulin/intel-gpu-tools/log/?h=gputop


Have you managed to spend any time playing with this yet?

The only remaining open was Daniel's mild concern if vendor agnostic 
userspace is possible using the proposed spec. If you managed to wire up 
the compliant exports and gputop tool works I think that concern would 
be settled.


Regards,

Tvrtko


Re: [Intel-gfx] [PATCH v3 5/6] drm/i915: Extract icl_qgv_points_mask()

2022-02-21 Thread Lisovskiy, Stanislav
On Fri, Feb 18, 2022 at 08:40:38AM +0200, Ville Syrjala wrote:
> From: Ville Syrjälä 
> 
> Declutter intel_bw_atomic_check() a bit by pulling
> the max QGV mask calculation out.
> 
> Signed-off-by: Ville Syrjälä 

Reviewed-by: Stanislav Lisovskiy 

> ---
>  drivers/gpu/drm/i915/display/intel_bw.c | 35 -
>  1 file changed, 22 insertions(+), 13 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/display/intel_bw.c 
> b/drivers/gpu/drm/i915/display/intel_bw.c
> index 1fd1d2182d8f..6637da75f878 100644
> --- a/drivers/gpu/drm/i915/display/intel_bw.c
> +++ b/drivers/gpu/drm/i915/display/intel_bw.c
> @@ -816,6 +816,26 @@ int intel_bw_calc_min_cdclk(struct intel_atomic_state 
> *state)
>   return 0;
>  }
>  
> +static u16 icl_qgv_points_mask(struct drm_i915_private *i915)
> +{
> + unsigned int num_psf_gv_points = i915->max_bw[0].num_psf_gv_points;
> + unsigned int num_qgv_points = i915->max_bw[0].num_qgv_points;
> + u16 mask = 0;
> +
> + /*
> +  * We can _not_ use the whole ADLS_QGV_PT_MASK here, as PCode rejects
> +  * it with failure if we try masking any unadvertised points.
> +  * So need to operate only with those returned from PCode.
> +  */
> + if (num_qgv_points > 0)
> + mask |= REG_GENMASK(num_qgv_points - 1, 0);
> +
> + if (num_psf_gv_points > 0)
> + mask |= REG_GENMASK(num_psf_gv_points - 1, 0) << 
> ADLS_PSF_PT_SHIFT;
> +
> + return mask;
> +}
> +
>  int intel_bw_atomic_check(struct intel_atomic_state *state)
>  {
>   struct drm_i915_private *dev_priv = to_i915(state->base.dev);
> @@ -831,23 +851,11 @@ int intel_bw_atomic_check(struct intel_atomic_state 
> *state)
>   unsigned int num_qgv_points = dev_priv->max_bw[0].num_qgv_points;
>   unsigned int num_psf_gv_points = dev_priv->max_bw[0].num_psf_gv_points;
>   bool changed = false;
> - u32 mask = 0;
>  
>   /* FIXME earlier gens need some checks too */
>   if (DISPLAY_VER(dev_priv) < 11)
>   return 0;
>  
> - /*
> -  * We can _not_ use the whole ADLS_QGV_PT_MASK here, as PCode rejects
> -  * it with failure if we try masking any unadvertised points.
> -  * So need to operate only with those returned from PCode.
> -  */
> - if (num_qgv_points > 0)
> - mask |= REG_GENMASK(num_qgv_points - 1, 0);
> -
> - if (num_psf_gv_points > 0)
> - mask |= REG_GENMASK(num_psf_gv_points - 1, 0) << 
> ADLS_PSF_PT_SHIFT;
> -
>   for_each_oldnew_intel_crtc_in_state(state, crtc, old_crtc_state,
>   new_crtc_state, i) {
>   unsigned int old_data_rate =
> @@ -979,7 +987,8 @@ int intel_bw_atomic_check(struct intel_atomic_state 
> *state)
>* We store the ones which need to be masked as that is what PCode
>* actually accepts as a parameter.
>*/
> - new_bw_state->qgv_points_mask = ~allowed_points & mask;
> + new_bw_state->qgv_points_mask = ~allowed_points &
> + icl_qgv_points_mask(dev_priv);
>  
>   /*
>* If the actual mask had changed we need to make sure that
> -- 
> 2.34.1
> 


Re: [Intel-gfx] [CI 1/4] drm/i915/dsi: disassociate VBT video transfer mode from register values

2022-02-21 Thread Jani Nikula
On Fri, 18 Feb 2022, Jani Nikula  wrote:
> The VBT DSI video transfer mode field values have been defined in terms
> of the VLV MIPI_VIDEO_MODE_FORMAT register. The ICL DSI code maps that
> to ICL DSI_TRANS_FUNC_CONF() register. The values are the same, though
> the shift is different.
>
> Make a clean break and disassociate the values from each other. Assume
> the values can be different, and translate the VBT value to VLV and ICL
> register values as needed. Use the existing macros from intel_bios.h.
>
> This will be useful in splitting the DSI register macros to files by DSI
> implementation.
>
> Cc: Matt Roper 
> Reviewed-by: Matt Roper 
> Signed-off-by: Jani Nikula 

Thanks for the review, pushed to din.

BR,
Jani.

> ---
>  drivers/gpu/drm/i915/display/icl_dsi.c   | 11 +++
>  drivers/gpu/drm/i915/display/intel_dsi.h |  4 +--
>  drivers/gpu/drm/i915/display/intel_dsi_vbt.c | 10 +++---
>  drivers/gpu/drm/i915/display/vlv_dsi.c   | 33 
>  4 files changed, 39 insertions(+), 19 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/display/icl_dsi.c 
> b/drivers/gpu/drm/i915/display/icl_dsi.c
> index 2d5bb9195b20..479d5e1165d9 100644
> --- a/drivers/gpu/drm/i915/display/icl_dsi.c
> +++ b/drivers/gpu/drm/i915/display/icl_dsi.c
> @@ -788,14 +788,14 @@ gen11_dsi_configure_transcoder(struct intel_encoder 
> *encoder,
>   /* program DSI operation mode */
>   if (is_vid_mode(intel_dsi)) {
>   tmp &= ~OP_MODE_MASK;
> - switch (intel_dsi->video_mode_format) {
> + switch (intel_dsi->video_mode) {
>   default:
> - MISSING_CASE(intel_dsi->video_mode_format);
> + MISSING_CASE(intel_dsi->video_mode);
>   fallthrough;
> - case VIDEO_MODE_NON_BURST_WITH_SYNC_EVENTS:
> + case NON_BURST_SYNC_EVENTS:
>   tmp |= VIDEO_MODE_SYNC_EVENT;
>   break;
> - case VIDEO_MODE_NON_BURST_WITH_SYNC_PULSE:
> + case NON_BURST_SYNC_PULSE:
>   tmp |= VIDEO_MODE_SYNC_PULSE;
>   break;
>   }
> @@ -960,8 +960,7 @@ gen11_dsi_set_transcoder_timings(struct intel_encoder 
> *encoder,
>  
>   /* TRANS_HSYNC register to be programmed only for video mode */
>   if (is_vid_mode(intel_dsi)) {
> - if (intel_dsi->video_mode_format ==
> - VIDEO_MODE_NON_BURST_WITH_SYNC_PULSE) {
> + if (intel_dsi->video_mode == NON_BURST_SYNC_PULSE) {
>   /* BSPEC: hsync size should be atleast 16 pixels */
>   if (hsync_size < 16)
>   drm_err(_priv->drm,
> diff --git a/drivers/gpu/drm/i915/display/intel_dsi.h 
> b/drivers/gpu/drm/i915/display/intel_dsi.h
> index a3a906cb097e..eafef0a87fea 100644
> --- a/drivers/gpu/drm/i915/display/intel_dsi.h
> +++ b/drivers/gpu/drm/i915/display/intel_dsi.h
> @@ -79,8 +79,8 @@ struct intel_dsi {
>*/
>   enum mipi_dsi_pixel_format pixel_format;
>  
> - /* video mode format for MIPI_VIDEO_MODE_FORMAT register */
> - u32 video_mode_format;
> + /* NON_BURST_SYNC_PULSE, NON_BURST_SYNC_EVENTS, or BURST_MODE */
> + int video_mode;
>  
>   /* eot for MIPI_EOT_DISABLE register */
>   u8 eotp_pkt;
> diff --git a/drivers/gpu/drm/i915/display/intel_dsi_vbt.c 
> b/drivers/gpu/drm/i915/display/intel_dsi_vbt.c
> index a85574c413e8..a1cd86e53e21 100644
> --- a/drivers/gpu/drm/i915/display/intel_dsi_vbt.c
> +++ b/drivers/gpu/drm/i915/display/intel_dsi_vbt.c
> @@ -675,11 +675,11 @@ void intel_dsi_log_params(struct intel_dsi *intel_dsi)
>   drm_dbg_kms(>drm, "Lane count %d\n", intel_dsi->lane_count);
>   drm_dbg_kms(>drm, "DPHY param reg 0x%x\n", intel_dsi->dphy_reg);
>   drm_dbg_kms(>drm, "Video mode format %s\n",
> - intel_dsi->video_mode_format == 
> VIDEO_MODE_NON_BURST_WITH_SYNC_PULSE ?
> + intel_dsi->video_mode == NON_BURST_SYNC_PULSE ?
>   "non-burst with sync pulse" :
> - intel_dsi->video_mode_format == 
> VIDEO_MODE_NON_BURST_WITH_SYNC_EVENTS ?
> + intel_dsi->video_mode == NON_BURST_SYNC_EVENTS ?
>   "non-burst with sync events" :
> - intel_dsi->video_mode_format == VIDEO_MODE_BURST ?
> + intel_dsi->video_mode == BURST_MODE ?
>   "burst" : "");
>   drm_dbg_kms(>drm, "Burst mode ratio %d\n",
>   intel_dsi->burst_mode_ratio);
> @@ -739,7 +739,7 @@ bool intel_dsi_vbt_init(struct intel_dsi *intel_dsi, u16 
> panel_id)
>   intel_dsi->dual_link = mipi_config->dual_link;
>   intel_dsi->pixel_overlap = mipi_config->pixel_overlap;
>   intel_dsi->operation_mode = mipi_config->is_cmd_mode;
> - 

[Intel-gfx] [PATCH 4/4] drm/i915: Relocate a few more pch transcoder bits

2022-02-21 Thread Ville Syrjala
From: Ville Syrjälä 

Move intel_crtc_pch_transcoder() and has_pch_trancoder() to a
more appropritate place (intel_pch_display.c).

Signed-off-by: Ville Syrjälä 
---
 drivers/gpu/drm/i915/display/intel_display.c  | 19 +--
 drivers/gpu/drm/i915/display/intel_display.h  |  1 -
 drivers/gpu/drm/i915/display/intel_dp.c   |  1 +
 .../gpu/drm/i915/display/intel_pch_display.c  | 17 +
 .../gpu/drm/i915/display/intel_pch_display.h  |  7 +++
 5 files changed, 26 insertions(+), 19 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_display.c 
b/drivers/gpu/drm/i915/display/intel_display.c
index 7f0ba41ad35b..0e6310aa2e10 100644
--- a/drivers/gpu/drm/i915/display/intel_display.c
+++ b/drivers/gpu/drm/i915/display/intel_display.c
@@ -514,16 +514,6 @@ void vlv_wait_port_ready(struct drm_i915_private *dev_priv,
 expected_mask);
 }
 
-enum pipe intel_crtc_pch_transcoder(struct intel_crtc *crtc)
-{
-   struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
-
-   if (HAS_PCH_LPT(dev_priv))
-   return PIPE_A;
-   else
-   return crtc->pipe;
-}
-
 void intel_enable_transcoder(const struct intel_crtc_state *new_crtc_state)
 {
struct intel_crtc *crtc = to_intel_crtc(new_crtc_state->uapi.crtc);
@@ -9815,13 +9805,6 @@ static struct intel_connector 
*intel_encoder_find_connector(struct intel_encoder
return NULL;
 }
 
-static bool has_pch_trancoder(struct drm_i915_private *dev_priv,
- enum pipe pch_transcoder)
-{
-   return HAS_PCH_IBX(dev_priv) || HAS_PCH_CPT(dev_priv) ||
-   (HAS_PCH_LPT_H(dev_priv) && pch_transcoder == PIPE_A);
-}
-
 static void intel_sanitize_crtc(struct intel_crtc *crtc,
struct drm_modeset_acquire_ctx *ctx)
 {
@@ -9876,7 +9859,7 @@ static void intel_sanitize_crtc(struct intel_crtc *crtc,
 * PCH transcoders B and C would prevent enabling the south
 * error interrupt (see cpt_can_enable_serr_int()).
 */
-   if (has_pch_trancoder(dev_priv, crtc->pipe))
+   if (intel_has_pch_trancoder(dev_priv, crtc->pipe))
crtc->pch_fifo_underrun_disabled = true;
}
 }
diff --git a/drivers/gpu/drm/i915/display/intel_display.h 
b/drivers/gpu/drm/i915/display/intel_display.h
index 11d6134c53c8..8513703086b7 100644
--- a/drivers/gpu/drm/i915/display/intel_display.h
+++ b/drivers/gpu/drm/i915/display/intel_display.h
@@ -565,7 +565,6 @@ void intel_enable_transcoder(const struct intel_crtc_state 
*new_crtc_state);
 void intel_disable_transcoder(const struct intel_crtc_state *old_crtc_state);
 void i830_enable_pipe(struct drm_i915_private *dev_priv, enum pipe pipe);
 void i830_disable_pipe(struct drm_i915_private *dev_priv, enum pipe pipe);
-enum pipe intel_crtc_pch_transcoder(struct intel_crtc *crtc);
 int vlv_get_hpll_vco(struct drm_i915_private *dev_priv);
 int vlv_get_cck_clock(struct drm_i915_private *dev_priv,
  const char *name, u32 reg, int ref_freq);
diff --git a/drivers/gpu/drm/i915/display/intel_dp.c 
b/drivers/gpu/drm/i915/display/intel_dp.c
index 1046e7fe310a..f93878011cad 100644
--- a/drivers/gpu/drm/i915/display/intel_dp.c
+++ b/drivers/gpu/drm/i915/display/intel_dp.c
@@ -67,6 +67,7 @@
 #include "intel_lspcon.h"
 #include "intel_lvds.h"
 #include "intel_panel.h"
+#include "intel_pch_display.h"
 #include "intel_pps.h"
 #include "intel_psr.h"
 #include "intel_tc.h"
diff --git a/drivers/gpu/drm/i915/display/intel_pch_display.c 
b/drivers/gpu/drm/i915/display/intel_pch_display.c
index 43e717f4f8e7..837152dca063 100644
--- a/drivers/gpu/drm/i915/display/intel_pch_display.c
+++ b/drivers/gpu/drm/i915/display/intel_pch_display.c
@@ -14,6 +14,23 @@
 #include "intel_pps.h"
 #include "intel_sdvo.h"
 
+bool intel_has_pch_trancoder(struct drm_i915_private *i915,
+enum pipe pch_transcoder)
+{
+   return HAS_PCH_IBX(i915) || HAS_PCH_CPT(i915) ||
+   (HAS_PCH_LPT_H(i915) && pch_transcoder == PIPE_A);
+}
+
+enum pipe intel_crtc_pch_transcoder(struct intel_crtc *crtc)
+{
+   struct drm_i915_private *i915 = to_i915(crtc->base.dev);
+
+   if (HAS_PCH_LPT(i915))
+   return PIPE_A;
+   else
+   return crtc->pipe;
+}
+
 static void assert_pch_dp_disabled(struct drm_i915_private *dev_priv,
   enum pipe pipe, enum port port,
   i915_reg_t dp_reg)
diff --git a/drivers/gpu/drm/i915/display/intel_pch_display.h 
b/drivers/gpu/drm/i915/display/intel_pch_display.h
index 4ef033bb5807..41a63413cb3d 100644
--- a/drivers/gpu/drm/i915/display/intel_pch_display.h
+++ b/drivers/gpu/drm/i915/display/intel_pch_display.h
@@ -6,12 +6,19 @@
 #ifndef _INTEL_PCH_DISPLAY_H_
 #define _INTEL_PCH_DISPLAY_H_
 
+#include 
+
+enum pipe;
 struct drm_i915_private;
 struct intel_atomic_state;
 struct 

[Intel-gfx] [PATCH 3/4] drm/i915: Relocate ibx pch port sanitation code

2022-02-21 Thread Ville Syrjala
From: Ville Syrjälä 

Move the ibx pch port sanitation code into intel_pch_display.c
where it now belongs.

Signed-off-by: Ville Syrjälä 
---
 drivers/gpu/drm/i915/display/intel_display.c  | 63 +
 .../gpu/drm/i915/display/intel_pch_display.c  | 67 +++
 .../gpu/drm/i915/display/intel_pch_display.h  |  3 +
 3 files changed, 71 insertions(+), 62 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_display.c 
b/drivers/gpu/drm/i915/display/intel_display.c
index 656c8319e546..7f0ba41ad35b 100644
--- a/drivers/gpu/drm/i915/display/intel_display.c
+++ b/drivers/gpu/drm/i915/display/intel_display.c
@@ -10249,66 +10249,6 @@ static void intel_early_display_was(struct 
drm_i915_private *dev_priv)
}
 }
 
-static void ibx_sanitize_pch_hdmi_port(struct drm_i915_private *dev_priv,
-  enum port port, i915_reg_t hdmi_reg)
-{
-   u32 val = intel_de_read(dev_priv, hdmi_reg);
-
-   if (val & SDVO_ENABLE ||
-   (val & SDVO_PIPE_SEL_MASK) == SDVO_PIPE_SEL(PIPE_A))
-   return;
-
-   drm_dbg_kms(_priv->drm,
-   "Sanitizing transcoder select for HDMI %c\n",
-   port_name(port));
-
-   val &= ~SDVO_PIPE_SEL_MASK;
-   val |= SDVO_PIPE_SEL(PIPE_A);
-
-   intel_de_write(dev_priv, hdmi_reg, val);
-}
-
-static void ibx_sanitize_pch_dp_port(struct drm_i915_private *dev_priv,
-enum port port, i915_reg_t dp_reg)
-{
-   u32 val = intel_de_read(dev_priv, dp_reg);
-
-   if (val & DP_PORT_EN ||
-   (val & DP_PIPE_SEL_MASK) == DP_PIPE_SEL(PIPE_A))
-   return;
-
-   drm_dbg_kms(_priv->drm,
-   "Sanitizing transcoder select for DP %c\n",
-   port_name(port));
-
-   val &= ~DP_PIPE_SEL_MASK;
-   val |= DP_PIPE_SEL(PIPE_A);
-
-   intel_de_write(dev_priv, dp_reg, val);
-}
-
-static void ibx_sanitize_pch_ports(struct drm_i915_private *dev_priv)
-{
-   /*
-* The BIOS may select transcoder B on some of the PCH
-* ports even it doesn't enable the port. This would trip
-* assert_pch_dp_disabled() and assert_pch_hdmi_disabled().
-* Sanitize the transcoder select bits to prevent that. We
-* assume that the BIOS never actually enabled the port,
-* because if it did we'd actually have to toggle the port
-* on and back off to make the transcoder A select stick
-* (see. intel_dp_link_down(), intel_disable_hdmi(),
-* intel_disable_sdvo()).
-*/
-   ibx_sanitize_pch_dp_port(dev_priv, PORT_B, PCH_DP_B);
-   ibx_sanitize_pch_dp_port(dev_priv, PORT_C, PCH_DP_C);
-   ibx_sanitize_pch_dp_port(dev_priv, PORT_D, PCH_DP_D);
-
-   /* PCH SDVOB multiplex with HDMIB */
-   ibx_sanitize_pch_hdmi_port(dev_priv, PORT_B, PCH_HDMIB);
-   ibx_sanitize_pch_hdmi_port(dev_priv, PORT_C, PCH_HDMIC);
-   ibx_sanitize_pch_hdmi_port(dev_priv, PORT_D, PCH_HDMID);
-}
 
 /* Scan out the current hw modeset state,
  * and sanitizes it to the current state
@@ -10330,8 +10270,7 @@ intel_modeset_setup_hw_state(struct drm_device *dev,
/* HW state is read out, now we need to sanitize this mess. */
get_encoder_power_domains(dev_priv);
 
-   if (HAS_PCH_IBX(dev_priv))
-   ibx_sanitize_pch_ports(dev_priv);
+   intel_pch_sanitize(dev_priv);
 
/*
 * intel_sanitize_plane_mapping() may need to do vblank
diff --git a/drivers/gpu/drm/i915/display/intel_pch_display.c 
b/drivers/gpu/drm/i915/display/intel_pch_display.c
index 00232dab217d..43e717f4f8e7 100644
--- a/drivers/gpu/drm/i915/display/intel_pch_display.c
+++ b/drivers/gpu/drm/i915/display/intel_pch_display.c
@@ -88,6 +88,67 @@ static void assert_pch_transcoder_disabled(struct 
drm_i915_private *dev_priv,
pipe_name(pipe));
 }
 
+static void ibx_sanitize_pch_hdmi_port(struct drm_i915_private *dev_priv,
+  enum port port, i915_reg_t hdmi_reg)
+{
+   u32 val = intel_de_read(dev_priv, hdmi_reg);
+
+   if (val & SDVO_ENABLE ||
+   (val & SDVO_PIPE_SEL_MASK) == SDVO_PIPE_SEL(PIPE_A))
+   return;
+
+   drm_dbg_kms(_priv->drm,
+   "Sanitizing transcoder select for HDMI %c\n",
+   port_name(port));
+
+   val &= ~SDVO_PIPE_SEL_MASK;
+   val |= SDVO_PIPE_SEL(PIPE_A);
+
+   intel_de_write(dev_priv, hdmi_reg, val);
+}
+
+static void ibx_sanitize_pch_dp_port(struct drm_i915_private *dev_priv,
+enum port port, i915_reg_t dp_reg)
+{
+   u32 val = intel_de_read(dev_priv, dp_reg);
+
+   if (val & DP_PORT_EN ||
+   (val & DP_PIPE_SEL_MASK) == DP_PIPE_SEL(PIPE_A))
+   return;
+
+   drm_dbg_kms(_priv->drm,
+   "Sanitizing transcoder select for DP %c\n",
+   port_name(port));
+
+   val &= ~DP_PIPE_SEL_MASK;

[Intel-gfx] [PATCH 2/4] drm/i915: Remove framestart_delay sanitation

2022-02-21 Thread Ville Syrjala
From: Ville Syrjälä 

Now that we track framestart_delay in the crtc state with readout
and state checker support we can remove the explicit framestart_delay
sanitation code.

Also I'm not convinced reprogramming this while the pipe is running
is even valid. CHICKEN_TRANS (hsw+) and TRANS_CHICKEN2 (cpt+) docs
at least make no mention of double buffering which seems to imply
that live reprogramming is not supported. On older platforms
PIPECONF and PCH_TRANSCONF (ibx) are double buffered though, so
might be that we could do this on the older platforms. But doesn't
really make sense to special case old platforms for this.

So from now on if the BIOS has misprogrammed this we shall simply do
a full modeset at boot to fix it up. Such systems will of course lose
fastboot, but I think less code (and less uncertainty what
reprogramming this on a running pipe will even do) outweighs that.

Signed-off-by: Ville Syrjälä 
---
 drivers/gpu/drm/i915/display/intel_display.c | 56 
 1 file changed, 56 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_display.c 
b/drivers/gpu/drm/i915/display/intel_display.c
index 7e80530b9b00..656c8319e546 100644
--- a/drivers/gpu/drm/i915/display/intel_display.c
+++ b/drivers/gpu/drm/i915/display/intel_display.c
@@ -9822,59 +9822,6 @@ static bool has_pch_trancoder(struct drm_i915_private 
*dev_priv,
(HAS_PCH_LPT_H(dev_priv) && pch_transcoder == PIPE_A);
 }
 
-static void intel_sanitize_frame_start_delay(struct intel_crtc_state 
*crtc_state)
-{
-   struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
-   struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
-   enum transcoder cpu_transcoder = crtc_state->cpu_transcoder;
-
-   crtc_state->framestart_delay = 1;
-
-   if (DISPLAY_VER(dev_priv) >= 9 ||
-   IS_BROADWELL(dev_priv) || IS_HASWELL(dev_priv)) {
-   i915_reg_t reg = CHICKEN_TRANS(cpu_transcoder);
-   u32 val;
-
-   if (transcoder_is_dsi(cpu_transcoder))
-   return;
-
-   val = intel_de_read(dev_priv, reg);
-   val &= ~HSW_FRAME_START_DELAY_MASK;
-   val |= HSW_FRAME_START_DELAY(crtc_state->framestart_delay - 1);
-   intel_de_write(dev_priv, reg, val);
-   } else {
-   i915_reg_t reg = PIPECONF(cpu_transcoder);
-   u32 val;
-
-   val = intel_de_read(dev_priv, reg);
-   val &= ~PIPECONF_FRAME_START_DELAY_MASK;
-   val |= PIPECONF_FRAME_START_DELAY(crtc_state->framestart_delay 
- 1);
-   intel_de_write(dev_priv, reg, val);
-   }
-
-   if (!crtc_state->has_pch_encoder)
-   return;
-
-   if (HAS_PCH_IBX(dev_priv)) {
-   i915_reg_t reg = PCH_TRANSCONF(crtc->pipe);
-   u32 val;
-
-   val = intel_de_read(dev_priv, reg);
-   val &= ~TRANS_FRAME_START_DELAY_MASK;
-   val |= TRANS_FRAME_START_DELAY(crtc_state->framestart_delay - 
1);
-   intel_de_write(dev_priv, reg, val);
-   } else {
-   enum pipe pch_transcoder = intel_crtc_pch_transcoder(crtc);
-   i915_reg_t reg = TRANS_CHICKEN2(pch_transcoder);
-   u32 val;
-
-   val = intel_de_read(dev_priv, reg);
-   val &= ~TRANS_CHICKEN2_FRAME_START_DELAY_MASK;
-   val |= 
TRANS_CHICKEN2_FRAME_START_DELAY(crtc_state->framestart_delay - 1);
-   intel_de_write(dev_priv, reg, val);
-   }
-}
-
 static void intel_sanitize_crtc(struct intel_crtc *crtc,
struct drm_modeset_acquire_ctx *ctx)
 {
@@ -9885,9 +9832,6 @@ static void intel_sanitize_crtc(struct intel_crtc *crtc,
if (crtc_state->hw.active) {
struct intel_plane *plane;
 
-   /* Clear any frame start delays used for debugging left by the 
BIOS */
-   intel_sanitize_frame_start_delay(crtc_state);
-
/* Disable everything but the primary plane */
for_each_intel_plane_on_crtc(dev, crtc, plane) {
const struct intel_plane_state *plane_state =
-- 
2.34.1



[Intel-gfx] [PATCH 1/4] drm/i915: Move framestart_delay to crtc_state

2022-02-21 Thread Ville Syrjala
From: Ville Syrjälä 

We need to make framestart_delay dynamic for DRRS on PCH
ports. To that end move it into the crtc state. As a bonus
we get state check+dump for it. Will also allow us to get
rid of the somewhat questionable framestart_delay sanitation
code.

Signed-off-by: Ville Syrjälä 
---
 drivers/gpu/drm/i915/display/intel_display.c  | 40 ++-
 .../drm/i915/display/intel_display_types.h|  2 +
 .../gpu/drm/i915/display/intel_pch_display.c  | 15 +++
 drivers/gpu/drm/i915/display/intel_vrr.c  |  4 +-
 drivers/gpu/drm/i915/i915_drv.h   |  2 -
 5 files changed, 42 insertions(+), 21 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_display.c 
b/drivers/gpu/drm/i915/display/intel_display.c
index e2ca70696c05..7e80530b9b00 100644
--- a/drivers/gpu/drm/i915/display/intel_display.c
+++ b/drivers/gpu/drm/i915/display/intel_display.c
@@ -1865,7 +1865,7 @@ static void hsw_set_frame_start_delay(const struct 
intel_crtc_state *crtc_state)
 
val = intel_de_read(dev_priv, reg);
val &= ~HSW_FRAME_START_DELAY_MASK;
-   val |= HSW_FRAME_START_DELAY(dev_priv->framestart_delay - 1);
+   val |= HSW_FRAME_START_DELAY(crtc_state->framestart_delay - 1);
intel_de_write(dev_priv, reg, val);
 }
 
@@ -3208,7 +3208,7 @@ static void i9xx_set_pipeconf(const struct 
intel_crtc_state *crtc_state)
 
pipeconf |= PIPECONF_GAMMA_MODE(crtc_state->gamma_mode);
 
-   pipeconf |= PIPECONF_FRAME_START_DELAY(dev_priv->framestart_delay - 1);
+   pipeconf |= PIPECONF_FRAME_START_DELAY(crtc_state->framestart_delay - 
1);
 
intel_de_write(dev_priv, PIPECONF(crtc->pipe), pipeconf);
intel_de_posting_read(dev_priv, PIPECONF(crtc->pipe));
@@ -3398,6 +3398,8 @@ static bool i9xx_get_pipe_config(struct intel_crtc *crtc,
 
pipe_config->gamma_mode = REG_FIELD_GET(PIPECONF_GAMMA_MODE_MASK_I9XX, 
tmp);
 
+   pipe_config->framestart_delay = 
REG_FIELD_GET(PIPECONF_FRAME_START_DELAY_MASK, tmp) + 1;
+
if (IS_CHERRYVIEW(dev_priv))
pipe_config->cgm_mode = intel_de_read(dev_priv,
  
CGM_PIPE_MODE(crtc->pipe));
@@ -3523,7 +3525,7 @@ static void ilk_set_pipeconf(const struct 
intel_crtc_state *crtc_state)
 
val |= PIPECONF_GAMMA_MODE(crtc_state->gamma_mode);
 
-   val |= PIPECONF_FRAME_START_DELAY(dev_priv->framestart_delay - 1);
+   val |= PIPECONF_FRAME_START_DELAY(crtc_state->framestart_delay - 1);
 
intel_de_write(dev_priv, PIPECONF(pipe), val);
intel_de_posting_read(dev_priv, PIPECONF(pipe));
@@ -3831,6 +3833,8 @@ static bool ilk_get_pipe_config(struct intel_crtc *crtc,
 
pipe_config->gamma_mode = REG_FIELD_GET(PIPECONF_GAMMA_MODE_MASK_ILK, 
tmp);
 
+   pipe_config->framestart_delay = 
REG_FIELD_GET(PIPECONF_FRAME_START_DELAY_MASK, tmp) + 1;
+
pipe_config->csc_mode = intel_de_read(dev_priv,
  PIPE_CSC_MODE(crtc->pipe));
 
@@ -4266,6 +4270,15 @@ static bool hsw_get_pipe_config(struct intel_crtc *crtc,
pipe_config->pixel_multiplier = 1;
}
 
+   if (!transcoder_is_dsi(pipe_config->cpu_transcoder)) {
+   tmp = intel_de_read(dev_priv, 
CHICKEN_TRANS(pipe_config->cpu_transcoder));
+
+   pipe_config->framestart_delay = 
REG_FIELD_GET(HSW_FRAME_START_DELAY_MASK, tmp) + 1;
+   } else {
+   /* no idea if this is correct */
+   pipe_config->framestart_delay = 1;
+   }
+
 out:
intel_display_power_put_all_in_set(dev_priv, _domain_set);
 
@@ -5303,6 +5316,9 @@ static void intel_dump_pipe_config(const struct 
intel_crtc_state *pipe_config,
  _config->dp_m2_n2);
}
 
+   drm_dbg_kms(_priv->drm, "framestart delay: %d\n",
+   pipe_config->framestart_delay);
+
drm_dbg_kms(_priv->drm,
"audio: %i, infoframes: %i, infoframes enabled: 0x%x\n",
pipe_config->has_audio, pipe_config->has_infoframe,
@@ -5654,6 +5670,8 @@ intel_modeset_pipe_config(struct intel_atomic_state 
*state,
pipe_config->cpu_transcoder =
(enum transcoder) to_intel_crtc(crtc)->pipe;
 
+   pipe_config->framestart_delay = 1;
+
/*
 * Sanitize sync polarity flags based on requested ones. If neither
 * positive or negative polarity is requested, treat this as meaning
@@ -6191,6 +6209,8 @@ intel_pipe_config_compare(const struct intel_crtc_state 
*current_config,
 
PIPE_CONF_CHECK_X(output_types);
 
+   PIPE_CONF_CHECK_I(framestart_delay);
+
PIPE_CONF_CHECK_I(hw.pipe_mode.crtc_hdisplay);
PIPE_CONF_CHECK_I(hw.pipe_mode.crtc_htotal);
PIPE_CONF_CHECK_I(hw.pipe_mode.crtc_hblank_start);
@@ -9499,8 +9519,6 @@ int intel_modeset_init_noirq(struct drm_i915_private 
*i915)
i915->flip_wq = alloc_workqueue("i915_flip", WQ_HIGHPRI |
   

Re: [Intel-gfx] (subset) [PATCH 17/22] drm/vc4: Use drm_mode_copy()

2022-02-21 Thread Maxime Ripard
On Fri, 18 Feb 2022 12:03:58 +0200, Ville Syrjala wrote:
> From: Ville Syrjälä 
> 
> struct drm_display_mode embeds a list head, so overwriting
> the full struct with another one will corrupt the list
> (if the destination mode is on a list). Use drm_mode_copy()
> instead which explicitly preserves the list head of
> the destination mode.
> 
> [...]

Applied to drm/drm-misc (drm-misc-next).

Thanks!
Maxime


Re: [Intel-gfx] [PATCH] drm/i915/dg2: Print PHY name properly on calibration error

2022-02-21 Thread Tvrtko Ursulin



On 15/02/2022 16:35, Matt Roper wrote:

We need to use phy_name() to convert the PHY value into a human-readable
character in the error message.

Fixes: a6a128116e55 ("drm/i915/dg2: Wait for SNPS PHY calibration during display 
init")


I picked this for drm-intel-fixes, and as it did not apply cleanly, 
noticed in the process that a6a128116e55 is all the way back in 5.15. I 
reckon you didn't want to copy stable because it is just a log message 
tweak?


Regards,

Tvrtko


Signed-off-by: Matt Roper 
---
  drivers/gpu/drm/i915/display/intel_snps_phy.c | 2 +-
  1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/i915/display/intel_snps_phy.c 
b/drivers/gpu/drm/i915/display/intel_snps_phy.c
index 8573a458811a..8fd00de981fc 100644
--- a/drivers/gpu/drm/i915/display/intel_snps_phy.c
+++ b/drivers/gpu/drm/i915/display/intel_snps_phy.c
@@ -35,7 +35,7 @@ void intel_snps_phy_wait_for_calibration(struct 
drm_i915_private *i915)
if (intel_de_wait_for_clear(i915, ICL_PHY_MISC(phy),
DG2_PHY_DP_TX_ACK_MASK, 25))
drm_err(>drm, "SNPS PHY %c failed to calibrate after 
25ms.\n",
-   phy);
+   phy_name(phy));
}
  }
  


Re: [Intel-gfx] [PULL] drm-intel-gt-next

2022-02-21 Thread Jani Nikula
On Mon, 21 Feb 2022, Dave Airlie  wrote:
> On Thu, 17 Feb 2022 at 20:26, Joonas Lahtinen
>  wrote:
>>
>> Hi Dave & Daniel,
>>
>> Here is the first drm-intel-gt-next feature PR towards v5.18.
>
> Am I missing some previous drm-intel pull?
>
> /home/airlied/devel/kernel/dim/src/drivers/gpu/drm/i915/gt/intel_workarounds.c:
> In function ‘rcs_engine_wa_init’:
> /home/airlied/devel/kernel/dim/src/drivers/gpu/drm/i915/gt/intel_workarounds.c:2051:40:
> error: ‘XEHP_DIS_BBL_SYSPIPE’ undeclared (first use in this function)
>  2051 |   wa_masked_en(wal, GEN9_ROW_CHICKEN4, XEHP_DIS_BBL_SYSPIPE);
>   |^~~~
> /home/airlied/devel/kernel/dim/src/drivers/gpu/drm/i915/gt/intel_workarounds.c:2051:40:
> note: each undeclared identifier is reported only once for each
> function it appears in

There's apparently a silent conflict between changes in drm-intel-next
and drm-intel-gt-next. There's a fixup patch in drm-rerere:
fixups/drm-intel-gt-next.patch.

We opted to sync the branches via drm-next pulls and backmerges, but I'm
afraid that means you'd have to use the fixups when merging. I guess we
failed to communicate that. The alternative would've been cross-merges
within drm-intel.


BR,
Jani.


>
> Dave.
>>
>> For DG2 adds subplatform G12, missing workarounds and fixes GuC
>> loading on ARM64. C0/D0 stepping info added for RPL-S.
>>
>> For uAPI enables support for simple parallel submission with
>> execlists which was previously enabled only for GuC.
>>
>> Further fixes for PMU metrics when GuC is enabled, better error
>> reporting for GuC loading failures. Fix for PXP unbind splat.
>> Updates to GuC version 69.0.3 with improvements to GT reset
>> scenarios.
>>
>> The rest is mostly refactoring of the memory management code,
>> as highlights introduction of async unbinding/migration and
>> removal of short-term pinning in execbuf.
>>
>> Then a few selftest and coding style fixes.
>>
>> Regards, Joonas
>>
>> ***
>>
>> drm-intel-gt-next-2022-02-17:
>>
>> UAPI Changes:
>>
>> - Weak parallel submission support for execlists
>>
>>   Minimal implementation of the parallel submission support for
>>   execlists backend that was previously only implemented for GuC.
>>   Support one sibling non-virtual engine.
>>
>> Core Changes:
>>
>> - Two backmerges of drm/drm-next for header file renames/changes and
>>   i915_regs reorganization
>>
>> Driver Changes:
>>
>> - Add new DG2 subplatform: DG2-G12 (Matt R)
>> - Add new DG2 workarounds (Matt R, Ram, Bruce)
>> - Handle pre-programmed WOPCM registers for DG2+ (Daniele)
>> - Update guc shim control programming on XeHP SDV+ (Daniele)
>> - Add RPL-S C0/D0 stepping information (Anusha)
>> - Improve GuC ADS initialization to work on ARM64 on dGFX (Lucas)
>>
>> - Fix KMD and GuC race on accessing PMU busyness (Umesh)
>> - Use PM timestamp instead of RING TIMESTAMP for reference in PMU with GuC 
>> (Umesh)
>> - Report error on invalid reset notification from GuC (John)
>> - Avoid WARN splat by holding RPM wakelock during PXP unbind (Juston)
>> - Fixes to parallel submission implementation (Matt B.)
>> - Improve GuC loading status check/error reports (John)
>> - Tweak TTM LRU priority hint selection (Matt A.)
>> - Align the plane_vma to min_page_size of stolen mem (Ram)
>>
>> - Introduce vma resources and implement async unbinding (Thomas)
>> - Use struct vma_resource instead of struct vma_snapshot (Thomas)
>> - Return some TTM accel move errors instead of trying memcpy move (Thomas)
>> - Fix a race between vma / object destruction and unbinding (Thomas)
>> - Remove short-term pins from execbuf (Maarten)
>> - Update to GuC version 69.0.3 (John, Michal Wa.)
>> - Improvements to GT reset paths in GuC backend (Matt B.)
>> - Use shrinker_release_pages instead of writeback in shmem object hooks 
>> (Matt A., Tvrtko)
>> - Use trylock instead of blocking lock when freeing GEM objects (Maarten)
>> - Allocate intel_engine_coredump_alloc with ALLOW_FAIL (Matt B.)
>> - Fixes to object unmapping and purging (Matt A)
>> - Check for wedged device in GuC backend (John)
>> - Avoid lockdep splat by locking dpt_obj around set_cache_level (Maarten)
>> - Allow dead vm to unbind vma's without lock (Maarten)
>> - s/engine->i915/i915/ for DG2 engine workarounds (Matt R)
>>
>> - Use to_gt() helper for GGTT accesses (Michal Wi.)
>> - Selftest improvements (Matt B., Thomas, Ram)
>> - Coding style and compiler warning fixes (Matt B., Jasmine, Andi, Colin, 
>> Gustavo, Dan)
>>
>> The following changes since commit 53dbee4926d3706ca9e03f3928fa85b5ec3bc0cc:
>>
>>   Merge tag 'drm-misc-next-2022-01-27' of 
>> git://anongit.freedesktop.org/drm/drm-misc into drm-next (2022-02-01 
>> 19:02:41 +1000)
>>
>> are available in the Git repository at:
>>
>>   git://anongit.freedesktop.org/drm/drm-intel 
>> tags/drm-intel-gt-next-2022-02-17
>>
>> for you to fetch changes up to 154cfae6158141b18d65abb0db679bb51a8294e7:
>>
>>   drm/i915/dg2: Add Wa_22011100796 (2022-02-11 17:11:44 

  1   2   >