Message ID | 20210418002126.87882-1-jose.souza@intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [1/5] drm/i915/display: Fill PSR state during hardware configuration read out | expand |
On Sat, Apr 17, 2021 at 05:21:22PM -0700, José Roberto de Souza wrote: > So far if we had a mismatch between the state asked and what was > programmed in hardware for PSR, this mismatch would go unnoticed. > > So here adding the PSR to the hardware configuration readout, > EDP_PSR_CTL and EDP_PSR2_CTL can't be directly read because its state > flips due to other factors like frontbuffer modifications and CRC. > Minor nit-pick below with that fixed Reviewed-by: Radhakrishna Sripada <radhakrishna.sripada@intel.com> > Cc: Gwan-gyeong Mun <gwan-gyeong.mun@intel.com> > Signed-off-by: José Roberto de Souza <jose.souza@intel.com> > --- > drivers/gpu/drm/i915/display/intel_ddi.c | 2 + > drivers/gpu/drm/i915/display/intel_display.c | 5 +++ > drivers/gpu/drm/i915/display/intel_psr.c | 47 ++++++++++++++++++++ > drivers/gpu/drm/i915/display/intel_psr.h | 3 ++ > 4 files changed, 57 insertions(+) > > diff --git a/drivers/gpu/drm/i915/display/intel_ddi.c b/drivers/gpu/drm/i915/display/intel_ddi.c > index 4ef573883412..f69ed3c4c30a 100644 > --- a/drivers/gpu/drm/i915/display/intel_ddi.c > +++ b/drivers/gpu/drm/i915/display/intel_ddi.c > @@ -3707,6 +3707,8 @@ static void intel_ddi_get_config(struct intel_encoder *encoder, > > intel_read_dp_sdp(encoder, pipe_config, HDMI_PACKET_TYPE_GAMUT_METADATA); > intel_read_dp_sdp(encoder, pipe_config, DP_SDP_VSC); > + > + intel_psr_get_config(encoder, pipe_config); > } > > void intel_ddi_get_clock(struct intel_encoder *encoder, > diff --git a/drivers/gpu/drm/i915/display/intel_display.c b/drivers/gpu/drm/i915/display/intel_display.c > index 9c13d0ac022b..ecdca523e364 100644 > --- a/drivers/gpu/drm/i915/display/intel_display.c > +++ b/drivers/gpu/drm/i915/display/intel_display.c > @@ -8350,6 +8350,11 @@ intel_pipe_config_compare(const struct intel_crtc_state *current_config, > PIPE_CONF_CHECK_I(vrr.flipline); > PIPE_CONF_CHECK_I(vrr.pipeline_full); > > + PIPE_CONF_CHECK_BOOL(has_psr); > + PIPE_CONF_CHECK_BOOL(has_psr2); > + PIPE_CONF_CHECK_BOOL(enable_psr2_sel_fetch); > + PIPE_CONF_CHECK_I(dc3co_exitline); > + > #undef PIPE_CONF_CHECK_X > #undef PIPE_CONF_CHECK_I > #undef PIPE_CONF_CHECK_BOOL > diff --git a/drivers/gpu/drm/i915/display/intel_psr.c b/drivers/gpu/drm/i915/display/intel_psr.c > index 4ad756e238c5..bd7997a3ef7c 100644 > --- a/drivers/gpu/drm/i915/display/intel_psr.c > +++ b/drivers/gpu/drm/i915/display/intel_psr.c > @@ -886,6 +886,53 @@ void intel_psr_compute_config(struct intel_dp *intel_dp, > crtc_state->infoframes.enable |= intel_hdmi_infoframe_enable(DP_SDP_VSC); > } > > +void intel_psr_get_config(struct intel_encoder *encoder, > + struct intel_crtc_state *pipe_config) > +{ > + struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); > + struct intel_digital_port *dig_port = enc_to_dig_port(encoder); > + struct intel_dp *intel_dp; > + u32 val; > + > + if (!dig_port) > + return; > + > + intel_dp = &dig_port->dp; > + if (!CAN_PSR(intel_dp)) > + return; > + > + mutex_lock(&intel_dp->psr.lock); > + if (!intel_dp->psr.enabled) { goto unlock: should suffice here instead of unlock and return. -RK > + mutex_unlock(&intel_dp->psr.lock); > + return; > + } > + > + /* > + * Not possible to read EDP_PSR/PSR2_CTL registers as it is > + * enabled/disabled because of frontbuffer tracking and others. > + */ > + pipe_config->has_psr = true; > + pipe_config->has_psr2 = intel_dp->psr.psr2_enabled; > + pipe_config->infoframes.enable |= intel_hdmi_infoframe_enable(DP_SDP_VSC); > + > + if (!intel_dp->psr.psr2_enabled) > + goto unlock; > + > + if (HAS_PSR2_SEL_FETCH(dev_priv)) { > + val = intel_de_read(dev_priv, PSR2_MAN_TRK_CTL(intel_dp->psr.transcoder)); > + if (val & PSR2_MAN_TRK_CTL_ENABLE) > + pipe_config->enable_psr2_sel_fetch = true; > + } > + > + if (DISPLAY_VER(dev_priv) >= 12) { > + val = intel_de_read(dev_priv, EXITLINE(intel_dp->psr.transcoder)); > + val &= EXITLINE_MASK; > + pipe_config->dc3co_exitline = val; > + } > +unlock: > + mutex_unlock(&intel_dp->psr.lock); > +} > + > static void intel_psr_activate(struct intel_dp *intel_dp) > { > struct drm_i915_private *dev_priv = dp_to_i915(intel_dp); > diff --git a/drivers/gpu/drm/i915/display/intel_psr.h b/drivers/gpu/drm/i915/display/intel_psr.h > index 0491a49ffd50..e3db85e97f4c 100644 > --- a/drivers/gpu/drm/i915/display/intel_psr.h > +++ b/drivers/gpu/drm/i915/display/intel_psr.h > @@ -17,6 +17,7 @@ struct intel_crtc; > struct intel_atomic_state; > struct intel_plane_state; > struct intel_plane; > +struct intel_encoder; > > void intel_psr_init_dpcd(struct intel_dp *intel_dp); > void intel_psr_enable(struct intel_dp *intel_dp, > @@ -37,6 +38,8 @@ void intel_psr_flush(struct drm_i915_private *dev_priv, > void intel_psr_init(struct intel_dp *intel_dp); > void intel_psr_compute_config(struct intel_dp *intel_dp, > struct intel_crtc_state *crtc_state); > +void intel_psr_get_config(struct intel_encoder *encoder, > + struct intel_crtc_state *pipe_config); > void intel_psr_irq_handler(struct intel_dp *intel_dp, u32 psr_iir); > void intel_psr_short_pulse(struct intel_dp *intel_dp); > void intel_psr_wait_for_idle(const struct intel_crtc_state *new_crtc_state); > -- > 2.31.1 > > _______________________________________________ > Intel-gfx mailing list > Intel-gfx@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/intel-gfx
On Sun, 2021-04-18 at 03:00 +0000, Patchwork wrote: Patch Details Series: series starting with [1/5] drm/i915/display: Fill PSR state during hardware configuration read out URL: https://patchwork.freedesktop.org/series/89204/ State: success Details: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_19945/index.html CI Bug Log - changes from CI_DRM_9979_full -> Patchwork_19945_full Summary SUCCESS No regressions found. Thanks for the review RK, patches pushed. Known issues Here are the changes found in Patchwork_19945_full that come from known issues: IGT changes Issues hit * igt@gem_ctx_persistence@legacy-engines-hang@blt: * shard-skl: NOTRUN -> SKIP<https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_19945/shard-skl1/igt@gem_ctx_persistence@legacy-engines-hang@blt.html> (fdo#109271<https://bugs.freedesktop.org/show_bug.cgi?id=109271>) +53 similar issues * igt@gem_ctx_persistence@legacy-engines-mixed-process: * shard-snb: NOTRUN -> SKIP<https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_19945/shard-snb7/igt@gem_ctx_persistence@legacy-engines-mixed-process.html> (fdo#109271<https://bugs.freedesktop.org/show_bug.cgi?id=109271> / i915#1099<https://gitlab.freedesktop.org/drm/intel/issues/1099>) +4 similar issues * igt@gem_eio@unwedge-stress: * shard-snb: NOTRUN -> FAIL<https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_19945/shard-snb2/igt@gem_eio@unwedge-stress.html> (i915#3354<https://gitlab.freedesktop.org/drm/intel/issues/3354>) * igt@gem_exec_fair@basic-deadline: * shard-kbl: PASS<https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9979/shard-kbl2/igt@gem_exec_fair@basic-deadline.html> -> FAIL<https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_19945/shard-kbl6/igt@gem_exec_fair@basic-deadline.html> (i915#2846<https://gitlab.freedesktop.org/drm/intel/issues/2846>) * shard-apl: NOTRUN -> FAIL<https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_19945/shard-apl6/igt@gem_exec_fair@basic-deadline.html> (i915#2846<https://gitlab.freedesktop.org/drm/intel/issues/2846>) * igt@gem_exec_fair@basic-pace@vcs0: * shard-tglb: PASS<https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9979/shard-tglb6/igt@gem_exec_fair@basic-pace@vcs0.html> -> FAIL<https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_19945/shard-tglb6/igt@gem_exec_fair@basic-pace@vcs0.html> (i915#2842<https://gitlab.freedesktop.org/drm/intel/issues/2842>) * igt@gem_exec_reloc@basic-wide-active@bcs0: * shard-apl: NOTRUN -> FAIL<https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_19945/shard-apl6/igt@gem_exec_reloc@basic-wide-active@bcs0.html> (i915#2389<https://gitlab.freedesktop.org/drm/intel/issues/2389>) +3 similar issues * igt@gem_exec_reloc@basic-wide-active@vcs1: * shard-iclb: NOTRUN -> FAIL<https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_19945/shard-iclb4/igt@gem_exec_reloc@basic-wide-active@vcs1.html> (i915#2389<https://gitlab.freedesktop.org/drm/intel/issues/2389>) * igt@gem_huc_copy@huc-copy: * shard-tglb: PASS<https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9979/shard-tglb2/igt@gem_huc_copy@huc-copy.html> -> SKIP<https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_19945/shard-tglb6/igt@gem_huc_copy@huc-copy.html> (i915#2190<https://gitlab.freedesktop.org/drm/intel/issues/2190>) * igt@gem_userptr_blits@input-checking: * shard-snb: NOTRUN -> DMESG-WARN<https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_19945/shard-snb2/igt@gem_userptr_blits@input-checking.html> (i915#3002<https://gitlab.freedesktop.org/drm/intel/issues/3002>) * igt@gen9_exec_parse@bb-large: * shard-apl: NOTRUN -> FAIL<https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_19945/shard-apl6/igt@gen9_exec_parse@bb-large.html> (i915#3296<https://gitlab.freedesktop.org/drm/intel/issues/3296>) * igt@i915_suspend@fence-restore-tiled2untiled: * shard-apl: PASS<https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9979/shard-apl7/igt@i915_suspend@fence-restore-tiled2untiled.html> -> DMESG-WARN<https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_19945/shard-apl1/igt@i915_suspend@fence-restore-tiled2untiled.html> (i915#180<https://gitlab.freedesktop.org/drm/intel/issues/180>) * igt@i915_suspend@forcewake: * shard-skl: PASS<https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9979/shard-skl7/igt@i915_suspend@forcewake.html> -> INCOMPLETE<https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_19945/shard-skl4/igt@i915_suspend@forcewake.html> (i915#636<https://gitlab.freedesktop.org/drm/intel/issues/636>) * igt@i915_suspend@sysfs-reader: * shard-skl: PASS<https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9979/shard-skl8/igt@i915_suspend@sysfs-reader.html> -> INCOMPLETE<https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_19945/shard-skl6/igt@i915_suspend@sysfs-reader.html> (i915#198<https://gitlab.freedesktop.org/drm/intel/issues/198>) * igt@kms_async_flips@alternate-sync-async-flip: * shard-skl: PASS<https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9979/shard-skl9/igt@kms_async_flips@alternate-sync-async-flip.html> -> FAIL<https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_19945/shard-skl9/igt@kms_async_flips@alternate-sync-async-flip.html> (i915#2521<https://gitlab.freedesktop.org/drm/intel/issues/2521>) * igt@kms_async_flips@test-time-stamp: * shard-tglb: PASS<https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9979/shard-tglb2/igt@kms_async_flips@test-time-stamp.html> -> FAIL<https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_19945/shard-tglb5/igt@kms_async_flips@test-time-stamp.html> (i915#2574<https://gitlab.freedesktop.org/drm/intel/issues/2574>) * igt@kms_ccs@pipe-c-bad-rotation-90: * shard-skl: NOTRUN -> SKIP<https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_19945/shard-skl7/igt@kms_ccs@pipe-c-bad-rotation-90.html> (fdo#109271<https://bugs.freedesktop.org/show_bug.cgi?id=109271> / fdo#111304<https://bugs.freedesktop.org/show_bug.cgi?id=111304>) +1 similar issue * igt@kms_chamelium@hdmi-edid-read: * shard-skl: NOTRUN -> SKIP<https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_19945/shard-skl3/igt@kms_chamelium@hdmi-edid-read.html> (fdo#109271<https://bugs.freedesktop.org/show_bug.cgi?id=109271> / fdo#111827<https://bugs.freedesktop.org/show_bug.cgi?id=111827>) +8 similar issues * igt@kms_chamelium@hdmi-hpd-with-enabled-mode: * shard-kbl: NOTRUN -> SKIP<https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_19945/shard-kbl2/igt@kms_chamelium@hdmi-hpd-with-enabled-mode.html> (fdo#109271<https://bugs.freedesktop.org/show_bug.cgi?id=109271> / fdo#111827<https://bugs.freedesktop.org/show_bug.cgi?id=111827>) +1 similar issue * igt@kms_color_chamelium@pipe-d-ctm-0-5: * shard-snb: NOTRUN -> SKIP<https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_19945/shard-snb2/igt@kms_color_chamelium@pipe-d-ctm-0-5.html> (fdo#109271<https://bugs.freedesktop.org/show_bug.cgi?id=109271> / fdo#111827<https://bugs.freedesktop.org/show_bug.cgi?id=111827>) +19 similar issues * igt@kms_color_chamelium@pipe-d-ctm-0-75: * shard-apl: NOTRUN -> SKIP<https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_19945/shard-apl6/igt@kms_color_chamelium@pipe-d-ctm-0-75.html> (fdo#109271<https://bugs.freedesktop.org/show_bug.cgi?id=109271> / fdo#111827<https://bugs.freedesktop.org/show_bug.cgi?id=111827>) +4 similar issues * igt@kms_content_protection@srm: * shard-apl: NOTRUN -> TIMEOUT<https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_19945/shard-apl8/igt@kms_content_protection@srm.html> (i915#1319<https://gitlab.freedesktop.org/drm/intel/issues/1319>) * igt@kms_cursor_crc@pipe-d-cursor-256x256-rapid-movement: * shard-kbl: NOTRUN -> SKIP<https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_19945/shard-kbl2/igt@kms_cursor_crc@pipe-d-cursor-256x256-rapid-movement.html> (fdo#109271<https://bugs.freedesktop.org/show_bug.cgi?id=109271>) +25 similar issues * igt@kms_flip@flip-vs-suspend@a-dp1: * shard-kbl: PASS<https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9979/shard-kbl2/igt@kms_flip@flip-vs-suspend@a-dp1.html> -> DMESG-WARN<https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_19945/shard-kbl6/igt@kms_flip@flip-vs-suspend@a-dp1.html> (i915#180<https://gitlab.freedesktop.org/drm/intel/issues/180>) +2 similar issues * igt@kms_flip@flip-vs-suspend@a-edp1: * shard-skl: PASS<https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9979/shard-skl10/igt@kms_flip@flip-vs-suspend@a-edp1.html> -> INCOMPLETE<https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_19945/shard-skl8/igt@kms_flip@flip-vs-suspend@a-edp1.html> (i915#146<https://gitlab.freedesktop.org/drm/intel/issues/146> / i915#198<https://gitlab.freedesktop.org/drm/intel/issues/198>) * igt@kms_flip@plain-flip-ts-check@a-hdmi-a1: * shard-glk: PASS<https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9979/shard-glk7/igt@kms_flip@plain-flip-ts-check@a-hdmi-a1.html> -> FAIL<https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_19945/shard-glk7/igt@kms_flip@plain-flip-ts-check@a-hdmi-a1.html> (i915#2122<https://gitlab.freedesktop.org/drm/intel/issues/2122>) * igt@kms_flip_scaled_crc@flip-32bpp-ytile-to-64bpp-ytile: * shard-kbl: NOTRUN -> SKIP<https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_19945/shard-kbl2/igt@kms_flip_scaled_crc@flip-32bpp-ytile-to-64bpp-ytile.html> (fdo#109271<https://bugs.freedesktop.org/show_bug.cgi?id=109271> / i915#2642<https://gitlab.freedesktop.org/drm/intel/issues/2642>) * igt@kms_flip_scaled_crc@flip-32bpp-ytileccs-to-64bpp-ytile: * shard-snb: NOTRUN -> SKIP<https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_19945/shard-snb7/igt@kms_flip_scaled_crc@flip-32bpp-ytileccs-to-64bpp-ytile.html> (fdo#109271<https://bugs.freedesktop.org/show_bug.cgi?id=109271>) +354 similar issues * igt@kms_flip_scaled_crc@flip-64bpp-ytile-to-32bpp-ytilercccs: * shard-kbl: NOTRUN -> SKIP<https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_19945/shard-kbl4/igt@kms_flip_scaled_crc@flip-64bpp-ytile-to-32bpp-ytilercccs.html> (fdo#109271<https://bugs.freedesktop.org/show_bug.cgi?id=109271> / i915#2672<https://gitlab.freedesktop.org/drm/intel/issues/2672>) * igt@kms_frontbuffer_tracking@fbc-2p-scndscrn-spr-indfb-draw-mmap-wc: * shard-apl: NOTRUN -> SKIP<https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_19945/shard-apl6/igt@kms_frontbuffer_tracking@fbc-2p-scndscrn-spr-indfb-draw-mmap-wc.html> (fdo#109271<https://bugs.freedesktop.org/show_bug.cgi?id=109271>) +47 similar issues * igt@kms_hdr@bpc-switch-suspend: * shard-skl: PASS<https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9979/shard-skl7/igt@kms_hdr@bpc-switch-suspend.html> -> FAIL<https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_19945/shard-skl4/igt@kms_hdr@bpc-switch-suspend.html> (i915#1188<https://gitlab.freedesktop.org/drm/intel/issues/1188>) * igt@kms_pipe_crc_basic@disable-crc-after-crtc-pipe-d: * shard-apl: NOTRUN -> SKIP<https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_19945/shard-apl6/igt@kms_pipe_crc_basic@disable-crc-after-crtc-pipe-d.html> (fdo#109271<https://bugs.freedesktop.org/show_bug.cgi?id=109271> / i915#533<https://gitlab.freedesktop.org/drm/intel/issues/533>) * igt@kms_plane_alpha_blend@pipe-a-alpha-7efc: * shard-skl: NOTRUN -> FAIL<https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_19945/shard-skl7/igt@kms_plane_alpha_blend@pipe-a-alpha-7efc.html> (fdo#108145<https://bugs.freedesktop.org/show_bug.cgi?id=108145> / i915#265<https://gitlab.freedesktop.org/drm/intel/issues/265>) +3 similar issues * igt@kms_plane_alpha_blend@pipe-c-alpha-basic: * shard-apl: NOTRUN -> FAIL<https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_19945/shard-apl6/igt@kms_plane_alpha_blend@pipe-c-alpha-basic.html> (fdo#108145<https://bugs.freedesktop.org/show_bug.cgi?id=108145> / i915#265<https://gitlab.freedesktop.org/drm/intel/issues/265>) * igt@kms_psr2_sf@overlay-plane-update-sf-dmg-area-1: * shard-apl: NOTRUN -> SKIP<https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_19945/shard-apl6/igt@kms_psr2_sf@overlay-plane-update-sf-dmg-area-1.html> (fdo#109271<https://bugs.freedesktop.org/show_bug.cgi?id=109271> / i915#658<https://gitlab.freedesktop.org/drm/intel/issues/658>) +1 similar issue * igt@kms_psr2_sf@plane-move-sf-dmg-area-2: * shard-skl: NOTRUN -> SKIP<https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_19945/shard-skl3/igt@kms_psr2_sf@plane-move-sf-dmg-area-2.html> (fdo#109271<https://bugs.freedesktop.org/show_bug.cgi?id=109271> / i915#658<https://gitlab.freedesktop.org/drm/intel/issues/658>) +1 similar issue * igt@kms_psr2_su@frontbuffer: * shard-iclb: PASS<https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9979/shard-iclb2/igt@kms_psr2_su@frontbuffer.html> -> SKIP<https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_19945/shard-iclb6/igt@kms_psr2_su@frontbuffer.html> (fdo#109642<https://bugs.freedesktop.org/show_bug.cgi?id=109642> / fdo#111068<https://bugs.freedesktop.org/show_bug.cgi?id=111068> / i915#658<https://gitlab.freedesktop.org/drm/intel/issues/658>) * igt@kms_psr@psr2_cursor_plane_move: * shard-iclb: PASS<https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9979/shard-iclb2/igt@kms_psr@psr2_cursor_plane_move.html> -> SKIP<https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_19945/shard-iclb6/igt@kms_psr@psr2_cursor_plane_move.html> (fdo#109441<https://bugs.freedesktop.org/show_bug.cgi?id=109441>) +2 similar issues * igt@perf@polling-parameterized: * shard-skl: PASS<https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9979/shard-skl9/igt@perf@polling-parameterized.html> -> FAIL<https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_19945/shard-skl7/igt@perf@polling-parameterized.html> (i915#1542<https://gitlab.freedesktop.org/drm/intel/issues/1542>) * igt@sysfs_clients@fair-7: * shard-skl: NOTRUN -> SKIP<https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_19945/shard-skl3/igt@sysfs_clients@fair-7.html> (fdo#109271<https://bugs.freedesktop.org/show_bug.cgi?id=109271> / i915#2994<https://gitlab.freedesktop.org/drm/intel/issues/2994>) * igt@sysfs_clients@pidname: * shard-kbl: NOTRUN -> SKIP<https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_19945/shard-kbl4/igt@sysfs_clients@pidname.html> (fdo#109271<https://bugs.freedesktop.org/show_bug.cgi?id=109271> / i915#2994<https://gitlab.freedesktop.org/drm/intel/issues/2994>) Possible fixes * igt@gem_ctx_isolation@preservation-s3@vcs0: * shard-kbl: DMESG-WARN<https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9979/shard-kbl6/igt@gem_ctx_isolation@preservation-s3@vcs0.html> (i915#180<https://gitlab.freedesktop.org/drm/intel/issues/180>) -> PASS<https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_19945/shard-kbl2/igt@gem_ctx_isolation@preservation-s3@vcs0.html> +3 similar issues * igt@gem_eio@unwedge-stress: * shard-skl: TIMEOUT<https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9979/shard-skl10/igt@gem_eio@unwedge-stress.html> (i915#2369<https://gitlab.freedesktop.org/drm/intel/issues/2369> / i915#3063<https://gitlab.freedesktop.org/drm/intel/issues/3063>) -> PASS<https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_19945/shard-skl8/igt@gem_eio@unwedge-stress.html> * shard-iclb: TIMEOUT<https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9979/shard-iclb5/igt@gem_eio@unwedge-stress.html> (i915#2369<https://gitlab.freedesktop.org/drm/intel/issues/2369> / i915#2481<https://gitlab.freedesktop.org/drm/intel/issues/2481> / i915#3070<https://gitlab.freedesktop.org/drm/intel/issues/3070>) -> PASS<https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_19945/shard-iclb2/igt@gem_eio@unwedge-stress.html> * igt@gem_exec_fair@basic-pace-solo@rcs0: * shard-glk: FAIL<https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9979/shard-glk1/igt@gem_exec_fair@basic-pace-solo@rcs0.html> (i915#2842<https://gitlab.freedesktop.org/drm/intel/issues/2842>) -> PASS<https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_19945/shard-glk7/igt@gem_exec_fair@basic-pace-solo@rcs0.html> +1 similar issue * igt@gem_exec_fair@basic-pace@vcs0: * shard-iclb: FAIL<https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9979/shard-iclb8/igt@gem_exec_fair@basic-pace@vcs0.html> (i915#2842<https://gitlab.freedesktop.org/drm/intel/issues/2842>) -> PASS<https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_19945/shard-iclb7/igt@gem_exec_fair@basic-pace@vcs0.html> +1 similar issue * igt@gem_exec_fair@basic-pace@vecs0: * shard-kbl: FAIL<https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9979/shard-kbl3/igt@gem_exec_fair@basic-pace@vecs0.html> (i915#2842<https://gitlab.freedesktop.org/drm/intel/issues/2842>) -> PASS<https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_19945/shard-kbl2/igt@gem_exec_fair@basic-pace@vecs0.html> +2 similar issues * shard-tglb: FAIL<https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9979/shard-tglb6/igt@gem_exec_fair@basic-pace@vecs0.html> (i915#2842<https://gitlab.freedesktop.org/drm/intel/issues/2842>) -> PASS<https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_19945/shard-tglb6/igt@gem_exec_fair@basic-pace@vecs0.html> * igt@gem_mmap_gtt@cpuset-big-copy-odd: * shard-iclb: FAIL<https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9979/shard-iclb2/igt@gem_mmap_gtt@cpuset-big-copy-odd.html> (i915#2428<https://gitlab.freedesktop.org/drm/intel/issues/2428>) -> PASS<https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_19945/shard-iclb6/igt@gem_mmap_gtt@cpuset-big-copy-odd.html> * igt@gem_mmap_gtt@cpuset-big-copy-xy: * shard-iclb: FAIL<https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9979/shard-iclb5/igt@gem_mmap_gtt@cpuset-big-copy-xy.html> (i915#307<https://gitlab.freedesktop.org/drm/intel/issues/307>) -> PASS<https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_19945/shard-iclb5/igt@gem_mmap_gtt@cpuset-big-copy-xy.html> * igt@gen9_exec_parse@allowed-single: * shard-skl: DMESG-WARN<https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9979/shard-skl1/igt@gen9_exec_parse@allowed-single.html> (i915#1436<https://gitlab.freedesktop.org/drm/intel/issues/1436> / i915#716<https://gitlab.freedesktop.org/drm/intel/issues/716>) -> PASS<https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_19945/shard-skl7/igt@gen9_exec_parse@allowed-single.html> * igt@kms_cursor_crc@pipe-a-cursor-suspend: * shard-skl: INCOMPLETE<https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9979/shard-skl2/igt@kms_cursor_crc@pipe-a-cursor-suspend.html> (i915#2828<https://gitlab.freedesktop.org/drm/intel/issues/2828> / i915#300<https://gitlab.freedesktop.org/drm/intel/issues/300>) -> PASS<https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_19945/shard-skl1/igt@kms_cursor_crc@pipe-a-cursor-suspend.html> * igt@kms_flip@flip-vs-suspend-interruptible@b-dp1: * shard-apl: DMESG-WARN<https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9979/shard-apl8/igt@kms_flip@flip-vs-suspend-interruptible@b-dp1.html> (i915#180<https://gitlab.freedesktop.org/drm/intel/issues/180>) -> PASS<https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_19945/shard-apl8/igt@kms_flip@flip-vs-suspend-interruptible@b-dp1.html> * igt@kms_flip_tiling@flip-changes-tiling@edp-1-pipe-a: * shard-skl: DMESG-WARN<https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9979/shard-skl9/igt@kms_flip_tiling@flip-changes-tiling@edp-1-pipe-a.html> (i915#1982<https://gitlab.freedesktop.org/drm/intel/issues/1982>) -> PASS<https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_19945/shard-skl9/igt@kms_flip_tiling@flip-changes-tiling@edp-1-pipe-a.html> * igt@kms_plane_alpha_blend@pipe-a-constant-alpha-min: * shard-skl: FAIL<https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9979/shard-skl8/igt@kms_plane_alpha_blend@pipe-a-constant-alpha-min.html> (fdo#108145<https://bugs.freedesktop.org/show_bug.cgi?id=108145> / i915#265<https://gitlab.freedesktop.org/drm/intel/issues/265>) -> PASS<https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_19945/shard-skl1/igt@kms_plane_alpha_blend@pipe-a-constant-alpha-min.html> * igt@kms_psr@psr2_cursor_blt: * shard-iclb: SKIP<https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9979/shard-iclb4/igt@kms_psr@psr2_cursor_blt.html> (fdo#109441<https://bugs.freedesktop.org/show_bug.cgi?id=109441>) -> PASS<https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_19945/shard-iclb2/igt@kms_psr@psr2_cursor_blt.html> * igt@sysfs_preempt_timeout@timeout@vecs0: * shard-skl: FAIL<https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9979/shard-skl9/igt@sysfs_preempt_timeout@timeout@vecs0.html> (i915#2821<https://gitlab.freedesktop.org/drm/intel/issues/2821>) -> PASS<https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_19945/shard-skl7/igt@sysfs_preempt_timeout@timeout@vecs0.html> Warnings * igt@gem_exec_fair@basic-none-rrul@rcs0: * shard-iclb: FAIL<https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9979/shard-iclb8/igt@gem_exec_fair@basic-none-rrul@rcs0.html> (i915#2852<https://gitlab.freedesktop.org/drm/intel/issues/2852>) -> FAIL<https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_19945/shard-iclb4/igt@gem_exec_fair@basic-none-rrul@rcs0.html> (i915#2842<https://gitlab.freedesktop.org/drm/intel/issues/2842>) * igt@i915_pm_dc@dc3co-vpb-simulation: * shard-iclb: SKIP<https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9979/shard-iclb2/igt@i915_pm_dc@dc3co-vpb-simulation.html> (i915#588<https://gitlab.freedesktop.org/drm/intel/issues/588>) -> SKIP<https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_19945/shard-iclb6/igt@i915_pm_dc@dc3co-vpb-simulation.html> (i915#658<https://gitlab.freedesktop.org/drm/intel/issues/658>) * igt@kms_psr2_sf@primary-plane-update-sf-dmg-area-4: * shard-iclb: SKIP<https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9979/shard-iclb2/igt@kms_psr2_sf@primary-plane-update-sf-dmg-area-4.html> (i915#2920<https://gitlab.freedesktop.org/drm/intel/issues/2920>) -> SKIP<https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_19945/shard-iclb6/igt@kms_psr2_sf@primary-plane-update-sf-dmg-area-4.html> (i915#658<https://gitlab.freedesktop.org/drm/intel/issues/658>) * igt@kms_psr2_sf@primary-plane-update-sf-dmg-area-5: * shard-iclb: SKIP<https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9979/shard-iclb5/igt@kms_psr2_sf@primary-plane-update-sf-dmg-area-5.html> (i915#658<https://gitlab.freedesktop.org/drm/intel/issues/658>) -> SKIP<https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_19945/shard-iclb2/igt@kms_psr2_sf@primary-plane-update-sf-dmg-area-5.html> (i915#2920<https://gitlab.freedesktop.org/drm/intel/issues/2920>) +1 similar issue * igt@runner@aborted: * shard-kbl: (FAIL<https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9979/shard-kbl6/igt@runner@aborted.html>, FAIL<https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9979/shard-kbl6/igt@runner@aborted.html>, FAIL<https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9979/shard-kbl7/igt@runner@aborted.html>, FAIL<https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9979/shard-kbl4/igt@runner@aborted.html>, FAIL<https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9979/shard-kbl7/igt@runner@aborted.html>, FAIL<https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9979/shard-kbl2/igt@runner@aborted.html>) (i915#1436<https://gitlab.freedesktop.org/drm/intel/issues/1436> / i915#180<https://gitlab.freedesktop.org/drm/intel/issues/180> / i915#1814<https://gitlab.freedesktop.org/drm/intel/issues/1814> / i915#2505<https://gitlab.freedesktop.org/drm/intel/issues/2505> / i915#3002<https://gitlab.freedesktop.org/drm/intel/issues/3002> / i915#602<https://gitlab.freedesktop.org/drm/intel/issues/602>) -> (FAIL<https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_19945/shard-kbl6/igt@runner@aborted.html>, FAIL<https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_19945/shard-kbl4/igt@runner@aborted.html>, FAIL<https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_19945/shard-kbl7/igt@runner@aborted.html>, FAIL<https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_19945/shard-kbl7/igt@runner@aborted.html>, FAIL<https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_19945/shard-kbl7/igt@runner@aborted.html>, FAIL<https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_19945/shard-kbl4/igt@runner@aborted.html>, FAIL<https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_19945/shard-kbl6/igt@runner@aborted.html>) (i915#180<https://gitlab.freedesktop.org/drm/intel/issues/180> / i915#1814<https://gitlab.freedesktop.org/drm/intel/issues/1814> / i915#2505<https://gitlab.freedesktop.org/drm/intel/issues/2505> / i915#3002<https://gitlab.freedesktop.org/drm/intel/issues/3002> / i915#602<https://gitlab.freedesktop.org/drm/intel/issues/602>) * shard-skl: (FAIL<https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9979/shard-skl4/igt@runner@aborted.html>, FAIL<https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9979/shard-skl3/igt@runner@aborted.html>, FAIL<https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9979/shard-skl1/igt@runner@aborted.html>, FAIL<https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9979/shard-skl1/igt@runner@aborted.html>) (i915#1436<https://gitlab.freedesktop.org/drm/intel/issues/1436> / i915#1814<https://gitlab.freedesktop.org/drm/intel/issues/1814> / i915#2029<https://gitlab.freedesktop.org/drm/intel/issues/2029> / i915#3002<https://gitlab.freedesktop.org/drm/intel/issues/3002>) -> (FAIL<https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_19945/shard-skl2/igt@runner@aborted.html>, FAIL<https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_19945/shard-skl3/igt@runner@aborted.html>, FAIL<https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_19945/shard-skl2/igt@runner@aborted.html>, FAIL<https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_19945/shard-skl9/igt@runner@aborted.html>, FAIL<https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_19945/shard-skl1/igt@runner@aborted.html>) (i915#1814<https://gitlab.freedesktop.org/drm/intel/issues/1814> / i915#2029<https://gitlab.freedesktop.org/drm/intel/issues/2029> / i915#3002<https://gitlab.freedesktop.org/drm/intel/issues/3002>) Participating hosts (12 -> 12) No changes in participating hosts Build changes * Linux: CI_DRM_9979 -> Patchwork_19945 CI-20190529: 20190529 CI_DRM_9979: 3fc393180390c562554bdd7d0ac08fa4b86a4011 @ git://anongit.freedesktop.org/gfx-ci/linux IGT_6067: 14317b92a672d9a20cd04fc3b0c80e2fb12d51d5 @ git://anongit.freedesktop.org/xorg/app/intel-gpu-tools Patchwork_19945: 552ce59e5d6a8805bfa342474467e6018c10dacb @ git://anongit.freedesktop.org/gfx-ci/linux piglit_4509: fdc5a4ca11124ab8413c7988896eec4c97336694 @ git://anongit.freedesktop.org/piglit
diff --git a/drivers/gpu/drm/i915/display/intel_ddi.c b/drivers/gpu/drm/i915/display/intel_ddi.c index 4ef573883412..f69ed3c4c30a 100644 --- a/drivers/gpu/drm/i915/display/intel_ddi.c +++ b/drivers/gpu/drm/i915/display/intel_ddi.c @@ -3707,6 +3707,8 @@ static void intel_ddi_get_config(struct intel_encoder *encoder, intel_read_dp_sdp(encoder, pipe_config, HDMI_PACKET_TYPE_GAMUT_METADATA); intel_read_dp_sdp(encoder, pipe_config, DP_SDP_VSC); + + intel_psr_get_config(encoder, pipe_config); } void intel_ddi_get_clock(struct intel_encoder *encoder, diff --git a/drivers/gpu/drm/i915/display/intel_display.c b/drivers/gpu/drm/i915/display/intel_display.c index 9c13d0ac022b..ecdca523e364 100644 --- a/drivers/gpu/drm/i915/display/intel_display.c +++ b/drivers/gpu/drm/i915/display/intel_display.c @@ -8350,6 +8350,11 @@ intel_pipe_config_compare(const struct intel_crtc_state *current_config, PIPE_CONF_CHECK_I(vrr.flipline); PIPE_CONF_CHECK_I(vrr.pipeline_full); + PIPE_CONF_CHECK_BOOL(has_psr); + PIPE_CONF_CHECK_BOOL(has_psr2); + PIPE_CONF_CHECK_BOOL(enable_psr2_sel_fetch); + PIPE_CONF_CHECK_I(dc3co_exitline); + #undef PIPE_CONF_CHECK_X #undef PIPE_CONF_CHECK_I #undef PIPE_CONF_CHECK_BOOL diff --git a/drivers/gpu/drm/i915/display/intel_psr.c b/drivers/gpu/drm/i915/display/intel_psr.c index 4ad756e238c5..bd7997a3ef7c 100644 --- a/drivers/gpu/drm/i915/display/intel_psr.c +++ b/drivers/gpu/drm/i915/display/intel_psr.c @@ -886,6 +886,53 @@ void intel_psr_compute_config(struct intel_dp *intel_dp, crtc_state->infoframes.enable |= intel_hdmi_infoframe_enable(DP_SDP_VSC); } +void intel_psr_get_config(struct intel_encoder *encoder, + struct intel_crtc_state *pipe_config) +{ + struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); + struct intel_digital_port *dig_port = enc_to_dig_port(encoder); + struct intel_dp *intel_dp; + u32 val; + + if (!dig_port) + return; + + intel_dp = &dig_port->dp; + if (!CAN_PSR(intel_dp)) + return; + + mutex_lock(&intel_dp->psr.lock); + if (!intel_dp->psr.enabled) { + mutex_unlock(&intel_dp->psr.lock); + return; + } + + /* + * Not possible to read EDP_PSR/PSR2_CTL registers as it is + * enabled/disabled because of frontbuffer tracking and others. + */ + pipe_config->has_psr = true; + pipe_config->has_psr2 = intel_dp->psr.psr2_enabled; + pipe_config->infoframes.enable |= intel_hdmi_infoframe_enable(DP_SDP_VSC); + + if (!intel_dp->psr.psr2_enabled) + goto unlock; + + if (HAS_PSR2_SEL_FETCH(dev_priv)) { + val = intel_de_read(dev_priv, PSR2_MAN_TRK_CTL(intel_dp->psr.transcoder)); + if (val & PSR2_MAN_TRK_CTL_ENABLE) + pipe_config->enable_psr2_sel_fetch = true; + } + + if (DISPLAY_VER(dev_priv) >= 12) { + val = intel_de_read(dev_priv, EXITLINE(intel_dp->psr.transcoder)); + val &= EXITLINE_MASK; + pipe_config->dc3co_exitline = val; + } +unlock: + mutex_unlock(&intel_dp->psr.lock); +} + static void intel_psr_activate(struct intel_dp *intel_dp) { struct drm_i915_private *dev_priv = dp_to_i915(intel_dp); diff --git a/drivers/gpu/drm/i915/display/intel_psr.h b/drivers/gpu/drm/i915/display/intel_psr.h index 0491a49ffd50..e3db85e97f4c 100644 --- a/drivers/gpu/drm/i915/display/intel_psr.h +++ b/drivers/gpu/drm/i915/display/intel_psr.h @@ -17,6 +17,7 @@ struct intel_crtc; struct intel_atomic_state; struct intel_plane_state; struct intel_plane; +struct intel_encoder; void intel_psr_init_dpcd(struct intel_dp *intel_dp); void intel_psr_enable(struct intel_dp *intel_dp, @@ -37,6 +38,8 @@ void intel_psr_flush(struct drm_i915_private *dev_priv, void intel_psr_init(struct intel_dp *intel_dp); void intel_psr_compute_config(struct intel_dp *intel_dp, struct intel_crtc_state *crtc_state); +void intel_psr_get_config(struct intel_encoder *encoder, + struct intel_crtc_state *pipe_config); void intel_psr_irq_handler(struct intel_dp *intel_dp, u32 psr_iir); void intel_psr_short_pulse(struct intel_dp *intel_dp); void intel_psr_wait_for_idle(const struct intel_crtc_state *new_crtc_state);
So far if we had a mismatch between the state asked and what was programmed in hardware for PSR, this mismatch would go unnoticed. So here adding the PSR to the hardware configuration readout, EDP_PSR_CTL and EDP_PSR2_CTL can't be directly read because its state flips due to other factors like frontbuffer modifications and CRC. Cc: Gwan-gyeong Mun <gwan-gyeong.mun@intel.com> Signed-off-by: José Roberto de Souza <jose.souza@intel.com> --- drivers/gpu/drm/i915/display/intel_ddi.c | 2 + drivers/gpu/drm/i915/display/intel_display.c | 5 +++ drivers/gpu/drm/i915/display/intel_psr.c | 47 ++++++++++++++++++++ drivers/gpu/drm/i915/display/intel_psr.h | 3 ++ 4 files changed, 57 insertions(+)