[Intel-gfx] ✗ Fi.CI.IGT: failure for Gen12 forcewake and multicast updates

2020-10-02 Thread Patchwork
== Series Details ==

Series: Gen12 forcewake and multicast updates
URL   : https://patchwork.freedesktop.org/series/82359/
State : failure

== Summary ==

CI Bug Log - changes from CI_DRM_9093_full -> Patchwork_18621_full


Summary
---

  **FAILURE**

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

  

Possible new issues
---

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

### IGT changes ###

 Possible regressions 

  * igt@gem_userptr_blits@unsync-unmap-cycles:
- shard-skl:  [PASS][1] -> [TIMEOUT][2]
   [1]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9093/shard-skl6/igt@gem_userptr_bl...@unsync-unmap-cycles.html
   [2]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18621/shard-skl10/igt@gem_userptr_bl...@unsync-unmap-cycles.html

  
Known issues


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

### IGT changes ###

 Issues hit 

  * igt@i915_pm_dc@dc6-psr:
- shard-iclb: [PASS][3] -> [FAIL][4] ([i915#454])
   [3]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9093/shard-iclb1/igt@i915_pm...@dc6-psr.html
   [4]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18621/shard-iclb2/igt@i915_pm...@dc6-psr.html

  * igt@i915_suspend@sysfs-reader:
- shard-skl:  [PASS][5] -> [INCOMPLETE][6] ([i915#198]) +1 similar 
issue
   [5]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9093/shard-skl9/igt@i915_susp...@sysfs-reader.html
   [6]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18621/shard-skl7/igt@i915_susp...@sysfs-reader.html

  * igt@kms_big_fb@linear-8bpp-rotate-0:
- shard-kbl:  [PASS][7] -> [DMESG-WARN][8] ([i915#1982])
   [7]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9093/shard-kbl6/igt@kms_big...@linear-8bpp-rotate-0.html
   [8]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18621/shard-kbl7/igt@kms_big...@linear-8bpp-rotate-0.html

  * igt@kms_flip@flip-vs-blocking-wf-vblank@a-edp1:
- shard-skl:  [PASS][9] -> [DMESG-WARN][10] ([i915#1982]) +8 
similar issues
   [9]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9093/shard-skl8/igt@kms_flip@flip-vs-blocking-wf-vbl...@a-edp1.html
   [10]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18621/shard-skl1/igt@kms_flip@flip-vs-blocking-wf-vbl...@a-edp1.html

  * igt@kms_flip@flip-vs-expired-vblank-interruptible@c-dp1:
- shard-kbl:  [PASS][11] -> [FAIL][12] ([i915#79]) +1 similar issue
   [11]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9093/shard-kbl1/igt@kms_flip@flip-vs-expired-vblank-interrupti...@c-dp1.html
   [12]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18621/shard-kbl2/igt@kms_flip@flip-vs-expired-vblank-interrupti...@c-dp1.html

  * igt@kms_flip@flip-vs-suspend-interruptible@a-dp1:
- shard-kbl:  [PASS][13] -> [DMESG-WARN][14] ([i915#180]) +9 
similar issues
   [13]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9093/shard-kbl1/igt@kms_flip@flip-vs-suspend-interrupti...@a-dp1.html
   [14]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18621/shard-kbl2/igt@kms_flip@flip-vs-suspend-interrupti...@a-dp1.html

  * igt@kms_flip_tiling@flip-changes-tiling:
- shard-skl:  [PASS][15] -> [FAIL][16] ([i915#699])
   [15]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9093/shard-skl10/igt@kms_flip_til...@flip-changes-tiling.html
   [16]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18621/shard-skl4/igt@kms_flip_til...@flip-changes-tiling.html

  * igt@kms_frontbuffer_tracking@psr-1p-primscrn-pri-indfb-draw-mmap-cpu:
- shard-skl:  [PASS][17] -> [FAIL][18] ([i915#49])
   [17]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9093/shard-skl10/igt@kms_frontbuffer_track...@psr-1p-primscrn-pri-indfb-draw-mmap-cpu.html
   [18]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18621/shard-skl4/igt@kms_frontbuffer_track...@psr-1p-primscrn-pri-indfb-draw-mmap-cpu.html

  * igt@kms_plane_alpha_blend@pipe-b-coverage-7efc:
- shard-skl:  [PASS][19] -> [FAIL][20] ([fdo#108145] / [i915#265]) 
+2 similar issues
   [19]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9093/shard-skl2/igt@kms_plane_alpha_bl...@pipe-b-coverage-7efc.html
   [20]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18621/shard-skl9/igt@kms_plane_alpha_bl...@pipe-b-coverage-7efc.html

  * igt@kms_psr@psr2_no_drrs:
- shard-iclb: [PASS][21] -> [SKIP][22] ([fdo#109441]) +2 similar 
issues
   [21]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9093/shard-iclb2/igt@kms_psr@psr2_no_drrs.html
   [22]: 
https://intel-gfx-ci.01.org/tree/drm

Re: [Intel-gfx] [PATCH v2] drm/i915/display/ehl: Limit eDP to HBR2

2020-10-02 Thread Matt Roper
On Mon, Sep 28, 2020 at 01:03:09PM -0700, José Roberto de Souza wrote:
> Recent update in documentation defeatured eDP HBR3 for EHL and JSL.
> 
> v2:
> - Remove dead code in ehl_get_combo_buf_trans()
> 
> BSpec: 32247
> Cc: Matt Roper 
> Cc: Vidya Srinivas 
> Signed-off-by: José Roberto de Souza 

Surprising that DP vs eDP have the exact opposite restrictions that
ICL/TGL do, but this matches the spec.

Reviewed-by: Matt Roper 

> ---
>  drivers/gpu/drm/i915/display/intel_ddi.c |  9 ++---
>  drivers/gpu/drm/i915/display/intel_dp.c  | 11 ++-
>  2 files changed, 12 insertions(+), 8 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/display/intel_ddi.c 
> b/drivers/gpu/drm/i915/display/intel_ddi.c
> index 4d06178cd76c..ef06b7b82be9 100644
> --- a/drivers/gpu/drm/i915/display/intel_ddi.c
> +++ b/drivers/gpu/drm/i915/display/intel_ddi.c
> @@ -1082,13 +1082,8 @@ ehl_get_combo_buf_trans(struct intel_encoder *encoder, 
> int type, int rate,
>   return icl_combo_phy_ddi_translations_hdmi;
>   case INTEL_OUTPUT_EDP:
>   if (dev_priv->vbt.edp.low_vswing) {
> - if (rate > 54) {
> - *n_entries = 
> ARRAY_SIZE(icl_combo_phy_ddi_translations_edp_hbr3);
> - return icl_combo_phy_ddi_translations_edp_hbr3;
> - } else {
> - *n_entries = 
> ARRAY_SIZE(icl_combo_phy_ddi_translations_edp_hbr2);
> - return icl_combo_phy_ddi_translations_edp_hbr2;
> - }
> + *n_entries = 
> ARRAY_SIZE(icl_combo_phy_ddi_translations_edp_hbr2);
> + return icl_combo_phy_ddi_translations_edp_hbr2;
>   }
>   /* fall through */
>   default:
> diff --git a/drivers/gpu/drm/i915/display/intel_dp.c 
> b/drivers/gpu/drm/i915/display/intel_dp.c
> index 54a4b81ea3ff..96d2c76772d6 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp.c
> +++ b/drivers/gpu/drm/i915/display/intel_dp.c
> @@ -277,13 +277,20 @@ static int icl_max_source_rate(struct intel_dp 
> *intel_dp)
>   enum phy phy = intel_port_to_phy(dev_priv, dig_port->base.port);
>  
>   if (intel_phy_is_combo(dev_priv, phy) &&
> - !IS_ELKHARTLAKE(dev_priv) &&
>   !intel_dp_is_edp(intel_dp))
>   return 54;
>  
>   return 81;
>  }
>  
> +static int ehl_max_source_rate(struct intel_dp *intel_dp)
> +{
> + if (intel_dp_is_edp(intel_dp))
> + return 54;
> +
> + return 81;
> +}
> +
>  static void
>  intel_dp_set_source_rates(struct intel_dp *intel_dp)
>  {
> @@ -318,6 +325,8 @@ intel_dp_set_source_rates(struct intel_dp *intel_dp)
>   size = ARRAY_SIZE(cnl_rates);
>   if (IS_GEN(dev_priv, 10))
>   max_rate = cnl_max_source_rate(intel_dp);
> + else if (IS_ELKHARTLAKE(dev_priv))
> + max_rate = ehl_max_source_rate(intel_dp);
>   else
>   max_rate = icl_max_source_rate(intel_dp);
>   } else if (IS_GEN9_LP(dev_priv)) {
> -- 
> 2.28.0
> 

-- 
Matt Roper
Graphics Software Engineer
VTT-OSGC Platform Enablement
Intel Corporation
(916) 356-2795
___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx


[Intel-gfx] ✓ Fi.CI.BAT: success for Gen12 forcewake and multicast updates

2020-10-02 Thread Patchwork
== Series Details ==

Series: Gen12 forcewake and multicast updates
URL   : https://patchwork.freedesktop.org/series/82359/
State : success

== Summary ==

CI Bug Log - changes from CI_DRM_9093 -> Patchwork_18621


Summary
---

  **SUCCESS**

  No regressions found.

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

Known issues


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

### IGT changes ###

 Issues hit 

  * igt@i915_pm_rpm@basic-pci-d3-state:
- fi-bsw-kefka:   [PASS][1] -> [DMESG-WARN][2] ([i915#1982])
   [1]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9093/fi-bsw-kefka/igt@i915_pm_...@basic-pci-d3-state.html
   [2]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18621/fi-bsw-kefka/igt@i915_pm_...@basic-pci-d3-state.html

  
 Possible fixes 

  * igt@i915_module_load@reload:
- {fi-tgl-dsi}:   [DMESG-WARN][3] ([i915#1982] / [k.org#205379]) -> 
[PASS][4]
   [3]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9093/fi-tgl-dsi/igt@i915_module_l...@reload.html
   [4]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18621/fi-tgl-dsi/igt@i915_module_l...@reload.html

  * igt@vgem_basic@unload:
- fi-skl-guc: [DMESG-WARN][5] ([i915#2203]) -> [PASS][6]
   [5]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9093/fi-skl-guc/igt@vgem_ba...@unload.html
   [6]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18621/fi-skl-guc/igt@vgem_ba...@unload.html

  
 Warnings 

  * igt@i915_pm_rpm@basic-rte:
- fi-kbl-guc: [DMESG-FAIL][7] ([i915#2203]) -> [SKIP][8] 
([fdo#109271])
   [7]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9093/fi-kbl-guc/igt@i915_pm_...@basic-rte.html
   [8]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18621/fi-kbl-guc/igt@i915_pm_...@basic-rte.html

  * igt@kms_force_connector_basic@prune-stale-modes:
- fi-kbl-x1275:   [DMESG-WARN][9] ([i915#62] / [i915#92]) -> 
[DMESG-WARN][10] ([i915#62] / [i915#92] / [i915#95]) +5 similar issues
   [9]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9093/fi-kbl-x1275/igt@kms_force_connector_ba...@prune-stale-modes.html
   [10]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18621/fi-kbl-x1275/igt@kms_force_connector_ba...@prune-stale-modes.html

  * igt@vgem_basic@unload:
- fi-kbl-x1275:   [DMESG-WARN][11] ([i915#62] / [i915#92] / [i915#95]) 
-> [DMESG-WARN][12] ([i915#62] / [i915#92]) +1 similar issue
   [11]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9093/fi-kbl-x1275/igt@vgem_ba...@unload.html
   [12]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18621/fi-kbl-x1275/igt@vgem_ba...@unload.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
  [i915#1982]: https://gitlab.freedesktop.org/drm/intel/issues/1982
  [i915#2203]: https://gitlab.freedesktop.org/drm/intel/issues/2203
  [i915#289]: https://gitlab.freedesktop.org/drm/intel/issues/289
  [i915#62]: https://gitlab.freedesktop.org/drm/intel/issues/62
  [i915#92]: https://gitlab.freedesktop.org/drm/intel/issues/92
  [i915#95]: https://gitlab.freedesktop.org/drm/intel/issues/95
  [k.org#205379]: https://bugzilla.kernel.org/show_bug.cgi?id=205379


Participating hosts (45 -> 39)
--

  Missing(6): fi-ilk-m540 fi-hsw-4200u fi-byt-squawks fi-bsw-cyan 
fi-byt-clapper fi-bdw-samus 


Build changes
-

  * Linux: CI_DRM_9093 -> Patchwork_18621

  CI-20190529: 20190529
  CI_DRM_9093: 827ebff930c6340ed1c1c274909717525951c496 @ 
git://anongit.freedesktop.org/gfx-ci/linux
  IGT_5798: 430bad5a53c08125fbd48978ed6a66f61a33a40b @ 
git://anongit.freedesktop.org/xorg/app/intel-gpu-tools
  Patchwork_18621: 6da2190fb4c253f621c3fb2713985af305f12ce5 @ 
git://anongit.freedesktop.org/gfx-ci/linux


== Linux commits ==

6da2190fb4c2 drm/i915: Update gen12 multicast register ranges
c1ef268aea44 drm/i915: Update gen12 forcewake table

== Logs ==

For more details see: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18621/index.html
___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx


[Intel-gfx] ✗ Fi.CI.IGT: failure for drm/i915/tgl: Fix Combo PHY DPLL fractional divider for 38.4MHz ref clock (rev3)

2020-10-02 Thread Patchwork
== Series Details ==

Series: drm/i915/tgl: Fix Combo PHY DPLL fractional divider for 38.4MHz ref 
clock (rev3)
URL   : https://patchwork.freedesktop.org/series/82173/
State : failure

== Summary ==

CI Bug Log - changes from CI_DRM_9093_full -> Patchwork_18620_full


Summary
---

  **FAILURE**

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

  

Possible new issues
---

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

### IGT changes ###

 Possible regressions 

  * igt@gem_userptr_blits@unsync-unmap-cycles:
- shard-skl:  [PASS][1] -> [TIMEOUT][2]
   [1]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9093/shard-skl6/igt@gem_userptr_bl...@unsync-unmap-cycles.html
   [2]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18620/shard-skl4/igt@gem_userptr_bl...@unsync-unmap-cycles.html

  * igt@kms_flip@flip-vs-suspend@c-edp1:
- shard-iclb: [PASS][3] -> [INCOMPLETE][4]
   [3]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9093/shard-iclb3/igt@kms_flip@flip-vs-susp...@c-edp1.html
   [4]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18620/shard-iclb3/igt@kms_flip@flip-vs-susp...@c-edp1.html

  
Known issues


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

### IGT changes ###

 Issues hit 

  * igt@gem_ctx_isolation@preservation-s3@bcs0:
- shard-skl:  [PASS][5] -> [INCOMPLETE][6] ([i915#198])
   [5]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9093/shard-skl1/igt@gem_ctx_isolation@preservation...@bcs0.html
   [6]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18620/shard-skl1/igt@gem_ctx_isolation@preservation...@bcs0.html

  * igt@gem_userptr_blits@sync-unmap-cycles:
- shard-skl:  [PASS][7] -> [TIMEOUT][8] ([i915#2424])
   [7]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9093/shard-skl10/igt@gem_userptr_bl...@sync-unmap-cycles.html
   [8]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18620/shard-skl2/igt@gem_userptr_bl...@sync-unmap-cycles.html

  * igt@kms_big_fb@linear-8bpp-rotate-0:
- shard-kbl:  [PASS][9] -> [DMESG-WARN][10] ([i915#1982])
   [9]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9093/shard-kbl6/igt@kms_big...@linear-8bpp-rotate-0.html
   [10]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18620/shard-kbl4/igt@kms_big...@linear-8bpp-rotate-0.html

  * igt@kms_cursor_edge_walk@pipe-c-256x256-right-edge:
- shard-glk:  [PASS][11] -> [DMESG-WARN][12] ([i915#1982])
   [11]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9093/shard-glk4/igt@kms_cursor_edge_w...@pipe-c-256x256-right-edge.html
   [12]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18620/shard-glk5/igt@kms_cursor_edge_w...@pipe-c-256x256-right-edge.html

  * igt@kms_draw_crc@draw-method-xrgb2101010-mmap-wc-untiled:
- shard-apl:  [PASS][13] -> [DMESG-WARN][14] ([i915#1635] / 
[i915#1982]) +1 similar issue
   [13]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9093/shard-apl7/igt@kms_draw_...@draw-method-xrgb2101010-mmap-wc-untiled.html
   [14]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18620/shard-apl1/igt@kms_draw_...@draw-method-xrgb2101010-mmap-wc-untiled.html

  * igt@kms_draw_crc@draw-method-xrgb-mmap-gtt-untiled:
- shard-skl:  [PASS][15] -> [FAIL][16] ([i915#177] / [i915#52] / 
[i915#54])
   [15]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9093/shard-skl7/igt@kms_draw_...@draw-method-xrgb-mmap-gtt-untiled.html
   [16]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18620/shard-skl7/igt@kms_draw_...@draw-method-xrgb-mmap-gtt-untiled.html

  * igt@kms_flip@flip-vs-blocking-wf-vblank@a-edp1:
- shard-skl:  [PASS][17] -> [DMESG-WARN][18] ([i915#1982]) +9 
similar issues
   [17]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9093/shard-skl8/igt@kms_flip@flip-vs-blocking-wf-vbl...@a-edp1.html
   [18]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18620/shard-skl1/igt@kms_flip@flip-vs-blocking-wf-vbl...@a-edp1.html

  * igt@kms_flip@plain-flip-ts-check@c-edp1:
- shard-skl:  [PASS][19] -> [FAIL][20] ([i915#2122])
   [19]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9093/shard-skl9/igt@kms_flip@plain-flip-ts-ch...@c-edp1.html
   [20]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18620/shard-skl8/igt@kms_flip@plain-flip-ts-ch...@c-edp1.html

  * igt@kms_frontbuffer_tracking@psr-1p-primscrn-pri-indfb-draw-mmap-gtt:
- shard-tglb: [PASS][21] -> [DMESG-WARN][22] ([i915#1982])
   [21]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9093/shard-tglb1/igt

[Intel-gfx] ✗ Fi.CI.SPARSE: warning for Gen12 forcewake and multicast updates

2020-10-02 Thread Patchwork
== Series Details ==

Series: Gen12 forcewake and multicast updates
URL   : https://patchwork.freedesktop.org/series/82359/
State : warning

== Summary ==

$ dim sparse --fast origin/drm-tip
Sparse version: v0.6.2
Fast mode used, each commit won't be checked separately.
-
+./include/linux/spinlock.h:409:9: warning: context imbalance in 
'fwtable_read16' - different lock contexts for basic block
+./include/linux/spinlock.h:409:9: warning: context imbalance in 
'fwtable_read32' - different lock contexts for basic block
+./include/linux/spinlock.h:409:9: warning: context imbalance in 
'fwtable_read64' - different lock contexts for basic block
+./include/linux/spinlock.h:409:9: warning: context imbalance in 
'fwtable_read8' - different lock contexts for basic block
+./include/linux/spinlock.h:409:9: warning: context imbalance in 
'fwtable_write16' - different lock contexts for basic block
+./include/linux/spinlock.h:409:9: warning: context imbalance in 
'fwtable_write32' - different lock contexts for basic block
+./include/linux/spinlock.h:409:9: warning: context imbalance in 
'fwtable_write8' - different lock contexts for basic block
+./include/linux/spinlock.h:409:9: warning: context imbalance in 
'gen11_fwtable_read16' - different lock contexts for basic block
+./include/linux/spinlock.h:409:9: warning: context imbalance in 
'gen11_fwtable_read32' - different lock contexts for basic block
+./include/linux/spinlock.h:409:9: warning: context imbalance in 
'gen11_fwtable_read64' - different lock contexts for basic block
+./include/linux/spinlock.h:409:9: warning: context imbalance in 
'gen11_fwtable_read8' - different lock contexts for basic block
+./include/linux/spinlock.h:409:9: warning: context imbalance in 
'gen11_fwtable_write16' - different lock contexts for basic block
+./include/linux/spinlock.h:409:9: warning: context imbalance in 
'gen11_fwtable_write32' - different lock contexts for basic block
+./include/linux/spinlock.h:409:9: warning: context imbalance in 
'gen11_fwtable_write8' - different lock contexts for basic block
+./include/linux/spinlock.h:409:9: warning: context imbalance in 
'gen12_fwtable_read16' - different lock contexts for basic block
+./include/linux/spinlock.h:409:9: warning: context imbalance in 
'gen12_fwtable_read32' - different lock contexts for basic block
+./include/linux/spinlock.h:409:9: warning: context imbalance in 
'gen12_fwtable_read64' - different lock contexts for basic block
+./include/linux/spinlock.h:409:9: warning: context imbalance in 
'gen12_fwtable_read8' - different lock contexts for basic block
+./include/linux/spinlock.h:409:9: warning: context imbalance in 
'gen12_fwtable_write16' - different lock contexts for basic block
+./include/linux/spinlock.h:409:9: warning: context imbalance in 
'gen12_fwtable_write32' - different lock contexts for basic block
+./include/linux/spinlock.h:409:9: warning: context imbalance in 
'gen12_fwtable_write8' - different lock contexts for basic block
+./include/linux/spinlock.h:409:9: warning: context imbalance in 'gen6_read16' 
- different lock contexts for basic block
+./include/linux/spinlock.h:409:9: warning: context imbalance in 'gen6_read32' 
- different lock contexts for basic block
+./include/linux/spinlock.h:409:9: warning: context imbalance in 'gen6_read64' 
- different lock contexts for basic block
+./include/linux/spinlock.h:409:9: warning: context imbalance in 'gen6_read8' - 
different lock contexts for basic block
+./include/linux/spinlock.h:409:9: warning: context imbalance in 'gen6_write16' 
- different lock contexts for basic block
+./include/linux/spinlock.h:409:9: warning: context imbalance in 'gen6_write32' 
- different lock contexts for basic block
+./include/linux/spinlock.h:409:9: warning: context imbalance in 'gen6_write8' 
- different lock contexts for basic block
+./include/linux/spinlock.h:409:9: warning: context imbalance in 'gen8_write16' 
- different lock contexts for basic block
+./include/linux/spinlock.h:409:9: warning: context imbalance in 'gen8_write32' 
- different lock contexts for basic block
+./include/linux/spinlock.h:409:9: warning: context imbalance in 'gen8_write8' 
- different lock contexts for basic block


___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx


[Intel-gfx] [PATCH 0/2] Gen12 forcewake and multicast updates

2020-10-02 Thread Matt Roper
The hardware architects have finally provided an updated MMIO table for
gen12 platforms (TGL, RKL, DG1).  We should update our driver's
forcewake and MCR programming accordingly.

Bspec: 66696
Cc: Caz Yokoyama 
Cc: Daniele Ceraolo Spurio 

Matt Roper (2):
  drm/i915: Update gen12 forcewake table
  drm/i915: Update gen12 multicast register ranges

 drivers/gpu/drm/i915/gt/intel_workarounds.c | 28 +++--
 drivers/gpu/drm/i915/intel_uncore.c | 66 +
 2 files changed, 62 insertions(+), 32 deletions(-)

-- 
2.24.1

___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx


[Intel-gfx] [PATCH 2/2] drm/i915: Update gen12 multicast register ranges

2020-10-02 Thread Matt Roper
The updated bspec forcewake table also provides us with new multicast
ranges that should be reflected in our workaround code.

Note that there are different types of multicast registers with
different styles of replication and different steering registers.  The
i915 MCR range lists we're updating here are only used to ensure we can
verify workarounds properly (i.e., if we can't steer register reads we
don't want to verify workarounds where an unsteered read might hit a
fused-off instance of the unit).  Because of this, we don't need to
include any of the multicast ranges where all instances of the register
will always present and fusing doesn't play a role.  Specifically, that
means that we are not including the MCR ranges designated as "SQIDI" in
the bspec.

Bspec: 66696
Cc: Caz Yokoyama 
Cc: Daniele Ceraolo Spurio 
Signed-off-by: Matt Roper 
---
 drivers/gpu/drm/i915/gt/intel_workarounds.c | 28 -
 1 file changed, 22 insertions(+), 6 deletions(-)

diff --git a/drivers/gpu/drm/i915/gt/intel_workarounds.c 
b/drivers/gpu/drm/i915/gt/intel_workarounds.c
index 6c580d0d9ea8..78c5480c6401 100644
--- a/drivers/gpu/drm/i915/gt/intel_workarounds.c
+++ b/drivers/gpu/drm/i915/gt/intel_workarounds.c
@@ -2031,10 +2031,12 @@ create_scratch(struct i915_address_space *vm, int count)
return ERR_PTR(err);
 }
 
-static const struct {
+struct mcr_range {
u32 start;
u32 end;
-} mcr_ranges_gen8[] = {
+};
+
+static const struct mcr_range mcr_ranges_gen8[] = {
{ .start = 0x5500, .end = 0x55ff },
{ .start = 0x7000, .end = 0x7fff },
{ .start = 0x9400, .end = 0x97ff },
@@ -2043,11 +2045,25 @@ static const struct {
{},
 };
 
+static const struct mcr_range mcr_ranges_gen12[] = {
+   { .start =  0x8150, .end =  0x815f },
+   { .start =  0x9520, .end =  0x955f },
+   { .start =  0xb100, .end =  0xb3ff },
+   { .start =  0xde80, .end =  0xe8ff },
+   { .start = 0x24a00, .end = 0x24a7f },
+   {},
+};
+
 static bool mcr_range(struct drm_i915_private *i915, u32 offset)
 {
+   const struct mcr_range *mcr_ranges;
int i;
 
-   if (INTEL_GEN(i915) < 8)
+   if (INTEL_GEN(i915) >= 12)
+   mcr_ranges = mcr_ranges_gen12;
+   else if (INTEL_GEN(i915) >= 8)
+   mcr_ranges = mcr_ranges_gen8;
+   else
return false;
 
/*
@@ -2055,9 +2071,9 @@ static bool mcr_range(struct drm_i915_private *i915, u32 
offset)
 * which only controls CPU initiated MMIO. Routing does not
 * work for CS access so we cannot verify them on this path.
 */
-   for (i = 0; mcr_ranges_gen8[i].start; i++)
-   if (offset >= mcr_ranges_gen8[i].start &&
-   offset <= mcr_ranges_gen8[i].end)
+   for (i = 0; mcr_ranges[i].start; i++)
+   if (offset >= mcr_ranges[i].start &&
+   offset <= mcr_ranges[i].end)
return true;
 
return false;
-- 
2.24.1

___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx


[Intel-gfx] [PATCH 1/2] drm/i915: Update gen12 forcewake table

2020-10-02 Thread Matt Roper
The bspec's forcewake page was very stale and out of date for recent
platforms.  The hardware team finally provided us with an updated gen12
table (which applies to TGL, RKL, and DG1) and there are a lot of
changes.

Bspec: 66696
Cc: Caz Yokoyama 
Cc: Daniele Ceraolo Spurio 
Signed-off-by: Matt Roper 
---
 drivers/gpu/drm/i915/intel_uncore.c | 66 +
 1 file changed, 40 insertions(+), 26 deletions(-)

diff --git a/drivers/gpu/drm/i915/intel_uncore.c 
b/drivers/gpu/drm/i915/intel_uncore.c
index 263ffcb832b7..e14dbc1c7e22 100644
--- a/drivers/gpu/drm/i915/intel_uncore.c
+++ b/drivers/gpu/drm/i915/intel_uncore.c
@@ -1124,44 +1124,58 @@ static const struct intel_forcewake_range 
__gen11_fw_ranges[] = {
GEN_FW_RANGE(0x1d4000, 0x1dbfff, 0)
 };
 
-/* *Must* be sorted by offset ranges! See intel_fw_table_check(). */
+/*
+ * *Must* be sorted by offset ranges! See intel_fw_table_check().
+ *
+ * Note that the spec lists several reserved/unused ranges that don't
+ * actually contain any registers.  In the table below we'll combine those
+ * reserved ranges with either the preceding or following range to keep the
+ * table small and lookups fast.
+ */
 static const struct intel_forcewake_range __gen12_fw_ranges[] = {
-   GEN_FW_RANGE(0x0, 0xaff, FORCEWAKE_BLITTER),
-   GEN_FW_RANGE(0xb00, 0x1fff, 0), /* uncore range */
+   GEN_FW_RANGE(0x0, 0x1fff, 0),
GEN_FW_RANGE(0x2000, 0x26ff, FORCEWAKE_RENDER),
-   GEN_FW_RANGE(0x2700, 0x2fff, FORCEWAKE_BLITTER),
+   GEN_FW_RANGE(0x2700, 0x27ff, FORCEWAKE_BLITTER),
+   GEN_FW_RANGE(0x2800, 0x2aff, FORCEWAKE_RENDER),
+   GEN_FW_RANGE(0x2b00, 0x2fff, FORCEWAKE_BLITTER),
GEN_FW_RANGE(0x3000, 0x3fff, FORCEWAKE_RENDER),
GEN_FW_RANGE(0x4000, 0x51ff, FORCEWAKE_BLITTER),
GEN_FW_RANGE(0x5200, 0x7fff, FORCEWAKE_RENDER),
GEN_FW_RANGE(0x8000, 0x813f, FORCEWAKE_BLITTER),
-   GEN_FW_RANGE(0x8140, 0x815f, FORCEWAKE_RENDER),
-   GEN_FW_RANGE(0x8160, 0x82ff, FORCEWAKE_BLITTER),
+   GEN_FW_RANGE(0x8140, 0x817f, FORCEWAKE_RENDER),
+   GEN_FW_RANGE(0x8180, 0x81ff, 0),
+   GEN_FW_RANGE(0x8200, 0x82ff, FORCEWAKE_BLITTER),
GEN_FW_RANGE(0x8300, 0x84ff, FORCEWAKE_RENDER),
-   GEN_FW_RANGE(0x8500, 0x8bff, FORCEWAKE_BLITTER),
-   GEN_FW_RANGE(0x8c00, 0x8cff, FORCEWAKE_RENDER),
-   GEN_FW_RANGE(0x8d00, 0x93ff, FORCEWAKE_BLITTER),
-   GEN_FW_RANGE(0x9400, 0x97ff, FORCEWAKE_ALL),
+   GEN_FW_RANGE(0x8500, 0x94cf, FORCEWAKE_BLITTER),
+   GEN_FW_RANGE(0x94d0, 0x955f, FORCEWAKE_RENDER),
+   GEN_FW_RANGE(0x9560, 0x97ff, 0),
GEN_FW_RANGE(0x9800, 0xafff, FORCEWAKE_BLITTER),
-   GEN_FW_RANGE(0xb000, 0xb47f, FORCEWAKE_RENDER),
-   GEN_FW_RANGE(0xb480, 0xdfff, FORCEWAKE_BLITTER),
-   GEN_FW_RANGE(0xe000, 0xe8ff, FORCEWAKE_RENDER),
-   GEN_FW_RANGE(0xe900, 0x147ff, FORCEWAKE_BLITTER),
-   GEN_FW_RANGE(0x14800, 0x148ff, FORCEWAKE_RENDER),
-   GEN_FW_RANGE(0x14900, 0x19fff, FORCEWAKE_BLITTER),
-   GEN_FW_RANGE(0x1a000, 0x1a7ff, FORCEWAKE_RENDER),
-   GEN_FW_RANGE(0x1a800, 0x1afff, FORCEWAKE_BLITTER),
-   GEN_FW_RANGE(0x1b000, 0x1bfff, FORCEWAKE_RENDER),
-   GEN_FW_RANGE(0x1c000, 0x243ff, FORCEWAKE_BLITTER),
-   GEN_FW_RANGE(0x24400, 0x247ff, FORCEWAKE_RENDER),
-   GEN_FW_RANGE(0x24800, 0x3, FORCEWAKE_BLITTER),
+   GEN_FW_RANGE(0xb000, 0xb3ff, FORCEWAKE_RENDER),
+   GEN_FW_RANGE(0xb400, 0xcfff, FORCEWAKE_BLITTER),
+   GEN_FW_RANGE(0xd000, 0xd7ff, 0),
+   GEN_FW_RANGE(0xd800, 0xd8ff, FORCEWAKE_RENDER),
+   GEN_FW_RANGE(0xd900, 0xdbff, FORCEWAKE_BLITTER),
+   GEN_FW_RANGE(0xdc00, 0xefff, FORCEWAKE_RENDER),
+   GEN_FW_RANGE(0xf000, 0x147ff, FORCEWAKE_BLITTER),
+   GEN_FW_RANGE(0x14800, 0x1, FORCEWAKE_RENDER),
+   GEN_FW_RANGE(0x2, 0x20fff, FORCEWAKE_MEDIA_VDBOX0),
+   GEN_FW_RANGE(0x21000, 0x21fff, FORCEWAKE_MEDIA_VDBOX2),
+   GEN_FW_RANGE(0x22000, 0x23fff, FORCEWAKE_BLITTER),
+   GEN_FW_RANGE(0x24000, 0x2417f, 0),
+   GEN_FW_RANGE(0x24180, 0x249ff, FORCEWAKE_BLITTER),
+   GEN_FW_RANGE(0x24a00, 0x251ff, FORCEWAKE_RENDER),
+   GEN_FW_RANGE(0x25200, 0x255ff, FORCEWAKE_BLITTER),
+   GEN_FW_RANGE(0x25600, 0x2567f, FORCEWAKE_MEDIA_VDBOX0),
+   GEN_FW_RANGE(0x25680, 0x259ff, FORCEWAKE_MEDIA_VDBOX2),
+   GEN_FW_RANGE(0x25a00, 0x25a7f, FORCEWAKE_MEDIA_VDBOX0),
+   GEN_FW_RANGE(0x25a80, 0x2, FORCEWAKE_MEDIA_VDBOX2),
+   GEN_FW_RANGE(0x3, 0x3, FORCEWAKE_BLITTER),
GEN_FW_RANGE(0x4, 0x1b, 0),
GEN_FW_RANGE(0x1c, 0x1c3fff, FORCEWAKE_MEDIA_VDBOX0),
-   GEN_FW_RANGE(0x1c4000, 0x1c7fff, FORCEWAKE_MEDIA_VDBOX1),
+   GEN_FW_RANGE(0x1c4000, 0x1c7fff, 0),
GEN_FW_RANGE(0x1c8000, 0x1cbfff, FORCEWAKE_MEDIA_VEBOX0),
-   GEN_FW_RANGE(0x1cc000, 0x1c, FORCEWAKE_BLITTER),
+   GEN_FW_RANGE(0x1cc000, 0x1c, FORCEWAKE_MEDIA_VDBOX0),
GEN_FW_RANGE(0x1d, 0x1d3fff, FORCEWAKE_MEDI

[Intel-gfx] ✗ Fi.CI.IGT: failure for Allow privileged user to map the OA buffer

2020-10-02 Thread Patchwork
== Series Details ==

Series: Allow privileged user to map the OA buffer
URL   : https://patchwork.freedesktop.org/series/82353/
State : failure

== Summary ==

CI Bug Log - changes from CI_DRM_9093_full -> Patchwork_18618_full


Summary
---

  **FAILURE**

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

  

Possible new issues
---

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

### IGT changes ###

 Possible regressions 

  * igt@gem_userptr_blits@unsync-unmap-cycles:
- shard-skl:  [PASS][1] -> [TIMEOUT][2]
   [1]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9093/shard-skl6/igt@gem_userptr_bl...@unsync-unmap-cycles.html
   [2]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18618/shard-skl5/igt@gem_userptr_bl...@unsync-unmap-cycles.html

  * {igt@perf@triggered-oa-reports-paranoid-0} (NEW):
- shard-iclb: NOTRUN -> [TIMEOUT][3]
   [3]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18618/shard-iclb7/igt@p...@triggered-oa-reports-paranoid-0.html

  
New tests
-

  New tests have been introduced between CI_DRM_9093_full and 
Patchwork_18618_full:

### New IGT tests (10) ###

  * igt@perf@closed-fd-and-unmapped-access:
- Statuses : 7 pass(s) 1 skip(s)
- Exec time: [0.0, 0.34] s

  * igt@perf@invalid-map-oa-buffer:
- Statuses : 7 pass(s) 1 skip(s)
- Exec time: [0.0, 0.17] s

  * igt@perf@map-oa-buffer:
- Statuses : 6 pass(s) 1 skip(s)
- Exec time: [0.0, 0.18] s

  * igt@perf@non-privileged-access-vaddr:
- Statuses : 7 pass(s) 1 skip(s)
- Exec time: [0.0, 0.36] s

  * igt@perf@non-privileged-map-oa-buffer:
- Statuses : 7 pass(s) 1 skip(s)
- Exec time: [0.0, 0.24] s

  * igt@perf@oa-regs-not-whitelisted:
- Statuses : 6 pass(s) 2 skip(s)
- Exec time: [0.0, 0.24] s

  * igt@perf@oa-regs-whitelisted:
- Statuses : 6 pass(s) 2 skip(s)
- Exec time: [0.0, 0.25] s

  * igt@perf@privileged-forked-access-vaddr:
- Statuses : 7 pass(s) 1 skip(s)
- Exec time: [0.0, 0.35] s

  * igt@perf@triggered-oa-reports-paranoid-0:
- Statuses : 5 pass(s) 2 skip(s) 1 timeout(s)
- Exec time: [0.0, 171.21] s

  * igt@perf@triggered-oa-reports-paranoid-1:
- Statuses : 6 pass(s) 2 skip(s)
- Exec time: [0.0, 3.49] s

  

Known issues


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

### IGT changes ###

 Issues hit 

  * igt@gem_exec_fence@basic-wait@vecs0:
- shard-skl:  [PASS][4] -> [DMESG-WARN][5] ([i915#1982]) +38 
similar issues
   [4]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9093/shard-skl7/igt@gem_exec_fence@basic-w...@vecs0.html
   [5]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18618/shard-skl5/igt@gem_exec_fence@basic-w...@vecs0.html

  * igt@gem_exec_whisper@basic-normal-all:
- shard-glk:  [PASS][6] -> [DMESG-WARN][7] ([i915#118] / [i915#95])
   [6]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9093/shard-glk2/igt@gem_exec_whis...@basic-normal-all.html
   [7]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18618/shard-glk3/igt@gem_exec_whis...@basic-normal-all.html

  * igt@gem_userptr_blits@sync-unmap-cycles:
- shard-skl:  [PASS][8] -> [TIMEOUT][9] ([i915#2424])
   [8]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9093/shard-skl10/igt@gem_userptr_bl...@sync-unmap-cycles.html
   [9]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18618/shard-skl8/igt@gem_userptr_bl...@sync-unmap-cycles.html

  * igt@kms_cursor_legacy@flip-vs-cursor-legacy:
- shard-skl:  [PASS][10] -> [FAIL][11] ([i915#2346])
   [10]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9093/shard-skl2/igt@kms_cursor_leg...@flip-vs-cursor-legacy.html
   [11]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18618/shard-skl3/igt@kms_cursor_leg...@flip-vs-cursor-legacy.html

  * igt@kms_draw_crc@draw-method-rgb565-mmap-wc-untiled:
- shard-apl:  [PASS][12] -> [DMESG-WARN][13] ([i915#1635] / 
[i915#1982]) +1 similar issue
   [12]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9093/shard-apl3/igt@kms_draw_...@draw-method-rgb565-mmap-wc-untiled.html
   [13]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18618/shard-apl4/igt@kms_draw_...@draw-method-rgb565-mmap-wc-untiled.html

  * igt@kms_flip@2x-flip-vs-expired-vblank@ac-hdmi-a1-hdmi-a2:
- shard-glk:  [PASS][14] -> [FAIL][15] ([i915#79])
   [14]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9093/shard-glk1/igt@kms_flip@2x-flip-vs-expired-vbl...@ac-hdmi-a1-hdmi-a2.html
   [15]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchw

Re: [Intel-gfx] [PATCH 2/6] drm/i915/gt: Lock intel_engine_apply_whitelist with uncore->lock

2020-10-02 Thread kernel test robot
Hi Umesh,

Thank you for the patch! Perhaps something to improve:

[auto build test WARNING on drm-intel/for-linux-next]
[also build test WARNING on drm-tip/drm-tip linus/master v5.9-rc7 next-20201002]
[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/Umesh-Nerlige-Ramappa/Allow-privileged-user-to-map-the-OA-buffer/20201003-073003
base:   git://anongit.freedesktop.org/drm-intel for-linux-next
config: x86_64-allyesconfig (attached as .config)
compiler: gcc-9 (Debian 9.3.0-15) 9.3.0
reproduce (this is a W=1 build):
# 
https://github.com/0day-ci/linux/commit/d8a4c73d3c843dd6cb5bb248a90e5b4e0b28953c
git remote add linux-review https://github.com/0day-ci/linux
git fetch --no-tags linux-review 
Umesh-Nerlige-Ramappa/Allow-privileged-user-to-map-the-OA-buffer/20201003-073003
git checkout d8a4c73d3c843dd6cb5bb248a90e5b4e0b28953c
# save the attached .config to linux build tree
make W=1 ARCH=x86_64 

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/gt/intel_workarounds.c:1648:6: warning: no previous 
>> prototype for 'intel_engine_apply_whitelist_locked' [-Wmissing-prototypes]
1648 | void intel_engine_apply_whitelist_locked(struct intel_engine_cs 
*engine)
 |  ^~~

vim +/intel_engine_apply_whitelist_locked +1648 
drivers/gpu/drm/i915/gt/intel_workarounds.c

  1647  
> 1648  void intel_engine_apply_whitelist_locked(struct intel_engine_cs *engine)
  1649  {
  1650  const struct i915_wa_list *wal = &engine->whitelist;
  1651  struct intel_uncore *uncore = engine->uncore;
  1652  const u32 base = engine->mmio_base;
  1653  struct i915_wa *wa;
  1654  unsigned int i;
  1655  enum forcewake_domains fw;
  1656  
  1657  lockdep_assert_held(&uncore->lock);
  1658  
  1659  fw = wal_get_fw(uncore, wal, FW_REG_WRITE);
  1660  intel_uncore_forcewake_get__locked(uncore, fw);
  1661  
  1662  for (i = 0, wa = wal->list; i < wal->count; i++, wa++)
  1663  intel_uncore_write_fw(uncore,
  1664RING_FORCE_TO_NONPRIV(base, i),
  1665i915_mmio_reg_offset(wa->reg));
  1666  
  1667  /* And clear the rest just in case of garbage */
  1668  for (; i < RING_MAX_NONPRIV_SLOTS; i++)
  1669  intel_uncore_write_fw(uncore,
  1670RING_FORCE_TO_NONPRIV(base, i),
  1671
i915_mmio_reg_offset(RING_NOPID(base)));
  1672  
  1673  intel_uncore_forcewake_put__locked(uncore, fw);
  1674  }
  1675  

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-...@lists.01.org


.config.gz
Description: application/gzip
___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx


[Intel-gfx] ✓ Fi.CI.BAT: success for drm/i915/tgl: Fix Combo PHY DPLL fractional divider for 38.4MHz ref clock (rev3)

2020-10-02 Thread Patchwork
== Series Details ==

Series: drm/i915/tgl: Fix Combo PHY DPLL fractional divider for 38.4MHz ref 
clock (rev3)
URL   : https://patchwork.freedesktop.org/series/82173/
State : success

== Summary ==

CI Bug Log - changes from CI_DRM_9093 -> Patchwork_18620


Summary
---

  **SUCCESS**

  No regressions found.

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

Known issues


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

### IGT changes ###

 Issues hit 

  * igt@i915_pm_rpm@basic-pci-d3-state:
- fi-bsw-kefka:   [PASS][1] -> [DMESG-WARN][2] ([i915#1982])
   [1]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9093/fi-bsw-kefka/igt@i915_pm_...@basic-pci-d3-state.html
   [2]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18620/fi-bsw-kefka/igt@i915_pm_...@basic-pci-d3-state.html

  * igt@i915_pm_rpm@module-reload:
- fi-apl-guc: [PASS][3] -> [DMESG-WARN][4] ([i915#1635] / 
[i915#1982])
   [3]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9093/fi-apl-guc/igt@i915_pm_...@module-reload.html
   [4]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18620/fi-apl-guc/igt@i915_pm_...@module-reload.html

  * igt@kms_cursor_legacy@basic-busy-flip-before-cursor-atomic:
- fi-byt-j1900:   [PASS][5] -> [DMESG-WARN][6] ([i915#1982]) +1 similar 
issue
   [5]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9093/fi-byt-j1900/igt@kms_cursor_leg...@basic-busy-flip-before-cursor-atomic.html
   [6]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18620/fi-byt-j1900/igt@kms_cursor_leg...@basic-busy-flip-before-cursor-atomic.html

  
 Possible fixes 

  * igt@i915_module_load@reload:
- {fi-tgl-dsi}:   [DMESG-WARN][7] ([i915#1982] / [k.org#205379]) -> 
[PASS][8]
   [7]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9093/fi-tgl-dsi/igt@i915_module_l...@reload.html
   [8]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18620/fi-tgl-dsi/igt@i915_module_l...@reload.html

  
 Warnings 

  * igt@gem_exec_suspend@basic-s0:
- fi-kbl-x1275:   [DMESG-WARN][9] ([i915#62] / [i915#92] / [i915#95]) 
-> [DMESG-WARN][10] ([i915#62] / [i915#92]) +1 similar issue
   [9]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9093/fi-kbl-x1275/igt@gem_exec_susp...@basic-s0.html
   [10]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18620/fi-kbl-x1275/igt@gem_exec_susp...@basic-s0.html

  * igt@i915_pm_rpm@basic-rte:
- fi-kbl-guc: [DMESG-FAIL][11] ([i915#2203]) -> [SKIP][12] 
([fdo#109271])
   [11]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9093/fi-kbl-guc/igt@i915_pm_...@basic-rte.html
   [12]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18620/fi-kbl-guc/igt@i915_pm_...@basic-rte.html

  * igt@kms_force_connector_basic@prune-stale-modes:
- fi-kbl-x1275:   [DMESG-WARN][13] ([i915#62] / [i915#92]) -> 
[DMESG-WARN][14] ([i915#62] / [i915#92] / [i915#95]) +3 similar issues
   [13]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9093/fi-kbl-x1275/igt@kms_force_connector_ba...@prune-stale-modes.html
   [14]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18620/fi-kbl-x1275/igt@kms_force_connector_ba...@prune-stale-modes.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
  [i915#1635]: https://gitlab.freedesktop.org/drm/intel/issues/1635
  [i915#1982]: https://gitlab.freedesktop.org/drm/intel/issues/1982
  [i915#2203]: https://gitlab.freedesktop.org/drm/intel/issues/2203
  [i915#2411]: https://gitlab.freedesktop.org/drm/intel/issues/2411
  [i915#62]: https://gitlab.freedesktop.org/drm/intel/issues/62
  [i915#92]: https://gitlab.freedesktop.org/drm/intel/issues/92
  [i915#95]: https://gitlab.freedesktop.org/drm/intel/issues/95
  [k.org#205379]: https://bugzilla.kernel.org/show_bug.cgi?id=205379


Participating hosts (45 -> 39)
--

  Missing(6): fi-ilk-m540 fi-hsw-4200u fi-byt-squawks fi-bsw-cyan 
fi-byt-clapper fi-bdw-samus 


Build changes
-

  * Linux: CI_DRM_9093 -> Patchwork_18620

  CI-20190529: 20190529
  CI_DRM_9093: 827ebff930c6340ed1c1c274909717525951c496 @ 
git://anongit.freedesktop.org/gfx-ci/linux
  IGT_5798: 430bad5a53c08125fbd48978ed6a66f61a33a40b @ 
git://anongit.freedesktop.org/xorg/app/intel-gpu-tools
  Patchwork_18620: 77fe9153f15371efa976b7ebdb10e9a1df31054e @ 
git://anongit.freedesktop.org/gfx-ci/linux


== Linux commits ==

77fe9153f153 drm/i915/tgl: Fix Combo PHY DPLL fractional divider for 38.4MHz 
ref clock
5eca404d0060 drm/i915: Add an encoder hook to sanitize its state during 
init/resume
9f4fedb1 drm/i915: Check for unsupported DP link rates during initial commit
94f36ee39ef6 drm/i915: Move the initial fastset commit check to encoder hooks
f0622b2

[Intel-gfx] ✗ Fi.CI.SPARSE: warning for drm/i915/tgl: Fix Combo PHY DPLL fractional divider for 38.4MHz ref clock (rev3)

2020-10-02 Thread Patchwork
== Series Details ==

Series: drm/i915/tgl: Fix Combo PHY DPLL fractional divider for 38.4MHz ref 
clock (rev3)
URL   : https://patchwork.freedesktop.org/series/82173/
State : warning

== Summary ==

$ dim sparse --fast origin/drm-tip
Sparse version: v0.6.2
Fast mode used, each commit won't be checked separately.
-
+drivers/gpu/drm/i915/gt/intel_reset.c:1312:5: warning: context imbalance in 
'intel_gt_reset_trylock' - different lock contexts for basic block
+drivers/gpu/drm/i915/gvt/mmio.c:290:23: warning: memcpy with byte count of 
279040
+drivers/gpu/drm/i915/i915_perf.c:1440:15: warning: memset with byte count of 
16777216
+drivers/gpu/drm/i915/i915_perf.c:1494:15: warning: memset with byte count of 
16777216
+./include/linux/seqlock.h:752:24: warning: trying to copy expression type 31
+./include/linux/seqlock.h:778:16: warning: trying to copy expression type 31
+./include/linux/spinlock.h:409:9: warning: context imbalance in 
'fwtable_read16' - different lock contexts for basic block
+./include/linux/spinlock.h:409:9: warning: context imbalance in 
'fwtable_read32' - different lock contexts for basic block
+./include/linux/spinlock.h:409:9: warning: context imbalance in 
'fwtable_read64' - different lock contexts for basic block
+./include/linux/spinlock.h:409:9: warning: context imbalance in 
'fwtable_read8' - different lock contexts for basic block
+./include/linux/spinlock.h:409:9: warning: context imbalance in 
'fwtable_write16' - different lock contexts for basic block
+./include/linux/spinlock.h:409:9: warning: context imbalance in 
'fwtable_write32' - different lock contexts for basic block
+./include/linux/spinlock.h:409:9: warning: context imbalance in 
'fwtable_write8' - different lock contexts for basic block
+./include/linux/spinlock.h:409:9: warning: context imbalance in 
'gen11_fwtable_read16' - different lock contexts for basic block
+./include/linux/spinlock.h:409:9: warning: context imbalance in 
'gen11_fwtable_read32' - different lock contexts for basic block
+./include/linux/spinlock.h:409:9: warning: context imbalance in 
'gen11_fwtable_read64' - different lock contexts for basic block
+./include/linux/spinlock.h:409:9: warning: context imbalance in 
'gen11_fwtable_read8' - different lock contexts for basic block
+./include/linux/spinlock.h:409:9: warning: context imbalance in 
'gen11_fwtable_write16' - different lock contexts for basic block
+./include/linux/spinlock.h:409:9: warning: context imbalance in 
'gen11_fwtable_write32' - different lock contexts for basic block
+./include/linux/spinlock.h:409:9: warning: context imbalance in 
'gen11_fwtable_write8' - different lock contexts for basic block
+./include/linux/spinlock.h:409:9: warning: context imbalance in 
'gen12_fwtable_read16' - different lock contexts for basic block
+./include/linux/spinlock.h:409:9: warning: context imbalance in 
'gen12_fwtable_read32' - different lock contexts for basic block
+./include/linux/spinlock.h:409:9: warning: context imbalance in 
'gen12_fwtable_read64' - different lock contexts for basic block
+./include/linux/spinlock.h:409:9: warning: context imbalance in 
'gen12_fwtable_read8' - different lock contexts for basic block
+./include/linux/spinlock.h:409:9: warning: context imbalance in 
'gen12_fwtable_write16' - different lock contexts for basic block
+./include/linux/spinlock.h:409:9: warning: context imbalance in 
'gen12_fwtable_write32' - different lock contexts for basic block
+./include/linux/spinlock.h:409:9: warning: context imbalance in 
'gen12_fwtable_write8' - different lock contexts for basic block
+./include/linux/spinlock.h:409:9: warning: context imbalance in 'gen6_read16' 
- different lock contexts for basic block
+./include/linux/spinlock.h:409:9: warning: context imbalance in 'gen6_read32' 
- different lock contexts for basic block
+./include/linux/spinlock.h:409:9: warning: context imbalance in 'gen6_read64' 
- different lock contexts for basic block
+./include/linux/spinlock.h:409:9: warning: context imbalance in 'gen6_read8' - 
different lock contexts for basic block
+./include/linux/spinlock.h:409:9: warning: context imbalance in 'gen6_write16' 
- different lock contexts for basic block
+./include/linux/spinlock.h:409:9: warning: context imbalance in 'gen6_write32' 
- different lock contexts for basic block
+./include/linux/spinlock.h:409:9: warning: context imbalance in 'gen6_write8' 
- different lock contexts for basic block
+./include/linux/spinlock.h:409:9: warning: context imbalance in 'gen8_write16' 
- different lock contexts for basic block
+./include/linux/spinlock.h:409:9: warning: context imbalance in 'gen8_write32' 
- different lock contexts for basic block
+./include/linux/spinlock.h:409:9: warning: context imbalance in 'gen8_write8' 
- different lock contexts for basic block


___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx


[Intel-gfx] ✗ Fi.CI.IGT: failure for drm/i915/tgl/psr: Fix glitches when doing frontbuffer modifications

2020-10-02 Thread Patchwork
== Series Details ==

Series: drm/i915/tgl/psr: Fix glitches when doing frontbuffer modifications
URL   : https://patchwork.freedesktop.org/series/82351/
State : failure

== Summary ==

CI Bug Log - changes from CI_DRM_9093_full -> Patchwork_18617_full


Summary
---

  **FAILURE**

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

  

Possible new issues
---

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

### IGT changes ###

 Possible regressions 

  * igt@gem_userptr_blits@unsync-unmap-cycles:
- shard-skl:  [PASS][1] -> [TIMEOUT][2]
   [1]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9093/shard-skl6/igt@gem_userptr_bl...@unsync-unmap-cycles.html
   [2]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18617/shard-skl2/igt@gem_userptr_bl...@unsync-unmap-cycles.html

  * igt@kms_cursor_edge_walk@pipe-c-64x64-right-edge:
- shard-hsw:  [PASS][3] -> [INCOMPLETE][4]
   [3]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9093/shard-hsw4/igt@kms_cursor_edge_w...@pipe-c-64x64-right-edge.html
   [4]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18617/shard-hsw2/igt@kms_cursor_edge_w...@pipe-c-64x64-right-edge.html

  * igt@kms_cursor_legacy@all-pipes-forked-bo:
- shard-tglb: [PASS][5] -> [INCOMPLETE][6]
   [5]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9093/shard-tglb6/igt@kms_cursor_leg...@all-pipes-forked-bo.html
   [6]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18617/shard-tglb7/igt@kms_cursor_leg...@all-pipes-forked-bo.html

  * igt@kms_psr2_su@frontbuffer:
- shard-tglb: [PASS][7] -> [FAIL][8] +1 similar issue
   [7]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9093/shard-tglb7/igt@kms_psr2...@frontbuffer.html
   [8]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18617/shard-tglb8/igt@kms_psr2...@frontbuffer.html

  
 Suppressed 

  The following results come from untrusted machines, tests, or statuses.
  They do not affect the overall result.

  * {igt@kms_async_flips@test-time-stamp}:
- shard-tglb: [PASS][9] -> [FAIL][10]
   [9]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9093/shard-tglb5/igt@kms_async_fl...@test-time-stamp.html
   [10]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18617/shard-tglb8/igt@kms_async_fl...@test-time-stamp.html

  
Known issues


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

### IGT changes ###

 Issues hit 

  * igt@gem_exec_create@madvise:
- shard-glk:  [PASS][11] -> [DMESG-WARN][12] ([i915#118] / 
[i915#95])
   [11]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9093/shard-glk1/igt@gem_exec_cre...@madvise.html
   [12]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18617/shard-glk6/igt@gem_exec_cre...@madvise.html

  * igt@i915_pm_rc6_residency@rc6-idle:
- shard-hsw:  [PASS][13] -> [FAIL][14] ([i915#1860])
   [13]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9093/shard-hsw7/igt@i915_pm_rc6_reside...@rc6-idle.html
   [14]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18617/shard-hsw6/igt@i915_pm_rc6_reside...@rc6-idle.html

  * igt@kms_cursor_crc@pipe-b-cursor-suspend:
- shard-skl:  [PASS][15] -> [INCOMPLETE][16] ([i915#300])
   [15]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9093/shard-skl5/igt@kms_cursor_...@pipe-b-cursor-suspend.html
   [16]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18617/shard-skl8/igt@kms_cursor_...@pipe-b-cursor-suspend.html

  * igt@kms_cursor_legacy@flip-vs-cursor-atomic:
- shard-tglb: [PASS][17] -> [FAIL][18] ([i915#2346]) +3 similar 
issues
   [17]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9093/shard-tglb7/igt@kms_cursor_leg...@flip-vs-cursor-atomic.html
   [18]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18617/shard-tglb6/igt@kms_cursor_leg...@flip-vs-cursor-atomic.html

  * igt@kms_cursor_legacy@flip-vs-cursor-busy-crc-atomic:
- shard-kbl:  [PASS][19] -> [DMESG-WARN][20] ([i915#1982])
   [19]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9093/shard-kbl6/igt@kms_cursor_leg...@flip-vs-cursor-busy-crc-atomic.html
   [20]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18617/shard-kbl6/igt@kms_cursor_leg...@flip-vs-cursor-busy-crc-atomic.html

  * igt@kms_draw_crc@draw-method-xrgb2101010-mmap-wc-untiled:
- shard-apl:  [PASS][21] -> [DMESG-WARN][22] ([i915#1635] / 
[i915#1982])
   [21]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9093/shard-apl7/igt@kms_draw_...@draw-method-xrgb2101010-mmap-wc-untiled.html
   [22]: 
https://intel-gfx-ci

[Intel-gfx] [PATCH v2 2/5] drm/i915: Move the initial fastset commit check to encoder hooks

2020-10-02 Thread Imre Deak
Move the checks to decide whether a fastset is possible during the
initial commit to an encoder hook. This check is really encoder specific
and the next patch will also require this adding a DP encoder specific
check.

v2: Fix negated condition in gen11_dsi_initial_fastset_check().

Cc: Ville Syrjälä 
Signed-off-by: Imre Deak 
---
 drivers/gpu/drm/i915/display/icl_dsi.c| 14 +
 drivers/gpu/drm/i915/display/intel_ddi.c  | 10 +++
 drivers/gpu/drm/i915/display/intel_display.c  | 29 +--
 .../drm/i915/display/intel_display_types.h|  8 +
 drivers/gpu/drm/i915/display/intel_dp.c   | 22 ++
 drivers/gpu/drm/i915/display/intel_dp.h   |  3 ++
 drivers/gpu/drm/i915/display/intel_dp_mst.c   | 10 +++
 7 files changed, 80 insertions(+), 16 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/icl_dsi.c 
b/drivers/gpu/drm/i915/display/icl_dsi.c
index fe946a2e2082..4400e83f783f 100644
--- a/drivers/gpu/drm/i915/display/icl_dsi.c
+++ b/drivers/gpu/drm/i915/display/icl_dsi.c
@@ -1668,6 +1668,19 @@ static bool gen11_dsi_get_hw_state(struct intel_encoder 
*encoder,
return ret;
 }
 
+static bool gen11_dsi_initial_fastset_check(struct intel_encoder *encoder,
+   struct intel_crtc_state *crtc_state)
+{
+   if (crtc_state->dsc.compression_enable) {
+   drm_dbg_kms(encoder->base.dev, "Forcing full modeset due to DSC 
being enabled\n");
+   crtc_state->uapi.mode_changed = true;
+
+   return false;
+   }
+
+   return true;
+}
+
 static void gen11_dsi_encoder_destroy(struct drm_encoder *encoder)
 {
intel_encoder_destroy(encoder);
@@ -1923,6 +1936,7 @@ void icl_dsi_init(struct drm_i915_private *dev_priv)
encoder->update_pipe = intel_panel_update_backlight;
encoder->compute_config = gen11_dsi_compute_config;
encoder->get_hw_state = gen11_dsi_get_hw_state;
+   encoder->initial_fastset_check = gen11_dsi_initial_fastset_check;
encoder->type = INTEL_OUTPUT_DSI;
encoder->cloneable = 0;
encoder->pipe_mask = ~0;
diff --git a/drivers/gpu/drm/i915/display/intel_ddi.c 
b/drivers/gpu/drm/i915/display/intel_ddi.c
index b4c520348b3b..4e54c55ec99f 100644
--- a/drivers/gpu/drm/i915/display/intel_ddi.c
+++ b/drivers/gpu/drm/i915/display/intel_ddi.c
@@ -4564,6 +4564,15 @@ void intel_ddi_get_config(struct intel_encoder *encoder,
intel_read_dp_sdp(encoder, pipe_config, DP_SDP_VSC);
 }
 
+static bool intel_ddi_initial_fastset_check(struct intel_encoder *encoder,
+   struct intel_crtc_state *crtc_state)
+{
+   if (intel_crtc_has_dp_encoder(crtc_state))
+   return intel_dp_initial_fastset_check(encoder, crtc_state);
+
+   return true;
+}
+
 static enum intel_output_type
 intel_ddi_compute_output_type(struct intel_encoder *encoder,
  struct intel_crtc_state *crtc_state,
@@ -5173,6 +5182,7 @@ void intel_ddi_init(struct drm_i915_private *dev_priv, 
enum port port)
encoder->update_pipe = intel_ddi_update_pipe;
encoder->get_hw_state = intel_ddi_get_hw_state;
encoder->get_config = intel_ddi_get_config;
+   encoder->initial_fastset_check = intel_ddi_initial_fastset_check;
encoder->suspend = intel_dp_encoder_suspend;
encoder->get_power_domains = intel_ddi_get_power_domains;
 
diff --git a/drivers/gpu/drm/i915/display/intel_display.c 
b/drivers/gpu/drm/i915/display/intel_display.c
index 753f202ef6a0..31be63225b10 100644
--- a/drivers/gpu/drm/i915/display/intel_display.c
+++ b/drivers/gpu/drm/i915/display/intel_display.c
@@ -17951,6 +17951,8 @@ static int intel_initial_commit(struct drm_device *dev)
}
 
if (crtc_state->hw.active) {
+   struct intel_encoder *encoder;
+
/*
 * We've not yet detected sink capabilities
 * (audio,infoframes,etc.) and thus we don't want to
@@ -17972,22 +17974,17 @@ static int intel_initial_commit(struct drm_device 
*dev)
 */
crtc_state->uapi.color_mgmt_changed = true;
 
-   /*
-* FIXME hack to force full modeset when DSC is being
-* used.
-*
-* As long as we do not have full state readout and
-* config comparison of crtc_state->dsc, we have no way
-* to ensure reliable fastset. Remove once we have
-* readout for DSC.
-*/
-   if (crtc_state->dsc.compression_enable) {
-   ret = drm_atomic_add_affected_connectors(state,
-
&crtc->base);
-   if (ret)
-   

[Intel-gfx] ✓ Fi.CI.BAT: success for drm/i915/tgl: Fix Combo PHY DPLL fractional divider for 38.4MHz ref clock (rev2)

2020-10-02 Thread Patchwork
== Series Details ==

Series: drm/i915/tgl: Fix Combo PHY DPLL fractional divider for 38.4MHz ref 
clock (rev2)
URL   : https://patchwork.freedesktop.org/series/82173/
State : success

== Summary ==

CI Bug Log - changes from CI_DRM_9093 -> Patchwork_18619


Summary
---

  **SUCCESS**

  No regressions found.

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

Known issues


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

### CI changes ###


### IGT changes ###

 Issues hit 

  * igt@i915_module_load@reload:
- fi-byt-j1900:   [PASS][1] -> [DMESG-WARN][2] ([i915#1982])
   [1]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9093/fi-byt-j1900/igt@i915_module_l...@reload.html
   [2]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18619/fi-byt-j1900/igt@i915_module_l...@reload.html

  * igt@i915_pm_rpm@basic-pci-d3-state:
- fi-bsw-kefka:   [PASS][3] -> [DMESG-WARN][4] ([i915#1982])
   [3]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9093/fi-bsw-kefka/igt@i915_pm_...@basic-pci-d3-state.html
   [4]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18619/fi-bsw-kefka/igt@i915_pm_...@basic-pci-d3-state.html

  * igt@kms_cursor_legacy@basic-busy-flip-before-cursor-atomic:
- fi-icl-u2:  [PASS][5] -> [DMESG-WARN][6] ([i915#1982])
   [5]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9093/fi-icl-u2/igt@kms_cursor_leg...@basic-busy-flip-before-cursor-atomic.html
   [6]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18619/fi-icl-u2/igt@kms_cursor_leg...@basic-busy-flip-before-cursor-atomic.html

  
 Warnings 

  * igt@i915_pm_rpm@basic-rte:
- fi-kbl-guc: [DMESG-FAIL][7] ([i915#2203]) -> [SKIP][8] 
([fdo#109271])
   [7]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9093/fi-kbl-guc/igt@i915_pm_...@basic-rte.html
   [8]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18619/fi-kbl-guc/igt@i915_pm_...@basic-rte.html

  * igt@kms_force_connector_basic@prune-stale-modes:
- fi-kbl-x1275:   [DMESG-WARN][9] ([i915#62] / [i915#92]) -> 
[DMESG-WARN][10] ([i915#62] / [i915#92] / [i915#95]) +6 similar issues
   [9]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9093/fi-kbl-x1275/igt@kms_force_connector_ba...@prune-stale-modes.html
   [10]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18619/fi-kbl-x1275/igt@kms_force_connector_ba...@prune-stale-modes.html

  * igt@prime_vgem@basic-fence-flip:
- fi-kbl-x1275:   [DMESG-WARN][11] ([i915#62] / [i915#92] / [i915#95]) 
-> [DMESG-WARN][12] ([i915#62] / [i915#92]) +1 similar issue
   [11]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9093/fi-kbl-x1275/igt@prime_v...@basic-fence-flip.html
   [12]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18619/fi-kbl-x1275/igt@prime_v...@basic-fence-flip.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
  [i915#1982]: https://gitlab.freedesktop.org/drm/intel/issues/1982
  [i915#2203]: https://gitlab.freedesktop.org/drm/intel/issues/2203
  [i915#2448]: https://gitlab.freedesktop.org/drm/intel/issues/2448
  [i915#62]: https://gitlab.freedesktop.org/drm/intel/issues/62
  [i915#92]: https://gitlab.freedesktop.org/drm/intel/issues/92
  [i915#95]: https://gitlab.freedesktop.org/drm/intel/issues/95


Participating hosts (45 -> 39)
--

  Missing(6): fi-ilk-m540 fi-hsw-4200u fi-byt-squawks fi-bsw-cyan 
fi-byt-clapper fi-bdw-samus 


Build changes
-

  * Linux: CI_DRM_9093 -> Patchwork_18619

  CI-20190529: 20190529
  CI_DRM_9093: 827ebff930c6340ed1c1c274909717525951c496 @ 
git://anongit.freedesktop.org/gfx-ci/linux
  IGT_5798: 430bad5a53c08125fbd48978ed6a66f61a33a40b @ 
git://anongit.freedesktop.org/xorg/app/intel-gpu-tools
  Patchwork_18619: 1f86980be6c9f250cace3c634b8f62a9fcc4d57b @ 
git://anongit.freedesktop.org/gfx-ci/linux


== Linux commits ==

1f86980be6c9 drm/i915/tgl: Fix Combo PHY DPLL fractional divider for 38.4MHz 
ref clock
57989410859f drm/i915: Add an encoder hook to sanitize its state during 
init/resume
a5fbed9f3baa drm/i915: Check for unsupported DP link rates during initial commit
275ab3d8d970 drm/i915: Move the initial fastset commit check to encoder hooks
056e9d5d8a88 drm/i915/skl: Work around incorrect BIOS WRPLL PDIV programming

== Logs ==

For more details see: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18619/index.html
___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx


[Intel-gfx] ✗ Fi.CI.SPARSE: warning for drm/i915/tgl: Fix Combo PHY DPLL fractional divider for 38.4MHz ref clock (rev2)

2020-10-02 Thread Patchwork
== Series Details ==

Series: drm/i915/tgl: Fix Combo PHY DPLL fractional divider for 38.4MHz ref 
clock (rev2)
URL   : https://patchwork.freedesktop.org/series/82173/
State : warning

== Summary ==

$ dim sparse --fast origin/drm-tip
Sparse version: v0.6.2
Fast mode used, each commit won't be checked separately.
-
+drivers/gpu/drm/i915/gt/intel_reset.c:1312:5: warning: context imbalance in 
'intel_gt_reset_trylock' - different lock contexts for basic block
+drivers/gpu/drm/i915/gvt/mmio.c:290:23: warning: memcpy with byte count of 
279040
+drivers/gpu/drm/i915/i915_perf.c:1440:15: warning: memset with byte count of 
16777216
+drivers/gpu/drm/i915/i915_perf.c:1494:15: warning: memset with byte count of 
16777216
+./include/linux/seqlock.h:752:24: warning: trying to copy expression type 31
+./include/linux/seqlock.h:778:16: warning: trying to copy expression type 31
+./include/linux/spinlock.h:409:9: warning: context imbalance in 
'fwtable_read16' - different lock contexts for basic block
+./include/linux/spinlock.h:409:9: warning: context imbalance in 
'fwtable_read32' - different lock contexts for basic block
+./include/linux/spinlock.h:409:9: warning: context imbalance in 
'fwtable_read64' - different lock contexts for basic block
+./include/linux/spinlock.h:409:9: warning: context imbalance in 
'fwtable_read8' - different lock contexts for basic block
+./include/linux/spinlock.h:409:9: warning: context imbalance in 
'fwtable_write16' - different lock contexts for basic block
+./include/linux/spinlock.h:409:9: warning: context imbalance in 
'fwtable_write32' - different lock contexts for basic block
+./include/linux/spinlock.h:409:9: warning: context imbalance in 
'fwtable_write8' - different lock contexts for basic block
+./include/linux/spinlock.h:409:9: warning: context imbalance in 
'gen11_fwtable_read16' - different lock contexts for basic block
+./include/linux/spinlock.h:409:9: warning: context imbalance in 
'gen11_fwtable_read32' - different lock contexts for basic block
+./include/linux/spinlock.h:409:9: warning: context imbalance in 
'gen11_fwtable_read64' - different lock contexts for basic block
+./include/linux/spinlock.h:409:9: warning: context imbalance in 
'gen11_fwtable_read8' - different lock contexts for basic block
+./include/linux/spinlock.h:409:9: warning: context imbalance in 
'gen11_fwtable_write16' - different lock contexts for basic block
+./include/linux/spinlock.h:409:9: warning: context imbalance in 
'gen11_fwtable_write32' - different lock contexts for basic block
+./include/linux/spinlock.h:409:9: warning: context imbalance in 
'gen11_fwtable_write8' - different lock contexts for basic block
+./include/linux/spinlock.h:409:9: warning: context imbalance in 
'gen12_fwtable_read16' - different lock contexts for basic block
+./include/linux/spinlock.h:409:9: warning: context imbalance in 
'gen12_fwtable_read32' - different lock contexts for basic block
+./include/linux/spinlock.h:409:9: warning: context imbalance in 
'gen12_fwtable_read64' - different lock contexts for basic block
+./include/linux/spinlock.h:409:9: warning: context imbalance in 
'gen12_fwtable_read8' - different lock contexts for basic block
+./include/linux/spinlock.h:409:9: warning: context imbalance in 
'gen12_fwtable_write16' - different lock contexts for basic block
+./include/linux/spinlock.h:409:9: warning: context imbalance in 
'gen12_fwtable_write32' - different lock contexts for basic block
+./include/linux/spinlock.h:409:9: warning: context imbalance in 
'gen12_fwtable_write8' - different lock contexts for basic block
+./include/linux/spinlock.h:409:9: warning: context imbalance in 'gen6_read16' 
- different lock contexts for basic block
+./include/linux/spinlock.h:409:9: warning: context imbalance in 'gen6_read32' 
- different lock contexts for basic block
+./include/linux/spinlock.h:409:9: warning: context imbalance in 'gen6_read64' 
- different lock contexts for basic block
+./include/linux/spinlock.h:409:9: warning: context imbalance in 'gen6_read8' - 
different lock contexts for basic block
+./include/linux/spinlock.h:409:9: warning: context imbalance in 'gen6_write16' 
- different lock contexts for basic block
+./include/linux/spinlock.h:409:9: warning: context imbalance in 'gen6_write32' 
- different lock contexts for basic block
+./include/linux/spinlock.h:409:9: warning: context imbalance in 'gen6_write8' 
- different lock contexts for basic block
+./include/linux/spinlock.h:409:9: warning: context imbalance in 'gen8_write16' 
- different lock contexts for basic block
+./include/linux/spinlock.h:409:9: warning: context imbalance in 'gen8_write32' 
- different lock contexts for basic block
+./include/linux/spinlock.h:409:9: warning: context imbalance in 'gen8_write8' 
- different lock contexts for basic block


___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx


[Intel-gfx] ✓ Fi.CI.BAT: success for Allow privileged user to map the OA buffer

2020-10-02 Thread Patchwork
== Series Details ==

Series: Allow privileged user to map the OA buffer
URL   : https://patchwork.freedesktop.org/series/82353/
State : success

== Summary ==

CI Bug Log - changes from CI_DRM_9093 -> Patchwork_18618


Summary
---

  **SUCCESS**

  No regressions found.

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

Known issues


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

### IGT changes ###

 Issues hit 

  * igt@i915_module_load@reload:
- fi-apl-guc: [PASS][1] -> [DMESG-WARN][2] ([i915#1635] / 
[i915#1982])
   [1]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9093/fi-apl-guc/igt@i915_module_l...@reload.html
   [2]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18618/fi-apl-guc/igt@i915_module_l...@reload.html

  * igt@i915_pm_rpm@basic-pci-d3-state:
- fi-bsw-kefka:   [PASS][3] -> [DMESG-WARN][4] ([i915#1982])
   [3]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9093/fi-bsw-kefka/igt@i915_pm_...@basic-pci-d3-state.html
   [4]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18618/fi-bsw-kefka/igt@i915_pm_...@basic-pci-d3-state.html

  * igt@kms_chamelium@hdmi-crc-fast:
- fi-kbl-7500u:   [PASS][5] -> [DMESG-WARN][6] ([i915#2203])
   [5]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9093/fi-kbl-7500u/igt@kms_chamel...@hdmi-crc-fast.html
   [6]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18618/fi-kbl-7500u/igt@kms_chamel...@hdmi-crc-fast.html

  
 Possible fixes 

  * igt@i915_module_load@reload:
- {fi-tgl-dsi}:   [DMESG-WARN][7] ([i915#1982] / [k.org#205379]) -> 
[PASS][8]
   [7]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9093/fi-tgl-dsi/igt@i915_module_l...@reload.html
   [8]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18618/fi-tgl-dsi/igt@i915_module_l...@reload.html

  * igt@kms_cursor_legacy@basic-busy-flip-before-cursor-atomic:
- {fi-kbl-7560u}: [DMESG-WARN][9] ([i915#1982]) -> [PASS][10]
   [9]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9093/fi-kbl-7560u/igt@kms_cursor_leg...@basic-busy-flip-before-cursor-atomic.html
   [10]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18618/fi-kbl-7560u/igt@kms_cursor_leg...@basic-busy-flip-before-cursor-atomic.html

  * igt@vgem_basic@unload:
- fi-skl-guc: [DMESG-WARN][11] ([i915#2203]) -> [PASS][12]
   [11]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9093/fi-skl-guc/igt@vgem_ba...@unload.html
   [12]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18618/fi-skl-guc/igt@vgem_ba...@unload.html
- fi-kbl-x1275:   [DMESG-WARN][13] ([i915#62] / [i915#92] / [i915#95]) 
-> [PASS][14]
   [13]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9093/fi-kbl-x1275/igt@vgem_ba...@unload.html
   [14]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18618/fi-kbl-x1275/igt@vgem_ba...@unload.html

  
 Warnings 

  * igt@gem_exec_suspend@basic-s0:
- fi-kbl-x1275:   [DMESG-WARN][15] ([i915#62] / [i915#92] / [i915#95]) 
-> [DMESG-WARN][16] ([i915#1982] / [i915#62] / [i915#92] / [i915#95])
   [15]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9093/fi-kbl-x1275/igt@gem_exec_susp...@basic-s0.html
   [16]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18618/fi-kbl-x1275/igt@gem_exec_susp...@basic-s0.html

  * igt@gem_exec_suspend@basic-s3:
- fi-kbl-x1275:   [DMESG-WARN][17] ([i915#62] / [i915#92]) -> 
[DMESG-WARN][18] ([i915#62] / [i915#92] / [i915#95]) +2 similar issues
   [17]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9093/fi-kbl-x1275/igt@gem_exec_susp...@basic-s3.html
   [18]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18618/fi-kbl-x1275/igt@gem_exec_susp...@basic-s3.html

  * igt@i915_pm_rpm@basic-rte:
- fi-kbl-guc: [DMESG-FAIL][19] ([i915#2203]) -> [SKIP][20] 
([fdo#109271])
   [19]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9093/fi-kbl-guc/igt@i915_pm_...@basic-rte.html
   [20]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18618/fi-kbl-guc/igt@i915_pm_...@basic-rte.html

  * igt@i915_pm_rpm@module-reload:
- fi-kbl-x1275:   [DMESG-FAIL][21] ([i915#62] / [i915#95]) -> 
[DMESG-FAIL][22] ([i915#62])
   [21]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9093/fi-kbl-x1275/igt@i915_pm_...@module-reload.html
   [22]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18618/fi-kbl-x1275/igt@i915_pm_...@module-reload.html

  * igt@prime_vgem@basic-fence-flip:
- fi-kbl-x1275:   [DMESG-WARN][23] ([i915#62] / [i915#92] / [i915#95]) 
-> [DMESG-WARN][24] ([i915#62] / [i915#92])
   [23]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9093/fi-kbl-x1275/igt@prime_v...@basic-fence-flip.html
   [24]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18618/fi-kbl-x1275/igt@prime_v...@basic-fence-flip.html

  
  {name}: This element is suppressed. This means it is ignored when computing
  the status of

[Intel-gfx] [PATCH 1/5] drm/i915/skl: Work around incorrect BIOS WRPLL PDIV programming

2020-10-02 Thread Imre Deak
The BIOS of at least one ASUS-Z170M system with an SKL I have programs
the 101b WRPLL PDIV divider value, which is the encoding for PDIV=7 with
bit#0 incorrectly set.

This happens with the

"3840x2160": 30 262750 3840 3888 3920 4000 2160 2163 2168 2191 0x48 0x9

HDMI mode (scaled from a 1024x768 src fb) set by BIOS and the

ref_clock=24000, dco_integer=383, dco_fraction=5802, pdiv=7, qdiv=1, kdiv=1

WRPLL parameters (assuming PDIV=7 was the intended setting). This
corresponds to 262749 PLL frequency/port clock.

Later the driver sets the same mode for which it calculates the same
dco_int/dco_frac/div WRPLL parameters (with the correct PDIV=7 encoding).

Based on the above, let's assume that PDIV=7 was intended and the HW
just ignores bit#0 in the PDIV register field for this setting, treating
100b and 101b encodings the same way.

While at it add the MISSING_CASE() for the p0,p2 divider decodings.

v2: (Ville)
- Add a define for the incorrect divider value.
- Emit only a debug message when detecting the incorrect divider value.
- Use fallthrough from the incorrect divider value case.
- Add the MISSING_CASE()s.

Cc: Ville Syrjälä 
Signed-off-by: Imre Deak 
---
 drivers/gpu/drm/i915/display/intel_dpll_mgr.c | 14 ++
 drivers/gpu/drm/i915/i915_reg.h   |  1 +
 2 files changed, 15 insertions(+)

diff --git a/drivers/gpu/drm/i915/display/intel_dpll_mgr.c 
b/drivers/gpu/drm/i915/display/intel_dpll_mgr.c
index e08684e34078..61cb558c60d1 100644
--- a/drivers/gpu/drm/i915/display/intel_dpll_mgr.c
+++ b/drivers/gpu/drm/i915/display/intel_dpll_mgr.c
@@ -1602,12 +1602,26 @@ static int skl_ddi_wrpll_get_freq(struct 
drm_i915_private *i915,
case DPLL_CFGCR2_PDIV_3:
p0 = 3;
break;
+   default:
+   if (p0 == DPLL_CFGCR2_PDIV_7_INVALID)
+   /*
+* Incorrect ASUS-Z170M BIOS setting, the HW seems to 
ignore bit#0,
+* handling it the same way as PDIV_7.
+*/
+   drm_dbg_kms(&i915->drm, "Invalid WRPLL PDIV divider 
value, fixing it.\n");
+   else
+   MISSING_CASE(p0);
+
+   fallthrough;
case DPLL_CFGCR2_PDIV_7:
p0 = 7;
break;
}
 
switch (p2) {
+   default:
+   MISSING_CASE(p2);
+   fallthrough;
case DPLL_CFGCR2_KDIV_5:
p2 = 5;
break;
diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
index 88c215cf97d4..d911583526db 100644
--- a/drivers/gpu/drm/i915/i915_reg.h
+++ b/drivers/gpu/drm/i915/i915_reg.h
@@ -10261,6 +10261,7 @@ enum skl_power_gate {
 #define  DPLL_CFGCR2_PDIV_2 (1 << 2)
 #define  DPLL_CFGCR2_PDIV_3 (2 << 2)
 #define  DPLL_CFGCR2_PDIV_7 (4 << 2)
+#define  DPLL_CFGCR2_PDIV_7_INVALID(5 << 2)
 #define  DPLL_CFGCR2_CENTRAL_FREQ_MASK (3)
 
 #define DPLL_CFGCR1(id)_MMIO_PIPE((id) - SKL_DPLL1, _DPLL1_CFGCR1, 
_DPLL2_CFGCR1)
-- 
2.25.1

___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx


[Intel-gfx] [PATCH 3/5] drm/i915: Check for unsupported DP link rates during initial commit

2020-10-02 Thread Imre Deak
Some BIOSes set an unsupported/imprecise DP link rate (for instance on
TGL A stepping). Make sure that we do an encoder recompute and a modeset
in this case.

Cc: Ville Syrjälä 
Signed-off-by: Imre Deak 
---
 drivers/gpu/drm/i915/display/intel_dp.c | 12 
 1 file changed, 12 insertions(+)

diff --git a/drivers/gpu/drm/i915/display/intel_dp.c 
b/drivers/gpu/drm/i915/display/intel_dp.c
index d33a3d9fdc3a..df5277c2b9ba 100644
--- a/drivers/gpu/drm/i915/display/intel_dp.c
+++ b/drivers/gpu/drm/i915/display/intel_dp.c
@@ -3707,6 +3707,18 @@ bool intel_dp_initial_fastset_check(struct intel_encoder 
*encoder,
struct intel_crtc_state *crtc_state)
 {
struct drm_i915_private *i915 = to_i915(encoder->base.dev);
+   struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
+
+   /*
+* If BIOS has set an unsupported or non-standard link rate for some
+* reason force an encoder recompute and full modeset.
+*/
+   if (intel_dp_rate_index(intel_dp->source_rates, 
intel_dp->num_source_rates,
+   crtc_state->port_clock) < 0) {
+   drm_dbg_kms(&i915->drm, "Forcing full modeset due to 
unsupported link rate\n");
+   crtc_state->uapi.connectors_changed = true;
+   return false;
+   }
 
/*
 * FIXME hack to force full modeset when DSC is being used.
-- 
2.25.1

___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx


[Intel-gfx] [PATCH 0/5] drm/i915/tgl: Fix Combo PHY DPLL fractional divider for 38.4MHz ref clock

2020-10-02 Thread Imre Deak
This patchset replaces [1]. That version's solution to work around
broken TGL A BIOSes turned out to be papering over something. The real
root cause was the lack of a full encoder recompute/modeset during the
initial commit and leaking the incorrect link rate into the PLL
frequency calculation code. So instead of making the PLL code aware of
incorrect link rates, this patchset forces a full modeset which will
recompute the correct link rate.

Cc: Ville Syrjälä 

[1] https://patchwork.freedesktop.org/series/82173/

Imre Deak (5):
  drm/i915/skl: Work around incorrect BIOS WRPLL PDIV programming
  drm/i915: Move the initial fastset commit check to encoder hooks
  drm/i915: Check for unsupported DP link rates during initial commit
  drm/i915: Add an encoder hook to sanitize its state during init/resume
  drm/i915/tgl: Fix Combo PHY DPLL fractional divider for 38.4MHz ref
clock

 drivers/gpu/drm/i915/display/icl_dsi.c| 14 
 drivers/gpu/drm/i915/display/intel_ddi.c  | 18 +
 drivers/gpu/drm/i915/display/intel_display.c  | 33 +-
 .../drm/i915/display/intel_display_types.h| 15 +
 drivers/gpu/drm/i915/display/intel_dp.c   | 65 +++
 drivers/gpu/drm/i915/display/intel_dp.h   |  5 ++
 drivers/gpu/drm/i915/display/intel_dp_mst.c   | 20 ++
 drivers/gpu/drm/i915/display/intel_dpll_mgr.c | 55 +++-
 drivers/gpu/drm/i915/i915_reg.h   |  1 +
 9 files changed, 194 insertions(+), 32 deletions(-)

-- 
2.25.1

___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx


[Intel-gfx] [PATCH 4/5] drm/i915: Add an encoder hook to sanitize its state during init/resume

2020-10-02 Thread Imre Deak
Atm, if a full modeset is performed during the initial modeset the link
training will happen with uninitialized max DP rate and lane count. Make
sure the corresponding encoder state is initialized by adding an encoder
hook called during driver init and system resume.

A better alternative would be to store all states in the CRTC state and
make this state available for the link re-training code. Also instead of
the DPCD read in the hook there should be really a proper sink HW
readout in place. Both of these require a bigger rework, so for now opting
for this minimal fix to make at least full initial modesets work.

The patch is based on
https://patchwork.freedesktop.org/patch/101473/?series=10354&rev=3

Cc: Ville Syrjälä 
Signed-off-by: Imre Deak 
---
 drivers/gpu/drm/i915/display/intel_ddi.c  |  8 +
 drivers/gpu/drm/i915/display/intel_display.c  |  4 +++
 .../drm/i915/display/intel_display_types.h|  7 +
 drivers/gpu/drm/i915/display/intel_dp.c   | 31 +++
 drivers/gpu/drm/i915/display/intel_dp.h   |  2 ++
 drivers/gpu/drm/i915/display/intel_dp_mst.c   | 10 ++
 6 files changed, 62 insertions(+)

diff --git a/drivers/gpu/drm/i915/display/intel_ddi.c 
b/drivers/gpu/drm/i915/display/intel_ddi.c
index 4e54c55ec99f..a0805260b224 100644
--- a/drivers/gpu/drm/i915/display/intel_ddi.c
+++ b/drivers/gpu/drm/i915/display/intel_ddi.c
@@ -4564,6 +4564,13 @@ void intel_ddi_get_config(struct intel_encoder *encoder,
intel_read_dp_sdp(encoder, pipe_config, DP_SDP_VSC);
 }
 
+static void intel_ddi_sanitize_state(struct intel_encoder *encoder,
+const struct intel_crtc_state *crtc_state)
+{
+   if (crtc_state && intel_crtc_has_dp_encoder(crtc_state))
+   intel_dp_sanitize_state(encoder, crtc_state);
+}
+
 static bool intel_ddi_initial_fastset_check(struct intel_encoder *encoder,
struct intel_crtc_state *crtc_state)
 {
@@ -5182,6 +5189,7 @@ void intel_ddi_init(struct drm_i915_private *dev_priv, 
enum port port)
encoder->update_pipe = intel_ddi_update_pipe;
encoder->get_hw_state = intel_ddi_get_hw_state;
encoder->get_config = intel_ddi_get_config;
+   encoder->sanitize_state = intel_ddi_sanitize_state;
encoder->initial_fastset_check = intel_ddi_initial_fastset_check;
encoder->suspend = intel_dp_encoder_suspend;
encoder->get_power_domains = intel_ddi_get_power_domains;
diff --git a/drivers/gpu/drm/i915/display/intel_display.c 
b/drivers/gpu/drm/i915/display/intel_display.c
index 31be63225b10..e61311ee8b8c 100644
--- a/drivers/gpu/drm/i915/display/intel_display.c
+++ b/drivers/gpu/drm/i915/display/intel_display.c
@@ -18725,8 +18725,12 @@ static void intel_modeset_readout_hw_state(struct 
drm_device *dev)
 
encoder->base.crtc = &crtc->base;
encoder->get_config(encoder, crtc_state);
+   if (encoder->sanitize_state)
+   encoder->sanitize_state(encoder, crtc_state);
} else {
encoder->base.crtc = NULL;
+   if (encoder->sanitize_state)
+   encoder->sanitize_state(encoder, NULL);
}
 
drm_dbg_kms(&dev_priv->drm,
diff --git a/drivers/gpu/drm/i915/display/intel_display_types.h 
b/drivers/gpu/drm/i915/display/intel_display_types.h
index 5297b2f08ff9..b2b458144f5a 100644
--- a/drivers/gpu/drm/i915/display/intel_display_types.h
+++ b/drivers/gpu/drm/i915/display/intel_display_types.h
@@ -188,6 +188,13 @@ struct intel_encoder {
void (*get_config)(struct intel_encoder *,
   struct intel_crtc_state *pipe_config);
 
+/*
+ * Optional hook called during init/resume to sanitize any state
+ * stored in the encoder (eg. DP link parameters).
+ */
+   void (*sanitize_state)(struct intel_encoder *encoder,
+  const struct intel_crtc_state *crtc_state);
+
/*
 * Optional hook, returning true if this encoder allows a fastset
 * during the initial commit, false otherwise.
diff --git a/drivers/gpu/drm/i915/display/intel_dp.c 
b/drivers/gpu/drm/i915/display/intel_dp.c
index df5277c2b9ba..9b6fe3b3b5b2 100644
--- a/drivers/gpu/drm/i915/display/intel_dp.c
+++ b/drivers/gpu/drm/i915/display/intel_dp.c
@@ -3703,6 +3703,36 @@ static void intel_dp_get_config(struct intel_encoder 
*encoder,
}
 }
 
+static bool
+intel_dp_get_dpcd(struct intel_dp *intel_dp);
+
+/**
+ * intel_dp_sanitize_state - sanitize the encoder state during init/resume
+ * @encoder: intel encoder to sanitize
+ * @crtc_state: state for the CRTC connected to the encoder
+ *
+ * Sanitize any state stored in the encoder during driver init and system
+ * resume.
+ */
+void intel_dp_sanitize_state(struct intel_encoder *encoder,
+const struct inte

[Intel-gfx] [PATCH 2/5] drm/i915: Move the initial fastset commit check to encoder hooks

2020-10-02 Thread Imre Deak
Move the checks to decide whether a fastset is possible during the
initial commit to an encoder hook. This check is really encoder specific
and the next patch will also require this adding a DP encoder specific
check.

Cc: Ville Syrjälä 
Signed-off-by: Imre Deak 
---
 drivers/gpu/drm/i915/display/icl_dsi.c| 14 +
 drivers/gpu/drm/i915/display/intel_ddi.c  | 10 +++
 drivers/gpu/drm/i915/display/intel_display.c  | 29 +--
 .../drm/i915/display/intel_display_types.h|  8 +
 drivers/gpu/drm/i915/display/intel_dp.c   | 22 ++
 drivers/gpu/drm/i915/display/intel_dp.h   |  3 ++
 drivers/gpu/drm/i915/display/intel_dp_mst.c   | 10 +++
 7 files changed, 80 insertions(+), 16 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/icl_dsi.c 
b/drivers/gpu/drm/i915/display/icl_dsi.c
index fe946a2e2082..6c7220506410 100644
--- a/drivers/gpu/drm/i915/display/icl_dsi.c
+++ b/drivers/gpu/drm/i915/display/icl_dsi.c
@@ -1668,6 +1668,19 @@ static bool gen11_dsi_get_hw_state(struct intel_encoder 
*encoder,
return ret;
 }
 
+static bool gen11_dsi_initial_fastset_check(struct intel_encoder *encoder,
+   struct intel_crtc_state *crtc_state)
+{
+   if (!crtc_state->dsc.compression_enable) {
+   drm_dbg_kms(encoder->base.dev, "Forcing full modeset due to DSC 
being enabled\n");
+   crtc_state->uapi.mode_changed = true;
+
+   return false;
+   }
+
+   return true;
+}
+
 static void gen11_dsi_encoder_destroy(struct drm_encoder *encoder)
 {
intel_encoder_destroy(encoder);
@@ -1923,6 +1936,7 @@ void icl_dsi_init(struct drm_i915_private *dev_priv)
encoder->update_pipe = intel_panel_update_backlight;
encoder->compute_config = gen11_dsi_compute_config;
encoder->get_hw_state = gen11_dsi_get_hw_state;
+   encoder->initial_fastset_check = gen11_dsi_initial_fastset_check;
encoder->type = INTEL_OUTPUT_DSI;
encoder->cloneable = 0;
encoder->pipe_mask = ~0;
diff --git a/drivers/gpu/drm/i915/display/intel_ddi.c 
b/drivers/gpu/drm/i915/display/intel_ddi.c
index b4c520348b3b..4e54c55ec99f 100644
--- a/drivers/gpu/drm/i915/display/intel_ddi.c
+++ b/drivers/gpu/drm/i915/display/intel_ddi.c
@@ -4564,6 +4564,15 @@ void intel_ddi_get_config(struct intel_encoder *encoder,
intel_read_dp_sdp(encoder, pipe_config, DP_SDP_VSC);
 }
 
+static bool intel_ddi_initial_fastset_check(struct intel_encoder *encoder,
+   struct intel_crtc_state *crtc_state)
+{
+   if (intel_crtc_has_dp_encoder(crtc_state))
+   return intel_dp_initial_fastset_check(encoder, crtc_state);
+
+   return true;
+}
+
 static enum intel_output_type
 intel_ddi_compute_output_type(struct intel_encoder *encoder,
  struct intel_crtc_state *crtc_state,
@@ -5173,6 +5182,7 @@ void intel_ddi_init(struct drm_i915_private *dev_priv, 
enum port port)
encoder->update_pipe = intel_ddi_update_pipe;
encoder->get_hw_state = intel_ddi_get_hw_state;
encoder->get_config = intel_ddi_get_config;
+   encoder->initial_fastset_check = intel_ddi_initial_fastset_check;
encoder->suspend = intel_dp_encoder_suspend;
encoder->get_power_domains = intel_ddi_get_power_domains;
 
diff --git a/drivers/gpu/drm/i915/display/intel_display.c 
b/drivers/gpu/drm/i915/display/intel_display.c
index 753f202ef6a0..31be63225b10 100644
--- a/drivers/gpu/drm/i915/display/intel_display.c
+++ b/drivers/gpu/drm/i915/display/intel_display.c
@@ -17951,6 +17951,8 @@ static int intel_initial_commit(struct drm_device *dev)
}
 
if (crtc_state->hw.active) {
+   struct intel_encoder *encoder;
+
/*
 * We've not yet detected sink capabilities
 * (audio,infoframes,etc.) and thus we don't want to
@@ -17972,22 +17974,17 @@ static int intel_initial_commit(struct drm_device 
*dev)
 */
crtc_state->uapi.color_mgmt_changed = true;
 
-   /*
-* FIXME hack to force full modeset when DSC is being
-* used.
-*
-* As long as we do not have full state readout and
-* config comparison of crtc_state->dsc, we have no way
-* to ensure reliable fastset. Remove once we have
-* readout for DSC.
-*/
-   if (crtc_state->dsc.compression_enable) {
-   ret = drm_atomic_add_affected_connectors(state,
-
&crtc->base);
-   if (ret)
-   goto out;
- 

[Intel-gfx] [PATCH 5/5] drm/i915/tgl: Fix Combo PHY DPLL fractional divider for 38.4MHz ref clock

2020-10-02 Thread Imre Deak
Apply Display WA #22010492432 for combo PHY PLLs too. This should fix a
problem where the PLL output frequency is slightly off with the current
PLL fractional divider value.

I haven't seen an actual case where this causes a problem, but let's
follow the spec. It's also needed on some EHL platforms, but for that we
also need a way to distinguish the affected EHL SKUs, so I leave that
for a follow-up.

v2:
- Apply the WA at one place when calculating the PLL dividers from the
  frequency and the frequency from the dividers for all the combo PLL
  use cases (DP, HDMI, TBT). (Ville)

Cc: Ville Syrjälä 
Reviewed-by: Ville Syrjälä 
Signed-off-by: Imre Deak 
---
 drivers/gpu/drm/i915/display/intel_dpll_mgr.c | 41 +++
 1 file changed, 25 insertions(+), 16 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_dpll_mgr.c 
b/drivers/gpu/drm/i915/display/intel_dpll_mgr.c
index 61cb558c60d1..421176de5cfb 100644
--- a/drivers/gpu/drm/i915/display/intel_dpll_mgr.c
+++ b/drivers/gpu/drm/i915/display/intel_dpll_mgr.c
@@ -2636,11 +2636,22 @@ static bool cnl_ddi_hdmi_pll_dividers(struct 
intel_crtc_state *crtc_state)
return true;
 }
 
+/*
+ * Display WA #22010492432: tgl
+ * Program half of the nominal DCO divider fraction value.
+ */
+static bool
+tgl_combo_pll_div_frac_wa_needed(struct drm_i915_private *i915)
+{
+   return IS_TIGERLAKE(i915) && i915->dpll.ref_clks.nssc == 38400;
+}
+
 static int __cnl_ddi_wrpll_get_freq(struct drm_i915_private *dev_priv,
const struct intel_shared_dpll *pll,
int ref_clock)
 {
const struct intel_dpll_hw_state *pll_state = &pll->state.hw_state;
+   u32 dco_fraction;
u32 p0, p1, p2, dco_freq;
 
p0 = pll_state->cfgcr1 & DPLL_CFGCR1_PDIV_MASK;
@@ -2683,8 +2694,13 @@ static int __cnl_ddi_wrpll_get_freq(struct 
drm_i915_private *dev_priv,
dco_freq = (pll_state->cfgcr0 & DPLL_CFGCR0_DCO_INTEGER_MASK) *
   ref_clock;
 
-   dco_freq += (((pll_state->cfgcr0 & DPLL_CFGCR0_DCO_FRACTION_MASK) >>
- DPLL_CFGCR0_DCO_FRACTION_SHIFT) * ref_clock) / 0x8000;
+   dco_fraction = (pll_state->cfgcr0 & DPLL_CFGCR0_DCO_FRACTION_MASK) >>
+  DPLL_CFGCR0_DCO_FRACTION_SHIFT;
+
+   if (tgl_combo_pll_div_frac_wa_needed(dev_priv))
+   dco_fraction *= 2;
+
+   dco_freq += (dco_fraction * ref_clock) / 0x8000;
 
if (drm_WARN_ON(&dev_priv->drm, p0 == 0 || p1 == 0 || p2 == 0))
return 0;
@@ -2962,16 +2978,6 @@ static const struct skl_wrpll_params 
tgl_tbt_pll_24MHz_values = {
/* the following params are unused */
 };
 
-/*
- * Display WA #22010492432: tgl
- * Divide the nominal .dco_fraction value by 2.
- */
-static const struct skl_wrpll_params tgl_tbt_pll_38_4MHz_values = {
-   .dco_integer = 0x54, .dco_fraction = 0x1800,
-   /* the following params are unused */
-   .pdiv = 0, .kdiv = 0, .qdiv_mode = 0, .qdiv_ratio = 0,
-};
-
 static bool icl_calc_dp_combo_pll(struct intel_crtc_state *crtc_state,
  struct skl_wrpll_params *pll_params)
 {
@@ -3005,14 +3011,12 @@ static bool icl_calc_tbt_pll(struct intel_crtc_state 
*crtc_state,
MISSING_CASE(dev_priv->dpll.ref_clks.nssc);
fallthrough;
case 19200:
+   case 38400:
*pll_params = tgl_tbt_pll_19_2MHz_values;
break;
case 24000:
*pll_params = tgl_tbt_pll_24MHz_values;
break;
-   case 38400:
-   *pll_params = tgl_tbt_pll_38_4MHz_values;
-   break;
}
} else {
switch (dev_priv->dpll.ref_clks.nssc) {
@@ -3079,9 +3083,14 @@ static void icl_calc_dpll_state(struct drm_i915_private 
*i915,
const struct skl_wrpll_params *pll_params,
struct intel_dpll_hw_state *pll_state)
 {
+   u32 dco_fraction = pll_params->dco_fraction;
+
memset(pll_state, 0, sizeof(*pll_state));
 
-   pll_state->cfgcr0 = DPLL_CFGCR0_DCO_FRACTION(pll_params->dco_fraction) |
+   if (tgl_combo_pll_div_frac_wa_needed(i915))
+   dco_fraction = DIV_ROUND_CLOSEST(dco_fraction, 2);
+
+   pll_state->cfgcr0 = DPLL_CFGCR0_DCO_FRACTION(dco_fraction) |
pll_params->dco_integer;
 
pll_state->cfgcr1 = DPLL_CFGCR1_QDIV_RATIO(pll_params->qdiv_ratio) |
-- 
2.25.1

___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx


[Intel-gfx] ✗ Fi.CI.SPARSE: warning for Allow privileged user to map the OA buffer

2020-10-02 Thread Patchwork
== Series Details ==

Series: Allow privileged user to map the OA buffer
URL   : https://patchwork.freedesktop.org/series/82353/
State : warning

== Summary ==

$ dim sparse --fast origin/drm-tip
Sparse version: v0.6.2
Fast mode used, each commit won't be checked separately.
+drivers/gpu/drm/i915/gt/intel_workarounds.c:1688:6: warning: symbol 
'intel_engine_apply_whitelist_locked' was not declared. Should it be static?


___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx


[Intel-gfx] ✗ Fi.CI.CHECKPATCH: warning for Allow privileged user to map the OA buffer

2020-10-02 Thread Patchwork
== Series Details ==

Series: Allow privileged user to map the OA buffer
URL   : https://patchwork.freedesktop.org/series/82353/
State : warning

== Summary ==

$ dim checkpatch origin/drm-tip
febfa8b6a73d drm/i915/perf: Ensure observation logic is not clock gated
ed4d60599ff2 drm/i915/gt: Lock intel_engine_apply_whitelist with uncore->lock
1b52c6e17fa6 drm/i915/perf: Whitelist OA report trigger registers
-:91: ERROR:TRAILING_WHITESPACE: trailing whitespace
#91: FILE: drivers/gpu/drm/i915/gt/intel_workarounds.c:153:
+ $

-:91: WARNING:LEADING_SPACE: please, no spaces at the start of a line
#91: FILE: drivers/gpu/drm/i915/gt/intel_workarounds.c:153:
+ $

-:140: ERROR:TRAILING_WHITESPACE: trailing whitespace
#140: FILE: drivers/gpu/drm/i915/gt/intel_workarounds.c:2094:
+^I * Once we remove the workarounds, we compact the list again in $

-:238: CHECK:COMPARISON_TO_NULL: Comparison to NULL could be written 
"!stream->perf->oa_wl"
#238: FILE: drivers/gpu/drm/i915/i915_perf.c:1382:
+   stream->perf->oa_wl == NULL)

total: 2 errors, 1 warnings, 1 checks, 306 lines checked
85cfd888057c drm/i915/gt: Refactor _wa_add to reuse wa_index and wa_list_grow
cc19652f4807 drm/i915/perf: Whitelist OA counter and buffer registers
a29845c583c3 drm/i915/perf: Map OA buffer to user space for gen12 performance 
query


___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx


[Intel-gfx] ✓ Fi.CI.BAT: success for drm/i915/tgl/psr: Fix glitches when doing frontbuffer modifications

2020-10-02 Thread Patchwork
== Series Details ==

Series: drm/i915/tgl/psr: Fix glitches when doing frontbuffer modifications
URL   : https://patchwork.freedesktop.org/series/82351/
State : success

== Summary ==

CI Bug Log - changes from CI_DRM_9093 -> Patchwork_18617


Summary
---

  **SUCCESS**

  No regressions found.

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

Known issues


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

### IGT changes ###

 Issues hit 

  * igt@kms_cursor_legacy@basic-flip-after-cursor-legacy:
- fi-icl-u2:  [PASS][1] -> [DMESG-WARN][2] ([i915#1982])
   [1]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9093/fi-icl-u2/igt@kms_cursor_leg...@basic-flip-after-cursor-legacy.html
   [2]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18617/fi-icl-u2/igt@kms_cursor_leg...@basic-flip-after-cursor-legacy.html

  
 Possible fixes 

  * igt@i915_module_load@reload:
- {fi-tgl-dsi}:   [DMESG-WARN][3] ([i915#1982] / [k.org#205379]) -> 
[PASS][4]
   [3]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9093/fi-tgl-dsi/igt@i915_module_l...@reload.html
   [4]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18617/fi-tgl-dsi/igt@i915_module_l...@reload.html

  * igt@kms_cursor_legacy@basic-busy-flip-before-cursor-atomic:
- {fi-kbl-7560u}: [DMESG-WARN][5] ([i915#1982]) -> [PASS][6]
   [5]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9093/fi-kbl-7560u/igt@kms_cursor_leg...@basic-busy-flip-before-cursor-atomic.html
   [6]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18617/fi-kbl-7560u/igt@kms_cursor_leg...@basic-busy-flip-before-cursor-atomic.html

  * igt@vgem_basic@unload:
- fi-skl-guc: [DMESG-WARN][7] ([i915#2203]) -> [PASS][8]
   [7]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9093/fi-skl-guc/igt@vgem_ba...@unload.html
   [8]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18617/fi-skl-guc/igt@vgem_ba...@unload.html

  
 Warnings 

  * igt@i915_pm_rpm@basic-rte:
- fi-kbl-guc: [DMESG-FAIL][9] ([i915#2203]) -> [SKIP][10] 
([fdo#109271])
   [9]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9093/fi-kbl-guc/igt@i915_pm_...@basic-rte.html
   [10]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18617/fi-kbl-guc/igt@i915_pm_...@basic-rte.html

  * igt@i915_pm_rpm@module-reload:
- fi-kbl-x1275:   [DMESG-FAIL][11] ([i915#62] / [i915#95]) -> 
[DMESG-FAIL][12] ([i915#62])
   [11]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9093/fi-kbl-x1275/igt@i915_pm_...@module-reload.html
   [12]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18617/fi-kbl-x1275/igt@i915_pm_...@module-reload.html

  * igt@kms_force_connector_basic@prune-stale-modes:
- fi-kbl-x1275:   [DMESG-WARN][13] ([i915#62] / [i915#92]) -> 
[DMESG-WARN][14] ([i915#62] / [i915#92] / [i915#95]) +5 similar issues
   [13]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9093/fi-kbl-x1275/igt@kms_force_connector_ba...@prune-stale-modes.html
   [14]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18617/fi-kbl-x1275/igt@kms_force_connector_ba...@prune-stale-modes.html

  * igt@vgem_basic@unload:
- fi-kbl-x1275:   [DMESG-WARN][15] ([i915#62] / [i915#92] / [i915#95]) 
-> [DMESG-WARN][16] ([i915#62] / [i915#92])
   [15]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9093/fi-kbl-x1275/igt@vgem_ba...@unload.html
   [16]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18617/fi-kbl-x1275/igt@vgem_ba...@unload.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
  [i915#1635]: https://gitlab.freedesktop.org/drm/intel/issues/1635
  [i915#1982]: https://gitlab.freedesktop.org/drm/intel/issues/1982
  [i915#2203]: https://gitlab.freedesktop.org/drm/intel/issues/2203
  [i915#289]: https://gitlab.freedesktop.org/drm/intel/issues/289
  [i915#62]: https://gitlab.freedesktop.org/drm/intel/issues/62
  [i915#92]: https://gitlab.freedesktop.org/drm/intel/issues/92
  [i915#95]: https://gitlab.freedesktop.org/drm/intel/issues/95
  [k.org#205379]: https://bugzilla.kernel.org/show_bug.cgi?id=205379


Participating hosts (45 -> 38)
--

  Missing(7): fi-ilk-m540 fi-hsw-4200u fi-byt-squawks fi-bsw-cyan 
fi-bsw-kefka fi-byt-clapper fi-bdw-samus 


Build changes
-

  * Linux: CI_DRM_9093 -> Patchwork_18617

  CI-20190529: 20190529
  CI_DRM_9093: 827ebff930c6340ed1c1c274909717525951c496 @ 
git://anongit.freedesktop.org/gfx-ci/linux
  IGT_5798: 430bad5a53c08125fbd48978ed6a66f61a33a40b @ 
git://anongit.freedesktop.org/xorg/app/intel-gpu-tools
  Patchwork_18617: f1ada30987fd65e158d57983299cc772f8af8a7a @ 
git://anongit.freedesktop.org/gfx-ci/linux


== Linux commits ==

f1ada30987fd drm/i915/tgl/psr:

[Intel-gfx] [PATCH 3/6] drm/i915/perf: Whitelist OA report trigger registers

2020-10-02 Thread Umesh Nerlige Ramappa
OA reports can be triggered into the OA buffer by writing into the
OAREPORTTRIG registers. Whitelist the registers to allow non-privileged
user to trigger reports.

Whitelist registers only if perf_stream_paranoid is set to 0. In
i915_perf_open_ioctl, this setting is checked and the whitelist is
enabled accordingly. On closing the perf fd, the whitelist is removed.

This ensures that the access to the whitelist is gated by
perf_stream_paranoid.

v2:
- Move related change to this patch (Lionel)
- Bump up perf revision (Lionel)

v3: Pardon whitelisted registers for selftest (Umesh)
v4: Document supported gens for the feature (Lionel)
v5: Whitelist registers only if perf_stream_paranoid is set to 0 (Jon)
v6: Move oa whitelist array to i915_perf (Chris)
v7: Fix OA writing beyond the wal->list memory (CI)
v8: Protect write to engine whitelist registers
v9: (Umesh)
- Use uncore->lock to protect write to forcepriv regs
- In case wal->count falls to zero on _wa_remove, make sure you still
  clear the registers. Remove wal->count check when applying whitelist.
v10: (Umesh)
- Split patches modifying intel_workarounds
- On some platforms there are no whitelisted regs. intel_engine_resume
  applies whitelist on these platforms too and the wal->count gates such
  platforms. Bring back the wal->count check.
- intel_engine_allow/deny_user_register_access modifies the engine
  whitelist and the wal->count. Use uncore->lock to serialize it with
  intel_engine_apply_whitelist.
- Grow the wal->list when adding whitelist registers after driver load.

Signed-off-by: Piotr Maciejewski 
Signed-off-by: Umesh Nerlige Ramappa 
Reviewed-by: Lionel Landwerlin 
---
 drivers/gpu/drm/i915/gt/intel_workarounds.c   | 118 ++
 drivers/gpu/drm/i915/gt/intel_workarounds.h   |   7 ++
 .../gpu/drm/i915/gt/intel_workarounds_types.h |   5 +
 drivers/gpu/drm/i915/i915_perf.c  |  79 +++-
 drivers/gpu/drm/i915/i915_perf_types.h|   8 ++
 5 files changed, 214 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/i915/gt/intel_workarounds.c 
b/drivers/gpu/drm/i915/gt/intel_workarounds.c
index b7db34dc9687..8eda3bc3991e 100644
--- a/drivers/gpu/drm/i915/gt/intel_workarounds.c
+++ b/drivers/gpu/drm/i915/gt/intel_workarounds.c
@@ -112,6 +112,66 @@ static void wa_init_finish(struct i915_wa_list *wal)
 wal->wa_count, wal->name, wal->engine_name);
 }
 
+static int _wa_index(struct i915_wa_list *wal, i915_reg_t reg)
+{
+   unsigned int addr = i915_mmio_reg_offset(reg);
+   int start = 0, end = wal->count;
+
+   /* addr and wal->list[].reg, both include the R/W flags */
+   while (start < end) {
+   unsigned int mid = start + (end - start) / 2;
+
+   if (i915_mmio_reg_offset(wal->list[mid].reg) < addr)
+   start = mid + 1;
+   else if (i915_mmio_reg_offset(wal->list[mid].reg) > addr)
+   end = mid;
+   else
+   return mid;
+   }
+
+   return -ENOENT;
+}
+
+static int _wa_list_grow(struct i915_wa_list *wal, size_t count)
+{
+   struct i915_wa *list;
+
+   list = kmalloc_array(ALIGN(count + 1, WA_LIST_CHUNK), sizeof(*list),
+GFP_KERNEL);
+   if (!list) {
+   DRM_ERROR("No space for workaround init!\n");
+   return -ENOMEM;
+   }
+
+   if (wal->list)
+   memcpy(list, wal->list, sizeof(*list) * count);
+
+   wal->list = list;
+
+   return 0;
+}
+ 
+static void _wa_remove(struct i915_wa_list *wal, i915_reg_t reg, u32 flags)
+{
+   int index;
+   struct i915_wa *wa = wal->list;
+
+   reg.reg |= flags;
+
+   index = _wa_index(wal, reg);
+   if (GEM_DEBUG_WARN_ON(index < 0))
+   return;
+
+   memset(wa + index, 0, sizeof(*wa));
+
+   while (index < wal->count - 1) {
+   swap(wa[index], wa[index + 1]);
+   index++;
+   }
+
+   wal->count--;
+}
+
 static void _wa_add(struct i915_wa_list *wal, const struct i915_wa *wa)
 {
unsigned int addr = i915_mmio_reg_offset(wa->reg);
@@ -2011,6 +2071,64 @@ void intel_engine_init_workarounds(struct 
intel_engine_cs *engine)
wa_init_finish(wal);
 }
 
+int intel_engine_allow_user_register_access(struct intel_engine_cs *engine,
+   struct i915_whitelist_reg *reg,
+   u32 count)
+{
+   unsigned long flags;
+   struct i915_wa_list *wal;
+   int ret;
+
+   if (!engine || !reg || !count)
+   return -EINVAL;
+
+   wal = &engine->whitelist;
+
+   /*
+* i915 compacts the wa list by calling wa_init_finish during driver
+* load. If we want to add additional workarounds after driver load,
+* we need to grow the list. _wa_list_grow will add at least one free
+* slot for a workaround. Any additional slot required are added b

[Intel-gfx] [PATCH 5/6] drm/i915/perf: Whitelist OA counter and buffer registers

2020-10-02 Thread Umesh Nerlige Ramappa
It is useful to have markers in the OA reports to identify triggered
reports. Whitelist some OA counters that can be used as markers.

A triggered report can be found faster if we can sample the HW tail and
head registers when the report was triggered. Whitelist OA buffer
specific registers.

v2:
- Bump up the perf revision (Lionel)
- Use indexing for counters (Lionel)
- Fix selftest for oa ticking register (Umesh)

v3: Pardon whitelisted registers for selftest (Umesh)

v4:
- Document whitelisted registers (Lionel)
- Fix live isolated whitelist for OA regs (Umesh)

v5:
- Free up whitelist slots. Remove GPU_TICKS and A20 counter (Piotr)
- Whitelist registers only if perf_stream_paranoid is set to 0 (Jon)

v6: Move oa whitelist array to i915_perf (Chris)

Signed-off-by: Piotr Maciejewski 
Signed-off-by: Umesh Nerlige Ramappa 
Reviewed-by: Lionel Landwerlin 
---
 drivers/gpu/drm/i915/i915_perf.c | 18 +-
 drivers/gpu/drm/i915/i915_reg.h  |  8 
 2 files changed, 25 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/i915/i915_perf.c b/drivers/gpu/drm/i915/i915_perf.c
index c5238dbda9de..f18577d3318b 100644
--- a/drivers/gpu/drm/i915/i915_perf.c
+++ b/drivers/gpu/drm/i915/i915_perf.c
@@ -1365,11 +1365,19 @@ free_noa_wait(struct i915_perf_stream *stream)
 static struct i915_whitelist_reg gen9_oa_wl_regs[] = {
{ OAREPORTTRIG2, RING_FORCE_TO_NONPRIV_ACCESS_RW },
{ OAREPORTTRIG6, RING_FORCE_TO_NONPRIV_ACCESS_RW },
+   { OA_PERF_COUNTER_A(18), RING_FORCE_TO_NONPRIV_ACCESS_RW |
+RING_FORCE_TO_NONPRIV_RANGE_4 },
+   { GEN8_OASTATUS, RING_FORCE_TO_NONPRIV_ACCESS_RD |
+RING_FORCE_TO_NONPRIV_RANGE_4 },
 };
 
 static struct i915_whitelist_reg gen12_oa_wl_regs[] = {
{ GEN12_OAG_OAREPORTTRIG2, RING_FORCE_TO_NONPRIV_ACCESS_RW },
{ GEN12_OAG_OAREPORTTRIG6, RING_FORCE_TO_NONPRIV_ACCESS_RW },
+   { GEN12_OAG_PERF_COUNTER_A(18), RING_FORCE_TO_NONPRIV_ACCESS_RW |
+   RING_FORCE_TO_NONPRIV_RANGE_4 },
+   { GEN12_OAG_OASTATUS, RING_FORCE_TO_NONPRIV_ACCESS_RD |
+ RING_FORCE_TO_NONPRIV_RANGE_4 },
 };
 
 static int intel_engine_apply_oa_whitelist(struct i915_perf_stream *stream)
@@ -4541,8 +4549,16 @@ int i915_perf_ioctl_version(void)
 *into the OA buffer. This applies only to gen8+. The feature can
 *only be accessed if perf_stream_paranoid is set to 0 by privileged
 *user.
+*
+* 7: Whitelist below OA registers for user to identify the location of
+*triggered reports in the OA buffer. This applies only to gen8+.
+*The feature can only be accessed if perf_stream_paranoid is set to
+*0 by privileged user.
+*
+*- OA buffer head/tail/status/buffer registers for read only
+*- OA counters A18, A19, A20 for read/write
 */
-   return 6;
+   return 7;
 }
 
 #if IS_ENABLED(CONFIG_DRM_I915_SELFTEST)
diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
index 031bff4dc2b1..57761dd4d70b 100644
--- a/drivers/gpu/drm/i915/i915_reg.h
+++ b/drivers/gpu/drm/i915/i915_reg.h
@@ -974,6 +974,14 @@ static inline bool i915_mmio_reg_valid(i915_reg_t reg)
 #define OAREPORTTRIG8_NOA_SELECT_6_SHIFT24
 #define OAREPORTTRIG8_NOA_SELECT_7_SHIFT28
 
+/* Performance counters registers */
+#define OA_PERF_COUNTER_A(idx)   _MMIO(0x2800 + 8 * (idx))
+#define OA_PERF_COUNTER_A_UPPER(idx) _MMIO(0x2800 + 8 * (idx) + 4)
+
+/* Gen12 Performance counters registers */
+#define GEN12_OAG_PERF_COUNTER_A(idx)   _MMIO(0xD980 + 8 * (idx))
+#define GEN12_OAG_PERF_COUNTER_A_UPPER(idx) _MMIO(0xD980 + 8 * (idx) + 4)
+
 /* Same layout as OASTARTTRIGX */
 #define GEN12_OAG_OASTARTTRIG1 _MMIO(0xd900)
 #define GEN12_OAG_OASTARTTRIG2 _MMIO(0xd904)
-- 
2.20.1

___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx


[Intel-gfx] [PATCH 4/6] drm/i915/gt: Refactor _wa_add to reuse wa_index and wa_list_grow

2020-10-02 Thread Umesh Nerlige Ramappa
Switch the search and grow code of the _wa_add to use _wa_index and
_wa_list_grow.

Signed-off-by: Umesh Nerlige Ramappa 
---
 drivers/gpu/drm/i915/gt/intel_workarounds.c | 54 +++--
 1 file changed, 17 insertions(+), 37 deletions(-)

diff --git a/drivers/gpu/drm/i915/gt/intel_workarounds.c 
b/drivers/gpu/drm/i915/gt/intel_workarounds.c
index 8eda3bc3991e..23218d113077 100644
--- a/drivers/gpu/drm/i915/gt/intel_workarounds.c
+++ b/drivers/gpu/drm/i915/gt/intel_workarounds.c
@@ -174,53 +174,33 @@ static void _wa_remove(struct i915_wa_list *wal, 
i915_reg_t reg, u32 flags)
 
 static void _wa_add(struct i915_wa_list *wal, const struct i915_wa *wa)
 {
-   unsigned int addr = i915_mmio_reg_offset(wa->reg);
-   unsigned int start = 0, end = wal->count;
+   int index;
const unsigned int grow = WA_LIST_CHUNK;
struct i915_wa *wa_;
 
GEM_BUG_ON(!is_power_of_2(grow));
 
-   if (IS_ALIGNED(wal->count, grow)) { /* Either uninitialized or full. */
-   struct i915_wa *list;
-
-   list = kmalloc_array(ALIGN(wal->count + 1, grow), sizeof(*wa),
-GFP_KERNEL);
-   if (!list) {
-   DRM_ERROR("No space for workaround init!\n");
+   if (IS_ALIGNED(wal->count, grow)) /* Either uninitialized or full. */
+   if (_wa_list_grow(wal, wal->count) < 0)
return;
-   }
-
-   if (wal->list)
-   memcpy(list, wal->list, sizeof(*wa) * wal->count);
 
-   wal->list = list;
-   }
+   index = _wa_index(wal, wa->reg);
+   if (index >= 0) {
+   wa_ = &wal->list[index];
 
-   while (start < end) {
-   unsigned int mid = start + (end - start) / 2;
+   if ((wa->clr | wa_->clr) && !(wa->clr & ~wa_->clr)) {
+   DRM_ERROR("Discarding overwritten w/a for reg %04x 
(clear: %08x, set: %08x)\n",
+ i915_mmio_reg_offset(wa_->reg),
+ wa_->clr, wa_->set);
 
-   if (i915_mmio_reg_offset(wal->list[mid].reg) < addr) {
-   start = mid + 1;
-   } else if (i915_mmio_reg_offset(wal->list[mid].reg) > addr) {
-   end = mid;
-   } else {
-   wa_ = &wal->list[mid];
-
-   if ((wa->clr | wa_->clr) && !(wa->clr & ~wa_->clr)) {
-   DRM_ERROR("Discarding overwritten w/a for reg 
%04x (clear: %08x, set: %08x)\n",
- i915_mmio_reg_offset(wa_->reg),
- wa_->clr, wa_->set);
-
-   wa_->set &= ~wa->clr;
-   }
-
-   wal->wa_count++;
-   wa_->set |= wa->set;
-   wa_->clr |= wa->clr;
-   wa_->read |= wa->read;
-   return;
+   wa_->set &= ~wa->clr;
}
+
+   wal->wa_count++;
+   wa_->set |= wa->set;
+   wa_->clr |= wa->clr;
+   wa_->read |= wa->read;
+   return;
}
 
wal->wa_count++;
-- 
2.20.1

___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx


[Intel-gfx] [PATCH 0/6] Allow privileged user to map the OA buffer

2020-10-02 Thread Umesh Nerlige Ramappa
Allow user to map the OA buffer and also trigger reports into it.

CI fixes:
v1: Fixes a memory corruption due to addition of OA whitelist on demand.
v2: Spinlock when applying whitelist
v3: Use uncore->lock. Do not check for wal->count when applying whitelist.
v4: Refresh and rerun with newly added test (forked access).
v5:
- Split patches into smaller units
- Grow the wal->list only for the engine that needs it.
- Bring back the wal->count check when applying whitelist during resume

Signed-off-by: Umesh Nerlige Ramappa 
Test-with: 20201002013957.16456-1-umesh.nerlige.rama...@intel.com

Piotr Maciejewski (1):
  drm/i915/perf: Ensure observation logic is not clock gated

Umesh Nerlige Ramappa (5):
  drm/i915/gt: Lock intel_engine_apply_whitelist with uncore->lock
  drm/i915/perf: Whitelist OA report trigger registers
  drm/i915/gt: Refactor _wa_add to reuse wa_index and wa_list_grow
  drm/i915/perf: Whitelist OA counter and buffer registers
  drm/i915/perf: Map OA buffer to user space for gen12 performance query

 drivers/gpu/drm/i915/gem/i915_gem_mman.c  |   2 +-
 drivers/gpu/drm/i915/gem/i915_gem_mman.h  |   2 +
 drivers/gpu/drm/i915/gt/intel_workarounds.c   | 212 
 drivers/gpu/drm/i915/gt/intel_workarounds.h   |   7 +
 .../gpu/drm/i915/gt/intel_workarounds_types.h |   5 +
 drivers/gpu/drm/i915/i915_perf.c  | 228 +-
 drivers/gpu/drm/i915/i915_perf_types.h|   8 +
 drivers/gpu/drm/i915/i915_reg.h   |  10 +
 include/uapi/drm/i915_drm.h   |  33 +++
 9 files changed, 455 insertions(+), 52 deletions(-)

-- 
2.20.1

___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx


[Intel-gfx] [PATCH 1/6] drm/i915/perf: Ensure observation logic is not clock gated

2020-10-02 Thread Umesh Nerlige Ramappa
From: Piotr Maciejewski 

A clock gating switch can control if the performance monitoring and
observation logic is enaled or not. Ensure that we enable the clocks.

v2: Separate code from other patches (Lionel)
v3: Reset PMON enable when disabling perf to save power (Lionel)
v4: Use intel_uncore_rmw and REG_BIT (Chris)

Fixes: 00a7f0d7155c ("drm/i915/tgl: Add perf support on TGL")
Signed-off-by: Piotr Maciejewski 
Signed-off-by: Umesh Nerlige Ramappa 
Reviewed-by: Lionel Landwerlin 
---
 drivers/gpu/drm/i915/i915_perf.c | 9 +
 drivers/gpu/drm/i915/i915_reg.h  | 2 ++
 2 files changed, 11 insertions(+)

diff --git a/drivers/gpu/drm/i915/i915_perf.c b/drivers/gpu/drm/i915/i915_perf.c
index e94976976571..df5166d89d82 100644
--- a/drivers/gpu/drm/i915/i915_perf.c
+++ b/drivers/gpu/drm/i915/i915_perf.c
@@ -2520,6 +2520,12 @@ gen12_enable_metric_set(struct i915_perf_stream *stream,
(period_exponent << 
GEN12_OAG_OAGLBCTXCTRL_TIMER_PERIOD_SHIFT))
: 0);
 
+   /*
+* Initialize Super Queue Internal Cnt Register
+* Set PMON Enable in order to collect valid metrics.
+*/
+   intel_uncore_rmw(uncore, GEN12_SQCNT1, 0, GEN12_SQCNT1_PMON_ENABLE);
+
/*
 * Update all contexts prior writing the mux configurations as we need
 * to make sure all slices/subslices are ON before writing to NOA
@@ -2579,6 +2585,9 @@ static void gen12_disable_metric_set(struct 
i915_perf_stream *stream)
 
/* Make sure we disable noa to save power. */
intel_uncore_rmw(uncore, RPM_CONFIG1, GEN10_GT_NOA_ENABLE, 0);
+
+   /* Reset PMON Enable to save power. */
+   intel_uncore_rmw(uncore, GEN12_SQCNT1, GEN12_SQCNT1_PMON_ENABLE, 0);
 }
 
 static void gen7_oa_enable(struct i915_perf_stream *stream)
diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
index 88c215cf97d4..031bff4dc2b1 100644
--- a/drivers/gpu/drm/i915/i915_reg.h
+++ b/drivers/gpu/drm/i915/i915_reg.h
@@ -696,6 +696,8 @@ static inline bool i915_mmio_reg_valid(i915_reg_t reg)
 #define OABUFFER_SIZE_16M   (7 << 3)
 
 #define GEN12_OA_TLB_INV_CR _MMIO(0xceec)
+#define GEN12_SQCNT1 _MMIO(0x8718)
+#define  GEN12_SQCNT1_PMON_ENABLE REG_BIT(30)
 
 /* Gen12 OAR unit */
 #define GEN12_OAR_OACONTROL _MMIO(0x2960)
-- 
2.20.1

___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx


[Intel-gfx] [PATCH 6/6] drm/i915/perf: Map OA buffer to user space for gen12 performance query

2020-10-02 Thread Umesh Nerlige Ramappa
i915 used to support time based sampling mode which is good for overall
system monitoring, but is not enough for query mode used to measure a
single draw call or dispatch. Gen9-Gen11 are using current i915 perf
implementation for query, but Gen12+ requires a new approach for query
based on triggered reports within oa buffer.

Triggering reports into the OA buffer is achieved by writing into a
a trigger register. Optionally an unused counter/register is set with a
marker value such that a triggered report can be identified in the OA
buffer. Reports are usually triggered at the start and end of work that
is measured.

Since OA buffer is large and queries can be frequent, an efficient way
to look for triggered reports is required. By knowing the current head
and tail offsets into the OA buffer, it is easier to determine the
locality of the reports of interest.

Current perf OA interface does not expose head/tail information to the
user and it filters out invalid reports before sending data to user.
Also considering limited size of user buffer used during a query,
creating a 1:1 copy of the OA buffer at the user space added undesired
complexity.

The solution was to map the OA buffer to user space provided

(1) that it is accessed from a privileged user.
(2) OA report filtering is not used.

These 2 conditions would satisfy the safety criteria that the current
perf interface addresses.

To enable the query:
- Add an ioctl to expose head and tail to the user
- Add an ioctl to return size and offset of the OA buffer
- Map the OA buffer to the user space

v2:
- Improve commit message (Chris)
- Do not mmap based on gem object filp. Instead, use perf_fd and support
  mmap syscall (Chris)
- Pass non-zero offset in mmap to enforce the right object is
  mapped (Chris)
- Do not expose gpu_address (Chris)
- Verify start and length of vma for page alignment (Lionel)
- Move SQNTL config out (Lionel)

v3: (Chris)
- Omit redundant checks
- Return VM_FAULT_SIGBUS is old stream is closed
- Maintain reference counts to stream in vm_open and vm_close
- Use switch to identify object to be mapped

v4: Call kref_put on closing perf fd (Chris)
v5:
- Strip access to OA buffer from unprivileged child of a privileged
  parent. Use VM_DONTCOPY
- Enforce MAP_PRIVATE by checking for VM_MAYSHARE

v6:
(Chris)
- Use len of -1 in unmap_mapping_range
- Don't use stream->oa_buffer.vma->obj in vm_fault_oa
- Use kernel block comment style
- do_mmap gets a reference to the file and puts it in do_munmap, so
  no need to maintain a reference to i915_perf_stream. Hence, remove
  vm_open/vm_close and stream->closed hooks/checks.
(Umesh)
- Do not allow mmap if SAMPLE_OA_REPORT is not set during
  i915_perf_open_ioctl.
- Drop ioctl returning head/tail since this information is already
  whitelisted. Remove hooks to read head register.

v7: (Chris)
- unmap before destroy
- change ioctl argument struct

v8: Documentation and more checks (Chris)

Signed-off-by: Piotr Maciejewski 
Signed-off-by: Umesh Nerlige Ramappa 
Reviewed-by: Chris Wilson 
---
 drivers/gpu/drm/i915/gem/i915_gem_mman.c |   2 +-
 drivers/gpu/drm/i915/gem/i915_gem_mman.h |   2 +
 drivers/gpu/drm/i915/i915_perf.c | 126 ++-
 include/uapi/drm/i915_drm.h  |  33 ++
 4 files changed, 161 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/i915/gem/i915_gem_mman.c 
b/drivers/gpu/drm/i915/gem/i915_gem_mman.c
index 3d69e51f3e4d..2ab08b152b9d 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_mman.c
+++ b/drivers/gpu/drm/i915/gem/i915_gem_mman.c
@@ -204,7 +204,7 @@ compute_partial_view(const struct drm_i915_gem_object *obj,
return view;
 }
 
-static vm_fault_t i915_error_to_vmf_fault(int err)
+vm_fault_t i915_error_to_vmf_fault(int err)
 {
switch (err) {
default:
diff --git a/drivers/gpu/drm/i915/gem/i915_gem_mman.h 
b/drivers/gpu/drm/i915/gem/i915_gem_mman.h
index efee9e0d2508..1190a3a228ea 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_mman.h
+++ b/drivers/gpu/drm/i915/gem/i915_gem_mman.h
@@ -29,4 +29,6 @@ void i915_gem_object_release_mmap_gtt(struct 
drm_i915_gem_object *obj);
 
 void i915_gem_object_release_mmap_offset(struct drm_i915_gem_object *obj);
 
+vm_fault_t i915_error_to_vmf_fault(int err);
+
 #endif
diff --git a/drivers/gpu/drm/i915/i915_perf.c b/drivers/gpu/drm/i915/i915_perf.c
index f18577d3318b..55b7339407f0 100644
--- a/drivers/gpu/drm/i915/i915_perf.c
+++ b/drivers/gpu/drm/i915/i915_perf.c
@@ -192,10 +192,12 @@
  */
 
 #include 
+#include 
 #include 
 #include 
 
 #include "gem/i915_gem_context.h"
+#include "gem/i915_gem_mman.h"
 #include "gt/intel_engine_pm.h"
 #include "gt/intel_engine_user.h"
 #include "gt/intel_gt.h"
@@ -3289,6 +3291,44 @@ static long i915_perf_config_locked(struct 
i915_perf_stream *stream,
return ret;
 }
 
+#define I915_PERF_OA_BUFFER_MMAP_OFFSET 1
+
+/**
+ * i915_perf_oa_buffer_info_locked - size and offset of the OA buffer
+ * @stream: i915 perf stream
+ * @cmd: ioctl command

[Intel-gfx] [PATCH 2/6] drm/i915/gt: Lock intel_engine_apply_whitelist with uncore->lock

2020-10-02 Thread Umesh Nerlige Ramappa
Refactor intel_engine_apply_whitelist into locked and unlocked versions
so that a caller who already has the lock can apply whitelist.

Signed-off-by: Umesh Nerlige Ramappa 
---
 drivers/gpu/drm/i915/gt/intel_workarounds.c | 44 +++--
 1 file changed, 31 insertions(+), 13 deletions(-)

diff --git a/drivers/gpu/drm/i915/gt/intel_workarounds.c 
b/drivers/gpu/drm/i915/gt/intel_workarounds.c
index 6c580d0d9ea8..b7db34dc9687 100644
--- a/drivers/gpu/drm/i915/gt/intel_workarounds.c
+++ b/drivers/gpu/drm/i915/gt/intel_workarounds.c
@@ -1295,7 +1295,8 @@ void intel_gt_init_workarounds(struct drm_i915_private 
*i915)
 }
 
 static enum forcewake_domains
-wal_get_fw_for_rmw(struct intel_uncore *uncore, const struct i915_wa_list *wal)
+wal_get_fw(struct intel_uncore *uncore, const struct i915_wa_list *wal,
+  unsigned int op)
 {
enum forcewake_domains fw = 0;
struct i915_wa *wa;
@@ -1304,8 +1305,7 @@ wal_get_fw_for_rmw(struct intel_uncore *uncore, const 
struct i915_wa_list *wal)
for (i = 0, wa = wal->list; i < wal->count; i++, wa++)
fw |= intel_uncore_forcewake_for_reg(uncore,
 wa->reg,
-FW_REG_READ |
-FW_REG_WRITE);
+op);
 
return fw;
 }
@@ -1335,7 +1335,7 @@ wa_list_apply(struct intel_uncore *uncore, const struct 
i915_wa_list *wal)
if (!wal->count)
return;
 
-   fw = wal_get_fw_for_rmw(uncore, wal);
+   fw = wal_get_fw(uncore, wal, FW_REG_READ | FW_REG_WRITE);
 
spin_lock_irqsave(&uncore->lock, flags);
intel_uncore_forcewake_get__locked(uncore, fw);
@@ -1645,27 +1645,45 @@ void intel_engine_init_whitelist(struct intel_engine_cs 
*engine)
wa_init_finish(w);
 }
 
-void intel_engine_apply_whitelist(struct intel_engine_cs *engine)
+void intel_engine_apply_whitelist_locked(struct intel_engine_cs *engine)
 {
const struct i915_wa_list *wal = &engine->whitelist;
struct intel_uncore *uncore = engine->uncore;
const u32 base = engine->mmio_base;
struct i915_wa *wa;
unsigned int i;
+   enum forcewake_domains fw;
 
-   if (!wal->count)
-   return;
+   lockdep_assert_held(&uncore->lock);
+
+   fw = wal_get_fw(uncore, wal, FW_REG_WRITE);
+   intel_uncore_forcewake_get__locked(uncore, fw);
 
for (i = 0, wa = wal->list; i < wal->count; i++, wa++)
-   intel_uncore_write(uncore,
-  RING_FORCE_TO_NONPRIV(base, i),
-  i915_mmio_reg_offset(wa->reg));
+   intel_uncore_write_fw(uncore,
+ RING_FORCE_TO_NONPRIV(base, i),
+ i915_mmio_reg_offset(wa->reg));
 
/* And clear the rest just in case of garbage */
for (; i < RING_MAX_NONPRIV_SLOTS; i++)
-   intel_uncore_write(uncore,
-  RING_FORCE_TO_NONPRIV(base, i),
-  i915_mmio_reg_offset(RING_NOPID(base)));
+   intel_uncore_write_fw(uncore,
+ RING_FORCE_TO_NONPRIV(base, i),
+ i915_mmio_reg_offset(RING_NOPID(base)));
+
+   intel_uncore_forcewake_put__locked(uncore, fw);
+}
+
+void intel_engine_apply_whitelist(struct intel_engine_cs *engine)
+{
+   unsigned long flags;
+   const struct i915_wa_list *wal = &engine->whitelist;
+
+   if (!wal->count)
+   return;
+
+   spin_lock_irqsave(&engine->uncore->lock, flags);
+   intel_engine_apply_whitelist_locked(engine);
+   spin_unlock_irqrestore(&engine->uncore->lock, flags);
 }
 
 static void
-- 
2.20.1

___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx


[Intel-gfx] [PATCH] drm/i915/tgl/psr: Fix glitches when doing frontbuffer modifications

2020-10-02 Thread José Roberto de Souza
Writes to CURSURFLIVE in TGL are causing IOMMU errors and visual
glitches that are often reproduced when executing CPU intensive
workloads while a eDP 4K panel is attached.

Manually exiting PSR causes the frontbuffer to be updated without
glitches and the IOMMU errors are also gone but this comes at the cost
of less time with PSR active.

So using this workaround until this issue is root caused and a better
fix is found.

The current code is already ready to enable PSR after this exit if
there is not other frontbuffer modifications.

Adding a new if block in psr_force_hw_tracking_exit() instead of reuse
the else/gen8- block because the plan is to revert this workaround
as soon as a better solution is found.

Cc: Gwan-gyeong Mun 
Cc: Ville Syrjälä 
Signed-off-by: José Roberto de Souza 
---
 drivers/gpu/drm/i915/display/intel_psr.c | 16 +++-
 1 file changed, 15 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/i915/display/intel_psr.c 
b/drivers/gpu/drm/i915/display/intel_psr.c
index 8a9d0bdde1bf..8630121dbbbe 100644
--- a/drivers/gpu/drm/i915/display/intel_psr.c
+++ b/drivers/gpu/drm/i915/display/intel_psr.c
@@ -1152,7 +1152,21 @@ void intel_psr_disable(struct intel_dp *intel_dp,
 
 static void psr_force_hw_tracking_exit(struct drm_i915_private *dev_priv)
 {
-   if (INTEL_GEN(dev_priv) >= 9)
+   if (IS_TIGERLAKE(dev_priv))
+   /*
+* Writes to CURSURFLIVE in TGL are causing IOMMU errors and
+* visual glitches that are often reproduced when executing
+* CPU intensive workloads while a eDP 4K panel is attached.
+*
+* Manually exiting PSR causes the frontbuffer to be updated
+* without glitches and the IOMMU errors are also gone but
+* this comes at the cost of less time with PSR active.
+*
+* So using this workaround until this issue is root caused
+* and a better fix is found.
+*/
+   intel_psr_exit(dev_priv);
+   else if (INTEL_GEN(dev_priv) >= 9)
/*
 * Display WA #0884: skl+
 * This documented WA for bxt can be safely applied
-- 
2.28.0

___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx


Re: [Intel-gfx] [PATCH 10/61] drm/i915: Disable userptr pread/pwrite support.

2020-10-02 Thread Ruhl, Michael J
>-Original Message-
>From: Intel-gfx  On Behalf Of
>Maarten Lankhorst
>Sent: Friday, October 2, 2020 8:59 AM
>To: intel-gfx@lists.freedesktop.org
>Subject: [Intel-gfx] [PATCH 10/61] drm/i915: Disable userptr pread/pwrite
>support.
>
>Userptr should not need the kernel for a userspace memcpy, userspace
>needs to call memcpy directly.
>
>Signed-off-by: Maarten Lankhorst 
>---
> .../gpu/drm/i915/gem/i915_gem_object_types.h  |  2 ++
> drivers/gpu/drm/i915/gem/i915_gem_userptr.c   | 20
>+++
> drivers/gpu/drm/i915/i915_gem.c   |  5 +
> 3 files changed, 27 insertions(+)
>
>diff --git a/drivers/gpu/drm/i915/gem/i915_gem_object_types.h
>b/drivers/gpu/drm/i915/gem/i915_gem_object_types.h
>index 62dde3585b51..dbb6f6171165 100644
>--- a/drivers/gpu/drm/i915/gem/i915_gem_object_types.h
>+++ b/drivers/gpu/drm/i915/gem/i915_gem_object_types.h
>@@ -57,6 +57,8 @@ struct drm_i915_gem_object_ops {
>
>   int (*pwrite)(struct drm_i915_gem_object *obj,
> const struct drm_i915_gem_pwrite *arg);
>+  int (*pread)(struct drm_i915_gem_object *obj,
>+   const struct drm_i915_gem_pread *arg);
>
>   int (*dmabuf_export)(struct drm_i915_gem_object *obj);
>   void (*release)(struct drm_i915_gem_object *obj);
>diff --git a/drivers/gpu/drm/i915/gem/i915_gem_userptr.c
>b/drivers/gpu/drm/i915/gem/i915_gem_userptr.c
>index 22008948be58..136a589e5d94 100644
>--- a/drivers/gpu/drm/i915/gem/i915_gem_userptr.c
>+++ b/drivers/gpu/drm/i915/gem/i915_gem_userptr.c
>@@ -700,6 +700,24 @@ i915_gem_userptr_dmabuf_export(struct
>drm_i915_gem_object *obj)
>   return i915_gem_userptr_init__mmu_notifier(obj, 0);
> }
>
>+static int
>+i915_gem_userptr_pwrite(struct drm_i915_gem_object *obj,
>+  const struct drm_i915_gem_pwrite *args)
>+{
>+  drm_dbg(obj->base.dev, "pwrite to userptr no longer allowed\n");
>+
>+  return -EINVAL;

I have seen ENOSYS used for unsupported pread/pwrite (see radeon_gem.c).

I  have also seen ENOTSUPP for similar return values.

Is EINVAL the correct response?

Thanks,

m

>+}
>+
>+static int
>+i915_gem_userptr_pread(struct drm_i915_gem_object *obj,
>+ const struct drm_i915_gem_pread *args)
>+{
>+  drm_dbg(obj->base.dev, "pread from userptr no longer allowed\n");
>+
>+  return -EINVAL;
>+}
>+
> static const struct drm_i915_gem_object_ops i915_gem_userptr_ops = {
>   .name = "i915_gem_object_userptr",
>   .flags = I915_GEM_OBJECT_IS_SHRINKABLE |
>@@ -708,6 +726,8 @@ static const struct drm_i915_gem_object_ops
>i915_gem_userptr_ops = {
>   .get_pages = i915_gem_userptr_get_pages,
>   .put_pages = i915_gem_userptr_put_pages,
>   .dmabuf_export = i915_gem_userptr_dmabuf_export,
>+  .pwrite = i915_gem_userptr_pwrite,
>+  .pread = i915_gem_userptr_pread,
>   .release = i915_gem_userptr_release,
> };
>
>diff --git a/drivers/gpu/drm/i915/i915_gem.c
>b/drivers/gpu/drm/i915/i915_gem.c
>index 30af7e4b71ab..d349c0b796ec 100644
>--- a/drivers/gpu/drm/i915/i915_gem.c
>+++ b/drivers/gpu/drm/i915/i915_gem.c
>@@ -526,6 +526,11 @@ i915_gem_pread_ioctl(struct drm_device *dev, void
>*data,
>   }
>
>   trace_i915_gem_object_pread(obj, args->offset, args->size);
>+  ret = -ENODEV;
>+  if (obj->ops->pread)
>+  ret = obj->ops->pread(obj, args);
>+  if (ret != -ENODEV)
>+  goto out;
>
>   ret = i915_gem_object_wait(obj,
>  I915_WAIT_INTERRUPTIBLE,
>--
>2.28.0
>
>___
>Intel-gfx mailing list
>Intel-gfx@lists.freedesktop.org
>https://lists.freedesktop.org/mailman/listinfo/intel-gfx
___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx


[Intel-gfx] ✓ Fi.CI.IGT: success for drm/i915/gt: Track the most recent pulse for the heartbeat (rev2)

2020-10-02 Thread Patchwork
== Series Details ==

Series: drm/i915/gt: Track the most recent pulse for the heartbeat (rev2)
URL   : https://patchwork.freedesktop.org/series/82339/
State : success

== Summary ==

CI Bug Log - changes from CI_DRM_9092_full -> Patchwork_18615_full


Summary
---

  **SUCCESS**

  No regressions found.

  

Known issues


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

### IGT changes ###

 Issues hit 

  * igt@gem_eio@kms:
- shard-skl:  [PASS][1] -> [DMESG-WARN][2] ([i915#1982]) +12 
similar issues
   [1]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9092/shard-skl7/igt@gem_...@kms.html
   [2]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18615/shard-skl9/igt@gem_...@kms.html

  * igt@gem_userptr_blits@sync-unmap-cycles:
- shard-skl:  [PASS][3] -> [TIMEOUT][4] ([i915#2424])
   [3]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9092/shard-skl6/igt@gem_userptr_bl...@sync-unmap-cycles.html
   [4]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18615/shard-skl1/igt@gem_userptr_bl...@sync-unmap-cycles.html

  * igt@gen9_exec_parse@allowed-single:
- shard-skl:  [PASS][5] -> [DMESG-WARN][6] ([i915#1436] / 
[i915#716])
   [5]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9092/shard-skl8/igt@gen9_exec_pa...@allowed-single.html
   [6]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18615/shard-skl3/igt@gen9_exec_pa...@allowed-single.html

  * 
igt@kms_cursor_legacy@short-flip-before-cursor-atomic-transitions-varying-size:
- shard-tglb: [PASS][7] -> [DMESG-WARN][8] ([i915#1982]) +3 similar 
issues
   [7]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9092/shard-tglb8/igt@kms_cursor_leg...@short-flip-before-cursor-atomic-transitions-varying-size.html
   [8]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18615/shard-tglb1/igt@kms_cursor_leg...@short-flip-before-cursor-atomic-transitions-varying-size.html

  * igt@kms_flip@2x-absolute-wf_vblank-interruptible@ab-hdmi-a1-hdmi-a2:
- shard-glk:  [PASS][9] -> [DMESG-WARN][10] ([i915#1982])
   [9]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9092/shard-glk7/igt@kms_flip@2x-absolute-wf_vblank-interrupti...@ab-hdmi-a1-hdmi-a2.html
   [10]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18615/shard-glk8/igt@kms_flip@2x-absolute-wf_vblank-interrupti...@ab-hdmi-a1-hdmi-a2.html

  * igt@kms_flip@2x-absolute-wf_vblank-interruptible@ab-vga1-hdmi-a1:
- shard-hsw:  [PASS][11] -> [DMESG-WARN][12] ([i915#1982])
   [11]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9092/shard-hsw2/igt@kms_flip@2x-absolute-wf_vblank-interrupti...@ab-vga1-hdmi-a1.html
   [12]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18615/shard-hsw1/igt@kms_flip@2x-absolute-wf_vblank-interrupti...@ab-vga1-hdmi-a1.html

  * igt@kms_flip@2x-plain-flip-fb-recreate-interruptible@ab-hdmi-a1-hdmi-a2:
- shard-glk:  [PASS][13] -> [FAIL][14] ([i915#2122])
   [13]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9092/shard-glk3/igt@kms_flip@2x-plain-flip-fb-recreate-interrupti...@ab-hdmi-a1-hdmi-a2.html
   [14]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18615/shard-glk9/igt@kms_flip@2x-plain-flip-fb-recreate-interrupti...@ab-hdmi-a1-hdmi-a2.html

  * igt@kms_flip@flip-vs-expired-vblank-interruptible@a-edp1:
- shard-skl:  [PASS][15] -> [FAIL][16] ([i915#79])
   [15]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9092/shard-skl7/igt@kms_flip@flip-vs-expired-vblank-interrupti...@a-edp1.html
   [16]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18615/shard-skl3/igt@kms_flip@flip-vs-expired-vblank-interrupti...@a-edp1.html

  * igt@kms_flip@plain-flip-ts-check@c-edp1:
- shard-skl:  [PASS][17] -> [FAIL][18] ([i915#2122])
   [17]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9092/shard-skl7/igt@kms_flip@plain-flip-ts-ch...@c-edp1.html
   [18]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18615/shard-skl9/igt@kms_flip@plain-flip-ts-ch...@c-edp1.html

  * igt@kms_pipe_crc_basic@suspend-read-crc-pipe-a:
- shard-kbl:  [PASS][19] -> [DMESG-WARN][20] ([i915#180]) +1 
similar issue
   [19]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9092/shard-kbl4/igt@kms_pipe_crc_ba...@suspend-read-crc-pipe-a.html
   [20]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18615/shard-kbl2/igt@kms_pipe_crc_ba...@suspend-read-crc-pipe-a.html

  * igt@kms_vblank@pipe-c-accuracy-idle:
- shard-skl:  [PASS][21] -> [FAIL][22] ([i915#43])
   [21]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9092/shard-skl6/igt@kms_vbl...@pipe-c-accuracy-idle.html
   [22]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18615/shard-skl10/igt@kms_vbl...@pipe-c-accuracy-idle.html

  
 Possible fixes 

  * igt@gem_exec_create@forked:
- shard-hsw:  [INCOMPLETE][23] ([i915#2055]) -> [PASS][24]
   [23]: 
https://intel-gfx-

Re: [Intel-gfx] [PATCH 00/61] drm/i915: Remove obj->mm.lock!

2020-10-02 Thread Chris Wilson
Quoting Maarten Lankhorst (2020-10-02 13:58:38)
> Finally there, just needs a lot of fixes!

You are joking, right?
-Chris
___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx


[Intel-gfx] [PULL] drm-intel-next-fixes

2020-10-02 Thread Rodrigo Vivi
Hi Dave and Daniel,

Here goes our first next-fixes. Please be aware this includes
both drm-intel-next and drm-intel-gt-next.

Also, most of patches from drm-intel-gt-next were accumulated
for not being part of current drm-intel-fixes flow while we
are defining the new split and flow.

So, there are many important fixes for the next and current release
and also for previous stable branches.

drm-intel-next-fixes-2020-10-02:

Thanks,
Rodrigo.

Propagated from drm-intel-next-queued:
- Fix CRTC state checker (Ville)

Propated from drm-intel-gt-next:
- Avoid implicit vmpa for highmem on 32b (Chris)
- Prevent PAT attriutes for writecombine if CPU doesn't support PAT (Chris)
- Clear the buffer pool age before use. (Chris)
- Fix error code (Dan)
- Break up error capture compression loops (Chris)
- Fix uninitialized variable in context_create_request (Maarten)
- Check for errors on i915_vm_alloc_pt_stash to avoid NULL dereference (Matt)
- Serialize debugfs i915_gem_objects with ctx->mutex (Chris)
- Fix a rebase mistake caused during drm-intel-gt-next creation (Chris)
- Hold request reference for canceling an active context (Chris)
- Heartbeats fixes (Chris)
- Use usigned during batch copies (Chris)
The following changes since commit 32e4d9df60f71d641fbe628a9afbe2f44d7e9a37:

  agp: use semicolons rather than commas to separate statements (2020-09-28 
06:06:52 +1000)

are available in the Git repository at:

  git://anongit.freedesktop.org/drm/drm-intel 
tags/drm-intel-next-fixes-2020-10-02

for you to fetch changes up to c60b93cd4862d108214a14e655358ea714d7a12a:

  drm/i915: Avoid mixing integer types during batch copies (2020-09-30 14:24:54 
-0400)


Propagated from drm-intel-next-queued:
- Fix CRTC state checker (Ville)

Propated from drm-intel-gt-next:
- Avoid implicit vmpa for highmem on 32b (Chris)
- Prevent PAT attriutes for writecombine if CPU doesn't support PAT (Chris)
- Clear the buffer pool age before use. (Chris)
- Fix error code (Dan)
- Break up error capture compression loops (Chris)
- Fix uninitialized variable in context_create_request (Maarten)
- Check for errors on i915_vm_alloc_pt_stash to avoid NULL dereference (Matt)
- Serialize debugfs i915_gem_objects with ctx->mutex (Chris)
- Fix a rebase mistake caused during drm-intel-gt-next creation (Chris)
- Hold request reference for canceling an active context (Chris)
- Heartbeats fixes (Chris)
- Use usigned during batch copies (Chris)


Chris Wilson (11):
  drm/i915/gem: Avoid implicit vmap for highmem on x86-32
  drm/i915/gem: Prevent using pgprot_writecombine() if PAT is not supported
  drm/i915/gt: Clear the buffer pool age before use
  drm/i915: Break up error capture compression loops with cond_resched()
  drm/i915/gem: Serialise debugfs i915_gem_objects with ctx->mutex
  drm/i915: Redo "Remove i915_request.lock requirement for execution 
callbacks"
  drm/i915/gem: Hold request reference for canceling an active context
  drm/i915: Cancel outstanding work after disabling heartbeats on an engine
  drm/i915/gt: Always send a pulse down the engine after disabling heartbeat
  drm/i915/gem: Always test execution status on closing the context
  drm/i915: Avoid mixing integer types during batch copies

Dan Carpenter (1):
  drm/i915: Fix an error code i915_gem_object_copy_blt()

Maarten Lankhorst (1):
  drm/i915: Fix uninitialised variable in intel_context_create_request.

Matthew Auld (1):
  drm/i915: check i915_vm_alloc_pt_stash for errors

Ville Syrjälä (1):
  drm/i915: Fix state checker hw.active/hw.enable readout

 drivers/gpu/drm/i915/display/intel_display.c |  15 ++--
 drivers/gpu/drm/i915/gem/i915_gem_context.c  |  73 +++-
 drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c   |   7 +-
 drivers/gpu/drm/i915/gem/i915_gem_object_blt.c   |   2 +-
 drivers/gpu/drm/i915/gem/i915_gem_pages.c|  30 ++-
 drivers/gpu/drm/i915/gt/intel_context.c  |   1 +
 drivers/gpu/drm/i915/gt/intel_engine.h   |   9 ++
 drivers/gpu/drm/i915/gt/intel_engine_heartbeat.c | 106 ++-
 drivers/gpu/drm/i915/gt/intel_gt_buffer_pool.c   |   2 +
 drivers/gpu/drm/i915/i915_cmd_parser.c   |  10 +--
 drivers/gpu/drm/i915/i915_debugfs.c  |   2 +
 drivers/gpu/drm/i915/i915_drv.h  |   4 +-
 drivers/gpu/drm/i915/i915_gpu_error.c|   3 +
 drivers/gpu/drm/i915/i915_request.c  |  17 ++--
 drivers/gpu/drm/i915/i915_vma.c  |   8 +-
 15 files changed, 175 insertions(+), 114 deletions(-)
___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx


[Intel-gfx] ✗ Fi.CI.IGT: failure for drm/i915: Remove obj->mm.lock!

2020-10-02 Thread Patchwork
== Series Details ==

Series: drm/i915: Remove obj->mm.lock!
URL   : https://patchwork.freedesktop.org/series/82337/
State : failure

== Summary ==

CI Bug Log - changes from CI_DRM_9092_full -> Patchwork_18613_full


Summary
---

  **FAILURE**

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

  

Possible new issues
---

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

### IGT changes ###

 Possible regressions 

  * igt@gem_eio@reset-stress:
- shard-skl:  [PASS][1] -> [FAIL][2]
   [1]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9092/shard-skl6/igt@gem_...@reset-stress.html
   [2]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18613/shard-skl3/igt@gem_...@reset-stress.html

  * igt@gem_exec_schedule@pi-distinct-iova@rcs0:
- shard-iclb: [PASS][3] -> [INCOMPLETE][4] +1 similar issue
   [3]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9092/shard-iclb7/igt@gem_exec_schedule@pi-distinct-i...@rcs0.html
   [4]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18613/shard-iclb8/igt@gem_exec_schedule@pi-distinct-i...@rcs0.html

  * igt@gem_exec_schedule@pi-shared-iova@bcs0:
- shard-tglb: [PASS][5] -> [INCOMPLETE][6] +1 similar issue
   [5]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9092/shard-tglb2/igt@gem_exec_schedule@pi-shared-i...@bcs0.html
   [6]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18613/shard-tglb1/igt@gem_exec_schedule@pi-shared-i...@bcs0.html

  * igt@gem_exec_schedule@pi-shared-iova@rcs0:
- shard-kbl:  NOTRUN -> [INCOMPLETE][7] +1 similar issue
   [7]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18613/shard-kbl7/igt@gem_exec_schedule@pi-shared-i...@rcs0.html
- shard-skl:  [PASS][8] -> [INCOMPLETE][9] +1 similar issue
   [8]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9092/shard-skl3/igt@gem_exec_schedule@pi-shared-i...@rcs0.html
   [9]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18613/shard-skl7/igt@gem_exec_schedule@pi-shared-i...@rcs0.html
- shard-glk:  [PASS][10] -> [INCOMPLETE][11] +2 similar issues
   [10]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9092/shard-glk7/igt@gem_exec_schedule@pi-shared-i...@rcs0.html
   [11]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18613/shard-glk2/igt@gem_exec_schedule@pi-shared-i...@rcs0.html

  * igt@gem_mmap_wc@copy:
- shard-hsw:  [PASS][12] -> [FAIL][13]
   [12]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9092/shard-hsw6/igt@gem_mmap...@copy.html
   [13]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18613/shard-hsw7/igt@gem_mmap...@copy.html

  * igt@gem_userptr_blits@map-fixed-invalidate-overlap-gup:
- shard-iclb: NOTRUN -> [SKIP][14] +13 similar issues
   [14]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18613/shard-iclb3/igt@gem_userptr_bl...@map-fixed-invalidate-overlap-gup.html

  * igt@gem_userptr_blits@process-exit-mmap:
- shard-tglb: NOTRUN -> [SKIP][15] +13 similar issues
   [15]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18613/shard-tglb8/igt@gem_userptr_bl...@process-exit-mmap.html

  * igt@gem_userptr_blits@stress-mm-invalidate-close:
- shard-iclb: [PASS][16] -> [SKIP][17] +24 similar issues
   [16]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9092/shard-iclb2/igt@gem_userptr_bl...@stress-mm-invalidate-close.html
   [17]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18613/shard-iclb1/igt@gem_userptr_bl...@stress-mm-invalidate-close.html

  * igt@gem_userptr_blits@unsync-unmap-cycles:
- shard-tglb: [PASS][18] -> [SKIP][19] +24 similar issues
   [18]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9092/shard-tglb6/igt@gem_userptr_bl...@unsync-unmap-cycles.html
   [19]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18613/shard-tglb8/igt@gem_userptr_bl...@unsync-unmap-cycles.html

  
 Warnings 

  * igt@gem_userptr_blits@coherency-unsync:
- shard-tglb: [SKIP][20] ([fdo#110542]) -> [SKIP][21] +1 similar 
issue
   [20]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9092/shard-tglb8/igt@gem_userptr_bl...@coherency-unsync.html
   [21]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18613/shard-tglb6/igt@gem_userptr_bl...@coherency-unsync.html
- shard-iclb: [SKIP][22] ([fdo#109290]) -> [SKIP][23] +1 similar 
issue
   [22]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9092/shard-iclb6/igt@gem_userptr_bl...@coherency-unsync.html
   [23]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18613/shard-iclb6/igt@gem_userptr_bl...@coherency-unsync.html

  * igt@gem_

[Intel-gfx] ✗ Fi.CI.BUILD: failure for drm/i915: fix size_t greater or equal to zero comparison

2020-10-02 Thread Patchwork
== Series Details ==

Series: drm/i915: fix size_t greater or equal to zero comparison
URL   : https://patchwork.freedesktop.org/series/82342/
State : failure

== Summary ==

Applying: drm/i915: fix size_t greater or equal to zero comparison
Using index info to reconstruct a base tree...
M   drivers/gpu/drm/i915/gt/shmem_utils.c
Falling back to patching base and 3-way merge...
Auto-merging drivers/gpu/drm/i915/gt/shmem_utils.c
CONFLICT (content): Merge conflict in drivers/gpu/drm/i915/gt/shmem_utils.c
error: Failed to merge in the changes.
hint: Use 'git am --show-current-patch=diff' to see the failed patch
Patch failed at 0001 drm/i915: fix size_t greater or equal to zero comparison
When you have resolved this problem, run "git am --continue".
If you prefer to skip this patch, run "git am --skip" instead.
To restore the original branch and stop patching, run "git am --abort".


___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx


[Intel-gfx] [PATCH][next] drm/i915: fix size_t greater or equal to zero comparison

2020-10-02 Thread Colin King
From: Colin Ian King 

Currently the check that the unsigned size_t variable i is >= 0
is always true because the unsigned variable will never be negative,
causing the loop to run forever.  Fix this by changing the
pre-decrement check to a zero check on i followed by a decrement of i.

Addresses-Coverity: ("Unsigned compared against 0")
Fixes: 400b65cb5acb ("drm/i915: use vmap in shmem_pin_map")
Signed-off-by: Colin Ian King 
---
 drivers/gpu/drm/i915/gt/shmem_utils.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/i915/gt/shmem_utils.c 
b/drivers/gpu/drm/i915/gt/shmem_utils.c
index f011ea42487e..30cc56fa191f 100644
--- a/drivers/gpu/drm/i915/gt/shmem_utils.c
+++ b/drivers/gpu/drm/i915/gt/shmem_utils.c
@@ -73,7 +73,7 @@ void *shmem_pin_map(struct file *file)
mapping_set_unevictable(file->f_mapping);
return vaddr;
 err_page:
-   while (--i >= 0)
+   while (i--)
put_page(pages[i]);
kvfree(pages);
return NULL;
-- 
2.27.0

___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx


Re: [Intel-gfx] [PATCH rdma-next v4 1/4] lib/scatterlist: Add support in dynamic allocation of SG table from pages

2020-10-02 Thread Jason Gunthorpe
On Fri, Oct 02, 2020 at 07:11:33PM +0300, Maor Gottlieb wrote:
> 
> On 10/2/2020 6:02 PM, Jason Gunthorpe wrote:
> > On Sun, Sep 27, 2020 at 09:46:44AM +0300, Leon Romanovsky wrote:
> > > +struct scatterlist *__sg_alloc_table_from_pages(struct sg_table *sgt,
> > > + struct page **pages, unsigned int n_pages, unsigned int offset,
> > > + unsigned long size, unsigned int max_segment,
> > > + struct scatterlist *prv, unsigned int left_pages,
> > > + gfp_t gfp_mask)
> > >   {
> > > - unsigned int chunks, cur_page, seg_len, i;
> > > + unsigned int chunks, cur_page, seg_len, i, prv_len = 0;
> > > + struct scatterlist *s = prv;
> > > + unsigned int table_size;
> > > + unsigned int tmp_nents;
> > >   int ret;
> > > - struct scatterlist *s;
> > > 
> > >   if (WARN_ON(!max_segment || offset_in_page(max_segment)))
> > > - return -EINVAL;
> > > + return ERR_PTR(-EINVAL);
> > > + if (IS_ENABLED(CONFIG_ARCH_NO_SG_CHAIN) && prv)
> > > + return ERR_PTR(-EOPNOTSUPP);
> > > +
> > > + tmp_nents = prv ? sgt->nents : 0;
> > > +
> > > + if (prv &&
> > > + page_to_pfn(sg_page(prv)) + (prv->length >> PAGE_SHIFT) ==
> > This calculation of the end doesn't consider sg->offset
> 
> Right, should be fixed.
> > 
> > > + page_to_pfn(pages[0]))
> > > + prv_len = prv->length;
> > > 
> > >   /* compute number of contiguous chunks */
> > >   chunks = 1;
> > > @@ -410,13 +461,17 @@ int __sg_alloc_table_from_pages(struct sg_table 
> > > *sgt, struct page **pages,
> > >   }
> > >   }
> > > 
> > > - ret = sg_alloc_table(sgt, chunks, gfp_mask);
> > > - if (unlikely(ret))
> > > - return ret;
> > > + if (!prv) {
> > > + /* Only the last allocation could be less than the maximum */
> > > + table_size = left_pages ? SG_MAX_SINGLE_ALLOC : chunks;
> > > + ret = sg_alloc_table(sgt, table_size, gfp_mask);
> > > + if (unlikely(ret))
> > > + return ERR_PTR(ret);
> > > + }
> > This is basically redundant right? Now that get_next_sg() can allocate
> > SGs it can just build them one by one, no need to preallocate.
> > 
> > Actually all the changes the the allocation seem like overkill, just
> > allocate a single new array directly in get_next_sg() whenever it
> > needs.
> 
> No, only the last allocation could be less than maximum. (as written in the
> comment).

The point is that get_next_sg is fully redundent with
sg_alloc_table() because it is always used in cases when prv is
set. There is zero reason to call sg_alloc_table here in the one case
where prv is not set.

Further this cleans up the spagehtti goto in the middle of the for
loop and avoids allocating an extra chunk if the page list fully fits
in prv.

Given how much smaller it is I think you should look more carefully.

Jason
___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx


Re: [Intel-gfx] [PATCH rdma-next v4 1/4] lib/scatterlist: Add support in dynamic allocation of SG table from pages

2020-10-02 Thread Maor Gottlieb



On 10/2/2020 6:02 PM, Jason Gunthorpe wrote:

On Sun, Sep 27, 2020 at 09:46:44AM +0300, Leon Romanovsky wrote:

+struct scatterlist *__sg_alloc_table_from_pages(struct sg_table *sgt,
+   struct page **pages, unsigned int n_pages, unsigned int offset,
+   unsigned long size, unsigned int max_segment,
+   struct scatterlist *prv, unsigned int left_pages,
+   gfp_t gfp_mask)
  {
-   unsigned int chunks, cur_page, seg_len, i;
+   unsigned int chunks, cur_page, seg_len, i, prv_len = 0;
+   struct scatterlist *s = prv;
+   unsigned int table_size;
+   unsigned int tmp_nents;
int ret;
-   struct scatterlist *s;

if (WARN_ON(!max_segment || offset_in_page(max_segment)))
-   return -EINVAL;
+   return ERR_PTR(-EINVAL);
+   if (IS_ENABLED(CONFIG_ARCH_NO_SG_CHAIN) && prv)
+   return ERR_PTR(-EOPNOTSUPP);
+
+   tmp_nents = prv ? sgt->nents : 0;
+
+   if (prv &&
+   page_to_pfn(sg_page(prv)) + (prv->length >> PAGE_SHIFT) ==

This calculation of the end doesn't consider sg->offset


Right, should be fixed.



+   page_to_pfn(pages[0]))
+   prv_len = prv->length;

/* compute number of contiguous chunks */
chunks = 1;
@@ -410,13 +461,17 @@ int __sg_alloc_table_from_pages(struct sg_table *sgt, 
struct page **pages,
}
}

-   ret = sg_alloc_table(sgt, chunks, gfp_mask);
-   if (unlikely(ret))
-   return ret;
+   if (!prv) {
+   /* Only the last allocation could be less than the maximum */
+   table_size = left_pages ? SG_MAX_SINGLE_ALLOC : chunks;
+   ret = sg_alloc_table(sgt, table_size, gfp_mask);
+   if (unlikely(ret))
+   return ERR_PTR(ret);
+   }

This is basically redundant right? Now that get_next_sg() can allocate
SGs it can just build them one by one, no need to preallocate.

Actually all the changes the the allocation seem like overkill, just
allocate a single new array directly in get_next_sg() whenever it
needs.


No, only the last allocation could be less than maximum. (as written in 
the comment).

I am preferring to stick with the current implementation and fix the offset.


Something like this:

@@ -365,6 +372,37 @@ int sg_alloc_table(struct sg_table *table, unsigned int 
nents, gfp_t gfp_mask)
  }
  EXPORT_SYMBOL(sg_alloc_table);
  
+static struct scatterlist *get_next_sg(struct sg_table *table,

+   struct scatterlist *cur, unsigned long needed_sges,
+   gfp_t gfp_mask)
+{
+   struct scatterlist *new_sg;
+   unsigned int alloc_size;
+
+   if (cur) {
+   struct scatterlist *next_sg = sg_next(cur);
+
+   /* Check if last entry should be keeped for chainning */
+   if (!sg_is_last(next_sg) || needed_sges == 1)
+   return next_sg;
+   }
+
+   alloc_size = min_t(unsigned long, needed_sges, SG_MAX_SINGLE_ALLOC);
+   new_sg = sg_kmalloc(alloc_size, gfp_mask);
+   if (!new_sg)
+   return ERR_PTR(-ENOMEM);
+   sg_init_table(new_sg, alloc_size);
+   if (cur) {
+   __sg_chain(cur, new_sg);
+   table->orig_nents += alloc_size - 1;
+   } else {
+   table->sgl = new_sg;
+   table->orig_nents = alloc_size;
+   table->nents = 0;
+   }
+   return new_sg;
+}
+
  /**
   * __sg_alloc_table_from_pages - Allocate and initialize an sg table from
   * an array of pages
@@ -374,29 +412,64 @@ EXPORT_SYMBOL(sg_alloc_table);
   * @offset:  Offset from start of the first page to the start of a buffer
   * @size:Number of valid bytes in the buffer (after offset)
   * @max_segment: Maximum size of a scatterlist node in bytes (page aligned)
+ * @prv:Last populated sge in sgt
+ * @left_pages:  Left pages caller have to set after this call
   * @gfp_mask:  GFP allocation mask
   *
- *  Description:
- *Allocate and initialize an sg table from a list of pages. Contiguous
- *ranges of the pages are squashed into a single scatterlist node up to the
- *maximum size specified in @max_segment. An user may provide an offset at 
a
- *start and a size of valid data in a buffer specified by the page array.
- *The returned sg table is released by sg_free_table.
+ * Description:
+ *If @prv is NULL, allocate and initialize an sg table from a list of 
pages,
+ *else reuse the scatterlist passed in at @prv.
+ *Contiguous ranges of the pages are squashed into a single scatterlist
+ *entry up to the maximum size specified in @max_segment.  A user may
+ *provide an offset at a start and a size of valid data in a buffer
+ *specified by the page array.
   *
   * Returns:
- *   0 on success, negative error on failure
+ *   Last SGE in sgt on success, PTR_ERR on otherwise.
+ *  

[Intel-gfx] ✓ Fi.CI.BAT: success for drm/i915/gt: Track the most recent pulse for the heartbeat (rev2)

2020-10-02 Thread Patchwork
== Series Details ==

Series: drm/i915/gt: Track the most recent pulse for the heartbeat (rev2)
URL   : https://patchwork.freedesktop.org/series/82339/
State : success

== Summary ==

CI Bug Log - changes from CI_DRM_9092 -> Patchwork_18615


Summary
---

  **SUCCESS**

  No regressions found.

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

Known issues


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

### IGT changes ###

 Issues hit 

  * igt@kms_cursor_legacy@basic-busy-flip-before-cursor-atomic:
- fi-byt-j1900:   [PASS][1] -> [DMESG-WARN][2] ([i915#1982])
   [1]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9092/fi-byt-j1900/igt@kms_cursor_leg...@basic-busy-flip-before-cursor-atomic.html
   [2]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18615/fi-byt-j1900/igt@kms_cursor_leg...@basic-busy-flip-before-cursor-atomic.html

  
 Possible fixes 

  * igt@kms_busy@basic@flip:
- fi-kbl-x1275:   [DMESG-WARN][3] ([i915#62] / [i915#92] / [i915#95]) 
-> [PASS][4]
   [3]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9092/fi-kbl-x1275/igt@kms_busy@ba...@flip.html
   [4]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18615/fi-kbl-x1275/igt@kms_busy@ba...@flip.html

  * igt@kms_cursor_legacy@basic-busy-flip-before-cursor-legacy:
- fi-icl-u2:  [DMESG-WARN][5] ([i915#1982]) -> [PASS][6] +2 similar 
issues
   [5]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9092/fi-icl-u2/igt@kms_cursor_leg...@basic-busy-flip-before-cursor-legacy.html
   [6]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18615/fi-icl-u2/igt@kms_cursor_leg...@basic-busy-flip-before-cursor-legacy.html

  * igt@vgem_basic@unload:
- fi-skl-guc: [DMESG-WARN][7] ([i915#2203]) -> [PASS][8]
   [7]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9092/fi-skl-guc/igt@vgem_ba...@unload.html
   [8]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18615/fi-skl-guc/igt@vgem_ba...@unload.html

  
 Warnings 

  * igt@gem_exec_suspend@basic-s0:
- fi-kbl-x1275:   [DMESG-WARN][9] ([i915#1982] / [i915#62] / [i915#92] 
/ [i915#95]) -> [DMESG-WARN][10] ([i915#62] / [i915#92] / [i915#95])
   [9]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9092/fi-kbl-x1275/igt@gem_exec_susp...@basic-s0.html
   [10]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18615/fi-kbl-x1275/igt@gem_exec_susp...@basic-s0.html

  * igt@kms_cursor_legacy@basic-busy-flip-before-cursor-legacy:
- fi-kbl-x1275:   [DMESG-WARN][11] ([i915#62] / [i915#92] / [i915#95]) 
-> [DMESG-WARN][12] ([i915#62] / [i915#92]) +1 similar issue
   [11]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9092/fi-kbl-x1275/igt@kms_cursor_leg...@basic-busy-flip-before-cursor-legacy.html
   [12]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18615/fi-kbl-x1275/igt@kms_cursor_leg...@basic-busy-flip-before-cursor-legacy.html

  * igt@kms_cursor_legacy@basic-flip-after-cursor-legacy:
- fi-kbl-x1275:   [DMESG-WARN][13] ([i915#62] / [i915#92]) -> 
[DMESG-WARN][14] ([i915#62] / [i915#92] / [i915#95]) +3 similar issues
   [13]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9092/fi-kbl-x1275/igt@kms_cursor_leg...@basic-flip-after-cursor-legacy.html
   [14]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18615/fi-kbl-x1275/igt@kms_cursor_leg...@basic-flip-after-cursor-legacy.html

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

  [i915#1982]: https://gitlab.freedesktop.org/drm/intel/issues/1982
  [i915#2203]: https://gitlab.freedesktop.org/drm/intel/issues/2203
  [i915#62]: https://gitlab.freedesktop.org/drm/intel/issues/62
  [i915#92]: https://gitlab.freedesktop.org/drm/intel/issues/92
  [i915#95]: https://gitlab.freedesktop.org/drm/intel/issues/95


Participating hosts (45 -> 39)
--

  Missing(6): fi-ilk-m540 fi-hsw-4200u fi-byt-squawks fi-bsw-cyan 
fi-byt-clapper fi-bdw-samus 


Build changes
-

  * Linux: CI_DRM_9092 -> Patchwork_18615

  CI-20190529: 20190529
  CI_DRM_9092: 4e9a7e28ea34e4b14e66cbc53fc004e4a93f5168 @ 
git://anongit.freedesktop.org/gfx-ci/linux
  IGT_5797: 1a7ef7eb5e99c9a8f4ffbc13cdae399a01a9aa12 @ 
git://anongit.freedesktop.org/xorg/app/intel-gpu-tools
  Patchwork_18615: a6637cb8f4717bf942b5a76b56bb2dc255373fa1 @ 
git://anongit.freedesktop.org/gfx-ci/linux


== Linux commits ==

a6637cb8f471 drm/i915/gt: Track the most recent pulse for the heartbeat

== Logs ==

For more details see: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18615/index.html
___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx


Re: [Intel-gfx] [PATCH rdma-next v4 1/4] lib/scatterlist: Add support in dynamic allocation of SG table from pages

2020-10-02 Thread Jason Gunthorpe
On Sun, Sep 27, 2020 at 09:46:44AM +0300, Leon Romanovsky wrote:
> +struct scatterlist *__sg_alloc_table_from_pages(struct sg_table *sgt,
> + struct page **pages, unsigned int n_pages, unsigned int offset,
> + unsigned long size, unsigned int max_segment,
> + struct scatterlist *prv, unsigned int left_pages,
> + gfp_t gfp_mask)
>  {
> - unsigned int chunks, cur_page, seg_len, i;
> + unsigned int chunks, cur_page, seg_len, i, prv_len = 0;
> + struct scatterlist *s = prv;
> + unsigned int table_size;
> + unsigned int tmp_nents;
>   int ret;
> - struct scatterlist *s;
> 
>   if (WARN_ON(!max_segment || offset_in_page(max_segment)))
> - return -EINVAL;
> + return ERR_PTR(-EINVAL);
> + if (IS_ENABLED(CONFIG_ARCH_NO_SG_CHAIN) && prv)
> + return ERR_PTR(-EOPNOTSUPP);
> +
> + tmp_nents = prv ? sgt->nents : 0;
> +
> + if (prv &&
> + page_to_pfn(sg_page(prv)) + (prv->length >> PAGE_SHIFT) ==

This calculation of the end doesn't consider sg->offset

> + page_to_pfn(pages[0]))
> + prv_len = prv->length;
> 
>   /* compute number of contiguous chunks */
>   chunks = 1;
> @@ -410,13 +461,17 @@ int __sg_alloc_table_from_pages(struct sg_table *sgt, 
> struct page **pages,
>   }
>   }
> 
> - ret = sg_alloc_table(sgt, chunks, gfp_mask);
> - if (unlikely(ret))
> - return ret;
> + if (!prv) {
> + /* Only the last allocation could be less than the maximum */
> + table_size = left_pages ? SG_MAX_SINGLE_ALLOC : chunks;
> + ret = sg_alloc_table(sgt, table_size, gfp_mask);
> + if (unlikely(ret))
> + return ERR_PTR(ret);
> + }

This is basically redundant right? Now that get_next_sg() can allocate
SGs it can just build them one by one, no need to preallocate.

Actually all the changes the the allocation seem like overkill, just
allocate a single new array directly in get_next_sg() whenever it
needs.

Something like this:

@@ -365,6 +372,37 @@ int sg_alloc_table(struct sg_table *table, unsigned int 
nents, gfp_t gfp_mask)
 }
 EXPORT_SYMBOL(sg_alloc_table);
 
+static struct scatterlist *get_next_sg(struct sg_table *table,
+   struct scatterlist *cur, unsigned long needed_sges,
+   gfp_t gfp_mask)
+{
+   struct scatterlist *new_sg;
+   unsigned int alloc_size;
+
+   if (cur) {
+   struct scatterlist *next_sg = sg_next(cur);
+
+   /* Check if last entry should be keeped for chainning */
+   if (!sg_is_last(next_sg) || needed_sges == 1)
+   return next_sg;
+   }
+
+   alloc_size = min_t(unsigned long, needed_sges, SG_MAX_SINGLE_ALLOC);
+   new_sg = sg_kmalloc(alloc_size, gfp_mask);
+   if (!new_sg)
+   return ERR_PTR(-ENOMEM);
+   sg_init_table(new_sg, alloc_size);
+   if (cur) {
+   __sg_chain(cur, new_sg);
+   table->orig_nents += alloc_size - 1;
+   } else {
+   table->sgl = new_sg;
+   table->orig_nents = alloc_size;
+   table->nents = 0;
+   }
+   return new_sg;
+}
+
 /**
  * __sg_alloc_table_from_pages - Allocate and initialize an sg table from
  *  an array of pages
@@ -374,29 +412,64 @@ EXPORT_SYMBOL(sg_alloc_table);
  * @offset:  Offset from start of the first page to the start of a buffer
  * @size:Number of valid bytes in the buffer (after offset)
  * @max_segment: Maximum size of a scatterlist node in bytes (page aligned)
+ * @prv:Last populated sge in sgt
+ * @left_pages:  Left pages caller have to set after this call
  * @gfp_mask:   GFP allocation mask
  *
- *  Description:
- *Allocate and initialize an sg table from a list of pages. Contiguous
- *ranges of the pages are squashed into a single scatterlist node up to the
- *maximum size specified in @max_segment. An user may provide an offset at 
a
- *start and a size of valid data in a buffer specified by the page array.
- *The returned sg table is released by sg_free_table.
+ * Description:
+ *If @prv is NULL, allocate and initialize an sg table from a list of 
pages,
+ *else reuse the scatterlist passed in at @prv.
+ *Contiguous ranges of the pages are squashed into a single scatterlist
+ *entry up to the maximum size specified in @max_segment.  A user may
+ *provide an offset at a start and a size of valid data in a buffer
+ *specified by the page array.
  *
  * Returns:
- *   0 on success, negative error on failure
+ *   Last SGE in sgt on success, PTR_ERR on otherwise.
+ *   The allocation in @sgt must be released by sg_free_table.
+ *
+ * Notes:
+ *   If this function returns non-0 (eg failure), the caller must call
+ *   sg_free_table() to cleanup any leftover allocations.
  */
-int __sg_alloc_table_from_page

[Intel-gfx] [PATCH v2] drm/i915/gt: Track the most recent pulse for the heartbeat

2020-10-02 Thread Chris Wilson
Since we track the idle_pulse for flushing the barriers and avoid
re-emitting the pulse upon idling if no futher action is required, this
also impacts the heartbeat. Before emitting a fresh heartbeat, we look
at the engine idle status and assume that if the pulse was the last
request emitted along the heartbeat, the engine is idling and a
heartbeat pulse not required. This assumption fails, but we can reuse
the idle pulse as the heartbeat if we are yet to emit one, and so track
the status of that pulse for our engine health check.

This impacts tgl/rcs0 as we rely on the heartbeat for our healthcheck for
the normal preemption detection mechanism is disabled by default.

Testcase: igt/gem_exec_schedule/preempt-hang/rcs0 #tgl
Signed-off-by: Chris Wilson 
Cc: Tvrtko Ursulin 
---
 drivers/gpu/drm/i915/gt/intel_engine_heartbeat.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/i915/gt/intel_engine_heartbeat.c 
b/drivers/gpu/drm/i915/gt/intel_engine_heartbeat.c
index 5067d0524d4b..33c4356675ac 100644
--- a/drivers/gpu/drm/i915/gt/intel_engine_heartbeat.c
+++ b/drivers/gpu/drm/i915/gt/intel_engine_heartbeat.c
@@ -41,6 +41,8 @@ static void idle_pulse(struct intel_engine_cs *engine, struct 
i915_request *rq)
 {
engine->wakeref_serial = READ_ONCE(engine->serial) + 1;
i915_request_add_active_barriers(rq);
+   if (!engine->heartbeat.systole && intel_engine_has_heartbeat(engine))
+   engine->heartbeat.systole = i915_request_get(rq);
 }
 
 static void show_heartbeat(const struct i915_request *rq,
@@ -144,8 +146,6 @@ static void heartbeat(struct work_struct *wrk)
goto unlock;
 
idle_pulse(engine, rq);
-   if (engine->i915->params.enable_hangcheck)
-   engine->heartbeat.systole = i915_request_get(rq);
 
__i915_request_commit(rq);
__i915_request_queue(rq, &attr);
-- 
2.20.1

___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx


[Intel-gfx] ✗ Fi.CI.BAT: failure for drm/i915/gt: Track the most recent pulse for the heartbeat

2020-10-02 Thread Patchwork
== Series Details ==

Series: drm/i915/gt: Track the most recent pulse for the heartbeat
URL   : https://patchwork.freedesktop.org/series/82339/
State : failure

== Summary ==

CI Bug Log - changes from CI_DRM_9092 -> Patchwork_18614


Summary
---

  **FAILURE**

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

Possible new issues
---

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

### IGT changes ###

 Possible regressions 

  * igt@i915_selftest@live@gt_heartbeat:
- fi-skl-6600u:   [PASS][1] -> [DMESG-FAIL][2]
   [1]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9092/fi-skl-6600u/igt@i915_selftest@live@gt_heartbeat.html
   [2]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18614/fi-skl-6600u/igt@i915_selftest@live@gt_heartbeat.html
- fi-kbl-guc: [PASS][3] -> [DMESG-FAIL][4]
   [3]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9092/fi-kbl-guc/igt@i915_selftest@live@gt_heartbeat.html
   [4]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18614/fi-kbl-guc/igt@i915_selftest@live@gt_heartbeat.html
- fi-cfl-8109u:   [PASS][5] -> [DMESG-FAIL][6]
   [5]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9092/fi-cfl-8109u/igt@i915_selftest@live@gt_heartbeat.html
   [6]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18614/fi-cfl-8109u/igt@i915_selftest@live@gt_heartbeat.html
- fi-skl-lmem:[PASS][7] -> [DMESG-FAIL][8]
   [7]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9092/fi-skl-lmem/igt@i915_selftest@live@gt_heartbeat.html
   [8]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18614/fi-skl-lmem/igt@i915_selftest@live@gt_heartbeat.html
- fi-kbl-r:   [PASS][9] -> [DMESG-FAIL][10]
   [9]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9092/fi-kbl-r/igt@i915_selftest@live@gt_heartbeat.html
   [10]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18614/fi-kbl-r/igt@i915_selftest@live@gt_heartbeat.html
- fi-cml-u2:  [PASS][11] -> [DMESG-FAIL][12]
   [11]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9092/fi-cml-u2/igt@i915_selftest@live@gt_heartbeat.html
   [12]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18614/fi-cml-u2/igt@i915_selftest@live@gt_heartbeat.html
- fi-cml-s:   [PASS][13] -> [DMESG-FAIL][14]
   [13]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9092/fi-cml-s/igt@i915_selftest@live@gt_heartbeat.html
   [14]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18614/fi-cml-s/igt@i915_selftest@live@gt_heartbeat.html
- fi-cfl-guc: [PASS][15] -> [DMESG-FAIL][16]
   [15]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9092/fi-cfl-guc/igt@i915_selftest@live@gt_heartbeat.html
   [16]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18614/fi-cfl-guc/igt@i915_selftest@live@gt_heartbeat.html
- fi-skl-guc: [PASS][17] -> [DMESG-FAIL][18]
   [17]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9092/fi-skl-guc/igt@i915_selftest@live@gt_heartbeat.html
   [18]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18614/fi-skl-guc/igt@i915_selftest@live@gt_heartbeat.html
- fi-icl-y:   [PASS][19] -> [DMESG-FAIL][20]
   [19]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9092/fi-icl-y/igt@i915_selftest@live@gt_heartbeat.html
   [20]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18614/fi-icl-y/igt@i915_selftest@live@gt_heartbeat.html
- fi-cfl-8700k:   [PASS][21] -> [DMESG-FAIL][22]
   [21]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9092/fi-cfl-8700k/igt@i915_selftest@live@gt_heartbeat.html
   [22]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18614/fi-cfl-8700k/igt@i915_selftest@live@gt_heartbeat.html

  
 Suppressed 

  The following results come from untrusted machines, tests, or statuses.
  They do not affect the overall result.

  * igt@i915_selftest@live@gt_heartbeat:
- {fi-ehl-1}: [PASS][23] -> [DMESG-FAIL][24]
   [23]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9092/fi-ehl-1/igt@i915_selftest@live@gt_heartbeat.html
   [24]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18614/fi-ehl-1/igt@i915_selftest@live@gt_heartbeat.html
- {fi-kbl-7560u}: [PASS][25] -> [DMESG-FAIL][26]
   [25]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9092/fi-kbl-7560u/igt@i915_selftest@live@gt_heartbeat.html
   [26]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18614/fi-kbl-7560u/igt@i915_selftest@live@gt_heartbeat.html

  
Known issues


  Here are the changes found in Patchwork_18614 that come from known is

[Intel-gfx] [PATCH] drm/i915/gt: Track the most recent pulse for the heartbeat

2020-10-02 Thread Chris Wilson
Since we track the idle_pulse for flushing the barriers and avoid
re-emitting the pulse upon idling if no futher action is required, this
also impacts the heartbeat. Before emitting a fresh heartbeat, we look
at the engine idle status and assume that if the pulse was the last
request emitted along the heartbeat, the engine is idling and a
heartbeat pulse not required. This assumption fails, but we can reuse
the idle pulse as the heartbeat if we are yet to emit one, and so track
the status of that pulse for our engine health check.

This impacts tgl/rcs0 as we rely on the heartbeat for our healthcheck for
the normal preemption detection mechanism is disabled by default.

Testcase: igt/gem_exec_schedule/preempt-hang/rcs0 #tgl
Signed-off-by: Chris Wilson 
Cc: Tvrtko Ursulin 
---
 drivers/gpu/drm/i915/gt/intel_engine_heartbeat.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/i915/gt/intel_engine_heartbeat.c 
b/drivers/gpu/drm/i915/gt/intel_engine_heartbeat.c
index 5067d0524d4b..f355efc9108c 100644
--- a/drivers/gpu/drm/i915/gt/intel_engine_heartbeat.c
+++ b/drivers/gpu/drm/i915/gt/intel_engine_heartbeat.c
@@ -41,6 +41,8 @@ static void idle_pulse(struct intel_engine_cs *engine, struct 
i915_request *rq)
 {
engine->wakeref_serial = READ_ONCE(engine->serial) + 1;
i915_request_add_active_barriers(rq);
+   if (!engine->heartbeat.systole && engine->i915->params.enable_hangcheck)
+   engine->heartbeat.systole = i915_request_get(rq);
 }
 
 static void show_heartbeat(const struct i915_request *rq,
@@ -144,8 +146,6 @@ static void heartbeat(struct work_struct *wrk)
goto unlock;
 
idle_pulse(engine, rq);
-   if (engine->i915->params.enable_hangcheck)
-   engine->heartbeat.systole = i915_request_get(rq);
 
__i915_request_commit(rq);
__i915_request_queue(rq, &attr);
-- 
2.20.1

___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx


[Intel-gfx] ✓ Fi.CI.BAT: success for drm/i915: Remove obj->mm.lock!

2020-10-02 Thread Patchwork
== Series Details ==

Series: drm/i915: Remove obj->mm.lock!
URL   : https://patchwork.freedesktop.org/series/82337/
State : success

== Summary ==

CI Bug Log - changes from CI_DRM_9092 -> Patchwork_18613


Summary
---

  **SUCCESS**

  No regressions found.

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

Possible new issues
---

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

### IGT changes ###

 Suppressed 

  The following results come from untrusted machines, tests, or statuses.
  They do not affect the overall result.

  * {igt@gem_exec_parallel@engines@userptr}:
- fi-kbl-r:   [PASS][1] -> [FAIL][2]
   [1]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9092/fi-kbl-r/igt@gem_exec_parallel@engi...@userptr.html
   [2]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18613/fi-kbl-r/igt@gem_exec_parallel@engi...@userptr.html
- fi-cfl-8109u:   [PASS][3] -> [FAIL][4]
   [3]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9092/fi-cfl-8109u/igt@gem_exec_parallel@engi...@userptr.html
   [4]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18613/fi-cfl-8109u/igt@gem_exec_parallel@engi...@userptr.html
- {fi-tgl-dsi}:   [PASS][5] -> [FAIL][6]
   [5]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9092/fi-tgl-dsi/igt@gem_exec_parallel@engi...@userptr.html
   [6]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18613/fi-tgl-dsi/igt@gem_exec_parallel@engi...@userptr.html
- fi-blb-e6850:   [PASS][7] -> [FAIL][8]
   [7]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9092/fi-blb-e6850/igt@gem_exec_parallel@engi...@userptr.html
   [8]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18613/fi-blb-e6850/igt@gem_exec_parallel@engi...@userptr.html
- fi-bsw-nick:[PASS][9] -> [FAIL][10]
   [9]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9092/fi-bsw-nick/igt@gem_exec_parallel@engi...@userptr.html
   [10]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18613/fi-bsw-nick/igt@gem_exec_parallel@engi...@userptr.html
- fi-icl-y:   [PASS][11] -> [FAIL][12]
   [11]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9092/fi-icl-y/igt@gem_exec_parallel@engi...@userptr.html
   [12]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18613/fi-icl-y/igt@gem_exec_parallel@engi...@userptr.html
- fi-snb-2520m:   [PASS][13] -> [FAIL][14]
   [13]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9092/fi-snb-2520m/igt@gem_exec_parallel@engi...@userptr.html
   [14]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18613/fi-snb-2520m/igt@gem_exec_parallel@engi...@userptr.html
- fi-cml-u2:  [PASS][15] -> [FAIL][16]
   [15]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9092/fi-cml-u2/igt@gem_exec_parallel@engi...@userptr.html
   [16]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18613/fi-cml-u2/igt@gem_exec_parallel@engi...@userptr.html
- fi-pnv-d510:[PASS][17] -> [FAIL][18]
   [17]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9092/fi-pnv-d510/igt@gem_exec_parallel@engi...@userptr.html
   [18]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18613/fi-pnv-d510/igt@gem_exec_parallel@engi...@userptr.html
- fi-cfl-8700k:   [PASS][19] -> [FAIL][20]
   [19]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9092/fi-cfl-8700k/igt@gem_exec_parallel@engi...@userptr.html
   [20]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18613/fi-cfl-8700k/igt@gem_exec_parallel@engi...@userptr.html
- fi-icl-u2:  [PASS][21] -> [FAIL][22]
   [21]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9092/fi-icl-u2/igt@gem_exec_parallel@engi...@userptr.html
   [22]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18613/fi-icl-u2/igt@gem_exec_parallel@engi...@userptr.html
- {fi-ehl-1}: [PASS][23] -> [FAIL][24]
   [23]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9092/fi-ehl-1/igt@gem_exec_parallel@engi...@userptr.html
   [24]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18613/fi-ehl-1/igt@gem_exec_parallel@engi...@userptr.html
- fi-skl-6600u:   [PASS][25] -> [FAIL][26]
   [25]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9092/fi-skl-6600u/igt@gem_exec_parallel@engi...@userptr.html
   [26]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18613/fi-skl-6600u/igt@gem_exec_parallel@engi...@userptr.html
- fi-bsw-n3050:   [PASS][27] -> [FAIL][28]
   [27]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9092/fi-bsw-n3050/igt@gem_exec_parallel@engi...@userptr.html
   [28]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_18613/fi-bsw-n3050/igt@gem_exec_parallel@engi...@userptr.html
- fi-byt-j1900:   [PASS][29] -> [FAIL][30]
   [29]: 
https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9092/fi-byt-j1900/igt@gem_exec_parallel@engi...@userptr.html
   [30]: 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwor

[Intel-gfx] [PATCH 47/61] drm/i915/selftests: Prepare object tests for obj->mm.lock removal.

2020-10-02 Thread Maarten Lankhorst
Convert a single pin_pages call to use the unlocked version.

Signed-off-by: Maarten Lankhorst 
---
 drivers/gpu/drm/i915/gem/selftests/i915_gem_object.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/i915/gem/selftests/i915_gem_object.c 
b/drivers/gpu/drm/i915/gem/selftests/i915_gem_object.c
index bf853c40ec65..740ee8086a27 100644
--- a/drivers/gpu/drm/i915/gem/selftests/i915_gem_object.c
+++ b/drivers/gpu/drm/i915/gem/selftests/i915_gem_object.c
@@ -47,7 +47,7 @@ static int igt_gem_huge(void *arg)
if (IS_ERR(obj))
return PTR_ERR(obj);
 
-   err = i915_gem_object_pin_pages(obj);
+   err = i915_gem_object_pin_pages_unlocked(obj);
if (err) {
pr_err("Failed to allocate %u pages (%lu total), err=%d\n",
   nreal, obj->base.size / PAGE_SIZE, err);
-- 
2.28.0

___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx


[Intel-gfx] [PATCH 51/61] drm/i915/selftests: Prepare hangcheck for obj->mm.lock removal

2020-10-02 Thread Maarten Lankhorst
Convert a few calls to use the unlocked versions.

Signed-off-by: Maarten Lankhorst 
---
 drivers/gpu/drm/i915/gt/selftest_hangcheck.c | 8 
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/drivers/gpu/drm/i915/gt/selftest_hangcheck.c 
b/drivers/gpu/drm/i915/gt/selftest_hangcheck.c
index fb5ebf930ab2..e3027cebab5b 100644
--- a/drivers/gpu/drm/i915/gt/selftest_hangcheck.c
+++ b/drivers/gpu/drm/i915/gt/selftest_hangcheck.c
@@ -80,15 +80,15 @@ static int hang_init(struct hang *h, struct intel_gt *gt)
}
 
i915_gem_object_set_cache_coherency(h->hws, I915_CACHE_LLC);
-   vaddr = i915_gem_object_pin_map(h->hws, I915_MAP_WB);
+   vaddr = i915_gem_object_pin_map_unlocked(h->hws, I915_MAP_WB);
if (IS_ERR(vaddr)) {
err = PTR_ERR(vaddr);
goto err_obj;
}
h->seqno = memset(vaddr, 0xff, PAGE_SIZE);
 
-   vaddr = i915_gem_object_pin_map(h->obj,
-   i915_coherent_map_type(gt->i915));
+   vaddr = i915_gem_object_pin_map_unlocked(h->obj,
+
i915_coherent_map_type(gt->i915));
if (IS_ERR(vaddr)) {
err = PTR_ERR(vaddr);
goto err_unpin_hws;
@@ -149,7 +149,7 @@ hang_create_request(struct hang *h, struct intel_engine_cs 
*engine)
return ERR_CAST(obj);
}
 
-   vaddr = i915_gem_object_pin_map(obj, i915_coherent_map_type(gt->i915));
+   vaddr = i915_gem_object_pin_map_unlocked(obj, 
i915_coherent_map_type(gt->i915));
if (IS_ERR(vaddr)) {
i915_gem_object_put(obj);
i915_vm_put(vm);
-- 
2.28.0

___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx


[Intel-gfx] [PATCH 19/61] drm/i915: Handle ww locking in init_status_page

2020-10-02 Thread Maarten Lankhorst
Try to pin to ggtt first, and use a full ww loop to handle
eviction correctly.

Signed-off-by: Maarten Lankhorst 
---
 drivers/gpu/drm/i915/gt/intel_engine_cs.c | 37 +++
 1 file changed, 24 insertions(+), 13 deletions(-)

diff --git a/drivers/gpu/drm/i915/gt/intel_engine_cs.c 
b/drivers/gpu/drm/i915/gt/intel_engine_cs.c
index 1985772152bf..66d87ce764e0 100644
--- a/drivers/gpu/drm/i915/gt/intel_engine_cs.c
+++ b/drivers/gpu/drm/i915/gt/intel_engine_cs.c
@@ -615,6 +615,7 @@ static void cleanup_status_page(struct intel_engine_cs 
*engine)
 }
 
 static int pin_ggtt_status_page(struct intel_engine_cs *engine,
+   struct i915_gem_ww_ctx *ww,
struct i915_vma *vma)
 {
unsigned int flags;
@@ -635,12 +636,13 @@ static int pin_ggtt_status_page(struct intel_engine_cs 
*engine,
else
flags = PIN_HIGH;
 
-   return i915_ggtt_pin(vma, NULL, 0, flags);
+   return i915_ggtt_pin(vma, ww, 0, flags);
 }
 
 static int init_status_page(struct intel_engine_cs *engine)
 {
struct drm_i915_gem_object *obj;
+   struct i915_gem_ww_ctx ww;
struct i915_vma *vma;
void *vaddr;
int ret;
@@ -664,30 +666,39 @@ static int init_status_page(struct intel_engine_cs 
*engine)
vma = i915_vma_instance(obj, &engine->gt->ggtt->vm, NULL);
if (IS_ERR(vma)) {
ret = PTR_ERR(vma);
-   goto err;
+   goto err_put;
}
 
+   i915_gem_ww_ctx_init(&ww, true);
+retry:
+   ret = i915_gem_object_lock(obj, &ww);
+   if (!ret && !HWS_NEEDS_PHYSICAL(engine->i915))
+   ret = pin_ggtt_status_page(engine, &ww, vma);
+   if (ret)
+   goto err;
+
vaddr = i915_gem_object_pin_map(obj, I915_MAP_WB);
if (IS_ERR(vaddr)) {
ret = PTR_ERR(vaddr);
-   goto err;
+   goto err_unpin;
}
 
engine->status_page.addr = memset(vaddr, 0, PAGE_SIZE);
engine->status_page.vma = vma;
 
-   if (!HWS_NEEDS_PHYSICAL(engine->i915)) {
-   ret = pin_ggtt_status_page(engine, vma);
-   if (ret)
-   goto err_unpin;
-   }
-
-   return 0;
-
 err_unpin:
-   i915_gem_object_unpin_map(obj);
+   if (ret)
+   i915_vma_unpin(vma);
 err:
-   i915_gem_object_put(obj);
+   if (ret == -EDEADLK) {
+   ret = i915_gem_ww_ctx_backoff(&ww);
+   if (!ret)
+   goto retry;
+   }
+   i915_gem_ww_ctx_fini(&ww);
+err_put:
+   if (ret)
+   i915_gem_object_put(obj);
return ret;
 }
 
-- 
2.28.0

___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx


[Intel-gfx] [PATCH 54/61] drm/i915/selftests: Prepare ring submission for obj->mm.lock removal

2020-10-02 Thread Maarten Lankhorst
Use unlocked versions when the ww lock is not held.

Signed-off-by: Maarten Lankhorst 
---
 drivers/gpu/drm/i915/gt/selftest_ring_submission.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/i915/gt/selftest_ring_submission.c 
b/drivers/gpu/drm/i915/gt/selftest_ring_submission.c
index 3350e7c995bc..99609271c3a7 100644
--- a/drivers/gpu/drm/i915/gt/selftest_ring_submission.c
+++ b/drivers/gpu/drm/i915/gt/selftest_ring_submission.c
@@ -35,7 +35,7 @@ static struct i915_vma *create_wally(struct intel_engine_cs 
*engine)
return ERR_PTR(err);
}
 
-   cs = i915_gem_object_pin_map(obj, I915_MAP_WC);
+   cs = i915_gem_object_pin_map_unlocked(obj, I915_MAP_WC);
if (IS_ERR(cs)) {
i915_gem_object_put(obj);
return ERR_CAST(cs);
@@ -212,7 +212,7 @@ static int __live_ctx_switch_wa(struct intel_engine_cs 
*engine)
if (IS_ERR(bb))
return PTR_ERR(bb);
 
-   result = i915_gem_object_pin_map(bb->obj, I915_MAP_WC);
+   result = i915_gem_object_pin_map_unlocked(bb->obj, I915_MAP_WC);
if (IS_ERR(result)) {
intel_context_put(bb->private);
i915_vma_unpin_and_release(&bb, 0);
-- 
2.28.0

___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx


[Intel-gfx] [PATCH 49/61] drm/i915/selftests: Prepare igt_gem_utils for obj->mm.lock removal

2020-10-02 Thread Maarten Lankhorst
igt_emit_store_dw needs to use the unlocked version, as it's not
holding a lock. This fixes igt_gpu_fill_dw() which is used by
some other selftests.

Signed-off-by: Maarten Lankhorst 
---
 drivers/gpu/drm/i915/gem/selftests/igt_gem_utils.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/i915/gem/selftests/igt_gem_utils.c 
b/drivers/gpu/drm/i915/gem/selftests/igt_gem_utils.c
index e21b5023ca7d..f4e85b4a347d 100644
--- a/drivers/gpu/drm/i915/gem/selftests/igt_gem_utils.c
+++ b/drivers/gpu/drm/i915/gem/selftests/igt_gem_utils.c
@@ -54,7 +54,7 @@ igt_emit_store_dw(struct i915_vma *vma,
if (IS_ERR(obj))
return ERR_CAST(obj);
 
-   cmd = i915_gem_object_pin_map(obj, I915_MAP_WC);
+   cmd = i915_gem_object_pin_map_unlocked(obj, I915_MAP_WC);
if (IS_ERR(cmd)) {
err = PTR_ERR(cmd);
goto err;
-- 
2.28.0

___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx


[Intel-gfx] [PATCH 39/61] drm/i915: Use a single page table lock for each gtt.

2020-10-02 Thread Maarten Lankhorst
We may create page table objects on the fly, but we may need to
wait with the ww lock held. Instead of waiting on a freed obj
lock, ensure we have the same lock for each object to keep
-EDEADLK working. This ensures that i915_vma_pin_ww can lock
the page tables when required.

Signed-off-by: Maarten Lankhorst 
---
 drivers/gpu/drm/i915/gt/intel_ggtt.c  |  8 +-
 drivers/gpu/drm/i915/gt/intel_gtt.c   | 38 ++-
 drivers/gpu/drm/i915/gt/intel_gtt.h   |  5 
 drivers/gpu/drm/i915/gt/intel_ppgtt.c |  3 ++-
 drivers/gpu/drm/i915/i915_vma.c   |  5 
 5 files changed, 56 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/i915/gt/intel_ggtt.c 
b/drivers/gpu/drm/i915/gt/intel_ggtt.c
index 317f377a95c6..a34e1c349145 100644
--- a/drivers/gpu/drm/i915/gt/intel_ggtt.c
+++ b/drivers/gpu/drm/i915/gt/intel_ggtt.c
@@ -615,7 +615,9 @@ static int init_aliasing_ppgtt(struct i915_ggtt *ggtt)
if (err)
goto err_ppgtt;
 
+   i915_gem_object_lock(ppgtt->vm.scratch[0], NULL);
err = i915_vm_pin_pt_stash(&ppgtt->vm, &stash);
+   i915_gem_object_unlock(ppgtt->vm.scratch[0]);
if (err)
goto err_stash;
 
@@ -702,6 +704,7 @@ static void ggtt_cleanup_hw(struct i915_ggtt *ggtt)
 
mutex_unlock(&ggtt->vm.mutex);
i915_address_space_fini(&ggtt->vm);
+   dma_resv_fini(&ggtt->vm.resv);
 
arch_phys_wc_del(ggtt->mtrr);
 
@@ -1078,6 +1081,7 @@ static int ggtt_probe_hw(struct i915_ggtt *ggtt, struct 
intel_gt *gt)
ggtt->vm.gt = gt;
ggtt->vm.i915 = i915;
ggtt->vm.dma = &i915->drm.pdev->dev;
+   dma_resv_init(&ggtt->vm.resv);
 
if (INTEL_GEN(i915) <= 5)
ret = i915_gmch_probe(ggtt);
@@ -1085,8 +1089,10 @@ static int ggtt_probe_hw(struct i915_ggtt *ggtt, struct 
intel_gt *gt)
ret = gen6_gmch_probe(ggtt);
else
ret = gen8_gmch_probe(ggtt);
-   if (ret)
+   if (ret) {
+   dma_resv_fini(&ggtt->vm.resv);
return ret;
+   }
 
if ((ggtt->vm.total - 1) >> 32) {
drm_err(&i915->drm,
diff --git a/drivers/gpu/drm/i915/gt/intel_gtt.c 
b/drivers/gpu/drm/i915/gt/intel_gtt.c
index 3f1114b58b01..567a2f875088 100644
--- a/drivers/gpu/drm/i915/gt/intel_gtt.c
+++ b/drivers/gpu/drm/i915/gt/intel_gtt.c
@@ -13,16 +13,36 @@
 
 struct drm_i915_gem_object *alloc_pt_dma(struct i915_address_space *vm, int sz)
 {
+   struct drm_i915_gem_object *obj;
+
if (I915_SELFTEST_ONLY(should_fail(&vm->fault_attr, 1)))
i915_gem_shrink_all(vm->i915);
 
-   return i915_gem_object_create_internal(vm->i915, sz);
+   obj = i915_gem_object_create_internal(vm->i915, sz);
+   /* ensure all dma objects have the same reservation class */
+   if (!IS_ERR(obj))
+   obj->base.resv = &vm->resv;
+   return obj;
 }
 
 int pin_pt_dma(struct i915_address_space *vm, struct drm_i915_gem_object *obj)
 {
int err;
 
+   i915_gem_object_lock(obj, NULL);
+   err = i915_gem_object_pin_pages(obj);
+   i915_gem_object_unlock(obj);
+   if (err)
+   return err;
+
+   i915_gem_object_make_unshrinkable(obj);
+   return 0;
+}
+
+int pin_pt_dma_locked(struct i915_address_space *vm, struct 
drm_i915_gem_object *obj)
+{
+   int err;
+
err = i915_gem_object_pin_pages(obj);
if (err)
return err;
@@ -56,6 +76,20 @@ void __i915_vm_close(struct i915_address_space *vm)
mutex_unlock(&vm->mutex);
 }
 
+/* lock the vm into the current ww, if we lock one, we lock all */
+int i915_vm_lock_objects(struct i915_address_space *vm,
+struct i915_gem_ww_ctx *ww)
+{
+   if (vm->scratch[0]->base.resv == &vm->resv) {
+   return i915_gem_object_lock(vm->scratch[0], ww);
+   } else {
+   struct i915_ppgtt *ppgtt = i915_vm_to_ppgtt(vm);
+
+   /* We borrowed the scratch page from ggtt, take the top level 
object */
+   return i915_gem_object_lock(ppgtt->pd->pt.base, ww);
+   }
+}
+
 void i915_address_space_fini(struct i915_address_space *vm)
 {
drm_mm_takedown(&vm->mm);
@@ -69,6 +103,7 @@ static void __i915_vm_release(struct work_struct *work)
 
vm->cleanup(vm);
i915_address_space_fini(vm);
+   dma_resv_fini(&vm->resv);
 
kfree(vm);
 }
@@ -98,6 +133,7 @@ void i915_address_space_init(struct i915_address_space *vm, 
int subclass)
mutex_init(&vm->mutex);
lockdep_set_subclass(&vm->mutex, subclass);
i915_gem_shrinker_taints_mutex(vm->i915, &vm->mutex);
+   dma_resv_init(&vm->resv);
 
GEM_BUG_ON(!vm->total);
drm_mm_init(&vm->mm, 0, vm->total);
diff --git a/drivers/gpu/drm/i915/gt/intel_gtt.h 
b/drivers/gpu/drm/i915/gt/intel_gtt.h
index c13c650ced22..2c5557cc84ae 100644
--- a/drivers/gpu/drm/i915/gt/intel_gtt.h
+++ b/drivers/gpu/drm/i915/gt/intel_gtt.h
@@ -238,6 +238,7 @

[Intel-gfx] [PATCH 53/61] drm/i915/selftests: Prepare mocs tests for obj->mm.lock removal

2020-10-02 Thread Maarten Lankhorst
Use pin_map_unlocked when we're not holding locks.

Signed-off-by: Maarten Lankhorst 
---
 drivers/gpu/drm/i915/gt/selftest_mocs.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/i915/gt/selftest_mocs.c 
b/drivers/gpu/drm/i915/gt/selftest_mocs.c
index b25eba50c88e..5765c31fa80f 100644
--- a/drivers/gpu/drm/i915/gt/selftest_mocs.c
+++ b/drivers/gpu/drm/i915/gt/selftest_mocs.c
@@ -105,7 +105,7 @@ static int live_mocs_init(struct live_mocs *arg, struct 
intel_gt *gt)
if (IS_ERR(arg->scratch))
return PTR_ERR(arg->scratch);
 
-   arg->vaddr = i915_gem_object_pin_map(arg->scratch->obj, I915_MAP_WB);
+   arg->vaddr = i915_gem_object_pin_map_unlocked(arg->scratch->obj, 
I915_MAP_WB);
if (IS_ERR(arg->vaddr)) {
err = PTR_ERR(arg->vaddr);
goto err_scratch;
-- 
2.28.0

___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx


[Intel-gfx] [PATCH 48/61] drm/i915/selftests: Prepare object blit tests for obj->mm.lock removal.

2020-10-02 Thread Maarten Lankhorst
Use some unlocked versions where we're not holding the ww lock.

Signed-off-by: Maarten Lankhorst 
---
 drivers/gpu/drm/i915/gem/selftests/i915_gem_object_blt.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/i915/gem/selftests/i915_gem_object_blt.c 
b/drivers/gpu/drm/i915/gem/selftests/i915_gem_object_blt.c
index 23b6e11bbc3e..ee9496f3d11d 100644
--- a/drivers/gpu/drm/i915/gem/selftests/i915_gem_object_blt.c
+++ b/drivers/gpu/drm/i915/gem/selftests/i915_gem_object_blt.c
@@ -262,7 +262,7 @@ static int igt_fill_blt_thread(void *arg)
goto err_flush;
}
 
-   vaddr = i915_gem_object_pin_map(obj, I915_MAP_WB);
+   vaddr = i915_gem_object_pin_map_unlocked(obj, I915_MAP_WB);
if (IS_ERR(vaddr)) {
err = PTR_ERR(vaddr);
goto err_put;
@@ -380,7 +380,7 @@ static int igt_copy_blt_thread(void *arg)
goto err_flush;
}
 
-   vaddr = i915_gem_object_pin_map(src, I915_MAP_WB);
+   vaddr = i915_gem_object_pin_map_unlocked(src, I915_MAP_WB);
if (IS_ERR(vaddr)) {
err = PTR_ERR(vaddr);
goto err_put_src;
@@ -400,7 +400,7 @@ static int igt_copy_blt_thread(void *arg)
goto err_put_src;
}
 
-   vaddr = i915_gem_object_pin_map(dst, I915_MAP_WB);
+   vaddr = i915_gem_object_pin_map_unlocked(dst, I915_MAP_WB);
if (IS_ERR(vaddr)) {
err = PTR_ERR(vaddr);
goto err_put_dst;
-- 
2.28.0

___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx


[Intel-gfx] [PATCH 50/61] drm/i915/selftests: Prepare context selftest for obj->mm.lock removal

2020-10-02 Thread Maarten Lankhorst
Only needs to convert a single call to the unlocked version.

Signed-off-by: Maarten Lankhorst 
---
 drivers/gpu/drm/i915/gt/selftest_context.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/i915/gt/selftest_context.c 
b/drivers/gpu/drm/i915/gt/selftest_context.c
index 1f4020e906a8..d9b0ebc938f1 100644
--- a/drivers/gpu/drm/i915/gt/selftest_context.c
+++ b/drivers/gpu/drm/i915/gt/selftest_context.c
@@ -88,8 +88,8 @@ static int __live_context_size(struct intel_engine_cs *engine)
if (err)
goto err;
 
-   vaddr = i915_gem_object_pin_map(ce->state->obj,
-   i915_coherent_map_type(engine->i915));
+   vaddr = i915_gem_object_pin_map_unlocked(ce->state->obj,
+
i915_coherent_map_type(engine->i915));
if (IS_ERR(vaddr)) {
err = PTR_ERR(vaddr);
intel_context_unpin(ce);
-- 
2.28.0

___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx


[Intel-gfx] [PATCH 43/61] drm/i915/selftests: Prepare context tests for obj->mm.lock removal.

2020-10-02 Thread Maarten Lankhorst
Straightforward conversion, just convert a bunch of calls to
unlocked versions.

Signed-off-by: Maarten Lankhorst 
---
 drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c | 10 +-
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c 
b/drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c
index d3f87dc4eda3..5fef592390cb 100644
--- a/drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c
+++ b/drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c
@@ -1094,7 +1094,7 @@ __read_slice_count(struct intel_context *ce,
if (ret < 0)
return ret;
 
-   buf = i915_gem_object_pin_map(obj, I915_MAP_WB);
+   buf = i915_gem_object_pin_map_unlocked(obj, I915_MAP_WB);
if (IS_ERR(buf)) {
ret = PTR_ERR(buf);
return ret;
@@ -1511,7 +1511,7 @@ static int write_to_scratch(struct i915_gem_context *ctx,
if (IS_ERR(obj))
return PTR_ERR(obj);
 
-   cmd = i915_gem_object_pin_map(obj, I915_MAP_WB);
+   cmd = i915_gem_object_pin_map_unlocked(obj, I915_MAP_WB);
if (IS_ERR(cmd)) {
err = PTR_ERR(cmd);
goto out;
@@ -1622,7 +1622,7 @@ static int read_from_scratch(struct i915_gem_context *ctx,
if (err)
goto out_vm;
 
-   cmd = i915_gem_object_pin_map(obj, I915_MAP_WB);
+   cmd = i915_gem_object_pin_map_unlocked(obj, I915_MAP_WB);
if (IS_ERR(cmd)) {
err = PTR_ERR(cmd);
goto out;
@@ -1658,7 +1658,7 @@ static int read_from_scratch(struct i915_gem_context *ctx,
if (err)
goto out_vm;
 
-   cmd = i915_gem_object_pin_map(obj, I915_MAP_WB);
+   cmd = i915_gem_object_pin_map_unlocked(obj, I915_MAP_WB);
if (IS_ERR(cmd)) {
err = PTR_ERR(cmd);
goto out;
@@ -1715,7 +1715,7 @@ static int read_from_scratch(struct i915_gem_context *ctx,
if (err)
goto out_vm;
 
-   cmd = i915_gem_object_pin_map(obj, I915_MAP_WB);
+   cmd = i915_gem_object_pin_map_unlocked(obj, I915_MAP_WB);
if (IS_ERR(cmd)) {
err = PTR_ERR(cmd);
goto out_vm;
-- 
2.28.0

___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx


[Intel-gfx] [PATCH 60/61] drm/i915: Finally remove obj->mm.lock.

2020-10-02 Thread Maarten Lankhorst
With all callers and selftests fixed to use ww locking, we can now
finally remove this lock.

Signed-off-by: Maarten Lankhorst 
---
 drivers/gpu/drm/i915/gem/i915_gem_object.c|  2 -
 drivers/gpu/drm/i915/gem/i915_gem_object.h|  5 +--
 .../gpu/drm/i915/gem/i915_gem_object_types.h  |  1 -
 drivers/gpu/drm/i915/gem/i915_gem_pages.c | 38 ---
 drivers/gpu/drm/i915/gem/i915_gem_phys.c  | 34 -
 drivers/gpu/drm/i915/gem/i915_gem_shmem.c |  2 +-
 drivers/gpu/drm/i915/gem/i915_gem_shrinker.c  | 37 +-
 drivers/gpu/drm/i915/gem/i915_gem_shrinker.h  |  4 +-
 drivers/gpu/drm/i915/gem/i915_gem_tiling.c|  2 -
 drivers/gpu/drm/i915/gem/i915_gem_userptr.c   |  3 +-
 drivers/gpu/drm/i915/i915_debugfs.c   |  4 +-
 drivers/gpu/drm/i915/i915_gem.c   |  8 +---
 drivers/gpu/drm/i915/i915_gem_gtt.c   |  2 +-
 13 files changed, 53 insertions(+), 89 deletions(-)

diff --git a/drivers/gpu/drm/i915/gem/i915_gem_object.c 
b/drivers/gpu/drm/i915/gem/i915_gem_object.c
index af5d561de7dc..afea180f500d 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_object.c
+++ b/drivers/gpu/drm/i915/gem/i915_gem_object.c
@@ -62,8 +62,6 @@ void i915_gem_object_init(struct drm_i915_gem_object *obj,
  const struct drm_i915_gem_object_ops *ops,
  struct lock_class_key *key, unsigned flags)
 {
-   mutex_init(&obj->mm.lock);
-
spin_lock_init(&obj->vma.lock);
INIT_LIST_HEAD(&obj->vma.list);
 
diff --git a/drivers/gpu/drm/i915/gem/i915_gem_object.h 
b/drivers/gpu/drm/i915/gem/i915_gem_object.h
index 135a7a16d2d4..6afa2018a252 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_object.h
+++ b/drivers/gpu/drm/i915/gem/i915_gem_object.h
@@ -123,7 +123,7 @@ static inline void assert_object_held_shared(struct 
drm_i915_gem_object *obj)
 */
if (IS_ENABLED(CONFIG_LOCKDEP) &&
kref_read(&obj->base.refcount) > 0)
-   lockdep_assert_held(&obj->mm.lock);
+   assert_object_held(obj);
 }
 
 static inline int __i915_gem_object_lock(struct drm_i915_gem_object *obj,
@@ -311,7 +311,7 @@ int __i915_gem_object_get_pages(struct drm_i915_gem_object 
*obj);
 static inline int __must_check
 i915_gem_object_pin_pages(struct drm_i915_gem_object *obj)
 {
-   might_lock(&obj->mm.lock);
+   assert_object_held(obj);
 
if (atomic_inc_not_zero(&obj->mm.pages_pin_count))
return 0;
@@ -357,7 +357,6 @@ i915_gem_object_unpin_pages(struct drm_i915_gem_object *obj)
 }
 
 int __i915_gem_object_put_pages(struct drm_i915_gem_object *obj);
-int __i915_gem_object_put_pages_locked(struct drm_i915_gem_object *obj);
 void i915_gem_object_truncate(struct drm_i915_gem_object *obj);
 void i915_gem_object_writeback(struct drm_i915_gem_object *obj);
 
diff --git a/drivers/gpu/drm/i915/gem/i915_gem_object_types.h 
b/drivers/gpu/drm/i915/gem/i915_gem_object_types.h
index d3f65df6d6b3..09b4df17c5d1 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_object_types.h
+++ b/drivers/gpu/drm/i915/gem/i915_gem_object_types.h
@@ -201,7 +201,6 @@ struct drm_i915_gem_object {
 * Protects the pages and their use. Do not use directly, but
 * instead go through the pin/unpin interfaces.
 */
-   struct mutex lock;
atomic_t pages_pin_count;
atomic_t shrink_pin;
 
diff --git a/drivers/gpu/drm/i915/gem/i915_gem_pages.c 
b/drivers/gpu/drm/i915/gem/i915_gem_pages.c
index 84711dad5ca8..88c905624363 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_pages.c
+++ b/drivers/gpu/drm/i915/gem/i915_gem_pages.c
@@ -65,7 +65,7 @@ void __i915_gem_object_set_pages(struct drm_i915_gem_object 
*obj,
struct list_head *list;
unsigned long flags;
 
-   lockdep_assert_held(&obj->mm.lock);
+   assert_object_held(obj);
spin_lock_irqsave(&i915->mm.obj_lock, flags);
 
i915->mm.shrink_count++;
@@ -112,9 +112,7 @@ int __i915_gem_object_get_pages(struct drm_i915_gem_object 
*obj)
 {
int err;
 
-   err = mutex_lock_interruptible(&obj->mm.lock);
-   if (err)
-   return err;
+   assert_object_held(obj);
 
assert_object_held_shared(obj);
 
@@ -123,15 +121,13 @@ int __i915_gem_object_get_pages(struct 
drm_i915_gem_object *obj)
 
err = i915_gem_object_get_pages(obj);
if (err)
-   goto unlock;
+   return err;
 
smp_mb__before_atomic();
}
atomic_inc(&obj->mm.pages_pin_count);
 
-unlock:
-   mutex_unlock(&obj->mm.lock);
-   return err;
+   return 0;
 }
 
 int i915_gem_object_pin_pages_unlocked(struct drm_i915_gem_object *obj)
@@ -218,7 +214,7 @@ __i915_gem_object_unset_pages(struct drm_i915_gem_object 
*obj)
return pages;
 }
 
-int __i915_gem_object_put_pages_locked(struct drm_i915_gem_object 

[Intel-gfx] [PATCH 41/61] drm/i915/selftests: Prepare client blit for obj->mm.lock removal.

2020-10-02 Thread Maarten Lankhorst
Straightforward conversion, just convert a bunch of calls to
unlocked versions.

Signed-off-by: Maarten Lankhorst 
---
 drivers/gpu/drm/i915/gem/selftests/i915_gem_client_blt.c | 8 
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/drivers/gpu/drm/i915/gem/selftests/i915_gem_client_blt.c 
b/drivers/gpu/drm/i915/gem/selftests/i915_gem_client_blt.c
index 4e36d4897ea6..cc782569765f 100644
--- a/drivers/gpu/drm/i915/gem/selftests/i915_gem_client_blt.c
+++ b/drivers/gpu/drm/i915/gem/selftests/i915_gem_client_blt.c
@@ -47,7 +47,7 @@ static int __igt_client_fill(struct intel_engine_cs *engine)
goto err_flush;
}
 
-   vaddr = i915_gem_object_pin_map(obj, I915_MAP_WB);
+   vaddr = i915_gem_object_pin_map_unlocked(obj, I915_MAP_WB);
if (IS_ERR(vaddr)) {
err = PTR_ERR(vaddr);
goto err_put;
@@ -159,7 +159,7 @@ static int prepare_blit(const struct tiled_blits *t,
u32 src_pitch, dst_pitch;
u32 cmd, *cs;
 
-   cs = i915_gem_object_pin_map(batch, I915_MAP_WC);
+   cs = i915_gem_object_pin_map_unlocked(batch, I915_MAP_WC);
if (IS_ERR(cs))
return PTR_ERR(cs);
 
@@ -379,7 +379,7 @@ static int verify_buffer(const struct tiled_blits *t,
y = i915_prandom_u32_max_state(t->height, prng);
p = y * t->width + x;
 
-   vaddr = i915_gem_object_pin_map(buf->vma->obj, I915_MAP_WC);
+   vaddr = i915_gem_object_pin_map_unlocked(buf->vma->obj, I915_MAP_WC);
if (IS_ERR(vaddr))
return PTR_ERR(vaddr);
 
@@ -566,7 +566,7 @@ static int tiled_blits_prepare(struct tiled_blits *t,
int err;
int i;
 
-   map = i915_gem_object_pin_map(t->scratch.vma->obj, I915_MAP_WC);
+   map = i915_gem_object_pin_map_unlocked(t->scratch.vma->obj, 
I915_MAP_WC);
if (IS_ERR(map))
return PTR_ERR(map);
 
-- 
2.28.0

___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx


[Intel-gfx] [PATCH 59/61] drm/i915/selftests: Prepare gtt tests for obj->mm.lock removal

2020-10-02 Thread Maarten Lankhorst
We need to lock the global gtt dma_resv, use i915_vm_lock_objects
to handle this correctly. Add ww handling for this where required.

Add the object lock around unpin/put pages, and use the unlocked
versions of pin_pages and pin_map where required.

Signed-off-by: Maarten Lankhorst 
---
 drivers/gpu/drm/i915/selftests/i915_gem_gtt.c | 92 ++-
 1 file changed, 67 insertions(+), 25 deletions(-)

diff --git a/drivers/gpu/drm/i915/selftests/i915_gem_gtt.c 
b/drivers/gpu/drm/i915/selftests/i915_gem_gtt.c
index 2cfe99c79034..d07dd6780005 100644
--- a/drivers/gpu/drm/i915/selftests/i915_gem_gtt.c
+++ b/drivers/gpu/drm/i915/selftests/i915_gem_gtt.c
@@ -129,7 +129,7 @@ fake_dma_object(struct drm_i915_private *i915, u64 size)
obj->cache_level = I915_CACHE_NONE;
 
/* Preallocate the "backing storage" */
-   if (i915_gem_object_pin_pages(obj))
+   if (i915_gem_object_pin_pages_unlocked(obj))
goto err_obj;
 
i915_gem_object_unpin_pages(obj);
@@ -145,6 +145,7 @@ static int igt_ppgtt_alloc(void *arg)
 {
struct drm_i915_private *dev_priv = arg;
struct i915_ppgtt *ppgtt;
+   struct i915_gem_ww_ctx ww;
u64 size, last, limit;
int err = 0;
 
@@ -170,6 +171,12 @@ static int igt_ppgtt_alloc(void *arg)
limit = totalram_pages() << PAGE_SHIFT;
limit = min(ppgtt->vm.total, limit);
 
+   i915_gem_ww_ctx_init(&ww, false);
+retry:
+   err = i915_vm_lock_objects(&ppgtt->vm, &ww);
+   if (err)
+   goto err_ppgtt_cleanup;
+
/* Check we can allocate the entire range */
for (size = 4096; size <= limit; size <<= 2) {
struct i915_vm_pt_stash stash = {};
@@ -214,6 +221,13 @@ static int igt_ppgtt_alloc(void *arg)
}
 
 err_ppgtt_cleanup:
+   if (err == -EDEADLK) {
+   err = i915_gem_ww_ctx_backoff(&ww);
+   if (!err)
+   goto retry;
+   }
+   i915_gem_ww_ctx_fini(&ww);
+
i915_vm_put(&ppgtt->vm);
return err;
 }
@@ -275,7 +289,7 @@ static int lowlevel_hole(struct i915_address_space *vm,
 
GEM_BUG_ON(obj->base.size != BIT_ULL(size));
 
-   if (i915_gem_object_pin_pages(obj)) {
+   if (i915_gem_object_pin_pages_unlocked(obj)) {
i915_gem_object_put(obj);
kfree(order);
break;
@@ -296,20 +310,36 @@ static int lowlevel_hole(struct i915_address_space *vm,
 
if (vm->allocate_va_range) {
struct i915_vm_pt_stash stash = {};
+   struct i915_gem_ww_ctx ww;
+   int err;
+
+   i915_gem_ww_ctx_init(&ww, false);
+retry:
+   err = i915_vm_lock_objects(vm, &ww);
+   if (err)
+   goto alloc_vm_end;
 
+   err = -ENOMEM;
if (i915_vm_alloc_pt_stash(vm, &stash,
   BIT_ULL(size)))
-   break;
-
-   if (i915_vm_pin_pt_stash(vm, &stash)) {
-   i915_vm_free_pt_stash(vm, &stash);
-   break;
-   }
+   goto alloc_vm_end;
 
-   vm->allocate_va_range(vm, &stash,
- addr, BIT_ULL(size));
+   err = i915_vm_pin_pt_stash(vm, &stash);
+   if (!err)
+   vm->allocate_va_range(vm, &stash,
+ addr, 
BIT_ULL(size));
 
i915_vm_free_pt_stash(vm, &stash);
+alloc_vm_end:
+   if (err == -EDEADLK) {
+   err = i915_gem_ww_ctx_backoff(&ww);
+   if (!err)
+   goto retry;
+   }
+   i915_gem_ww_ctx_fini(&ww);
+
+   if (err)
+   break;
}
 
mock_vma->pages = obj->mm.pages;
@@ -1165,7 +1195,7 @@ static int igt_ggtt_page(void *arg)
if (IS_ERR(obj))
return PTR_ERR(obj);
 
-   err = i915_gem_object_pin_pages(obj);
+   err = i915_gem_object_pin_pages_unlocked(obj);
if (err)
goto out_free;
 
@@ -1332,7 +1362,7 @@ static int igt_gtt_reserve(void *arg)
goto out;
}
 
-   err = i915_gem_object_pin_pages(obj);
+   err = i915_gem_object_pi

[Intel-gfx] [PATCH 38/61] drm/i915: Fix ww locking in shmem_create_from_object

2020-10-02 Thread Maarten Lankhorst
Quick fix, just use the unlocked version.

Signed-off-by: Maarten Lankhorst 
---
 drivers/gpu/drm/i915/gt/shmem_utils.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/i915/gt/shmem_utils.c 
b/drivers/gpu/drm/i915/gt/shmem_utils.c
index 43c7acbdc79d..8c8dfa41e032 100644
--- a/drivers/gpu/drm/i915/gt/shmem_utils.c
+++ b/drivers/gpu/drm/i915/gt/shmem_utils.c
@@ -39,7 +39,7 @@ struct file *shmem_create_from_object(struct 
drm_i915_gem_object *obj)
return file;
}
 
-   ptr = i915_gem_object_pin_map(obj, I915_MAP_WB);
+   ptr = i915_gem_object_pin_map_unlocked(obj, I915_MAP_WB);
if (IS_ERR(ptr))
return ERR_CAST(ptr);
 
-- 
2.28.0

___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx


[Intel-gfx] [PATCH 35/61] drm/i915: Lock ww in ucode objects correctly

2020-10-02 Thread Maarten Lankhorst
In the ucode functions, the calls are done before userspace runs,
when debugging using debugfs, or when creating semi-permanent mappings;
we can safely use the unlocked versions that does the ww dance for us.

Because there is no pin_pages_unlocked yet, add it as convenience function.

This removes possible lockdep splats about missing resv lock for ucode.

Signed-off-by: Maarten Lankhorst 
---
 drivers/gpu/drm/i915/gem/i915_gem_object.h |  2 ++
 drivers/gpu/drm/i915/gem/i915_gem_pages.c  | 20 
 drivers/gpu/drm/i915/gt/uc/intel_guc.c |  2 +-
 drivers/gpu/drm/i915/gt/uc/intel_guc_log.c |  4 ++--
 drivers/gpu/drm/i915/gt/uc/intel_huc.c |  2 +-
 drivers/gpu/drm/i915/gt/uc/intel_uc_fw.c   |  2 +-
 6 files changed, 27 insertions(+), 5 deletions(-)

diff --git a/drivers/gpu/drm/i915/gem/i915_gem_object.h 
b/drivers/gpu/drm/i915/gem/i915_gem_object.h
index 534e36b8d43b..135a7a16d2d4 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_object.h
+++ b/drivers/gpu/drm/i915/gem/i915_gem_object.h
@@ -319,6 +319,8 @@ i915_gem_object_pin_pages(struct drm_i915_gem_object *obj)
return __i915_gem_object_get_pages(obj);
 }
 
+int i915_gem_object_pin_pages_unlocked(struct drm_i915_gem_object *obj);
+
 static inline bool
 i915_gem_object_has_pages(struct drm_i915_gem_object *obj)
 {
diff --git a/drivers/gpu/drm/i915/gem/i915_gem_pages.c 
b/drivers/gpu/drm/i915/gem/i915_gem_pages.c
index 75556c417873..84711dad5ca8 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_pages.c
+++ b/drivers/gpu/drm/i915/gem/i915_gem_pages.c
@@ -134,6 +134,26 @@ int __i915_gem_object_get_pages(struct drm_i915_gem_object 
*obj)
return err;
 }
 
+int i915_gem_object_pin_pages_unlocked(struct drm_i915_gem_object *obj)
+{
+   struct i915_gem_ww_ctx ww;
+   int err;
+
+   i915_gem_ww_ctx_init(&ww, true);
+retry:
+   err = i915_gem_object_lock(obj, &ww);
+   if (!err)
+   err = i915_gem_object_pin_pages(obj);
+
+   if (err == -EDEADLK) {
+   err = i915_gem_ww_ctx_backoff(&ww);
+   if (!err)
+   goto retry;
+   }
+   i915_gem_ww_ctx_fini(&ww);
+   return err;
+}
+
 /* Immediately discard the backing storage */
 void i915_gem_object_truncate(struct drm_i915_gem_object *obj)
 {
diff --git a/drivers/gpu/drm/i915/gt/uc/intel_guc.c 
b/drivers/gpu/drm/i915/gt/uc/intel_guc.c
index 942c7c187adb..bd97facf84ff 100644
--- a/drivers/gpu/drm/i915/gt/uc/intel_guc.c
+++ b/drivers/gpu/drm/i915/gt/uc/intel_guc.c
@@ -712,7 +712,7 @@ int intel_guc_allocate_and_map_vma(struct intel_guc *guc, 
u32 size,
if (IS_ERR(vma))
return PTR_ERR(vma);
 
-   vaddr = i915_gem_object_pin_map(vma->obj, I915_MAP_WB);
+   vaddr = i915_gem_object_pin_map_unlocked(vma->obj, I915_MAP_WB);
if (IS_ERR(vaddr)) {
i915_vma_unpin_and_release(&vma, 0);
return PTR_ERR(vaddr);
diff --git a/drivers/gpu/drm/i915/gt/uc/intel_guc_log.c 
b/drivers/gpu/drm/i915/gt/uc/intel_guc_log.c
index 9bbe8a795cb8..8dc8678e7ab0 100644
--- a/drivers/gpu/drm/i915/gt/uc/intel_guc_log.c
+++ b/drivers/gpu/drm/i915/gt/uc/intel_guc_log.c
@@ -335,7 +335,7 @@ static int guc_log_map(struct intel_guc_log *log)
 * buffer pages, so that we can directly get the data
 * (up-to-date) from memory.
 */
-   vaddr = i915_gem_object_pin_map(log->vma->obj, I915_MAP_WC);
+   vaddr = i915_gem_object_pin_map_unlocked(log->vma->obj, I915_MAP_WC);
if (IS_ERR(vaddr))
return PTR_ERR(vaddr);
 
@@ -744,7 +744,7 @@ int intel_guc_log_dump(struct intel_guc_log *log, struct 
drm_printer *p,
if (!obj)
return 0;
 
-   map = i915_gem_object_pin_map(obj, I915_MAP_WC);
+   map = i915_gem_object_pin_map_unlocked(obj, I915_MAP_WC);
if (IS_ERR(map)) {
DRM_DEBUG("Failed to pin object\n");
drm_puts(p, "(log data unaccessible)\n");
diff --git a/drivers/gpu/drm/i915/gt/uc/intel_huc.c 
b/drivers/gpu/drm/i915/gt/uc/intel_huc.c
index 65eeb44b397d..2126dd81ac38 100644
--- a/drivers/gpu/drm/i915/gt/uc/intel_huc.c
+++ b/drivers/gpu/drm/i915/gt/uc/intel_huc.c
@@ -82,7 +82,7 @@ static int intel_huc_rsa_data_create(struct intel_huc *huc)
if (IS_ERR(vma))
return PTR_ERR(vma);
 
-   vaddr = i915_gem_object_pin_map(vma->obj, I915_MAP_WB);
+   vaddr = i915_gem_object_pin_map_unlocked(vma->obj, I915_MAP_WB);
if (IS_ERR(vaddr)) {
i915_vma_unpin_and_release(&vma, 0);
return PTR_ERR(vaddr);
diff --git a/drivers/gpu/drm/i915/gt/uc/intel_uc_fw.c 
b/drivers/gpu/drm/i915/gt/uc/intel_uc_fw.c
index 80e8b6c3bc8c..bf4835a66ad8 100644
--- a/drivers/gpu/drm/i915/gt/uc/intel_uc_fw.c
+++ b/drivers/gpu/drm/i915/gt/uc/intel_uc_fw.c
@@ -541,7 +541,7 @@ int intel_uc_fw_init(struct intel_uc_fw *uc_fw)
if (!intel_uc_fw_is_available(uc_fw))
return -ENOEXEC;
 
-   err = i915_gem_object_pi

[Intel-gfx] [PATCH 55/61] drm/i915/selftests: Prepare timeline tests for obj->mm.lock removal

2020-10-02 Thread Maarten Lankhorst
We can no longer call intel_timeline_pin with a null argument,
so add a ww loop that locks the backing object.

Signed-off-by: Maarten Lankhorst 
---
 drivers/gpu/drm/i915/gt/selftest_timeline.c | 26 ++---
 1 file changed, 23 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/i915/gt/selftest_timeline.c 
b/drivers/gpu/drm/i915/gt/selftest_timeline.c
index 6d6092a28e6b..cd8374780f7c 100644
--- a/drivers/gpu/drm/i915/gt/selftest_timeline.c
+++ b/drivers/gpu/drm/i915/gt/selftest_timeline.c
@@ -36,6 +36,26 @@ static unsigned long hwsp_cacheline(struct intel_timeline 
*tl)
return (address + offset_in_page(tl->hwsp_offset)) / CACHELINE_BYTES;
 }
 
+static int selftest_tl_pin(struct intel_timeline *tl)
+{
+   struct i915_gem_ww_ctx ww;
+   int err;
+
+   i915_gem_ww_ctx_init(&ww, false);
+retry:
+   err = i915_gem_object_lock(tl->hwsp_ggtt->obj, &ww);
+   if (!err)
+   err = intel_timeline_pin(tl, &ww);
+
+   if (err == -EDEADLK) {
+   err = i915_gem_ww_ctx_backoff(&ww);
+   if (!err)
+   goto retry;
+   }
+   i915_gem_ww_ctx_fini(&ww);
+   return err;
+}
+
 #define CACHELINES_PER_PAGE (PAGE_SIZE / CACHELINE_BYTES)
 
 struct mock_hwsp_freelist {
@@ -77,7 +97,7 @@ static int __mock_hwsp_timeline(struct mock_hwsp_freelist 
*state,
if (IS_ERR(tl))
return PTR_ERR(tl);
 
-   err = intel_timeline_pin(tl, NULL);
+   err = selftest_tl_pin(tl);
if (err) {
intel_timeline_put(tl);
return err;
@@ -463,7 +483,7 @@ checked_tl_write(struct intel_timeline *tl, struct 
intel_engine_cs *engine, u32
struct i915_request *rq;
int err;
 
-   err = intel_timeline_pin(tl, NULL);
+   err = selftest_tl_pin(tl);
if (err) {
rq = ERR_PTR(err);
goto out;
@@ -663,7 +683,7 @@ static int live_hwsp_wrap(void *arg)
if (!tl->has_initial_breadcrumb)
goto out_free;
 
-   err = intel_timeline_pin(tl, NULL);
+   err = selftest_tl_pin(tl);
if (err)
goto out_free;
 
-- 
2.28.0

___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx


[Intel-gfx] [PATCH 56/61] drm/i915/selftests: Prepare i915_request tests for obj->mm.lock removal

2020-10-02 Thread Maarten Lankhorst
Straightforward conversion by using unlocked versions.

Signed-off-by: Maarten Lankhorst 
---
 drivers/gpu/drm/i915/selftests/i915_request.c | 10 +-
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/drivers/gpu/drm/i915/selftests/i915_request.c 
b/drivers/gpu/drm/i915/selftests/i915_request.c
index 64bbb8288249..a677e6851573 100644
--- a/drivers/gpu/drm/i915/selftests/i915_request.c
+++ b/drivers/gpu/drm/i915/selftests/i915_request.c
@@ -619,7 +619,7 @@ static struct i915_vma *empty_batch(struct drm_i915_private 
*i915)
if (IS_ERR(obj))
return ERR_CAST(obj);
 
-   cmd = i915_gem_object_pin_map(obj, I915_MAP_WB);
+   cmd = i915_gem_object_pin_map_unlocked(obj, I915_MAP_WB);
if (IS_ERR(cmd)) {
err = PTR_ERR(cmd);
goto err;
@@ -781,7 +781,7 @@ static struct i915_vma *recursive_batch(struct 
drm_i915_private *i915)
if (err)
goto err;
 
-   cmd = i915_gem_object_pin_map(obj, I915_MAP_WC);
+   cmd = i915_gem_object_pin_map_unlocked(obj, I915_MAP_WC);
if (IS_ERR(cmd)) {
err = PTR_ERR(cmd);
goto err;
@@ -816,7 +816,7 @@ static int recursive_batch_resolve(struct i915_vma *batch)
 {
u32 *cmd;
 
-   cmd = i915_gem_object_pin_map(batch->obj, I915_MAP_WC);
+   cmd = i915_gem_object_pin_map_unlocked(batch->obj, I915_MAP_WC);
if (IS_ERR(cmd))
return PTR_ERR(cmd);
 
@@ -1069,8 +1069,8 @@ static int live_sequential_engines(void *arg)
if (!request[idx])
break;
 
-   cmd = i915_gem_object_pin_map(request[idx]->batch->obj,
- I915_MAP_WC);
+   cmd = i915_gem_object_pin_map_unlocked(request[idx]->batch->obj,
+  I915_MAP_WC);
if (!IS_ERR(cmd)) {
*cmd = MI_BATCH_BUFFER_END;
 
-- 
2.28.0

___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx


[Intel-gfx] [PATCH 42/61] drm/i915/selftests: Prepare coherency tests for obj->mm.lock removal.

2020-10-02 Thread Maarten Lankhorst
Straightforward conversion, just convert a bunch of calls to
unlocked versions.

Signed-off-by: Maarten Lankhorst 
---
 drivers/gpu/drm/i915/gem/selftests/i915_gem_coherency.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

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 2e439bb269d6..42aa3c5e0621 100644
--- a/drivers/gpu/drm/i915/gem/selftests/i915_gem_coherency.c
+++ b/drivers/gpu/drm/i915/gem/selftests/i915_gem_coherency.c
@@ -159,7 +159,7 @@ static int wc_set(struct context *ctx, unsigned long 
offset, u32 v)
if (err)
return err;
 
-   map = i915_gem_object_pin_map(ctx->obj, I915_MAP_WC);
+   map = i915_gem_object_pin_map_unlocked(ctx->obj, I915_MAP_WC);
if (IS_ERR(map))
return PTR_ERR(map);
 
@@ -182,7 +182,7 @@ static int wc_get(struct context *ctx, unsigned long 
offset, u32 *v)
if (err)
return err;
 
-   map = i915_gem_object_pin_map(ctx->obj, I915_MAP_WC);
+   map = i915_gem_object_pin_map_unlocked(ctx->obj, I915_MAP_WC);
if (IS_ERR(map))
return PTR_ERR(map);
 
-- 
2.28.0

___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx


[Intel-gfx] [PATCH 23/61] drm/i915: Move pinning to inside engine_wa_list_verify()

2020-10-02 Thread Maarten Lankhorst
This should be done as part of the ww loop, in order to remove a
i915_vma_pin that needs ww held.

Now only i915_ggtt_pin() callers remaining.

Signed-off-by: Maarten Lankhorst 
---
 drivers/gpu/drm/i915/gt/intel_workarounds.c   | 24 --
 .../gpu/drm/i915/gt/selftest_workarounds.c| 25 ---
 2 files changed, 32 insertions(+), 17 deletions(-)

diff --git a/drivers/gpu/drm/i915/gt/intel_workarounds.c 
b/drivers/gpu/drm/i915/gt/intel_workarounds.c
index 6c580d0d9ea8..269706a985fb 100644
--- a/drivers/gpu/drm/i915/gt/intel_workarounds.c
+++ b/drivers/gpu/drm/i915/gt/intel_workarounds.c
@@ -2004,7 +2004,6 @@ create_scratch(struct i915_address_space *vm, int count)
struct drm_i915_gem_object *obj;
struct i915_vma *vma;
unsigned int size;
-   int err;
 
size = round_up(count * sizeof(u32), PAGE_SIZE);
obj = i915_gem_object_create_internal(vm->i915, size);
@@ -2015,20 +2014,11 @@ create_scratch(struct i915_address_space *vm, int count)
 
vma = i915_vma_instance(obj, vm, NULL);
if (IS_ERR(vma)) {
-   err = PTR_ERR(vma);
-   goto err_obj;
+   i915_gem_object_put(obj);
+   return vma;
}
 
-   err = i915_vma_pin(vma, 0, 0,
-  i915_vma_is_ggtt(vma) ? PIN_GLOBAL : PIN_USER);
-   if (err)
-   goto err_obj;
-
return vma;
-
-err_obj:
-   i915_gem_object_put(obj);
-   return ERR_PTR(err);
 }
 
 static const struct {
@@ -2130,10 +2120,15 @@ static int engine_wa_list_verify(struct intel_context 
*ce,
if (err)
goto err_pm;
 
+   err = i915_vma_pin_ww(vma, &ww, 0, 0,
+  i915_vma_is_ggtt(vma) ? PIN_GLOBAL : PIN_USER);
+   if (err)
+   goto err_unpin;
+
rq = i915_request_create(ce);
if (IS_ERR(rq)) {
err = PTR_ERR(rq);
-   goto err_unpin;
+   goto err_vma;
}
 
err = i915_request_await_object(rq, vma->obj, true);
@@ -2174,6 +2169,8 @@ static int engine_wa_list_verify(struct intel_context *ce,
 
 err_rq:
i915_request_put(rq);
+err_vma:
+   i915_vma_unpin(vma);
 err_unpin:
intel_context_unpin(ce);
 err_pm:
@@ -2184,7 +2181,6 @@ static int engine_wa_list_verify(struct intel_context *ce,
}
i915_gem_ww_ctx_fini(&ww);
intel_engine_pm_put(ce->engine);
-   i915_vma_unpin(vma);
i915_vma_put(vma);
return err;
 }
diff --git a/drivers/gpu/drm/i915/gt/selftest_workarounds.c 
b/drivers/gpu/drm/i915/gt/selftest_workarounds.c
index 61a0532d0f3d..810ab026a55e 100644
--- a/drivers/gpu/drm/i915/gt/selftest_workarounds.c
+++ b/drivers/gpu/drm/i915/gt/selftest_workarounds.c
@@ -386,6 +386,25 @@ static struct i915_vma *create_batch(struct 
i915_address_space *vm)
return ERR_PTR(err);
 }
 
+static struct i915_vma *
+create_scratch_pinned(struct i915_address_space *vm, int count)
+{
+   struct i915_vma *vma = create_scratch(vm, count);
+   int err;
+
+   if (IS_ERR(vma))
+   return vma;
+
+   err = i915_vma_pin(vma, 0, 0,
+  i915_vma_is_ggtt(vma) ? PIN_GLOBAL : PIN_USER);
+   if (err) {
+   i915_vma_put(vma);
+   return ERR_PTR(err);
+   }
+
+   return vma;
+}
+
 static u32 reg_write(u32 old, u32 new, u32 rsvd)
 {
if (rsvd == 0x) {
@@ -489,7 +508,7 @@ static int check_dirty_whitelist(struct intel_context *ce)
int err = 0, i, v;
u32 *cs, *results;
 
-   scratch = create_scratch(ce->vm, 2 * ARRAY_SIZE(values) + 1);
+   scratch = create_scratch_pinned(ce->vm, 2 * ARRAY_SIZE(values) + 1);
if (IS_ERR(scratch))
return PTR_ERR(scratch);
 
@@ -1043,7 +1062,7 @@ static int live_isolated_whitelist(void *arg)
 
vm = i915_gem_context_get_vm_rcu(c);
 
-   client[i].scratch[0] = create_scratch(vm, 1024);
+   client[i].scratch[0] = create_scratch_pinned(vm, 1024);
if (IS_ERR(client[i].scratch[0])) {
err = PTR_ERR(client[i].scratch[0]);
i915_vm_put(vm);
@@ -1051,7 +1070,7 @@ static int live_isolated_whitelist(void *arg)
goto err;
}
 
-   client[i].scratch[1] = create_scratch(vm, 1024);
+   client[i].scratch[1] = create_scratch_pinned(vm, 1024);
if (IS_ERR(client[i].scratch[1])) {
err = PTR_ERR(client[i].scratch[1]);
i915_vma_unpin_and_release(&client[i].scratch[0], 0);
-- 
2.28.0

___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx


[Intel-gfx] [PATCH 61/61] drm/i915: Keep userpointer bindings if seqcount is unchanged

2020-10-02 Thread Maarten Lankhorst
Instead of force unbinding and rebinding every time, we try to check
if our notifier seqcount is still correct when pages are bound. This
way we only rebind userptr when we need to, and prevent stalls.

Signed-off-by: Maarten Lankhorst 
---
 drivers/gpu/drm/i915/gem/i915_gem_userptr.c | 29 ++---
 1 file changed, 26 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/i915/gem/i915_gem_userptr.c 
b/drivers/gpu/drm/i915/gem/i915_gem_userptr.c
index 327f01b04f21..dad68de2159f 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_userptr.c
+++ b/drivers/gpu/drm/i915/gem/i915_gem_userptr.c
@@ -268,12 +268,35 @@ int i915_gem_object_userptr_submit_init(struct 
drm_i915_gem_object *obj)
if (ret)
return ret;
 
-   /* Make sure userptr is unbound for next attempt, so we don't use stale 
pages. */
-   ret = i915_gem_object_userptr_unbind(obj, false);
+   /* optimistically try to preserve current pages while unlocked */
+   if (i915_gem_object_has_pages(obj) &&
+   !mmu_interval_check_retry(&obj->userptr.notifier,
+ obj->userptr.notifier_seq)) {
+   ret = mutex_lock_interruptible(&i915->mm.notifier_lock);
+   if (!ret) {
+   if (obj->userptr.pvec &&
+   !mmu_interval_read_retry(&obj->userptr.notifier,
+
obj->userptr.notifier_seq)) {
+   obj->userptr.page_ref++;
+   mutex_unlock(&i915->mm.notifier_lock);
+
+   /* We can keep using the current binding, this 
is the fastpath */
+   ret = 1;
+   }
+   }
+   }
+
+   if (!ret) {
+   /* Make sure userptr is unbound for next attempt, so we don't 
use stale pages. */
+   ret = i915_gem_object_userptr_unbind(obj, false);
+   }
i915_gem_object_unlock(obj);
-   if (ret)
+   if (ret < 0)
return ret;
 
+   if (ret > 0)
+   return 0;
+
notifier_seq = mmu_interval_read_begin(&obj->userptr.notifier);
 
pvec = kvmalloc_array(num_pages, sizeof(struct page *), GFP_KERNEL);
-- 
2.28.0

___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx


[Intel-gfx] [PATCH 28/61] drm/i915: Defer pin calls in buffer pool until first use by caller.

2020-10-02 Thread Maarten Lankhorst
We need to take the obj lock to pin pages, so wait until the callers
have done so, before making the object unshrinkable.

Signed-off-by: Maarten Lankhorst 
---
 .../gpu/drm/i915/gem/i915_gem_execbuffer.c|  2 +
 .../gpu/drm/i915/gem/i915_gem_object_blt.c|  6 +++
 .../gpu/drm/i915/gt/intel_gt_buffer_pool.c| 47 +--
 .../gpu/drm/i915/gt/intel_gt_buffer_pool.h|  5 ++
 .../drm/i915/gt/intel_gt_buffer_pool_types.h  |  1 +
 5 files changed, 35 insertions(+), 26 deletions(-)

diff --git a/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c 
b/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c
index 46ef71196f7d..7ef52c876cb8 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c
+++ b/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c
@@ -1338,6 +1338,7 @@ static int __reloc_gpu_alloc(struct i915_execbuffer *eb,
err = PTR_ERR(cmd);
goto err_pool;
}
+   intel_gt_buffer_pool_mark_used(pool);
 
batch = i915_vma_instance(pool->obj, vma->vm, NULL);
if (IS_ERR(batch)) {
@@ -2625,6 +2626,7 @@ static int eb_parse(struct i915_execbuffer *eb)
err = PTR_ERR(shadow);
goto err;
}
+   intel_gt_buffer_pool_mark_used(pool);
i915_gem_object_set_readonly(shadow->obj);
shadow->private = pool;
 
diff --git a/drivers/gpu/drm/i915/gem/i915_gem_object_blt.c 
b/drivers/gpu/drm/i915/gem/i915_gem_object_blt.c
index aee7ad3cc3c6..e0b873c3f46a 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_object_blt.c
+++ b/drivers/gpu/drm/i915/gem/i915_gem_object_blt.c
@@ -54,6 +54,9 @@ struct i915_vma *intel_emit_vma_fill_blt(struct intel_context 
*ce,
if (unlikely(err))
goto out_put;
 
+   /* we pinned the pool, mark it as such */
+   intel_gt_buffer_pool_mark_used(pool);
+
cmd = i915_gem_object_pin_map(pool->obj, I915_MAP_WC);
if (IS_ERR(cmd)) {
err = PTR_ERR(cmd);
@@ -276,6 +279,9 @@ struct i915_vma *intel_emit_vma_copy_blt(struct 
intel_context *ce,
if (unlikely(err))
goto out_put;
 
+   /* we pinned the pool, mark it as such */
+   intel_gt_buffer_pool_mark_used(pool);
+
cmd = i915_gem_object_pin_map(pool->obj, I915_MAP_WC);
if (IS_ERR(cmd)) {
err = PTR_ERR(cmd);
diff --git a/drivers/gpu/drm/i915/gt/intel_gt_buffer_pool.c 
b/drivers/gpu/drm/i915/gt/intel_gt_buffer_pool.c
index 104cb30e8c13..030759305196 100644
--- a/drivers/gpu/drm/i915/gt/intel_gt_buffer_pool.c
+++ b/drivers/gpu/drm/i915/gt/intel_gt_buffer_pool.c
@@ -98,28 +98,6 @@ static void pool_free_work(struct work_struct *wrk)
  round_jiffies_up_relative(HZ));
 }
 
-static int pool_active(struct i915_active *ref)
-{
-   struct intel_gt_buffer_pool_node *node =
-   container_of(ref, typeof(*node), active);
-   struct dma_resv *resv = node->obj->base.resv;
-   int err;
-
-   if (dma_resv_trylock(resv)) {
-   dma_resv_add_excl_fence(resv, NULL);
-   dma_resv_unlock(resv);
-   }
-
-   err = i915_gem_object_pin_pages(node->obj);
-   if (err)
-   return err;
-
-   /* Hide this pinned object from the shrinker until retired */
-   i915_gem_object_make_unshrinkable(node->obj);
-
-   return 0;
-}
-
 __i915_active_call
 static void pool_retire(struct i915_active *ref)
 {
@@ -129,10 +107,13 @@ static void pool_retire(struct i915_active *ref)
struct list_head *list = bucket_for_size(pool, node->obj->base.size);
unsigned long flags;
 
-   i915_gem_object_unpin_pages(node->obj);
+   if (node->pinned) {
+   i915_gem_object_unpin_pages(node->obj);
 
-   /* Return this object to the shrinker pool */
-   i915_gem_object_make_purgeable(node->obj);
+   /* Return this object to the shrinker pool */
+   i915_gem_object_make_purgeable(node->obj);
+   node->pinned = false;
+   }
 
GEM_BUG_ON(node->age);
spin_lock_irqsave(&pool->lock, flags);
@@ -144,6 +125,19 @@ static void pool_retire(struct i915_active *ref)
  round_jiffies_up_relative(HZ));
 }
 
+void intel_gt_buffer_pool_mark_used(struct intel_gt_buffer_pool_node *node)
+{
+   assert_object_held(node->obj);
+
+   if (node->pinned)
+   return;
+
+   __i915_gem_object_pin_pages(node->obj);
+   /* Hide this pinned object from the shrinker until retired */
+   i915_gem_object_make_unshrinkable(node->obj);
+   node->pinned = true;
+}
+
 static struct intel_gt_buffer_pool_node *
 node_create(struct intel_gt_buffer_pool *pool, size_t sz)
 {
@@ -158,7 +152,8 @@ node_create(struct intel_gt_buffer_pool *pool, size_t sz)
 
node->age = 0;
node->pool = pool;
-   i915_active_init(&node->active, pool_active, pool_retire);
+   node->pinned = false;
+   i915_active_init(&node->active, NULL, pool_retire);

[Intel-gfx] [PATCH 16/61] drm/i915: Pin timeline map after first timeline pin.

2020-10-02 Thread Maarten Lankhorst
We're starting to require the reservation lock for pinning,
so wait until we have that.

Update the selftests to handle this correctly, and ensure pin is
called in live_hwsp_rollover_user() and mock_hwsp_freelist().

Signed-off-by: Maarten Lankhorst 
---
 drivers/gpu/drm/i915/gt/intel_timeline.c| 37 
 drivers/gpu/drm/i915/gt/intel_timeline.h|  2 +
 drivers/gpu/drm/i915/gt/mock_engine.c   | 22 ++-
 drivers/gpu/drm/i915/gt/selftest_timeline.c | 63 +++--
 drivers/gpu/drm/i915/i915_selftest.h|  2 +
 5 files changed, 82 insertions(+), 44 deletions(-)

diff --git a/drivers/gpu/drm/i915/gt/intel_timeline.c 
b/drivers/gpu/drm/i915/gt/intel_timeline.c
index 1c410770e47d..54e8678aff7a 100644
--- a/drivers/gpu/drm/i915/gt/intel_timeline.c
+++ b/drivers/gpu/drm/i915/gt/intel_timeline.c
@@ -51,13 +51,27 @@ static int __timeline_active(struct i915_active *active)
return 0;
 }
 
+I915_SELFTEST_EXPORT int
+intel_timeline_pin_map(struct intel_timeline *timeline)
+{
+   struct drm_i915_gem_object *obj = timeline->hwsp_ggtt->obj;
+   void *vaddr;
+
+   vaddr = i915_gem_object_pin_map(obj, I915_MAP_WB);
+   if (IS_ERR(vaddr))
+   return PTR_ERR(vaddr);
+
+   timeline->hwsp_map = vaddr;
+   timeline->hwsp_seqno = vaddr + offset_in_page(timeline->hwsp_seqno);
+   WRITE_ONCE(*(u32 *)timeline->hwsp_seqno, 0);
+   return 0;
+}
+
 static int intel_timeline_init(struct intel_timeline *timeline,
   struct intel_gt *gt,
   struct i915_vma *hwsp,
   unsigned int offset)
 {
-   void *vaddr;
-
kref_init(&timeline->kref);
atomic_set(&timeline->pin_count, 0);
 
@@ -73,14 +87,8 @@ static int intel_timeline_init(struct intel_timeline 
*timeline,
return PTR_ERR(hwsp);
timeline->hwsp_ggtt = hwsp;
}
-
-   vaddr = i915_gem_object_pin_map(hwsp->obj, I915_MAP_WB);
-   if (IS_ERR(vaddr))
-   return PTR_ERR(vaddr);
-
-   timeline->hwsp_map = vaddr;
-   timeline->hwsp_seqno = vaddr + timeline->hwsp_offset;
-   WRITE_ONCE(*(u32 *)timeline->hwsp_seqno, 0);
+   timeline->hwsp_map = NULL;
+   timeline->hwsp_seqno = NULL + timeline->hwsp_offset;
 
GEM_BUG_ON(timeline->hwsp_offset >= hwsp->size);
 
@@ -111,7 +119,8 @@ static void intel_timeline_fini(struct intel_timeline 
*timeline)
GEM_BUG_ON(!list_empty(&timeline->requests));
GEM_BUG_ON(timeline->retire);
 
-   i915_gem_object_unpin_map(timeline->hwsp_ggtt->obj);
+   if (timeline->hwsp_map)
+   i915_gem_object_unpin_map(timeline->hwsp_ggtt->obj);
 
i915_vma_put(timeline->hwsp_ggtt);
i915_active_fini(&timeline->active);
@@ -151,6 +160,12 @@ int intel_timeline_pin(struct intel_timeline *tl, struct 
i915_gem_ww_ctx *ww)
if (atomic_add_unless(&tl->pin_count, 1, 0))
return 0;
 
+   if (!tl->hwsp_map) {
+   err = intel_timeline_pin_map(tl);
+   if (err)
+   return err;
+   }
+
err = i915_ggtt_pin(tl->hwsp_ggtt, ww, 0, PIN_HIGH);
if (err)
return err;
diff --git a/drivers/gpu/drm/i915/gt/intel_timeline.h 
b/drivers/gpu/drm/i915/gt/intel_timeline.h
index 9882cd911d8e..1cfdc4679b62 100644
--- a/drivers/gpu/drm/i915/gt/intel_timeline.h
+++ b/drivers/gpu/drm/i915/gt/intel_timeline.h
@@ -106,4 +106,6 @@ int intel_timeline_read_hwsp(struct i915_request *from,
 void intel_gt_init_timelines(struct intel_gt *gt);
 void intel_gt_fini_timelines(struct intel_gt *gt);
 
+I915_SELFTEST_DECLARE(int intel_timeline_pin_map(struct intel_timeline *tl));
+
 #endif
diff --git a/drivers/gpu/drm/i915/gt/mock_engine.c 
b/drivers/gpu/drm/i915/gt/mock_engine.c
index 2f830017c51d..effbac877eec 100644
--- a/drivers/gpu/drm/i915/gt/mock_engine.c
+++ b/drivers/gpu/drm/i915/gt/mock_engine.c
@@ -32,9 +32,20 @@
 #include "mock_engine.h"
 #include "selftests/mock_request.h"
 
-static void mock_timeline_pin(struct intel_timeline *tl)
+static int mock_timeline_pin(struct intel_timeline *tl)
 {
+   int err;
+
+   if (WARN_ON(!i915_gem_object_trylock(tl->hwsp_ggtt->obj)))
+   return -EBUSY;
+
+   err = intel_timeline_pin_map(tl);
+   i915_gem_object_unlock(tl->hwsp_ggtt->obj);
+   if (err)
+   return err;
+
atomic_inc(&tl->pin_count);
+   return 0;
 }
 
 static void mock_timeline_unpin(struct intel_timeline *tl)
@@ -152,6 +163,8 @@ static void mock_context_destroy(struct kref *ref)
 
 static int mock_context_alloc(struct intel_context *ce)
 {
+   int err;
+
ce->ring = mock_ring(ce->engine);
if (!ce->ring)
return -ENOMEM;
@@ -162,7 +175,12 @@ static int mock_context_alloc(struct intel_context *ce)
return PTR_ERR(ce->timeline);
}
 
-   mock_timeline_pin(ce->timeline);
+   er

[Intel-gfx] [PATCH 12/61] drm/i915: Reject more ioctls for userptr

2020-10-02 Thread Maarten Lankhorst
Allow set_domain to fail silently, waiting for idle should be good enough.
set_tiling and set_caching are rejected with -ENXIO, there's no valid reason
to allow it.

Signed-off-by: Maarten Lankhorst 
---
 drivers/gpu/drm/i915/display/intel_display.c | 2 +-
 drivers/gpu/drm/i915/gem/i915_gem_domain.c   | 4 +++-
 drivers/gpu/drm/i915/gem/i915_gem_object.h   | 6 ++
 drivers/gpu/drm/i915/gem/i915_gem_userptr.c  | 3 ++-
 4 files changed, 12 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_display.c 
b/drivers/gpu/drm/i915/display/intel_display.c
index 753f202ef6a0..cc2c8ba00ed5 100644
--- a/drivers/gpu/drm/i915/display/intel_display.c
+++ b/drivers/gpu/drm/i915/display/intel_display.c
@@ -17354,7 +17354,7 @@ static int intel_user_framebuffer_create_handle(struct 
drm_framebuffer *fb,
struct drm_i915_gem_object *obj = intel_fb_obj(fb);
struct drm_i915_private *i915 = to_i915(obj->base.dev);
 
-   if (obj->userptr.mm) {
+   if (i915_gem_object_is_userptr(obj)) {
drm_dbg(&i915->drm,
"attempting to use a userptr for a framebuffer, 
denied\n");
return -EINVAL;
diff --git a/drivers/gpu/drm/i915/gem/i915_gem_domain.c 
b/drivers/gpu/drm/i915/gem/i915_gem_domain.c
index 7c90a63c273d..43c22648b074 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_domain.c
+++ b/drivers/gpu/drm/i915/gem/i915_gem_domain.c
@@ -543,7 +543,9 @@ i915_gem_set_domain_ioctl(struct drm_device *dev, void 
*data,
 * considered to be outside of any cache domain.
 */
if (i915_gem_object_is_proxy(obj)) {
-   err = -ENXIO;
+   /* silently allow userptr to complete */
+   if (!i915_gem_object_is_userptr(obj))
+   err = -ENXIO;
goto out;
}
 
diff --git a/drivers/gpu/drm/i915/gem/i915_gem_object.h 
b/drivers/gpu/drm/i915/gem/i915_gem_object.h
index e06e1f86472a..9b737eb231f2 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_object.h
+++ b/drivers/gpu/drm/i915/gem/i915_gem_object.h
@@ -511,6 +511,12 @@ void __i915_gem_object_flush_frontbuffer(struct 
drm_i915_gem_object *obj,
 void __i915_gem_object_invalidate_frontbuffer(struct drm_i915_gem_object *obj,
  enum fb_op_origin origin);
 
+static inline bool
+i915_gem_object_is_userptr(struct drm_i915_gem_object *obj)
+{
+   return obj->userptr.mm;
+}
+
 static inline void
 i915_gem_object_flush_frontbuffer(struct drm_i915_gem_object *obj,
  enum fb_op_origin origin)
diff --git a/drivers/gpu/drm/i915/gem/i915_gem_userptr.c 
b/drivers/gpu/drm/i915/gem/i915_gem_userptr.c
index 9c1293c99d88..3fd63fdd7466 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_userptr.c
+++ b/drivers/gpu/drm/i915/gem/i915_gem_userptr.c
@@ -721,7 +721,8 @@ static const struct drm_i915_gem_object_ops 
i915_gem_userptr_ops = {
.name = "i915_gem_object_userptr",
.flags = I915_GEM_OBJECT_IS_SHRINKABLE |
 I915_GEM_OBJECT_NO_MMAP |
-I915_GEM_OBJECT_ASYNC_CANCEL,
+I915_GEM_OBJECT_ASYNC_CANCEL |
+I915_GEM_OBJECT_IS_PROXY,
.get_pages = i915_gem_userptr_get_pages,
.put_pages = i915_gem_userptr_put_pages,
.dmabuf_export = i915_gem_userptr_dmabuf_export,
-- 
2.28.0

___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx


[Intel-gfx] [PATCH 57/61] drm/i915/selftests: Prepare memory region tests for obj->mm.lock removal

2020-10-02 Thread Maarten Lankhorst
Use the unlocked variants for pin_map and pin_pages, and add lock
around unpinning/putting pages.

Signed-off-by: Maarten Lankhorst 
---
 .../drm/i915/selftests/intel_memory_region.c   | 18 +++---
 1 file changed, 11 insertions(+), 7 deletions(-)

diff --git a/drivers/gpu/drm/i915/selftests/intel_memory_region.c 
b/drivers/gpu/drm/i915/selftests/intel_memory_region.c
index 334b0648e253..ccd4b65a272f 100644
--- a/drivers/gpu/drm/i915/selftests/intel_memory_region.c
+++ b/drivers/gpu/drm/i915/selftests/intel_memory_region.c
@@ -31,10 +31,12 @@ static void close_objects(struct intel_memory_region *mem,
struct drm_i915_gem_object *obj, *on;
 
list_for_each_entry_safe(obj, on, objects, st_link) {
+   i915_gem_object_lock(obj, NULL);
if (i915_gem_object_has_pinned_pages(obj))
i915_gem_object_unpin_pages(obj);
/* No polluting the memory region between tests */
__i915_gem_object_put_pages(obj);
+   i915_gem_object_unlock(obj);
list_del(&obj->st_link);
i915_gem_object_put(obj);
}
@@ -69,7 +71,7 @@ static int igt_mock_fill(void *arg)
break;
}
 
-   err = i915_gem_object_pin_pages(obj);
+   err = i915_gem_object_pin_pages_unlocked(obj);
if (err) {
i915_gem_object_put(obj);
break;
@@ -109,7 +111,7 @@ igt_object_create(struct intel_memory_region *mem,
if (IS_ERR(obj))
return obj;
 
-   err = i915_gem_object_pin_pages(obj);
+   err = i915_gem_object_pin_pages_unlocked(obj);
if (err)
goto put;
 
@@ -123,8 +125,10 @@ igt_object_create(struct intel_memory_region *mem,
 
 static void igt_object_release(struct drm_i915_gem_object *obj)
 {
+   i915_gem_object_lock(obj, NULL);
i915_gem_object_unpin_pages(obj);
__i915_gem_object_put_pages(obj);
+   i915_gem_object_unlock(obj);
list_del(&obj->st_link);
i915_gem_object_put(obj);
 }
@@ -280,7 +284,7 @@ static int igt_cpu_check(struct drm_i915_gem_object *obj, 
u32 dword, u32 val)
if (err)
return err;
 
-   ptr = i915_gem_object_pin_map(obj, I915_MAP_WC);
+   ptr = i915_gem_object_pin_map_unlocked(obj, I915_MAP_WC);
if (IS_ERR(ptr))
return PTR_ERR(ptr);
 
@@ -385,7 +389,7 @@ static int igt_lmem_create(void *arg)
if (IS_ERR(obj))
return PTR_ERR(obj);
 
-   err = i915_gem_object_pin_pages(obj);
+   err = i915_gem_object_pin_pages_unlocked(obj);
if (err)
goto out_put;
 
@@ -424,7 +428,7 @@ static int igt_lmem_write_gpu(void *arg)
goto out_file;
}
 
-   err = i915_gem_object_pin_pages(obj);
+   err = i915_gem_object_pin_pages_unlocked(obj);
if (err)
goto out_put;
 
@@ -496,7 +500,7 @@ static int igt_lmem_write_cpu(void *arg)
if (IS_ERR(obj))
return PTR_ERR(obj);
 
-   vaddr = i915_gem_object_pin_map(obj, I915_MAP_WC);
+   vaddr = i915_gem_object_pin_map_unlocked(obj, I915_MAP_WC);
if (IS_ERR(vaddr)) {
err = PTR_ERR(vaddr);
goto out_put;
@@ -600,7 +604,7 @@ create_region_for_mapping(struct intel_memory_region *mr, 
u64 size, u32 type,
return obj;
}
 
-   addr = i915_gem_object_pin_map(obj, type);
+   addr = i915_gem_object_pin_map_unlocked(obj, type);
if (IS_ERR(addr)) {
i915_gem_object_put(obj);
if (PTR_ERR(addr) == -ENXIO)
-- 
2.28.0

___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx


[Intel-gfx] [PATCH 29/61] drm/i915: Fix pread/pwrite to work with new locking rules.

2020-10-02 Thread Maarten Lankhorst
We are removing obj->mm.lock, and need to take the reservation lock
before we can pin pages. Move the pinning pages into the helper, and
merge gtt pwrite/pread preparation and cleanup paths.

The fence lock is also removed; it will conflict with fence annotations,
because of memory allocations done when pagefaulting inside copy_*_user.

Signed-off-by: Maarten Lankhorst 
---
 drivers/gpu/drm/i915/Makefile  |   1 -
 drivers/gpu/drm/i915/gem/i915_gem_fence.c  |  95 
 drivers/gpu/drm/i915/gem/i915_gem_object.h |   5 -
 drivers/gpu/drm/i915/i915_gem.c| 247 +++--
 4 files changed, 133 insertions(+), 215 deletions(-)
 delete mode 100644 drivers/gpu/drm/i915/gem/i915_gem_fence.c

diff --git a/drivers/gpu/drm/i915/Makefile b/drivers/gpu/drm/i915/Makefile
index e5574e506a5c..58d129b5a65a 100644
--- a/drivers/gpu/drm/i915/Makefile
+++ b/drivers/gpu/drm/i915/Makefile
@@ -134,7 +134,6 @@ gem-y += \
gem/i915_gem_dmabuf.o \
gem/i915_gem_domain.o \
gem/i915_gem_execbuffer.o \
-   gem/i915_gem_fence.o \
gem/i915_gem_internal.o \
gem/i915_gem_object.o \
gem/i915_gem_object_blt.o \
diff --git a/drivers/gpu/drm/i915/gem/i915_gem_fence.c 
b/drivers/gpu/drm/i915/gem/i915_gem_fence.c
deleted file mode 100644
index 8ab842c80f99..
--- a/drivers/gpu/drm/i915/gem/i915_gem_fence.c
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * SPDX-License-Identifier: MIT
- *
- * Copyright © 2019 Intel Corporation
- */
-
-#include "i915_drv.h"
-#include "i915_gem_object.h"
-
-struct stub_fence {
-   struct dma_fence dma;
-   struct i915_sw_fence chain;
-};
-
-static int __i915_sw_fence_call
-stub_notify(struct i915_sw_fence *fence, enum i915_sw_fence_notify state)
-{
-   struct stub_fence *stub = container_of(fence, typeof(*stub), chain);
-
-   switch (state) {
-   case FENCE_COMPLETE:
-   dma_fence_signal(&stub->dma);
-   break;
-
-   case FENCE_FREE:
-   dma_fence_put(&stub->dma);
-   break;
-   }
-
-   return NOTIFY_DONE;
-}
-
-static const char *stub_driver_name(struct dma_fence *fence)
-{
-   return DRIVER_NAME;
-}
-
-static const char *stub_timeline_name(struct dma_fence *fence)
-{
-   return "object";
-}
-
-static void stub_release(struct dma_fence *fence)
-{
-   struct stub_fence *stub = container_of(fence, typeof(*stub), dma);
-
-   i915_sw_fence_fini(&stub->chain);
-
-   BUILD_BUG_ON(offsetof(typeof(*stub), dma));
-   dma_fence_free(&stub->dma);
-}
-
-static const struct dma_fence_ops stub_fence_ops = {
-   .get_driver_name = stub_driver_name,
-   .get_timeline_name = stub_timeline_name,
-   .release = stub_release,
-};
-
-struct dma_fence *
-i915_gem_object_lock_fence(struct drm_i915_gem_object *obj)
-{
-   struct stub_fence *stub;
-
-   assert_object_held(obj);
-
-   stub = kmalloc(sizeof(*stub), GFP_KERNEL);
-   if (!stub)
-   return NULL;
-
-   i915_sw_fence_init(&stub->chain, stub_notify);
-   dma_fence_init(&stub->dma, &stub_fence_ops, &stub->chain.wait.lock,
-  0, 0);
-
-   if (i915_sw_fence_await_reservation(&stub->chain,
-   obj->base.resv, NULL, true,
-   
i915_fence_timeout(to_i915(obj->base.dev)),
-   I915_FENCE_GFP) < 0)
-   goto err;
-
-   dma_resv_add_excl_fence(obj->base.resv, &stub->dma);
-
-   return &stub->dma;
-
-err:
-   stub_release(&stub->dma);
-   return NULL;
-}
-
-void i915_gem_object_unlock_fence(struct drm_i915_gem_object *obj,
- struct dma_fence *fence)
-{
-   struct stub_fence *stub = container_of(fence, typeof(*stub), dma);
-
-   i915_sw_fence_commit(&stub->chain);
-}
diff --git a/drivers/gpu/drm/i915/gem/i915_gem_object.h 
b/drivers/gpu/drm/i915/gem/i915_gem_object.h
index c48df27d66f6..107b98a82e44 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_object.h
+++ b/drivers/gpu/drm/i915/gem/i915_gem_object.h
@@ -157,11 +157,6 @@ static inline void i915_gem_object_unlock(struct 
drm_i915_gem_object *obj)
dma_resv_unlock(obj->base.resv);
 }
 
-struct dma_fence *
-i915_gem_object_lock_fence(struct drm_i915_gem_object *obj);
-void i915_gem_object_unlock_fence(struct drm_i915_gem_object *obj,
- struct dma_fence *fence);
-
 static inline void
 i915_gem_object_set_readonly(struct drm_i915_gem_object *obj)
 {
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
index 929a8f20cca4..4b5afb85efd1 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -184,23 +184,38 @@ i915_gem_phys_pwrite(struct drm_i915_gem_object *obj,
 struct drm_i915_gem_pwrite *args,
 struct drm_file *file)
 {
-   void *vaddr = sg_page(obj->mm.pages->sgl) 

[Intel-gfx] [PATCH 09/61] drm/i915: make lockdep slightly happier about execbuf.

2020-10-02 Thread Maarten Lankhorst
As soon as we install fences, we should stop allocating memory
in order to prevent any potential deadlocks.

This is required later on, when we start adding support for
dma-fence annotations.

Signed-off-by: Maarten Lankhorst 
---
 .../gpu/drm/i915/gem/i915_gem_execbuffer.c| 24 ++-
 drivers/gpu/drm/i915/i915_active.c| 20 
 drivers/gpu/drm/i915/i915_vma.c   |  8 ---
 drivers/gpu/drm/i915/i915_vma.h   |  3 +++
 4 files changed, 36 insertions(+), 19 deletions(-)

diff --git a/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c 
b/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c
index 2fbe6fbe043a..ea2242f1b5b8 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c
+++ b/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c
@@ -49,11 +49,12 @@ enum {
 #define DBG_FORCE_RELOC 0 /* choose one of the above! */
 };
 
-#define __EXEC_OBJECT_HAS_PIN  BIT(31)
-#define __EXEC_OBJECT_HAS_FENCEBIT(30)
-#define __EXEC_OBJECT_NEEDS_MAPBIT(29)
-#define __EXEC_OBJECT_NEEDS_BIAS   BIT(28)
-#define __EXEC_OBJECT_INTERNAL_FLAGS   (~0u << 28) /* all of the above */
+/* __EXEC_OBJECT_NO_RESERVE is BIT(31), defined in i915_vma.h */
+#define __EXEC_OBJECT_HAS_PIN  BIT(30)
+#define __EXEC_OBJECT_HAS_FENCEBIT(29)
+#define __EXEC_OBJECT_NEEDS_MAPBIT(28)
+#define __EXEC_OBJECT_NEEDS_BIAS   BIT(27)
+#define __EXEC_OBJECT_INTERNAL_FLAGS   (~0u << 27) /* all of the above + */
 #define __EXEC_OBJECT_RESERVED (__EXEC_OBJECT_HAS_PIN | 
__EXEC_OBJECT_HAS_FENCE)
 
 #define __EXEC_HAS_RELOC   BIT(31)
@@ -925,6 +926,12 @@ static int eb_validate_vmas(struct i915_execbuffer *eb)
}
}
 
+   if (!(ev->flags & EXEC_OBJECT_WRITE)) {
+   err = dma_resv_reserve_shared(vma->resv, 1);
+   if (err)
+   return err;
+   }
+
GEM_BUG_ON(drm_mm_node_allocated(&vma->node) &&
   eb_vma_misplaced(&eb->exec[i], vma, ev->flags));
}
@@ -2190,7 +2197,8 @@ static int eb_move_to_gpu(struct i915_execbuffer *eb)
}
 
if (err == 0)
-   err = i915_vma_move_to_active(vma, eb->request, flags);
+   err = i915_vma_move_to_active(vma, eb->request,
+ flags | 
__EXEC_OBJECT_NO_RESERVE);
}
 
if (unlikely(err))
@@ -2442,6 +2450,10 @@ static int eb_parse_pipeline(struct i915_execbuffer *eb,
if (err)
goto err_commit;
 
+   err = dma_resv_reserve_shared(shadow->resv, 1);
+   if (err)
+   goto err_commit;
+
/* Wait for all writes (and relocs) into the batch to complete */
err = i915_sw_fence_await_reservation(&pw->base.chain,
  pw->batch->resv, NULL, false,
diff --git a/drivers/gpu/drm/i915/i915_active.c 
b/drivers/gpu/drm/i915/i915_active.c
index b0a6522be3d1..2bf1e444dda7 100644
--- a/drivers/gpu/drm/i915/i915_active.c
+++ b/drivers/gpu/drm/i915/i915_active.c
@@ -296,18 +296,13 @@ static struct active_node *__active_lookup(struct 
i915_active *ref, u64 idx)
 static struct i915_active_fence *
 active_instance(struct i915_active *ref, u64 idx)
 {
-   struct active_node *node, *prealloc;
+   struct active_node *node;
struct rb_node **p, *parent;
 
node = __active_lookup(ref, idx);
if (likely(node))
return &node->base;
 
-   /* Preallocate a replacement, just in case */
-   prealloc = kmem_cache_alloc(global.slab_cache, GFP_KERNEL);
-   if (!prealloc)
-   return NULL;
-
spin_lock_irq(&ref->tree_lock);
GEM_BUG_ON(i915_active_is_idle(ref));
 
@@ -317,10 +312,8 @@ active_instance(struct i915_active *ref, u64 idx)
parent = *p;
 
node = rb_entry(parent, struct active_node, node);
-   if (node->timeline == idx) {
-   kmem_cache_free(global.slab_cache, prealloc);
+   if (node->timeline == idx)
goto out;
-   }
 
if (node->timeline < idx)
p = &parent->rb_right;
@@ -328,7 +321,14 @@ active_instance(struct i915_active *ref, u64 idx)
p = &parent->rb_left;
}
 
-   node = prealloc;
+   /*
+* XXX: We should preallocate this before i915_active_ref() is ever
+*  called, but we cannot call into fs_reclaim() anyway, so use 
GFP_ATOMIC.
+*/
+   node = kmem_cache_alloc(global.slab_cache, GFP_ATOMIC);
+   if (!node)
+   goto out;
+
__i915_active_fence_init(&node->base, NULL, node_retire);
node->ref = ref;
node->timeline = idx;
diff --git a/drivers/gpu/drm/i915/i915_vma.c b/drivers/gpu/drm/i915/i915

[Intel-gfx] [PATCH 15/61] drm/i915: Flatten obj->mm.lock

2020-10-02 Thread Maarten Lankhorst
With userptr fixed, there is no need for all separate lockdep classes
now, and we can remove all lockdep tricks used. A trylock in the
shrinker is all we need now to flatten the locking hierarchy.

Signed-off-by: Maarten Lankhorst 
---
 drivers/gpu/drm/i915/gem/i915_gem_object.c   |  6 +---
 drivers/gpu/drm/i915/gem/i915_gem_object.h   | 20 ++--
 drivers/gpu/drm/i915/gem/i915_gem_pages.c| 34 ++--
 drivers/gpu/drm/i915/gem/i915_gem_phys.c |  2 +-
 drivers/gpu/drm/i915/gem/i915_gem_shrinker.c | 10 +++---
 drivers/gpu/drm/i915/gem/i915_gem_userptr.c  |  2 +-
 6 files changed, 27 insertions(+), 47 deletions(-)

diff --git a/drivers/gpu/drm/i915/gem/i915_gem_object.c 
b/drivers/gpu/drm/i915/gem/i915_gem_object.c
index 3c2a3965eb35..af5d561de7dc 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_object.c
+++ b/drivers/gpu/drm/i915/gem/i915_gem_object.c
@@ -62,7 +62,7 @@ void i915_gem_object_init(struct drm_i915_gem_object *obj,
  const struct drm_i915_gem_object_ops *ops,
  struct lock_class_key *key, unsigned flags)
 {
-   __mutex_init(&obj->mm.lock, ops->name ?: "obj->mm.lock", key);
+   mutex_init(&obj->mm.lock);
 
spin_lock_init(&obj->vma.lock);
INIT_LIST_HEAD(&obj->vma.list);
@@ -84,10 +84,6 @@ void i915_gem_object_init(struct drm_i915_gem_object *obj,
obj->mm.madv = I915_MADV_WILLNEED;
INIT_RADIX_TREE(&obj->mm.get_page.radix, GFP_KERNEL | __GFP_NOWARN);
mutex_init(&obj->mm.get_page.lock);
-
-   if (IS_ENABLED(CONFIG_LOCKDEP) && i915_gem_object_is_shrinkable(obj))
-   i915_gem_shrinker_taints_mutex(to_i915(obj->base.dev),
-  &obj->mm.lock);
 }
 
 /**
diff --git a/drivers/gpu/drm/i915/gem/i915_gem_object.h 
b/drivers/gpu/drm/i915/gem/i915_gem_object.h
index 2faebe1fd8be..d34c6e2424f9 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_object.h
+++ b/drivers/gpu/drm/i915/gem/i915_gem_object.h
@@ -299,27 +299,10 @@ void __i915_gem_object_set_pages(struct 
drm_i915_gem_object *obj,
 int i915_gem_object_get_pages(struct drm_i915_gem_object *obj);
 int __i915_gem_object_get_pages(struct drm_i915_gem_object *obj);
 
-enum i915_mm_subclass { /* lockdep subclass for obj->mm.lock/struct_mutex */
-   I915_MM_NORMAL = 0,
-   /*
-* Only used by struct_mutex, when called "recursively" from
-* direct-reclaim-esque. Safe because there is only every one
-* struct_mutex in the entire system.
-*/
-   I915_MM_SHRINKER = 1,
-   /*
-* Used for obj->mm.lock when allocating pages. Safe because the object
-* isn't yet on any LRU, and therefore the shrinker can't deadlock on
-* it. As soon as the object has pages, obj->mm.lock nests within
-* fs_reclaim.
-*/
-   I915_MM_GET_PAGES = 1,
-};
-
 static inline int __must_check
 i915_gem_object_pin_pages(struct drm_i915_gem_object *obj)
 {
-   might_lock_nested(&obj->mm.lock, I915_MM_GET_PAGES);
+   might_lock(&obj->mm.lock);
 
if (atomic_inc_not_zero(&obj->mm.pages_pin_count))
return 0;
@@ -363,6 +346,7 @@ i915_gem_object_unpin_pages(struct drm_i915_gem_object *obj)
 }
 
 int __i915_gem_object_put_pages(struct drm_i915_gem_object *obj);
+int __i915_gem_object_put_pages_locked(struct drm_i915_gem_object *obj);
 void i915_gem_object_truncate(struct drm_i915_gem_object *obj);
 void i915_gem_object_writeback(struct drm_i915_gem_object *obj);
 
diff --git a/drivers/gpu/drm/i915/gem/i915_gem_pages.c 
b/drivers/gpu/drm/i915/gem/i915_gem_pages.c
index 42946b1661c5..891bb32cfe3f 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_pages.c
+++ b/drivers/gpu/drm/i915/gem/i915_gem_pages.c
@@ -109,7 +109,7 @@ int __i915_gem_object_get_pages(struct drm_i915_gem_object 
*obj)
 {
int err;
 
-   err = mutex_lock_interruptible_nested(&obj->mm.lock, I915_MM_GET_PAGES);
+   err = mutex_lock_interruptible(&obj->mm.lock);
if (err)
return err;
 
@@ -191,21 +191,13 @@ __i915_gem_object_unset_pages(struct drm_i915_gem_object 
*obj)
return pages;
 }
 
-int __i915_gem_object_put_pages(struct drm_i915_gem_object *obj)
+int __i915_gem_object_put_pages_locked(struct drm_i915_gem_object *obj)
 {
struct sg_table *pages;
-   int err;
 
if (i915_gem_object_has_pinned_pages(obj))
return -EBUSY;
 
-   /* May be called by shrinker from within get_pages() (on another bo) */
-   mutex_lock(&obj->mm.lock);
-   if (unlikely(atomic_read(&obj->mm.pages_pin_count))) {
-   err = -EBUSY;
-   goto unlock;
-   }
-
i915_gem_object_release_mmap_offset(obj);
 
/*
@@ -221,14 +213,22 @@ int __i915_gem_object_put_pages(struct 
drm_i915_gem_object *obj)
 * get_pages backends we should be better able to handle the
 * cancellation of the async task in a more uniform manner.
 */
-   i

[Intel-gfx] [PATCH 18/61] drm/i915: Make ring submission compatible with obj->mm.lock removal.

2020-10-02 Thread Maarten Lankhorst
We map the initial context during first pin.

This allows us to remove pin_map from state allocation, which saves
us a few retry loops. We won't need this until first pin anyway.

intel_ring_submission_setup() is also reworked slightly to do all
pinning in a single ww loop.

Signed-off-by: Maarten Lankhorst 
---
 .../gpu/drm/i915/gt/intel_ring_submission.c   | 177 +++---
 1 file changed, 111 insertions(+), 66 deletions(-)

diff --git a/drivers/gpu/drm/i915/gt/intel_ring_submission.c 
b/drivers/gpu/drm/i915/gt/intel_ring_submission.c
index a41b43f445b8..10904a84aeb7 100644
--- a/drivers/gpu/drm/i915/gt/intel_ring_submission.c
+++ b/drivers/gpu/drm/i915/gt/intel_ring_submission.c
@@ -478,6 +478,26 @@ static void ring_context_destroy(struct kref *ref)
intel_context_free(ce);
 }
 
+static int ring_context_init_default_state(struct intel_context *ce,
+  struct i915_gem_ww_ctx *ww)
+{
+   struct drm_i915_gem_object *obj = ce->state->obj;
+   void *vaddr;
+
+   vaddr = i915_gem_object_pin_map(obj, I915_MAP_WB);
+   if (IS_ERR(vaddr))
+   return PTR_ERR(vaddr);
+
+   shmem_read(ce->engine->default_state, 0,
+  vaddr, ce->engine->context_size);
+
+   i915_gem_object_flush_map(obj);
+   __i915_gem_object_release_map(obj);
+
+   __set_bit(CONTEXT_VALID_BIT, &ce->flags);
+   return 0;
+}
+
 static int ring_context_pre_pin(struct intel_context *ce,
struct i915_gem_ww_ctx *ww,
void **unused)
@@ -485,6 +505,13 @@ static int ring_context_pre_pin(struct intel_context *ce,
struct i915_address_space *vm;
int err = 0;
 
+   if (ce->engine->default_state &&
+   !test_bit(CONTEXT_VALID_BIT, &ce->flags)) {
+   err = ring_context_init_default_state(ce, ww);
+   if (err)
+   return err;
+   }
+
vm = vm_alias(ce->vm);
if (vm)
err = gen6_ppgtt_pin(i915_vm_to_ppgtt((vm)), ww);
@@ -540,22 +567,6 @@ alloc_context_vma(struct intel_engine_cs *engine)
if (IS_IVYBRIDGE(i915))
i915_gem_object_set_cache_coherency(obj, I915_CACHE_L3_LLC);
 
-   if (engine->default_state) {
-   void *vaddr;
-
-   vaddr = i915_gem_object_pin_map(obj, I915_MAP_WB);
-   if (IS_ERR(vaddr)) {
-   err = PTR_ERR(vaddr);
-   goto err_obj;
-   }
-
-   shmem_read(engine->default_state, 0,
-  vaddr, engine->context_size);
-
-   i915_gem_object_flush_map(obj);
-   __i915_gem_object_release_map(obj);
-   }
-
vma = i915_vma_instance(obj, &engine->gt->ggtt->vm, NULL);
if (IS_ERR(vma)) {
err = PTR_ERR(vma);
@@ -587,8 +598,6 @@ static int ring_context_alloc(struct intel_context *ce)
return PTR_ERR(vma);
 
ce->state = vma;
-   if (engine->default_state)
-   __set_bit(CONTEXT_VALID_BIT, &ce->flags);
}
 
return 0;
@@ -1184,37 +1193,15 @@ static int gen7_ctx_switch_bb_setup(struct 
intel_engine_cs * const engine,
return gen7_setup_clear_gpr_bb(engine, vma);
 }
 
-static int gen7_ctx_switch_bb_init(struct intel_engine_cs *engine)
+static int gen7_ctx_switch_bb_init(struct intel_engine_cs *engine,
+  struct i915_gem_ww_ctx *ww,
+  struct i915_vma *vma)
 {
-   struct drm_i915_gem_object *obj;
-   struct i915_vma *vma;
-   int size;
int err;
 
-   size = gen7_ctx_switch_bb_setup(engine, NULL /* probe size */);
-   if (size <= 0)
-   return size;
-
-   size = ALIGN(size, PAGE_SIZE);
-   obj = i915_gem_object_create_internal(engine->i915, size);
-   if (IS_ERR(obj))
-   return PTR_ERR(obj);
-
-   vma = i915_vma_instance(obj, engine->gt->vm, NULL);
-   if (IS_ERR(vma)) {
-   err = PTR_ERR(vma);
-   goto err_obj;
-   }
-
-   vma->private = intel_context_create(engine); /* dummy residuals */
-   if (IS_ERR(vma->private)) {
-   err = PTR_ERR(vma->private);
-   goto err_obj;
-   }
-
-   err = i915_vma_pin(vma, 0, 0, PIN_USER | PIN_HIGH);
+   err = i915_vma_pin_ww(vma, ww, 0, 0, PIN_USER | PIN_HIGH);
if (err)
-   goto err_private;
+   return err;
 
err = i915_vma_sync(vma);
if (err)
@@ -1229,17 +1216,50 @@ static int gen7_ctx_switch_bb_init(struct 
intel_engine_cs *engine)
 
 err_unpin:
i915_vma_unpin(vma);
-err_private:
-   intel_context_put(vma->private);
-err_obj:
-   i915_gem_object_put(obj);
return err;
 }
 
+static struct i915_vma *gen7_ctx_vma(struct intel_engine_cs *engine)
+{
+   struct drm_i915_gem_object *obj;

[Intel-gfx] [PATCH 21/61] drm/i915: Pass ww ctx to intel_pin_to_display_plane

2020-10-02 Thread Maarten Lankhorst
Instead of multiple lockings, lock the object once,
and perform the ww dance around attach_phys and pin_pages.

Signed-off-by: Maarten Lankhorst 
---
 drivers/gpu/drm/i915/display/intel_display.c  | 69 ---
 drivers/gpu/drm/i915/display/intel_display.h  |  2 +-
 drivers/gpu/drm/i915/display/intel_fbdev.c|  2 +-
 drivers/gpu/drm/i915/display/intel_overlay.c  | 34 +++--
 drivers/gpu/drm/i915/gem/i915_gem_domain.c| 30 ++--
 drivers/gpu/drm/i915/gem/i915_gem_object.h|  1 +
 drivers/gpu/drm/i915/gem/i915_gem_phys.c  | 10 +--
 .../drm/i915/gem/selftests/i915_gem_phys.c|  2 +
 8 files changed, 86 insertions(+), 64 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_display.c 
b/drivers/gpu/drm/i915/display/intel_display.c
index cc2c8ba00ed5..47b4b72bc95e 100644
--- a/drivers/gpu/drm/i915/display/intel_display.c
+++ b/drivers/gpu/drm/i915/display/intel_display.c
@@ -2228,6 +2228,7 @@ static bool intel_plane_uses_fence(const struct 
intel_plane_state *plane_state)
 
 struct i915_vma *
 intel_pin_and_fence_fb_obj(struct drm_framebuffer *fb,
+  bool phys_cursor,
   const struct i915_ggtt_view *view,
   bool uses_fence,
   unsigned long *out_flags)
@@ -2236,14 +2237,19 @@ intel_pin_and_fence_fb_obj(struct drm_framebuffer *fb,
struct drm_i915_private *dev_priv = to_i915(dev);
struct drm_i915_gem_object *obj = intel_fb_obj(fb);
intel_wakeref_t wakeref;
+   struct i915_gem_ww_ctx ww;
struct i915_vma *vma;
unsigned int pinctl;
u32 alignment;
+   int ret;
 
if (drm_WARN_ON(dev, !i915_gem_object_is_framebuffer(obj)))
return ERR_PTR(-EINVAL);
 
-   alignment = intel_surf_alignment(fb, 0);
+   if (phys_cursor)
+   alignment = intel_cursor_alignment(dev_priv);
+   else
+   alignment = intel_surf_alignment(fb, 0);
if (drm_WARN_ON(dev, alignment && !is_power_of_2(alignment)))
return ERR_PTR(-EINVAL);
 
@@ -2278,14 +2284,26 @@ intel_pin_and_fence_fb_obj(struct drm_framebuffer *fb,
if (HAS_GMCH(dev_priv))
pinctl |= PIN_MAPPABLE;
 
-   vma = i915_gem_object_pin_to_display_plane(obj,
-  alignment, view, pinctl);
-   if (IS_ERR(vma))
+   i915_gem_ww_ctx_init(&ww, true);
+retry:
+   ret = i915_gem_object_lock(obj, &ww);
+   if (!ret && phys_cursor)
+   ret = i915_gem_object_attach_phys(obj, alignment);
+   if (!ret)
+   ret = i915_gem_object_pin_pages(obj);
+   if (ret)
goto err;
 
-   if (uses_fence && i915_vma_is_map_and_fenceable(vma)) {
-   int ret;
+   if (!ret) {
+   vma = i915_gem_object_pin_to_display_plane(obj, &ww, alignment,
+  view, pinctl);
+   if (IS_ERR(vma)) {
+   ret = PTR_ERR(vma);
+   goto err_unpin;
+   }
+   }
 
+   if (uses_fence && i915_vma_is_map_and_fenceable(vma)) {
/*
 * Install a fence for tiled scan-out. Pre-i965 always needs a
 * fence, whereas 965+ only requires a fence if using
@@ -2306,16 +2324,28 @@ intel_pin_and_fence_fb_obj(struct drm_framebuffer *fb,
ret = i915_vma_pin_fence(vma);
if (ret != 0 && INTEL_GEN(dev_priv) < 4) {
i915_gem_object_unpin_from_display_plane(vma);
-   vma = ERR_PTR(ret);
-   goto err;
+   goto err_unpin;
}
+   ret = 0;
 
-   if (ret == 0 && vma->fence)
+   if (vma->fence)
*out_flags |= PLANE_HAS_FENCE;
}
 
i915_vma_get(vma);
+
+err_unpin:
+   i915_gem_object_unpin_pages(obj);
 err:
+   if (ret == -EDEADLK) {
+   ret = i915_gem_ww_ctx_backoff(&ww);
+   if (!ret)
+   goto retry;
+   }
+   i915_gem_ww_ctx_fini(&ww);
+   if (ret)
+   vma = ERR_PTR(ret);
+
atomic_dec(&dev_priv->gpu_error.pending_fb_pin);
intel_runtime_pm_put(&dev_priv->runtime_pm, wakeref);
return vma;
@@ -16133,19 +16163,11 @@ static int intel_plane_pin_fb(struct 
intel_plane_state *plane_state)
struct drm_i915_private *dev_priv = to_i915(plane->base.dev);
struct drm_framebuffer *fb = plane_state->hw.fb;
struct i915_vma *vma;
+   bool phys_cursor =
+   plane->id == PLANE_CURSOR &&
+   INTEL_INFO(dev_priv)->display.cursor_needs_physical;
 
-   if (plane->id == PLANE_CURSOR &&
-   INTEL_INFO(dev_priv)->display.cursor_needs_physical) {
-   struct drm_i915_gem_object *obj = intel_fb_obj(fb);
-   const int

[Intel-gfx] [PATCH 22/61] drm/i915: Add object locking to vm_fault_cpu

2020-10-02 Thread Maarten Lankhorst
Take a simple lock so we hold ww around (un)pin_pages as needed.

Signed-off-by: Maarten Lankhorst 
---
 drivers/gpu/drm/i915/gem/i915_gem_mman.c | 4 
 1 file changed, 4 insertions(+)

diff --git a/drivers/gpu/drm/i915/gem/i915_gem_mman.c 
b/drivers/gpu/drm/i915/gem/i915_gem_mman.c
index 5aa037ca3a41..ba8e9ef6943d 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_mman.c
+++ b/drivers/gpu/drm/i915/gem/i915_gem_mman.c
@@ -246,6 +246,9 @@ static vm_fault_t vm_fault_cpu(struct vm_fault *vmf)
 area->vm_flags & VM_WRITE))
return VM_FAULT_SIGBUS;
 
+   if (i915_gem_object_lock_interruptible(obj, NULL))
+   return VM_FAULT_NOPAGE;
+
err = i915_gem_object_pin_pages(obj);
if (err)
goto out;
@@ -269,6 +272,7 @@ static vm_fault_t vm_fault_cpu(struct vm_fault *vmf)
i915_gem_object_unpin_pages(obj);
 
 out:
+   i915_gem_object_unlock(obj);
return i915_error_to_vmf_fault(err);
 }
 
-- 
2.28.0

___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx


[Intel-gfx] [PATCH 13/61] drm/i915: Reject UNSYNCHRONIZED for userptr

2020-10-02 Thread Maarten Lankhorst
We should not allow this any more, as it will break with the new userptr
implementation, it could still be made to work, but there's no point in
doing so.

Signed-off-by: Maarten Lankhorst 
---
 .../gpu/drm/i915/gem/i915_gem_execbuffer.c|  2 +
 drivers/gpu/drm/i915/gem/i915_gem_object.h|  4 ++
 .../gpu/drm/i915/gem/i915_gem_object_types.h  |  2 +
 drivers/gpu/drm/i915/gem/i915_gem_userptr.c   | 64 ++-
 drivers/gpu/drm/i915/i915_drv.h   |  2 +
 5 files changed, 31 insertions(+), 43 deletions(-)

diff --git a/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c 
b/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c
index ea2242f1b5b8..c30fa5790a47 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c
+++ b/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c
@@ -1966,8 +1966,10 @@ static noinline int eb_relocate_parse_slow(struct 
i915_execbuffer *eb,
err = 0;
}
 
+#ifdef CONFIG_MMU_NOTIFIER
if (!err)
flush_workqueue(eb->i915->mm.userptr_wq);
+#endif
 
 err_relock:
i915_gem_ww_ctx_init(&eb->ww, true);
diff --git a/drivers/gpu/drm/i915/gem/i915_gem_object.h 
b/drivers/gpu/drm/i915/gem/i915_gem_object.h
index 9b737eb231f2..358c3342343c 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_object.h
+++ b/drivers/gpu/drm/i915/gem/i915_gem_object.h
@@ -514,7 +514,11 @@ void __i915_gem_object_invalidate_frontbuffer(struct 
drm_i915_gem_object *obj,
 static inline bool
 i915_gem_object_is_userptr(struct drm_i915_gem_object *obj)
 {
+#ifdef CONFIG_MMU_NOTIFIER
return obj->userptr.mm;
+#else
+   return false;
+#endif
 }
 
 static inline void
diff --git a/drivers/gpu/drm/i915/gem/i915_gem_object_types.h 
b/drivers/gpu/drm/i915/gem/i915_gem_object_types.h
index dbb6f6171165..970d20b30ebd 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_object_types.h
+++ b/drivers/gpu/drm/i915/gem/i915_gem_object_types.h
@@ -286,6 +286,7 @@ struct drm_i915_gem_object {
unsigned long *bit_17;
 
union {
+#ifdef CONFIG_MMU_NOTIFIER
struct i915_gem_userptr {
uintptr_t ptr;
 
@@ -293,6 +294,7 @@ struct drm_i915_gem_object {
struct i915_mmu_object *mmu_object;
struct work_struct *work;
} userptr;
+#endif
 
unsigned long scratch;
u64 encode;
diff --git a/drivers/gpu/drm/i915/gem/i915_gem_userptr.c 
b/drivers/gpu/drm/i915/gem/i915_gem_userptr.c
index 3fd63fdd7466..a2b7f6db2f1a 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_userptr.c
+++ b/drivers/gpu/drm/i915/gem/i915_gem_userptr.c
@@ -15,6 +15,8 @@
 #include "i915_gem_object.h"
 #include "i915_scatterlist.h"
 
+#if defined(CONFIG_MMU_NOTIFIER)
+
 struct i915_mm_struct {
struct mm_struct *mm;
struct drm_i915_private *i915;
@@ -24,7 +26,6 @@ struct i915_mm_struct {
struct rcu_work work;
 };
 
-#if defined(CONFIG_MMU_NOTIFIER)
 #include 
 
 struct i915_mmu_notifier {
@@ -217,15 +218,11 @@ i915_mmu_notifier_find(struct i915_mm_struct *mm)
 }
 
 static int
-i915_gem_userptr_init__mmu_notifier(struct drm_i915_gem_object *obj,
-   unsigned flags)
+i915_gem_userptr_init__mmu_notifier(struct drm_i915_gem_object *obj)
 {
struct i915_mmu_notifier *mn;
struct i915_mmu_object *mo;
 
-   if (flags & I915_USERPTR_UNSYNCHRONIZED)
-   return capable(CAP_SYS_ADMIN) ? 0 : -EPERM;
-
if (GEM_WARN_ON(!obj->userptr.mm))
return -EINVAL;
 
@@ -258,38 +255,6 @@ i915_mmu_notifier_free(struct i915_mmu_notifier *mn,
kfree(mn);
 }
 
-#else
-
-static void
-__i915_gem_userptr_set_active(struct drm_i915_gem_object *obj, bool value)
-{
-}
-
-static void
-i915_gem_userptr_release__mmu_notifier(struct drm_i915_gem_object *obj)
-{
-}
-
-static int
-i915_gem_userptr_init__mmu_notifier(struct drm_i915_gem_object *obj,
-   unsigned flags)
-{
-   if ((flags & I915_USERPTR_UNSYNCHRONIZED) == 0)
-   return -ENODEV;
-
-   if (!capable(CAP_SYS_ADMIN))
-   return -EPERM;
-
-   return 0;
-}
-
-static void
-i915_mmu_notifier_free(struct i915_mmu_notifier *mn,
-  struct mm_struct *mm)
-{
-}
-
-#endif
 
 static struct i915_mm_struct *
 __i915_mm_struct_find(struct drm_i915_private *i915, struct mm_struct *real)
@@ -731,6 +696,8 @@ static const struct drm_i915_gem_object_ops 
i915_gem_userptr_ops = {
.release = i915_gem_userptr_release,
 };
 
+#endif
+
 /*
  * Creates a new mm object that wraps some normal memory from the process
  * context - user memory.
@@ -771,12 +738,12 @@ i915_gem_userptr_ioctl(struct drm_device *dev,
   void *data,
   struct drm_file *file)
 {
-   static struct lock_class_key lock_class;
+   static struct lock_class_key __maybe_unused lock_class;
struct drm_i915_private *dev_priv = to_i915(dev);
struct drm_i915_g

[Intel-gfx] [PATCH 32/61] drm/i915: Add igt_spinner_pin() to allow for ww locking around spinner.

2020-10-02 Thread Maarten Lankhorst
By default, we assume that it's called inside igt_create_request
to keep existing selftests working, but allow for manual pinning
when passing a ww context.

Signed-off-by: Maarten Lankhorst 
---
 drivers/gpu/drm/i915/selftests/igt_spinner.c | 136 ---
 drivers/gpu/drm/i915/selftests/igt_spinner.h |   5 +
 2 files changed, 95 insertions(+), 46 deletions(-)

diff --git a/drivers/gpu/drm/i915/selftests/igt_spinner.c 
b/drivers/gpu/drm/i915/selftests/igt_spinner.c
index ec0ecb4e4ca6..9c461edb0b73 100644
--- a/drivers/gpu/drm/i915/selftests/igt_spinner.c
+++ b/drivers/gpu/drm/i915/selftests/igt_spinner.c
@@ -11,8 +11,6 @@
 
 int igt_spinner_init(struct igt_spinner *spin, struct intel_gt *gt)
 {
-   unsigned int mode;
-   void *vaddr;
int err;
 
memset(spin, 0, sizeof(*spin));
@@ -23,6 +21,7 @@ int igt_spinner_init(struct igt_spinner *spin, struct 
intel_gt *gt)
err = PTR_ERR(spin->hws);
goto err;
}
+   i915_gem_object_set_cache_coherency(spin->hws, I915_CACHE_LLC);
 
spin->obj = i915_gem_object_create_internal(gt->i915, PAGE_SIZE);
if (IS_ERR(spin->obj)) {
@@ -30,34 +29,83 @@ int igt_spinner_init(struct igt_spinner *spin, struct 
intel_gt *gt)
goto err_hws;
}
 
-   i915_gem_object_set_cache_coherency(spin->hws, I915_CACHE_LLC);
-   vaddr = i915_gem_object_pin_map(spin->hws, I915_MAP_WB);
-   if (IS_ERR(vaddr)) {
-   err = PTR_ERR(vaddr);
-   goto err_obj;
-   }
-   spin->seqno = memset(vaddr, 0xff, PAGE_SIZE);
-
-   mode = i915_coherent_map_type(gt->i915);
-   vaddr = i915_gem_object_pin_map(spin->obj, mode);
-   if (IS_ERR(vaddr)) {
-   err = PTR_ERR(vaddr);
-   goto err_unpin_hws;
-   }
-   spin->batch = vaddr;
-
return 0;
 
-err_unpin_hws:
-   i915_gem_object_unpin_map(spin->hws);
-err_obj:
-   i915_gem_object_put(spin->obj);
 err_hws:
i915_gem_object_put(spin->hws);
 err:
return err;
 }
 
+static void *igt_spinner_pin_obj(struct intel_context *ce,
+struct i915_gem_ww_ctx *ww,
+struct drm_i915_gem_object *obj,
+unsigned int mode, struct i915_vma **vma)
+{
+   void *vaddr;
+   int ret;
+
+   *vma = i915_vma_instance(obj, ce->vm, NULL);
+   if (IS_ERR(*vma))
+   return ERR_CAST(*vma);
+
+   ret = i915_gem_object_lock(obj, ww);
+   if (ret)
+   return ERR_PTR(ret);
+
+   vaddr = i915_gem_object_pin_map(obj, mode);
+
+   if (!ww)
+   i915_gem_object_unlock(obj);
+
+   if (IS_ERR(vaddr))
+   return vaddr;
+
+   if (ww)
+   ret = i915_vma_pin_ww(*vma, ww, 0, 0, PIN_USER);
+   else
+   ret = i915_vma_pin(*vma, 0, 0, PIN_USER);
+
+   if (ret) {
+   i915_gem_object_unpin_map(obj);
+   return ERR_PTR(ret);
+   }
+
+   return vaddr;
+}
+
+int igt_spinner_pin(struct igt_spinner *spin,
+   struct intel_context *ce,
+   struct i915_gem_ww_ctx *ww)
+{
+   void *vaddr;
+
+   if (spin->ce && WARN_ON(spin->ce != ce))
+   return -ENODEV;
+   spin->ce = ce;
+
+   if (!spin->seqno) {
+   vaddr = igt_spinner_pin_obj(ce, ww, spin->hws, I915_MAP_WB, 
&spin->hws_vma);
+   if (IS_ERR(vaddr))
+   return PTR_ERR(vaddr);
+
+   spin->seqno = memset(vaddr, 0xff, PAGE_SIZE);
+   }
+
+   if (!spin->batch) {
+   unsigned int mode =
+   i915_coherent_map_type(spin->gt->i915);
+
+   vaddr = igt_spinner_pin_obj(ce, ww, spin->obj, mode, 
&spin->batch_vma);
+   if (IS_ERR(vaddr))
+   return PTR_ERR(vaddr);
+
+   spin->batch = vaddr;
+   }
+
+   return 0;
+}
+
 static unsigned int seqno_offset(u64 fence)
 {
return offset_in_page(sizeof(u32) * fence);
@@ -102,27 +150,18 @@ igt_spinner_create_request(struct igt_spinner *spin,
if (!intel_engine_can_store_dword(ce->engine))
return ERR_PTR(-ENODEV);
 
-   vma = i915_vma_instance(spin->obj, ce->vm, NULL);
-   if (IS_ERR(vma))
-   return ERR_CAST(vma);
-
-   hws = i915_vma_instance(spin->hws, ce->vm, NULL);
-   if (IS_ERR(hws))
-   return ERR_CAST(hws);
+   if (!spin->batch) {
+   err = igt_spinner_pin(spin, ce, NULL);
+   if (err)
+   return ERR_PTR(err);
+   }
 
-   err = i915_vma_pin(vma, 0, 0, PIN_USER);
-   if (err)
-   return ERR_PTR(err);
-
-   err = i915_vma_pin(hws, 0, 0, PIN_USER);
-   if (err)
-   goto unpin_vma;
+   hws = spin->hws_vma;
+   vma = spin->batch_vma;
 
rq = intel_context_create_request(ce);
-   if (IS

[Intel-gfx] [PATCH 01/61] drm/i915: Move cmd parser pinning to execbuffer

2020-10-02 Thread Maarten Lankhorst
We need to get rid of allocations in the cmd parser, because it needs
to be called from a signaling context, first move all pinning to
execbuf, where we already hold all locks.

Allocate jump_whitelist in the execbuffer, and add annotations around
intel_engine_cmd_parser(), to ensure we only call the command parser
without allocating any memory, or taking any locks we're not supposed to.

Because i915_gem_object_get_page() may also allocate memory, add a
path to i915_gem_object_get_sg() that prevents memory allocations,
and walk the sg list manually. It should be similarly fast.

This has the added benefit of being able to catch all memory allocation
errors before the point of no return, and return -ENOMEM safely to the
execbuf submitter.

Signed-off-by: Maarten Lankhorst 
---
 .../gpu/drm/i915/gem/i915_gem_execbuffer.c|  74 -
 drivers/gpu/drm/i915/gem/i915_gem_object.h|   3 +-
 drivers/gpu/drm/i915/gem/i915_gem_pages.c |  21 +++-
 drivers/gpu/drm/i915/gt/intel_ggtt.c  |   2 +-
 drivers/gpu/drm/i915/i915_cmd_parser.c| 104 --
 drivers/gpu/drm/i915/i915_drv.h   |   7 +-
 drivers/gpu/drm/i915/i915_memcpy.c|   2 +-
 drivers/gpu/drm/i915/i915_memcpy.h|   2 +-
 8 files changed, 139 insertions(+), 76 deletions(-)

diff --git a/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c 
b/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c
index 4b09bcd70cf4..63e2f16204da 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c
+++ b/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c
@@ -27,6 +27,7 @@
 #include "i915_sw_fence_work.h"
 #include "i915_trace.h"
 #include "i915_user_extensions.h"
+#include "i915_memcpy.h"
 
 struct eb_vma {
struct i915_vma *vma;
@@ -2269,24 +2270,45 @@ struct eb_parse_work {
struct i915_vma *trampoline;
unsigned long batch_offset;
unsigned long batch_length;
+   unsigned long *jump_whitelist;
+   const void *batch_map;
+   void *shadow_map;
 };
 
 static int __eb_parse(struct dma_fence_work *work)
 {
struct eb_parse_work *pw = container_of(work, typeof(*pw), base);
+   int ret;
+   bool cookie;
 
-   return intel_engine_cmd_parser(pw->engine,
-  pw->batch,
-  pw->batch_offset,
-  pw->batch_length,
-  pw->shadow,
-  pw->trampoline);
+   cookie = dma_fence_begin_signalling();
+   ret = intel_engine_cmd_parser(pw->engine,
+ pw->batch,
+ pw->batch_offset,
+ pw->batch_length,
+ pw->shadow,
+ pw->jump_whitelist,
+ pw->shadow_map,
+ pw->batch_map);
+   dma_fence_end_signalling(cookie);
+
+   return ret;
 }
 
 static void __eb_parse_release(struct dma_fence_work *work)
 {
struct eb_parse_work *pw = container_of(work, typeof(*pw), base);
 
+   if (!IS_ERR_OR_NULL(pw->jump_whitelist))
+   kfree(pw->jump_whitelist);
+
+   if (pw->batch_map)
+   i915_gem_object_unpin_map(pw->batch->obj);
+   else
+   i915_gem_object_unpin_pages(pw->batch->obj);
+
+   i915_gem_object_unpin_map(pw->shadow->obj);
+
if (pw->trampoline)
i915_active_release(&pw->trampoline->active);
i915_active_release(&pw->shadow->active);
@@ -2336,6 +2358,8 @@ static int eb_parse_pipeline(struct i915_execbuffer *eb,
 struct i915_vma *trampoline)
 {
struct eb_parse_work *pw;
+   struct drm_i915_gem_object *batch = eb->batch->vma->obj;
+   bool needs_clflush;
int err;
 
GEM_BUG_ON(overflows_type(eb->batch_start_offset, pw->batch_offset));
@@ -2359,6 +2383,34 @@ static int eb_parse_pipeline(struct i915_execbuffer *eb,
goto err_shadow;
}
 
+   pw->shadow_map = i915_gem_object_pin_map(shadow->obj, 
I915_MAP_FORCE_WB);
+   if (IS_ERR(pw->shadow_map)) {
+   err = PTR_ERR(pw->shadow_map);
+   goto err_trampoline;
+   }
+
+   needs_clflush =
+   !(batch->cache_coherent & I915_BO_CACHE_COHERENT_FOR_READ);
+
+   pw->batch_map = ERR_PTR(-ENODEV);
+   if (needs_clflush && i915_has_memcpy_from_wc())
+   pw->batch_map = i915_gem_object_pin_map(batch, I915_MAP_WC);
+
+   if (IS_ERR(pw->batch_map)) {
+   err = i915_gem_object_pin_pages(batch);
+   if (err)
+   goto err_unmap_shadow;
+   pw->batch_map = NULL;
+   }
+
+   pw->jump_whitelist =
+   intel_engine_cmd_parser_alloc_jump_whitelist(eb->batch_len,
+  

[Intel-gfx] [PATCH 11/61] drm/i915: No longer allow exporting userptr through dma-buf

2020-10-02 Thread Maarten Lankhorst
It doesn't make sense to export a memory address, we will prevent
allowing access this way to different address spaces when we
rework userptr handling, so best to explicitly disable it.

Signed-off-by: Maarten Lankhorst 
---
 drivers/gpu/drm/i915/gem/i915_gem_userptr.c | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/i915/gem/i915_gem_userptr.c 
b/drivers/gpu/drm/i915/gem/i915_gem_userptr.c
index 136a589e5d94..9c1293c99d88 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_userptr.c
+++ b/drivers/gpu/drm/i915/gem/i915_gem_userptr.c
@@ -694,10 +694,9 @@ i915_gem_userptr_release(struct drm_i915_gem_object *obj)
 static int
 i915_gem_userptr_dmabuf_export(struct drm_i915_gem_object *obj)
 {
-   if (obj->userptr.mmu_object)
-   return 0;
+   drm_dbg(obj->base.dev, "Exporting userptr no longer allowed\n");
 
-   return i915_gem_userptr_init__mmu_notifier(obj, 0);
+   return -EINVAL;
 }
 
 static int
-- 
2.28.0

___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx


[Intel-gfx] [PATCH 08/61] drm/i915: Convert i915_gem_object_attach_phys() to ww locking

2020-10-02 Thread Maarten Lankhorst
Simple adding of i915_gem_object_lock, we may start to pass ww to
get_pages() in the future, but that won't be the case here;
We override shmem's get_pages() handling by calling
i915_gem_object_get_pages_phys(), no ww is needed.

Signed-off-by: Maarten Lankhorst 
---
 drivers/gpu/drm/i915/gem/i915_gem_phys.c | 10 +-
 1 file changed, 9 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/i915/gem/i915_gem_phys.c 
b/drivers/gpu/drm/i915/gem/i915_gem_phys.c
index 3960c1d9d415..153de6538378 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_phys.c
+++ b/drivers/gpu/drm/i915/gem/i915_gem_phys.c
@@ -182,7 +182,13 @@ int i915_gem_object_attach_phys(struct drm_i915_gem_object 
*obj, int align)
if (err)
return err;
 
-   mutex_lock_nested(&obj->mm.lock, I915_MM_GET_PAGES);
+   err = i915_gem_object_lock_interruptible(obj, NULL);
+   if (err)
+   return err;
+
+   err = mutex_lock_interruptible_nested(&obj->mm.lock, I915_MM_GET_PAGES);
+   if (err)
+   goto err_unlock;
 
if (unlikely(!i915_gem_object_has_struct_page(obj)))
goto out;
@@ -213,6 +219,8 @@ int i915_gem_object_attach_phys(struct drm_i915_gem_object 
*obj, int align)
 
 out:
mutex_unlock(&obj->mm.lock);
+err_unlock:
+   i915_gem_object_unlock(obj);
return err;
 }
 
-- 
2.28.0

___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx


[Intel-gfx] [PATCH 20/61] drm/i915: Rework clflush to work correctly without obj->mm.lock.

2020-10-02 Thread Maarten Lankhorst
Pin in the caller, not in the work itself. This should also
work better for dma-fence annotations.

Signed-off-by: Maarten Lankhorst 
---
 drivers/gpu/drm/i915/gem/i915_gem_clflush.c | 15 +++
 1 file changed, 7 insertions(+), 8 deletions(-)

diff --git a/drivers/gpu/drm/i915/gem/i915_gem_clflush.c 
b/drivers/gpu/drm/i915/gem/i915_gem_clflush.c
index bc0223716906..daf9284ef1f5 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_clflush.c
+++ b/drivers/gpu/drm/i915/gem/i915_gem_clflush.c
@@ -27,15 +27,8 @@ static void __do_clflush(struct drm_i915_gem_object *obj)
 static int clflush_work(struct dma_fence_work *base)
 {
struct clflush *clflush = container_of(base, typeof(*clflush), base);
-   struct drm_i915_gem_object *obj = clflush->obj;
-   int err;
 
-   err = i915_gem_object_pin_pages(obj);
-   if (err)
-   return err;
-
-   __do_clflush(obj);
-   i915_gem_object_unpin_pages(obj);
+   __do_clflush(clflush->obj);
 
return 0;
 }
@@ -44,6 +37,7 @@ static void clflush_release(struct dma_fence_work *base)
 {
struct clflush *clflush = container_of(base, typeof(*clflush), base);
 
+   i915_gem_object_unpin_pages(clflush->obj);
i915_gem_object_put(clflush->obj);
 }
 
@@ -63,6 +57,11 @@ static struct clflush *clflush_work_create(struct 
drm_i915_gem_object *obj)
if (!clflush)
return NULL;
 
+   if (__i915_gem_object_get_pages(obj) < 0) {
+   kfree(clflush);
+   return NULL;
+   }
+
dma_fence_work_init(&clflush->base, &clflush_ops);
clflush->obj = i915_gem_object_get(obj); /* obj <-> clflush cycle */
 
-- 
2.28.0

___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx


[Intel-gfx] [PATCH 45/61] drm/i915/selftests: Prepare execbuf tests for obj->mm.lock removal.

2020-10-02 Thread Maarten Lankhorst
Also quite simple, a single call needs to use the unlocked version.

Signed-off-by: Maarten Lankhorst 
---
 drivers/gpu/drm/i915/gem/selftests/i915_gem_execbuffer.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/i915/gem/selftests/i915_gem_execbuffer.c 
b/drivers/gpu/drm/i915/gem/selftests/i915_gem_execbuffer.c
index e1d50a5a1477..4df505e4c53a 100644
--- a/drivers/gpu/drm/i915/gem/selftests/i915_gem_execbuffer.c
+++ b/drivers/gpu/drm/i915/gem/selftests/i915_gem_execbuffer.c
@@ -116,7 +116,7 @@ static int igt_gpu_reloc(void *arg)
if (IS_ERR(scratch))
return PTR_ERR(scratch);
 
-   map = i915_gem_object_pin_map(scratch, I915_MAP_WC);
+   map = i915_gem_object_pin_map_unlocked(scratch, I915_MAP_WC);
if (IS_ERR(map)) {
err = PTR_ERR(map);
goto err_scratch;
-- 
2.28.0

___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx


[Intel-gfx] [PATCH 26/61] drm/i915: Make __engine_unpark() compatible with ww locking.

2020-10-02 Thread Maarten Lankhorst
Take the ww lock around engine_unpark. Because of the
many many places where rpm is used, I chose the safest option
and used a trylock to opportunistically take this lock for
__engine_unpark.

Signed-off-by: Maarten Lankhorst 
---
 drivers/gpu/drm/i915/gt/intel_engine_pm.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/i915/gt/intel_engine_pm.c 
b/drivers/gpu/drm/i915/gt/intel_engine_pm.c
index f7b2e07e2229..1ab9597a5c70 100644
--- a/drivers/gpu/drm/i915/gt/intel_engine_pm.c
+++ b/drivers/gpu/drm/i915/gt/intel_engine_pm.c
@@ -33,7 +33,8 @@ static int __engine_unpark(struct intel_wakeref *wf)
GEM_BUG_ON(test_bit(CONTEXT_VALID_BIT, &ce->flags));
 
/* First poison the image to verify we never fully trust it */
-   if (IS_ENABLED(CONFIG_DRM_I915_DEBUG_GEM) && ce->state) {
+   if (IS_ENABLED(CONFIG_DRM_I915_DEBUG_GEM) && ce->state &&
+   i915_gem_object_trylock(ce->state->obj)) {
struct drm_i915_gem_object *obj = ce->state->obj;
int type = i915_coherent_map_type(engine->i915);
void *map;
@@ -44,6 +45,7 @@ static int __engine_unpark(struct intel_wakeref *wf)
i915_gem_object_flush_map(obj);
i915_gem_object_unpin_map(obj);
}
+   i915_gem_object_unlock(obj);
}
 
ce->ops->reset(ce);
-- 
2.28.0

___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx


[Intel-gfx] [PATCH 02/61] drm/i915: Add missing -EDEADLK handling to execbuf pinning

2020-10-02 Thread Maarten Lankhorst
i915_vma_pin may fail with -EDEADLK when we start locking page tables,
so ensure we handle this correctly.

Signed-off-by: Maarten Lankhorst 
---
 .../gpu/drm/i915/gem/i915_gem_execbuffer.c| 23 +++
 1 file changed, 18 insertions(+), 5 deletions(-)

diff --git a/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c 
b/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c
index 63e2f16204da..2fbe6fbe043a 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c
+++ b/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c
@@ -419,13 +419,14 @@ static u64 eb_pin_flags(const struct 
drm_i915_gem_exec_object2 *entry,
return pin_flags;
 }
 
-static inline bool
+static inline int
 eb_pin_vma(struct i915_execbuffer *eb,
   const struct drm_i915_gem_exec_object2 *entry,
   struct eb_vma *ev)
 {
struct i915_vma *vma = ev->vma;
u64 pin_flags;
+   int err;
 
if (vma->node.size)
pin_flags = vma->node.start;
@@ -438,16 +439,24 @@ eb_pin_vma(struct i915_execbuffer *eb,
 
/* Attempt to reuse the current location if available */
/* TODO: Add -EDEADLK handling here */
-   if (unlikely(i915_vma_pin_ww(vma, &eb->ww, 0, 0, pin_flags))) {
+   err = i915_vma_pin_ww(vma, &eb->ww, 0, 0, pin_flags);
+   if (err == -EDEADLK)
+   return err;
+
+   if (unlikely(err)) {
if (entry->flags & EXEC_OBJECT_PINNED)
return false;
 
/* Failing that pick any _free_ space if suitable */
-   if (unlikely(i915_vma_pin_ww(vma, &eb->ww,
+   err = i915_vma_pin_ww(vma, &eb->ww,
 entry->pad_to_size,
 entry->alignment,
 eb_pin_flags(entry, ev->flags) |
-PIN_USER | PIN_NOEVICT)))
+PIN_USER | PIN_NOEVICT);
+   if (err == -EDEADLK)
+   return err;
+
+   if (unlikely(err))
return false;
}
 
@@ -896,7 +905,11 @@ static int eb_validate_vmas(struct i915_execbuffer *eb)
if (err)
return err;
 
-   if (eb_pin_vma(eb, entry, ev)) {
+   err = eb_pin_vma(eb, entry, ev);
+   if (err < 0)
+   return err;
+
+   if (err > 0) {
if (entry->offset != vma->node.start) {
entry->offset = vma->node.start | UPDATE;
eb->args->flags |= __EXEC_HAS_RELOC;
-- 
2.28.0

___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx


[Intel-gfx] [PATCH 33/61] drm/i915: Add ww locking around vm_access()

2020-10-02 Thread Maarten Lankhorst
i915_gem_object_pin_map potentially needs a ww context, so ensure we
have one we can revoke.

Signed-off-by: Maarten Lankhorst 
---
 drivers/gpu/drm/i915/gem/i915_gem_mman.c | 24 ++--
 1 file changed, 22 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/i915/gem/i915_gem_mman.c 
b/drivers/gpu/drm/i915/gem/i915_gem_mman.c
index ba8e9ef6943d..1361eabea966 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_mman.c
+++ b/drivers/gpu/drm/i915/gem/i915_gem_mman.c
@@ -421,7 +421,9 @@ vm_access(struct vm_area_struct *area, unsigned long addr,
 {
struct i915_mmap_offset *mmo = area->vm_private_data;
struct drm_i915_gem_object *obj = mmo->obj;
+   struct i915_gem_ww_ctx ww;
void *vaddr;
+   int err = 0;
 
if (i915_gem_object_is_readonly(obj) && write)
return -EACCES;
@@ -430,10 +432,18 @@ vm_access(struct vm_area_struct *area, unsigned long addr,
if (addr >= obj->base.size)
return -EINVAL;
 
+   i915_gem_ww_ctx_init(&ww, true);
+retry:
+   err = i915_gem_object_lock(obj, &ww);
+   if (err)
+   goto out;
+
/* As this is primarily for debugging, let's focus on simplicity */
vaddr = i915_gem_object_pin_map(obj, I915_MAP_FORCE_WC);
-   if (IS_ERR(vaddr))
-   return PTR_ERR(vaddr);
+   if (IS_ERR(vaddr)) {
+   err = PTR_ERR(vaddr);
+   goto out;
+   }
 
if (write) {
memcpy(vaddr + addr, buf, len);
@@ -443,6 +453,16 @@ vm_access(struct vm_area_struct *area, unsigned long addr,
}
 
i915_gem_object_unpin_map(obj);
+out:
+   if (err == -EDEADLK) {
+   err = i915_gem_ww_ctx_backoff(&ww);
+   if (!err)
+   goto retry;
+   }
+   i915_gem_ww_ctx_fini(&ww);
+
+   if (err)
+   return err;
 
return len;
 }
-- 
2.28.0

___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx


[Intel-gfx] [PATCH 00/61] drm/i915: Remove obj->mm.lock!

2020-10-02 Thread Maarten Lankhorst
Finally there, just needs a lot of fixes!

A lot of places were calling certain calls without any object lock held,
with the removal of mm.lock we can no longer do this, and have to fix it.

Phys page handling has to be redone, as nothing protects obj->ops structure,
we have to remove swapping it, and move HAS_STRUCT_PAGE to obj->flags instead.

Userpointer locking is inverted, which we tried to get around with a workqueue.
We correct the lock ordering and try to acquire userptr pages first before 
taking
any ww locks. This is more compatible with the locking hierarchy, as we may need
to acquire mmap_sem. This breaks gem_exec_schedule@pi-shared/distinct-iova, and
I don't know yet how to fix that test, or whether we should remove it.

We also have to fix some dma-work, the command parser and clflush are slightly
reworked to put all memory allocations and pinning in the preparation,
so the work could pass fence annotations.

In a few places like igt_spinner and execlists, we move some part of init to the
first pin, because we need to have the ww lock held and it makes it easier that 
way.

Finally we convert all selftests, and then remove obj->mm.lock!

Maarten Lankhorst (60):
  drm/i915: Move cmd parser pinning to execbuffer
  drm/i915: Add missing -EDEADLK handling to execbuf pinning
  drm/i915: Do not share hwsp across contexts any more, v2.
  drm/i915: Ensure we hold the object mutex in pin correctly.
  drm/i915: Add gem object locking to madvise.
  drm/i915: Move HAS_STRUCT_PAGE to obj->flags
  drm/i915: Rework struct phys attachment handling
  drm/i915: Convert i915_gem_object_attach_phys() to ww locking
  drm/i915: make lockdep slightly happier about execbuf.
  drm/i915: Disable userptr pread/pwrite support.
  drm/i915: No longer allow exporting userptr through dma-buf
  drm/i915: Reject more ioctls for userptr
  drm/i915: Reject UNSYNCHRONIZED for userptr
  drm/i915: Fix userptr so we do not have to worry about obj->mm.lock
  drm/i915: Flatten obj->mm.lock
  drm/i915: Pin timeline map after first timeline pin.
  drm/i915: Populate logical context during first pin.
  drm/i915: Make ring submission compatible with obj->mm.lock removal.
  drm/i915: Handle ww locking in init_status_page
  drm/i915: Rework clflush to work correctly without obj->mm.lock.
  drm/i915: Pass ww ctx to intel_pin_to_display_plane
  drm/i915: Add object locking to vm_fault_cpu
  drm/i915: Move pinning to inside engine_wa_list_verify()
  drm/i915: Take reservation lock around i915_vma_pin.
  drm/i915: Make intel_init_workaround_bb more compatible with ww
locking.
  drm/i915: Make __engine_unpark() compatible with ww locking.
  drm/i915: Take obj lock around set_domain ioctl
  drm/i915: Defer pin calls in buffer pool until first use by caller.
  drm/i915: Fix pread/pwrite to work with new locking rules.
  drm/i915: Fix workarounds selftest, part 1
  drm/i915: Add igt_spinner_pin() to allow for ww locking around
spinner.
  drm/i915: Add ww locking around vm_access()
  drm/i915: Increase ww locking for perf.
  drm/i915: Lock ww in ucode objects correctly
  drm/i915: Add ww locking to dma-buf ops.
  drm/i915: Add missing ww lock in intel_dsb_prepare.
  drm/i915: Fix ww locking in shmem_create_from_object
  drm/i915: Use a single page table lock for each gtt.
  drm/i915/selftests: Prepare huge_pages testcases for obj->mm.lock
removal.
  drm/i915/selftests: Prepare client blit for obj->mm.lock removal.
  drm/i915/selftests: Prepare coherency tests for obj->mm.lock removal.
  drm/i915/selftests: Prepare context tests for obj->mm.lock removal.
  drm/i915/selftests: Prepare dma-buf tests for obj->mm.lock removal.
  drm/i915/selftests: Prepare execbuf tests for obj->mm.lock removal.
  drm/i915/selftests: Prepare mman testcases for obj->mm.lock removal.
  drm/i915/selftests: Prepare object tests for obj->mm.lock removal.
  drm/i915/selftests: Prepare object blit tests for obj->mm.lock
removal.
  drm/i915/selftests: Prepare igt_gem_utils for obj->mm.lock removal
  drm/i915/selftests: Prepare context selftest for obj->mm.lock removal
  drm/i915/selftests: Prepare hangcheck for obj->mm.lock removal
  drm/i915/selftests: Prepare execlists for obj->mm.lock removal
  drm/i915/selftests: Prepare mocs tests for obj->mm.lock removal
  drm/i915/selftests: Prepare ring submission for obj->mm.lock removal
  drm/i915/selftests: Prepare timeline tests for obj->mm.lock removal
  drm/i915/selftests: Prepare i915_request tests for obj->mm.lock
removal
  drm/i915/selftests: Prepare memory region tests for obj->mm.lock
removal
  drm/i915/selftests: Prepare cs engine tests for obj->mm.lock removal
  drm/i915/selftests: Prepare gtt tests for obj->mm.lock removal
  drm/i915: Finally remove obj->mm.lock.
  drm/i915: Keep userpointer bindings if seqcount is unchanged

Thomas Hellström (1):
  drm/i915: Prepare for obj->mm.lock removal

 drivers/gpu/drm/i915/Makefile |   1 -
 drivers/gpu/drm/i915/display/intel_display.c  |  71 

[Intel-gfx] [PATCH 17/61] drm/i915: Populate logical context during first pin.

2020-10-02 Thread Maarten Lankhorst
This allows us to remove pin_map from state allocation, which saves
us a few retry loops. We won't need this until first pin, anyway.

Signed-off-by: Maarten Lankhorst 
---
 drivers/gpu/drm/i915/gt/intel_context_types.h |  13 ++-
 drivers/gpu/drm/i915/gt/intel_lrc.c   | 107 +-
 2 files changed, 62 insertions(+), 58 deletions(-)

diff --git a/drivers/gpu/drm/i915/gt/intel_context_types.h 
b/drivers/gpu/drm/i915/gt/intel_context_types.h
index 552cb57a2e8c..bebf52868563 100644
--- a/drivers/gpu/drm/i915/gt/intel_context_types.h
+++ b/drivers/gpu/drm/i915/gt/intel_context_types.h
@@ -64,12 +64,13 @@ struct intel_context {
unsigned long flags;
 #define CONTEXT_BARRIER_BIT0
 #define CONTEXT_ALLOC_BIT  1
-#define CONTEXT_VALID_BIT  2
-#define CONTEXT_CLOSED_BIT 3
-#define CONTEXT_USE_SEMAPHORES 4
-#define CONTEXT_BANNED 5
-#define CONTEXT_FORCE_SINGLE_SUBMISSION6
-#define CONTEXT_NOPREEMPT  7
+#define CONTEXT_INIT_BIT   2
+#define CONTEXT_VALID_BIT  3
+#define CONTEXT_CLOSED_BIT 4
+#define CONTEXT_USE_SEMAPHORES 5
+#define CONTEXT_BANNED 6
+#define CONTEXT_FORCE_SINGLE_SUBMISSION7
+#define CONTEXT_NOPREEMPT  8
 
u32 *lrc_reg_state;
union {
diff --git a/drivers/gpu/drm/i915/gt/intel_lrc.c 
b/drivers/gpu/drm/i915/gt/intel_lrc.c
index 287537089c77..39cb45ccb506 100644
--- a/drivers/gpu/drm/i915/gt/intel_lrc.c
+++ b/drivers/gpu/drm/i915/gt/intel_lrc.c
@@ -3525,9 +3525,39 @@ __execlists_update_reg_state(const struct intel_context 
*ce,
}
 }
 
+static void populate_lr_context(struct intel_context *ce,
+   struct intel_engine_cs *engine,
+   void *vaddr)
+{
+   bool inhibit = true;
+   struct drm_i915_gem_object *ctx_obj = ce->state->obj;
+
+   set_redzone(vaddr, engine);
+
+   if (engine->default_state) {
+   shmem_read(engine->default_state, 0,
+  vaddr, engine->context_size);
+   __set_bit(CONTEXT_VALID_BIT, &ce->flags);
+   inhibit = false;
+   }
+
+   /* Clear the ppHWSP (inc. per-context counters) */
+   memset(vaddr, 0, PAGE_SIZE);
+
+   /*
+* The second page of the context object contains some registers which
+* must be set up prior to the first execution.
+*/
+   execlists_init_reg_state(vaddr + LRC_STATE_OFFSET,
+ce, engine, ce->ring, inhibit);
+
+   __i915_gem_object_flush_map(ctx_obj, 0, engine->context_size);
+}
+
 static int
-execlists_context_pre_pin(struct intel_context *ce,
- struct i915_gem_ww_ctx *ww, void **vaddr)
+__execlists_context_pre_pin(struct intel_context *ce,
+   struct intel_engine_cs *engine,
+   struct i915_gem_ww_ctx *ww, void **vaddr)
 {
GEM_BUG_ON(!ce->state);
GEM_BUG_ON(!i915_vma_is_pinned(ce->state));
@@ -3535,8 +3565,20 @@ execlists_context_pre_pin(struct intel_context *ce,
*vaddr = i915_gem_object_pin_map(ce->state->obj,

i915_coherent_map_type(ce->engine->i915) |
I915_MAP_OVERRIDE);
+   if (IS_ERR(*vaddr))
+   return PTR_ERR(*vaddr);
+
+   if (!__test_and_set_bit(CONTEXT_INIT_BIT, &ce->flags))
+   populate_lr_context(ce, engine, *vaddr);
+
+   return 0;
+}
 
-   return PTR_ERR_OR_ZERO(*vaddr);
+static int
+execlists_context_pre_pin(struct intel_context *ce,
+ struct i915_gem_ww_ctx *ww, void **vaddr)
+{
+   return __execlists_context_pre_pin(ce, ce->engine, ww, vaddr);
 }
 
 static int
@@ -5331,45 +5373,6 @@ static void execlists_init_reg_state(u32 *regs,
__reset_stop_ring(regs, engine);
 }
 
-static int
-populate_lr_context(struct intel_context *ce,
-   struct drm_i915_gem_object *ctx_obj,
-   struct intel_engine_cs *engine,
-   struct intel_ring *ring)
-{
-   bool inhibit = true;
-   void *vaddr;
-
-   vaddr = i915_gem_object_pin_map(ctx_obj, I915_MAP_WB);
-   if (IS_ERR(vaddr)) {
-   drm_dbg(&engine->i915->drm, "Could not map object pages!\n");
-   return PTR_ERR(vaddr);
-   }
-
-   set_redzone(vaddr, engine);
-
-   if (engine->default_state) {
-   shmem_read(engine->default_state, 0,
-  vaddr, engine->context_size);
-   __set_bit(CONTEXT_VALID_BIT, &ce->flags);
-   inhibit = false;
-   }
-
-   /* Clear the ppHWSP (inc. per-context counters) */
-   memset(vaddr, 0, PAGE_SIZE);
-
-   /*
-* The second page of the context object contains some registers which
-* must be set up prior to the first execution.
-   

[Intel-gfx] [PATCH 46/61] drm/i915/selftests: Prepare mman testcases for obj->mm.lock removal.

2020-10-02 Thread Maarten Lankhorst
Ensure we hold the lock around put_pages, and use the unlocked wrappers
for pinning pages and mappings.

Signed-off-by: Maarten Lankhorst 
---
 drivers/gpu/drm/i915/gem/selftests/i915_gem_mman.c | 10 ++
 1 file changed, 6 insertions(+), 4 deletions(-)

diff --git a/drivers/gpu/drm/i915/gem/selftests/i915_gem_mman.c 
b/drivers/gpu/drm/i915/gem/selftests/i915_gem_mman.c
index 3ac7628f3bc4..85fff8bed08c 100644
--- a/drivers/gpu/drm/i915/gem/selftests/i915_gem_mman.c
+++ b/drivers/gpu/drm/i915/gem/selftests/i915_gem_mman.c
@@ -321,7 +321,7 @@ static int igt_partial_tiling(void *arg)
if (IS_ERR(obj))
return PTR_ERR(obj);
 
-   err = i915_gem_object_pin_pages(obj);
+   err = i915_gem_object_pin_pages_unlocked(obj);
if (err) {
pr_err("Failed to allocate %u pages (%lu total), err=%d\n",
   nreal, obj->base.size / PAGE_SIZE, err);
@@ -458,7 +458,7 @@ static int igt_smoke_tiling(void *arg)
if (IS_ERR(obj))
return PTR_ERR(obj);
 
-   err = i915_gem_object_pin_pages(obj);
+   err = i915_gem_object_pin_pages_unlocked(obj);
if (err) {
pr_err("Failed to allocate %u pages (%lu total), err=%d\n",
   nreal, obj->base.size / PAGE_SIZE, err);
@@ -797,7 +797,7 @@ static int wc_set(struct drm_i915_gem_object *obj)
 {
void *vaddr;
 
-   vaddr = i915_gem_object_pin_map(obj, I915_MAP_WC);
+   vaddr = i915_gem_object_pin_map_unlocked(obj, I915_MAP_WC);
if (IS_ERR(vaddr))
return PTR_ERR(vaddr);
 
@@ -813,7 +813,7 @@ static int wc_check(struct drm_i915_gem_object *obj)
void *vaddr;
int err = 0;
 
-   vaddr = i915_gem_object_pin_map(obj, I915_MAP_WC);
+   vaddr = i915_gem_object_pin_map_unlocked(obj, I915_MAP_WC);
if (IS_ERR(vaddr))
return PTR_ERR(vaddr);
 
@@ -1315,7 +1315,9 @@ static int __igt_mmap_revoke(struct drm_i915_private 
*i915,
}
 
if (type != I915_MMAP_TYPE_GTT) {
+   i915_gem_object_lock(obj, NULL);
__i915_gem_object_put_pages(obj);
+   i915_gem_object_unlock(obj);
if (i915_gem_object_has_pages(obj)) {
pr_err("Failed to put-pages object!\n");
err = -EINVAL;
-- 
2.28.0

___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx


[Intel-gfx] [PATCH 30/61] drm/i915: Fix workarounds selftest, part 1

2020-10-02 Thread Maarten Lankhorst
pin_map needs the ww lock, so ensure we pin both before submission.

Signed-off-by: Maarten Lankhorst 
---
 drivers/gpu/drm/i915/gem/i915_gem_object.h|  3 +
 drivers/gpu/drm/i915/gem/i915_gem_pages.c | 12 +++
 .../gpu/drm/i915/gt/selftest_workarounds.c| 76 ---
 3 files changed, 64 insertions(+), 27 deletions(-)

diff --git a/drivers/gpu/drm/i915/gem/i915_gem_object.h 
b/drivers/gpu/drm/i915/gem/i915_gem_object.h
index 107b98a82e44..80424ce49f26 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_object.h
+++ b/drivers/gpu/drm/i915/gem/i915_gem_object.h
@@ -372,6 +372,9 @@ enum i915_map_type {
 void *__must_check i915_gem_object_pin_map(struct drm_i915_gem_object *obj,
   enum i915_map_type type);
 
+void *__must_check i915_gem_object_pin_map_unlocked(struct drm_i915_gem_object 
*obj,
+   enum i915_map_type type);
+
 void __i915_gem_object_flush_map(struct drm_i915_gem_object *obj,
 unsigned long offset,
 unsigned long size);
diff --git a/drivers/gpu/drm/i915/gem/i915_gem_pages.c 
b/drivers/gpu/drm/i915/gem/i915_gem_pages.c
index 891bb32cfe3f..70d8e09a9188 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_pages.c
+++ b/drivers/gpu/drm/i915/gem/i915_gem_pages.c
@@ -405,6 +405,18 @@ void *i915_gem_object_pin_map(struct drm_i915_gem_object 
*obj,
goto out_unlock;
 }
 
+void *i915_gem_object_pin_map_unlocked(struct drm_i915_gem_object *obj,
+  enum i915_map_type type)
+{
+   void *ret;
+
+   i915_gem_object_lock(obj, NULL);
+   ret = i915_gem_object_pin_map(obj, type);
+   i915_gem_object_unlock(obj);
+
+   return ret;
+}
+
 void __i915_gem_object_flush_map(struct drm_i915_gem_object *obj,
 unsigned long offset,
 unsigned long size)
diff --git a/drivers/gpu/drm/i915/gt/selftest_workarounds.c 
b/drivers/gpu/drm/i915/gt/selftest_workarounds.c
index 810ab026a55e..69da2147ed3b 100644
--- a/drivers/gpu/drm/i915/gt/selftest_workarounds.c
+++ b/drivers/gpu/drm/i915/gt/selftest_workarounds.c
@@ -111,7 +111,7 @@ read_nonprivs(struct i915_gem_context *ctx, struct 
intel_engine_cs *engine)
 
i915_gem_object_set_cache_coherency(result, I915_CACHE_LLC);
 
-   cs = i915_gem_object_pin_map(result, I915_MAP_WB);
+   cs = i915_gem_object_pin_map_unlocked(result, I915_MAP_WB);
if (IS_ERR(cs)) {
err = PTR_ERR(cs);
goto err_obj;
@@ -217,7 +217,7 @@ static int check_whitelist(struct i915_gem_context *ctx,
i915_gem_object_lock(results, NULL);
intel_wedge_on_timeout(&wedge, engine->gt, HZ / 5) /* safety net! */
err = i915_gem_object_set_to_cpu_domain(results, false);
-   i915_gem_object_unlock(results);
+
if (intel_gt_is_wedged(engine->gt))
err = -EIO;
if (err)
@@ -245,6 +245,7 @@ static int check_whitelist(struct i915_gem_context *ctx,
 
i915_gem_object_unpin_map(results);
 out_put:
+   i915_gem_object_unlock(results);
i915_gem_object_put(results);
return err;
 }
@@ -520,6 +521,7 @@ static int check_dirty_whitelist(struct intel_context *ce)
 
for (i = 0; i < engine->whitelist.count; i++) {
u32 reg = i915_mmio_reg_offset(engine->whitelist.list[i].reg);
+   struct i915_gem_ww_ctx ww;
u64 addr = scratch->node.start;
struct i915_request *rq;
u32 srm, lrm, rsvd;
@@ -535,6 +537,29 @@ static int check_dirty_whitelist(struct intel_context *ce)
 
ro_reg = ro_register(reg);
 
+   i915_gem_ww_ctx_init(&ww, false);
+retry:
+   cs = NULL;
+   err = i915_gem_object_lock(scratch->obj, &ww);
+   if (!err)
+   err = i915_gem_object_lock(batch->obj, &ww);
+   if (!err)
+   err = intel_context_pin_ww(ce, &ww);
+   if (err)
+   goto out;
+
+   cs = i915_gem_object_pin_map(batch->obj, I915_MAP_WC);
+   if (IS_ERR(cs)) {
+   err = PTR_ERR(cs);
+   goto out_ctx;
+   }
+
+   results = i915_gem_object_pin_map(scratch->obj, I915_MAP_WB);
+   if (IS_ERR(results)) {
+   err = PTR_ERR(results);
+   goto out_unmap_batch;
+   }
+
/* Clear non priv flags */
reg &= RING_FORCE_TO_NONPRIV_ADDRESS_MASK;
 
@@ -546,12 +571,6 @@ static int check_dirty_whitelist(struct intel_context *ce)
pr_debug("%s: Writing garbage to %x\n",
 engine->name, reg);
 
-   cs = i915_gem_object_pin_map(batch->obj, I915_MAP_WC);
-   if (IS_ERR(cs)) {
-   err =

[Intel-gfx] [PATCH 58/61] drm/i915/selftests: Prepare cs engine tests for obj->mm.lock removal

2020-10-02 Thread Maarten Lankhorst
Same as other tests, use pin_map_unlocked.

Signed-off-by: Maarten Lankhorst 
---
 drivers/gpu/drm/i915/gt/selftest_engine_cs.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/i915/gt/selftest_engine_cs.c 
b/drivers/gpu/drm/i915/gt/selftest_engine_cs.c
index 729c3c7b11e2..853d1f02131a 100644
--- a/drivers/gpu/drm/i915/gt/selftest_engine_cs.c
+++ b/drivers/gpu/drm/i915/gt/selftest_engine_cs.c
@@ -72,7 +72,7 @@ static struct i915_vma *create_empty_batch(struct 
intel_context *ce)
if (IS_ERR(obj))
return ERR_CAST(obj);
 
-   cs = i915_gem_object_pin_map(obj, I915_MAP_WB);
+   cs = i915_gem_object_pin_map_unlocked(obj, I915_MAP_WB);
if (IS_ERR(cs)) {
err = PTR_ERR(cs);
goto err_put;
@@ -208,7 +208,7 @@ static struct i915_vma *create_nop_batch(struct 
intel_context *ce)
if (IS_ERR(obj))
return ERR_CAST(obj);
 
-   cs = i915_gem_object_pin_map(obj, I915_MAP_WB);
+   cs = i915_gem_object_pin_map_unlocked(obj, I915_MAP_WB);
if (IS_ERR(cs)) {
err = PTR_ERR(cs);
goto err_put;
-- 
2.28.0

___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx


[Intel-gfx] [PATCH 37/61] drm/i915: Add missing ww lock in intel_dsb_prepare.

2020-10-02 Thread Maarten Lankhorst
Because of the long lifetime of the mapping, we cannot wrap this in a
simple limited ww lock. Just use the unlocked version of pin_map,
because we'll likely release the mapping a lot later, in a different
thread.

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

diff --git a/drivers/gpu/drm/i915/display/intel_dsb.c 
b/drivers/gpu/drm/i915/display/intel_dsb.c
index 566fa72427b3..857126822a88 100644
--- a/drivers/gpu/drm/i915/display/intel_dsb.c
+++ b/drivers/gpu/drm/i915/display/intel_dsb.c
@@ -293,7 +293,7 @@ void intel_dsb_prepare(struct intel_crtc_state *crtc_state)
goto out;
}
 
-   buf = i915_gem_object_pin_map(vma->obj, I915_MAP_WC);
+   buf = i915_gem_object_pin_map_unlocked(vma->obj, I915_MAP_WC);
if (IS_ERR(buf)) {
drm_err(&i915->drm, "Command buffer creation failed\n");
i915_vma_unpin_and_release(&vma, I915_VMA_RELEASE_MAP);
-- 
2.28.0

___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx


[Intel-gfx] [PATCH 10/61] drm/i915: Disable userptr pread/pwrite support.

2020-10-02 Thread Maarten Lankhorst
Userptr should not need the kernel for a userspace memcpy, userspace
needs to call memcpy directly.

Signed-off-by: Maarten Lankhorst 
---
 .../gpu/drm/i915/gem/i915_gem_object_types.h  |  2 ++
 drivers/gpu/drm/i915/gem/i915_gem_userptr.c   | 20 +++
 drivers/gpu/drm/i915/i915_gem.c   |  5 +
 3 files changed, 27 insertions(+)

diff --git a/drivers/gpu/drm/i915/gem/i915_gem_object_types.h 
b/drivers/gpu/drm/i915/gem/i915_gem_object_types.h
index 62dde3585b51..dbb6f6171165 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_object_types.h
+++ b/drivers/gpu/drm/i915/gem/i915_gem_object_types.h
@@ -57,6 +57,8 @@ struct drm_i915_gem_object_ops {
 
int (*pwrite)(struct drm_i915_gem_object *obj,
  const struct drm_i915_gem_pwrite *arg);
+   int (*pread)(struct drm_i915_gem_object *obj,
+const struct drm_i915_gem_pread *arg);
 
int (*dmabuf_export)(struct drm_i915_gem_object *obj);
void (*release)(struct drm_i915_gem_object *obj);
diff --git a/drivers/gpu/drm/i915/gem/i915_gem_userptr.c 
b/drivers/gpu/drm/i915/gem/i915_gem_userptr.c
index 22008948be58..136a589e5d94 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_userptr.c
+++ b/drivers/gpu/drm/i915/gem/i915_gem_userptr.c
@@ -700,6 +700,24 @@ i915_gem_userptr_dmabuf_export(struct drm_i915_gem_object 
*obj)
return i915_gem_userptr_init__mmu_notifier(obj, 0);
 }
 
+static int
+i915_gem_userptr_pwrite(struct drm_i915_gem_object *obj,
+   const struct drm_i915_gem_pwrite *args)
+{
+   drm_dbg(obj->base.dev, "pwrite to userptr no longer allowed\n");
+
+   return -EINVAL;
+}
+
+static int
+i915_gem_userptr_pread(struct drm_i915_gem_object *obj,
+  const struct drm_i915_gem_pread *args)
+{
+   drm_dbg(obj->base.dev, "pread from userptr no longer allowed\n");
+
+   return -EINVAL;
+}
+
 static const struct drm_i915_gem_object_ops i915_gem_userptr_ops = {
.name = "i915_gem_object_userptr",
.flags = I915_GEM_OBJECT_IS_SHRINKABLE |
@@ -708,6 +726,8 @@ static const struct drm_i915_gem_object_ops 
i915_gem_userptr_ops = {
.get_pages = i915_gem_userptr_get_pages,
.put_pages = i915_gem_userptr_put_pages,
.dmabuf_export = i915_gem_userptr_dmabuf_export,
+   .pwrite = i915_gem_userptr_pwrite,
+   .pread = i915_gem_userptr_pread,
.release = i915_gem_userptr_release,
 };
 
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
index 30af7e4b71ab..d349c0b796ec 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -526,6 +526,11 @@ i915_gem_pread_ioctl(struct drm_device *dev, void *data,
}
 
trace_i915_gem_object_pread(obj, args->offset, args->size);
+   ret = -ENODEV;
+   if (obj->ops->pread)
+   ret = obj->ops->pread(obj, args);
+   if (ret != -ENODEV)
+   goto out;
 
ret = i915_gem_object_wait(obj,
   I915_WAIT_INTERRUPTIBLE,
-- 
2.28.0

___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx


[Intel-gfx] [PATCH 40/61] drm/i915/selftests: Prepare huge_pages testcases for obj->mm.lock removal.

2020-10-02 Thread Maarten Lankhorst
Straightforward conversion, just convert a bunch of calls to
unlocked versions.

Signed-off-by: Maarten Lankhorst 
---
 .../gpu/drm/i915/gem/selftests/huge_pages.c   | 28 ++-
 1 file changed, 21 insertions(+), 7 deletions(-)

diff --git a/drivers/gpu/drm/i915/gem/selftests/huge_pages.c 
b/drivers/gpu/drm/i915/gem/selftests/huge_pages.c
index a7d5f7785f32..34f248c205ca 100644
--- a/drivers/gpu/drm/i915/gem/selftests/huge_pages.c
+++ b/drivers/gpu/drm/i915/gem/selftests/huge_pages.c
@@ -568,7 +568,7 @@ static int igt_mock_ppgtt_misaligned_dma(void *arg)
goto out_put;
}
 
-   err = i915_gem_object_pin_pages(obj);
+   err = i915_gem_object_pin_pages_unlocked(obj);
if (err)
goto out_put;
 
@@ -632,15 +632,19 @@ static int igt_mock_ppgtt_misaligned_dma(void *arg)
break;
}
 
+   i915_gem_object_lock(obj, NULL);
i915_gem_object_unpin_pages(obj);
__i915_gem_object_put_pages(obj);
+   i915_gem_object_unlock(obj);
i915_gem_object_put(obj);
}
 
return 0;
 
 out_unpin:
+   i915_gem_object_lock(obj, NULL);
i915_gem_object_unpin_pages(obj);
+   i915_gem_object_unlock(obj);
 out_put:
i915_gem_object_put(obj);
 
@@ -654,8 +658,10 @@ static void close_object_list(struct list_head *objects,
 
list_for_each_entry_safe(obj, on, objects, st_link) {
list_del(&obj->st_link);
+   i915_gem_object_lock(obj, NULL);
i915_gem_object_unpin_pages(obj);
__i915_gem_object_put_pages(obj);
+   i915_gem_object_unlock(obj);
i915_gem_object_put(obj);
}
 }
@@ -692,7 +698,7 @@ static int igt_mock_ppgtt_huge_fill(void *arg)
break;
}
 
-   err = i915_gem_object_pin_pages(obj);
+   err = i915_gem_object_pin_pages_unlocked(obj);
if (err) {
i915_gem_object_put(obj);
break;
@@ -868,7 +874,7 @@ static int igt_mock_ppgtt_64K(void *arg)
if (IS_ERR(obj))
return PTR_ERR(obj);
 
-   err = i915_gem_object_pin_pages(obj);
+   err = i915_gem_object_pin_pages_unlocked(obj);
if (err)
goto out_object_put;
 
@@ -922,8 +928,10 @@ static int igt_mock_ppgtt_64K(void *arg)
}
 
i915_vma_unpin(vma);
+   i915_gem_object_lock(obj, NULL);
i915_gem_object_unpin_pages(obj);
__i915_gem_object_put_pages(obj);
+   i915_gem_object_unlock(obj);
i915_gem_object_put(obj);
}
}
@@ -933,7 +941,9 @@ static int igt_mock_ppgtt_64K(void *arg)
 out_vma_unpin:
i915_vma_unpin(vma);
 out_object_unpin:
+   i915_gem_object_lock(obj, NULL);
i915_gem_object_unpin_pages(obj);
+   i915_gem_object_unlock(obj);
 out_object_put:
i915_gem_object_put(obj);
 
@@ -1003,7 +1013,7 @@ static int __cpu_check_vmap(struct drm_i915_gem_object 
*obj, u32 dword, u32 val)
if (err)
return err;
 
-   ptr = i915_gem_object_pin_map(obj, I915_MAP_WC);
+   ptr = i915_gem_object_pin_map_unlocked(obj, I915_MAP_WC);
if (IS_ERR(ptr))
return PTR_ERR(ptr);
 
@@ -1283,7 +1293,7 @@ static int igt_ppgtt_smoke_huge(void *arg)
return err;
}
 
-   err = i915_gem_object_pin_pages(obj);
+   err = i915_gem_object_pin_pages_unlocked(obj);
if (err) {
if (err == -ENXIO || err == -E2BIG) {
i915_gem_object_put(obj);
@@ -1306,8 +1316,10 @@ static int igt_ppgtt_smoke_huge(void *arg)
   __func__, size, i);
}
 out_unpin:
+   i915_gem_object_lock(obj, NULL);
i915_gem_object_unpin_pages(obj);
__i915_gem_object_put_pages(obj);
+   i915_gem_object_unlock(obj);
 out_put:
i915_gem_object_put(obj);
 
@@ -1380,7 +1392,7 @@ static int igt_ppgtt_sanity_check(void *arg)
return err;
}
 
-   err = i915_gem_object_pin_pages(obj);
+   err = i915_gem_object_pin_pages_unlocked(obj);
if (err) {
i915_gem_object_put(obj);
goto out;
@@ -1394,8 +1406,10 @@ static int igt_ppgtt_sanity_check(void *arg)
 
err = igt_write_huge(ctx, obj);
 
+   i915_gem_object_lock(obj, NULL);
  

[Intel-gfx] [PATCH 36/61] drm/i915: Add ww locking to dma-buf ops.

2020-10-02 Thread Maarten Lankhorst
vmap is using pin_pages, but needs to use ww locking,
add pin_pages_unlocked to correctly lock the mapping.

Also add ww locking to begin/end cpu access.

Signed-off-by: Maarten Lankhorst 
---
 drivers/gpu/drm/i915/gem/i915_gem_dmabuf.c | 60 --
 1 file changed, 33 insertions(+), 27 deletions(-)

diff --git a/drivers/gpu/drm/i915/gem/i915_gem_dmabuf.c 
b/drivers/gpu/drm/i915/gem/i915_gem_dmabuf.c
index 131ec53d8521..dfd483147b73 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_dmabuf.c
+++ b/drivers/gpu/drm/i915/gem/i915_gem_dmabuf.c
@@ -82,7 +82,7 @@ static int i915_gem_dmabuf_vmap(struct dma_buf *dma_buf, 
struct dma_buf_map *map
struct drm_i915_gem_object *obj = dma_buf_to_obj(dma_buf);
void *vaddr;
 
-   vaddr = i915_gem_object_pin_map(obj, I915_MAP_WB);
+   vaddr = i915_gem_object_pin_map_unlocked(obj, I915_MAP_WB);
if (IS_ERR(vaddr))
return PTR_ERR(vaddr);
 
@@ -124,42 +124,48 @@ static int i915_gem_begin_cpu_access(struct dma_buf 
*dma_buf, enum dma_data_dire
 {
struct drm_i915_gem_object *obj = dma_buf_to_obj(dma_buf);
bool write = (direction == DMA_BIDIRECTIONAL || direction == 
DMA_TO_DEVICE);
+   struct i915_gem_ww_ctx ww;
int err;
 
-   err = i915_gem_object_pin_pages(obj);
-   if (err)
-   return err;
-
-   err = i915_gem_object_lock_interruptible(obj, NULL);
-   if (err)
-   goto out;
-
-   err = i915_gem_object_set_to_cpu_domain(obj, write);
-   i915_gem_object_unlock(obj);
-
-out:
-   i915_gem_object_unpin_pages(obj);
+   i915_gem_ww_ctx_init(&ww, true);
+retry:
+   err = i915_gem_object_lock(obj, &ww);
+   if (!err)
+   err = i915_gem_object_pin_pages(obj);
+   if (!err) {
+   err = i915_gem_object_set_to_cpu_domain(obj, write);
+   i915_gem_object_unpin_pages(obj);
+   }
+   if (err == -EDEADLK) {
+   err = i915_gem_ww_ctx_backoff(&ww);
+   if (!err)
+   goto retry;
+   }
+   i915_gem_ww_ctx_fini(&ww);
return err;
 }
 
 static int i915_gem_end_cpu_access(struct dma_buf *dma_buf, enum 
dma_data_direction direction)
 {
struct drm_i915_gem_object *obj = dma_buf_to_obj(dma_buf);
+   struct i915_gem_ww_ctx ww;
int err;
 
-   err = i915_gem_object_pin_pages(obj);
-   if (err)
-   return err;
-
-   err = i915_gem_object_lock_interruptible(obj, NULL);
-   if (err)
-   goto out;
-
-   err = i915_gem_object_set_to_gtt_domain(obj, false);
-   i915_gem_object_unlock(obj);
-
-out:
-   i915_gem_object_unpin_pages(obj);
+   i915_gem_ww_ctx_init(&ww, true);
+retry:
+   err = i915_gem_object_lock(obj, &ww);
+   if (!err)
+   err = i915_gem_object_pin_pages(obj);
+   if (!err) {
+   err = i915_gem_object_set_to_gtt_domain(obj, false);
+   i915_gem_object_unpin_pages(obj);
+   }
+   if (err == -EDEADLK) {
+   err = i915_gem_ww_ctx_backoff(&ww);
+   if (!err)
+   goto retry;
+   }
+   i915_gem_ww_ctx_fini(&ww);
return err;
 }
 
-- 
2.28.0

___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx


[Intel-gfx] [PATCH 06/61] drm/i915: Move HAS_STRUCT_PAGE to obj->flags

2020-10-02 Thread Maarten Lankhorst
We want to remove the changing of ops structure for attaching
phys pages, so we need to kill off HAS_STRUCT_PAGE from ops->flags,
and put it in the bo.

This will remove a potential race of dereferencing the wrong obj->ops
without ww mutex held.

Signed-off-by: Maarten Lankhorst 
---
 drivers/gpu/drm/i915/gem/i915_gem_dmabuf.c   |  2 +-
 drivers/gpu/drm/i915/gem/i915_gem_internal.c |  6 +++---
 drivers/gpu/drm/i915/gem/i915_gem_lmem.c |  4 ++--
 drivers/gpu/drm/i915/gem/i915_gem_mman.c |  7 +++
 drivers/gpu/drm/i915/gem/i915_gem_object.c   |  4 +++-
 drivers/gpu/drm/i915/gem/i915_gem_object.h   |  5 +++--
 drivers/gpu/drm/i915/gem/i915_gem_object_types.h |  8 +---
 drivers/gpu/drm/i915/gem/i915_gem_pages.c|  5 ++---
 drivers/gpu/drm/i915/gem/i915_gem_phys.c |  2 ++
 drivers/gpu/drm/i915/gem/i915_gem_region.c   |  4 +---
 drivers/gpu/drm/i915/gem/i915_gem_region.h   |  3 +--
 drivers/gpu/drm/i915/gem/i915_gem_shmem.c|  8 
 drivers/gpu/drm/i915/gem/i915_gem_stolen.c   |  4 ++--
 drivers/gpu/drm/i915/gem/i915_gem_userptr.c  |  6 +++---
 drivers/gpu/drm/i915/gem/selftests/huge_gem_object.c |  4 ++--
 drivers/gpu/drm/i915/gem/selftests/huge_pages.c  | 10 +-
 drivers/gpu/drm/i915/gem/selftests/i915_gem_mman.c   | 11 ---
 drivers/gpu/drm/i915/gem/selftests/i915_gem_phys.c   | 12 
 drivers/gpu/drm/i915/gvt/dmabuf.c|  2 +-
 drivers/gpu/drm/i915/selftests/i915_gem_gtt.c|  2 +-
 drivers/gpu/drm/i915/selftests/mock_region.c |  4 ++--
 21 files changed, 62 insertions(+), 51 deletions(-)

diff --git a/drivers/gpu/drm/i915/gem/i915_gem_dmabuf.c 
b/drivers/gpu/drm/i915/gem/i915_gem_dmabuf.c
index 0dd477e56573..131ec53d8521 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_dmabuf.c
+++ b/drivers/gpu/drm/i915/gem/i915_gem_dmabuf.c
@@ -259,7 +259,7 @@ struct drm_gem_object *i915_gem_prime_import(struct 
drm_device *dev,
}
 
drm_gem_private_object_init(dev, &obj->base, dma_buf->size);
-   i915_gem_object_init(obj, &i915_gem_object_dmabuf_ops, &lock_class);
+   i915_gem_object_init(obj, &i915_gem_object_dmabuf_ops, &lock_class, 0);
obj->base.import_attach = attach;
obj->base.resv = dma_buf->resv;
 
diff --git a/drivers/gpu/drm/i915/gem/i915_gem_internal.c 
b/drivers/gpu/drm/i915/gem/i915_gem_internal.c
index ad22f42541bd..21cc40897ca8 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_internal.c
+++ b/drivers/gpu/drm/i915/gem/i915_gem_internal.c
@@ -138,8 +138,7 @@ static void i915_gem_object_put_pages_internal(struct 
drm_i915_gem_object *obj,
 
 static const struct drm_i915_gem_object_ops i915_gem_object_internal_ops = {
.name = "i915_gem_object_internal",
-   .flags = I915_GEM_OBJECT_HAS_STRUCT_PAGE |
-I915_GEM_OBJECT_IS_SHRINKABLE,
+   .flags = I915_GEM_OBJECT_IS_SHRINKABLE,
.get_pages = i915_gem_object_get_pages_internal,
.put_pages = i915_gem_object_put_pages_internal,
 };
@@ -178,7 +177,8 @@ i915_gem_object_create_internal(struct drm_i915_private 
*i915,
return ERR_PTR(-ENOMEM);
 
drm_gem_private_object_init(&i915->drm, &obj->base, size);
-   i915_gem_object_init(obj, &i915_gem_object_internal_ops, &lock_class);
+   i915_gem_object_init(obj, &i915_gem_object_internal_ops, &lock_class,
+I915_BO_ALLOC_STRUCT_PAGE);
 
/*
 * Mark the object as volatile, such that the pages are marked as
diff --git a/drivers/gpu/drm/i915/gem/i915_gem_lmem.c 
b/drivers/gpu/drm/i915/gem/i915_gem_lmem.c
index 932ee21e6609..e953965f8263 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_lmem.c
+++ b/drivers/gpu/drm/i915/gem/i915_gem_lmem.c
@@ -45,13 +45,13 @@ __i915_gem_lmem_object_create(struct intel_memory_region 
*mem,
return ERR_PTR(-ENOMEM);
 
drm_gem_private_object_init(&i915->drm, &obj->base, size);
-   i915_gem_object_init(obj, &i915_gem_lmem_obj_ops, &lock_class);
+   i915_gem_object_init(obj, &i915_gem_lmem_obj_ops, &lock_class, flags);
 
obj->read_domains = I915_GEM_DOMAIN_WC | I915_GEM_DOMAIN_GTT;
 
i915_gem_object_set_cache_coherency(obj, I915_CACHE_NONE);
 
-   i915_gem_object_init_memory_region(obj, mem, flags);
+   i915_gem_object_init_memory_region(obj, mem);
 
return obj;
 }
diff --git a/drivers/gpu/drm/i915/gem/i915_gem_mman.c 
b/drivers/gpu/drm/i915/gem/i915_gem_mman.c
index 3d69e51f3e4d..5aa037ca3a41 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_mman.c
+++ b/drivers/gpu/drm/i915/gem/i915_gem_mman.c
@@ -251,7 +251,7 @@ static vm_fault_t vm_fault_cpu(struct vm_fault *vmf)
goto out;
 
iomap = -1;
-   if (!i915_gem_object_type_has(obj, I915_GEM_OBJECT_HAS_STRUCT_PAGE)) {
+   if (!i915_gem_object_has_struct_page(obj)) {
iomap = obj->mm.region->iomap.base;
 

[Intel-gfx] [PATCH 34/61] drm/i915: Increase ww locking for perf.

2020-10-02 Thread Maarten Lankhorst
We need to lock a few more objects, some temporarily,
add ww lock where needed.

Signed-off-by: Maarten Lankhorst 
---
 drivers/gpu/drm/i915/i915_perf.c | 56 
 1 file changed, 43 insertions(+), 13 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_perf.c b/drivers/gpu/drm/i915/i915_perf.c
index e94976976571..281af1fdf514 100644
--- a/drivers/gpu/drm/i915/i915_perf.c
+++ b/drivers/gpu/drm/i915/i915_perf.c
@@ -1579,7 +1579,7 @@ static int alloc_oa_buffer(struct i915_perf_stream 
*stream)
stream->oa_buffer.vma = vma;
 
stream->oa_buffer.vaddr =
-   i915_gem_object_pin_map(bo, I915_MAP_WB);
+   i915_gem_object_pin_map_unlocked(bo, I915_MAP_WB);
if (IS_ERR(stream->oa_buffer.vaddr)) {
ret = PTR_ERR(stream->oa_buffer.vaddr);
goto err_unpin;
@@ -1632,6 +1632,7 @@ static int alloc_noa_wait(struct i915_perf_stream *stream)
const u32 base = stream->engine->mmio_base;
 #define CS_GPR(x) GEN8_RING_CS_GPR(base, x)
u32 *batch, *ts0, *cs, *jump;
+   struct i915_gem_ww_ctx ww;
int ret, i;
enum {
START_TS,
@@ -1649,15 +1650,21 @@ static int alloc_noa_wait(struct i915_perf_stream 
*stream)
return PTR_ERR(bo);
}
 
+   i915_gem_ww_ctx_init(&ww, true);
+retry:
+   ret = i915_gem_object_lock(bo, &ww);
+   if (ret)
+   goto out_ww;
+
/*
 * We pin in GGTT because we jump into this buffer now because
 * multiple OA config BOs will have a jump to this address and it
 * needs to be fixed during the lifetime of the i915/perf stream.
 */
-   vma = i915_gem_object_ggtt_pin(bo, NULL, 0, 0, PIN_HIGH);
+   vma = i915_gem_object_ggtt_pin_ww(bo, &ww, NULL, 0, 0, PIN_HIGH);
if (IS_ERR(vma)) {
ret = PTR_ERR(vma);
-   goto err_unref;
+   goto out_ww;
}
 
batch = cs = i915_gem_object_pin_map(bo, I915_MAP_WB);
@@ -1791,12 +1798,19 @@ static int alloc_noa_wait(struct i915_perf_stream 
*stream)
__i915_gem_object_release_map(bo);
 
stream->noa_wait = vma;
-   return 0;
+   goto out_ww;
 
 err_unpin:
i915_vma_unpin_and_release(&vma, 0);
-err_unref:
-   i915_gem_object_put(bo);
+out_ww:
+   if (ret == -EDEADLK) {
+   ret = i915_gem_ww_ctx_backoff(&ww);
+   if (!ret)
+   goto retry;
+   }
+   i915_gem_ww_ctx_fini(&ww);
+   if (ret)
+   i915_gem_object_put(bo);
return ret;
 }
 
@@ -1839,6 +1853,7 @@ alloc_oa_config_buffer(struct i915_perf_stream *stream,
 {
struct drm_i915_gem_object *obj;
struct i915_oa_config_bo *oa_bo;
+   struct i915_gem_ww_ctx ww;
size_t config_length = 0;
u32 *cs;
int err;
@@ -1859,10 +1874,16 @@ alloc_oa_config_buffer(struct i915_perf_stream *stream,
goto err_free;
}
 
+   i915_gem_ww_ctx_init(&ww, true);
+retry:
+   err = i915_gem_object_lock(obj, &ww);
+   if (err)
+   goto out_ww;
+
cs = i915_gem_object_pin_map(obj, I915_MAP_WB);
if (IS_ERR(cs)) {
err = PTR_ERR(cs);
-   goto err_oa_bo;
+   goto out_ww;
}
 
cs = write_cs_mi_lri(cs,
@@ -1890,19 +1911,28 @@ alloc_oa_config_buffer(struct i915_perf_stream *stream,
   NULL);
if (IS_ERR(oa_bo->vma)) {
err = PTR_ERR(oa_bo->vma);
-   goto err_oa_bo;
+   goto out_ww;
}
 
oa_bo->oa_config = i915_oa_config_get(oa_config);
llist_add(&oa_bo->node, &stream->oa_config_bos);
 
-   return oa_bo;
+out_ww:
+   if (err == -EDEADLK) {
+   err = i915_gem_ww_ctx_backoff(&ww);
+   if (!err)
+   goto retry;
+   }
+   i915_gem_ww_ctx_fini(&ww);
 
-err_oa_bo:
-   i915_gem_object_put(obj);
+   if (err)
+   i915_gem_object_put(obj);
 err_free:
-   kfree(oa_bo);
-   return ERR_PTR(err);
+   if (err) {
+   kfree(oa_bo);
+   return ERR_PTR(err);
+   }
+   return oa_bo;
 }
 
 static struct i915_vma *
-- 
2.28.0

___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx


  1   2   >