* [Intel-gfx] [PATCH v4 00/14] drm/i915/tc: Add a workaround for an IOM/TCSS firmware hang issue @ 2023-05-10 10:31 Imre Deak 2023-05-10 10:31 ` [Intel-gfx] [PATCH v4 01/14] drm/i915: Fix PIPEDMC disabling for a bigjoiner configuration Imre Deak ` (21 more replies) 0 siblings, 22 replies; 41+ messages in thread From: Imre Deak @ 2023-05-10 10:31 UTC (permalink / raw) To: intel-gfx; +Cc: Jani Nikula This is v4 of [1], addressing the review comments from Ville, Vinod and Jani. Patch 13/14 also fixes an issue canceling the link reset work synchronously during system suspend and driver cleanup. Cc: Ville Syrjälä <ville.syrjala@linux.intel.com> Cc: Vinod Govindapillai <vinod.govindapillai@intel.com> Cc: Jani Nikula <jani.nikula@intel.com> [1] https://lore.kernel.org/all/20230503231048.432368-1-imre.deak@intel.com/ Imre Deak (14): drm/i915: Fix PIPEDMC disabling for a bigjoiner configuration drm/i915: Add helpers to reference/unreference a DPLL for a CRTC drm/i915: Make the CRTC state consistent during sanitize-disabling drm/i915: Update connector atomic state before crtc sanitize-disabling drm/i915: Separate intel_crtc_disable_noatomic_begin/complete() drm/i915: Factor out set_encoder_for_connector() drm/i915: Add support for disabling any CRTCs during HW readout/sanitization drm/i915/dp: Add link training debug and error printing helpers drm/i915/dp: Convert link training error to debug message on disconnected sink drm/i915/dp: Prevent link training fallback on disconnected port drm/i915/dp: Factor out intel_dp_get_active_pipes() drm/i915: Factor out a helper for handling atomic modeset locks/state drm/i915/tc: Call TypeC port flush_work/cleanup without modeset locks held drm/i915/tc: Reset TypeC PHYs left enabled in DP-alt mode after the sink disconnects drivers/gpu/drm/i915/Makefile | 1 + drivers/gpu/drm/i915/display/intel_ddi.c | 68 ++-- drivers/gpu/drm/i915/display/intel_display.c | 14 +- drivers/gpu/drm/i915/display/intel_display.h | 1 + .../drm/i915/display/intel_display_types.h | 12 + drivers/gpu/drm/i915/display/intel_dp.c | 20 +- drivers/gpu/drm/i915/display/intel_dp.h | 3 + .../drm/i915/display/intel_dp_link_training.c | 376 ++++++------------ drivers/gpu/drm/i915/display/intel_dpll_mgr.c | 58 ++- drivers/gpu/drm/i915/display/intel_dpll_mgr.h | 3 + .../gpu/drm/i915/display/intel_modeset_lock.c | 50 +++ .../gpu/drm/i915/display/intel_modeset_lock.h | 33 ++ .../drm/i915/display/intel_modeset_setup.c | 318 +++++++++++++-- drivers/gpu/drm/i915/display/intel_tc.c | 156 +++++++- drivers/gpu/drm/i915/display/intel_tc.h | 5 +- drivers/gpu/drm/i915/i915_driver.c | 8 + 16 files changed, 776 insertions(+), 350 deletions(-) create mode 100644 drivers/gpu/drm/i915/display/intel_modeset_lock.c create mode 100644 drivers/gpu/drm/i915/display/intel_modeset_lock.h -- 2.37.2 ^ permalink raw reply [flat|nested] 41+ messages in thread
* [Intel-gfx] [PATCH v4 01/14] drm/i915: Fix PIPEDMC disabling for a bigjoiner configuration 2023-05-10 10:31 [Intel-gfx] [PATCH v4 00/14] drm/i915/tc: Add a workaround for an IOM/TCSS firmware hang issue Imre Deak @ 2023-05-10 10:31 ` Imre Deak 2023-05-30 13:49 ` [v4,01/14] " Rudi Heitbaum 2023-05-10 10:31 ` [Intel-gfx] [PATCH v4 02/14] drm/i915: Add helpers to reference/unreference a DPLL for a CRTC Imre Deak ` (20 subsequent siblings) 21 siblings, 1 reply; 41+ messages in thread From: Imre Deak @ 2023-05-10 10:31 UTC (permalink / raw) To: intel-gfx; +Cc: Rodrigo Vivi For a bigjoiner configuration display->crtc_disable() will be called first for the slave CRTCs and then for the master CRTC. However slave CRTCs will be actually disabled only after the master CRTC is disabled (from the encoder disable hooks called with the master CRTC state). Hence the slave PIPEDMCs can be disabled only after the master CRTC is disabled, make this so. intel_encoders_post_pll_disable() must be called only for the master CRTC, as for the other two encoder disable hooks. While at it fix this up as well. This didn't cause a problem, since intel_encoders_post_pll_disable() will call the corresponding hook only for an encoder/connector connected to the given CRTC, however slave CRTCs will have no associated encoder/connector. Fixes: 3af2ff0840be ("drm/i915: Enable a PIPEDMC whenever its corresponding pipe is enabled") Cc: Rodrigo Vivi <rodrigo.vivi@intel.com> Cc: Ville Syrjälä <ville.syrjala@linux.intel.com> Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com> Signed-off-by: Imre Deak <imre.deak@intel.com> --- drivers/gpu/drm/i915/display/intel_display.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/i915/display/intel_display.c b/drivers/gpu/drm/i915/display/intel_display.c index 1d5d42a408035..116fa52290b84 100644 --- a/drivers/gpu/drm/i915/display/intel_display.c +++ b/drivers/gpu/drm/i915/display/intel_display.c @@ -1702,9 +1702,17 @@ static void hsw_crtc_disable(struct intel_atomic_state *state, intel_disable_shared_dpll(old_crtc_state); - intel_encoders_post_pll_disable(state, crtc); + if (!intel_crtc_is_bigjoiner_slave(old_crtc_state)) { + struct intel_crtc *slave_crtc; + + intel_encoders_post_pll_disable(state, crtc); - intel_dmc_disable_pipe(i915, crtc->pipe); + intel_dmc_disable_pipe(i915, crtc->pipe); + + for_each_intel_crtc_in_pipe_mask(&i915->drm, slave_crtc, + intel_crtc_bigjoiner_slave_pipes(old_crtc_state)) + intel_dmc_disable_pipe(i915, slave_crtc->pipe); + } } static void i9xx_pfit_enable(const struct intel_crtc_state *crtc_state) -- 2.37.2 ^ permalink raw reply related [flat|nested] 41+ messages in thread
* Re: [v4,01/14] drm/i915: Fix PIPEDMC disabling for a bigjoiner configuration 2023-05-10 10:31 ` [Intel-gfx] [PATCH v4 01/14] drm/i915: Fix PIPEDMC disabling for a bigjoiner configuration Imre Deak 2023-05-30 13:49 ` [v4,01/14] " Rudi Heitbaum @ 2023-05-30 13:49 ` Rudi Heitbaum 0 siblings, 0 replies; 41+ messages in thread From: Rudi Heitbaum @ 2023-05-30 13:49 UTC (permalink / raw) To: Imre Deak, Dave Airlie, Dave Airlie Cc: intel-gfx, Rodrigo Vivi, Joonas Lahtinen, Linus Torvalds, Daniel Vetter, dri-devel, LKML Hi Imre/Dave, Ref: [v4,01/14] drm/i915: Fix PIPEDMC disabling for a bigjoiner configuration [git pull] drm fixes for 6.4-rc4 drm-fixes-2023-05-26: drm fixes for 6.4-rc4 This patch has caused a regression between 6.4-rc3 and 6.4-rc4. Other tested kernels include 6.3.4 work fine. Dropping the patch allows the decode playback of media via Kodi. Without dropping the patch - the media starts and stutters then ceases to play. There is an additional issue that 6.4-rc4 audio playback is also failing (where 6.4-rc3 was fine), I have not yet tracked this down. This is all on: DMI: Intel(R) Client Systems NUC12WSKi7/NUC12WSBi7, BIOS WSADL357.0087.2023.0306.1931 03/06/2023 12th Gen Intel(R) Core(TM) i7-1260P (family: 0x6, model: 0x9a, stepping: 0x3) microcode: updated early: 0x429 -> 0x42a, date = 2023-02-14 Regards Rudi On Wed, May 10, 2023 at 01:31:18PM +0300, Imre Deak wrote: > For a bigjoiner configuration display->crtc_disable() will be called > first for the slave CRTCs and then for the master CRTC. However slave > CRTCs will be actually disabled only after the master CRTC is disabled > (from the encoder disable hooks called with the master CRTC state). > Hence the slave PIPEDMCs can be disabled only after the master CRTC is > disabled, make this so. > > intel_encoders_post_pll_disable() must be called only for the master > CRTC, as for the other two encoder disable hooks. While at it fix this > up as well. This didn't cause a problem, since > intel_encoders_post_pll_disable() will call the corresponding hook only > for an encoder/connector connected to the given CRTC, however slave > CRTCs will have no associated encoder/connector. > > Fixes: 3af2ff0840be ("drm/i915: Enable a PIPEDMC whenever its corresponding pipe is enabled") > Cc: Rodrigo Vivi <rodrigo.vivi@intel.com> > Cc: Ville Syrjälä <ville.syrjala@linux.intel.com> > Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com> > Signed-off-by: Imre Deak <imre.deak@intel.com> > --- > drivers/gpu/drm/i915/display/intel_display.c | 12 ++++++++++-- > 1 file changed, 10 insertions(+), 2 deletions(-) > > diff --git a/drivers/gpu/drm/i915/display/intel_display.c b/drivers/gpu/drm/i915/display/intel_display.c > index 1d5d42a408035..116fa52290b84 100644 > --- a/drivers/gpu/drm/i915/display/intel_display.c > +++ b/drivers/gpu/drm/i915/display/intel_display.c > @@ -1702,9 +1702,17 @@ static void hsw_crtc_disable(struct intel_atomic_state *state, > > intel_disable_shared_dpll(old_crtc_state); > > - intel_encoders_post_pll_disable(state, crtc); > + if (!intel_crtc_is_bigjoiner_slave(old_crtc_state)) { > + struct intel_crtc *slave_crtc; > + > + intel_encoders_post_pll_disable(state, crtc); > > - intel_dmc_disable_pipe(i915, crtc->pipe); > + intel_dmc_disable_pipe(i915, crtc->pipe); > + > + for_each_intel_crtc_in_pipe_mask(&i915->drm, slave_crtc, > + intel_crtc_bigjoiner_slave_pipes(old_crtc_state)) > + intel_dmc_disable_pipe(i915, slave_crtc->pipe); > + } > } > > static void i9xx_pfit_enable(const struct intel_crtc_state *crtc_state) ^ permalink raw reply [flat|nested] 41+ messages in thread
* Re: [Intel-gfx] [v4, 01/14] drm/i915: Fix PIPEDMC disabling for a bigjoiner configuration @ 2023-05-30 13:49 ` Rudi Heitbaum 0 siblings, 0 replies; 41+ messages in thread From: Rudi Heitbaum @ 2023-05-30 13:49 UTC (permalink / raw) To: Imre Deak, Dave Airlie, Dave Airlie Cc: Daniel Vetter, intel-gfx, LKML, dri-devel, Rodrigo Vivi, Linus Torvalds Hi Imre/Dave, Ref: [v4,01/14] drm/i915: Fix PIPEDMC disabling for a bigjoiner configuration [git pull] drm fixes for 6.4-rc4 drm-fixes-2023-05-26: drm fixes for 6.4-rc4 This patch has caused a regression between 6.4-rc3 and 6.4-rc4. Other tested kernels include 6.3.4 work fine. Dropping the patch allows the decode playback of media via Kodi. Without dropping the patch - the media starts and stutters then ceases to play. There is an additional issue that 6.4-rc4 audio playback is also failing (where 6.4-rc3 was fine), I have not yet tracked this down. This is all on: DMI: Intel(R) Client Systems NUC12WSKi7/NUC12WSBi7, BIOS WSADL357.0087.2023.0306.1931 03/06/2023 12th Gen Intel(R) Core(TM) i7-1260P (family: 0x6, model: 0x9a, stepping: 0x3) microcode: updated early: 0x429 -> 0x42a, date = 2023-02-14 Regards Rudi On Wed, May 10, 2023 at 01:31:18PM +0300, Imre Deak wrote: > For a bigjoiner configuration display->crtc_disable() will be called > first for the slave CRTCs and then for the master CRTC. However slave > CRTCs will be actually disabled only after the master CRTC is disabled > (from the encoder disable hooks called with the master CRTC state). > Hence the slave PIPEDMCs can be disabled only after the master CRTC is > disabled, make this so. > > intel_encoders_post_pll_disable() must be called only for the master > CRTC, as for the other two encoder disable hooks. While at it fix this > up as well. This didn't cause a problem, since > intel_encoders_post_pll_disable() will call the corresponding hook only > for an encoder/connector connected to the given CRTC, however slave > CRTCs will have no associated encoder/connector. > > Fixes: 3af2ff0840be ("drm/i915: Enable a PIPEDMC whenever its corresponding pipe is enabled") > Cc: Rodrigo Vivi <rodrigo.vivi@intel.com> > Cc: Ville Syrjälä <ville.syrjala@linux.intel.com> > Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com> > Signed-off-by: Imre Deak <imre.deak@intel.com> > --- > drivers/gpu/drm/i915/display/intel_display.c | 12 ++++++++++-- > 1 file changed, 10 insertions(+), 2 deletions(-) > > diff --git a/drivers/gpu/drm/i915/display/intel_display.c b/drivers/gpu/drm/i915/display/intel_display.c > index 1d5d42a408035..116fa52290b84 100644 > --- a/drivers/gpu/drm/i915/display/intel_display.c > +++ b/drivers/gpu/drm/i915/display/intel_display.c > @@ -1702,9 +1702,17 @@ static void hsw_crtc_disable(struct intel_atomic_state *state, > > intel_disable_shared_dpll(old_crtc_state); > > - intel_encoders_post_pll_disable(state, crtc); > + if (!intel_crtc_is_bigjoiner_slave(old_crtc_state)) { > + struct intel_crtc *slave_crtc; > + > + intel_encoders_post_pll_disable(state, crtc); > > - intel_dmc_disable_pipe(i915, crtc->pipe); > + intel_dmc_disable_pipe(i915, crtc->pipe); > + > + for_each_intel_crtc_in_pipe_mask(&i915->drm, slave_crtc, > + intel_crtc_bigjoiner_slave_pipes(old_crtc_state)) > + intel_dmc_disable_pipe(i915, slave_crtc->pipe); > + } > } > > static void i9xx_pfit_enable(const struct intel_crtc_state *crtc_state) ^ permalink raw reply [flat|nested] 41+ messages in thread
* Re: [v4,01/14] drm/i915: Fix PIPEDMC disabling for a bigjoiner configuration @ 2023-05-30 13:49 ` Rudi Heitbaum 0 siblings, 0 replies; 41+ messages in thread From: Rudi Heitbaum @ 2023-05-30 13:49 UTC (permalink / raw) To: Imre Deak, Dave Airlie, Dave Airlie Cc: Daniel Vetter, intel-gfx, LKML, dri-devel, Rodrigo Vivi, Linus Torvalds Hi Imre/Dave, Ref: [v4,01/14] drm/i915: Fix PIPEDMC disabling for a bigjoiner configuration [git pull] drm fixes for 6.4-rc4 drm-fixes-2023-05-26: drm fixes for 6.4-rc4 This patch has caused a regression between 6.4-rc3 and 6.4-rc4. Other tested kernels include 6.3.4 work fine. Dropping the patch allows the decode playback of media via Kodi. Without dropping the patch - the media starts and stutters then ceases to play. There is an additional issue that 6.4-rc4 audio playback is also failing (where 6.4-rc3 was fine), I have not yet tracked this down. This is all on: DMI: Intel(R) Client Systems NUC12WSKi7/NUC12WSBi7, BIOS WSADL357.0087.2023.0306.1931 03/06/2023 12th Gen Intel(R) Core(TM) i7-1260P (family: 0x6, model: 0x9a, stepping: 0x3) microcode: updated early: 0x429 -> 0x42a, date = 2023-02-14 Regards Rudi On Wed, May 10, 2023 at 01:31:18PM +0300, Imre Deak wrote: > For a bigjoiner configuration display->crtc_disable() will be called > first for the slave CRTCs and then for the master CRTC. However slave > CRTCs will be actually disabled only after the master CRTC is disabled > (from the encoder disable hooks called with the master CRTC state). > Hence the slave PIPEDMCs can be disabled only after the master CRTC is > disabled, make this so. > > intel_encoders_post_pll_disable() must be called only for the master > CRTC, as for the other two encoder disable hooks. While at it fix this > up as well. This didn't cause a problem, since > intel_encoders_post_pll_disable() will call the corresponding hook only > for an encoder/connector connected to the given CRTC, however slave > CRTCs will have no associated encoder/connector. > > Fixes: 3af2ff0840be ("drm/i915: Enable a PIPEDMC whenever its corresponding pipe is enabled") > Cc: Rodrigo Vivi <rodrigo.vivi@intel.com> > Cc: Ville Syrjälä <ville.syrjala@linux.intel.com> > Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com> > Signed-off-by: Imre Deak <imre.deak@intel.com> > --- > drivers/gpu/drm/i915/display/intel_display.c | 12 ++++++++++-- > 1 file changed, 10 insertions(+), 2 deletions(-) > > diff --git a/drivers/gpu/drm/i915/display/intel_display.c b/drivers/gpu/drm/i915/display/intel_display.c > index 1d5d42a408035..116fa52290b84 100644 > --- a/drivers/gpu/drm/i915/display/intel_display.c > +++ b/drivers/gpu/drm/i915/display/intel_display.c > @@ -1702,9 +1702,17 @@ static void hsw_crtc_disable(struct intel_atomic_state *state, > > intel_disable_shared_dpll(old_crtc_state); > > - intel_encoders_post_pll_disable(state, crtc); > + if (!intel_crtc_is_bigjoiner_slave(old_crtc_state)) { > + struct intel_crtc *slave_crtc; > + > + intel_encoders_post_pll_disable(state, crtc); > > - intel_dmc_disable_pipe(i915, crtc->pipe); > + intel_dmc_disable_pipe(i915, crtc->pipe); > + > + for_each_intel_crtc_in_pipe_mask(&i915->drm, slave_crtc, > + intel_crtc_bigjoiner_slave_pipes(old_crtc_state)) > + intel_dmc_disable_pipe(i915, slave_crtc->pipe); > + } > } > > static void i9xx_pfit_enable(const struct intel_crtc_state *crtc_state) ^ permalink raw reply [flat|nested] 41+ messages in thread
* Re: [v4,01/14] drm/i915: Fix PIPEDMC disabling for a bigjoiner configuration 2023-05-30 13:49 ` [v4,01/14] " Rudi Heitbaum (?) @ 2023-05-31 8:47 ` Imre Deak -1 siblings, 0 replies; 41+ messages in thread From: Imre Deak @ 2023-05-31 8:47 UTC (permalink / raw) To: Rudi Heitbaum Cc: Linus Torvalds, intel-gfx, LKML, dri-devel, Daniel Vetter, Rodrigo Vivi, Dave Airlie On Tue, May 30, 2023 at 01:49:07PM +0000, Rudi Heitbaum wrote: Hi Rudi, Could you open a ticket at https://gitlab.freedesktop.org/drm/intel/-/issues/new attaching a dmesg log after booting with drm.debug=0xe, with the messages from boot-up until the issue happens? Thanks, Imre > Hi Imre/Dave, > > Ref: [v4,01/14] drm/i915: Fix PIPEDMC disabling for a bigjoiner configuration > [git pull] drm fixes for 6.4-rc4 > drm-fixes-2023-05-26: > drm fixes for 6.4-rc4 > > This patch has caused a regression between 6.4-rc3 and 6.4-rc4. Other > tested kernels include 6.3.4 work fine. Dropping the patch allows the decode > playback of media via Kodi. Without dropping the patch - the media > starts and stutters then ceases to play. > > There is an additional issue that 6.4-rc4 audio playback is also failing > (where 6.4-rc3 was fine), I have not yet tracked this down. > > This is all on: > DMI: Intel(R) Client Systems NUC12WSKi7/NUC12WSBi7, BIOS WSADL357.0087.2023.0306.1931 03/06/2023 > 12th Gen Intel(R) Core(TM) i7-1260P (family: 0x6, model: 0x9a, stepping: 0x3) > microcode: updated early: 0x429 -> 0x42a, date = 2023-02-14 > > Regards > > Rudi > > On Wed, May 10, 2023 at 01:31:18PM +0300, Imre Deak wrote: > > For a bigjoiner configuration display->crtc_disable() will be called > > first for the slave CRTCs and then for the master CRTC. However slave > > CRTCs will be actually disabled only after the master CRTC is disabled > > (from the encoder disable hooks called with the master CRTC state). > > Hence the slave PIPEDMCs can be disabled only after the master CRTC is > > disabled, make this so. > > > > intel_encoders_post_pll_disable() must be called only for the master > > CRTC, as for the other two encoder disable hooks. While at it fix this > > up as well. This didn't cause a problem, since > > intel_encoders_post_pll_disable() will call the corresponding hook only > > for an encoder/connector connected to the given CRTC, however slave > > CRTCs will have no associated encoder/connector. > > > > Fixes: 3af2ff0840be ("drm/i915: Enable a PIPEDMC whenever its corresponding pipe is enabled") > > Cc: Rodrigo Vivi <rodrigo.vivi@intel.com> > > Cc: Ville Syrjälä <ville.syrjala@linux.intel.com> > > Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com> > > Signed-off-by: Imre Deak <imre.deak@intel.com> > > --- > > drivers/gpu/drm/i915/display/intel_display.c | 12 ++++++++++-- > > 1 file changed, 10 insertions(+), 2 deletions(-) > > > > diff --git a/drivers/gpu/drm/i915/display/intel_display.c b/drivers/gpu/drm/i915/display/intel_display.c > > index 1d5d42a408035..116fa52290b84 100644 > > --- a/drivers/gpu/drm/i915/display/intel_display.c > > +++ b/drivers/gpu/drm/i915/display/intel_display.c > > @@ -1702,9 +1702,17 @@ static void hsw_crtc_disable(struct intel_atomic_state *state, > > > > intel_disable_shared_dpll(old_crtc_state); > > > > - intel_encoders_post_pll_disable(state, crtc); > > + if (!intel_crtc_is_bigjoiner_slave(old_crtc_state)) { > > + struct intel_crtc *slave_crtc; > > + > > + intel_encoders_post_pll_disable(state, crtc); > > > > - intel_dmc_disable_pipe(i915, crtc->pipe); > > + intel_dmc_disable_pipe(i915, crtc->pipe); > > + > > + for_each_intel_crtc_in_pipe_mask(&i915->drm, slave_crtc, > > + intel_crtc_bigjoiner_slave_pipes(old_crtc_state)) > > + intel_dmc_disable_pipe(i915, slave_crtc->pipe); > > + } > > } > > > > static void i9xx_pfit_enable(const struct intel_crtc_state *crtc_state) ^ permalink raw reply [flat|nested] 41+ messages in thread
* Re: [v4,01/14] drm/i915: Fix PIPEDMC disabling for a bigjoiner configuration @ 2023-05-31 8:47 ` Imre Deak 0 siblings, 0 replies; 41+ messages in thread From: Imre Deak @ 2023-05-31 8:47 UTC (permalink / raw) To: Rudi Heitbaum Cc: Dave Airlie, Dave Airlie, intel-gfx, Rodrigo Vivi, Joonas Lahtinen, Linus Torvalds, Daniel Vetter, dri-devel, LKML On Tue, May 30, 2023 at 01:49:07PM +0000, Rudi Heitbaum wrote: Hi Rudi, Could you open a ticket at https://gitlab.freedesktop.org/drm/intel/-/issues/new attaching a dmesg log after booting with drm.debug=0xe, with the messages from boot-up until the issue happens? Thanks, Imre > Hi Imre/Dave, > > Ref: [v4,01/14] drm/i915: Fix PIPEDMC disabling for a bigjoiner configuration > [git pull] drm fixes for 6.4-rc4 > drm-fixes-2023-05-26: > drm fixes for 6.4-rc4 > > This patch has caused a regression between 6.4-rc3 and 6.4-rc4. Other > tested kernels include 6.3.4 work fine. Dropping the patch allows the decode > playback of media via Kodi. Without dropping the patch - the media > starts and stutters then ceases to play. > > There is an additional issue that 6.4-rc4 audio playback is also failing > (where 6.4-rc3 was fine), I have not yet tracked this down. > > This is all on: > DMI: Intel(R) Client Systems NUC12WSKi7/NUC12WSBi7, BIOS WSADL357.0087.2023.0306.1931 03/06/2023 > 12th Gen Intel(R) Core(TM) i7-1260P (family: 0x6, model: 0x9a, stepping: 0x3) > microcode: updated early: 0x429 -> 0x42a, date = 2023-02-14 > > Regards > > Rudi > > On Wed, May 10, 2023 at 01:31:18PM +0300, Imre Deak wrote: > > For a bigjoiner configuration display->crtc_disable() will be called > > first for the slave CRTCs and then for the master CRTC. However slave > > CRTCs will be actually disabled only after the master CRTC is disabled > > (from the encoder disable hooks called with the master CRTC state). > > Hence the slave PIPEDMCs can be disabled only after the master CRTC is > > disabled, make this so. > > > > intel_encoders_post_pll_disable() must be called only for the master > > CRTC, as for the other two encoder disable hooks. While at it fix this > > up as well. This didn't cause a problem, since > > intel_encoders_post_pll_disable() will call the corresponding hook only > > for an encoder/connector connected to the given CRTC, however slave > > CRTCs will have no associated encoder/connector. > > > > Fixes: 3af2ff0840be ("drm/i915: Enable a PIPEDMC whenever its corresponding pipe is enabled") > > Cc: Rodrigo Vivi <rodrigo.vivi@intel.com> > > Cc: Ville Syrjälä <ville.syrjala@linux.intel.com> > > Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com> > > Signed-off-by: Imre Deak <imre.deak@intel.com> > > --- > > drivers/gpu/drm/i915/display/intel_display.c | 12 ++++++++++-- > > 1 file changed, 10 insertions(+), 2 deletions(-) > > > > diff --git a/drivers/gpu/drm/i915/display/intel_display.c b/drivers/gpu/drm/i915/display/intel_display.c > > index 1d5d42a408035..116fa52290b84 100644 > > --- a/drivers/gpu/drm/i915/display/intel_display.c > > +++ b/drivers/gpu/drm/i915/display/intel_display.c > > @@ -1702,9 +1702,17 @@ static void hsw_crtc_disable(struct intel_atomic_state *state, > > > > intel_disable_shared_dpll(old_crtc_state); > > > > - intel_encoders_post_pll_disable(state, crtc); > > + if (!intel_crtc_is_bigjoiner_slave(old_crtc_state)) { > > + struct intel_crtc *slave_crtc; > > + > > + intel_encoders_post_pll_disable(state, crtc); > > > > - intel_dmc_disable_pipe(i915, crtc->pipe); > > + intel_dmc_disable_pipe(i915, crtc->pipe); > > + > > + for_each_intel_crtc_in_pipe_mask(&i915->drm, slave_crtc, > > + intel_crtc_bigjoiner_slave_pipes(old_crtc_state)) > > + intel_dmc_disable_pipe(i915, slave_crtc->pipe); > > + } > > } > > > > static void i9xx_pfit_enable(const struct intel_crtc_state *crtc_state) ^ permalink raw reply [flat|nested] 41+ messages in thread
* Re: [Intel-gfx] [v4, 01/14] drm/i915: Fix PIPEDMC disabling for a bigjoiner configuration @ 2023-05-31 8:47 ` Imre Deak 0 siblings, 0 replies; 41+ messages in thread From: Imre Deak @ 2023-05-31 8:47 UTC (permalink / raw) To: Rudi Heitbaum Cc: Linus Torvalds, intel-gfx, LKML, dri-devel, Daniel Vetter, Rodrigo Vivi, Dave Airlie, Dave Airlie On Tue, May 30, 2023 at 01:49:07PM +0000, Rudi Heitbaum wrote: Hi Rudi, Could you open a ticket at https://gitlab.freedesktop.org/drm/intel/-/issues/new attaching a dmesg log after booting with drm.debug=0xe, with the messages from boot-up until the issue happens? Thanks, Imre > Hi Imre/Dave, > > Ref: [v4,01/14] drm/i915: Fix PIPEDMC disabling for a bigjoiner configuration > [git pull] drm fixes for 6.4-rc4 > drm-fixes-2023-05-26: > drm fixes for 6.4-rc4 > > This patch has caused a regression between 6.4-rc3 and 6.4-rc4. Other > tested kernels include 6.3.4 work fine. Dropping the patch allows the decode > playback of media via Kodi. Without dropping the patch - the media > starts and stutters then ceases to play. > > There is an additional issue that 6.4-rc4 audio playback is also failing > (where 6.4-rc3 was fine), I have not yet tracked this down. > > This is all on: > DMI: Intel(R) Client Systems NUC12WSKi7/NUC12WSBi7, BIOS WSADL357.0087.2023.0306.1931 03/06/2023 > 12th Gen Intel(R) Core(TM) i7-1260P (family: 0x6, model: 0x9a, stepping: 0x3) > microcode: updated early: 0x429 -> 0x42a, date = 2023-02-14 > > Regards > > Rudi > > On Wed, May 10, 2023 at 01:31:18PM +0300, Imre Deak wrote: > > For a bigjoiner configuration display->crtc_disable() will be called > > first for the slave CRTCs and then for the master CRTC. However slave > > CRTCs will be actually disabled only after the master CRTC is disabled > > (from the encoder disable hooks called with the master CRTC state). > > Hence the slave PIPEDMCs can be disabled only after the master CRTC is > > disabled, make this so. > > > > intel_encoders_post_pll_disable() must be called only for the master > > CRTC, as for the other two encoder disable hooks. While at it fix this > > up as well. This didn't cause a problem, since > > intel_encoders_post_pll_disable() will call the corresponding hook only > > for an encoder/connector connected to the given CRTC, however slave > > CRTCs will have no associated encoder/connector. > > > > Fixes: 3af2ff0840be ("drm/i915: Enable a PIPEDMC whenever its corresponding pipe is enabled") > > Cc: Rodrigo Vivi <rodrigo.vivi@intel.com> > > Cc: Ville Syrjälä <ville.syrjala@linux.intel.com> > > Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com> > > Signed-off-by: Imre Deak <imre.deak@intel.com> > > --- > > drivers/gpu/drm/i915/display/intel_display.c | 12 ++++++++++-- > > 1 file changed, 10 insertions(+), 2 deletions(-) > > > > diff --git a/drivers/gpu/drm/i915/display/intel_display.c b/drivers/gpu/drm/i915/display/intel_display.c > > index 1d5d42a408035..116fa52290b84 100644 > > --- a/drivers/gpu/drm/i915/display/intel_display.c > > +++ b/drivers/gpu/drm/i915/display/intel_display.c > > @@ -1702,9 +1702,17 @@ static void hsw_crtc_disable(struct intel_atomic_state *state, > > > > intel_disable_shared_dpll(old_crtc_state); > > > > - intel_encoders_post_pll_disable(state, crtc); > > + if (!intel_crtc_is_bigjoiner_slave(old_crtc_state)) { > > + struct intel_crtc *slave_crtc; > > + > > + intel_encoders_post_pll_disable(state, crtc); > > > > - intel_dmc_disable_pipe(i915, crtc->pipe); > > + intel_dmc_disable_pipe(i915, crtc->pipe); > > + > > + for_each_intel_crtc_in_pipe_mask(&i915->drm, slave_crtc, > > + intel_crtc_bigjoiner_slave_pipes(old_crtc_state)) > > + intel_dmc_disable_pipe(i915, slave_crtc->pipe); > > + } > > } > > > > static void i9xx_pfit_enable(const struct intel_crtc_state *crtc_state) ^ permalink raw reply [flat|nested] 41+ messages in thread
* Re: [v4,01/14] drm/i915: Fix PIPEDMC disabling for a bigjoiner configuration 2023-05-31 8:47 ` [Intel-gfx] [v4, 01/14] " Imre Deak (?) @ 2023-05-31 11:31 ` Rudi Heitbaum -1 siblings, 0 replies; 41+ messages in thread From: Rudi Heitbaum @ 2023-05-31 11:31 UTC (permalink / raw) To: imre.deak Cc: Dave Airlie, Dave Airlie, intel-gfx, Rodrigo Vivi, Joonas Lahtinen, Linus Torvalds, Daniel Vetter, dri-devel, LKML Hi Imre, Raised the ticket and was able to capture the logs for you. https://gitlab.freedesktop.org/drm/intel/-/issues/8559 Thanks Rudi On Wed, 31 May 2023 at 18:47, Imre Deak <imre.deak@intel.com> wrote: > > On Tue, May 30, 2023 at 01:49:07PM +0000, Rudi Heitbaum wrote: > Hi Rudi, > > Could you open a ticket at > https://gitlab.freedesktop.org/drm/intel/-/issues/new > > attaching a dmesg log after booting with drm.debug=0xe, with the > messages from boot-up until the issue happens? > > Thanks, > Imre > > > Hi Imre/Dave, > > > > Ref: [v4,01/14] drm/i915: Fix PIPEDMC disabling for a bigjoiner configuration > > [git pull] drm fixes for 6.4-rc4 > > drm-fixes-2023-05-26: > > drm fixes for 6.4-rc4 > > > > This patch has caused a regression between 6.4-rc3 and 6.4-rc4. Other > > tested kernels include 6.3.4 work fine. Dropping the patch allows the decode > > playback of media via Kodi. Without dropping the patch - the media > > starts and stutters then ceases to play. > > > > There is an additional issue that 6.4-rc4 audio playback is also failing > > (where 6.4-rc3 was fine), I have not yet tracked this down. > > > > This is all on: > > DMI: Intel(R) Client Systems NUC12WSKi7/NUC12WSBi7, BIOS WSADL357.0087.2023.0306.1931 03/06/2023 > > 12th Gen Intel(R) Core(TM) i7-1260P (family: 0x6, model: 0x9a, stepping: 0x3) > > microcode: updated early: 0x429 -> 0x42a, date = 2023-02-14 > > > > Regards > > > > Rudi > > > > On Wed, May 10, 2023 at 01:31:18PM +0300, Imre Deak wrote: > > > For a bigjoiner configuration display->crtc_disable() will be called > > > first for the slave CRTCs and then for the master CRTC. However slave > > > CRTCs will be actually disabled only after the master CRTC is disabled > > > (from the encoder disable hooks called with the master CRTC state). > > > Hence the slave PIPEDMCs can be disabled only after the master CRTC is > > > disabled, make this so. > > > > > > intel_encoders_post_pll_disable() must be called only for the master > > > CRTC, as for the other two encoder disable hooks. While at it fix this > > > up as well. This didn't cause a problem, since > > > intel_encoders_post_pll_disable() will call the corresponding hook only > > > for an encoder/connector connected to the given CRTC, however slave > > > CRTCs will have no associated encoder/connector. > > > > > > Fixes: 3af2ff0840be ("drm/i915: Enable a PIPEDMC whenever its corresponding pipe is enabled") > > > Cc: Rodrigo Vivi <rodrigo.vivi@intel.com> > > > Cc: Ville Syrjälä <ville.syrjala@linux.intel.com> > > > Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com> > > > Signed-off-by: Imre Deak <imre.deak@intel.com> > > > --- > > > drivers/gpu/drm/i915/display/intel_display.c | 12 ++++++++++-- > > > 1 file changed, 10 insertions(+), 2 deletions(-) > > > > > > diff --git a/drivers/gpu/drm/i915/display/intel_display.c b/drivers/gpu/drm/i915/display/intel_display.c > > > index 1d5d42a408035..116fa52290b84 100644 > > > --- a/drivers/gpu/drm/i915/display/intel_display.c > > > +++ b/drivers/gpu/drm/i915/display/intel_display.c > > > @@ -1702,9 +1702,17 @@ static void hsw_crtc_disable(struct intel_atomic_state *state, > > > > > > intel_disable_shared_dpll(old_crtc_state); > > > > > > - intel_encoders_post_pll_disable(state, crtc); > > > + if (!intel_crtc_is_bigjoiner_slave(old_crtc_state)) { > > > + struct intel_crtc *slave_crtc; > > > + > > > + intel_encoders_post_pll_disable(state, crtc); > > > > > > - intel_dmc_disable_pipe(i915, crtc->pipe); > > > + intel_dmc_disable_pipe(i915, crtc->pipe); > > > + > > > + for_each_intel_crtc_in_pipe_mask(&i915->drm, slave_crtc, > > > + intel_crtc_bigjoiner_slave_pipes(old_crtc_state)) > > > + intel_dmc_disable_pipe(i915, slave_crtc->pipe); > > > + } > > > } > > > > > > static void i9xx_pfit_enable(const struct intel_crtc_state *crtc_state) ^ permalink raw reply [flat|nested] 41+ messages in thread
* Re: [Intel-gfx] [v4, 01/14] drm/i915: Fix PIPEDMC disabling for a bigjoiner configuration @ 2023-05-31 11:31 ` Rudi Heitbaum 0 siblings, 0 replies; 41+ messages in thread From: Rudi Heitbaum @ 2023-05-31 11:31 UTC (permalink / raw) To: imre.deak Cc: Linus Torvalds, intel-gfx, LKML, dri-devel, Daniel Vetter, Rodrigo Vivi, Dave Airlie, Dave Airlie Hi Imre, Raised the ticket and was able to capture the logs for you. https://gitlab.freedesktop.org/drm/intel/-/issues/8559 Thanks Rudi On Wed, 31 May 2023 at 18:47, Imre Deak <imre.deak@intel.com> wrote: > > On Tue, May 30, 2023 at 01:49:07PM +0000, Rudi Heitbaum wrote: > Hi Rudi, > > Could you open a ticket at > https://gitlab.freedesktop.org/drm/intel/-/issues/new > > attaching a dmesg log after booting with drm.debug=0xe, with the > messages from boot-up until the issue happens? > > Thanks, > Imre > > > Hi Imre/Dave, > > > > Ref: [v4,01/14] drm/i915: Fix PIPEDMC disabling for a bigjoiner configuration > > [git pull] drm fixes for 6.4-rc4 > > drm-fixes-2023-05-26: > > drm fixes for 6.4-rc4 > > > > This patch has caused a regression between 6.4-rc3 and 6.4-rc4. Other > > tested kernels include 6.3.4 work fine. Dropping the patch allows the decode > > playback of media via Kodi. Without dropping the patch - the media > > starts and stutters then ceases to play. > > > > There is an additional issue that 6.4-rc4 audio playback is also failing > > (where 6.4-rc3 was fine), I have not yet tracked this down. > > > > This is all on: > > DMI: Intel(R) Client Systems NUC12WSKi7/NUC12WSBi7, BIOS WSADL357.0087.2023.0306.1931 03/06/2023 > > 12th Gen Intel(R) Core(TM) i7-1260P (family: 0x6, model: 0x9a, stepping: 0x3) > > microcode: updated early: 0x429 -> 0x42a, date = 2023-02-14 > > > > Regards > > > > Rudi > > > > On Wed, May 10, 2023 at 01:31:18PM +0300, Imre Deak wrote: > > > For a bigjoiner configuration display->crtc_disable() will be called > > > first for the slave CRTCs and then for the master CRTC. However slave > > > CRTCs will be actually disabled only after the master CRTC is disabled > > > (from the encoder disable hooks called with the master CRTC state). > > > Hence the slave PIPEDMCs can be disabled only after the master CRTC is > > > disabled, make this so. > > > > > > intel_encoders_post_pll_disable() must be called only for the master > > > CRTC, as for the other two encoder disable hooks. While at it fix this > > > up as well. This didn't cause a problem, since > > > intel_encoders_post_pll_disable() will call the corresponding hook only > > > for an encoder/connector connected to the given CRTC, however slave > > > CRTCs will have no associated encoder/connector. > > > > > > Fixes: 3af2ff0840be ("drm/i915: Enable a PIPEDMC whenever its corresponding pipe is enabled") > > > Cc: Rodrigo Vivi <rodrigo.vivi@intel.com> > > > Cc: Ville Syrjälä <ville.syrjala@linux.intel.com> > > > Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com> > > > Signed-off-by: Imre Deak <imre.deak@intel.com> > > > --- > > > drivers/gpu/drm/i915/display/intel_display.c | 12 ++++++++++-- > > > 1 file changed, 10 insertions(+), 2 deletions(-) > > > > > > diff --git a/drivers/gpu/drm/i915/display/intel_display.c b/drivers/gpu/drm/i915/display/intel_display.c > > > index 1d5d42a408035..116fa52290b84 100644 > > > --- a/drivers/gpu/drm/i915/display/intel_display.c > > > +++ b/drivers/gpu/drm/i915/display/intel_display.c > > > @@ -1702,9 +1702,17 @@ static void hsw_crtc_disable(struct intel_atomic_state *state, > > > > > > intel_disable_shared_dpll(old_crtc_state); > > > > > > - intel_encoders_post_pll_disable(state, crtc); > > > + if (!intel_crtc_is_bigjoiner_slave(old_crtc_state)) { > > > + struct intel_crtc *slave_crtc; > > > + > > > + intel_encoders_post_pll_disable(state, crtc); > > > > > > - intel_dmc_disable_pipe(i915, crtc->pipe); > > > + intel_dmc_disable_pipe(i915, crtc->pipe); > > > + > > > + for_each_intel_crtc_in_pipe_mask(&i915->drm, slave_crtc, > > > + intel_crtc_bigjoiner_slave_pipes(old_crtc_state)) > > > + intel_dmc_disable_pipe(i915, slave_crtc->pipe); > > > + } > > > } > > > > > > static void i9xx_pfit_enable(const struct intel_crtc_state *crtc_state) ^ permalink raw reply [flat|nested] 41+ messages in thread
* Re: [v4, 01/14] drm/i915: Fix PIPEDMC disabling for a bigjoiner configuration @ 2023-05-31 11:31 ` Rudi Heitbaum 0 siblings, 0 replies; 41+ messages in thread From: Rudi Heitbaum @ 2023-05-31 11:31 UTC (permalink / raw) To: imre.deak Cc: Linus Torvalds, intel-gfx, LKML, dri-devel, Daniel Vetter, Rodrigo Vivi, Dave Airlie Hi Imre, Raised the ticket and was able to capture the logs for you. https://gitlab.freedesktop.org/drm/intel/-/issues/8559 Thanks Rudi On Wed, 31 May 2023 at 18:47, Imre Deak <imre.deak@intel.com> wrote: > > On Tue, May 30, 2023 at 01:49:07PM +0000, Rudi Heitbaum wrote: > Hi Rudi, > > Could you open a ticket at > https://gitlab.freedesktop.org/drm/intel/-/issues/new > > attaching a dmesg log after booting with drm.debug=0xe, with the > messages from boot-up until the issue happens? > > Thanks, > Imre > > > Hi Imre/Dave, > > > > Ref: [v4,01/14] drm/i915: Fix PIPEDMC disabling for a bigjoiner configuration > > [git pull] drm fixes for 6.4-rc4 > > drm-fixes-2023-05-26: > > drm fixes for 6.4-rc4 > > > > This patch has caused a regression between 6.4-rc3 and 6.4-rc4. Other > > tested kernels include 6.3.4 work fine. Dropping the patch allows the decode > > playback of media via Kodi. Without dropping the patch - the media > > starts and stutters then ceases to play. > > > > There is an additional issue that 6.4-rc4 audio playback is also failing > > (where 6.4-rc3 was fine), I have not yet tracked this down. > > > > This is all on: > > DMI: Intel(R) Client Systems NUC12WSKi7/NUC12WSBi7, BIOS WSADL357.0087.2023.0306.1931 03/06/2023 > > 12th Gen Intel(R) Core(TM) i7-1260P (family: 0x6, model: 0x9a, stepping: 0x3) > > microcode: updated early: 0x429 -> 0x42a, date = 2023-02-14 > > > > Regards > > > > Rudi > > > > On Wed, May 10, 2023 at 01:31:18PM +0300, Imre Deak wrote: > > > For a bigjoiner configuration display->crtc_disable() will be called > > > first for the slave CRTCs and then for the master CRTC. However slave > > > CRTCs will be actually disabled only after the master CRTC is disabled > > > (from the encoder disable hooks called with the master CRTC state). > > > Hence the slave PIPEDMCs can be disabled only after the master CRTC is > > > disabled, make this so. > > > > > > intel_encoders_post_pll_disable() must be called only for the master > > > CRTC, as for the other two encoder disable hooks. While at it fix this > > > up as well. This didn't cause a problem, since > > > intel_encoders_post_pll_disable() will call the corresponding hook only > > > for an encoder/connector connected to the given CRTC, however slave > > > CRTCs will have no associated encoder/connector. > > > > > > Fixes: 3af2ff0840be ("drm/i915: Enable a PIPEDMC whenever its corresponding pipe is enabled") > > > Cc: Rodrigo Vivi <rodrigo.vivi@intel.com> > > > Cc: Ville Syrjälä <ville.syrjala@linux.intel.com> > > > Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com> > > > Signed-off-by: Imre Deak <imre.deak@intel.com> > > > --- > > > drivers/gpu/drm/i915/display/intel_display.c | 12 ++++++++++-- > > > 1 file changed, 10 insertions(+), 2 deletions(-) > > > > > > diff --git a/drivers/gpu/drm/i915/display/intel_display.c b/drivers/gpu/drm/i915/display/intel_display.c > > > index 1d5d42a408035..116fa52290b84 100644 > > > --- a/drivers/gpu/drm/i915/display/intel_display.c > > > +++ b/drivers/gpu/drm/i915/display/intel_display.c > > > @@ -1702,9 +1702,17 @@ static void hsw_crtc_disable(struct intel_atomic_state *state, > > > > > > intel_disable_shared_dpll(old_crtc_state); > > > > > > - intel_encoders_post_pll_disable(state, crtc); > > > + if (!intel_crtc_is_bigjoiner_slave(old_crtc_state)) { > > > + struct intel_crtc *slave_crtc; > > > + > > > + intel_encoders_post_pll_disable(state, crtc); > > > > > > - intel_dmc_disable_pipe(i915, crtc->pipe); > > > + intel_dmc_disable_pipe(i915, crtc->pipe); > > > + > > > + for_each_intel_crtc_in_pipe_mask(&i915->drm, slave_crtc, > > > + intel_crtc_bigjoiner_slave_pipes(old_crtc_state)) > > > + intel_dmc_disable_pipe(i915, slave_crtc->pipe); > > > + } > > > } > > > > > > static void i9xx_pfit_enable(const struct intel_crtc_state *crtc_state) ^ permalink raw reply [flat|nested] 41+ messages in thread
* [Intel-gfx] [PATCH v4 02/14] drm/i915: Add helpers to reference/unreference a DPLL for a CRTC 2023-05-10 10:31 [Intel-gfx] [PATCH v4 00/14] drm/i915/tc: Add a workaround for an IOM/TCSS firmware hang issue Imre Deak 2023-05-10 10:31 ` [Intel-gfx] [PATCH v4 01/14] drm/i915: Fix PIPEDMC disabling for a bigjoiner configuration Imre Deak @ 2023-05-10 10:31 ` Imre Deak 2023-05-10 10:31 ` [Intel-gfx] [PATCH v4 03/14] drm/i915: Make the CRTC state consistent during sanitize-disabling Imre Deak ` (19 subsequent siblings) 21 siblings, 0 replies; 41+ messages in thread From: Imre Deak @ 2023-05-10 10:31 UTC (permalink / raw) To: intel-gfx Add helpers to reference/unreference a shared DPLL tracking the use of it by a given CRTC. This prepares for the next patch, which unreferences a DPLL during CRTC HW-readout/sanitization. Suggested-by: Ville Syrjälä <ville.syrjala@linux.intel.com> Cc: Ville Syrjälä <ville.syrjala@linux.intel.com> Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com> Signed-off-by: Imre Deak <imre.deak@intel.com> --- drivers/gpu/drm/i915/display/intel_dpll_mgr.c | 58 +++++++++++++++---- 1 file changed, 46 insertions(+), 12 deletions(-) diff --git a/drivers/gpu/drm/i915/display/intel_dpll_mgr.c b/drivers/gpu/drm/i915/display/intel_dpll_mgr.c index ed372d227aa73..84ebe66012b1d 100644 --- a/drivers/gpu/drm/i915/display/intel_dpll_mgr.c +++ b/drivers/gpu/drm/i915/display/intel_dpll_mgr.c @@ -351,13 +351,35 @@ intel_find_shared_dpll(struct intel_atomic_state *state, return NULL; } +/** + * intel_reference_shared_dpll_crtc - Get a DPLL reference for a CRTC + * @crtc: CRTC on which behalf the reference is taken + * @pll: DPLL for which the reference is taken + * @shared_dpll_state: the DPLL atomic state in which the reference is tracked + * + * Take a reference for @pll tracking the use of it by @crtc. + */ +static void +intel_reference_shared_dpll_crtc(const struct intel_crtc *crtc, + const struct intel_shared_dpll *pll, + struct intel_shared_dpll_state *shared_dpll_state) +{ + struct drm_i915_private *i915 = to_i915(crtc->base.dev); + + drm_WARN_ON(&i915->drm, (shared_dpll_state->pipe_mask & BIT(crtc->pipe)) != 0); + + shared_dpll_state->pipe_mask |= BIT(crtc->pipe); + + drm_dbg_kms(&i915->drm, "[CRTC:%d:%s] reserving %s\n", + crtc->base.base.id, crtc->base.name, pll->info->name); +} + static void intel_reference_shared_dpll(struct intel_atomic_state *state, const struct intel_crtc *crtc, const struct intel_shared_dpll *pll, const struct intel_dpll_hw_state *pll_state) { - struct drm_i915_private *i915 = to_i915(state->base.dev); struct intel_shared_dpll_state *shared_dpll; const enum intel_dpll_id id = pll->info->id; @@ -366,11 +388,29 @@ intel_reference_shared_dpll(struct intel_atomic_state *state, if (shared_dpll[id].pipe_mask == 0) shared_dpll[id].hw_state = *pll_state; - drm_WARN_ON(&i915->drm, (shared_dpll[id].pipe_mask & BIT(crtc->pipe)) != 0); + intel_reference_shared_dpll_crtc(crtc, pll, &shared_dpll[id]); +} + +/** + * intel_unreference_shared_dpll_crtc - Drop a DPLL reference for a CRTC + * @crtc: CRTC on which behalf the reference is dropped + * @pll: DPLL for which the reference is dropped + * @shared_dpll_state: the DPLL atomic state in which the reference is tracked + * + * Drop a reference for @pll tracking the end of use of it by @crtc. + */ +static void +intel_unreference_shared_dpll_crtc(const struct intel_crtc *crtc, + const struct intel_shared_dpll *pll, + struct intel_shared_dpll_state *shared_dpll_state) +{ + struct drm_i915_private *i915 = to_i915(crtc->base.dev); - shared_dpll[id].pipe_mask |= BIT(crtc->pipe); + drm_WARN_ON(&i915->drm, (shared_dpll_state->pipe_mask & BIT(crtc->pipe)) == 0); - drm_dbg_kms(&i915->drm, "[CRTC:%d:%s] reserving %s\n", + shared_dpll_state->pipe_mask &= ~BIT(crtc->pipe); + + drm_dbg_kms(&i915->drm, "[CRTC:%d:%s] releasing %s\n", crtc->base.base.id, crtc->base.name, pll->info->name); } @@ -378,18 +418,12 @@ static void intel_unreference_shared_dpll(struct intel_atomic_state *state, const struct intel_crtc *crtc, const struct intel_shared_dpll *pll) { - struct drm_i915_private *i915 = to_i915(state->base.dev); struct intel_shared_dpll_state *shared_dpll; const enum intel_dpll_id id = pll->info->id; shared_dpll = intel_atomic_get_shared_dpll_state(&state->base); - drm_WARN_ON(&i915->drm, (shared_dpll[id].pipe_mask & BIT(crtc->pipe)) == 0); - - shared_dpll[id].pipe_mask &= ~BIT(crtc->pipe); - - drm_dbg_kms(&i915->drm, "[CRTC:%d:%s] releasing %s\n", - crtc->base.base.id, crtc->base.name, pll->info->name); + intel_unreference_shared_dpll_crtc(crtc, pll, &shared_dpll[id]); } static void intel_put_dpll(struct intel_atomic_state *state, @@ -4314,7 +4348,7 @@ static void readout_dpll_hw_state(struct drm_i915_private *i915, to_intel_crtc_state(crtc->base.state); if (crtc_state->hw.active && crtc_state->shared_dpll == pll) - pll->state.pipe_mask |= BIT(crtc->pipe); + intel_reference_shared_dpll_crtc(crtc, pll, &pll->state); } pll->active_mask = pll->state.pipe_mask; -- 2.37.2 ^ permalink raw reply related [flat|nested] 41+ messages in thread
* [Intel-gfx] [PATCH v4 03/14] drm/i915: Make the CRTC state consistent during sanitize-disabling 2023-05-10 10:31 [Intel-gfx] [PATCH v4 00/14] drm/i915/tc: Add a workaround for an IOM/TCSS firmware hang issue Imre Deak 2023-05-10 10:31 ` [Intel-gfx] [PATCH v4 01/14] drm/i915: Fix PIPEDMC disabling for a bigjoiner configuration Imre Deak 2023-05-10 10:31 ` [Intel-gfx] [PATCH v4 02/14] drm/i915: Add helpers to reference/unreference a DPLL for a CRTC Imre Deak @ 2023-05-10 10:31 ` Imre Deak 2023-05-10 10:31 ` [Intel-gfx] [PATCH v4 04/14] drm/i915: Update connector atomic state before crtc sanitize-disabling Imre Deak ` (18 subsequent siblings) 21 siblings, 0 replies; 41+ messages in thread From: Imre Deak @ 2023-05-10 10:31 UTC (permalink / raw) To: intel-gfx Make sure that the CRTC state is reset correctly, as expected after disabling the CRTC. In particular this change will: - Zero all the CSC blob pointers after intel_crtc_free_hw_state() has freed them. - Zero the shared DPLL and port PLL pointers and clear the corresponding CRTC reference flag in the PLL state. - Reset all the transcoder and pipe fields. v2: - Reset fully the CRTC state. (Ville) - Clear pipe active flags in the DPLL state. v3: - Clear only the CRTC reference flag and add a helper for this. (Ville) v4: - Rebased on previous patch, adding intel_unreference_shared_dpll_crtc() separately. (Ville) Cc: Ville Syrjälä <ville.syrjala@linux.intel.com> Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com> Signed-off-by: Imre Deak <imre.deak@intel.com> --- drivers/gpu/drm/i915/display/intel_dpll_mgr.c | 2 +- drivers/gpu/drm/i915/display/intel_dpll_mgr.h | 3 +++ drivers/gpu/drm/i915/display/intel_modeset_setup.c | 13 +++++++------ 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/drivers/gpu/drm/i915/display/intel_dpll_mgr.c b/drivers/gpu/drm/i915/display/intel_dpll_mgr.c index 84ebe66012b1d..f603ab1e9a0e2 100644 --- a/drivers/gpu/drm/i915/display/intel_dpll_mgr.c +++ b/drivers/gpu/drm/i915/display/intel_dpll_mgr.c @@ -399,7 +399,7 @@ intel_reference_shared_dpll(struct intel_atomic_state *state, * * Drop a reference for @pll tracking the end of use of it by @crtc. */ -static void +void intel_unreference_shared_dpll_crtc(const struct intel_crtc *crtc, const struct intel_shared_dpll *pll, struct intel_shared_dpll_state *shared_dpll_state) diff --git a/drivers/gpu/drm/i915/display/intel_dpll_mgr.h b/drivers/gpu/drm/i915/display/intel_dpll_mgr.h index 3854f1b4299ac..ba62eb5d7c517 100644 --- a/drivers/gpu/drm/i915/display/intel_dpll_mgr.h +++ b/drivers/gpu/drm/i915/display/intel_dpll_mgr.h @@ -341,6 +341,9 @@ int intel_reserve_shared_dplls(struct intel_atomic_state *state, struct intel_encoder *encoder); void intel_release_shared_dplls(struct intel_atomic_state *state, struct intel_crtc *crtc); +void intel_unreference_shared_dpll_crtc(const struct intel_crtc *crtc, + const struct intel_shared_dpll *pll, + struct intel_shared_dpll_state *shared_dpll_state); void icl_set_active_port_dpll(struct intel_crtc_state *crtc_state, enum icl_port_dpll_id port_dpll_id); void intel_update_active_dpll(struct intel_atomic_state *state, diff --git a/drivers/gpu/drm/i915/display/intel_modeset_setup.c b/drivers/gpu/drm/i915/display/intel_modeset_setup.c index eefa4018dc0c2..6e55806bbe066 100644 --- a/drivers/gpu/drm/i915/display/intel_modeset_setup.c +++ b/drivers/gpu/drm/i915/display/intel_modeset_setup.c @@ -88,13 +88,14 @@ static void intel_crtc_disable_noatomic(struct intel_crtc *crtc, crtc->active = false; crtc->base.enabled = false; - drm_WARN_ON(&i915->drm, - drm_atomic_set_mode_for_crtc(&crtc_state->uapi, NULL) < 0); - crtc_state->uapi.active = false; - crtc_state->uapi.connector_mask = 0; - crtc_state->uapi.encoder_mask = 0; + if (crtc_state->shared_dpll) + intel_unreference_shared_dpll_crtc(crtc, + crtc_state->shared_dpll, + &crtc_state->shared_dpll->state); + + __drm_atomic_helper_crtc_destroy_state(&crtc_state->uapi); intel_crtc_free_hw_state(crtc_state); - memset(&crtc_state->hw, 0, sizeof(crtc_state->hw)); + intel_crtc_state_reset(crtc_state, crtc); for_each_encoder_on_crtc(&i915->drm, &crtc->base, encoder) encoder->base.crtc = NULL; -- 2.37.2 ^ permalink raw reply related [flat|nested] 41+ messages in thread
* [Intel-gfx] [PATCH v4 04/14] drm/i915: Update connector atomic state before crtc sanitize-disabling 2023-05-10 10:31 [Intel-gfx] [PATCH v4 00/14] drm/i915/tc: Add a workaround for an IOM/TCSS firmware hang issue Imre Deak ` (2 preceding siblings ...) 2023-05-10 10:31 ` [Intel-gfx] [PATCH v4 03/14] drm/i915: Make the CRTC state consistent during sanitize-disabling Imre Deak @ 2023-05-10 10:31 ` Imre Deak 2023-05-10 10:31 ` [Intel-gfx] [PATCH v4 05/14] drm/i915: Separate intel_crtc_disable_noatomic_begin/complete() Imre Deak ` (17 subsequent siblings) 21 siblings, 0 replies; 41+ messages in thread From: Imre Deak @ 2023-05-10 10:31 UTC (permalink / raw) To: intel-gfx During HW state readout/sanitization an up-to-date connector atomic state will be required by a follow-up patch, which can disable CRTCs with an encoder (and calling the correct encoder hooks happens via the connector atomic state encoder pointer). So update the connector state already before the CRTC sanitize/disable step. For now this doesn't make a difference, since intel_modeset_update_connector_atomic_state() will update/enable the atomic state only for connectors that have an enabled encoder/CRTC. Such CRTCs/encoders will not be affected by intel_sanitize_crtc(). v2: Add comment about why the connector state needs to be up-to-date. Cc: Ville Syrjälä <ville.syrjala@linux.intel.com> Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com> Signed-off-by: Imre Deak <imre.deak@intel.com> --- drivers/gpu/drm/i915/display/intel_modeset_setup.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/i915/display/intel_modeset_setup.c b/drivers/gpu/drm/i915/display/intel_modeset_setup.c index 6e55806bbe066..66796e8eef90a 100644 --- a/drivers/gpu/drm/i915/display/intel_modeset_setup.c +++ b/drivers/gpu/drm/i915/display/intel_modeset_setup.c @@ -701,6 +701,12 @@ void intel_modeset_setup_hw_state(struct drm_i915_private *i915, for_each_intel_encoder(&i915->drm, encoder) intel_sanitize_encoder(encoder); + /* + * Sanitizing CRTCs needs their connector atomic state to be + * up-to-date, so ensure that already here. + */ + intel_modeset_update_connector_atomic_state(i915); + for_each_intel_crtc(&i915->drm, crtc) { struct intel_crtc_state *crtc_state = to_intel_crtc_state(crtc->base.state); @@ -709,8 +715,6 @@ void intel_modeset_setup_hw_state(struct drm_i915_private *i915, intel_crtc_state_dump(crtc_state, NULL, "setup_hw_state"); } - intel_modeset_update_connector_atomic_state(i915); - intel_dpll_sanitize_state(i915); intel_wm_get_hw_state(i915); -- 2.37.2 ^ permalink raw reply related [flat|nested] 41+ messages in thread
* [Intel-gfx] [PATCH v4 05/14] drm/i915: Separate intel_crtc_disable_noatomic_begin/complete() 2023-05-10 10:31 [Intel-gfx] [PATCH v4 00/14] drm/i915/tc: Add a workaround for an IOM/TCSS firmware hang issue Imre Deak ` (3 preceding siblings ...) 2023-05-10 10:31 ` [Intel-gfx] [PATCH v4 04/14] drm/i915: Update connector atomic state before crtc sanitize-disabling Imre Deak @ 2023-05-10 10:31 ` Imre Deak 2023-05-10 10:31 ` [Intel-gfx] [PATCH v4 06/14] drm/i915: Factor out set_encoder_for_connector() Imre Deak ` (16 subsequent siblings) 21 siblings, 0 replies; 41+ messages in thread From: Imre Deak @ 2023-05-10 10:31 UTC (permalink / raw) To: intel-gfx Split calling the CRTC/encoder disabling hooks and updating the CRTC and DPLL object states from updating the CRTC and atomic state and other global state (BW, CDCLK, DBUF) into separate functions. When disabling a bigjoiner configuration the latter step can be done only after all the linked pipes are disabled, so this change prepares for that. No functional changes. Cc: Ville Syrjälä <ville.syrjala@linux.intel.com> Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com> Signed-off-by: Imre Deak <imre.deak@intel.com> --- .../drm/i915/display/intel_modeset_setup.c | 34 +++++++++++++------ 1 file changed, 24 insertions(+), 10 deletions(-) diff --git a/drivers/gpu/drm/i915/display/intel_modeset_setup.c b/drivers/gpu/drm/i915/display/intel_modeset_setup.c index 66796e8eef90a..2c93f4c5dc8cf 100644 --- a/drivers/gpu/drm/i915/display/intel_modeset_setup.c +++ b/drivers/gpu/drm/i915/display/intel_modeset_setup.c @@ -30,23 +30,15 @@ #include "intel_wm.h" #include "skl_watermark.h" -static void intel_crtc_disable_noatomic(struct intel_crtc *crtc, - struct drm_modeset_acquire_ctx *ctx) +static void intel_crtc_disable_noatomic_begin(struct intel_crtc *crtc, + struct drm_modeset_acquire_ctx *ctx) { - struct intel_encoder *encoder; struct drm_i915_private *i915 = to_i915(crtc->base.dev); - struct intel_bw_state *bw_state = - to_intel_bw_state(i915->display.bw.obj.state); - struct intel_cdclk_state *cdclk_state = - to_intel_cdclk_state(i915->display.cdclk.obj.state); - struct intel_dbuf_state *dbuf_state = - to_intel_dbuf_state(i915->display.dbuf.obj.state); struct intel_crtc_state *crtc_state = to_intel_crtc_state(crtc->base.state); struct intel_plane *plane; struct drm_atomic_state *state; struct intel_crtc_state *temp_crtc_state; - enum pipe pipe = crtc->pipe; int ret; if (!crtc_state->hw.active) @@ -92,6 +84,21 @@ static void intel_crtc_disable_noatomic(struct intel_crtc *crtc, intel_unreference_shared_dpll_crtc(crtc, crtc_state->shared_dpll, &crtc_state->shared_dpll->state); +} + +static void intel_crtc_disable_noatomic_complete(struct intel_crtc *crtc) +{ + struct intel_encoder *encoder; + struct drm_i915_private *i915 = to_i915(crtc->base.dev); + struct intel_bw_state *bw_state = + to_intel_bw_state(i915->display.bw.obj.state); + struct intel_cdclk_state *cdclk_state = + to_intel_cdclk_state(i915->display.cdclk.obj.state); + struct intel_dbuf_state *dbuf_state = + to_intel_dbuf_state(i915->display.dbuf.obj.state); + struct intel_crtc_state *crtc_state = + to_intel_crtc_state(crtc->base.state); + enum pipe pipe = crtc->pipe; __drm_atomic_helper_crtc_destroy_state(&crtc_state->uapi); intel_crtc_free_hw_state(crtc_state); @@ -115,6 +122,13 @@ static void intel_crtc_disable_noatomic(struct intel_crtc *crtc, bw_state->num_active_planes[pipe] = 0; } +static void intel_crtc_disable_noatomic(struct intel_crtc *crtc, + struct drm_modeset_acquire_ctx *ctx) +{ + intel_crtc_disable_noatomic_begin(crtc, ctx); + intel_crtc_disable_noatomic_complete(crtc); +} + static void intel_modeset_update_connector_atomic_state(struct drm_i915_private *i915) { struct intel_connector *connector; -- 2.37.2 ^ permalink raw reply related [flat|nested] 41+ messages in thread
* [Intel-gfx] [PATCH v4 06/14] drm/i915: Factor out set_encoder_for_connector() 2023-05-10 10:31 [Intel-gfx] [PATCH v4 00/14] drm/i915/tc: Add a workaround for an IOM/TCSS firmware hang issue Imre Deak ` (4 preceding siblings ...) 2023-05-10 10:31 ` [Intel-gfx] [PATCH v4 05/14] drm/i915: Separate intel_crtc_disable_noatomic_begin/complete() Imre Deak @ 2023-05-10 10:31 ` Imre Deak 2023-05-10 10:31 ` [Intel-gfx] [PATCH v4 07/14] drm/i915: Add support for disabling any CRTCs during HW readout/sanitization Imre Deak ` (15 subsequent siblings) 21 siblings, 0 replies; 41+ messages in thread From: Imre Deak @ 2023-05-10 10:31 UTC (permalink / raw) To: intel-gfx Factor out a function setting the encoder and CRTC in the connector atomic state, required by a follow up patch. No functional changes. Cc: Ville Syrjälä <ville.syrjala@linux.intel.com> Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com> Signed-off-by: Imre Deak <imre.deak@intel.com> --- .../drm/i915/display/intel_modeset_setup.c | 28 +++++++++++++------ 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/drivers/gpu/drm/i915/display/intel_modeset_setup.c b/drivers/gpu/drm/i915/display/intel_modeset_setup.c index 2c93f4c5dc8cf..6f59654ea0261 100644 --- a/drivers/gpu/drm/i915/display/intel_modeset_setup.c +++ b/drivers/gpu/drm/i915/display/intel_modeset_setup.c @@ -86,6 +86,24 @@ static void intel_crtc_disable_noatomic_begin(struct intel_crtc *crtc, &crtc_state->shared_dpll->state); } +static void set_encoder_for_connector(struct intel_connector *connector, + struct intel_encoder *encoder) +{ + struct drm_connector_state *conn_state = connector->base.state; + + if (conn_state->crtc) + drm_connector_put(&connector->base); + + if (encoder) { + conn_state->best_encoder = &encoder->base; + conn_state->crtc = encoder->base.crtc; + drm_connector_get(&connector->base); + } else { + conn_state->best_encoder = NULL; + conn_state->crtc = NULL; + } +} + static void intel_crtc_disable_noatomic_complete(struct intel_crtc *crtc) { struct intel_encoder *encoder; @@ -140,8 +158,7 @@ static void intel_modeset_update_connector_atomic_state(struct drm_i915_private struct intel_encoder *encoder = to_intel_encoder(connector->base.encoder); - if (conn_state->crtc) - drm_connector_put(&connector->base); + set_encoder_for_connector(connector, encoder); if (encoder) { struct intel_crtc *crtc = @@ -149,14 +166,7 @@ static void intel_modeset_update_connector_atomic_state(struct drm_i915_private const struct intel_crtc_state *crtc_state = to_intel_crtc_state(crtc->base.state); - conn_state->best_encoder = &encoder->base; - conn_state->crtc = &crtc->base; conn_state->max_bpc = (crtc_state->pipe_bpp ?: 24) / 3; - - drm_connector_get(&connector->base); - } else { - conn_state->best_encoder = NULL; - conn_state->crtc = NULL; } } drm_connector_list_iter_end(&conn_iter); -- 2.37.2 ^ permalink raw reply related [flat|nested] 41+ messages in thread
* [Intel-gfx] [PATCH v4 07/14] drm/i915: Add support for disabling any CRTCs during HW readout/sanitization 2023-05-10 10:31 [Intel-gfx] [PATCH v4 00/14] drm/i915/tc: Add a workaround for an IOM/TCSS firmware hang issue Imre Deak ` (5 preceding siblings ...) 2023-05-10 10:31 ` [Intel-gfx] [PATCH v4 06/14] drm/i915: Factor out set_encoder_for_connector() Imre Deak @ 2023-05-10 10:31 ` Imre Deak 2023-05-10 10:31 ` [Intel-gfx] [PATCH v4 08/14] drm/i915/dp: Add link training debug and error printing helpers Imre Deak ` (14 subsequent siblings) 21 siblings, 0 replies; 41+ messages in thread From: Imre Deak @ 2023-05-10 10:31 UTC (permalink / raw) To: intel-gfx During HW readout/sanitization CRTCs can be disabled only if they don't have an attached encoder (and so the encoder disable hooks don't need to be called). An upcoming patch will need to disable CRTCs also with an attached encoder, so add support for this. For bigjoiner configs the encoder disabling hooks require the slave CRTC states, so add these too to the atomic state. Since the connector atomic state is already up-to-date when the CRTC is disabled the connector state needs to be updated (reset) after the CRTC is disabled, make this so. Follow the proper order of disabling first all bigjoiner slaves, then any port synced CRTC slaves followed by the CRTC originally requested to be disabled. v2: - Fix calculating the bigjoiner_masters mask in a port sync config, (Ville) - Keep _noatomic suffix in intel_crtc_disable_noatomic(). (Ville) - Rebase on full CRTC state reset in this patchset, not requiring resetting the bigjoiner state separately and (instead) resetting the full atomic CRTC and related global state after all linked pipes got disabled. - Disable portsync slaves before a portsync master. - Disable a portsync master if a linked portsync slave is disabled. v3: (Ville) - Use s/u32/u8 for transcoder and pipe masks. - Use is_power_of_2() instead of hweight()==1. Cc: Ville Syrjälä <ville.syrjala@linux.intel.com> Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com> Signed-off-by: Imre Deak <imre.deak@intel.com> --- drivers/gpu/drm/i915/display/intel_display.c | 2 +- drivers/gpu/drm/i915/display/intel_display.h | 1 + .../drm/i915/display/intel_modeset_setup.c | 160 ++++++++++++++++-- 3 files changed, 152 insertions(+), 11 deletions(-) diff --git a/drivers/gpu/drm/i915/display/intel_display.c b/drivers/gpu/drm/i915/display/intel_display.c index 116fa52290b84..3bf67dfa66f2b 100644 --- a/drivers/gpu/drm/i915/display/intel_display.c +++ b/drivers/gpu/drm/i915/display/intel_display.c @@ -225,7 +225,7 @@ is_trans_port_sync_slave(const struct intel_crtc_state *crtc_state) return crtc_state->master_transcoder != INVALID_TRANSCODER; } -static bool +bool is_trans_port_sync_master(const struct intel_crtc_state *crtc_state) { return crtc_state->sync_mode_slaves_mask != 0; diff --git a/drivers/gpu/drm/i915/display/intel_display.h b/drivers/gpu/drm/i915/display/intel_display.h index ac95961f68ba7..3ecc5649a73ab 100644 --- a/drivers/gpu/drm/i915/display/intel_display.h +++ b/drivers/gpu/drm/i915/display/intel_display.h @@ -407,6 +407,7 @@ intel_mode_valid_max_plane_size(struct drm_i915_private *dev_priv, bool bigjoiner); enum phy intel_port_to_phy(struct drm_i915_private *i915, enum port port); bool is_trans_port_sync_mode(const struct intel_crtc_state *state); +bool is_trans_port_sync_master(const struct intel_crtc_state *state); bool intel_crtc_is_bigjoiner_slave(const struct intel_crtc_state *crtc_state); bool intel_crtc_is_bigjoiner_master(const struct intel_crtc_state *crtc_state); u8 intel_crtc_bigjoiner_slave_pipes(const struct intel_crtc_state *crtc_state); diff --git a/drivers/gpu/drm/i915/display/intel_modeset_setup.c b/drivers/gpu/drm/i915/display/intel_modeset_setup.c index 6f59654ea0261..75b4dea1e442b 100644 --- a/drivers/gpu/drm/i915/display/intel_modeset_setup.c +++ b/drivers/gpu/drm/i915/display/intel_modeset_setup.c @@ -38,8 +38,8 @@ static void intel_crtc_disable_noatomic_begin(struct intel_crtc *crtc, to_intel_crtc_state(crtc->base.state); struct intel_plane *plane; struct drm_atomic_state *state; - struct intel_crtc_state *temp_crtc_state; - int ret; + struct intel_crtc *temp_crtc; + enum pipe pipe = crtc->pipe; if (!crtc_state->hw.active) return; @@ -64,10 +64,17 @@ static void intel_crtc_disable_noatomic_begin(struct intel_crtc *crtc, to_intel_atomic_state(state)->internal = true; /* Everything's already locked, -EDEADLK can't happen. */ - temp_crtc_state = intel_atomic_get_crtc_state(state, crtc); - ret = drm_atomic_add_affected_connectors(state, &crtc->base); + for_each_intel_crtc_in_pipe_mask(&i915->drm, temp_crtc, + BIT(pipe) | + intel_crtc_bigjoiner_slave_pipes(crtc_state)) { + struct intel_crtc_state *temp_crtc_state = + intel_atomic_get_crtc_state(state, temp_crtc); + int ret; + + ret = drm_atomic_add_affected_connectors(state, &temp_crtc->base); - drm_WARN_ON(&i915->drm, IS_ERR(temp_crtc_state) || ret); + drm_WARN_ON(&i915->drm, IS_ERR(temp_crtc_state) || ret); + } i915->display.funcs.display->crtc_disable(to_intel_atomic_state(state), crtc); @@ -104,9 +111,38 @@ static void set_encoder_for_connector(struct intel_connector *connector, } } -static void intel_crtc_disable_noatomic_complete(struct intel_crtc *crtc) +static void reset_encoder_connector_state(struct intel_encoder *encoder) { + struct drm_i915_private *i915 = to_i915(encoder->base.dev); + struct intel_connector *connector; + struct drm_connector_list_iter conn_iter; + + drm_connector_list_iter_begin(&i915->drm, &conn_iter); + for_each_intel_connector_iter(connector, &conn_iter) { + if (connector->base.encoder != &encoder->base) + continue; + + set_encoder_for_connector(connector, NULL); + + connector->base.dpms = DRM_MODE_DPMS_OFF; + connector->base.encoder = NULL; + } + drm_connector_list_iter_end(&conn_iter); +} + +static void reset_crtc_encoder_state(struct intel_crtc *crtc) +{ + struct drm_i915_private *i915 = to_i915(crtc->base.dev); struct intel_encoder *encoder; + + for_each_encoder_on_crtc(&i915->drm, &crtc->base, encoder) { + reset_encoder_connector_state(encoder); + encoder->base.crtc = NULL; + } +} + +static void intel_crtc_disable_noatomic_complete(struct intel_crtc *crtc) +{ struct drm_i915_private *i915 = to_i915(crtc->base.dev); struct intel_bw_state *bw_state = to_intel_bw_state(i915->display.bw.obj.state); @@ -122,8 +158,7 @@ static void intel_crtc_disable_noatomic_complete(struct intel_crtc *crtc) intel_crtc_free_hw_state(crtc_state); intel_crtc_state_reset(crtc_state, crtc); - for_each_encoder_on_crtc(&i915->drm, &crtc->base, encoder) - encoder->base.crtc = NULL; + reset_crtc_encoder_state(crtc); intel_fbc_disable(crtc); intel_update_watermarks(i915); @@ -140,11 +175,116 @@ static void intel_crtc_disable_noatomic_complete(struct intel_crtc *crtc) bw_state->num_active_planes[pipe] = 0; } +/* + * Return all the pipes using a transcoder in @transcoder_mask. + * For bigjoiner configs return only the bigjoiner master. + */ +static u8 get_transcoder_pipes(struct drm_i915_private *i915, + u8 transcoder_mask) +{ + struct intel_crtc *temp_crtc; + u8 pipes = 0; + + for_each_intel_crtc(&i915->drm, temp_crtc) { + struct intel_crtc_state *temp_crtc_state = + to_intel_crtc_state(temp_crtc->base.state); + + if (temp_crtc_state->cpu_transcoder == INVALID_TRANSCODER) + continue; + + if (intel_crtc_is_bigjoiner_slave(temp_crtc_state)) + continue; + + if (transcoder_mask & BIT(temp_crtc_state->cpu_transcoder)) + pipes |= BIT(temp_crtc->pipe); + } + + return pipes; +} + +/* + * Return the port sync master and slave pipes linked to @crtc. + * For bigjoiner configs return only the bigjoiner master pipes. + */ +static void get_portsync_pipes(struct intel_crtc *crtc, + u8 *master_pipe_mask, u8 *slave_pipes_mask) +{ + struct drm_i915_private *i915 = to_i915(crtc->base.dev); + struct intel_crtc_state *crtc_state = + to_intel_crtc_state(crtc->base.state); + struct intel_crtc *master_crtc; + struct intel_crtc_state *master_crtc_state; + enum transcoder master_transcoder; + + if (!is_trans_port_sync_mode(crtc_state)) { + *master_pipe_mask = BIT(crtc->pipe); + *slave_pipes_mask = 0; + + return; + } + + if (is_trans_port_sync_master(crtc_state)) + master_transcoder = crtc_state->cpu_transcoder; + else + master_transcoder = crtc_state->master_transcoder; + + *master_pipe_mask = get_transcoder_pipes(i915, BIT(master_transcoder)); + drm_WARN_ON(&i915->drm, !is_power_of_2(*master_pipe_mask)); + + master_crtc = intel_crtc_for_pipe(i915, ffs(*master_pipe_mask) - 1); + master_crtc_state = to_intel_crtc_state(master_crtc->base.state); + *slave_pipes_mask = get_transcoder_pipes(i915, master_crtc_state->sync_mode_slaves_mask); +} + +static u8 get_bigjoiner_slave_pipes(struct drm_i915_private *i915, u8 master_pipes_mask) +{ + struct intel_crtc *master_crtc; + u8 pipes = 0; + + for_each_intel_crtc_in_pipe_mask(&i915->drm, master_crtc, master_pipes_mask) { + struct intel_crtc_state *master_crtc_state = + to_intel_crtc_state(master_crtc->base.state); + + pipes |= intel_crtc_bigjoiner_slave_pipes(master_crtc_state); + } + + return pipes; +} + static void intel_crtc_disable_noatomic(struct intel_crtc *crtc, struct drm_modeset_acquire_ctx *ctx) { - intel_crtc_disable_noatomic_begin(crtc, ctx); - intel_crtc_disable_noatomic_complete(crtc); + struct drm_i915_private *i915 = to_i915(crtc->base.dev); + u8 portsync_master_mask; + u8 portsync_slaves_mask; + u8 bigjoiner_slaves_mask; + struct intel_crtc *temp_crtc; + + /* TODO: Add support for MST */ + get_portsync_pipes(crtc, &portsync_master_mask, &portsync_slaves_mask); + bigjoiner_slaves_mask = get_bigjoiner_slave_pipes(i915, + portsync_master_mask | + portsync_slaves_mask); + + drm_WARN_ON(&i915->drm, + portsync_master_mask & portsync_slaves_mask || + portsync_master_mask & bigjoiner_slaves_mask || + portsync_slaves_mask & bigjoiner_slaves_mask); + + for_each_intel_crtc_in_pipe_mask(&i915->drm, temp_crtc, bigjoiner_slaves_mask) + intel_crtc_disable_noatomic_begin(temp_crtc, ctx); + + for_each_intel_crtc_in_pipe_mask(&i915->drm, temp_crtc, portsync_slaves_mask) + intel_crtc_disable_noatomic_begin(temp_crtc, ctx); + + for_each_intel_crtc_in_pipe_mask(&i915->drm, temp_crtc, portsync_master_mask) + intel_crtc_disable_noatomic_begin(temp_crtc, ctx); + + for_each_intel_crtc_in_pipe_mask(&i915->drm, temp_crtc, + bigjoiner_slaves_mask | + portsync_slaves_mask | + portsync_master_mask) + intel_crtc_disable_noatomic_complete(temp_crtc); } static void intel_modeset_update_connector_atomic_state(struct drm_i915_private *i915) -- 2.37.2 ^ permalink raw reply related [flat|nested] 41+ messages in thread
* [Intel-gfx] [PATCH v4 08/14] drm/i915/dp: Add link training debug and error printing helpers 2023-05-10 10:31 [Intel-gfx] [PATCH v4 00/14] drm/i915/tc: Add a workaround for an IOM/TCSS firmware hang issue Imre Deak ` (6 preceding siblings ...) 2023-05-10 10:31 ` [Intel-gfx] [PATCH v4 07/14] drm/i915: Add support for disabling any CRTCs during HW readout/sanitization Imre Deak @ 2023-05-10 10:31 ` Imre Deak 2023-05-10 10:31 ` [Intel-gfx] [PATCH v4 09/14] drm/i915/dp: Convert link training error to debug message on disconnected sink Imre Deak ` (13 subsequent siblings) 21 siblings, 0 replies; 41+ messages in thread From: Imre Deak @ 2023-05-10 10:31 UTC (permalink / raw) To: intel-gfx; +Cc: Jani Nikula Add functions for printing link training debug and error messages, both to prepare for the next patch, which downgrades an error to a debug message if the sink is disconnected and to remove some code duplication. v2: (Ville) - Always print the connector prefix. - Preserve the drm_dbg_kms() debug category. v3: - Keep printing the name of functions calling the helpers. (Jani) Cc: Ville Syrjälä <ville.syrjala@linux.intel.com> Cc: Jani Nikula <jani.nikula@intel.com> Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com> (v2) Signed-off-by: Imre Deak <imre.deak@intel.com> --- .../drm/i915/display/intel_dp_link_training.c | 367 ++++++------------ 1 file changed, 120 insertions(+), 247 deletions(-) diff --git a/drivers/gpu/drm/i915/display/intel_dp_link_training.c b/drivers/gpu/drm/i915/display/intel_dp_link_training.c index e92c62bcc9b85..4f33b79b23db0 100644 --- a/drivers/gpu/drm/i915/display/intel_dp_link_training.c +++ b/drivers/gpu/drm/i915/display/intel_dp_link_training.c @@ -26,6 +26,23 @@ #include "intel_dp.h" #include "intel_dp_link_training.h" +#define LT_MSG_PREFIX "[CONNECTOR:%d:%s][ENCODER:%d:%s][%s] " +#define LT_MSG_ARGS(_intel_dp, _dp_phy) (_intel_dp)->attached_connector->base.base.id, \ + (_intel_dp)->attached_connector->base.name, \ + dp_to_dig_port(_intel_dp)->base.base.base.id, \ + dp_to_dig_port(_intel_dp)->base.base.name, \ + drm_dp_phy_name(_dp_phy) + +#define lt_dbg(_intel_dp, _dp_phy, _format, ...) \ + drm_dbg_kms(&dp_to_i915(_intel_dp)->drm, \ + LT_MSG_PREFIX _format, \ + LT_MSG_ARGS(_intel_dp, _dp_phy), ## __VA_ARGS__) + +#define lt_err(_intel_dp, _dp_phy, _format, ...) \ + drm_err(&dp_to_i915(_intel_dp)->drm, \ + LT_MSG_PREFIX _format, \ + LT_MSG_ARGS(_intel_dp, _dp_phy), ## __VA_ARGS__) + static void intel_dp_reset_lttpr_common_caps(struct intel_dp *intel_dp) { memset(intel_dp->lttpr_common_caps, 0, sizeof(intel_dp->lttpr_common_caps)); @@ -47,29 +64,21 @@ static void intel_dp_read_lttpr_phy_caps(struct intel_dp *intel_dp, const u8 dpcd[DP_RECEIVER_CAP_SIZE], enum drm_dp_phy dp_phy) { - struct intel_encoder *encoder = &dp_to_dig_port(intel_dp)->base; u8 *phy_caps = intel_dp_lttpr_phy_caps(intel_dp, dp_phy); if (drm_dp_read_lttpr_phy_caps(&intel_dp->aux, dpcd, dp_phy, phy_caps) < 0) { - drm_dbg_kms(&dp_to_i915(intel_dp)->drm, - "[ENCODER:%d:%s][%s] failed to read the PHY caps\n", - encoder->base.base.id, encoder->base.name, - drm_dp_phy_name(dp_phy)); + lt_dbg(intel_dp, dp_phy, "failed to read the PHY caps\n"); return; } - drm_dbg_kms(&dp_to_i915(intel_dp)->drm, - "[ENCODER:%d:%s][%s] PHY capabilities: %*ph\n", - encoder->base.base.id, encoder->base.name, - drm_dp_phy_name(dp_phy), - (int)sizeof(intel_dp->lttpr_phy_caps[0]), - phy_caps); + lt_dbg(intel_dp, dp_phy, "PHY capabilities: %*ph\n", + (int)sizeof(intel_dp->lttpr_phy_caps[0]), + phy_caps); } static bool intel_dp_read_lttpr_common_caps(struct intel_dp *intel_dp, const u8 dpcd[DP_RECEIVER_CAP_SIZE]) { - struct intel_encoder *encoder = &dp_to_dig_port(intel_dp)->base; int ret; ret = drm_dp_read_lttpr_common_caps(&intel_dp->aux, dpcd, @@ -77,11 +86,9 @@ static bool intel_dp_read_lttpr_common_caps(struct intel_dp *intel_dp, if (ret < 0) goto reset_caps; - drm_dbg_kms(&dp_to_i915(intel_dp)->drm, - "[ENCODER:%d:%s] LTTPR common capabilities: %*ph\n", - encoder->base.base.id, encoder->base.name, - (int)sizeof(intel_dp->lttpr_common_caps), - intel_dp->lttpr_common_caps); + lt_dbg(intel_dp, DP_PHY_DPRX, "LTTPR common capabilities: %*ph\n", + (int)sizeof(intel_dp->lttpr_common_caps), + intel_dp->lttpr_common_caps); /* The minimum value of LT_TUNABLE_PHY_REPEATER_FIELD_DATA_STRUCTURE_REV is 1.4 */ if (intel_dp->lttpr_common_caps[0] < 0x14) @@ -105,8 +112,6 @@ intel_dp_set_lttpr_transparent_mode(struct intel_dp *intel_dp, bool enable) static int intel_dp_init_lttpr(struct intel_dp *intel_dp, const u8 dpcd[DP_RECEIVER_CAP_SIZE]) { - struct intel_encoder *encoder = &dp_to_dig_port(intel_dp)->base; - struct drm_i915_private *i915 = to_i915(encoder->base.dev); int lttpr_count; int i; @@ -138,9 +143,8 @@ static int intel_dp_init_lttpr(struct intel_dp *intel_dp, const u8 dpcd[DP_RECEI return 0; if (!intel_dp_set_lttpr_transparent_mode(intel_dp, false)) { - drm_dbg_kms(&i915->drm, - "[ENCODER:%d:%s] Switching to LTTPR non-transparent LT mode failed, fall-back to transparent mode\n", - encoder->base.base.id, encoder->base.name); + lt_dbg(intel_dp, DP_PHY_DPRX, + "Switching to LTTPR non-transparent LT mode failed, fall-back to transparent mode\n"); intel_dp_set_lttpr_transparent_mode(intel_dp, true); intel_dp_reset_lttpr_count(intel_dp); @@ -409,26 +413,22 @@ intel_dp_get_adjust_train(struct intel_dp *intel_dp, enum drm_dp_phy dp_phy, const u8 link_status[DP_LINK_STATUS_SIZE]) { - struct intel_encoder *encoder = &dp_to_dig_port(intel_dp)->base; - struct drm_i915_private *i915 = to_i915(encoder->base.dev); int lane; if (intel_dp_is_uhbr(crtc_state)) { - drm_dbg_kms(&i915->drm, "[ENCODER:%d:%s][%s] 128b/132b, lanes: %d, " - "TX FFE request: " TRAIN_REQ_FMT "\n", - encoder->base.base.id, encoder->base.name, - drm_dp_phy_name(dp_phy), - crtc_state->lane_count, - TRAIN_REQ_TX_FFE_ARGS(link_status)); + lt_dbg(intel_dp, dp_phy, + "128b/132b, lanes: %d, " + "TX FFE request: " TRAIN_REQ_FMT "\n", + crtc_state->lane_count, + TRAIN_REQ_TX_FFE_ARGS(link_status)); } else { - drm_dbg_kms(&i915->drm, "[ENCODER:%d:%s][%s] 8b/10b, lanes: %d, " - "vswing request: " TRAIN_REQ_FMT ", " - "pre-emphasis request: " TRAIN_REQ_FMT "\n", - encoder->base.base.id, encoder->base.name, - drm_dp_phy_name(dp_phy), - crtc_state->lane_count, - TRAIN_REQ_VSWING_ARGS(link_status), - TRAIN_REQ_PREEMPH_ARGS(link_status)); + lt_dbg(intel_dp, dp_phy, + "8b/10b, lanes: %d, " + "vswing request: " TRAIN_REQ_FMT ", " + "pre-emphasis request: " TRAIN_REQ_FMT "\n", + crtc_state->lane_count, + TRAIN_REQ_VSWING_ARGS(link_status), + TRAIN_REQ_PREEMPH_ARGS(link_status)); } for (lane = 0; lane < 4; lane++) @@ -487,16 +487,11 @@ intel_dp_program_link_training_pattern(struct intel_dp *intel_dp, enum drm_dp_phy dp_phy, u8 dp_train_pat) { - struct intel_encoder *encoder = &dp_to_dig_port(intel_dp)->base; - struct drm_i915_private *i915 = to_i915(encoder->base.dev); u8 train_pat = intel_dp_training_pattern_symbol(dp_train_pat); if (train_pat != DP_TRAINING_PATTERN_DISABLE) - drm_dbg_kms(&i915->drm, - "[ENCODER:%d:%s][%s] Using DP training pattern TPS%c\n", - encoder->base.base.id, encoder->base.name, - drm_dp_phy_name(dp_phy), - dp_training_pattern_name(train_pat)); + lt_dbg(intel_dp, dp_phy, "Using DP training pattern TPS%c\n", + dp_training_pattern_name(train_pat)); intel_dp->set_link_train(intel_dp, crtc_state, dp_train_pat); } @@ -531,24 +526,21 @@ void intel_dp_set_signal_levels(struct intel_dp *intel_dp, enum drm_dp_phy dp_phy) { struct intel_encoder *encoder = &dp_to_dig_port(intel_dp)->base; - struct drm_i915_private *i915 = to_i915(encoder->base.dev); if (intel_dp_is_uhbr(crtc_state)) { - drm_dbg_kms(&i915->drm, "[ENCODER:%d:%s][%s] 128b/132b, lanes: %d, " - "TX FFE presets: " TRAIN_SET_FMT "\n", - encoder->base.base.id, encoder->base.name, - drm_dp_phy_name(dp_phy), - crtc_state->lane_count, - TRAIN_SET_TX_FFE_ARGS(intel_dp->train_set)); + lt_dbg(intel_dp, dp_phy, + "128b/132b, lanes: %d, " + "TX FFE presets: " TRAIN_SET_FMT "\n", + crtc_state->lane_count, + TRAIN_SET_TX_FFE_ARGS(intel_dp->train_set)); } else { - drm_dbg_kms(&i915->drm, "[ENCODER:%d:%s][%s] 8b/10b, lanes: %d, " - "vswing levels: " TRAIN_SET_FMT ", " - "pre-emphasis levels: " TRAIN_SET_FMT "\n", - encoder->base.base.id, encoder->base.name, - drm_dp_phy_name(dp_phy), - crtc_state->lane_count, - TRAIN_SET_VSWING_ARGS(intel_dp->train_set), - TRAIN_SET_PREEMPH_ARGS(intel_dp->train_set)); + lt_dbg(intel_dp, dp_phy, + "8b/10b, lanes: %d, " + "vswing levels: " TRAIN_SET_FMT ", " + "pre-emphasis levels: " TRAIN_SET_FMT "\n", + crtc_state->lane_count, + TRAIN_SET_VSWING_ARGS(intel_dp->train_set), + TRAIN_SET_PREEMPH_ARGS(intel_dp->train_set)); } if (intel_dp_phy_is_downstream_of_source(intel_dp, dp_phy)) @@ -677,8 +669,6 @@ static bool intel_dp_prepare_link_train(struct intel_dp *intel_dp, const struct intel_crtc_state *crtc_state) { - struct intel_encoder *encoder = &dp_to_dig_port(intel_dp)->base; - struct drm_i915_private *i915 = to_i915(encoder->base.dev); u8 link_bw, rate_select; if (intel_dp->prepare_link_retrain) @@ -699,24 +689,21 @@ intel_dp_prepare_link_train(struct intel_dp *intel_dp, * link rates are not stable. */ if (!link_bw) { - struct intel_connector *connector = intel_dp->attached_connector; __le16 sink_rates[DP_MAX_SUPPORTED_RATES]; - drm_dbg_kms(&i915->drm, "[CONNECTOR:%d:%s] Reloading eDP link rates\n", - connector->base.base.id, connector->base.name); + lt_dbg(intel_dp, DP_PHY_DPRX, "Reloading eDP link rates\n"); drm_dp_dpcd_read(&intel_dp->aux, DP_SUPPORTED_LINK_RATES, sink_rates, sizeof(sink_rates)); } if (link_bw) - drm_dbg_kms(&i915->drm, - "[ENCODER:%d:%s] Using LINK_BW_SET value %02x\n", - encoder->base.base.id, encoder->base.name, link_bw); + lt_dbg(intel_dp, DP_PHY_DPRX, "Using LINK_BW_SET value %02x\n", + link_bw); else - drm_dbg_kms(&i915->drm, - "[ENCODER:%d:%s] Using LINK_RATE_SET value %02x\n", - encoder->base.base.id, encoder->base.name, rate_select); + lt_dbg(intel_dp, DP_PHY_DPRX, + "Using LINK_RATE_SET value %02x\n", + rate_select); /* * Spec DP2.1 Section 3.5.2.16 * Prior to LT DPTX should set 128b/132b DP Channel coding and then set link rate @@ -758,15 +745,10 @@ void intel_dp_dump_link_status(struct intel_dp *intel_dp, enum drm_dp_phy dp_phy, const u8 link_status[DP_LINK_STATUS_SIZE]) { - struct intel_encoder *encoder = &dp_to_dig_port(intel_dp)->base; - struct drm_i915_private *i915 = to_i915(encoder->base.dev); - - drm_dbg_kms(&i915->drm, - "[ENCODER:%d:%s][%s] ln0_1:0x%x ln2_3:0x%x align:0x%x sink:0x%x adj_req0_1:0x%x adj_req2_3:0x%x\n", - encoder->base.base.id, encoder->base.name, - drm_dp_phy_name(dp_phy), - link_status[0], link_status[1], link_status[2], - link_status[3], link_status[4], link_status[5]); + lt_dbg(intel_dp, dp_phy, + "ln0_1:0x%x ln2_3:0x%x align:0x%x sink:0x%x adj_req0_1:0x%x adj_req2_3:0x%x\n", + link_status[0], link_status[1], link_status[2], + link_status[3], link_status[4], link_status[5]); } /* @@ -778,8 +760,6 @@ intel_dp_link_training_clock_recovery(struct intel_dp *intel_dp, const struct intel_crtc_state *crtc_state, enum drm_dp_phy dp_phy) { - struct intel_encoder *encoder = &dp_to_dig_port(intel_dp)->base; - struct drm_i915_private *i915 = to_i915(encoder->base.dev); u8 old_link_status[DP_LINK_STATUS_SIZE] = {}; int voltage_tries, cr_tries, max_cr_tries; u8 link_status[DP_LINK_STATUS_SIZE]; @@ -794,9 +774,7 @@ intel_dp_link_training_clock_recovery(struct intel_dp *intel_dp, if (!intel_dp_reset_link_train(intel_dp, crtc_state, dp_phy, DP_TRAINING_PATTERN_1 | DP_LINK_SCRAMBLING_DISABLE)) { - drm_err(&i915->drm, "[ENCODER:%d:%s][%s] Failed to enable link training\n", - encoder->base.base.id, encoder->base.name, - drm_dp_phy_name(dp_phy)); + lt_err(intel_dp, dp_phy, "Failed to enable link training\n"); return false; } @@ -819,35 +797,24 @@ intel_dp_link_training_clock_recovery(struct intel_dp *intel_dp, if (drm_dp_dpcd_read_phy_link_status(&intel_dp->aux, dp_phy, link_status) < 0) { - drm_err(&i915->drm, "[ENCODER:%d:%s][%s] Failed to get link status\n", - encoder->base.base.id, encoder->base.name, - drm_dp_phy_name(dp_phy)); + lt_err(intel_dp, dp_phy, "Failed to get link status\n"); return false; } if (drm_dp_clock_recovery_ok(link_status, crtc_state->lane_count)) { - drm_dbg_kms(&i915->drm, - "[ENCODER:%d:%s][%s] Clock recovery OK\n", - encoder->base.base.id, encoder->base.name, - drm_dp_phy_name(dp_phy)); + lt_dbg(intel_dp, dp_phy, "Clock recovery OK\n"); return true; } if (voltage_tries == 5) { intel_dp_dump_link_status(intel_dp, dp_phy, link_status); - drm_dbg_kms(&i915->drm, - "[ENCODER:%d:%s][%s] Same voltage tried 5 times\n", - encoder->base.base.id, encoder->base.name, - drm_dp_phy_name(dp_phy)); + lt_dbg(intel_dp, dp_phy, "Same voltage tried 5 times\n"); return false; } if (max_vswing_reached) { intel_dp_dump_link_status(intel_dp, dp_phy, link_status); - drm_dbg_kms(&i915->drm, - "[ENCODER:%d:%s][%s] Max Voltage Swing reached\n", - encoder->base.base.id, encoder->base.name, - drm_dp_phy_name(dp_phy)); + lt_dbg(intel_dp, dp_phy, "Max Voltage Swing reached\n"); return false; } @@ -855,10 +822,7 @@ intel_dp_link_training_clock_recovery(struct intel_dp *intel_dp, intel_dp_get_adjust_train(intel_dp, crtc_state, dp_phy, link_status); if (!intel_dp_update_link_train(intel_dp, crtc_state, dp_phy)) { - drm_err(&i915->drm, - "[ENCODER:%d:%s][%s] Failed to update link training\n", - encoder->base.base.id, encoder->base.name, - drm_dp_phy_name(dp_phy)); + lt_err(intel_dp, dp_phy, "Failed to update link training\n"); return false; } @@ -874,10 +838,8 @@ intel_dp_link_training_clock_recovery(struct intel_dp *intel_dp, } intel_dp_dump_link_status(intel_dp, dp_phy, link_status); - drm_err(&i915->drm, - "[ENCODER:%d:%s][%s] Failed clock recovery %d times, giving up!\n", - encoder->base.base.id, encoder->base.name, - drm_dp_phy_name(dp_phy), max_cr_tries); + lt_err(intel_dp, dp_phy, "Failed clock recovery %d times, giving up!\n", + max_cr_tries); return false; } @@ -911,11 +873,11 @@ static u32 intel_dp_training_pattern(struct intel_dp *intel_dp, return DP_TRAINING_PATTERN_4; } else if (crtc_state->port_clock == 810000) { if (!source_tps4) - drm_dbg_kms(&i915->drm, - "8.1 Gbps link rate without source TPS4 support\n"); + lt_dbg(intel_dp, dp_phy, + "8.1 Gbps link rate without source TPS4 support\n"); if (!sink_tps4) - drm_dbg_kms(&i915->drm, - "8.1 Gbps link rate without sink TPS4 support\n"); + lt_dbg(intel_dp, dp_phy, + "8.1 Gbps link rate without sink TPS4 support\n"); } /* @@ -929,11 +891,11 @@ static u32 intel_dp_training_pattern(struct intel_dp *intel_dp, return DP_TRAINING_PATTERN_3; } else if (crtc_state->port_clock >= 540000) { if (!source_tps3) - drm_dbg_kms(&i915->drm, - ">=5.4/6.48 Gbps link rate without source TPS3 support\n"); + lt_dbg(intel_dp, dp_phy, + ">=5.4/6.48 Gbps link rate without source TPS3 support\n"); if (!sink_tps3) - drm_dbg_kms(&i915->drm, - ">=5.4/6.48 Gbps link rate without sink TPS3 support\n"); + lt_dbg(intel_dp, dp_phy, + ">=5.4/6.48 Gbps link rate without sink TPS3 support\n"); } return DP_TRAINING_PATTERN_2; @@ -949,8 +911,6 @@ intel_dp_link_training_channel_equalization(struct intel_dp *intel_dp, const struct intel_crtc_state *crtc_state, enum drm_dp_phy dp_phy) { - struct intel_encoder *encoder = &dp_to_dig_port(intel_dp)->base; - struct drm_i915_private *i915 = to_i915(encoder->base.dev); int tries; u32 training_pattern; u8 link_status[DP_LINK_STATUS_SIZE]; @@ -969,10 +929,7 @@ intel_dp_link_training_channel_equalization(struct intel_dp *intel_dp, /* channel equalization */ if (!intel_dp_set_link_train(intel_dp, crtc_state, dp_phy, training_pattern)) { - drm_err(&i915->drm, - "[ENCODER:%d:%s][%s] Failed to start channel equalization\n", - encoder->base.base.id, encoder->base.name, - drm_dp_phy_name(dp_phy)); + lt_err(intel_dp, dp_phy, "Failed to start channel equalization\n"); return false; } @@ -981,10 +938,7 @@ intel_dp_link_training_channel_equalization(struct intel_dp *intel_dp, if (drm_dp_dpcd_read_phy_link_status(&intel_dp->aux, dp_phy, link_status) < 0) { - drm_err(&i915->drm, - "[ENCODER:%d:%s][%s] Failed to get link status\n", - encoder->base.base.id, encoder->base.name, - drm_dp_phy_name(dp_phy)); + lt_err(intel_dp, dp_phy, "Failed to get link status\n"); break; } @@ -992,21 +946,15 @@ intel_dp_link_training_channel_equalization(struct intel_dp *intel_dp, if (!drm_dp_clock_recovery_ok(link_status, crtc_state->lane_count)) { intel_dp_dump_link_status(intel_dp, dp_phy, link_status); - drm_dbg_kms(&i915->drm, - "[ENCODER:%d:%s][%s] Clock recovery check failed, cannot " - "continue channel equalization\n", - encoder->base.base.id, encoder->base.name, - drm_dp_phy_name(dp_phy)); + lt_dbg(intel_dp, dp_phy, + "Clock recovery check failed, cannot continue channel equalization\n"); break; } if (drm_dp_channel_eq_ok(link_status, crtc_state->lane_count)) { channel_eq = true; - drm_dbg_kms(&i915->drm, - "[ENCODER:%d:%s][%s] Channel EQ done. DP Training successful\n", - encoder->base.base.id, encoder->base.name, - drm_dp_phy_name(dp_phy)); + lt_dbg(intel_dp, dp_phy, "Channel EQ done. DP Training successful\n"); break; } @@ -1014,10 +962,7 @@ intel_dp_link_training_channel_equalization(struct intel_dp *intel_dp, intel_dp_get_adjust_train(intel_dp, crtc_state, dp_phy, link_status); if (!intel_dp_update_link_train(intel_dp, crtc_state, dp_phy)) { - drm_err(&i915->drm, - "[ENCODER:%d:%s][%s] Failed to update link training\n", - encoder->base.base.id, encoder->base.name, - drm_dp_phy_name(dp_phy)); + lt_err(intel_dp, dp_phy, "Failed to update link training\n"); break; } } @@ -1025,10 +970,7 @@ intel_dp_link_training_channel_equalization(struct intel_dp *intel_dp, /* Try 5 times, else fail and try at lower BW */ if (tries == 5) { intel_dp_dump_link_status(intel_dp, dp_phy, link_status); - drm_dbg_kms(&i915->drm, - "[ENCODER:%d:%s][%s] Channel equalization failed 5 times\n", - encoder->base.base.id, encoder->base.name, - drm_dp_phy_name(dp_phy)); + lt_dbg(intel_dp, dp_phy, "Channel equalization failed 5 times\n"); } return channel_eq; @@ -1047,13 +989,12 @@ static int intel_dp_128b132b_intra_hop(struct intel_dp *intel_dp, const struct intel_crtc_state *crtc_state) { - struct drm_i915_private *i915 = dp_to_i915(intel_dp); u8 sink_status; int ret; ret = drm_dp_dpcd_readb(&intel_dp->aux, DP_SINK_STATUS, &sink_status); if (ret != 1) { - drm_dbg_kms(&i915->drm, "Failed to read sink status\n"); + lt_dbg(intel_dp, DP_PHY_DPRX, "Failed to read sink status\n"); return ret < 0 ? ret : -EIO; } @@ -1079,9 +1020,6 @@ intel_dp_128b132b_intra_hop(struct intel_dp *intel_dp, void intel_dp_stop_link_train(struct intel_dp *intel_dp, const struct intel_crtc_state *crtc_state) { - struct drm_i915_private *i915 = dp_to_i915(intel_dp); - struct intel_encoder *encoder = &dp_to_dig_port(intel_dp)->base; - intel_dp->link_trained = true; intel_dp_disable_dpcd_training_pattern(intel_dp, DP_PHY_DPRX); @@ -1090,9 +1028,7 @@ void intel_dp_stop_link_train(struct intel_dp *intel_dp, if (intel_dp_is_uhbr(crtc_state) && wait_for(intel_dp_128b132b_intra_hop(intel_dp, crtc_state) == 0, 500)) { - drm_dbg_kms(&i915->drm, - "[ENCODER:%d:%s] 128b/132b intra-hop not clearing\n", - encoder->base.base.id, encoder->base.name); + lt_dbg(intel_dp, DP_PHY_DPRX, "128b/132b intra-hop not clearing\n"); } } @@ -1101,8 +1037,6 @@ intel_dp_link_train_phy(struct intel_dp *intel_dp, const struct intel_crtc_state *crtc_state, enum drm_dp_phy dp_phy) { - struct intel_connector *connector = intel_dp->attached_connector; - struct intel_encoder *encoder = &dp_to_dig_port(intel_dp)->base; bool ret = false; if (!intel_dp_link_training_clock_recovery(intel_dp, crtc_state, dp_phy)) @@ -1114,13 +1048,10 @@ intel_dp_link_train_phy(struct intel_dp *intel_dp, ret = true; out: - drm_dbg_kms(&dp_to_i915(intel_dp)->drm, - "[CONNECTOR:%d:%s][ENCODER:%d:%s][%s] Link Training %s at link rate = %d, lane count = %d\n", - connector->base.base.id, connector->base.name, - encoder->base.base.id, encoder->base.name, - drm_dp_phy_name(dp_phy), - ret ? "passed" : "failed", - crtc_state->port_clock, crtc_state->lane_count); + lt_dbg(intel_dp, dp_phy, + "Link Training %s at link rate = %d, lane count = %d\n", + ret ? "passed" : "failed", + crtc_state->port_clock, crtc_state->lane_count); return ret; } @@ -1129,13 +1060,10 @@ static void intel_dp_schedule_fallback_link_training(struct intel_dp *intel_dp, const struct intel_crtc_state *crtc_state) { struct intel_connector *intel_connector = intel_dp->attached_connector; - struct intel_encoder *encoder = &dp_to_dig_port(intel_dp)->base; if (intel_dp->hobl_active) { - drm_dbg_kms(&dp_to_i915(intel_dp)->drm, - "[ENCODER:%d:%s] Link Training failed with HOBL active, " - "not enabling it from now on", - encoder->base.base.id, encoder->base.name); + lt_dbg(intel_dp, DP_PHY_DPRX, + "Link Training failed with HOBL active, not enabling it from now on\n"); intel_dp->hobl_failed = true; } else if (intel_dp_get_link_train_fallback_values(intel_dp, crtc_state->port_clock, @@ -1182,8 +1110,6 @@ static bool intel_dp_128b132b_lane_eq(struct intel_dp *intel_dp, const struct intel_crtc_state *crtc_state) { - struct intel_encoder *encoder = &dp_to_dig_port(intel_dp)->base; - struct drm_i915_private *i915 = to_i915(encoder->base.dev); u8 link_status[DP_LINK_STATUS_SIZE]; int delay_us; int try, max_tries = 20; @@ -1198,9 +1124,7 @@ intel_dp_128b132b_lane_eq(struct intel_dp *intel_dp, */ if (!intel_dp_reset_link_train(intel_dp, crtc_state, DP_PHY_DPRX, DP_TRAINING_PATTERN_1)) { - drm_err(&i915->drm, - "[ENCODER:%d:%s] Failed to start 128b/132b TPS1\n", - encoder->base.base.id, encoder->base.name); + lt_err(intel_dp, DP_PHY_DPRX, "Failed to start 128b/132b TPS1\n"); return false; } @@ -1208,27 +1132,21 @@ intel_dp_128b132b_lane_eq(struct intel_dp *intel_dp, /* Read the initial TX FFE settings. */ if (drm_dp_dpcd_read_link_status(&intel_dp->aux, link_status) < 0) { - drm_err(&i915->drm, - "[ENCODER:%d:%s] Failed to read TX FFE presets\n", - encoder->base.base.id, encoder->base.name); + lt_err(intel_dp, DP_PHY_DPRX, "Failed to read TX FFE presets\n"); return false; } /* Update signal levels and training set as requested. */ intel_dp_get_adjust_train(intel_dp, crtc_state, DP_PHY_DPRX, link_status); if (!intel_dp_update_link_train(intel_dp, crtc_state, DP_PHY_DPRX)) { - drm_err(&i915->drm, - "[ENCODER:%d:%s] Failed to set initial TX FFE settings\n", - encoder->base.base.id, encoder->base.name); + lt_err(intel_dp, DP_PHY_DPRX, "Failed to set initial TX FFE settings\n"); return false; } /* Start transmitting 128b/132b TPS2. */ if (!intel_dp_set_link_train(intel_dp, crtc_state, DP_PHY_DPRX, DP_TRAINING_PATTERN_2)) { - drm_err(&i915->drm, - "[ENCODER:%d:%s] Failed to start 128b/132b TPS2\n", - encoder->base.base.id, encoder->base.name); + lt_err(intel_dp, DP_PHY_DPRX, "Failed to start 128b/132b TPS2\n"); return false; } @@ -1245,32 +1163,25 @@ intel_dp_128b132b_lane_eq(struct intel_dp *intel_dp, delay_us = drm_dp_128b132b_read_aux_rd_interval(&intel_dp->aux); if (drm_dp_dpcd_read_link_status(&intel_dp->aux, link_status) < 0) { - drm_err(&i915->drm, - "[ENCODER:%d:%s] Failed to read link status\n", - encoder->base.base.id, encoder->base.name); + lt_err(intel_dp, DP_PHY_DPRX, "Failed to read link status\n"); return false; } if (drm_dp_128b132b_link_training_failed(link_status)) { intel_dp_dump_link_status(intel_dp, DP_PHY_DPRX, link_status); - drm_err(&i915->drm, - "[ENCODER:%d:%s] Downstream link training failure\n", - encoder->base.base.id, encoder->base.name); + lt_err(intel_dp, DP_PHY_DPRX, + "Downstream link training failure\n"); return false; } if (drm_dp_128b132b_lane_channel_eq_done(link_status, crtc_state->lane_count)) { - drm_dbg_kms(&i915->drm, - "[ENCODER:%d:%s] Lane channel eq done\n", - encoder->base.base.id, encoder->base.name); + lt_dbg(intel_dp, DP_PHY_DPRX, "Lane channel eq done\n"); break; } if (timeout) { intel_dp_dump_link_status(intel_dp, DP_PHY_DPRX, link_status); - drm_err(&i915->drm, - "[ENCODER:%d:%s] Lane channel eq timeout\n", - encoder->base.base.id, encoder->base.name); + lt_err(intel_dp, DP_PHY_DPRX, "Lane channel eq timeout\n"); return false; } @@ -1280,18 +1191,14 @@ intel_dp_128b132b_lane_eq(struct intel_dp *intel_dp, /* Update signal levels and training set as requested. */ intel_dp_get_adjust_train(intel_dp, crtc_state, DP_PHY_DPRX, link_status); if (!intel_dp_update_link_train(intel_dp, crtc_state, DP_PHY_DPRX)) { - drm_err(&i915->drm, - "[ENCODER:%d:%s] Failed to update TX FFE settings\n", - encoder->base.base.id, encoder->base.name); + lt_err(intel_dp, DP_PHY_DPRX, "Failed to update TX FFE settings\n"); return false; } } if (try == max_tries) { intel_dp_dump_link_status(intel_dp, DP_PHY_DPRX, link_status); - drm_err(&i915->drm, - "[ENCODER:%d:%s] Max loop count reached\n", - encoder->base.base.id, encoder->base.name); + lt_err(intel_dp, DP_PHY_DPRX, "Max loop count reached\n"); return false; } @@ -1300,32 +1207,24 @@ intel_dp_128b132b_lane_eq(struct intel_dp *intel_dp, timeout = true; /* try one last time after deadline */ if (drm_dp_dpcd_read_link_status(&intel_dp->aux, link_status) < 0) { - drm_err(&i915->drm, - "[ENCODER:%d:%s] Failed to read link status\n", - encoder->base.base.id, encoder->base.name); + lt_err(intel_dp, DP_PHY_DPRX, "Failed to read link status\n"); return false; } if (drm_dp_128b132b_link_training_failed(link_status)) { intel_dp_dump_link_status(intel_dp, DP_PHY_DPRX, link_status); - drm_err(&i915->drm, - "[ENCODER:%d:%s] Downstream link training failure\n", - encoder->base.base.id, encoder->base.name); + lt_err(intel_dp, DP_PHY_DPRX, "Downstream link training failure\n"); return false; } if (drm_dp_128b132b_eq_interlane_align_done(link_status)) { - drm_dbg_kms(&i915->drm, - "[ENCODER:%d:%s] Interlane align done\n", - encoder->base.base.id, encoder->base.name); + lt_dbg(intel_dp, DP_PHY_DPRX, "Interlane align done\n"); break; } if (timeout) { intel_dp_dump_link_status(intel_dp, DP_PHY_DPRX, link_status); - drm_err(&i915->drm, - "[ENCODER:%d:%s] Interlane align timeout\n", - encoder->base.base.id, encoder->base.name); + lt_err(intel_dp, DP_PHY_DPRX, "Interlane align timeout\n"); return false; } @@ -1343,16 +1242,12 @@ intel_dp_128b132b_lane_cds(struct intel_dp *intel_dp, const struct intel_crtc_state *crtc_state, int lttpr_count) { - struct intel_encoder *encoder = &dp_to_dig_port(intel_dp)->base; - struct drm_i915_private *i915 = to_i915(encoder->base.dev); u8 link_status[DP_LINK_STATUS_SIZE]; unsigned long deadline; if (drm_dp_dpcd_writeb(&intel_dp->aux, DP_TRAINING_PATTERN_SET, DP_TRAINING_PATTERN_2_CDS) != 1) { - drm_err(&i915->drm, - "[ENCODER:%d:%s] Failed to start 128b/132b TPS2 CDS\n", - encoder->base.base.id, encoder->base.name); + lt_err(intel_dp, DP_PHY_DPRX, "Failed to start 128b/132b TPS2 CDS\n"); return false; } @@ -1368,34 +1263,26 @@ intel_dp_128b132b_lane_cds(struct intel_dp *intel_dp, usleep_range(2000, 3000); if (drm_dp_dpcd_read_link_status(&intel_dp->aux, link_status) < 0) { - drm_err(&i915->drm, - "[ENCODER:%d:%s] Failed to read link status\n", - encoder->base.base.id, encoder->base.name); + lt_err(intel_dp, DP_PHY_DPRX, "Failed to read link status\n"); return false; } if (drm_dp_128b132b_eq_interlane_align_done(link_status) && drm_dp_128b132b_cds_interlane_align_done(link_status) && drm_dp_128b132b_lane_symbol_locked(link_status, crtc_state->lane_count)) { - drm_dbg_kms(&i915->drm, - "[ENCODER:%d:%s] CDS interlane align done\n", - encoder->base.base.id, encoder->base.name); + lt_err(intel_dp, DP_PHY_DPRX, "CDS interlane align done\n"); break; } if (drm_dp_128b132b_link_training_failed(link_status)) { intel_dp_dump_link_status(intel_dp, DP_PHY_DPRX, link_status); - drm_err(&i915->drm, - "[ENCODER:%d:%s] Downstream link training failure\n", - encoder->base.base.id, encoder->base.name); + lt_err(intel_dp, DP_PHY_DPRX, "Downstream link training failure\n"); return false; } if (timeout) { intel_dp_dump_link_status(intel_dp, DP_PHY_DPRX, link_status); - drm_err(&i915->drm, - "[ENCODER:%d:%s] CDS timeout\n", - encoder->base.base.id, encoder->base.name); + lt_err(intel_dp, DP_PHY_DPRX, "CDS timeout\n"); return false; } } @@ -1411,15 +1298,10 @@ intel_dp_128b132b_link_train(struct intel_dp *intel_dp, const struct intel_crtc_state *crtc_state, int lttpr_count) { - struct drm_i915_private *i915 = dp_to_i915(intel_dp); - struct intel_connector *connector = intel_dp->attached_connector; - struct intel_encoder *encoder = &dp_to_dig_port(intel_dp)->base; bool passed = false; if (wait_for(intel_dp_128b132b_intra_hop(intel_dp, crtc_state) == 0, 500)) { - drm_err(&i915->drm, - "[ENCODER:%d:%s] 128b/132b intra-hop not clear\n", - encoder->base.base.id, encoder->base.name); + lt_err(intel_dp, DP_PHY_DPRX, "128b/132b intra-hop not clear\n"); return false; } @@ -1427,12 +1309,10 @@ intel_dp_128b132b_link_train(struct intel_dp *intel_dp, intel_dp_128b132b_lane_cds(intel_dp, crtc_state, lttpr_count)) passed = true; - drm_dbg_kms(&i915->drm, - "[CONNECTOR:%d:%s][ENCODER:%d:%s] 128b/132b Link Training %s at link rate = %d, lane count = %d\n", - connector->base.base.id, connector->base.name, - encoder->base.base.id, encoder->base.name, - passed ? "passed" : "failed", - crtc_state->port_clock, crtc_state->lane_count); + lt_dbg(intel_dp, DP_PHY_DPRX, + "128b/132b Link Training %s at link rate = %d, lane count = %d\n", + passed ? "passed" : "failed", + crtc_state->port_clock, crtc_state->lane_count); return passed; } @@ -1451,8 +1331,6 @@ void intel_dp_start_link_train(struct intel_dp *intel_dp, const struct intel_crtc_state *crtc_state) { struct drm_i915_private *i915 = dp_to_i915(intel_dp); - struct intel_connector *connector = intel_dp->attached_connector; - struct intel_encoder *encoder = &dp_to_dig_port(intel_dp)->base; bool passed; /* @@ -1485,10 +1363,7 @@ void intel_dp_start_link_train(struct intel_dp *intel_dp, * ignore_long_hpd flag can unset from the testcase. */ if (!passed && i915->display.hotplug.ignore_long_hpd) { - drm_dbg_kms(&i915->drm, - "[CONNECTOR:%d:%s][ENCODER:%d:%s] Ignore the link failure\n", - connector->base.base.id, connector->base.name, - encoder->base.base.id, encoder->base.name); + lt_dbg(intel_dp, DP_PHY_DPRX, "Ignore the link failure\n"); return; } @@ -1499,8 +1374,6 @@ void intel_dp_start_link_train(struct intel_dp *intel_dp, void intel_dp_128b132b_sdp_crc16(struct intel_dp *intel_dp, const struct intel_crtc_state *crtc_state) { - struct drm_i915_private *i915 = dp_to_i915(intel_dp); - /* * VIDEO_DIP_CTL register bit 31 should be set to '0' to not * disable SDP CRC. This is applicable for Display version 13. @@ -1513,5 +1386,5 @@ void intel_dp_128b132b_sdp_crc16(struct intel_dp *intel_dp, DP_SDP_ERROR_DETECTION_CONFIGURATION, DP_SDP_CRC16_128B132B_EN); - drm_dbg_kms(&i915->drm, "DP2.0 SDP CRC16 for 128b/132b enabled\n"); + lt_dbg(intel_dp, DP_PHY_DPRX, "DP2.0 SDP CRC16 for 128b/132b enabled\n"); } -- 2.37.2 ^ permalink raw reply related [flat|nested] 41+ messages in thread
* [Intel-gfx] [PATCH v4 09/14] drm/i915/dp: Convert link training error to debug message on disconnected sink 2023-05-10 10:31 [Intel-gfx] [PATCH v4 00/14] drm/i915/tc: Add a workaround for an IOM/TCSS firmware hang issue Imre Deak ` (7 preceding siblings ...) 2023-05-10 10:31 ` [Intel-gfx] [PATCH v4 08/14] drm/i915/dp: Add link training debug and error printing helpers Imre Deak @ 2023-05-10 10:31 ` Imre Deak 2023-05-10 10:31 ` [Intel-gfx] [PATCH v4 10/14] drm/i915/dp: Prevent link training fallback on disconnected port Imre Deak ` (12 subsequent siblings) 21 siblings, 0 replies; 41+ messages in thread From: Imre Deak @ 2023-05-10 10:31 UTC (permalink / raw) To: intel-gfx If a sink is disconnected it's expected that link training actions will fail on it, so downgrade the error messages about such actions to be a debug message. Such - expected - link training failures are more frequent after a follow up patch, after which an active TypeC link is reset after the sink is disconnected which also involves a link training. v2: - Check the actual HPD state to handle the forced connector state case. (Vinod) Cc: Ville Syrjälä <ville.syrjala@linux.intel.com> Cc: Vinod Govindapillai <vinod.govindapillai@intel.com> Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com> (v1) Reviewed-by: Vinod Govindapillai <vinod.govindapillai@intel.com> Signed-off-by: Imre Deak <imre.deak@intel.com> --- .../gpu/drm/i915/display/intel_dp_link_training.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/drivers/gpu/drm/i915/display/intel_dp_link_training.c b/drivers/gpu/drm/i915/display/intel_dp_link_training.c index 4f33b79b23db0..51d1e4b4b2f19 100644 --- a/drivers/gpu/drm/i915/display/intel_dp_link_training.c +++ b/drivers/gpu/drm/i915/display/intel_dp_link_training.c @@ -38,10 +38,14 @@ LT_MSG_PREFIX _format, \ LT_MSG_ARGS(_intel_dp, _dp_phy), ## __VA_ARGS__) -#define lt_err(_intel_dp, _dp_phy, _format, ...) \ - drm_err(&dp_to_i915(_intel_dp)->drm, \ - LT_MSG_PREFIX _format, \ - LT_MSG_ARGS(_intel_dp, _dp_phy), ## __VA_ARGS__) +#define lt_err(_intel_dp, _dp_phy, _format, ...) do { \ + if (intel_digital_port_connected(&dp_to_dig_port(_intel_dp)->base)) \ + drm_err(&dp_to_i915(_intel_dp)->drm, \ + LT_MSG_PREFIX _format, \ + LT_MSG_ARGS(_intel_dp, _dp_phy), ## __VA_ARGS__); \ + else \ + lt_dbg(_intel_dp, _dp_phy, "Sink disconnected: " _format, ## __VA_ARGS__); \ +} while (0) static void intel_dp_reset_lttpr_common_caps(struct intel_dp *intel_dp) { -- 2.37.2 ^ permalink raw reply related [flat|nested] 41+ messages in thread
* [Intel-gfx] [PATCH v4 10/14] drm/i915/dp: Prevent link training fallback on disconnected port 2023-05-10 10:31 [Intel-gfx] [PATCH v4 00/14] drm/i915/tc: Add a workaround for an IOM/TCSS firmware hang issue Imre Deak ` (8 preceding siblings ...) 2023-05-10 10:31 ` [Intel-gfx] [PATCH v4 09/14] drm/i915/dp: Convert link training error to debug message on disconnected sink Imre Deak @ 2023-05-10 10:31 ` Imre Deak 2023-05-10 10:31 ` [Intel-gfx] [PATCH v4 11/14] drm/i915/dp: Factor out intel_dp_get_active_pipes() Imre Deak ` (11 subsequent siblings) 21 siblings, 0 replies; 41+ messages in thread From: Imre Deak @ 2023-05-10 10:31 UTC (permalink / raw) To: intel-gfx Prevent downgrading the link training maximum lane count/rate if the sink is disconnected - and so the link training failure is expected. In such cases modeset failures due to the reduced max link params would be just confusing for user space (instead of which the correct thing it should act on is the sink disconnect signaled by a hotplug event, requiring a disabling modeset). v2: - Check the actual HPD state to handle the forced connector state case. (Vinod) Cc: Ville Syrjälä <ville.syrjala@linux.intel.com> Cc: Vinod Govindapillai <vinod.govindapillai@intel.com> Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com> (v1) Reviewed-by: Vinod Govindapillai <vinod.govindapillai@intel.com> Signed-off-by: Imre Deak <imre.deak@intel.com> --- drivers/gpu/drm/i915/display/intel_dp_link_training.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/drivers/gpu/drm/i915/display/intel_dp_link_training.c b/drivers/gpu/drm/i915/display/intel_dp_link_training.c index 51d1e4b4b2f19..0952a707358c1 100644 --- a/drivers/gpu/drm/i915/display/intel_dp_link_training.c +++ b/drivers/gpu/drm/i915/display/intel_dp_link_training.c @@ -1065,6 +1065,11 @@ static void intel_dp_schedule_fallback_link_training(struct intel_dp *intel_dp, { struct intel_connector *intel_connector = intel_dp->attached_connector; + if (!intel_digital_port_connected(&dp_to_dig_port(intel_dp)->base)) { + lt_dbg(intel_dp, DP_PHY_DPRX, "Link Training failed on disconnected sink.\n"); + return; + } + if (intel_dp->hobl_active) { lt_dbg(intel_dp, DP_PHY_DPRX, "Link Training failed with HOBL active, not enabling it from now on\n"); -- 2.37.2 ^ permalink raw reply related [flat|nested] 41+ messages in thread
* [Intel-gfx] [PATCH v4 11/14] drm/i915/dp: Factor out intel_dp_get_active_pipes() 2023-05-10 10:31 [Intel-gfx] [PATCH v4 00/14] drm/i915/tc: Add a workaround for an IOM/TCSS firmware hang issue Imre Deak ` (9 preceding siblings ...) 2023-05-10 10:31 ` [Intel-gfx] [PATCH v4 10/14] drm/i915/dp: Prevent link training fallback on disconnected port Imre Deak @ 2023-05-10 10:31 ` Imre Deak 2023-05-10 10:31 ` [Intel-gfx] [PATCH v4 12/14] drm/i915: Factor out a helper for handling atomic modeset locks/state Imre Deak ` (10 subsequent siblings) 21 siblings, 0 replies; 41+ messages in thread From: Imre Deak @ 2023-05-10 10:31 UTC (permalink / raw) To: intel-gfx Factor out a helper used by a follow up patch to reset an active DP link. No functional changes. Cc: Ville Syrjälä <ville.syrjala@linux.intel.com> Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com> Signed-off-by: Imre Deak <imre.deak@intel.com> --- drivers/gpu/drm/i915/display/intel_dp.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c index 0cc57681dc4d4..99ceaa7d90b62 100644 --- a/drivers/gpu/drm/i915/display/intel_dp.c +++ b/drivers/gpu/drm/i915/display/intel_dp.c @@ -4231,9 +4231,9 @@ static bool intel_dp_has_connector(struct intel_dp *intel_dp, return false; } -static int intel_dp_prep_link_retrain(struct intel_dp *intel_dp, - struct drm_modeset_acquire_ctx *ctx, - u8 *pipe_mask) +static int intel_dp_get_active_pipes(struct intel_dp *intel_dp, + struct drm_modeset_acquire_ctx *ctx, + u8 *pipe_mask) { struct drm_i915_private *i915 = dp_to_i915(intel_dp); struct drm_connector_list_iter conn_iter; @@ -4242,9 +4242,6 @@ static int intel_dp_prep_link_retrain(struct intel_dp *intel_dp, *pipe_mask = 0; - if (!intel_dp_needs_link_retrain(intel_dp)) - return 0; - drm_connector_list_iter_begin(&i915->drm, &conn_iter); for_each_intel_connector_iter(connector, &conn_iter) { struct drm_connector_state *conn_state = @@ -4278,9 +4275,6 @@ static int intel_dp_prep_link_retrain(struct intel_dp *intel_dp, } drm_connector_list_iter_end(&conn_iter); - if (!intel_dp_needs_link_retrain(intel_dp)) - *pipe_mask = 0; - return ret; } @@ -4309,13 +4303,19 @@ int intel_dp_retrain_link(struct intel_encoder *encoder, if (ret) return ret; - ret = intel_dp_prep_link_retrain(intel_dp, ctx, &pipe_mask); + if (!intel_dp_needs_link_retrain(intel_dp)) + return 0; + + ret = intel_dp_get_active_pipes(intel_dp, ctx, &pipe_mask); if (ret) return ret; if (pipe_mask == 0) return 0; + if (!intel_dp_needs_link_retrain(intel_dp)) + return 0; + drm_dbg_kms(&dev_priv->drm, "[ENCODER:%d:%s] retraining link\n", encoder->base.base.id, encoder->base.name); -- 2.37.2 ^ permalink raw reply related [flat|nested] 41+ messages in thread
* [Intel-gfx] [PATCH v4 12/14] drm/i915: Factor out a helper for handling atomic modeset locks/state 2023-05-10 10:31 [Intel-gfx] [PATCH v4 00/14] drm/i915/tc: Add a workaround for an IOM/TCSS firmware hang issue Imre Deak ` (10 preceding siblings ...) 2023-05-10 10:31 ` [Intel-gfx] [PATCH v4 11/14] drm/i915/dp: Factor out intel_dp_get_active_pipes() Imre Deak @ 2023-05-10 10:31 ` Imre Deak 2023-05-10 10:31 ` [Intel-gfx] [PATCH v4 13/14] drm/i915/tc: Call TypeC port flush_work/cleanup without modeset locks held Imre Deak ` (9 subsequent siblings) 21 siblings, 0 replies; 41+ messages in thread From: Imre Deak @ 2023-05-10 10:31 UTC (permalink / raw) To: intel-gfx This patch simplifying the handling of modeset locks and atomic state for an atomic commit is based on https://lore.kernel.org/all/20210715184954.7794-2-ville.syrjala@linux.intel.com/ adding the helper to i915. I find this approach preferrable than open-coding the corresponding steps (fixed for me an atomic state reset during a DEADLK retry, which I missed in the open-coded version) and also better than the existing DRM_MODESET_LOCK_ALL_BEGIN/END macros for the reasons described in the above original patchset. This change takes the helper into use only for atomic commits during DDI hotplug handling, as a preparation for a follow-up patch adding a similar commit started from the same spot. Other places doing a driver-internal atomic commit is to be converted by a follow-up patchset. Cc: Ville Syrjälä <ville.syrjala@linux.intel.com> Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com> Signed-off-by: Imre Deak <imre.deak@intel.com> --- drivers/gpu/drm/i915/Makefile | 1 + drivers/gpu/drm/i915/display/intel_ddi.c | 17 ++----- .../gpu/drm/i915/display/intel_modeset_lock.c | 50 +++++++++++++++++++ .../gpu/drm/i915/display/intel_modeset_lock.h | 33 ++++++++++++ 4 files changed, 87 insertions(+), 14 deletions(-) create mode 100644 drivers/gpu/drm/i915/display/intel_modeset_lock.c create mode 100644 drivers/gpu/drm/i915/display/intel_modeset_lock.h diff --git a/drivers/gpu/drm/i915/Makefile b/drivers/gpu/drm/i915/Makefile index d97d45ae1a0d7..2a388bc1f07cb 100644 --- a/drivers/gpu/drm/i915/Makefile +++ b/drivers/gpu/drm/i915/Makefile @@ -264,6 +264,7 @@ i915-y += \ display/intel_hti.o \ display/intel_load_detect.o \ display/intel_lpe_audio.o \ + display/intel_modeset_lock.o \ display/intel_modeset_verify.o \ display/intel_modeset_setup.o \ display/intel_overlay.o \ diff --git a/drivers/gpu/drm/i915/display/intel_ddi.c b/drivers/gpu/drm/i915/display/intel_ddi.c index 0ba5492c06047..813be957ed11b 100644 --- a/drivers/gpu/drm/i915/display/intel_ddi.c +++ b/drivers/gpu/drm/i915/display/intel_ddi.c @@ -63,6 +63,7 @@ #include "intel_hti.h" #include "intel_lspcon.h" #include "intel_mg_phy_regs.h" +#include "intel_modeset_lock.h" #include "intel_pps.h" #include "intel_psr.h" #include "intel_quirks.h" @@ -4403,26 +4404,14 @@ intel_ddi_hotplug(struct intel_encoder *encoder, state = intel_encoder_hotplug(encoder, connector); - drm_modeset_acquire_init(&ctx, 0); - - for (;;) { + intel_modeset_lock_ctx_retry(&ctx, NULL, 0, ret) { if (connector->base.connector_type == DRM_MODE_CONNECTOR_HDMIA) ret = intel_hdmi_reset_link(encoder, &ctx); else ret = intel_dp_retrain_link(encoder, &ctx); - - if (ret == -EDEADLK) { - drm_modeset_backoff(&ctx); - continue; - } - - break; } - drm_modeset_drop_locks(&ctx); - drm_modeset_acquire_fini(&ctx); - drm_WARN(encoder->base.dev, ret, - "Acquiring modeset locks failed with %i\n", ret); + drm_WARN_ON(encoder->base.dev, ret); /* * Unpowered type-c dongles can take some time to boot and be diff --git a/drivers/gpu/drm/i915/display/intel_modeset_lock.c b/drivers/gpu/drm/i915/display/intel_modeset_lock.c new file mode 100644 index 0000000000000..8fb6fd849a75d --- /dev/null +++ b/drivers/gpu/drm/i915/display/intel_modeset_lock.c @@ -0,0 +1,50 @@ +// SPDX-License-Identifier: MIT +/* + * Copyright © 2023 Intel Corporation + */ + +#include <drm/drm_modeset_lock.h> + +#include "intel_display_types.h" +#include "intel_modeset_lock.h" + +void _intel_modeset_lock_begin(struct drm_modeset_acquire_ctx *ctx, + struct intel_atomic_state *state, + unsigned int flags, int *ret) +{ + drm_modeset_acquire_init(ctx, flags); + + if (state) + state->base.acquire_ctx = ctx; + + *ret = -EDEADLK; +} + +bool _intel_modeset_lock_loop(int *ret) +{ + if (*ret == -EDEADLK) { + *ret = 0; + return true; + } + + return false; +} + +void _intel_modeset_lock_end(struct drm_modeset_acquire_ctx *ctx, + struct intel_atomic_state *state, + int *ret) +{ + if (*ret == -EDEADLK) { + if (state) + drm_atomic_state_clear(&state->base); + + *ret = drm_modeset_backoff(ctx); + if (*ret == 0) { + *ret = -EDEADLK; + return; + } + } + + drm_modeset_drop_locks(ctx); + drm_modeset_acquire_fini(ctx); +} diff --git a/drivers/gpu/drm/i915/display/intel_modeset_lock.h b/drivers/gpu/drm/i915/display/intel_modeset_lock.h new file mode 100644 index 0000000000000..edb5099bcd99c --- /dev/null +++ b/drivers/gpu/drm/i915/display/intel_modeset_lock.h @@ -0,0 +1,33 @@ +/* SPDX-License-Identifier: MIT */ +/* + * Copyright © 2023 Intel Corporation + */ + +#ifndef __INTEL_MODESET_LOCK_H__ +#define __INTEL_MODESET_LOCK_H__ + +#include <linux/types.h> + +struct drm_modeset_acquire_ctx; +struct intel_atomic_state; + +void _intel_modeset_lock_begin(struct drm_modeset_acquire_ctx *ctx, + struct intel_atomic_state *state, + unsigned int flags, + int *ret); +bool _intel_modeset_lock_loop(int *ret); +void _intel_modeset_lock_end(struct drm_modeset_acquire_ctx *ctx, + struct intel_atomic_state *state, + int *ret); + +/* + * Note that one must always use "continue" rather than + * "break" or "return" to handle errors within the + * intel_modeset_lock_ctx_retry() block. + */ +#define intel_modeset_lock_ctx_retry(ctx, state, flags, ret) \ + for (_intel_modeset_lock_begin((ctx), (state), (flags), &(ret)); \ + _intel_modeset_lock_loop(&(ret)); \ + _intel_modeset_lock_end((ctx), (state), &(ret))) + +#endif /* __INTEL_MODESET_LOCK_H__ */ -- 2.37.2 ^ permalink raw reply related [flat|nested] 41+ messages in thread
* [Intel-gfx] [PATCH v4 13/14] drm/i915/tc: Call TypeC port flush_work/cleanup without modeset locks held 2023-05-10 10:31 [Intel-gfx] [PATCH v4 00/14] drm/i915/tc: Add a workaround for an IOM/TCSS firmware hang issue Imre Deak ` (11 preceding siblings ...) 2023-05-10 10:31 ` [Intel-gfx] [PATCH v4 12/14] drm/i915: Factor out a helper for handling atomic modeset locks/state Imre Deak @ 2023-05-10 10:31 ` Imre Deak 2023-05-10 14:03 ` Ville Syrjälä 2023-05-12 19:55 ` [Intel-gfx] [PATCH v5 " Imre Deak 2023-05-10 10:31 ` [Intel-gfx] [PATCH v4 14/14] drm/i915/tc: Reset TypeC PHYs left enabled in DP-alt mode after the sink disconnects Imre Deak ` (8 subsequent siblings) 21 siblings, 2 replies; 41+ messages in thread From: Imre Deak @ 2023-05-10 10:31 UTC (permalink / raw) To: intel-gfx Call the TypeC port flush_work and cleanup handlers without the modeset locks held. These don't require the locks, as the work takes - as it should be able to at any point in time - any locks it needs and by the time cleanup is called and after cleanup returns the encoder is not in use. This is required by the next patch canceling a TypeC port work synchronously during encoder suspend and shutdown, where the work can take modeset locks as well, hence the canceling must be done without holding the locks. I also considered moving the modeset locking down to each encoder suspend()/shutdown() hook instead, however locking the full modeset state for each encoder separately would be odd, and the bigger change - affecting all encoders - is beyond the scope of this patchset. Cc: Ville Syrjälä <ville.syrjala@linux.intel.com> Signed-off-by: Imre Deak <imre.deak@intel.com> --- drivers/gpu/drm/i915/display/intel_ddi.c | 27 +++++++++---------- .../drm/i915/display/intel_display_types.h | 12 +++++++++ drivers/gpu/drm/i915/i915_driver.c | 8 ++++++ 3 files changed, 33 insertions(+), 14 deletions(-) diff --git a/drivers/gpu/drm/i915/display/intel_ddi.c b/drivers/gpu/drm/i915/display/intel_ddi.c index 813be957ed11b..7d09bd2412352 100644 --- a/drivers/gpu/drm/i915/display/intel_ddi.c +++ b/drivers/gpu/drm/i915/display/intel_ddi.c @@ -4617,31 +4617,27 @@ static bool intel_ddi_is_tc(struct drm_i915_private *i915, enum port port) static void intel_ddi_encoder_suspend(struct intel_encoder *encoder) { - struct intel_dp *intel_dp = enc_to_intel_dp(encoder); - struct drm_i915_private *i915 = dp_to_i915(intel_dp); - struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp); - enum phy phy = intel_port_to_phy(i915, encoder->port); - intel_dp_encoder_suspend(encoder); +} - if (!intel_phy_is_tc(i915, phy)) - return; +static void intel_ddi_tc_encoder_suspend_complete(struct intel_encoder *encoder) +{ + struct intel_dp *intel_dp = enc_to_intel_dp(encoder); + struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp); intel_tc_port_flush_work(dig_port); } static void intel_ddi_encoder_shutdown(struct intel_encoder *encoder) { - struct intel_dp *intel_dp = enc_to_intel_dp(encoder); - struct drm_i915_private *i915 = dp_to_i915(intel_dp); - struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp); - enum phy phy = intel_port_to_phy(i915, encoder->port); - intel_dp_encoder_shutdown(encoder); intel_hdmi_encoder_shutdown(encoder); +} - if (!intel_phy_is_tc(i915, phy)) - return; +static void intel_ddi_tc_encoder_shutdown_complete(struct intel_encoder *encoder) +{ + struct intel_dp *intel_dp = enc_to_intel_dp(encoder); + struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp); intel_tc_port_cleanup(dig_port); } @@ -4908,6 +4904,9 @@ void intel_ddi_init(struct drm_i915_private *dev_priv, enum port port) is_legacy ? "legacy" : "non-legacy"); } + encoder->suspend_complete = intel_ddi_tc_encoder_suspend_complete; + encoder->shutdown_complete = intel_ddi_tc_encoder_shutdown_complete; + if (intel_tc_port_init(dig_port, is_legacy) < 0) goto err; } diff --git a/drivers/gpu/drm/i915/display/intel_display_types.h b/drivers/gpu/drm/i915/display/intel_display_types.h index 270c4c84a2920..88b2a55d19f21 100644 --- a/drivers/gpu/drm/i915/display/intel_display_types.h +++ b/drivers/gpu/drm/i915/display/intel_display_types.h @@ -233,13 +233,25 @@ struct intel_encoder { * Called during system suspend after all pending requests for the * encoder are flushed (for example for DP AUX transactions) and * device interrupts are disabled. + * All modeset locks are held while the hook is called. */ void (*suspend)(struct intel_encoder *); + /* + * Called without the modeset locks held after the suspend() hook for + * all encoders have been called. + */ + void (*suspend_complete)(struct intel_encoder *encoder); /* * Called during system reboot/shutdown after all the * encoders have been disabled and suspended. + * All modeset locks are held while the hook is called. */ void (*shutdown)(struct intel_encoder *encoder); + /* + * Called without the modeset locks held after the shutdown() hook for + * all encoders have been called. + */ + void (*shutdown_complete)(struct intel_encoder *encoder); /* * Enable/disable the clock to the port. */ diff --git a/drivers/gpu/drm/i915/i915_driver.c b/drivers/gpu/drm/i915/i915_driver.c index fd198700272b1..705ba65f2ff9a 100644 --- a/drivers/gpu/drm/i915/i915_driver.c +++ b/drivers/gpu/drm/i915/i915_driver.c @@ -964,6 +964,10 @@ static void intel_suspend_encoders(struct drm_i915_private *dev_priv) if (encoder->suspend) encoder->suspend(encoder); drm_modeset_unlock_all(&dev_priv->drm); + + for_each_intel_encoder(&dev_priv->drm, encoder) + if (encoder->suspend_complete) + encoder->suspend_complete(encoder); } static void intel_shutdown_encoders(struct drm_i915_private *dev_priv) @@ -978,6 +982,10 @@ static void intel_shutdown_encoders(struct drm_i915_private *dev_priv) if (encoder->shutdown) encoder->shutdown(encoder); drm_modeset_unlock_all(&dev_priv->drm); + + for_each_intel_encoder(&dev_priv->drm, encoder) + if (encoder->shutdown_complete) + encoder->shutdown_complete(encoder); } void i915_driver_shutdown(struct drm_i915_private *i915) -- 2.37.2 ^ permalink raw reply related [flat|nested] 41+ messages in thread
* Re: [Intel-gfx] [PATCH v4 13/14] drm/i915/tc: Call TypeC port flush_work/cleanup without modeset locks held 2023-05-10 10:31 ` [Intel-gfx] [PATCH v4 13/14] drm/i915/tc: Call TypeC port flush_work/cleanup without modeset locks held Imre Deak @ 2023-05-10 14:03 ` Ville Syrjälä 2023-05-10 14:10 ` Imre Deak 2023-05-12 19:55 ` [Intel-gfx] [PATCH v5 " Imre Deak 1 sibling, 1 reply; 41+ messages in thread From: Ville Syrjälä @ 2023-05-10 14:03 UTC (permalink / raw) To: Imre Deak; +Cc: intel-gfx On Wed, May 10, 2023 at 01:31:30PM +0300, Imre Deak wrote: > Call the TypeC port flush_work and cleanup handlers without the modeset > locks held. These don't require the locks, as the work takes - as it > should be able to at any point in time - any locks it needs and by the > time cleanup is called and after cleanup returns the encoder is not in > use. > > This is required by the next patch canceling a TypeC port work > synchronously during encoder suspend and shutdown, where the work can > take modeset locks as well, hence the canceling must be done without > holding the locks. > > I also considered moving the modeset locking down to each encoder > suspend()/shutdown() hook instead, however locking the full modeset > state for each encoder separately would be odd, and the bigger change - > affecting all encoders - is beyond the scope of this patchset. Hmm. What is it in the encoder shutdown/suspend hooks that actually needs the modeset locks? > > Cc: Ville Syrjälä <ville.syrjala@linux.intel.com> > Signed-off-by: Imre Deak <imre.deak@intel.com> > --- > drivers/gpu/drm/i915/display/intel_ddi.c | 27 +++++++++---------- > .../drm/i915/display/intel_display_types.h | 12 +++++++++ > drivers/gpu/drm/i915/i915_driver.c | 8 ++++++ > 3 files changed, 33 insertions(+), 14 deletions(-) > > diff --git a/drivers/gpu/drm/i915/display/intel_ddi.c b/drivers/gpu/drm/i915/display/intel_ddi.c > index 813be957ed11b..7d09bd2412352 100644 > --- a/drivers/gpu/drm/i915/display/intel_ddi.c > +++ b/drivers/gpu/drm/i915/display/intel_ddi.c > @@ -4617,31 +4617,27 @@ static bool intel_ddi_is_tc(struct drm_i915_private *i915, enum port port) > > static void intel_ddi_encoder_suspend(struct intel_encoder *encoder) > { > - struct intel_dp *intel_dp = enc_to_intel_dp(encoder); > - struct drm_i915_private *i915 = dp_to_i915(intel_dp); > - struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp); > - enum phy phy = intel_port_to_phy(i915, encoder->port); > - > intel_dp_encoder_suspend(encoder); > +} > > - if (!intel_phy_is_tc(i915, phy)) > - return; > +static void intel_ddi_tc_encoder_suspend_complete(struct intel_encoder *encoder) > +{ > + struct intel_dp *intel_dp = enc_to_intel_dp(encoder); > + struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp); > > intel_tc_port_flush_work(dig_port); > } > > static void intel_ddi_encoder_shutdown(struct intel_encoder *encoder) > { > - struct intel_dp *intel_dp = enc_to_intel_dp(encoder); > - struct drm_i915_private *i915 = dp_to_i915(intel_dp); > - struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp); > - enum phy phy = intel_port_to_phy(i915, encoder->port); > - > intel_dp_encoder_shutdown(encoder); > intel_hdmi_encoder_shutdown(encoder); > +} > > - if (!intel_phy_is_tc(i915, phy)) > - return; > +static void intel_ddi_tc_encoder_shutdown_complete(struct intel_encoder *encoder) > +{ > + struct intel_dp *intel_dp = enc_to_intel_dp(encoder); > + struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp); > > intel_tc_port_cleanup(dig_port); > } > @@ -4908,6 +4904,9 @@ void intel_ddi_init(struct drm_i915_private *dev_priv, enum port port) > is_legacy ? "legacy" : "non-legacy"); > } > > + encoder->suspend_complete = intel_ddi_tc_encoder_suspend_complete; > + encoder->shutdown_complete = intel_ddi_tc_encoder_shutdown_complete; > + > if (intel_tc_port_init(dig_port, is_legacy) < 0) > goto err; > } > diff --git a/drivers/gpu/drm/i915/display/intel_display_types.h b/drivers/gpu/drm/i915/display/intel_display_types.h > index 270c4c84a2920..88b2a55d19f21 100644 > --- a/drivers/gpu/drm/i915/display/intel_display_types.h > +++ b/drivers/gpu/drm/i915/display/intel_display_types.h > @@ -233,13 +233,25 @@ struct intel_encoder { > * Called during system suspend after all pending requests for the > * encoder are flushed (for example for DP AUX transactions) and > * device interrupts are disabled. > + * All modeset locks are held while the hook is called. > */ > void (*suspend)(struct intel_encoder *); > + /* > + * Called without the modeset locks held after the suspend() hook for > + * all encoders have been called. > + */ > + void (*suspend_complete)(struct intel_encoder *encoder); > /* > * Called during system reboot/shutdown after all the > * encoders have been disabled and suspended. > + * All modeset locks are held while the hook is called. > */ > void (*shutdown)(struct intel_encoder *encoder); > + /* > + * Called without the modeset locks held after the shutdown() hook for > + * all encoders have been called. > + */ > + void (*shutdown_complete)(struct intel_encoder *encoder); > /* > * Enable/disable the clock to the port. > */ > diff --git a/drivers/gpu/drm/i915/i915_driver.c b/drivers/gpu/drm/i915/i915_driver.c > index fd198700272b1..705ba65f2ff9a 100644 > --- a/drivers/gpu/drm/i915/i915_driver.c > +++ b/drivers/gpu/drm/i915/i915_driver.c > @@ -964,6 +964,10 @@ static void intel_suspend_encoders(struct drm_i915_private *dev_priv) > if (encoder->suspend) > encoder->suspend(encoder); > drm_modeset_unlock_all(&dev_priv->drm); > + > + for_each_intel_encoder(&dev_priv->drm, encoder) > + if (encoder->suspend_complete) > + encoder->suspend_complete(encoder); > } > > static void intel_shutdown_encoders(struct drm_i915_private *dev_priv) > @@ -978,6 +982,10 @@ static void intel_shutdown_encoders(struct drm_i915_private *dev_priv) > if (encoder->shutdown) > encoder->shutdown(encoder); > drm_modeset_unlock_all(&dev_priv->drm); > + > + for_each_intel_encoder(&dev_priv->drm, encoder) > + if (encoder->shutdown_complete) > + encoder->shutdown_complete(encoder); > } > > void i915_driver_shutdown(struct drm_i915_private *i915) > -- > 2.37.2 -- Ville Syrjälä Intel ^ permalink raw reply [flat|nested] 41+ messages in thread
* Re: [Intel-gfx] [PATCH v4 13/14] drm/i915/tc: Call TypeC port flush_work/cleanup without modeset locks held 2023-05-10 14:03 ` Ville Syrjälä @ 2023-05-10 14:10 ` Imre Deak 2023-05-11 17:40 ` Ville Syrjälä 0 siblings, 1 reply; 41+ messages in thread From: Imre Deak @ 2023-05-10 14:10 UTC (permalink / raw) To: Ville Syrjälä; +Cc: intel-gfx On Wed, May 10, 2023 at 05:03:17PM +0300, Ville Syrjälä wrote: > On Wed, May 10, 2023 at 01:31:30PM +0300, Imre Deak wrote: > > Call the TypeC port flush_work and cleanup handlers without the modeset > > locks held. These don't require the locks, as the work takes - as it > > should be able to at any point in time - any locks it needs and by the > > time cleanup is called and after cleanup returns the encoder is not in > > use. > > > > This is required by the next patch canceling a TypeC port work > > synchronously during encoder suspend and shutdown, where the work can > > take modeset locks as well, hence the canceling must be done without > > holding the locks. > > > > I also considered moving the modeset locking down to each encoder > > suspend()/shutdown() hook instead, however locking the full modeset > > state for each encoder separately would be odd, and the bigger change - > > affecting all encoders - is beyond the scope of this patchset. > > Hmm. What is it in the encoder shutdown/suspend hooks that > actually needs the modeset locks? In the case of intel_dp_encoder_suspend() for instance, I assume nothing, since the VDD work and intel_pps_vdd_off_sync() should take whatever locks they require. So presumably most (all) of those could be made lockless. However, I would like to leave that kind of change for a follow-up if possible, not to affect in this patchset any other encoder types (again because of possible need for CC stable). > > > > > Cc: Ville Syrjälä <ville.syrjala@linux.intel.com> > > Signed-off-by: Imre Deak <imre.deak@intel.com> > > --- > > drivers/gpu/drm/i915/display/intel_ddi.c | 27 +++++++++---------- > > .../drm/i915/display/intel_display_types.h | 12 +++++++++ > > drivers/gpu/drm/i915/i915_driver.c | 8 ++++++ > > 3 files changed, 33 insertions(+), 14 deletions(-) > > > > diff --git a/drivers/gpu/drm/i915/display/intel_ddi.c b/drivers/gpu/drm/i915/display/intel_ddi.c > > index 813be957ed11b..7d09bd2412352 100644 > > --- a/drivers/gpu/drm/i915/display/intel_ddi.c > > +++ b/drivers/gpu/drm/i915/display/intel_ddi.c > > @@ -4617,31 +4617,27 @@ static bool intel_ddi_is_tc(struct drm_i915_private *i915, enum port port) > > > > static void intel_ddi_encoder_suspend(struct intel_encoder *encoder) > > { > > - struct intel_dp *intel_dp = enc_to_intel_dp(encoder); > > - struct drm_i915_private *i915 = dp_to_i915(intel_dp); > > - struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp); > > - enum phy phy = intel_port_to_phy(i915, encoder->port); > > - > > intel_dp_encoder_suspend(encoder); > > +} > > > > - if (!intel_phy_is_tc(i915, phy)) > > - return; > > +static void intel_ddi_tc_encoder_suspend_complete(struct intel_encoder *encoder) > > +{ > > + struct intel_dp *intel_dp = enc_to_intel_dp(encoder); > > + struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp); > > > > intel_tc_port_flush_work(dig_port); > > } > > > > static void intel_ddi_encoder_shutdown(struct intel_encoder *encoder) > > { > > - struct intel_dp *intel_dp = enc_to_intel_dp(encoder); > > - struct drm_i915_private *i915 = dp_to_i915(intel_dp); > > - struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp); > > - enum phy phy = intel_port_to_phy(i915, encoder->port); > > - > > intel_dp_encoder_shutdown(encoder); > > intel_hdmi_encoder_shutdown(encoder); > > +} > > > > - if (!intel_phy_is_tc(i915, phy)) > > - return; > > +static void intel_ddi_tc_encoder_shutdown_complete(struct intel_encoder *encoder) > > +{ > > + struct intel_dp *intel_dp = enc_to_intel_dp(encoder); > > + struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp); > > > > intel_tc_port_cleanup(dig_port); > > } > > @@ -4908,6 +4904,9 @@ void intel_ddi_init(struct drm_i915_private *dev_priv, enum port port) > > is_legacy ? "legacy" : "non-legacy"); > > } > > > > + encoder->suspend_complete = intel_ddi_tc_encoder_suspend_complete; > > + encoder->shutdown_complete = intel_ddi_tc_encoder_shutdown_complete; > > + > > if (intel_tc_port_init(dig_port, is_legacy) < 0) > > goto err; > > } > > diff --git a/drivers/gpu/drm/i915/display/intel_display_types.h b/drivers/gpu/drm/i915/display/intel_display_types.h > > index 270c4c84a2920..88b2a55d19f21 100644 > > --- a/drivers/gpu/drm/i915/display/intel_display_types.h > > +++ b/drivers/gpu/drm/i915/display/intel_display_types.h > > @@ -233,13 +233,25 @@ struct intel_encoder { > > * Called during system suspend after all pending requests for the > > * encoder are flushed (for example for DP AUX transactions) and > > * device interrupts are disabled. > > + * All modeset locks are held while the hook is called. > > */ > > void (*suspend)(struct intel_encoder *); > > + /* > > + * Called without the modeset locks held after the suspend() hook for > > + * all encoders have been called. > > + */ > > + void (*suspend_complete)(struct intel_encoder *encoder); > > /* > > * Called during system reboot/shutdown after all the > > * encoders have been disabled and suspended. > > + * All modeset locks are held while the hook is called. > > */ > > void (*shutdown)(struct intel_encoder *encoder); > > + /* > > + * Called without the modeset locks held after the shutdown() hook for > > + * all encoders have been called. > > + */ > > + void (*shutdown_complete)(struct intel_encoder *encoder); > > /* > > * Enable/disable the clock to the port. > > */ > > diff --git a/drivers/gpu/drm/i915/i915_driver.c b/drivers/gpu/drm/i915/i915_driver.c > > index fd198700272b1..705ba65f2ff9a 100644 > > --- a/drivers/gpu/drm/i915/i915_driver.c > > +++ b/drivers/gpu/drm/i915/i915_driver.c > > @@ -964,6 +964,10 @@ static void intel_suspend_encoders(struct drm_i915_private *dev_priv) > > if (encoder->suspend) > > encoder->suspend(encoder); > > drm_modeset_unlock_all(&dev_priv->drm); > > + > > + for_each_intel_encoder(&dev_priv->drm, encoder) > > + if (encoder->suspend_complete) > > + encoder->suspend_complete(encoder); > > } > > > > static void intel_shutdown_encoders(struct drm_i915_private *dev_priv) > > @@ -978,6 +982,10 @@ static void intel_shutdown_encoders(struct drm_i915_private *dev_priv) > > if (encoder->shutdown) > > encoder->shutdown(encoder); > > drm_modeset_unlock_all(&dev_priv->drm); > > + > > + for_each_intel_encoder(&dev_priv->drm, encoder) > > + if (encoder->shutdown_complete) > > + encoder->shutdown_complete(encoder); > > } > > > > void i915_driver_shutdown(struct drm_i915_private *i915) > > -- > > 2.37.2 > > -- > Ville Syrjälä > Intel ^ permalink raw reply [flat|nested] 41+ messages in thread
* Re: [Intel-gfx] [PATCH v4 13/14] drm/i915/tc: Call TypeC port flush_work/cleanup without modeset locks held 2023-05-10 14:10 ` Imre Deak @ 2023-05-11 17:40 ` Ville Syrjälä 2023-05-12 13:38 ` Imre Deak 0 siblings, 1 reply; 41+ messages in thread From: Ville Syrjälä @ 2023-05-11 17:40 UTC (permalink / raw) To: Imre Deak; +Cc: intel-gfx On Wed, May 10, 2023 at 05:10:22PM +0300, Imre Deak wrote: > On Wed, May 10, 2023 at 05:03:17PM +0300, Ville Syrjälä wrote: > > On Wed, May 10, 2023 at 01:31:30PM +0300, Imre Deak wrote: > > > Call the TypeC port flush_work and cleanup handlers without the modeset > > > locks held. These don't require the locks, as the work takes - as it > > > should be able to at any point in time - any locks it needs and by the > > > time cleanup is called and after cleanup returns the encoder is not in > > > use. > > > > > > This is required by the next patch canceling a TypeC port work > > > synchronously during encoder suspend and shutdown, where the work can > > > take modeset locks as well, hence the canceling must be done without > > > holding the locks. > > > > > > I also considered moving the modeset locking down to each encoder > > > suspend()/shutdown() hook instead, however locking the full modeset > > > state for each encoder separately would be odd, and the bigger change - > > > affecting all encoders - is beyond the scope of this patchset. > > > > Hmm. What is it in the encoder shutdown/suspend hooks that > > actually needs the modeset locks? > > In the case of intel_dp_encoder_suspend() for instance, I assume > nothing, since the VDD work and intel_pps_vdd_off_sync() should take > whatever locks they require. > > So presumably most (all) of those could be made lockless. However, I > would like to leave that kind of change for a follow-up if possible, not > to affect in this patchset any other encoder types (again because of > possible need for CC stable). Yeah sure. A bit irksome to have to add vfuncs and whatnot for it though, but it's not the end of the world. Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com> > > > > > > > > > Cc: Ville Syrjälä <ville.syrjala@linux.intel.com> > > > Signed-off-by: Imre Deak <imre.deak@intel.com> > > > --- > > > drivers/gpu/drm/i915/display/intel_ddi.c | 27 +++++++++---------- > > > .../drm/i915/display/intel_display_types.h | 12 +++++++++ > > > drivers/gpu/drm/i915/i915_driver.c | 8 ++++++ > > > 3 files changed, 33 insertions(+), 14 deletions(-) > > > > > > diff --git a/drivers/gpu/drm/i915/display/intel_ddi.c b/drivers/gpu/drm/i915/display/intel_ddi.c > > > index 813be957ed11b..7d09bd2412352 100644 > > > --- a/drivers/gpu/drm/i915/display/intel_ddi.c > > > +++ b/drivers/gpu/drm/i915/display/intel_ddi.c > > > @@ -4617,31 +4617,27 @@ static bool intel_ddi_is_tc(struct drm_i915_private *i915, enum port port) > > > > > > static void intel_ddi_encoder_suspend(struct intel_encoder *encoder) > > > { > > > - struct intel_dp *intel_dp = enc_to_intel_dp(encoder); > > > - struct drm_i915_private *i915 = dp_to_i915(intel_dp); > > > - struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp); > > > - enum phy phy = intel_port_to_phy(i915, encoder->port); > > > - > > > intel_dp_encoder_suspend(encoder); > > > +} > > > > > > - if (!intel_phy_is_tc(i915, phy)) > > > - return; > > > +static void intel_ddi_tc_encoder_suspend_complete(struct intel_encoder *encoder) > > > +{ > > > + struct intel_dp *intel_dp = enc_to_intel_dp(encoder); > > > + struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp); > > > > > > intel_tc_port_flush_work(dig_port); > > > } > > > > > > static void intel_ddi_encoder_shutdown(struct intel_encoder *encoder) > > > { > > > - struct intel_dp *intel_dp = enc_to_intel_dp(encoder); > > > - struct drm_i915_private *i915 = dp_to_i915(intel_dp); > > > - struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp); > > > - enum phy phy = intel_port_to_phy(i915, encoder->port); > > > - > > > intel_dp_encoder_shutdown(encoder); > > > intel_hdmi_encoder_shutdown(encoder); > > > +} > > > > > > - if (!intel_phy_is_tc(i915, phy)) > > > - return; > > > +static void intel_ddi_tc_encoder_shutdown_complete(struct intel_encoder *encoder) > > > +{ > > > + struct intel_dp *intel_dp = enc_to_intel_dp(encoder); > > > + struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp); > > > > > > intel_tc_port_cleanup(dig_port); > > > } > > > @@ -4908,6 +4904,9 @@ void intel_ddi_init(struct drm_i915_private *dev_priv, enum port port) > > > is_legacy ? "legacy" : "non-legacy"); > > > } > > > > > > + encoder->suspend_complete = intel_ddi_tc_encoder_suspend_complete; > > > + encoder->shutdown_complete = intel_ddi_tc_encoder_shutdown_complete; > > > + > > > if (intel_tc_port_init(dig_port, is_legacy) < 0) > > > goto err; > > > } > > > diff --git a/drivers/gpu/drm/i915/display/intel_display_types.h b/drivers/gpu/drm/i915/display/intel_display_types.h > > > index 270c4c84a2920..88b2a55d19f21 100644 > > > --- a/drivers/gpu/drm/i915/display/intel_display_types.h > > > +++ b/drivers/gpu/drm/i915/display/intel_display_types.h > > > @@ -233,13 +233,25 @@ struct intel_encoder { > > > * Called during system suspend after all pending requests for the > > > * encoder are flushed (for example for DP AUX transactions) and > > > * device interrupts are disabled. > > > + * All modeset locks are held while the hook is called. > > > */ > > > void (*suspend)(struct intel_encoder *); > > > + /* > > > + * Called without the modeset locks held after the suspend() hook for > > > + * all encoders have been called. > > > + */ > > > + void (*suspend_complete)(struct intel_encoder *encoder); > > > /* > > > * Called during system reboot/shutdown after all the > > > * encoders have been disabled and suspended. > > > + * All modeset locks are held while the hook is called. > > > */ > > > void (*shutdown)(struct intel_encoder *encoder); > > > + /* > > > + * Called without the modeset locks held after the shutdown() hook for > > > + * all encoders have been called. > > > + */ > > > + void (*shutdown_complete)(struct intel_encoder *encoder); > > > /* > > > * Enable/disable the clock to the port. > > > */ > > > diff --git a/drivers/gpu/drm/i915/i915_driver.c b/drivers/gpu/drm/i915/i915_driver.c > > > index fd198700272b1..705ba65f2ff9a 100644 > > > --- a/drivers/gpu/drm/i915/i915_driver.c > > > +++ b/drivers/gpu/drm/i915/i915_driver.c > > > @@ -964,6 +964,10 @@ static void intel_suspend_encoders(struct drm_i915_private *dev_priv) > > > if (encoder->suspend) > > > encoder->suspend(encoder); > > > drm_modeset_unlock_all(&dev_priv->drm); > > > + > > > + for_each_intel_encoder(&dev_priv->drm, encoder) > > > + if (encoder->suspend_complete) > > > + encoder->suspend_complete(encoder); > > > } > > > > > > static void intel_shutdown_encoders(struct drm_i915_private *dev_priv) > > > @@ -978,6 +982,10 @@ static void intel_shutdown_encoders(struct drm_i915_private *dev_priv) > > > if (encoder->shutdown) > > > encoder->shutdown(encoder); > > > drm_modeset_unlock_all(&dev_priv->drm); > > > + > > > + for_each_intel_encoder(&dev_priv->drm, encoder) > > > + if (encoder->shutdown_complete) > > > + encoder->shutdown_complete(encoder); > > > } > > > > > > void i915_driver_shutdown(struct drm_i915_private *i915) > > > -- > > > 2.37.2 > > > > -- > > Ville Syrjälä > > Intel -- Ville Syrjälä Intel ^ permalink raw reply [flat|nested] 41+ messages in thread
* Re: [Intel-gfx] [PATCH v4 13/14] drm/i915/tc: Call TypeC port flush_work/cleanup without modeset locks held 2023-05-11 17:40 ` Ville Syrjälä @ 2023-05-12 13:38 ` Imre Deak 0 siblings, 0 replies; 41+ messages in thread From: Imre Deak @ 2023-05-12 13:38 UTC (permalink / raw) To: Ville Syrjälä; +Cc: intel-gfx On Thu, May 11, 2023 at 08:40:58PM +0300, Ville Syrjälä wrote: > On Wed, May 10, 2023 at 05:10:22PM +0300, Imre Deak wrote: > > On Wed, May 10, 2023 at 05:03:17PM +0300, Ville Syrjälä wrote: > > > On Wed, May 10, 2023 at 01:31:30PM +0300, Imre Deak wrote: > > > > Call the TypeC port flush_work and cleanup handlers without the modeset > > > > locks held. These don't require the locks, as the work takes - as it > > > > should be able to at any point in time - any locks it needs and by the > > > > time cleanup is called and after cleanup returns the encoder is not in > > > > use. > > > > > > > > This is required by the next patch canceling a TypeC port work > > > > synchronously during encoder suspend and shutdown, where the work can > > > > take modeset locks as well, hence the canceling must be done without > > > > holding the locks. > > > > > > > > I also considered moving the modeset locking down to each encoder > > > > suspend()/shutdown() hook instead, however locking the full modeset > > > > state for each encoder separately would be odd, and the bigger change - > > > > affecting all encoders - is beyond the scope of this patchset. > > > > > > Hmm. What is it in the encoder shutdown/suspend hooks that > > > actually needs the modeset locks? > > > > In the case of intel_dp_encoder_suspend() for instance, I assume > > nothing, since the VDD work and intel_pps_vdd_off_sync() should take > > whatever locks they require. > > > > So presumably most (all) of those could be made lockless. However, I > > would like to leave that kind of change for a follow-up if possible, not > > to affect in this patchset any other encoder types (again because of > > possible need for CC stable). > > Yeah sure. Ok, will add a TODO comment about this. > A bit irksome to have to add vfuncs and whatnot for > it though, but it's not the end of the world. Direct intel_tc calls from intel_suspend/shutdown_encoders didn't seem ideal either, but can do that if you think that's better. > Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com> > > > > > > > > > > > > > > Cc: Ville Syrjälä <ville.syrjala@linux.intel.com> > > > > Signed-off-by: Imre Deak <imre.deak@intel.com> > > > > --- > > > > drivers/gpu/drm/i915/display/intel_ddi.c | 27 +++++++++---------- > > > > .../drm/i915/display/intel_display_types.h | 12 +++++++++ > > > > drivers/gpu/drm/i915/i915_driver.c | 8 ++++++ > > > > 3 files changed, 33 insertions(+), 14 deletions(-) > > > > > > > > diff --git a/drivers/gpu/drm/i915/display/intel_ddi.c b/drivers/gpu/drm/i915/display/intel_ddi.c > > > > index 813be957ed11b..7d09bd2412352 100644 > > > > --- a/drivers/gpu/drm/i915/display/intel_ddi.c > > > > +++ b/drivers/gpu/drm/i915/display/intel_ddi.c > > > > @@ -4617,31 +4617,27 @@ static bool intel_ddi_is_tc(struct drm_i915_private *i915, enum port port) > > > > > > > > static void intel_ddi_encoder_suspend(struct intel_encoder *encoder) > > > > { > > > > - struct intel_dp *intel_dp = enc_to_intel_dp(encoder); > > > > - struct drm_i915_private *i915 = dp_to_i915(intel_dp); > > > > - struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp); > > > > - enum phy phy = intel_port_to_phy(i915, encoder->port); > > > > - > > > > intel_dp_encoder_suspend(encoder); > > > > +} > > > > > > > > - if (!intel_phy_is_tc(i915, phy)) > > > > - return; > > > > +static void intel_ddi_tc_encoder_suspend_complete(struct intel_encoder *encoder) > > > > +{ > > > > + struct intel_dp *intel_dp = enc_to_intel_dp(encoder); > > > > + struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp); > > > > > > > > intel_tc_port_flush_work(dig_port); > > > > } > > > > > > > > static void intel_ddi_encoder_shutdown(struct intel_encoder *encoder) > > > > { > > > > - struct intel_dp *intel_dp = enc_to_intel_dp(encoder); > > > > - struct drm_i915_private *i915 = dp_to_i915(intel_dp); > > > > - struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp); > > > > - enum phy phy = intel_port_to_phy(i915, encoder->port); > > > > - > > > > intel_dp_encoder_shutdown(encoder); > > > > intel_hdmi_encoder_shutdown(encoder); > > > > +} > > > > > > > > - if (!intel_phy_is_tc(i915, phy)) > > > > - return; > > > > +static void intel_ddi_tc_encoder_shutdown_complete(struct intel_encoder *encoder) > > > > +{ > > > > + struct intel_dp *intel_dp = enc_to_intel_dp(encoder); > > > > + struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp); > > > > > > > > intel_tc_port_cleanup(dig_port); > > > > } > > > > @@ -4908,6 +4904,9 @@ void intel_ddi_init(struct drm_i915_private *dev_priv, enum port port) > > > > is_legacy ? "legacy" : "non-legacy"); > > > > } > > > > > > > > + encoder->suspend_complete = intel_ddi_tc_encoder_suspend_complete; > > > > + encoder->shutdown_complete = intel_ddi_tc_encoder_shutdown_complete; > > > > + > > > > if (intel_tc_port_init(dig_port, is_legacy) < 0) > > > > goto err; > > > > } > > > > diff --git a/drivers/gpu/drm/i915/display/intel_display_types.h b/drivers/gpu/drm/i915/display/intel_display_types.h > > > > index 270c4c84a2920..88b2a55d19f21 100644 > > > > --- a/drivers/gpu/drm/i915/display/intel_display_types.h > > > > +++ b/drivers/gpu/drm/i915/display/intel_display_types.h > > > > @@ -233,13 +233,25 @@ struct intel_encoder { > > > > * Called during system suspend after all pending requests for the > > > > * encoder are flushed (for example for DP AUX transactions) and > > > > * device interrupts are disabled. > > > > + * All modeset locks are held while the hook is called. > > > > */ > > > > void (*suspend)(struct intel_encoder *); > > > > + /* > > > > + * Called without the modeset locks held after the suspend() hook for > > > > + * all encoders have been called. > > > > + */ > > > > + void (*suspend_complete)(struct intel_encoder *encoder); > > > > /* > > > > * Called during system reboot/shutdown after all the > > > > * encoders have been disabled and suspended. > > > > + * All modeset locks are held while the hook is called. > > > > */ > > > > void (*shutdown)(struct intel_encoder *encoder); > > > > + /* > > > > + * Called without the modeset locks held after the shutdown() hook for > > > > + * all encoders have been called. > > > > + */ > > > > + void (*shutdown_complete)(struct intel_encoder *encoder); > > > > /* > > > > * Enable/disable the clock to the port. > > > > */ > > > > diff --git a/drivers/gpu/drm/i915/i915_driver.c b/drivers/gpu/drm/i915/i915_driver.c > > > > index fd198700272b1..705ba65f2ff9a 100644 > > > > --- a/drivers/gpu/drm/i915/i915_driver.c > > > > +++ b/drivers/gpu/drm/i915/i915_driver.c > > > > @@ -964,6 +964,10 @@ static void intel_suspend_encoders(struct drm_i915_private *dev_priv) > > > > if (encoder->suspend) > > > > encoder->suspend(encoder); > > > > drm_modeset_unlock_all(&dev_priv->drm); > > > > + > > > > + for_each_intel_encoder(&dev_priv->drm, encoder) > > > > + if (encoder->suspend_complete) > > > > + encoder->suspend_complete(encoder); > > > > } > > > > > > > > static void intel_shutdown_encoders(struct drm_i915_private *dev_priv) > > > > @@ -978,6 +982,10 @@ static void intel_shutdown_encoders(struct drm_i915_private *dev_priv) > > > > if (encoder->shutdown) > > > > encoder->shutdown(encoder); > > > > drm_modeset_unlock_all(&dev_priv->drm); > > > > + > > > > + for_each_intel_encoder(&dev_priv->drm, encoder) > > > > + if (encoder->shutdown_complete) > > > > + encoder->shutdown_complete(encoder); > > > > } > > > > > > > > void i915_driver_shutdown(struct drm_i915_private *i915) > > > > -- > > > > 2.37.2 > > > > > > -- > > > Ville Syrjälä > > > Intel > > -- > Ville Syrjälä > Intel ^ permalink raw reply [flat|nested] 41+ messages in thread
* [Intel-gfx] [PATCH v5 13/14] drm/i915/tc: Call TypeC port flush_work/cleanup without modeset locks held 2023-05-10 10:31 ` [Intel-gfx] [PATCH v4 13/14] drm/i915/tc: Call TypeC port flush_work/cleanup without modeset locks held Imre Deak 2023-05-10 14:03 ` Ville Syrjälä @ 2023-05-12 19:55 ` Imre Deak 1 sibling, 0 replies; 41+ messages in thread From: Imre Deak @ 2023-05-12 19:55 UTC (permalink / raw) To: intel-gfx Call the TypeC port flush_work and cleanup handlers without the modeset locks held. These don't require the locks, as the work takes - as it should be able to at any point in time - any locks it needs and by the time cleanup is called and after cleanup returns the encoder is not in use. This is required by the next patch canceling a TypeC port work synchronously during encoder suspend and shutdown, where the work can take modeset locks as well, hence the canceling must be done without holding the locks. I also considered moving the modeset locking down to each encoder suspend()/shutdown() hook instead, however locking the full modeset state for each encoder separately would be odd, and the bigger change - affecting all encoders - is beyond the scope of this patchset. v2: - Add a TODO: comment to remove modeset locks if no encoder depends on this. (Ville) Cc: Ville Syrjälä <ville.syrjala@linux.intel.com> Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com> Signed-off-by: Imre Deak <imre.deak@intel.com> --- drivers/gpu/drm/i915/display/intel_ddi.c | 27 +++++++++---------- .../drm/i915/display/intel_display_types.h | 12 +++++++++ drivers/gpu/drm/i915/i915_driver.c | 16 +++++++++++ 3 files changed, 41 insertions(+), 14 deletions(-) diff --git a/drivers/gpu/drm/i915/display/intel_ddi.c b/drivers/gpu/drm/i915/display/intel_ddi.c index 813be957ed11b..7d09bd2412352 100644 --- a/drivers/gpu/drm/i915/display/intel_ddi.c +++ b/drivers/gpu/drm/i915/display/intel_ddi.c @@ -4617,31 +4617,27 @@ static bool intel_ddi_is_tc(struct drm_i915_private *i915, enum port port) static void intel_ddi_encoder_suspend(struct intel_encoder *encoder) { - struct intel_dp *intel_dp = enc_to_intel_dp(encoder); - struct drm_i915_private *i915 = dp_to_i915(intel_dp); - struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp); - enum phy phy = intel_port_to_phy(i915, encoder->port); - intel_dp_encoder_suspend(encoder); +} - if (!intel_phy_is_tc(i915, phy)) - return; +static void intel_ddi_tc_encoder_suspend_complete(struct intel_encoder *encoder) +{ + struct intel_dp *intel_dp = enc_to_intel_dp(encoder); + struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp); intel_tc_port_flush_work(dig_port); } static void intel_ddi_encoder_shutdown(struct intel_encoder *encoder) { - struct intel_dp *intel_dp = enc_to_intel_dp(encoder); - struct drm_i915_private *i915 = dp_to_i915(intel_dp); - struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp); - enum phy phy = intel_port_to_phy(i915, encoder->port); - intel_dp_encoder_shutdown(encoder); intel_hdmi_encoder_shutdown(encoder); +} - if (!intel_phy_is_tc(i915, phy)) - return; +static void intel_ddi_tc_encoder_shutdown_complete(struct intel_encoder *encoder) +{ + struct intel_dp *intel_dp = enc_to_intel_dp(encoder); + struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp); intel_tc_port_cleanup(dig_port); } @@ -4908,6 +4904,9 @@ void intel_ddi_init(struct drm_i915_private *dev_priv, enum port port) is_legacy ? "legacy" : "non-legacy"); } + encoder->suspend_complete = intel_ddi_tc_encoder_suspend_complete; + encoder->shutdown_complete = intel_ddi_tc_encoder_shutdown_complete; + if (intel_tc_port_init(dig_port, is_legacy) < 0) goto err; } diff --git a/drivers/gpu/drm/i915/display/intel_display_types.h b/drivers/gpu/drm/i915/display/intel_display_types.h index 270c4c84a2920..88b2a55d19f21 100644 --- a/drivers/gpu/drm/i915/display/intel_display_types.h +++ b/drivers/gpu/drm/i915/display/intel_display_types.h @@ -233,13 +233,25 @@ struct intel_encoder { * Called during system suspend after all pending requests for the * encoder are flushed (for example for DP AUX transactions) and * device interrupts are disabled. + * All modeset locks are held while the hook is called. */ void (*suspend)(struct intel_encoder *); + /* + * Called without the modeset locks held after the suspend() hook for + * all encoders have been called. + */ + void (*suspend_complete)(struct intel_encoder *encoder); /* * Called during system reboot/shutdown after all the * encoders have been disabled and suspended. + * All modeset locks are held while the hook is called. */ void (*shutdown)(struct intel_encoder *encoder); + /* + * Called without the modeset locks held after the shutdown() hook for + * all encoders have been called. + */ + void (*shutdown_complete)(struct intel_encoder *encoder); /* * Enable/disable the clock to the port. */ diff --git a/drivers/gpu/drm/i915/i915_driver.c b/drivers/gpu/drm/i915/i915_driver.c index fd198700272b1..522733a899463 100644 --- a/drivers/gpu/drm/i915/i915_driver.c +++ b/drivers/gpu/drm/i915/i915_driver.c @@ -959,11 +959,19 @@ static void intel_suspend_encoders(struct drm_i915_private *dev_priv) if (!HAS_DISPLAY(dev_priv)) return; + /* + * TODO: check and remove holding the modeset locks if none of + * the encoders depends on this. + */ drm_modeset_lock_all(&dev_priv->drm); for_each_intel_encoder(&dev_priv->drm, encoder) if (encoder->suspend) encoder->suspend(encoder); drm_modeset_unlock_all(&dev_priv->drm); + + for_each_intel_encoder(&dev_priv->drm, encoder) + if (encoder->suspend_complete) + encoder->suspend_complete(encoder); } static void intel_shutdown_encoders(struct drm_i915_private *dev_priv) @@ -973,11 +981,19 @@ static void intel_shutdown_encoders(struct drm_i915_private *dev_priv) if (!HAS_DISPLAY(dev_priv)) return; + /* + * TODO: check and remove holding the modeset locks if none of + * the encoders depends on this. + */ drm_modeset_lock_all(&dev_priv->drm); for_each_intel_encoder(&dev_priv->drm, encoder) if (encoder->shutdown) encoder->shutdown(encoder); drm_modeset_unlock_all(&dev_priv->drm); + + for_each_intel_encoder(&dev_priv->drm, encoder) + if (encoder->shutdown_complete) + encoder->shutdown_complete(encoder); } void i915_driver_shutdown(struct drm_i915_private *i915) -- 2.37.2 ^ permalink raw reply related [flat|nested] 41+ messages in thread
* [Intel-gfx] [PATCH v4 14/14] drm/i915/tc: Reset TypeC PHYs left enabled in DP-alt mode after the sink disconnects 2023-05-10 10:31 [Intel-gfx] [PATCH v4 00/14] drm/i915/tc: Add a workaround for an IOM/TCSS firmware hang issue Imre Deak ` (12 preceding siblings ...) 2023-05-10 10:31 ` [Intel-gfx] [PATCH v4 13/14] drm/i915/tc: Call TypeC port flush_work/cleanup without modeset locks held Imre Deak @ 2023-05-10 10:31 ` Imre Deak 2023-05-11 19:21 ` Ville Syrjälä 2023-05-12 19:55 ` [Intel-gfx] [PATCH v5 " Imre Deak 2023-05-10 11:13 ` [Intel-gfx] ✗ Fi.CI.CHECKPATCH: warning for drm/i915/tc: Add a workaround for an IOM/TCSS firmware hang issue (rev11) Patchwork ` (7 subsequent siblings) 21 siblings, 2 replies; 41+ messages in thread From: Imre Deak @ 2023-05-10 10:31 UTC (permalink / raw) To: intel-gfx; +Cc: Kai-Heng Feng If the output on a DP-alt link with its sink disconnected is kept enabled for too long (about 20 sec), then some IOM/TCSS firmware timeout will cause havoc on the PCI bus, at least for other GFX devices on it which will stop powering up. Since user space is not guaranteed to do a disabling modeset in time, switch such disconnected but active links to TBT mode - which is without such shortcomings - with a 2 second delay. If the above condition is detected already during the driver load/system resume sanitization step disable the output instead, as at that point no user space or kernel client depends on a consistent output state yet and because subsequent atomic modeset on such connectors - without the actual sink capabilities available - can fail. An active/disconnected port as above will also block the HPD status of other active/disconnected ports to get updated (stuck in the connected state), until the former port is disabled, its PHY is disconnected and a ~10 ms delay has elapsed. This means the link state for all TypeC ports/CRTCs must be rechecked after a CRTC is disabled due to the above reason. For this disconnect the PHY synchronously after the CRTC/port is disabled and recheck all CRTCs for the above condition whenever such a port is disabled. To account for a race condition during driver loading where the sink is disconnected after the above sanitization step and before the HPD interrupts get enabled, do an explicit check/link reset if needed from the encoder's late_register hook, which is called after the HPD interrupts are enabled already. v2: - Handle an active/disconnected port blocking the HPD state update of another active/disconnected port. - Cancel the delayed work resetting the link also from the encoder enable/suspend/shutdown hooks. - Rebase on the earlier intel_modeset_lock_ctx_retry() addition, fixing here the missed atomic state reset in case of a retry. - Fix handling of an error return from intel_atomic_get_crtc_state(). - Recheck if the port needs to be reset after all the atomic state is locked and async commits are waited on. v3: - Add intel_crtc_needs_link_reset(), instead of open-coding it, keep intel_crtc_has_encoders(). (Ville) - Fix state dumping and use a bitmask to track disabled CRTCs in intel_sanitize_all_crtcs(). (Ville) - Set internal in intel_atomic_state right after allocating it. (Ville) - Recheck all CRTCs (not yet force-disabled) after a CRTC is force-disabled for any reason (not only due to a link state) in intel_sanitize_all_crtcs(). - Reduce delay after CRTC disabling to 20ms, and use the simpler msleep(). - Clarify code comment about HPD behaviour in intel_sanitize_all_crtcs(). - Move all the TC link reset logic to intel_tc.c . - Cancel the link reset work synchronously during system suspend, driver unload and shutdown. v4: - Rebased on previous patch, which allows calling the TC port suspend/cleanup handlers without modeset locks held; remove the display driver suspended assert from the link reset work accordingly. Cc: Kai-Heng Feng <kai.heng.feng@canonical.com> Cc: Ville Syrjälä <ville.syrjala@linux.intel.com> Tested-by: Kai-Heng Feng <kai.heng.feng@canonical.com> Closes: https://gitlab.freedesktop.org/drm/intel/-/issues/5860 Signed-off-by: Imre Deak <imre.deak@intel.com> --- drivers/gpu/drm/i915/display/intel_ddi.c | 32 +++- drivers/gpu/drm/i915/display/intel_dp.c | 6 +- drivers/gpu/drm/i915/display/intel_dp.h | 3 + .../drm/i915/display/intel_modeset_setup.c | 85 ++++++++-- drivers/gpu/drm/i915/display/intel_tc.c | 156 +++++++++++++++++- drivers/gpu/drm/i915/display/intel_tc.h | 5 +- 6 files changed, 262 insertions(+), 25 deletions(-) diff --git a/drivers/gpu/drm/i915/display/intel_ddi.c b/drivers/gpu/drm/i915/display/intel_ddi.c index 7d09bd2412352..b443a79bc9803 100644 --- a/drivers/gpu/drm/i915/display/intel_ddi.c +++ b/drivers/gpu/drm/i915/display/intel_ddi.c @@ -3313,6 +3313,8 @@ static void intel_disable_ddi(struct intel_atomic_state *state, const struct intel_crtc_state *old_crtc_state, const struct drm_connector_state *old_conn_state) { + intel_tc_port_link_cancel_reset_work(enc_to_dig_port(encoder)); + intel_hdcp_disable(to_intel_connector(old_conn_state->connector)); if (intel_crtc_has_type(old_crtc_state, INTEL_OUTPUT_HDMI)) @@ -3381,6 +3383,8 @@ intel_ddi_pre_pll_enable(struct intel_atomic_state *state, enum phy phy = intel_port_to_phy(dev_priv, encoder->port); bool is_tc_port = intel_phy_is_tc(dev_priv, phy); + intel_tc_port_link_cancel_reset_work(dig_port); + if (is_tc_port) { struct intel_crtc *master_crtc = to_intel_crtc(crtc_state->uapi.crtc); @@ -4232,9 +4236,19 @@ static void intel_ddi_encoder_reset(struct drm_encoder *encoder) intel_tc_port_init_mode(dig_port); } +static int intel_ddi_encoder_late_register(struct drm_encoder *_encoder) +{ + struct intel_encoder *encoder = to_intel_encoder(_encoder); + + intel_tc_port_link_reset(enc_to_dig_port(encoder)); + + return 0; +} + static const struct drm_encoder_funcs intel_ddi_funcs = { .reset = intel_ddi_encoder_reset, .destroy = intel_ddi_encoder_destroy, + .late_register = intel_ddi_encoder_late_register, }; static struct intel_connector * @@ -4404,14 +4418,16 @@ intel_ddi_hotplug(struct intel_encoder *encoder, state = intel_encoder_hotplug(encoder, connector); - intel_modeset_lock_ctx_retry(&ctx, NULL, 0, ret) { - if (connector->base.connector_type == DRM_MODE_CONNECTOR_HDMIA) - ret = intel_hdmi_reset_link(encoder, &ctx); - else - ret = intel_dp_retrain_link(encoder, &ctx); - } + if (!intel_tc_port_link_reset(dig_port)) { + intel_modeset_lock_ctx_retry(&ctx, NULL, 0, ret) { + if (connector->base.connector_type == DRM_MODE_CONNECTOR_HDMIA) + ret = intel_hdmi_reset_link(encoder, &ctx); + else + ret = intel_dp_retrain_link(encoder, &ctx); + } - drm_WARN_ON(encoder->base.dev, ret); + drm_WARN_ON(encoder->base.dev, ret); + } /* * Unpowered type-c dongles can take some time to boot and be @@ -4625,7 +4641,7 @@ static void intel_ddi_tc_encoder_suspend_complete(struct intel_encoder *encoder) struct intel_dp *intel_dp = enc_to_intel_dp(encoder); struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp); - intel_tc_port_flush_work(dig_port); + intel_tc_port_suspend(dig_port); } static void intel_ddi_encoder_shutdown(struct intel_encoder *encoder) diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c index 99ceaa7d90b62..9a13ec09755fc 100644 --- a/drivers/gpu/drm/i915/display/intel_dp.c +++ b/drivers/gpu/drm/i915/display/intel_dp.c @@ -4231,9 +4231,9 @@ static bool intel_dp_has_connector(struct intel_dp *intel_dp, return false; } -static int intel_dp_get_active_pipes(struct intel_dp *intel_dp, - struct drm_modeset_acquire_ctx *ctx, - u8 *pipe_mask) +int intel_dp_get_active_pipes(struct intel_dp *intel_dp, + struct drm_modeset_acquire_ctx *ctx, + u8 *pipe_mask) { struct drm_i915_private *i915 = dp_to_i915(intel_dp); struct drm_connector_list_iter conn_iter; diff --git a/drivers/gpu/drm/i915/display/intel_dp.h b/drivers/gpu/drm/i915/display/intel_dp.h index ef39e4f7a329e..5f86157a10d2d 100644 --- a/drivers/gpu/drm/i915/display/intel_dp.h +++ b/drivers/gpu/drm/i915/display/intel_dp.h @@ -42,6 +42,9 @@ void intel_dp_set_link_params(struct intel_dp *intel_dp, int link_rate, int lane_count); int intel_dp_get_link_train_fallback_values(struct intel_dp *intel_dp, int link_rate, u8 lane_count); +int intel_dp_get_active_pipes(struct intel_dp *intel_dp, + struct drm_modeset_acquire_ctx *ctx, + u8 *pipe_mask); int intel_dp_retrain_link(struct intel_encoder *encoder, struct drm_modeset_acquire_ctx *ctx); void intel_dp_set_power(struct intel_dp *intel_dp, u8 mode); diff --git a/drivers/gpu/drm/i915/display/intel_modeset_setup.c b/drivers/gpu/drm/i915/display/intel_modeset_setup.c index 75b4dea1e442b..85f6401b8c709 100644 --- a/drivers/gpu/drm/i915/display/intel_modeset_setup.c +++ b/drivers/gpu/drm/i915/display/intel_modeset_setup.c @@ -26,6 +26,7 @@ #include "intel_fifo_underrun.h" #include "intel_modeset_setup.h" #include "intel_pch_display.h" +#include "intel_tc.h" #include "intel_vblank.h" #include "intel_wm.h" #include "skl_watermark.h" @@ -379,6 +380,21 @@ static bool intel_crtc_has_encoders(struct intel_crtc *crtc) return false; } +static bool intel_crtc_needs_link_reset(struct intel_crtc *crtc) +{ + struct drm_device *dev = crtc->base.dev; + struct intel_encoder *encoder; + + for_each_encoder_on_crtc(dev, &crtc->base, encoder) { + struct intel_digital_port *dig_port = enc_to_dig_port(encoder); + + if (dig_port && intel_tc_port_link_needs_reset(dig_port)) + return true; + } + + return false; +} + static struct intel_connector *intel_encoder_find_connector(struct intel_encoder *encoder) { struct drm_i915_private *i915 = to_i915(encoder->base.dev); @@ -421,11 +437,12 @@ static void intel_sanitize_fifo_underrun_reporting(const struct intel_crtc_state !HAS_GMCH(i915)); } -static void intel_sanitize_crtc(struct intel_crtc *crtc, +static bool intel_sanitize_crtc(struct intel_crtc *crtc, struct drm_modeset_acquire_ctx *ctx) { struct drm_i915_private *i915 = to_i915(crtc->base.dev); struct intel_crtc_state *crtc_state = to_intel_crtc_state(crtc->base.state); + bool needs_link_reset; if (crtc_state->hw.active) { struct intel_plane *plane; @@ -445,13 +462,65 @@ static void intel_sanitize_crtc(struct intel_crtc *crtc, intel_color_commit_arm(crtc_state); } + if (!crtc_state->hw.active || + intel_crtc_is_bigjoiner_slave(crtc_state)) + return false; + + needs_link_reset = intel_crtc_needs_link_reset(crtc); + /* * Adjust the state of the output pipe according to whether we have * active connectors/encoders. */ - if (crtc_state->hw.active && !intel_crtc_has_encoders(crtc) && - !intel_crtc_is_bigjoiner_slave(crtc_state)) - intel_crtc_disable_noatomic(crtc, ctx); + if (!needs_link_reset && intel_crtc_has_encoders(crtc)) + return false; + + intel_crtc_disable_noatomic(crtc, ctx); + + /* + * The HPD state on other active/disconnected TC ports may be stuck in + * the connected state until this port is disabled and a ~10ms delay has + * passed, wait here for that so that sanitizing other CRTCs will see the + * up-to-date HPD state. + */ + if (needs_link_reset) + msleep(20); + + return true; +} + +static void intel_sanitize_all_crtcs(struct drm_i915_private *i915, + struct drm_modeset_acquire_ctx *ctx) +{ + struct intel_crtc *crtc; + u8 crtcs_forced_off = 0; + + /* + * An active and disconnected TypeC port prevents the HPD live state + * to get updated on other active/disconnected TypeC ports, so after + * a port gets disabled the CRTCs using other TypeC ports must be + * rechecked wrt. their link status. + */ + for (;;) { + u8 old_mask = crtcs_forced_off; + + for_each_intel_crtc(&i915->drm, crtc) { + if (BIT(crtc->pipe) & crtcs_forced_off) + continue; + + if (intel_sanitize_crtc(crtc, ctx)) + crtcs_forced_off |= BIT(crtc->pipe); + } + if (crtcs_forced_off == old_mask) + break; + } + + for_each_intel_crtc(&i915->drm, crtc) { + struct intel_crtc_state *crtc_state = + to_intel_crtc_state(crtc->base.state); + + intel_crtc_state_dump(crtc_state, NULL, "setup_hw_state"); + } } static bool has_bogus_dpll_config(const struct intel_crtc_state *crtc_state) @@ -871,13 +940,7 @@ void intel_modeset_setup_hw_state(struct drm_i915_private *i915, */ intel_modeset_update_connector_atomic_state(i915); - for_each_intel_crtc(&i915->drm, crtc) { - struct intel_crtc_state *crtc_state = - to_intel_crtc_state(crtc->base.state); - - intel_sanitize_crtc(crtc, ctx); - intel_crtc_state_dump(crtc_state, NULL, "setup_hw_state"); - } + intel_sanitize_all_crtcs(i915, ctx); intel_dpll_sanitize_state(i915); diff --git a/drivers/gpu/drm/i915/display/intel_tc.c b/drivers/gpu/drm/i915/display/intel_tc.c index 4fca711a58bce..4d45571fba956 100644 --- a/drivers/gpu/drm/i915/display/intel_tc.c +++ b/drivers/gpu/drm/i915/display/intel_tc.c @@ -5,15 +5,19 @@ #include "i915_drv.h" #include "i915_reg.h" +#include "intel_atomic.h" #include "intel_cx0_phy_regs.h" #include "intel_ddi.h" #include "intel_de.h" #include "intel_display.h" +#include "intel_display_driver.h" #include "intel_display_power_map.h" #include "intel_display_types.h" #include "intel_dkl_phy_regs.h" +#include "intel_dp.h" #include "intel_dp_mst.h" #include "intel_mg_phy_regs.h" +#include "intel_modeset_lock.h" #include "intel_tc.h" #define DP_PIN_ASSIGNMENT_C 0x3 @@ -51,6 +55,7 @@ struct intel_tc_port { enum intel_display_power_domain lock_power_domain; #endif struct delayed_work disconnect_phy_work; + struct delayed_work link_reset_work; int link_refcount; bool legacy_port:1; char port_name[8]; @@ -1572,6 +1577,135 @@ bool intel_tc_port_connected(struct intel_encoder *encoder) return is_connected; } +static bool __intel_tc_port_link_needs_reset(struct intel_tc_port *tc) +{ + bool ret; + + mutex_lock(&tc->lock); + + ret = tc->link_refcount && + tc->mode == TC_PORT_DP_ALT && + intel_tc_port_needs_reset(tc); + + mutex_unlock(&tc->lock); + + return ret; +} + +bool intel_tc_port_link_needs_reset(struct intel_digital_port *dig_port) +{ + struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev); + enum phy phy = intel_port_to_phy(i915, dig_port->base.port); + + if (!intel_phy_is_tc(i915, phy)) + return false; + + return __intel_tc_port_link_needs_reset(to_tc_port(dig_port)); +} + +static int reset_link(struct intel_tc_port *tc) +{ + struct drm_i915_private *i915 = tc_to_i915(tc); + struct intel_digital_port *dig_port = tc->dig_port; + struct intel_dp *intel_dp = enc_to_intel_dp(&dig_port->base); + struct drm_modeset_acquire_ctx ctx; + struct drm_atomic_state *_state; + struct intel_atomic_state *state; + int ret = 0; + + _state = drm_atomic_state_alloc(&i915->drm); + if (!_state) + return -ENOMEM; + + state = to_intel_atomic_state(_state); + state->internal = true; + + intel_modeset_lock_ctx_retry(&ctx, state, 0, ret) { + struct intel_crtc *crtc; + u8 pipe_mask; + + ret = drm_modeset_lock(&i915->drm.mode_config.connection_mutex, &ctx); + if (ret) + continue; + + ret = intel_dp_get_active_pipes(intel_dp, &ctx, &pipe_mask); + if (ret) + continue; + + if (!pipe_mask) + continue; + + for_each_intel_crtc_in_pipe_mask(&i915->drm, crtc, pipe_mask) { + struct intel_crtc_state *crtc_state; + + crtc_state = intel_atomic_get_crtc_state(&state->base, crtc); + if (IS_ERR(crtc_state)) { + ret = PTR_ERR(crtc_state); + break; + } + + crtc_state->uapi.connectors_changed = true; + } + + if (ret) + continue; + + if (!__intel_tc_port_link_needs_reset(tc)) + continue; + + ret = drm_atomic_commit(&state->base); + } + + drm_atomic_state_put(&state->base); + + return ret; +} + +static void intel_tc_port_link_reset_work(struct work_struct *work) +{ + struct intel_tc_port *tc = + container_of(work, struct intel_tc_port, link_reset_work.work); + struct drm_i915_private *i915 = tc_to_i915(tc); + int ret; + + if (!__intel_tc_port_link_needs_reset(tc)) + return; + + mutex_lock(&i915->drm.mode_config.mutex); + + drm_dbg_kms(&i915->drm, + "Port %s: TypeC DP-alt sink disconnected, resetting link\n", + tc->port_name); + ret = reset_link(tc); + drm_WARN_ON(&i915->drm, ret); + + mutex_unlock(&i915->drm.mode_config.mutex); +} + +bool intel_tc_port_link_reset(struct intel_digital_port *dig_port) +{ + if (!intel_tc_port_link_needs_reset(dig_port)) + return false; + + queue_delayed_work(system_unbound_wq, + &to_tc_port(dig_port)->link_reset_work, + msecs_to_jiffies(2000)); + + return true; +} + +void intel_tc_port_link_cancel_reset_work(struct intel_digital_port *dig_port) +{ + struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev); + enum phy phy = intel_port_to_phy(i915, dig_port->base.port); + struct intel_tc_port *tc = to_tc_port(dig_port); + + if (!intel_phy_is_tc(i915, phy)) + return; + + cancel_delayed_work(&tc->link_reset_work); +} + static void __intel_tc_port_lock(struct intel_tc_port *tc, int required_lanes) { @@ -1619,11 +1753,19 @@ static void intel_tc_port_disconnect_phy_work(struct work_struct *work) * * Flush the delayed work disconnecting an idle PHY. */ -void intel_tc_port_flush_work(struct intel_digital_port *dig_port) +static void intel_tc_port_flush_work(struct intel_digital_port *dig_port) { flush_delayed_work(&to_tc_port(dig_port)->disconnect_phy_work); } +void intel_tc_port_suspend(struct intel_digital_port *dig_port) +{ + struct intel_tc_port *tc = to_tc_port(dig_port); + + cancel_delayed_work_sync(&tc->link_reset_work); + intel_tc_port_flush_work(dig_port); +} + void intel_tc_port_unlock(struct intel_digital_port *dig_port) { struct intel_tc_port *tc = to_tc_port(dig_port); @@ -1660,6 +1802,14 @@ void intel_tc_port_put_link(struct intel_digital_port *dig_port) intel_tc_port_lock(dig_port); __intel_tc_port_put_link(tc); intel_tc_port_unlock(dig_port); + + /* + * The firmware will not update the HPD status of other TypeC ports + * that are active in DP-alt mode with their sink disconnected, until + * this port is disabled and its PHY gets disconnected. Make sure this + * happens in a timely manner by disconnecting the PHY synchronously. + */ + intel_tc_port_flush_work(dig_port); } int intel_tc_port_init(struct intel_digital_port *dig_port, bool is_legacy) @@ -1692,7 +1842,9 @@ int intel_tc_port_init(struct intel_digital_port *dig_port, bool is_legacy) "%c/TC#%d", port_name(port), tc_port + 1); mutex_init(&tc->lock); + /* TODO: Combine the two works */ INIT_DELAYED_WORK(&tc->disconnect_phy_work, intel_tc_port_disconnect_phy_work); + INIT_DELAYED_WORK(&tc->link_reset_work, intel_tc_port_link_reset_work); tc->legacy_port = is_legacy; tc->mode = TC_PORT_DISCONNECTED; tc->link_refcount = 0; @@ -1706,7 +1858,7 @@ int intel_tc_port_init(struct intel_digital_port *dig_port, bool is_legacy) void intel_tc_port_cleanup(struct intel_digital_port *dig_port) { - intel_tc_port_flush_work(dig_port); + intel_tc_port_suspend(dig_port); kfree(dig_port->tc); dig_port->tc = NULL; diff --git a/drivers/gpu/drm/i915/display/intel_tc.h b/drivers/gpu/drm/i915/display/intel_tc.h index dd0810f9ea95e..3b16491925fa9 100644 --- a/drivers/gpu/drm/i915/display/intel_tc.h +++ b/drivers/gpu/drm/i915/display/intel_tc.h @@ -30,11 +30,14 @@ void intel_tc_port_sanitize_mode(struct intel_digital_port *dig_port, const struct intel_crtc_state *crtc_state); void intel_tc_port_lock(struct intel_digital_port *dig_port); void intel_tc_port_unlock(struct intel_digital_port *dig_port); -void intel_tc_port_flush_work(struct intel_digital_port *dig_port); +void intel_tc_port_suspend(struct intel_digital_port *dig_port); void intel_tc_port_get_link(struct intel_digital_port *dig_port, int required_lanes); void intel_tc_port_put_link(struct intel_digital_port *dig_port); bool intel_tc_port_ref_held(struct intel_digital_port *dig_port); +bool intel_tc_port_link_needs_reset(struct intel_digital_port *dig_port); +bool intel_tc_port_link_reset(struct intel_digital_port *dig_port); +void intel_tc_port_link_cancel_reset_work(struct intel_digital_port *dig_port); int intel_tc_port_init(struct intel_digital_port *dig_port, bool is_legacy); void intel_tc_port_cleanup(struct intel_digital_port *dig_port); -- 2.37.2 ^ permalink raw reply related [flat|nested] 41+ messages in thread
* Re: [Intel-gfx] [PATCH v4 14/14] drm/i915/tc: Reset TypeC PHYs left enabled in DP-alt mode after the sink disconnects 2023-05-10 10:31 ` [Intel-gfx] [PATCH v4 14/14] drm/i915/tc: Reset TypeC PHYs left enabled in DP-alt mode after the sink disconnects Imre Deak @ 2023-05-11 19:21 ` Ville Syrjälä 2023-05-12 13:50 ` Imre Deak 2023-05-12 19:55 ` [Intel-gfx] [PATCH v5 " Imre Deak 1 sibling, 1 reply; 41+ messages in thread From: Ville Syrjälä @ 2023-05-11 19:21 UTC (permalink / raw) To: Imre Deak; +Cc: intel-gfx, Kai-Heng Feng On Wed, May 10, 2023 at 01:31:31PM +0300, Imre Deak wrote: > If the output on a DP-alt link with its sink disconnected is kept > enabled for too long (about 20 sec), then some IOM/TCSS firmware timeout > will cause havoc on the PCI bus, at least for other GFX devices on it > which will stop powering up. Since user space is not guaranteed to do a > disabling modeset in time, switch such disconnected but active links to > TBT mode - which is without such shortcomings - with a 2 second delay. > > If the above condition is detected already during the driver load/system > resume sanitization step disable the output instead, as at that point no > user space or kernel client depends on a consistent output state yet and > because subsequent atomic modeset on such connectors - without the > actual sink capabilities available - can fail. > > An active/disconnected port as above will also block the HPD status of > other active/disconnected ports to get updated (stuck in the connected > state), until the former port is disabled, its PHY is disconnected and > a ~10 ms delay has elapsed. This means the link state for all TypeC > ports/CRTCs must be rechecked after a CRTC is disabled due to the above > reason. For this disconnect the PHY synchronously after the CRTC/port is > disabled and recheck all CRTCs for the above condition whenever such a > port is disabled. > > To account for a race condition during driver loading where the sink is > disconnected after the above sanitization step and before the HPD > interrupts get enabled, do an explicit check/link reset if needed from > the encoder's late_register hook, which is called after the HPD > interrupts are enabled already. > > v2: > - Handle an active/disconnected port blocking the HPD state update of > another active/disconnected port. > - Cancel the delayed work resetting the link also from the encoder > enable/suspend/shutdown hooks. > - Rebase on the earlier intel_modeset_lock_ctx_retry() addition, > fixing here the missed atomic state reset in case of a retry. > - Fix handling of an error return from intel_atomic_get_crtc_state(). > - Recheck if the port needs to be reset after all the atomic state > is locked and async commits are waited on. > > v3: > - Add intel_crtc_needs_link_reset(), instead of open-coding it, > keep intel_crtc_has_encoders(). (Ville) > - Fix state dumping and use a bitmask to track disabled CRTCs in > intel_sanitize_all_crtcs(). (Ville) > - Set internal in intel_atomic_state right after allocating it. > (Ville) > - Recheck all CRTCs (not yet force-disabled) after a CRTC is > force-disabled for any reason (not only due to a link state) > in intel_sanitize_all_crtcs(). > - Reduce delay after CRTC disabling to 20ms, and use the simpler > msleep(). > - Clarify code comment about HPD behaviour in > intel_sanitize_all_crtcs(). > - Move all the TC link reset logic to intel_tc.c . > - Cancel the link reset work synchronously during system suspend, > driver unload and shutdown. > > v4: > - Rebased on previous patch, which allows calling the TC port > suspend/cleanup handlers without modeset locks held; remove the > display driver suspended assert from the link reset work > accordingly. > > Cc: Kai-Heng Feng <kai.heng.feng@canonical.com> > Cc: Ville Syrjälä <ville.syrjala@linux.intel.com> > Tested-by: Kai-Heng Feng <kai.heng.feng@canonical.com> > Closes: https://gitlab.freedesktop.org/drm/intel/-/issues/5860 > Signed-off-by: Imre Deak <imre.deak@intel.com> > --- > drivers/gpu/drm/i915/display/intel_ddi.c | 32 +++- > drivers/gpu/drm/i915/display/intel_dp.c | 6 +- > drivers/gpu/drm/i915/display/intel_dp.h | 3 + > .../drm/i915/display/intel_modeset_setup.c | 85 ++++++++-- > drivers/gpu/drm/i915/display/intel_tc.c | 156 +++++++++++++++++- > drivers/gpu/drm/i915/display/intel_tc.h | 5 +- > 6 files changed, 262 insertions(+), 25 deletions(-) > > diff --git a/drivers/gpu/drm/i915/display/intel_ddi.c b/drivers/gpu/drm/i915/display/intel_ddi.c > index 7d09bd2412352..b443a79bc9803 100644 > --- a/drivers/gpu/drm/i915/display/intel_ddi.c > +++ b/drivers/gpu/drm/i915/display/intel_ddi.c > @@ -3313,6 +3313,8 @@ static void intel_disable_ddi(struct intel_atomic_state *state, > const struct intel_crtc_state *old_crtc_state, > const struct drm_connector_state *old_conn_state) > { > + intel_tc_port_link_cancel_reset_work(enc_to_dig_port(encoder)); > + > intel_hdcp_disable(to_intel_connector(old_conn_state->connector)); > > if (intel_crtc_has_type(old_crtc_state, INTEL_OUTPUT_HDMI)) > @@ -3381,6 +3383,8 @@ intel_ddi_pre_pll_enable(struct intel_atomic_state *state, > enum phy phy = intel_port_to_phy(dev_priv, encoder->port); > bool is_tc_port = intel_phy_is_tc(dev_priv, phy); > > + intel_tc_port_link_cancel_reset_work(dig_port); Can the reset work still be schduled at this time? > + > if (is_tc_port) { > struct intel_crtc *master_crtc = > to_intel_crtc(crtc_state->uapi.crtc); > @@ -4232,9 +4236,19 @@ static void intel_ddi_encoder_reset(struct drm_encoder *encoder) > intel_tc_port_init_mode(dig_port); > } > > +static int intel_ddi_encoder_late_register(struct drm_encoder *_encoder) > +{ > + struct intel_encoder *encoder = to_intel_encoder(_encoder); > + > + intel_tc_port_link_reset(enc_to_dig_port(encoder)); > + > + return 0; > +} > + > static const struct drm_encoder_funcs intel_ddi_funcs = { > .reset = intel_ddi_encoder_reset, > .destroy = intel_ddi_encoder_destroy, > + .late_register = intel_ddi_encoder_late_register, > }; > > static struct intel_connector * > @@ -4404,14 +4418,16 @@ intel_ddi_hotplug(struct intel_encoder *encoder, > > state = intel_encoder_hotplug(encoder, connector); > > - intel_modeset_lock_ctx_retry(&ctx, NULL, 0, ret) { > - if (connector->base.connector_type == DRM_MODE_CONNECTOR_HDMIA) > - ret = intel_hdmi_reset_link(encoder, &ctx); > - else > - ret = intel_dp_retrain_link(encoder, &ctx); > - } > + if (!intel_tc_port_link_reset(dig_port)) { > + intel_modeset_lock_ctx_retry(&ctx, NULL, 0, ret) { > + if (connector->base.connector_type == DRM_MODE_CONNECTOR_HDMIA) > + ret = intel_hdmi_reset_link(encoder, &ctx); > + else > + ret = intel_dp_retrain_link(encoder, &ctx); > + } > > - drm_WARN_ON(encoder->base.dev, ret); > + drm_WARN_ON(encoder->base.dev, ret); > + } > > /* > * Unpowered type-c dongles can take some time to boot and be > @@ -4625,7 +4641,7 @@ static void intel_ddi_tc_encoder_suspend_complete(struct intel_encoder *encoder) > struct intel_dp *intel_dp = enc_to_intel_dp(encoder); > struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp); > > - intel_tc_port_flush_work(dig_port); > + intel_tc_port_suspend(dig_port); > } > > static void intel_ddi_encoder_shutdown(struct intel_encoder *encoder) > diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c > index 99ceaa7d90b62..9a13ec09755fc 100644 > --- a/drivers/gpu/drm/i915/display/intel_dp.c > +++ b/drivers/gpu/drm/i915/display/intel_dp.c > @@ -4231,9 +4231,9 @@ static bool intel_dp_has_connector(struct intel_dp *intel_dp, > return false; > } > > -static int intel_dp_get_active_pipes(struct intel_dp *intel_dp, > - struct drm_modeset_acquire_ctx *ctx, > - u8 *pipe_mask) > +int intel_dp_get_active_pipes(struct intel_dp *intel_dp, > + struct drm_modeset_acquire_ctx *ctx, > + u8 *pipe_mask) > { > struct drm_i915_private *i915 = dp_to_i915(intel_dp); > struct drm_connector_list_iter conn_iter; > diff --git a/drivers/gpu/drm/i915/display/intel_dp.h b/drivers/gpu/drm/i915/display/intel_dp.h > index ef39e4f7a329e..5f86157a10d2d 100644 > --- a/drivers/gpu/drm/i915/display/intel_dp.h > +++ b/drivers/gpu/drm/i915/display/intel_dp.h > @@ -42,6 +42,9 @@ void intel_dp_set_link_params(struct intel_dp *intel_dp, > int link_rate, int lane_count); > int intel_dp_get_link_train_fallback_values(struct intel_dp *intel_dp, > int link_rate, u8 lane_count); > +int intel_dp_get_active_pipes(struct intel_dp *intel_dp, > + struct drm_modeset_acquire_ctx *ctx, > + u8 *pipe_mask); > int intel_dp_retrain_link(struct intel_encoder *encoder, > struct drm_modeset_acquire_ctx *ctx); > void intel_dp_set_power(struct intel_dp *intel_dp, u8 mode); > diff --git a/drivers/gpu/drm/i915/display/intel_modeset_setup.c b/drivers/gpu/drm/i915/display/intel_modeset_setup.c > index 75b4dea1e442b..85f6401b8c709 100644 > --- a/drivers/gpu/drm/i915/display/intel_modeset_setup.c > +++ b/drivers/gpu/drm/i915/display/intel_modeset_setup.c > @@ -26,6 +26,7 @@ > #include "intel_fifo_underrun.h" > #include "intel_modeset_setup.h" > #include "intel_pch_display.h" > +#include "intel_tc.h" > #include "intel_vblank.h" > #include "intel_wm.h" > #include "skl_watermark.h" > @@ -379,6 +380,21 @@ static bool intel_crtc_has_encoders(struct intel_crtc *crtc) > return false; > } > > +static bool intel_crtc_needs_link_reset(struct intel_crtc *crtc) > +{ > + struct drm_device *dev = crtc->base.dev; > + struct intel_encoder *encoder; > + > + for_each_encoder_on_crtc(dev, &crtc->base, encoder) { > + struct intel_digital_port *dig_port = enc_to_dig_port(encoder); > + > + if (dig_port && intel_tc_port_link_needs_reset(dig_port)) > + return true; > + } > + > + return false; > +} > + > static struct intel_connector *intel_encoder_find_connector(struct intel_encoder *encoder) > { > struct drm_i915_private *i915 = to_i915(encoder->base.dev); > @@ -421,11 +437,12 @@ static void intel_sanitize_fifo_underrun_reporting(const struct intel_crtc_state > !HAS_GMCH(i915)); > } > > -static void intel_sanitize_crtc(struct intel_crtc *crtc, > +static bool intel_sanitize_crtc(struct intel_crtc *crtc, > struct drm_modeset_acquire_ctx *ctx) > { > struct drm_i915_private *i915 = to_i915(crtc->base.dev); > struct intel_crtc_state *crtc_state = to_intel_crtc_state(crtc->base.state); > + bool needs_link_reset; > > if (crtc_state->hw.active) { > struct intel_plane *plane; > @@ -445,13 +462,65 @@ static void intel_sanitize_crtc(struct intel_crtc *crtc, > intel_color_commit_arm(crtc_state); > } > > + if (!crtc_state->hw.active || > + intel_crtc_is_bigjoiner_slave(crtc_state)) > + return false; > + > + needs_link_reset = intel_crtc_needs_link_reset(crtc); > + > /* > * Adjust the state of the output pipe according to whether we have > * active connectors/encoders. > */ > - if (crtc_state->hw.active && !intel_crtc_has_encoders(crtc) && > - !intel_crtc_is_bigjoiner_slave(crtc_state)) > - intel_crtc_disable_noatomic(crtc, ctx); > + if (!needs_link_reset && intel_crtc_has_encoders(crtc)) > + return false; > + > + intel_crtc_disable_noatomic(crtc, ctx); > + > + /* > + * The HPD state on other active/disconnected TC ports may be stuck in > + * the connected state until this port is disabled and a ~10ms delay has > + * passed, wait here for that so that sanitizing other CRTCs will see the > + * up-to-date HPD state. > + */ > + if (needs_link_reset) > + msleep(20); > + > + return true; > +} > + > +static void intel_sanitize_all_crtcs(struct drm_i915_private *i915, > + struct drm_modeset_acquire_ctx *ctx) > +{ > + struct intel_crtc *crtc; > + u8 crtcs_forced_off = 0; Bit of a pipe vs. crtc confusion here. Maybe we should use u32+drm_crtc_mask() here for real since we're not really interested in individual pipes. > + > + /* > + * An active and disconnected TypeC port prevents the HPD live state > + * to get updated on other active/disconnected TypeC ports, so after > + * a port gets disabled the CRTCs using other TypeC ports must be > + * rechecked wrt. their link status. > + */ > + for (;;) { > + u8 old_mask = crtcs_forced_off; > + > + for_each_intel_crtc(&i915->drm, crtc) { > + if (BIT(crtc->pipe) & crtcs_forced_off) > + continue; > + > + if (intel_sanitize_crtc(crtc, ctx)) > + crtcs_forced_off |= BIT(crtc->pipe); > + } > + if (crtcs_forced_off == old_mask) > + break; > + } > + > + for_each_intel_crtc(&i915->drm, crtc) { > + struct intel_crtc_state *crtc_state = > + to_intel_crtc_state(crtc->base.state); > + > + intel_crtc_state_dump(crtc_state, NULL, "setup_hw_state"); > + } > } > > static bool has_bogus_dpll_config(const struct intel_crtc_state *crtc_state) > @@ -871,13 +940,7 @@ void intel_modeset_setup_hw_state(struct drm_i915_private *i915, > */ > intel_modeset_update_connector_atomic_state(i915); > > - for_each_intel_crtc(&i915->drm, crtc) { > - struct intel_crtc_state *crtc_state = > - to_intel_crtc_state(crtc->base.state); > - > - intel_sanitize_crtc(crtc, ctx); > - intel_crtc_state_dump(crtc_state, NULL, "setup_hw_state"); > - } > + intel_sanitize_all_crtcs(i915, ctx); > > intel_dpll_sanitize_state(i915); > > diff --git a/drivers/gpu/drm/i915/display/intel_tc.c b/drivers/gpu/drm/i915/display/intel_tc.c > index 4fca711a58bce..4d45571fba956 100644 > --- a/drivers/gpu/drm/i915/display/intel_tc.c > +++ b/drivers/gpu/drm/i915/display/intel_tc.c > @@ -5,15 +5,19 @@ > > #include "i915_drv.h" > #include "i915_reg.h" > +#include "intel_atomic.h" > #include "intel_cx0_phy_regs.h" > #include "intel_ddi.h" > #include "intel_de.h" > #include "intel_display.h" > +#include "intel_display_driver.h" > #include "intel_display_power_map.h" > #include "intel_display_types.h" > #include "intel_dkl_phy_regs.h" > +#include "intel_dp.h" > #include "intel_dp_mst.h" > #include "intel_mg_phy_regs.h" > +#include "intel_modeset_lock.h" > #include "intel_tc.h" > > #define DP_PIN_ASSIGNMENT_C 0x3 > @@ -51,6 +55,7 @@ struct intel_tc_port { > enum intel_display_power_domain lock_power_domain; > #endif > struct delayed_work disconnect_phy_work; > + struct delayed_work link_reset_work; > int link_refcount; > bool legacy_port:1; > char port_name[8]; > @@ -1572,6 +1577,135 @@ bool intel_tc_port_connected(struct intel_encoder *encoder) > return is_connected; > } > > +static bool __intel_tc_port_link_needs_reset(struct intel_tc_port *tc) > +{ > + bool ret; > + > + mutex_lock(&tc->lock); > + > + ret = tc->link_refcount && > + tc->mode == TC_PORT_DP_ALT && > + intel_tc_port_needs_reset(tc); > + > + mutex_unlock(&tc->lock); > + > + return ret; > +} > + > +bool intel_tc_port_link_needs_reset(struct intel_digital_port *dig_port) > +{ > + struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev); > + enum phy phy = intel_port_to_phy(i915, dig_port->base.port); > + > + if (!intel_phy_is_tc(i915, phy)) > + return false; > + > + return __intel_tc_port_link_needs_reset(to_tc_port(dig_port)); > +} > + > +static int reset_link(struct intel_tc_port *tc) > +{ > + struct drm_i915_private *i915 = tc_to_i915(tc); > + struct intel_digital_port *dig_port = tc->dig_port; > + struct intel_dp *intel_dp = enc_to_intel_dp(&dig_port->base); > + struct drm_modeset_acquire_ctx ctx; > + struct drm_atomic_state *_state; > + struct intel_atomic_state *state; > + int ret = 0; > + > + _state = drm_atomic_state_alloc(&i915->drm); > + if (!_state) > + return -ENOMEM; > + > + state = to_intel_atomic_state(_state); > + state->internal = true; > + > + intel_modeset_lock_ctx_retry(&ctx, state, 0, ret) { > + struct intel_crtc *crtc; > + u8 pipe_mask; > + > + ret = drm_modeset_lock(&i915->drm.mode_config.connection_mutex, &ctx); > + if (ret) > + continue; > + > + ret = intel_dp_get_active_pipes(intel_dp, &ctx, &pipe_mask); > + if (ret) > + continue; > + > + if (!pipe_mask) > + continue; > + > + for_each_intel_crtc_in_pipe_mask(&i915->drm, crtc, pipe_mask) { > + struct intel_crtc_state *crtc_state; > + > + crtc_state = intel_atomic_get_crtc_state(&state->base, crtc); > + if (IS_ERR(crtc_state)) { > + ret = PTR_ERR(crtc_state); > + break; > + } > + > + crtc_state->uapi.connectors_changed = true; > + } > + > + if (ret) > + continue; > + > + if (!__intel_tc_port_link_needs_reset(tc)) > + continue; > + > + ret = drm_atomic_commit(&state->base); I suppose one way to avoid the dangers of the continue vs. not in these things would be to extract the entire body of the loop to a separate function. Anyways, the patch looks decent enough to me so Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com> > + } > + > + drm_atomic_state_put(&state->base); > + > + return ret; > +} > + > +static void intel_tc_port_link_reset_work(struct work_struct *work) > +{ > + struct intel_tc_port *tc = > + container_of(work, struct intel_tc_port, link_reset_work.work); > + struct drm_i915_private *i915 = tc_to_i915(tc); > + int ret; > + > + if (!__intel_tc_port_link_needs_reset(tc)) > + return; > + > + mutex_lock(&i915->drm.mode_config.mutex); > + > + drm_dbg_kms(&i915->drm, > + "Port %s: TypeC DP-alt sink disconnected, resetting link\n", > + tc->port_name); > + ret = reset_link(tc); > + drm_WARN_ON(&i915->drm, ret); > + > + mutex_unlock(&i915->drm.mode_config.mutex); > +} > + > +bool intel_tc_port_link_reset(struct intel_digital_port *dig_port) > +{ > + if (!intel_tc_port_link_needs_reset(dig_port)) > + return false; > + > + queue_delayed_work(system_unbound_wq, > + &to_tc_port(dig_port)->link_reset_work, > + msecs_to_jiffies(2000)); > + > + return true; > +} > + > +void intel_tc_port_link_cancel_reset_work(struct intel_digital_port *dig_port) > +{ > + struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev); > + enum phy phy = intel_port_to_phy(i915, dig_port->base.port); > + struct intel_tc_port *tc = to_tc_port(dig_port); > + > + if (!intel_phy_is_tc(i915, phy)) > + return; > + > + cancel_delayed_work(&tc->link_reset_work); > +} > + > static void __intel_tc_port_lock(struct intel_tc_port *tc, > int required_lanes) > { > @@ -1619,11 +1753,19 @@ static void intel_tc_port_disconnect_phy_work(struct work_struct *work) > * > * Flush the delayed work disconnecting an idle PHY. > */ > -void intel_tc_port_flush_work(struct intel_digital_port *dig_port) > +static void intel_tc_port_flush_work(struct intel_digital_port *dig_port) > { > flush_delayed_work(&to_tc_port(dig_port)->disconnect_phy_work); > } > > +void intel_tc_port_suspend(struct intel_digital_port *dig_port) > +{ > + struct intel_tc_port *tc = to_tc_port(dig_port); > + > + cancel_delayed_work_sync(&tc->link_reset_work); > + intel_tc_port_flush_work(dig_port); > +} > + > void intel_tc_port_unlock(struct intel_digital_port *dig_port) > { > struct intel_tc_port *tc = to_tc_port(dig_port); > @@ -1660,6 +1802,14 @@ void intel_tc_port_put_link(struct intel_digital_port *dig_port) > intel_tc_port_lock(dig_port); > __intel_tc_port_put_link(tc); > intel_tc_port_unlock(dig_port); > + > + /* > + * The firmware will not update the HPD status of other TypeC ports > + * that are active in DP-alt mode with their sink disconnected, until > + * this port is disabled and its PHY gets disconnected. Make sure this > + * happens in a timely manner by disconnecting the PHY synchronously. > + */ > + intel_tc_port_flush_work(dig_port); > } > > int intel_tc_port_init(struct intel_digital_port *dig_port, bool is_legacy) > @@ -1692,7 +1842,9 @@ int intel_tc_port_init(struct intel_digital_port *dig_port, bool is_legacy) > "%c/TC#%d", port_name(port), tc_port + 1); > > mutex_init(&tc->lock); > + /* TODO: Combine the two works */ > INIT_DELAYED_WORK(&tc->disconnect_phy_work, intel_tc_port_disconnect_phy_work); > + INIT_DELAYED_WORK(&tc->link_reset_work, intel_tc_port_link_reset_work); > tc->legacy_port = is_legacy; > tc->mode = TC_PORT_DISCONNECTED; > tc->link_refcount = 0; > @@ -1706,7 +1858,7 @@ int intel_tc_port_init(struct intel_digital_port *dig_port, bool is_legacy) > > void intel_tc_port_cleanup(struct intel_digital_port *dig_port) > { > - intel_tc_port_flush_work(dig_port); > + intel_tc_port_suspend(dig_port); > > kfree(dig_port->tc); > dig_port->tc = NULL; > diff --git a/drivers/gpu/drm/i915/display/intel_tc.h b/drivers/gpu/drm/i915/display/intel_tc.h > index dd0810f9ea95e..3b16491925fa9 100644 > --- a/drivers/gpu/drm/i915/display/intel_tc.h > +++ b/drivers/gpu/drm/i915/display/intel_tc.h > @@ -30,11 +30,14 @@ void intel_tc_port_sanitize_mode(struct intel_digital_port *dig_port, > const struct intel_crtc_state *crtc_state); > void intel_tc_port_lock(struct intel_digital_port *dig_port); > void intel_tc_port_unlock(struct intel_digital_port *dig_port); > -void intel_tc_port_flush_work(struct intel_digital_port *dig_port); > +void intel_tc_port_suspend(struct intel_digital_port *dig_port); > void intel_tc_port_get_link(struct intel_digital_port *dig_port, > int required_lanes); > void intel_tc_port_put_link(struct intel_digital_port *dig_port); > bool intel_tc_port_ref_held(struct intel_digital_port *dig_port); > +bool intel_tc_port_link_needs_reset(struct intel_digital_port *dig_port); > +bool intel_tc_port_link_reset(struct intel_digital_port *dig_port); > +void intel_tc_port_link_cancel_reset_work(struct intel_digital_port *dig_port); > > int intel_tc_port_init(struct intel_digital_port *dig_port, bool is_legacy); > void intel_tc_port_cleanup(struct intel_digital_port *dig_port); > -- > 2.37.2 -- Ville Syrjälä Intel ^ permalink raw reply [flat|nested] 41+ messages in thread
* Re: [Intel-gfx] [PATCH v4 14/14] drm/i915/tc: Reset TypeC PHYs left enabled in DP-alt mode after the sink disconnects 2023-05-11 19:21 ` Ville Syrjälä @ 2023-05-12 13:50 ` Imre Deak 0 siblings, 0 replies; 41+ messages in thread From: Imre Deak @ 2023-05-12 13:50 UTC (permalink / raw) To: Ville Syrjälä; +Cc: intel-gfx, Kai-Heng Feng On Thu, May 11, 2023 at 10:21:26PM +0300, Ville Syrjälä wrote: > On Wed, May 10, 2023 at 01:31:31PM +0300, Imre Deak wrote: > > If the output on a DP-alt link with its sink disconnected is kept > > enabled for too long (about 20 sec), then some IOM/TCSS firmware timeout > > will cause havoc on the PCI bus, at least for other GFX devices on it > > which will stop powering up. Since user space is not guaranteed to do a > > disabling modeset in time, switch such disconnected but active links to > > TBT mode - which is without such shortcomings - with a 2 second delay. > > > > If the above condition is detected already during the driver load/system > > resume sanitization step disable the output instead, as at that point no > > user space or kernel client depends on a consistent output state yet and > > because subsequent atomic modeset on such connectors - without the > > actual sink capabilities available - can fail. > > > > An active/disconnected port as above will also block the HPD status of > > other active/disconnected ports to get updated (stuck in the connected > > state), until the former port is disabled, its PHY is disconnected and > > a ~10 ms delay has elapsed. This means the link state for all TypeC > > ports/CRTCs must be rechecked after a CRTC is disabled due to the above > > reason. For this disconnect the PHY synchronously after the CRTC/port is > > disabled and recheck all CRTCs for the above condition whenever such a > > port is disabled. > > > > To account for a race condition during driver loading where the sink is > > disconnected after the above sanitization step and before the HPD > > interrupts get enabled, do an explicit check/link reset if needed from > > the encoder's late_register hook, which is called after the HPD > > interrupts are enabled already. > > > > v2: > > - Handle an active/disconnected port blocking the HPD state update of > > another active/disconnected port. > > - Cancel the delayed work resetting the link also from the encoder > > enable/suspend/shutdown hooks. > > - Rebase on the earlier intel_modeset_lock_ctx_retry() addition, > > fixing here the missed atomic state reset in case of a retry. > > - Fix handling of an error return from intel_atomic_get_crtc_state(). > > - Recheck if the port needs to be reset after all the atomic state > > is locked and async commits are waited on. > > > > v3: > > - Add intel_crtc_needs_link_reset(), instead of open-coding it, > > keep intel_crtc_has_encoders(). (Ville) > > - Fix state dumping and use a bitmask to track disabled CRTCs in > > intel_sanitize_all_crtcs(). (Ville) > > - Set internal in intel_atomic_state right after allocating it. > > (Ville) > > - Recheck all CRTCs (not yet force-disabled) after a CRTC is > > force-disabled for any reason (not only due to a link state) > > in intel_sanitize_all_crtcs(). > > - Reduce delay after CRTC disabling to 20ms, and use the simpler > > msleep(). > > - Clarify code comment about HPD behaviour in > > intel_sanitize_all_crtcs(). > > - Move all the TC link reset logic to intel_tc.c . > > - Cancel the link reset work synchronously during system suspend, > > driver unload and shutdown. > > > > v4: > > - Rebased on previous patch, which allows calling the TC port > > suspend/cleanup handlers without modeset locks held; remove the > > display driver suspended assert from the link reset work > > accordingly. > > > > Cc: Kai-Heng Feng <kai.heng.feng@canonical.com> > > Cc: Ville Syrjälä <ville.syrjala@linux.intel.com> > > Tested-by: Kai-Heng Feng <kai.heng.feng@canonical.com> > > Closes: https://gitlab.freedesktop.org/drm/intel/-/issues/5860 > > Signed-off-by: Imre Deak <imre.deak@intel.com> > > --- > > drivers/gpu/drm/i915/display/intel_ddi.c | 32 +++- > > drivers/gpu/drm/i915/display/intel_dp.c | 6 +- > > drivers/gpu/drm/i915/display/intel_dp.h | 3 + > > .../drm/i915/display/intel_modeset_setup.c | 85 ++++++++-- > > drivers/gpu/drm/i915/display/intel_tc.c | 156 +++++++++++++++++- > > drivers/gpu/drm/i915/display/intel_tc.h | 5 +- > > 6 files changed, 262 insertions(+), 25 deletions(-) > > > > diff --git a/drivers/gpu/drm/i915/display/intel_ddi.c b/drivers/gpu/drm/i915/display/intel_ddi.c > > index 7d09bd2412352..b443a79bc9803 100644 > > --- a/drivers/gpu/drm/i915/display/intel_ddi.c > > +++ b/drivers/gpu/drm/i915/display/intel_ddi.c > > @@ -3313,6 +3313,8 @@ static void intel_disable_ddi(struct intel_atomic_state *state, > > const struct intel_crtc_state *old_crtc_state, > > const struct drm_connector_state *old_conn_state) > > { > > + intel_tc_port_link_cancel_reset_work(enc_to_dig_port(encoder)); > > + > > intel_hdcp_disable(to_intel_connector(old_conn_state->connector)); > > > > if (intel_crtc_has_type(old_crtc_state, INTEL_OUTPUT_HDMI)) > > @@ -3381,6 +3383,8 @@ intel_ddi_pre_pll_enable(struct intel_atomic_state *state, > > enum phy phy = intel_port_to_phy(dev_priv, encoder->port); > > bool is_tc_port = intel_phy_is_tc(dev_priv, phy); > > > > + intel_tc_port_link_cancel_reset_work(dig_port); > > Can the reset work still be schduled at this time? IIUC a hotplug->intel_tc_port_link_reset() could race with the above encoder disable->intel_tc_port_link_cancel_reset_work() call in an async commit (which doesn't hold modeset locks). But it's just an optimization to avoid the overhead of checking the link status from the work, not actually guaranteeing that it won't be scheduled. So I can remove it from here. > > + > > if (is_tc_port) { > > struct intel_crtc *master_crtc = > > to_intel_crtc(crtc_state->uapi.crtc); > > @@ -4232,9 +4236,19 @@ static void intel_ddi_encoder_reset(struct drm_encoder *encoder) > > intel_tc_port_init_mode(dig_port); > > } > > > > +static int intel_ddi_encoder_late_register(struct drm_encoder *_encoder) > > +{ > > + struct intel_encoder *encoder = to_intel_encoder(_encoder); > > + > > + intel_tc_port_link_reset(enc_to_dig_port(encoder)); > > + > > + return 0; > > +} > > + > > static const struct drm_encoder_funcs intel_ddi_funcs = { > > .reset = intel_ddi_encoder_reset, > > .destroy = intel_ddi_encoder_destroy, > > + .late_register = intel_ddi_encoder_late_register, > > }; > > > > static struct intel_connector * > > @@ -4404,14 +4418,16 @@ intel_ddi_hotplug(struct intel_encoder *encoder, > > > > state = intel_encoder_hotplug(encoder, connector); > > > > - intel_modeset_lock_ctx_retry(&ctx, NULL, 0, ret) { > > - if (connector->base.connector_type == DRM_MODE_CONNECTOR_HDMIA) > > - ret = intel_hdmi_reset_link(encoder, &ctx); > > - else > > - ret = intel_dp_retrain_link(encoder, &ctx); > > - } > > + if (!intel_tc_port_link_reset(dig_port)) { > > + intel_modeset_lock_ctx_retry(&ctx, NULL, 0, ret) { > > + if (connector->base.connector_type == DRM_MODE_CONNECTOR_HDMIA) > > + ret = intel_hdmi_reset_link(encoder, &ctx); > > + else > > + ret = intel_dp_retrain_link(encoder, &ctx); > > + } > > > > - drm_WARN_ON(encoder->base.dev, ret); > > + drm_WARN_ON(encoder->base.dev, ret); > > + } > > > > /* > > * Unpowered type-c dongles can take some time to boot and be > > @@ -4625,7 +4641,7 @@ static void intel_ddi_tc_encoder_suspend_complete(struct intel_encoder *encoder) > > struct intel_dp *intel_dp = enc_to_intel_dp(encoder); > > struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp); > > > > - intel_tc_port_flush_work(dig_port); > > + intel_tc_port_suspend(dig_port); > > } > > > > static void intel_ddi_encoder_shutdown(struct intel_encoder *encoder) > > diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c > > index 99ceaa7d90b62..9a13ec09755fc 100644 > > --- a/drivers/gpu/drm/i915/display/intel_dp.c > > +++ b/drivers/gpu/drm/i915/display/intel_dp.c > > @@ -4231,9 +4231,9 @@ static bool intel_dp_has_connector(struct intel_dp *intel_dp, > > return false; > > } > > > > -static int intel_dp_get_active_pipes(struct intel_dp *intel_dp, > > - struct drm_modeset_acquire_ctx *ctx, > > - u8 *pipe_mask) > > +int intel_dp_get_active_pipes(struct intel_dp *intel_dp, > > + struct drm_modeset_acquire_ctx *ctx, > > + u8 *pipe_mask) > > { > > struct drm_i915_private *i915 = dp_to_i915(intel_dp); > > struct drm_connector_list_iter conn_iter; > > diff --git a/drivers/gpu/drm/i915/display/intel_dp.h b/drivers/gpu/drm/i915/display/intel_dp.h > > index ef39e4f7a329e..5f86157a10d2d 100644 > > --- a/drivers/gpu/drm/i915/display/intel_dp.h > > +++ b/drivers/gpu/drm/i915/display/intel_dp.h > > @@ -42,6 +42,9 @@ void intel_dp_set_link_params(struct intel_dp *intel_dp, > > int link_rate, int lane_count); > > int intel_dp_get_link_train_fallback_values(struct intel_dp *intel_dp, > > int link_rate, u8 lane_count); > > +int intel_dp_get_active_pipes(struct intel_dp *intel_dp, > > + struct drm_modeset_acquire_ctx *ctx, > > + u8 *pipe_mask); > > int intel_dp_retrain_link(struct intel_encoder *encoder, > > struct drm_modeset_acquire_ctx *ctx); > > void intel_dp_set_power(struct intel_dp *intel_dp, u8 mode); > > diff --git a/drivers/gpu/drm/i915/display/intel_modeset_setup.c b/drivers/gpu/drm/i915/display/intel_modeset_setup.c > > index 75b4dea1e442b..85f6401b8c709 100644 > > --- a/drivers/gpu/drm/i915/display/intel_modeset_setup.c > > +++ b/drivers/gpu/drm/i915/display/intel_modeset_setup.c > > @@ -26,6 +26,7 @@ > > #include "intel_fifo_underrun.h" > > #include "intel_modeset_setup.h" > > #include "intel_pch_display.h" > > +#include "intel_tc.h" > > #include "intel_vblank.h" > > #include "intel_wm.h" > > #include "skl_watermark.h" > > @@ -379,6 +380,21 @@ static bool intel_crtc_has_encoders(struct intel_crtc *crtc) > > return false; > > } > > > > +static bool intel_crtc_needs_link_reset(struct intel_crtc *crtc) > > +{ > > + struct drm_device *dev = crtc->base.dev; > > + struct intel_encoder *encoder; > > + > > + for_each_encoder_on_crtc(dev, &crtc->base, encoder) { > > + struct intel_digital_port *dig_port = enc_to_dig_port(encoder); > > + > > + if (dig_port && intel_tc_port_link_needs_reset(dig_port)) > > + return true; > > + } > > + > > + return false; > > +} > > + > > static struct intel_connector *intel_encoder_find_connector(struct intel_encoder *encoder) > > { > > struct drm_i915_private *i915 = to_i915(encoder->base.dev); > > @@ -421,11 +437,12 @@ static void intel_sanitize_fifo_underrun_reporting(const struct intel_crtc_state > > !HAS_GMCH(i915)); > > } > > > > -static void intel_sanitize_crtc(struct intel_crtc *crtc, > > +static bool intel_sanitize_crtc(struct intel_crtc *crtc, > > struct drm_modeset_acquire_ctx *ctx) > > { > > struct drm_i915_private *i915 = to_i915(crtc->base.dev); > > struct intel_crtc_state *crtc_state = to_intel_crtc_state(crtc->base.state); > > + bool needs_link_reset; > > > > if (crtc_state->hw.active) { > > struct intel_plane *plane; > > @@ -445,13 +462,65 @@ static void intel_sanitize_crtc(struct intel_crtc *crtc, > > intel_color_commit_arm(crtc_state); > > } > > > > + if (!crtc_state->hw.active || > > + intel_crtc_is_bigjoiner_slave(crtc_state)) > > + return false; > > + > > + needs_link_reset = intel_crtc_needs_link_reset(crtc); > > + > > /* > > * Adjust the state of the output pipe according to whether we have > > * active connectors/encoders. > > */ > > - if (crtc_state->hw.active && !intel_crtc_has_encoders(crtc) && > > - !intel_crtc_is_bigjoiner_slave(crtc_state)) > > - intel_crtc_disable_noatomic(crtc, ctx); > > + if (!needs_link_reset && intel_crtc_has_encoders(crtc)) > > + return false; > > + > > + intel_crtc_disable_noatomic(crtc, ctx); > > + > > + /* > > + * The HPD state on other active/disconnected TC ports may be stuck in > > + * the connected state until this port is disabled and a ~10ms delay has > > + * passed, wait here for that so that sanitizing other CRTCs will see the > > + * up-to-date HPD state. > > + */ > > + if (needs_link_reset) > > + msleep(20); > > + > > + return true; > > +} > > + > > +static void intel_sanitize_all_crtcs(struct drm_i915_private *i915, > > + struct drm_modeset_acquire_ctx *ctx) > > +{ > > + struct intel_crtc *crtc; > > + u8 crtcs_forced_off = 0; > > Bit of a pipe vs. crtc confusion here. Maybe we should use > u32+drm_crtc_mask() here for real since we're not really interested > in individual pipes. Ok. > > + > > + /* > > + * An active and disconnected TypeC port prevents the HPD live state > > + * to get updated on other active/disconnected TypeC ports, so after > > + * a port gets disabled the CRTCs using other TypeC ports must be > > + * rechecked wrt. their link status. > > + */ > > + for (;;) { > > + u8 old_mask = crtcs_forced_off; > > + > > + for_each_intel_crtc(&i915->drm, crtc) { > > + if (BIT(crtc->pipe) & crtcs_forced_off) > > + continue; > > + > > + if (intel_sanitize_crtc(crtc, ctx)) > > + crtcs_forced_off |= BIT(crtc->pipe); > > + } > > + if (crtcs_forced_off == old_mask) > > + break; > > + } > > + > > + for_each_intel_crtc(&i915->drm, crtc) { > > + struct intel_crtc_state *crtc_state = > > + to_intel_crtc_state(crtc->base.state); > > + > > + intel_crtc_state_dump(crtc_state, NULL, "setup_hw_state"); > > + } > > } > > > > static bool has_bogus_dpll_config(const struct intel_crtc_state *crtc_state) > > @@ -871,13 +940,7 @@ void intel_modeset_setup_hw_state(struct drm_i915_private *i915, > > */ > > intel_modeset_update_connector_atomic_state(i915); > > > > - for_each_intel_crtc(&i915->drm, crtc) { > > - struct intel_crtc_state *crtc_state = > > - to_intel_crtc_state(crtc->base.state); > > - > > - intel_sanitize_crtc(crtc, ctx); > > - intel_crtc_state_dump(crtc_state, NULL, "setup_hw_state"); > > - } > > + intel_sanitize_all_crtcs(i915, ctx); > > > > intel_dpll_sanitize_state(i915); > > > > diff --git a/drivers/gpu/drm/i915/display/intel_tc.c b/drivers/gpu/drm/i915/display/intel_tc.c > > index 4fca711a58bce..4d45571fba956 100644 > > --- a/drivers/gpu/drm/i915/display/intel_tc.c > > +++ b/drivers/gpu/drm/i915/display/intel_tc.c > > @@ -5,15 +5,19 @@ > > > > #include "i915_drv.h" > > #include "i915_reg.h" > > +#include "intel_atomic.h" > > #include "intel_cx0_phy_regs.h" > > #include "intel_ddi.h" > > #include "intel_de.h" > > #include "intel_display.h" > > +#include "intel_display_driver.h" > > #include "intel_display_power_map.h" > > #include "intel_display_types.h" > > #include "intel_dkl_phy_regs.h" > > +#include "intel_dp.h" > > #include "intel_dp_mst.h" > > #include "intel_mg_phy_regs.h" > > +#include "intel_modeset_lock.h" > > #include "intel_tc.h" > > > > #define DP_PIN_ASSIGNMENT_C 0x3 > > @@ -51,6 +55,7 @@ struct intel_tc_port { > > enum intel_display_power_domain lock_power_domain; > > #endif > > struct delayed_work disconnect_phy_work; > > + struct delayed_work link_reset_work; > > int link_refcount; > > bool legacy_port:1; > > char port_name[8]; > > @@ -1572,6 +1577,135 @@ bool intel_tc_port_connected(struct intel_encoder *encoder) > > return is_connected; > > } > > > > +static bool __intel_tc_port_link_needs_reset(struct intel_tc_port *tc) > > +{ > > + bool ret; > > + > > + mutex_lock(&tc->lock); > > + > > + ret = tc->link_refcount && > > + tc->mode == TC_PORT_DP_ALT && > > + intel_tc_port_needs_reset(tc); > > + > > + mutex_unlock(&tc->lock); > > + > > + return ret; > > +} > > + > > +bool intel_tc_port_link_needs_reset(struct intel_digital_port *dig_port) > > +{ > > + struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev); > > + enum phy phy = intel_port_to_phy(i915, dig_port->base.port); > > + > > + if (!intel_phy_is_tc(i915, phy)) > > + return false; > > + > > + return __intel_tc_port_link_needs_reset(to_tc_port(dig_port)); > > +} > > + > > +static int reset_link(struct intel_tc_port *tc) > > +{ > > + struct drm_i915_private *i915 = tc_to_i915(tc); > > + struct intel_digital_port *dig_port = tc->dig_port; > > + struct intel_dp *intel_dp = enc_to_intel_dp(&dig_port->base); > > + struct drm_modeset_acquire_ctx ctx; > > + struct drm_atomic_state *_state; > > + struct intel_atomic_state *state; > > + int ret = 0; > > + > > + _state = drm_atomic_state_alloc(&i915->drm); > > + if (!_state) > > + return -ENOMEM; > > + > > + state = to_intel_atomic_state(_state); > > + state->internal = true; > > + > > + intel_modeset_lock_ctx_retry(&ctx, state, 0, ret) { > > + struct intel_crtc *crtc; > > + u8 pipe_mask; > > + > > + ret = drm_modeset_lock(&i915->drm.mode_config.connection_mutex, &ctx); > > + if (ret) > > + continue; > > + > > + ret = intel_dp_get_active_pipes(intel_dp, &ctx, &pipe_mask); > > + if (ret) > > + continue; > > + > > + if (!pipe_mask) > > + continue; > > + > > + for_each_intel_crtc_in_pipe_mask(&i915->drm, crtc, pipe_mask) { > > + struct intel_crtc_state *crtc_state; > > + > > + crtc_state = intel_atomic_get_crtc_state(&state->base, crtc); > > + if (IS_ERR(crtc_state)) { > > + ret = PTR_ERR(crtc_state); > > + break; > > + } > > + > > + crtc_state->uapi.connectors_changed = true; > > + } > > + > > + if (ret) > > + continue; > > + > > + if (!__intel_tc_port_link_needs_reset(tc)) > > + continue; > > + > > + ret = drm_atomic_commit(&state->base); > > I suppose one way to avoid the dangers of the continue vs. not > in these things would be to extract the entire body of the loop to > a separate function. Yes, having a function for it is clearer, will resend this with the above changes. > Anyways, the patch looks decent enough to me so > Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com> Thanks. > > > + } > > + > > + drm_atomic_state_put(&state->base); > > + > > + return ret; > > +} > > + > > +static void intel_tc_port_link_reset_work(struct work_struct *work) > > +{ > > + struct intel_tc_port *tc = > > + container_of(work, struct intel_tc_port, link_reset_work.work); > > + struct drm_i915_private *i915 = tc_to_i915(tc); > > + int ret; > > + > > + if (!__intel_tc_port_link_needs_reset(tc)) > > + return; > > + > > + mutex_lock(&i915->drm.mode_config.mutex); > > + > > + drm_dbg_kms(&i915->drm, > > + "Port %s: TypeC DP-alt sink disconnected, resetting link\n", > > + tc->port_name); > > + ret = reset_link(tc); > > + drm_WARN_ON(&i915->drm, ret); > > + > > + mutex_unlock(&i915->drm.mode_config.mutex); > > +} > > + > > +bool intel_tc_port_link_reset(struct intel_digital_port *dig_port) > > +{ > > + if (!intel_tc_port_link_needs_reset(dig_port)) > > + return false; > > + > > + queue_delayed_work(system_unbound_wq, > > + &to_tc_port(dig_port)->link_reset_work, > > + msecs_to_jiffies(2000)); > > + > > + return true; > > +} > > + > > +void intel_tc_port_link_cancel_reset_work(struct intel_digital_port *dig_port) > > +{ > > + struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev); > > + enum phy phy = intel_port_to_phy(i915, dig_port->base.port); > > + struct intel_tc_port *tc = to_tc_port(dig_port); > > + > > + if (!intel_phy_is_tc(i915, phy)) > > + return; > > + > > + cancel_delayed_work(&tc->link_reset_work); > > +} > > + > > static void __intel_tc_port_lock(struct intel_tc_port *tc, > > int required_lanes) > > { > > @@ -1619,11 +1753,19 @@ static void intel_tc_port_disconnect_phy_work(struct work_struct *work) > > * > > * Flush the delayed work disconnecting an idle PHY. > > */ > > -void intel_tc_port_flush_work(struct intel_digital_port *dig_port) > > +static void intel_tc_port_flush_work(struct intel_digital_port *dig_port) > > { > > flush_delayed_work(&to_tc_port(dig_port)->disconnect_phy_work); > > } > > > > +void intel_tc_port_suspend(struct intel_digital_port *dig_port) > > +{ > > + struct intel_tc_port *tc = to_tc_port(dig_port); > > + > > + cancel_delayed_work_sync(&tc->link_reset_work); > > + intel_tc_port_flush_work(dig_port); > > +} > > + > > void intel_tc_port_unlock(struct intel_digital_port *dig_port) > > { > > struct intel_tc_port *tc = to_tc_port(dig_port); > > @@ -1660,6 +1802,14 @@ void intel_tc_port_put_link(struct intel_digital_port *dig_port) > > intel_tc_port_lock(dig_port); > > __intel_tc_port_put_link(tc); > > intel_tc_port_unlock(dig_port); > > + > > + /* > > + * The firmware will not update the HPD status of other TypeC ports > > + * that are active in DP-alt mode with their sink disconnected, until > > + * this port is disabled and its PHY gets disconnected. Make sure this > > + * happens in a timely manner by disconnecting the PHY synchronously. > > + */ > > + intel_tc_port_flush_work(dig_port); > > } > > > > int intel_tc_port_init(struct intel_digital_port *dig_port, bool is_legacy) > > @@ -1692,7 +1842,9 @@ int intel_tc_port_init(struct intel_digital_port *dig_port, bool is_legacy) > > "%c/TC#%d", port_name(port), tc_port + 1); > > > > mutex_init(&tc->lock); > > + /* TODO: Combine the two works */ > > INIT_DELAYED_WORK(&tc->disconnect_phy_work, intel_tc_port_disconnect_phy_work); > > + INIT_DELAYED_WORK(&tc->link_reset_work, intel_tc_port_link_reset_work); > > tc->legacy_port = is_legacy; > > tc->mode = TC_PORT_DISCONNECTED; > > tc->link_refcount = 0; > > @@ -1706,7 +1858,7 @@ int intel_tc_port_init(struct intel_digital_port *dig_port, bool is_legacy) > > > > void intel_tc_port_cleanup(struct intel_digital_port *dig_port) > > { > > - intel_tc_port_flush_work(dig_port); > > + intel_tc_port_suspend(dig_port); > > > > kfree(dig_port->tc); > > dig_port->tc = NULL; > > diff --git a/drivers/gpu/drm/i915/display/intel_tc.h b/drivers/gpu/drm/i915/display/intel_tc.h > > index dd0810f9ea95e..3b16491925fa9 100644 > > --- a/drivers/gpu/drm/i915/display/intel_tc.h > > +++ b/drivers/gpu/drm/i915/display/intel_tc.h > > @@ -30,11 +30,14 @@ void intel_tc_port_sanitize_mode(struct intel_digital_port *dig_port, > > const struct intel_crtc_state *crtc_state); > > void intel_tc_port_lock(struct intel_digital_port *dig_port); > > void intel_tc_port_unlock(struct intel_digital_port *dig_port); > > -void intel_tc_port_flush_work(struct intel_digital_port *dig_port); > > +void intel_tc_port_suspend(struct intel_digital_port *dig_port); > > void intel_tc_port_get_link(struct intel_digital_port *dig_port, > > int required_lanes); > > void intel_tc_port_put_link(struct intel_digital_port *dig_port); > > bool intel_tc_port_ref_held(struct intel_digital_port *dig_port); > > +bool intel_tc_port_link_needs_reset(struct intel_digital_port *dig_port); > > +bool intel_tc_port_link_reset(struct intel_digital_port *dig_port); > > +void intel_tc_port_link_cancel_reset_work(struct intel_digital_port *dig_port); > > > > int intel_tc_port_init(struct intel_digital_port *dig_port, bool is_legacy); > > void intel_tc_port_cleanup(struct intel_digital_port *dig_port); > > -- > > 2.37.2 > > -- > Ville Syrjälä > Intel ^ permalink raw reply [flat|nested] 41+ messages in thread
* [Intel-gfx] [PATCH v5 14/14] drm/i915/tc: Reset TypeC PHYs left enabled in DP-alt mode after the sink disconnects 2023-05-10 10:31 ` [Intel-gfx] [PATCH v4 14/14] drm/i915/tc: Reset TypeC PHYs left enabled in DP-alt mode after the sink disconnects Imre Deak 2023-05-11 19:21 ` Ville Syrjälä @ 2023-05-12 19:55 ` Imre Deak 1 sibling, 0 replies; 41+ messages in thread From: Imre Deak @ 2023-05-12 19:55 UTC (permalink / raw) To: intel-gfx; +Cc: Kai-Heng Feng If the output on a DP-alt link with its sink disconnected is kept enabled for too long (about 20 sec), then some IOM/TCSS firmware timeout will cause havoc on the PCI bus, at least for other GFX devices on it which will stop powering up. Since user space is not guaranteed to do a disabling modeset in time, switch such disconnected but active links to TBT mode - which is without such shortcomings - with a 2 second delay. If the above condition is detected already during the driver load/system resume sanitization step disable the output instead, as at that point no user space or kernel client depends on a consistent output state yet and because subsequent atomic modeset on such connectors - without the actual sink capabilities available - can fail. An active/disconnected port as above will also block the HPD status of other active/disconnected ports to get updated (stuck in the connected state), until the former port is disabled, its PHY is disconnected and a ~10 ms delay has elapsed. This means the link state for all TypeC ports/CRTCs must be rechecked after a CRTC is disabled due to the above reason. For this disconnect the PHY synchronously after the CRTC/port is disabled and recheck all CRTCs for the above condition whenever such a port is disabled. To account for a race condition during driver loading where the sink is disconnected after the above sanitization step and before the HPD interrupts get enabled, do an explicit check/link reset if needed from the encoder's late_register hook, which is called after the HPD interrupts are enabled already. v2: - Handle an active/disconnected port blocking the HPD state update of another active/disconnected port. - Cancel the delayed work resetting the link also from the encoder enable/suspend/shutdown hooks. - Rebase on the earlier intel_modeset_lock_ctx_retry() addition, fixing here the missed atomic state reset in case of a retry. - Fix handling of an error return from intel_atomic_get_crtc_state(). - Recheck if the port needs to be reset after all the atomic state is locked and async commits are waited on. v3: - Add intel_crtc_needs_link_reset(), instead of open-coding it, keep intel_crtc_has_encoders(). (Ville) - Fix state dumping and use a bitmask to track disabled CRTCs in intel_sanitize_all_crtcs(). (Ville) - Set internal in intel_atomic_state right after allocating it. (Ville) - Recheck all CRTCs (not yet force-disabled) after a CRTC is force-disabled for any reason (not only due to a link state) in intel_sanitize_all_crtcs(). - Reduce delay after CRTC disabling to 20ms, and use the simpler msleep(). - Clarify code comment about HPD behaviour in intel_sanitize_all_crtcs(). - Move all the TC link reset logic to intel_tc.c . - Cancel the link reset work synchronously during system suspend, driver unload and shutdown. v4: - Rebased on previous patch, which allows calling the TC port suspend/cleanup handlers without modeset locks held; remove the display driver suspended assert from the link reset work accordingly. v5: (Ville) - Remove reset work canceling from intel_ddi_pre_pll_enable(). - Track a crtc vs. pipe mask in intel_sanitize_all_crtcs(). - Add reset_link_commit() to clarify the intel_modeset_lock_ctx_retry loop. Cc: Kai-Heng Feng <kai.heng.feng@canonical.com> Cc: Ville Syrjälä <ville.syrjala@linux.intel.com> Tested-by: Kai-Heng Feng <kai.heng.feng@canonical.com> Closes: https://gitlab.freedesktop.org/drm/intel/-/issues/5860 Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com> Signed-off-by: Imre Deak <imre.deak@intel.com> --- drivers/gpu/drm/i915/display/intel_ddi.c | 30 +++- drivers/gpu/drm/i915/display/intel_dp.c | 6 +- drivers/gpu/drm/i915/display/intel_dp.h | 3 + .../drm/i915/display/intel_modeset_setup.c | 87 ++++++++-- drivers/gpu/drm/i915/display/intel_tc.c | 159 +++++++++++++++++- drivers/gpu/drm/i915/display/intel_tc.h | 5 +- 6 files changed, 265 insertions(+), 25 deletions(-) diff --git a/drivers/gpu/drm/i915/display/intel_ddi.c b/drivers/gpu/drm/i915/display/intel_ddi.c index 7d09bd2412352..3baf329343dab 100644 --- a/drivers/gpu/drm/i915/display/intel_ddi.c +++ b/drivers/gpu/drm/i915/display/intel_ddi.c @@ -3313,6 +3313,8 @@ static void intel_disable_ddi(struct intel_atomic_state *state, const struct intel_crtc_state *old_crtc_state, const struct drm_connector_state *old_conn_state) { + intel_tc_port_link_cancel_reset_work(enc_to_dig_port(encoder)); + intel_hdcp_disable(to_intel_connector(old_conn_state->connector)); if (intel_crtc_has_type(old_crtc_state, INTEL_OUTPUT_HDMI)) @@ -4232,9 +4234,19 @@ static void intel_ddi_encoder_reset(struct drm_encoder *encoder) intel_tc_port_init_mode(dig_port); } +static int intel_ddi_encoder_late_register(struct drm_encoder *_encoder) +{ + struct intel_encoder *encoder = to_intel_encoder(_encoder); + + intel_tc_port_link_reset(enc_to_dig_port(encoder)); + + return 0; +} + static const struct drm_encoder_funcs intel_ddi_funcs = { .reset = intel_ddi_encoder_reset, .destroy = intel_ddi_encoder_destroy, + .late_register = intel_ddi_encoder_late_register, }; static struct intel_connector * @@ -4404,14 +4416,16 @@ intel_ddi_hotplug(struct intel_encoder *encoder, state = intel_encoder_hotplug(encoder, connector); - intel_modeset_lock_ctx_retry(&ctx, NULL, 0, ret) { - if (connector->base.connector_type == DRM_MODE_CONNECTOR_HDMIA) - ret = intel_hdmi_reset_link(encoder, &ctx); - else - ret = intel_dp_retrain_link(encoder, &ctx); - } + if (!intel_tc_port_link_reset(dig_port)) { + intel_modeset_lock_ctx_retry(&ctx, NULL, 0, ret) { + if (connector->base.connector_type == DRM_MODE_CONNECTOR_HDMIA) + ret = intel_hdmi_reset_link(encoder, &ctx); + else + ret = intel_dp_retrain_link(encoder, &ctx); + } - drm_WARN_ON(encoder->base.dev, ret); + drm_WARN_ON(encoder->base.dev, ret); + } /* * Unpowered type-c dongles can take some time to boot and be @@ -4625,7 +4639,7 @@ static void intel_ddi_tc_encoder_suspend_complete(struct intel_encoder *encoder) struct intel_dp *intel_dp = enc_to_intel_dp(encoder); struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp); - intel_tc_port_flush_work(dig_port); + intel_tc_port_suspend(dig_port); } static void intel_ddi_encoder_shutdown(struct intel_encoder *encoder) diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c index 99ceaa7d90b62..9a13ec09755fc 100644 --- a/drivers/gpu/drm/i915/display/intel_dp.c +++ b/drivers/gpu/drm/i915/display/intel_dp.c @@ -4231,9 +4231,9 @@ static bool intel_dp_has_connector(struct intel_dp *intel_dp, return false; } -static int intel_dp_get_active_pipes(struct intel_dp *intel_dp, - struct drm_modeset_acquire_ctx *ctx, - u8 *pipe_mask) +int intel_dp_get_active_pipes(struct intel_dp *intel_dp, + struct drm_modeset_acquire_ctx *ctx, + u8 *pipe_mask) { struct drm_i915_private *i915 = dp_to_i915(intel_dp); struct drm_connector_list_iter conn_iter; diff --git a/drivers/gpu/drm/i915/display/intel_dp.h b/drivers/gpu/drm/i915/display/intel_dp.h index ef39e4f7a329e..5f86157a10d2d 100644 --- a/drivers/gpu/drm/i915/display/intel_dp.h +++ b/drivers/gpu/drm/i915/display/intel_dp.h @@ -42,6 +42,9 @@ void intel_dp_set_link_params(struct intel_dp *intel_dp, int link_rate, int lane_count); int intel_dp_get_link_train_fallback_values(struct intel_dp *intel_dp, int link_rate, u8 lane_count); +int intel_dp_get_active_pipes(struct intel_dp *intel_dp, + struct drm_modeset_acquire_ctx *ctx, + u8 *pipe_mask); int intel_dp_retrain_link(struct intel_encoder *encoder, struct drm_modeset_acquire_ctx *ctx); void intel_dp_set_power(struct intel_dp *intel_dp, u8 mode); diff --git a/drivers/gpu/drm/i915/display/intel_modeset_setup.c b/drivers/gpu/drm/i915/display/intel_modeset_setup.c index 75b4dea1e442b..5ff99ca7f1de0 100644 --- a/drivers/gpu/drm/i915/display/intel_modeset_setup.c +++ b/drivers/gpu/drm/i915/display/intel_modeset_setup.c @@ -26,6 +26,7 @@ #include "intel_fifo_underrun.h" #include "intel_modeset_setup.h" #include "intel_pch_display.h" +#include "intel_tc.h" #include "intel_vblank.h" #include "intel_wm.h" #include "skl_watermark.h" @@ -379,6 +380,21 @@ static bool intel_crtc_has_encoders(struct intel_crtc *crtc) return false; } +static bool intel_crtc_needs_link_reset(struct intel_crtc *crtc) +{ + struct drm_device *dev = crtc->base.dev; + struct intel_encoder *encoder; + + for_each_encoder_on_crtc(dev, &crtc->base, encoder) { + struct intel_digital_port *dig_port = enc_to_dig_port(encoder); + + if (dig_port && intel_tc_port_link_needs_reset(dig_port)) + return true; + } + + return false; +} + static struct intel_connector *intel_encoder_find_connector(struct intel_encoder *encoder) { struct drm_i915_private *i915 = to_i915(encoder->base.dev); @@ -421,11 +437,12 @@ static void intel_sanitize_fifo_underrun_reporting(const struct intel_crtc_state !HAS_GMCH(i915)); } -static void intel_sanitize_crtc(struct intel_crtc *crtc, +static bool intel_sanitize_crtc(struct intel_crtc *crtc, struct drm_modeset_acquire_ctx *ctx) { struct drm_i915_private *i915 = to_i915(crtc->base.dev); struct intel_crtc_state *crtc_state = to_intel_crtc_state(crtc->base.state); + bool needs_link_reset; if (crtc_state->hw.active) { struct intel_plane *plane; @@ -445,13 +462,67 @@ static void intel_sanitize_crtc(struct intel_crtc *crtc, intel_color_commit_arm(crtc_state); } + if (!crtc_state->hw.active || + intel_crtc_is_bigjoiner_slave(crtc_state)) + return false; + + needs_link_reset = intel_crtc_needs_link_reset(crtc); + /* * Adjust the state of the output pipe according to whether we have * active connectors/encoders. */ - if (crtc_state->hw.active && !intel_crtc_has_encoders(crtc) && - !intel_crtc_is_bigjoiner_slave(crtc_state)) - intel_crtc_disable_noatomic(crtc, ctx); + if (!needs_link_reset && intel_crtc_has_encoders(crtc)) + return false; + + intel_crtc_disable_noatomic(crtc, ctx); + + /* + * The HPD state on other active/disconnected TC ports may be stuck in + * the connected state until this port is disabled and a ~10ms delay has + * passed, wait here for that so that sanitizing other CRTCs will see the + * up-to-date HPD state. + */ + if (needs_link_reset) + msleep(20); + + return true; +} + +static void intel_sanitize_all_crtcs(struct drm_i915_private *i915, + struct drm_modeset_acquire_ctx *ctx) +{ + struct intel_crtc *crtc; + u32 crtcs_forced_off = 0; + + /* + * An active and disconnected TypeC port prevents the HPD live state + * to get updated on other active/disconnected TypeC ports, so after + * a port gets disabled the CRTCs using other TypeC ports must be + * rechecked wrt. their link status. + */ + for (;;) { + u32 old_mask = crtcs_forced_off; + + for_each_intel_crtc(&i915->drm, crtc) { + u32 crtc_mask = drm_crtc_mask(&crtc->base); + + if (crtcs_forced_off & crtc_mask) + continue; + + if (intel_sanitize_crtc(crtc, ctx)) + crtcs_forced_off |= crtc_mask; + } + if (crtcs_forced_off == old_mask) + break; + } + + for_each_intel_crtc(&i915->drm, crtc) { + struct intel_crtc_state *crtc_state = + to_intel_crtc_state(crtc->base.state); + + intel_crtc_state_dump(crtc_state, NULL, "setup_hw_state"); + } } static bool has_bogus_dpll_config(const struct intel_crtc_state *crtc_state) @@ -871,13 +942,7 @@ void intel_modeset_setup_hw_state(struct drm_i915_private *i915, */ intel_modeset_update_connector_atomic_state(i915); - for_each_intel_crtc(&i915->drm, crtc) { - struct intel_crtc_state *crtc_state = - to_intel_crtc_state(crtc->base.state); - - intel_sanitize_crtc(crtc, ctx); - intel_crtc_state_dump(crtc_state, NULL, "setup_hw_state"); - } + intel_sanitize_all_crtcs(i915, ctx); intel_dpll_sanitize_state(i915); diff --git a/drivers/gpu/drm/i915/display/intel_tc.c b/drivers/gpu/drm/i915/display/intel_tc.c index 4fca711a58bce..3ebf41859043e 100644 --- a/drivers/gpu/drm/i915/display/intel_tc.c +++ b/drivers/gpu/drm/i915/display/intel_tc.c @@ -5,15 +5,19 @@ #include "i915_drv.h" #include "i915_reg.h" +#include "intel_atomic.h" #include "intel_cx0_phy_regs.h" #include "intel_ddi.h" #include "intel_de.h" #include "intel_display.h" +#include "intel_display_driver.h" #include "intel_display_power_map.h" #include "intel_display_types.h" #include "intel_dkl_phy_regs.h" +#include "intel_dp.h" #include "intel_dp_mst.h" #include "intel_mg_phy_regs.h" +#include "intel_modeset_lock.h" #include "intel_tc.h" #define DP_PIN_ASSIGNMENT_C 0x3 @@ -51,6 +55,7 @@ struct intel_tc_port { enum intel_display_power_domain lock_power_domain; #endif struct delayed_work disconnect_phy_work; + struct delayed_work link_reset_work; int link_refcount; bool legacy_port:1; char port_name[8]; @@ -1572,6 +1577,138 @@ bool intel_tc_port_connected(struct intel_encoder *encoder) return is_connected; } +static bool __intel_tc_port_link_needs_reset(struct intel_tc_port *tc) +{ + bool ret; + + mutex_lock(&tc->lock); + + ret = tc->link_refcount && + tc->mode == TC_PORT_DP_ALT && + intel_tc_port_needs_reset(tc); + + mutex_unlock(&tc->lock); + + return ret; +} + +bool intel_tc_port_link_needs_reset(struct intel_digital_port *dig_port) +{ + struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev); + enum phy phy = intel_port_to_phy(i915, dig_port->base.port); + + if (!intel_phy_is_tc(i915, phy)) + return false; + + return __intel_tc_port_link_needs_reset(to_tc_port(dig_port)); +} + +static int reset_link_commit(struct intel_tc_port *tc, + struct intel_atomic_state *state, + struct drm_modeset_acquire_ctx *ctx) +{ + struct drm_i915_private *i915 = tc_to_i915(tc); + struct intel_digital_port *dig_port = tc->dig_port; + struct intel_dp *intel_dp = enc_to_intel_dp(&dig_port->base); + struct intel_crtc *crtc; + u8 pipe_mask; + int ret; + + ret = drm_modeset_lock(&i915->drm.mode_config.connection_mutex, ctx); + if (ret) + return ret; + + ret = intel_dp_get_active_pipes(intel_dp, ctx, &pipe_mask); + if (ret) + return ret; + + if (!pipe_mask) + return 0; + + for_each_intel_crtc_in_pipe_mask(&i915->drm, crtc, pipe_mask) { + struct intel_crtc_state *crtc_state; + + crtc_state = intel_atomic_get_crtc_state(&state->base, crtc); + if (IS_ERR(crtc_state)) + return PTR_ERR(crtc_state); + + crtc_state->uapi.connectors_changed = true; + } + + if (!__intel_tc_port_link_needs_reset(tc)) + return 0; + + return drm_atomic_commit(&state->base); +} + +static int reset_link(struct intel_tc_port *tc) +{ + struct drm_i915_private *i915 = tc_to_i915(tc); + struct drm_modeset_acquire_ctx ctx; + struct drm_atomic_state *_state; + struct intel_atomic_state *state; + int ret; + + _state = drm_atomic_state_alloc(&i915->drm); + if (!_state) + return -ENOMEM; + + state = to_intel_atomic_state(_state); + state->internal = true; + + intel_modeset_lock_ctx_retry(&ctx, state, 0, ret) + ret = reset_link_commit(tc, state, &ctx); + + drm_atomic_state_put(&state->base); + + return ret; +} + +static void intel_tc_port_link_reset_work(struct work_struct *work) +{ + struct intel_tc_port *tc = + container_of(work, struct intel_tc_port, link_reset_work.work); + struct drm_i915_private *i915 = tc_to_i915(tc); + int ret; + + if (!__intel_tc_port_link_needs_reset(tc)) + return; + + mutex_lock(&i915->drm.mode_config.mutex); + + drm_dbg_kms(&i915->drm, + "Port %s: TypeC DP-alt sink disconnected, resetting link\n", + tc->port_name); + ret = reset_link(tc); + drm_WARN_ON(&i915->drm, ret); + + mutex_unlock(&i915->drm.mode_config.mutex); +} + +bool intel_tc_port_link_reset(struct intel_digital_port *dig_port) +{ + if (!intel_tc_port_link_needs_reset(dig_port)) + return false; + + queue_delayed_work(system_unbound_wq, + &to_tc_port(dig_port)->link_reset_work, + msecs_to_jiffies(2000)); + + return true; +} + +void intel_tc_port_link_cancel_reset_work(struct intel_digital_port *dig_port) +{ + struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev); + enum phy phy = intel_port_to_phy(i915, dig_port->base.port); + struct intel_tc_port *tc = to_tc_port(dig_port); + + if (!intel_phy_is_tc(i915, phy)) + return; + + cancel_delayed_work(&tc->link_reset_work); +} + static void __intel_tc_port_lock(struct intel_tc_port *tc, int required_lanes) { @@ -1619,11 +1756,19 @@ static void intel_tc_port_disconnect_phy_work(struct work_struct *work) * * Flush the delayed work disconnecting an idle PHY. */ -void intel_tc_port_flush_work(struct intel_digital_port *dig_port) +static void intel_tc_port_flush_work(struct intel_digital_port *dig_port) { flush_delayed_work(&to_tc_port(dig_port)->disconnect_phy_work); } +void intel_tc_port_suspend(struct intel_digital_port *dig_port) +{ + struct intel_tc_port *tc = to_tc_port(dig_port); + + cancel_delayed_work_sync(&tc->link_reset_work); + intel_tc_port_flush_work(dig_port); +} + void intel_tc_port_unlock(struct intel_digital_port *dig_port) { struct intel_tc_port *tc = to_tc_port(dig_port); @@ -1660,6 +1805,14 @@ void intel_tc_port_put_link(struct intel_digital_port *dig_port) intel_tc_port_lock(dig_port); __intel_tc_port_put_link(tc); intel_tc_port_unlock(dig_port); + + /* + * The firmware will not update the HPD status of other TypeC ports + * that are active in DP-alt mode with their sink disconnected, until + * this port is disabled and its PHY gets disconnected. Make sure this + * happens in a timely manner by disconnecting the PHY synchronously. + */ + intel_tc_port_flush_work(dig_port); } int intel_tc_port_init(struct intel_digital_port *dig_port, bool is_legacy) @@ -1692,7 +1845,9 @@ int intel_tc_port_init(struct intel_digital_port *dig_port, bool is_legacy) "%c/TC#%d", port_name(port), tc_port + 1); mutex_init(&tc->lock); + /* TODO: Combine the two works */ INIT_DELAYED_WORK(&tc->disconnect_phy_work, intel_tc_port_disconnect_phy_work); + INIT_DELAYED_WORK(&tc->link_reset_work, intel_tc_port_link_reset_work); tc->legacy_port = is_legacy; tc->mode = TC_PORT_DISCONNECTED; tc->link_refcount = 0; @@ -1706,7 +1861,7 @@ int intel_tc_port_init(struct intel_digital_port *dig_port, bool is_legacy) void intel_tc_port_cleanup(struct intel_digital_port *dig_port) { - intel_tc_port_flush_work(dig_port); + intel_tc_port_suspend(dig_port); kfree(dig_port->tc); dig_port->tc = NULL; diff --git a/drivers/gpu/drm/i915/display/intel_tc.h b/drivers/gpu/drm/i915/display/intel_tc.h index dd0810f9ea95e..3b16491925fa9 100644 --- a/drivers/gpu/drm/i915/display/intel_tc.h +++ b/drivers/gpu/drm/i915/display/intel_tc.h @@ -30,11 +30,14 @@ void intel_tc_port_sanitize_mode(struct intel_digital_port *dig_port, const struct intel_crtc_state *crtc_state); void intel_tc_port_lock(struct intel_digital_port *dig_port); void intel_tc_port_unlock(struct intel_digital_port *dig_port); -void intel_tc_port_flush_work(struct intel_digital_port *dig_port); +void intel_tc_port_suspend(struct intel_digital_port *dig_port); void intel_tc_port_get_link(struct intel_digital_port *dig_port, int required_lanes); void intel_tc_port_put_link(struct intel_digital_port *dig_port); bool intel_tc_port_ref_held(struct intel_digital_port *dig_port); +bool intel_tc_port_link_needs_reset(struct intel_digital_port *dig_port); +bool intel_tc_port_link_reset(struct intel_digital_port *dig_port); +void intel_tc_port_link_cancel_reset_work(struct intel_digital_port *dig_port); int intel_tc_port_init(struct intel_digital_port *dig_port, bool is_legacy); void intel_tc_port_cleanup(struct intel_digital_port *dig_port); -- 2.37.2 ^ permalink raw reply related [flat|nested] 41+ messages in thread
* [Intel-gfx] ✗ Fi.CI.CHECKPATCH: warning for drm/i915/tc: Add a workaround for an IOM/TCSS firmware hang issue (rev11) 2023-05-10 10:31 [Intel-gfx] [PATCH v4 00/14] drm/i915/tc: Add a workaround for an IOM/TCSS firmware hang issue Imre Deak ` (13 preceding siblings ...) 2023-05-10 10:31 ` [Intel-gfx] [PATCH v4 14/14] drm/i915/tc: Reset TypeC PHYs left enabled in DP-alt mode after the sink disconnects Imre Deak @ 2023-05-10 11:13 ` Patchwork 2023-05-10 11:13 ` [Intel-gfx] ✗ Fi.CI.SPARSE: " Patchwork ` (6 subsequent siblings) 21 siblings, 0 replies; 41+ messages in thread From: Patchwork @ 2023-05-10 11:13 UTC (permalink / raw) To: Imre Deak; +Cc: intel-gfx == Series Details == Series: drm/i915/tc: Add a workaround for an IOM/TCSS firmware hang issue (rev11) URL : https://patchwork.freedesktop.org/series/117004/ State : warning == Summary == Error: dim checkpatch failed 1c6ca42f5da6 drm/i915: Fix PIPEDMC disabling for a bigjoiner configuration c523f3133717 drm/i915: Add helpers to reference/unreference a DPLL for a CRTC 4b78e7cb56ef drm/i915: Make the CRTC state consistent during sanitize-disabling 1deb0c819cfe drm/i915: Update connector atomic state before crtc sanitize-disabling 5a03f330c916 drm/i915: Separate intel_crtc_disable_noatomic_begin/complete() cdd2f850fcfc drm/i915: Factor out set_encoder_for_connector() 0e1ed421d648 drm/i915: Add support for disabling any CRTCs during HW readout/sanitization 486d78e143dc drm/i915/dp: Add link training debug and error printing helpers -:34: ERROR:COMPLEX_MACRO: Macros with complex values should be enclosed in parentheses #34: FILE: drivers/gpu/drm/i915/display/intel_dp_link_training.c:30: +#define LT_MSG_ARGS(_intel_dp, _dp_phy) (_intel_dp)->attached_connector->base.base.id, \ + (_intel_dp)->attached_connector->base.name, \ + dp_to_dig_port(_intel_dp)->base.base.base.id, \ + dp_to_dig_port(_intel_dp)->base.base.name, \ + drm_dp_phy_name(_dp_phy) -:34: CHECK:MACRO_ARG_REUSE: Macro argument reuse '_intel_dp' - possible side-effects? #34: FILE: drivers/gpu/drm/i915/display/intel_dp_link_training.c:30: +#define LT_MSG_ARGS(_intel_dp, _dp_phy) (_intel_dp)->attached_connector->base.base.id, \ + (_intel_dp)->attached_connector->base.name, \ + dp_to_dig_port(_intel_dp)->base.base.base.id, \ + dp_to_dig_port(_intel_dp)->base.base.name, \ + drm_dp_phy_name(_dp_phy) -:40: CHECK:MACRO_ARG_REUSE: Macro argument reuse '_intel_dp' - possible side-effects? #40: FILE: drivers/gpu/drm/i915/display/intel_dp_link_training.c:36: +#define lt_dbg(_intel_dp, _dp_phy, _format, ...) \ + drm_dbg_kms(&dp_to_i915(_intel_dp)->drm, \ + LT_MSG_PREFIX _format, \ + LT_MSG_ARGS(_intel_dp, _dp_phy), ## __VA_ARGS__) -:45: CHECK:MACRO_ARG_REUSE: Macro argument reuse '_intel_dp' - possible side-effects? #45: FILE: drivers/gpu/drm/i915/display/intel_dp_link_training.c:41: +#define lt_err(_intel_dp, _dp_phy, _format, ...) \ + drm_err(&dp_to_i915(_intel_dp)->drm, \ + LT_MSG_PREFIX _format, \ + LT_MSG_ARGS(_intel_dp, _dp_phy), ## __VA_ARGS__) total: 1 errors, 0 warnings, 3 checks, 758 lines checked 3e4284c57120 drm/i915/dp: Convert link training error to debug message on disconnected sink -:39: CHECK:MACRO_ARG_REUSE: Macro argument reuse '_intel_dp' - possible side-effects? #39: FILE: drivers/gpu/drm/i915/display/intel_dp_link_training.c:41: +#define lt_err(_intel_dp, _dp_phy, _format, ...) do { \ + if (intel_digital_port_connected(&dp_to_dig_port(_intel_dp)->base)) \ + drm_err(&dp_to_i915(_intel_dp)->drm, \ + LT_MSG_PREFIX _format, \ + LT_MSG_ARGS(_intel_dp, _dp_phy), ## __VA_ARGS__); \ + else \ + lt_dbg(_intel_dp, _dp_phy, "Sink disconnected: " _format, ## __VA_ARGS__); \ +} while (0) -:39: CHECK:MACRO_ARG_REUSE: Macro argument reuse '_dp_phy' - possible side-effects? #39: FILE: drivers/gpu/drm/i915/display/intel_dp_link_training.c:41: +#define lt_err(_intel_dp, _dp_phy, _format, ...) do { \ + if (intel_digital_port_connected(&dp_to_dig_port(_intel_dp)->base)) \ + drm_err(&dp_to_i915(_intel_dp)->drm, \ + LT_MSG_PREFIX _format, \ + LT_MSG_ARGS(_intel_dp, _dp_phy), ## __VA_ARGS__); \ + else \ + lt_dbg(_intel_dp, _dp_phy, "Sink disconnected: " _format, ## __VA_ARGS__); \ +} while (0) -:39: CHECK:MACRO_ARG_REUSE: Macro argument reuse '_format' - possible side-effects? #39: FILE: drivers/gpu/drm/i915/display/intel_dp_link_training.c:41: +#define lt_err(_intel_dp, _dp_phy, _format, ...) do { \ + if (intel_digital_port_connected(&dp_to_dig_port(_intel_dp)->base)) \ + drm_err(&dp_to_i915(_intel_dp)->drm, \ + LT_MSG_PREFIX _format, \ + LT_MSG_ARGS(_intel_dp, _dp_phy), ## __VA_ARGS__); \ + else \ + lt_dbg(_intel_dp, _dp_phy, "Sink disconnected: " _format, ## __VA_ARGS__); \ +} while (0) total: 0 errors, 0 warnings, 3 checks, 18 lines checked a44bfd3ab166 drm/i915/dp: Prevent link training fallback on disconnected port aadf7a0770a4 drm/i915/dp: Factor out intel_dp_get_active_pipes() 1ca7b464d077 drm/i915: Factor out a helper for handling atomic modeset locks/state Traceback (most recent call last): File "scripts/spdxcheck.py", line 6, in <module> from ply import lex, yacc ModuleNotFoundError: No module named 'ply' Traceback (most recent call last): File "scripts/spdxcheck.py", line 6, in <module> from ply import lex, yacc ModuleNotFoundError: No module named 'ply' -:13: WARNING:COMMIT_LOG_LONG_LINE: Possible unwrapped commit description (prefer a maximum 75 chars per line) #13: https://lore.kernel.org/all/20210715184954.7794-2-ville.syrjala@linux.intel.com/ -:86: WARNING:FILE_PATH_CHANGES: added, moved or deleted file(s), does MAINTAINERS need updating? #86: new file mode 100644 -:174: CHECK:MACRO_ARG_REUSE: Macro argument reuse 'ctx' - possible side-effects? #174: FILE: drivers/gpu/drm/i915/display/intel_modeset_lock.h:28: +#define intel_modeset_lock_ctx_retry(ctx, state, flags, ret) \ + for (_intel_modeset_lock_begin((ctx), (state), (flags), &(ret)); \ + _intel_modeset_lock_loop(&(ret)); \ + _intel_modeset_lock_end((ctx), (state), &(ret))) -:174: CHECK:MACRO_ARG_REUSE: Macro argument reuse 'state' - possible side-effects? #174: FILE: drivers/gpu/drm/i915/display/intel_modeset_lock.h:28: +#define intel_modeset_lock_ctx_retry(ctx, state, flags, ret) \ + for (_intel_modeset_lock_begin((ctx), (state), (flags), &(ret)); \ + _intel_modeset_lock_loop(&(ret)); \ + _intel_modeset_lock_end((ctx), (state), &(ret))) -:174: CHECK:MACRO_ARG_REUSE: Macro argument reuse 'ret' - possible side-effects? #174: FILE: drivers/gpu/drm/i915/display/intel_modeset_lock.h:28: +#define intel_modeset_lock_ctx_retry(ctx, state, flags, ret) \ + for (_intel_modeset_lock_begin((ctx), (state), (flags), &(ret)); \ + _intel_modeset_lock_loop(&(ret)); \ + _intel_modeset_lock_end((ctx), (state), &(ret))) total: 0 errors, 2 warnings, 3 checks, 125 lines checked 242a4f29d59a drm/i915/tc: Call TypeC port flush_work/cleanup without modeset locks held da6ea60f6cc2 drm/i915/tc: Reset TypeC PHYs left enabled in DP-alt mode after the sink disconnects ^ permalink raw reply [flat|nested] 41+ messages in thread
* [Intel-gfx] ✗ Fi.CI.SPARSE: warning for drm/i915/tc: Add a workaround for an IOM/TCSS firmware hang issue (rev11) 2023-05-10 10:31 [Intel-gfx] [PATCH v4 00/14] drm/i915/tc: Add a workaround for an IOM/TCSS firmware hang issue Imre Deak ` (14 preceding siblings ...) 2023-05-10 11:13 ` [Intel-gfx] ✗ Fi.CI.CHECKPATCH: warning for drm/i915/tc: Add a workaround for an IOM/TCSS firmware hang issue (rev11) Patchwork @ 2023-05-10 11:13 ` Patchwork 2023-05-10 11:18 ` [Intel-gfx] ✓ Fi.CI.BAT: success " Patchwork ` (5 subsequent siblings) 21 siblings, 0 replies; 41+ messages in thread From: Patchwork @ 2023-05-10 11:13 UTC (permalink / raw) To: Imre Deak; +Cc: intel-gfx == Series Details == Series: drm/i915/tc: Add a workaround for an IOM/TCSS firmware hang issue (rev11) URL : https://patchwork.freedesktop.org/series/117004/ State : warning == Summary == Error: dim sparse failed Sparse version: v0.6.2 Fast mode used, each commit won't be checked separately. ^ permalink raw reply [flat|nested] 41+ messages in thread
* [Intel-gfx] ✓ Fi.CI.BAT: success for drm/i915/tc: Add a workaround for an IOM/TCSS firmware hang issue (rev11) 2023-05-10 10:31 [Intel-gfx] [PATCH v4 00/14] drm/i915/tc: Add a workaround for an IOM/TCSS firmware hang issue Imre Deak ` (15 preceding siblings ...) 2023-05-10 11:13 ` [Intel-gfx] ✗ Fi.CI.SPARSE: " Patchwork @ 2023-05-10 11:18 ` Patchwork 2023-05-10 13:52 ` [Intel-gfx] ✗ Fi.CI.IGT: failure " Patchwork ` (4 subsequent siblings) 21 siblings, 0 replies; 41+ messages in thread From: Patchwork @ 2023-05-10 11:18 UTC (permalink / raw) To: Imre Deak; +Cc: intel-gfx [-- Attachment #1: Type: text/plain, Size: 5526 bytes --] == Series Details == Series: drm/i915/tc: Add a workaround for an IOM/TCSS firmware hang issue (rev11) URL : https://patchwork.freedesktop.org/series/117004/ State : success == Summary == CI Bug Log - changes from CI_DRM_13129 -> Patchwork_117004v11 ==================================================== Summary ------- **SUCCESS** No regressions found. External URL: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_117004v11/index.html Participating hosts (41 -> 39) ------------------------------ Missing (2): fi-kbl-soraka fi-snb-2520m Known issues ------------ Here are the changes found in Patchwork_117004v11 that come from known issues: ### IGT changes ### #### Issues hit #### * igt@i915_pm_backlight@basic-brightness@edp-1: - bat-rplp-1: NOTRUN -> [ABORT][1] ([i915#7077]) [1]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_117004v11/bat-rplp-1/igt@i915_pm_backlight@basic-brightness@edp-1.html * igt@i915_selftest@live@execlists: - fi-bsw-n3050: [PASS][2] -> [ABORT][3] ([i915#7911] / [i915#7913]) [2]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13129/fi-bsw-n3050/igt@i915_selftest@live@execlists.html [3]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_117004v11/fi-bsw-n3050/igt@i915_selftest@live@execlists.html * igt@i915_selftest@live@slpc: - bat-rpls-2: [PASS][4] -> [DMESG-WARN][5] ([i915#6367]) [4]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13129/bat-rpls-2/igt@i915_selftest@live@slpc.html [5]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_117004v11/bat-rpls-2/igt@i915_selftest@live@slpc.html #### Possible fixes #### * igt@i915_selftest@live@requests: - {bat-mtlp-8}: [ABORT][6] ([i915#4983] / [i915#7920] / [i915#7953]) -> [PASS][7] [6]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13129/bat-mtlp-8/igt@i915_selftest@live@requests.html [7]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_117004v11/bat-mtlp-8/igt@i915_selftest@live@requests.html - {bat-mtlp-6}: [ABORT][8] ([i915#4983] / [i915#7920] / [i915#7953]) -> [PASS][9] [8]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13129/bat-mtlp-6/igt@i915_selftest@live@requests.html [9]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_117004v11/bat-mtlp-6/igt@i915_selftest@live@requests.html #### Warnings #### * igt@kms_setmode@basic-clone-single-crtc: - bat-rplp-1: [ABORT][10] ([i915#8260]) -> [SKIP][11] ([i915#3555] / [i915#4579]) [10]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13129/bat-rplp-1/igt@kms_setmode@basic-clone-single-crtc.html [11]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_117004v11/bat-rplp-1/igt@kms_setmode@basic-clone-single-crtc.html {name}: This element is suppressed. This means it is ignored when computing the status of the difference (SUCCESS, WARNING, or FAILURE). [i915#1845]: https://gitlab.freedesktop.org/drm/intel/issues/1845 [i915#3555]: https://gitlab.freedesktop.org/drm/intel/issues/3555 [i915#4078]: https://gitlab.freedesktop.org/drm/intel/issues/4078 [i915#4579]: https://gitlab.freedesktop.org/drm/intel/issues/4579 [i915#4983]: https://gitlab.freedesktop.org/drm/intel/issues/4983 [i915#6367]: https://gitlab.freedesktop.org/drm/intel/issues/6367 [i915#6645]: https://gitlab.freedesktop.org/drm/intel/issues/6645 [i915#7077]: https://gitlab.freedesktop.org/drm/intel/issues/7077 [i915#7828]: https://gitlab.freedesktop.org/drm/intel/issues/7828 [i915#7911]: https://gitlab.freedesktop.org/drm/intel/issues/7911 [i915#7913]: https://gitlab.freedesktop.org/drm/intel/issues/7913 [i915#7920]: https://gitlab.freedesktop.org/drm/intel/issues/7920 [i915#7953]: https://gitlab.freedesktop.org/drm/intel/issues/7953 [i915#8260]: https://gitlab.freedesktop.org/drm/intel/issues/8260 Build changes ------------- * Linux: CI_DRM_13129 -> Patchwork_117004v11 CI-20190529: 20190529 CI_DRM_13129: 451e49cfbaa90720149e63f4fa9c7824013c783d @ git://anongit.freedesktop.org/gfx-ci/linux IGT_7285: d1cbf2bad9c2664ab8bd3bd0946510a52800912f @ https://gitlab.freedesktop.org/drm/igt-gpu-tools.git Patchwork_117004v11: 451e49cfbaa90720149e63f4fa9c7824013c783d @ git://anongit.freedesktop.org/gfx-ci/linux ### Linux commits 10ff32832e41 drm/i915/tc: Reset TypeC PHYs left enabled in DP-alt mode after the sink disconnects ee8c5f01994b drm/i915/tc: Call TypeC port flush_work/cleanup without modeset locks held dd42b48eac05 drm/i915: Factor out a helper for handling atomic modeset locks/state 788a9d13ada7 drm/i915/dp: Factor out intel_dp_get_active_pipes() 64c33fbb767f drm/i915/dp: Prevent link training fallback on disconnected port 3fb5a6327794 drm/i915/dp: Convert link training error to debug message on disconnected sink 511b92f206f5 drm/i915/dp: Add link training debug and error printing helpers f6253f25571f drm/i915: Add support for disabling any CRTCs during HW readout/sanitization 9d0c2d68cd9c drm/i915: Factor out set_encoder_for_connector() ec9ce6236409 drm/i915: Separate intel_crtc_disable_noatomic_begin/complete() 4c4d0f2a7ab7 drm/i915: Update connector atomic state before crtc sanitize-disabling 098c094aa48b drm/i915: Make the CRTC state consistent during sanitize-disabling bf2de6fd1906 drm/i915: Add helpers to reference/unreference a DPLL for a CRTC a47a22007f36 drm/i915: Fix PIPEDMC disabling for a bigjoiner configuration == Logs == For more details see: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_117004v11/index.html [-- Attachment #2: Type: text/html, Size: 6267 bytes --] ^ permalink raw reply [flat|nested] 41+ messages in thread
* [Intel-gfx] ✗ Fi.CI.IGT: failure for drm/i915/tc: Add a workaround for an IOM/TCSS firmware hang issue (rev11) 2023-05-10 10:31 [Intel-gfx] [PATCH v4 00/14] drm/i915/tc: Add a workaround for an IOM/TCSS firmware hang issue Imre Deak ` (16 preceding siblings ...) 2023-05-10 11:18 ` [Intel-gfx] ✓ Fi.CI.BAT: success " Patchwork @ 2023-05-10 13:52 ` Patchwork 2023-05-12 21:17 ` [Intel-gfx] ✗ Fi.CI.CHECKPATCH: warning for drm/i915/tc: Add a workaround for an IOM/TCSS firmware hang issue (rev13) Patchwork ` (3 subsequent siblings) 21 siblings, 0 replies; 41+ messages in thread From: Patchwork @ 2023-05-10 13:52 UTC (permalink / raw) To: Imre Deak; +Cc: intel-gfx [-- Attachment #1: Type: text/plain, Size: 9178 bytes --] == Series Details == Series: drm/i915/tc: Add a workaround for an IOM/TCSS firmware hang issue (rev11) URL : https://patchwork.freedesktop.org/series/117004/ State : failure == Summary == CI Bug Log - changes from CI_DRM_13129_full -> Patchwork_117004v11_full ==================================================== Summary ------- **FAILURE** Serious unknown changes coming with Patchwork_117004v11_full absolutely need to be verified manually. If you think the reported changes have nothing to do with the changes introduced in Patchwork_117004v11_full, please notify your bug team to allow them to document this new failure mode, which will reduce false positives in CI. Participating hosts (7 -> 7) ------------------------------ No changes in participating hosts Possible new issues ------------------- Here are the unknown changes that may have been introduced in Patchwork_117004v11_full: ### IGT changes ### #### Possible regressions #### * igt@gem_busy@close-race: - shard-snb: [PASS][1] -> [ABORT][2] [1]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13129/shard-snb6/igt@gem_busy@close-race.html [2]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_117004v11/shard-snb5/igt@gem_busy@close-race.html Known issues ------------ Here are the changes found in Patchwork_117004v11_full that come from known issues: ### IGT changes ### #### Issues hit #### * igt@gem_exec_fair@basic-deadline: - shard-glk: [PASS][3] -> [FAIL][4] ([i915#2846]) [3]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13129/shard-glk9/igt@gem_exec_fair@basic-deadline.html [4]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_117004v11/shard-glk9/igt@gem_exec_fair@basic-deadline.html * igt@gem_huc_copy@huc-copy: - shard-glk: NOTRUN -> [SKIP][5] ([fdo#109271] / [i915#2190]) [5]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_117004v11/shard-glk8/igt@gem_huc_copy@huc-copy.html * igt@gem_pread@exhaustion: - shard-glk: NOTRUN -> [WARN][6] ([i915#2658]) [6]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_117004v11/shard-glk8/igt@gem_pread@exhaustion.html * igt@kms_ccs@pipe-a-bad-aux-stride-y_tiled_gen12_mc_ccs: - shard-glk: NOTRUN -> [SKIP][7] ([fdo#109271] / [i915#3886]) [7]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_117004v11/shard-glk8/igt@kms_ccs@pipe-a-bad-aux-stride-y_tiled_gen12_mc_ccs.html * igt@kms_cursor_legacy@flip-vs-cursor-atomic-transitions: - shard-apl: [PASS][8] -> [FAIL][9] ([i915#2346]) [8]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13129/shard-apl7/igt@kms_cursor_legacy@flip-vs-cursor-atomic-transitions.html [9]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_117004v11/shard-apl7/igt@kms_cursor_legacy@flip-vs-cursor-atomic-transitions.html * igt@kms_psr2_su@page_flip-p010: - shard-glk: NOTRUN -> [SKIP][10] ([fdo#109271] / [i915#658]) [10]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_117004v11/shard-glk8/igt@kms_psr2_su@page_flip-p010.html * igt@kms_scaling_modes@scaling-mode-full-aspect: - shard-glk: NOTRUN -> [SKIP][11] ([fdo#109271]) +23 similar issues [11]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_117004v11/shard-glk8/igt@kms_scaling_modes@scaling-mode-full-aspect.html #### Possible fixes #### * igt@gem_barrier_race@remote-request@rcs0: - shard-glk: [ABORT][12] ([i915#7461] / [i915#8211]) -> [PASS][13] [12]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13129/shard-glk6/igt@gem_barrier_race@remote-request@rcs0.html [13]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_117004v11/shard-glk8/igt@gem_barrier_race@remote-request@rcs0.html * igt@gem_eio@hibernate: - {shard-tglu}: [ABORT][14] ([i915#7953] / [i915#7975] / [i915#8213] / [i915#8398]) -> [PASS][15] [14]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13129/shard-tglu-10/igt@gem_eio@hibernate.html [15]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_117004v11/shard-tglu-2/igt@gem_eio@hibernate.html * igt@gem_exec_fair@basic-none-solo@rcs0: - shard-apl: [FAIL][16] ([i915#2842]) -> [PASS][17] [16]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13129/shard-apl1/igt@gem_exec_fair@basic-none-solo@rcs0.html [17]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_117004v11/shard-apl7/igt@gem_exec_fair@basic-none-solo@rcs0.html * igt@gem_exec_fair@basic-pace@rcs0: - {shard-rkl}: [FAIL][18] ([i915#2842]) -> [PASS][19] [18]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13129/shard-rkl-2/igt@gem_exec_fair@basic-pace@rcs0.html [19]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_117004v11/shard-rkl-7/igt@gem_exec_fair@basic-pace@rcs0.html * igt@i915_pm_rpm@dpms-mode-unset-non-lpsp: - {shard-rkl}: [SKIP][20] ([i915#1397]) -> [PASS][21] +1 similar issue [20]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13129/shard-rkl-7/igt@i915_pm_rpm@dpms-mode-unset-non-lpsp.html [21]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_117004v11/shard-rkl-2/igt@i915_pm_rpm@dpms-mode-unset-non-lpsp.html * igt@kms_flip@flip-vs-expired-vblank@b-hdmi-a2: - shard-glk: [FAIL][22] ([i915#79]) -> [PASS][23] [22]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13129/shard-glk2/igt@kms_flip@flip-vs-expired-vblank@b-hdmi-a2.html [23]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_117004v11/shard-glk2/igt@kms_flip@flip-vs-expired-vblank@b-hdmi-a2.html {name}: This element is suppressed. This means it is ignored when computing the status of the difference (SUCCESS, WARNING, or FAILURE). [fdo#109271]: https://bugs.freedesktop.org/show_bug.cgi?id=109271 [fdo#109274]: https://bugs.freedesktop.org/show_bug.cgi?id=109274 [fdo#109280]: https://bugs.freedesktop.org/show_bug.cgi?id=109280 [fdo#109315]: https://bugs.freedesktop.org/show_bug.cgi?id=109315 [fdo#110189]: https://bugs.freedesktop.org/show_bug.cgi?id=110189 [fdo#111615]: https://bugs.freedesktop.org/show_bug.cgi?id=111615 [fdo#111827]: https://bugs.freedesktop.org/show_bug.cgi?id=111827 [i915#1072]: https://gitlab.freedesktop.org/drm/intel/issues/1072 [i915#1397]: https://gitlab.freedesktop.org/drm/intel/issues/1397 [i915#2190]: https://gitlab.freedesktop.org/drm/intel/issues/2190 [i915#2346]: https://gitlab.freedesktop.org/drm/intel/issues/2346 [i915#2437]: https://gitlab.freedesktop.org/drm/intel/issues/2437 [i915#2527]: https://gitlab.freedesktop.org/drm/intel/issues/2527 [i915#2575]: https://gitlab.freedesktop.org/drm/intel/issues/2575 [i915#2658]: https://gitlab.freedesktop.org/drm/intel/issues/2658 [i915#2681]: https://gitlab.freedesktop.org/drm/intel/issues/2681 [i915#2842]: https://gitlab.freedesktop.org/drm/intel/issues/2842 [i915#2846]: https://gitlab.freedesktop.org/drm/intel/issues/2846 [i915#2856]: https://gitlab.freedesktop.org/drm/intel/issues/2856 [i915#3359]: https://gitlab.freedesktop.org/drm/intel/issues/3359 [i915#3591]: https://gitlab.freedesktop.org/drm/intel/issues/3591 [i915#3637]: https://gitlab.freedesktop.org/drm/intel/issues/3637 [i915#3886]: https://gitlab.freedesktop.org/drm/intel/issues/3886 [i915#3955]: https://gitlab.freedesktop.org/drm/intel/issues/3955 [i915#4078]: https://gitlab.freedesktop.org/drm/intel/issues/4078 [i915#4349]: https://gitlab.freedesktop.org/drm/intel/issues/4349 [i915#5176]: https://gitlab.freedesktop.org/drm/intel/issues/5176 [i915#5354]: https://gitlab.freedesktop.org/drm/intel/issues/5354 [i915#5493]: https://gitlab.freedesktop.org/drm/intel/issues/5493 [i915#6095]: https://gitlab.freedesktop.org/drm/intel/issues/6095 [i915#658]: https://gitlab.freedesktop.org/drm/intel/issues/658 [i915#7461]: https://gitlab.freedesktop.org/drm/intel/issues/7461 [i915#7742]: https://gitlab.freedesktop.org/drm/intel/issues/7742 [i915#79]: https://gitlab.freedesktop.org/drm/intel/issues/79 [i915#7953]: https://gitlab.freedesktop.org/drm/intel/issues/7953 [i915#7975]: https://gitlab.freedesktop.org/drm/intel/issues/7975 [i915#8011]: https://gitlab.freedesktop.org/drm/intel/issues/8011 [i915#8211]: https://gitlab.freedesktop.org/drm/intel/issues/8211 [i915#8213]: https://gitlab.freedesktop.org/drm/intel/issues/8213 [i915#8234]: https://gitlab.freedesktop.org/drm/intel/issues/8234 [i915#8398]: https://gitlab.freedesktop.org/drm/intel/issues/8398 [i915#8420]: https://gitlab.freedesktop.org/drm/intel/issues/8420 Build changes ------------- * Linux: CI_DRM_13129 -> Patchwork_117004v11 CI-20190529: 20190529 CI_DRM_13129: 451e49cfbaa90720149e63f4fa9c7824013c783d @ git://anongit.freedesktop.org/gfx-ci/linux IGT_7285: d1cbf2bad9c2664ab8bd3bd0946510a52800912f @ https://gitlab.freedesktop.org/drm/igt-gpu-tools.git Patchwork_117004v11: 451e49cfbaa90720149e63f4fa9c7824013c783d @ git://anongit.freedesktop.org/gfx-ci/linux piglit_4509: fdc5a4ca11124ab8413c7988896eec4c97336694 @ git://anongit.freedesktop.org/piglit == Logs == For more details see: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_117004v11/index.html [-- Attachment #2: Type: text/html, Size: 8626 bytes --] ^ permalink raw reply [flat|nested] 41+ messages in thread
* [Intel-gfx] ✗ Fi.CI.CHECKPATCH: warning for drm/i915/tc: Add a workaround for an IOM/TCSS firmware hang issue (rev13) 2023-05-10 10:31 [Intel-gfx] [PATCH v4 00/14] drm/i915/tc: Add a workaround for an IOM/TCSS firmware hang issue Imre Deak ` (17 preceding siblings ...) 2023-05-10 13:52 ` [Intel-gfx] ✗ Fi.CI.IGT: failure " Patchwork @ 2023-05-12 21:17 ` Patchwork 2023-05-12 21:17 ` [Intel-gfx] ✗ Fi.CI.SPARSE: " Patchwork ` (2 subsequent siblings) 21 siblings, 0 replies; 41+ messages in thread From: Patchwork @ 2023-05-12 21:17 UTC (permalink / raw) To: Imre Deak; +Cc: intel-gfx == Series Details == Series: drm/i915/tc: Add a workaround for an IOM/TCSS firmware hang issue (rev13) URL : https://patchwork.freedesktop.org/series/117004/ State : warning == Summary == Error: dim checkpatch failed 60bf22a36d66 drm/i915: Fix PIPEDMC disabling for a bigjoiner configuration 27a983bdef3f drm/i915: Add helpers to reference/unreference a DPLL for a CRTC 67301cdfc6bc drm/i915: Make the CRTC state consistent during sanitize-disabling 623cdeeb6183 drm/i915: Update connector atomic state before crtc sanitize-disabling d81c1ac81d72 drm/i915: Separate intel_crtc_disable_noatomic_begin/complete() 99046a224e99 drm/i915: Factor out set_encoder_for_connector() 7e41b9a1010b drm/i915: Add support for disabling any CRTCs during HW readout/sanitization 86bba6efdb76 drm/i915/dp: Add link training debug and error printing helpers -:34: ERROR:COMPLEX_MACRO: Macros with complex values should be enclosed in parentheses #34: FILE: drivers/gpu/drm/i915/display/intel_dp_link_training.c:30: +#define LT_MSG_ARGS(_intel_dp, _dp_phy) (_intel_dp)->attached_connector->base.base.id, \ + (_intel_dp)->attached_connector->base.name, \ + dp_to_dig_port(_intel_dp)->base.base.base.id, \ + dp_to_dig_port(_intel_dp)->base.base.name, \ + drm_dp_phy_name(_dp_phy) -:34: CHECK:MACRO_ARG_REUSE: Macro argument reuse '_intel_dp' - possible side-effects? #34: FILE: drivers/gpu/drm/i915/display/intel_dp_link_training.c:30: +#define LT_MSG_ARGS(_intel_dp, _dp_phy) (_intel_dp)->attached_connector->base.base.id, \ + (_intel_dp)->attached_connector->base.name, \ + dp_to_dig_port(_intel_dp)->base.base.base.id, \ + dp_to_dig_port(_intel_dp)->base.base.name, \ + drm_dp_phy_name(_dp_phy) -:40: CHECK:MACRO_ARG_REUSE: Macro argument reuse '_intel_dp' - possible side-effects? #40: FILE: drivers/gpu/drm/i915/display/intel_dp_link_training.c:36: +#define lt_dbg(_intel_dp, _dp_phy, _format, ...) \ + drm_dbg_kms(&dp_to_i915(_intel_dp)->drm, \ + LT_MSG_PREFIX _format, \ + LT_MSG_ARGS(_intel_dp, _dp_phy), ## __VA_ARGS__) -:45: CHECK:MACRO_ARG_REUSE: Macro argument reuse '_intel_dp' - possible side-effects? #45: FILE: drivers/gpu/drm/i915/display/intel_dp_link_training.c:41: +#define lt_err(_intel_dp, _dp_phy, _format, ...) \ + drm_err(&dp_to_i915(_intel_dp)->drm, \ + LT_MSG_PREFIX _format, \ + LT_MSG_ARGS(_intel_dp, _dp_phy), ## __VA_ARGS__) total: 1 errors, 0 warnings, 3 checks, 758 lines checked faf11aab775b drm/i915/dp: Convert link training error to debug message on disconnected sink -:39: CHECK:MACRO_ARG_REUSE: Macro argument reuse '_intel_dp' - possible side-effects? #39: FILE: drivers/gpu/drm/i915/display/intel_dp_link_training.c:41: +#define lt_err(_intel_dp, _dp_phy, _format, ...) do { \ + if (intel_digital_port_connected(&dp_to_dig_port(_intel_dp)->base)) \ + drm_err(&dp_to_i915(_intel_dp)->drm, \ + LT_MSG_PREFIX _format, \ + LT_MSG_ARGS(_intel_dp, _dp_phy), ## __VA_ARGS__); \ + else \ + lt_dbg(_intel_dp, _dp_phy, "Sink disconnected: " _format, ## __VA_ARGS__); \ +} while (0) -:39: CHECK:MACRO_ARG_REUSE: Macro argument reuse '_dp_phy' - possible side-effects? #39: FILE: drivers/gpu/drm/i915/display/intel_dp_link_training.c:41: +#define lt_err(_intel_dp, _dp_phy, _format, ...) do { \ + if (intel_digital_port_connected(&dp_to_dig_port(_intel_dp)->base)) \ + drm_err(&dp_to_i915(_intel_dp)->drm, \ + LT_MSG_PREFIX _format, \ + LT_MSG_ARGS(_intel_dp, _dp_phy), ## __VA_ARGS__); \ + else \ + lt_dbg(_intel_dp, _dp_phy, "Sink disconnected: " _format, ## __VA_ARGS__); \ +} while (0) -:39: CHECK:MACRO_ARG_REUSE: Macro argument reuse '_format' - possible side-effects? #39: FILE: drivers/gpu/drm/i915/display/intel_dp_link_training.c:41: +#define lt_err(_intel_dp, _dp_phy, _format, ...) do { \ + if (intel_digital_port_connected(&dp_to_dig_port(_intel_dp)->base)) \ + drm_err(&dp_to_i915(_intel_dp)->drm, \ + LT_MSG_PREFIX _format, \ + LT_MSG_ARGS(_intel_dp, _dp_phy), ## __VA_ARGS__); \ + else \ + lt_dbg(_intel_dp, _dp_phy, "Sink disconnected: " _format, ## __VA_ARGS__); \ +} while (0) total: 0 errors, 0 warnings, 3 checks, 18 lines checked 98e16a313580 drm/i915/dp: Prevent link training fallback on disconnected port 3af810d57bfe drm/i915/dp: Factor out intel_dp_get_active_pipes() 85ba493a190a drm/i915: Factor out a helper for handling atomic modeset locks/state Traceback (most recent call last): File "scripts/spdxcheck.py", line 6, in <module> from ply import lex, yacc ModuleNotFoundError: No module named 'ply' Traceback (most recent call last): File "scripts/spdxcheck.py", line 6, in <module> from ply import lex, yacc ModuleNotFoundError: No module named 'ply' -:13: WARNING:COMMIT_LOG_LONG_LINE: Possible unwrapped commit description (prefer a maximum 75 chars per line) #13: https://lore.kernel.org/all/20210715184954.7794-2-ville.syrjala@linux.intel.com/ -:86: WARNING:FILE_PATH_CHANGES: added, moved or deleted file(s), does MAINTAINERS need updating? #86: new file mode 100644 -:174: CHECK:MACRO_ARG_REUSE: Macro argument reuse 'ctx' - possible side-effects? #174: FILE: drivers/gpu/drm/i915/display/intel_modeset_lock.h:28: +#define intel_modeset_lock_ctx_retry(ctx, state, flags, ret) \ + for (_intel_modeset_lock_begin((ctx), (state), (flags), &(ret)); \ + _intel_modeset_lock_loop(&(ret)); \ + _intel_modeset_lock_end((ctx), (state), &(ret))) -:174: CHECK:MACRO_ARG_REUSE: Macro argument reuse 'state' - possible side-effects? #174: FILE: drivers/gpu/drm/i915/display/intel_modeset_lock.h:28: +#define intel_modeset_lock_ctx_retry(ctx, state, flags, ret) \ + for (_intel_modeset_lock_begin((ctx), (state), (flags), &(ret)); \ + _intel_modeset_lock_loop(&(ret)); \ + _intel_modeset_lock_end((ctx), (state), &(ret))) -:174: CHECK:MACRO_ARG_REUSE: Macro argument reuse 'ret' - possible side-effects? #174: FILE: drivers/gpu/drm/i915/display/intel_modeset_lock.h:28: +#define intel_modeset_lock_ctx_retry(ctx, state, flags, ret) \ + for (_intel_modeset_lock_begin((ctx), (state), (flags), &(ret)); \ + _intel_modeset_lock_loop(&(ret)); \ + _intel_modeset_lock_end((ctx), (state), &(ret))) total: 0 errors, 2 warnings, 3 checks, 125 lines checked 04de39421d4c drm/i915/tc: Call TypeC port flush_work/cleanup without modeset locks held 19bc19f6003a drm/i915/tc: Reset TypeC PHYs left enabled in DP-alt mode after the sink disconnects ^ permalink raw reply [flat|nested] 41+ messages in thread
* [Intel-gfx] ✗ Fi.CI.SPARSE: warning for drm/i915/tc: Add a workaround for an IOM/TCSS firmware hang issue (rev13) 2023-05-10 10:31 [Intel-gfx] [PATCH v4 00/14] drm/i915/tc: Add a workaround for an IOM/TCSS firmware hang issue Imre Deak ` (18 preceding siblings ...) 2023-05-12 21:17 ` [Intel-gfx] ✗ Fi.CI.CHECKPATCH: warning for drm/i915/tc: Add a workaround for an IOM/TCSS firmware hang issue (rev13) Patchwork @ 2023-05-12 21:17 ` Patchwork 2023-05-12 21:31 ` [Intel-gfx] ✓ Fi.CI.BAT: success " Patchwork 2023-05-13 1:08 ` [Intel-gfx] ✓ Fi.CI.IGT: " Patchwork 21 siblings, 0 replies; 41+ messages in thread From: Patchwork @ 2023-05-12 21:17 UTC (permalink / raw) To: Imre Deak; +Cc: intel-gfx == Series Details == Series: drm/i915/tc: Add a workaround for an IOM/TCSS firmware hang issue (rev13) URL : https://patchwork.freedesktop.org/series/117004/ State : warning == Summary == Error: dim sparse failed Sparse version: v0.6.2 Fast mode used, each commit won't be checked separately. ^ permalink raw reply [flat|nested] 41+ messages in thread
* [Intel-gfx] ✓ Fi.CI.BAT: success for drm/i915/tc: Add a workaround for an IOM/TCSS firmware hang issue (rev13) 2023-05-10 10:31 [Intel-gfx] [PATCH v4 00/14] drm/i915/tc: Add a workaround for an IOM/TCSS firmware hang issue Imre Deak ` (19 preceding siblings ...) 2023-05-12 21:17 ` [Intel-gfx] ✗ Fi.CI.SPARSE: " Patchwork @ 2023-05-12 21:31 ` Patchwork 2023-05-13 1:08 ` [Intel-gfx] ✓ Fi.CI.IGT: " Patchwork 21 siblings, 0 replies; 41+ messages in thread From: Patchwork @ 2023-05-12 21:31 UTC (permalink / raw) To: Imre Deak; +Cc: intel-gfx [-- Attachment #1: Type: text/plain, Size: 6872 bytes --] == Series Details == Series: drm/i915/tc: Add a workaround for an IOM/TCSS firmware hang issue (rev13) URL : https://patchwork.freedesktop.org/series/117004/ State : success == Summary == CI Bug Log - changes from CI_DRM_13143 -> Patchwork_117004v13 ==================================================== Summary ------- **SUCCESS** No regressions found. External URL: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_117004v13/index.html Participating hosts (38 -> 37) ------------------------------ Missing (1): fi-snb-2520m Known issues ------------ Here are the changes found in Patchwork_117004v13 that come from known issues: ### IGT changes ### #### Issues hit #### * igt@i915_selftest@live@gt_heartbeat: - fi-kbl-x1275: [PASS][1] -> [DMESG-FAIL][2] ([i915#5334] / [i915#7872]) [1]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13143/fi-kbl-x1275/igt@i915_selftest@live@gt_heartbeat.html [2]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_117004v13/fi-kbl-x1275/igt@i915_selftest@live@gt_heartbeat.html * igt@i915_selftest@live@gt_lrc: - bat-dg2-11: [PASS][3] -> [INCOMPLETE][4] ([i915#7609] / [i915#7913] / [i915#7953]) [3]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13143/bat-dg2-11/igt@i915_selftest@live@gt_lrc.html [4]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_117004v13/bat-dg2-11/igt@i915_selftest@live@gt_lrc.html * igt@i915_selftest@live@slpc: - bat-rpls-1: NOTRUN -> [DMESG-WARN][5] ([i915#6367] / [i915#7953]) [5]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_117004v13/bat-rpls-1/igt@i915_selftest@live@slpc.html * igt@i915_suspend@basic-s2idle-without-i915: - bat-rpls-2: NOTRUN -> [ABORT][6] ([i915#6687]) [6]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_117004v13/bat-rpls-2/igt@i915_suspend@basic-s2idle-without-i915.html * igt@i915_suspend@basic-s3-without-i915: - bat-rpls-1: NOTRUN -> [ABORT][7] ([i915#6687] / [i915#7953] / [i915#7978]) [7]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_117004v13/bat-rpls-1/igt@i915_suspend@basic-s3-without-i915.html * igt@kms_pipe_crc_basic@nonblocking-crc-frame-sequence: - bat-dg2-11: NOTRUN -> [SKIP][8] ([i915#1845] / [i915#5354]) +2 similar issues [8]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_117004v13/bat-dg2-11/igt@kms_pipe_crc_basic@nonblocking-crc-frame-sequence.html #### Possible fixes #### * igt@i915_selftest@live@gt_heartbeat: - fi-apl-guc: [DMESG-FAIL][9] ([i915#5334]) -> [PASS][10] [9]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13143/fi-apl-guc/igt@i915_selftest@live@gt_heartbeat.html [10]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_117004v13/fi-apl-guc/igt@i915_selftest@live@gt_heartbeat.html * igt@i915_selftest@live@requests: - {bat-mtlp-8}: [ABORT][11] ([i915#4983] / [i915#7920] / [i915#7953]) -> [PASS][12] [11]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13143/bat-mtlp-8/igt@i915_selftest@live@requests.html [12]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_117004v13/bat-mtlp-8/igt@i915_selftest@live@requests.html * igt@i915_selftest@live@reset: - bat-rpls-2: [ABORT][13] ([i915#4983] / [i915#7461] / [i915#7913] / [i915#8347]) -> [PASS][14] [13]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13143/bat-rpls-2/igt@i915_selftest@live@reset.html [14]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_117004v13/bat-rpls-2/igt@i915_selftest@live@reset.html - bat-rpls-1: [ABORT][15] ([i915#4983] / [i915#7461] / [i915#7953] / [i915#8347] / [i915#8384]) -> [PASS][16] [15]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13143/bat-rpls-1/igt@i915_selftest@live@reset.html [16]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_117004v13/bat-rpls-1/igt@i915_selftest@live@reset.html {name}: This element is suppressed. This means it is ignored when computing the status of the difference (SUCCESS, WARNING, or FAILURE). [i915#1845]: https://gitlab.freedesktop.org/drm/intel/issues/1845 [i915#4983]: https://gitlab.freedesktop.org/drm/intel/issues/4983 [i915#5334]: https://gitlab.freedesktop.org/drm/intel/issues/5334 [i915#5354]: https://gitlab.freedesktop.org/drm/intel/issues/5354 [i915#6367]: https://gitlab.freedesktop.org/drm/intel/issues/6367 [i915#6645]: https://gitlab.freedesktop.org/drm/intel/issues/6645 [i915#6687]: https://gitlab.freedesktop.org/drm/intel/issues/6687 [i915#7461]: https://gitlab.freedesktop.org/drm/intel/issues/7461 [i915#7609]: https://gitlab.freedesktop.org/drm/intel/issues/7609 [i915#7828]: https://gitlab.freedesktop.org/drm/intel/issues/7828 [i915#7872]: https://gitlab.freedesktop.org/drm/intel/issues/7872 [i915#7913]: https://gitlab.freedesktop.org/drm/intel/issues/7913 [i915#7920]: https://gitlab.freedesktop.org/drm/intel/issues/7920 [i915#7953]: https://gitlab.freedesktop.org/drm/intel/issues/7953 [i915#7978]: https://gitlab.freedesktop.org/drm/intel/issues/7978 [i915#8347]: https://gitlab.freedesktop.org/drm/intel/issues/8347 [i915#8384]: https://gitlab.freedesktop.org/drm/intel/issues/8384 Build changes ------------- * Linux: CI_DRM_13143 -> Patchwork_117004v13 CI-20190529: 20190529 CI_DRM_13143: 222ff19f23b0bd6aca0b52001d69699f78f5a206 @ git://anongit.freedesktop.org/gfx-ci/linux IGT_7286: a482779488f11c432d7ddcb1980691ab1603f356 @ https://gitlab.freedesktop.org/drm/igt-gpu-tools.git Patchwork_117004v13: 222ff19f23b0bd6aca0b52001d69699f78f5a206 @ git://anongit.freedesktop.org/gfx-ci/linux ### Linux commits d76ad71a29cf drm/i915/tc: Reset TypeC PHYs left enabled in DP-alt mode after the sink disconnects 6b16b84f94c6 drm/i915/tc: Call TypeC port flush_work/cleanup without modeset locks held 1e584cce7839 drm/i915: Factor out a helper for handling atomic modeset locks/state ef222c113eb6 drm/i915/dp: Factor out intel_dp_get_active_pipes() c9df09f559a5 drm/i915/dp: Prevent link training fallback on disconnected port 901923ec74bf drm/i915/dp: Convert link training error to debug message on disconnected sink 93600ce6990a drm/i915/dp: Add link training debug and error printing helpers 80bdd9fb796e drm/i915: Add support for disabling any CRTCs during HW readout/sanitization 652d0e50cba8 drm/i915: Factor out set_encoder_for_connector() cbca5353c286 drm/i915: Separate intel_crtc_disable_noatomic_begin/complete() 412b79035ceb drm/i915: Update connector atomic state before crtc sanitize-disabling f3b72c55b0f5 drm/i915: Make the CRTC state consistent during sanitize-disabling 9680cc197d8b drm/i915: Add helpers to reference/unreference a DPLL for a CRTC 0ba18623ca94 drm/i915: Fix PIPEDMC disabling for a bigjoiner configuration == Logs == For more details see: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_117004v13/index.html [-- Attachment #2: Type: text/html, Size: 8372 bytes --] ^ permalink raw reply [flat|nested] 41+ messages in thread
* [Intel-gfx] ✓ Fi.CI.IGT: success for drm/i915/tc: Add a workaround for an IOM/TCSS firmware hang issue (rev13) 2023-05-10 10:31 [Intel-gfx] [PATCH v4 00/14] drm/i915/tc: Add a workaround for an IOM/TCSS firmware hang issue Imre Deak ` (20 preceding siblings ...) 2023-05-12 21:31 ` [Intel-gfx] ✓ Fi.CI.BAT: success " Patchwork @ 2023-05-13 1:08 ` Patchwork 2023-05-16 14:06 ` Imre Deak 21 siblings, 1 reply; 41+ messages in thread From: Patchwork @ 2023-05-13 1:08 UTC (permalink / raw) To: Imre Deak; +Cc: intel-gfx [-- Attachment #1: Type: text/plain, Size: 12952 bytes --] == Series Details == Series: drm/i915/tc: Add a workaround for an IOM/TCSS firmware hang issue (rev13) URL : https://patchwork.freedesktop.org/series/117004/ State : success == Summary == CI Bug Log - changes from CI_DRM_13143_full -> Patchwork_117004v13_full ==================================================== Summary ------- **SUCCESS** No regressions found. Participating hosts (7 -> 7) ------------------------------ No changes in participating hosts Known issues ------------ Here are the changes found in Patchwork_117004v13_full that come from known issues: ### IGT changes ### #### Issues hit #### * igt@gem_exec_fair@basic-pace-share@rcs0: - shard-glk: [PASS][1] -> [FAIL][2] ([i915#2842]) [1]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13143/shard-glk2/igt@gem_exec_fair@basic-pace-share@rcs0.html [2]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_117004v13/shard-glk6/igt@gem_exec_fair@basic-pace-share@rcs0.html * igt@gem_lmem_swapping@massive-random: - shard-glk: NOTRUN -> [SKIP][3] ([fdo#109271] / [i915#4613]) [3]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_117004v13/shard-glk8/igt@gem_lmem_swapping@massive-random.html * igt@kms_chamelium_color@ctm-max: - shard-glk: NOTRUN -> [SKIP][4] ([fdo#109271]) +26 similar issues [4]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_117004v13/shard-glk8/igt@kms_chamelium_color@ctm-max.html * igt@kms_content_protection@atomic: - shard-glk: NOTRUN -> [SKIP][5] ([fdo#109271] / [i915#4579]) [5]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_117004v13/shard-glk8/igt@kms_content_protection@atomic.html * igt@kms_cursor_legacy@flip-vs-cursor-atomic-transitions: - shard-glk: [PASS][6] -> [FAIL][7] ([i915#2346]) [6]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13143/shard-glk5/igt@kms_cursor_legacy@flip-vs-cursor-atomic-transitions.html [7]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_117004v13/shard-glk3/igt@kms_cursor_legacy@flip-vs-cursor-atomic-transitions.html * igt@kms_flip@2x-flip-vs-expired-vblank-interruptible@ab-hdmi-a1-hdmi-a2: - shard-glk: [PASS][8] -> [FAIL][9] ([i915#79]) [8]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13143/shard-glk2/igt@kms_flip@2x-flip-vs-expired-vblank-interruptible@ab-hdmi-a1-hdmi-a2.html [9]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_117004v13/shard-glk1/igt@kms_flip@2x-flip-vs-expired-vblank-interruptible@ab-hdmi-a1-hdmi-a2.html * igt@kms_flip@2x-flip-vs-expired-vblank-interruptible@bc-hdmi-a1-hdmi-a2: - shard-glk: [PASS][10] -> [FAIL][11] ([i915#2122]) +1 similar issue [10]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13143/shard-glk2/igt@kms_flip@2x-flip-vs-expired-vblank-interruptible@bc-hdmi-a1-hdmi-a2.html [11]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_117004v13/shard-glk1/igt@kms_flip@2x-flip-vs-expired-vblank-interruptible@bc-hdmi-a1-hdmi-a2.html #### Possible fixes #### * igt@drm_fdinfo@most-busy-idle-check-all@rcs0: - {shard-rkl}: [FAIL][12] ([i915#7742]) -> [PASS][13] [12]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13143/shard-rkl-2/igt@drm_fdinfo@most-busy-idle-check-all@rcs0.html [13]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_117004v13/shard-rkl-7/igt@drm_fdinfo@most-busy-idle-check-all@rcs0.html * igt@gem_barrier_race@remote-request@rcs0: - shard-glk: [ABORT][14] ([i915#7461] / [i915#8211]) -> [PASS][15] [14]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13143/shard-glk2/igt@gem_barrier_race@remote-request@rcs0.html [15]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_117004v13/shard-glk1/igt@gem_barrier_race@remote-request@rcs0.html * igt@gem_ctx_freq@sysfs: - {shard-dg1}: [FAIL][16] ([i915#6786]) -> [PASS][17] [16]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13143/shard-dg1-15/igt@gem_ctx_freq@sysfs.html [17]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_117004v13/shard-dg1-17/igt@gem_ctx_freq@sysfs.html * igt@gem_eio@in-flight-contexts-10ms: - {shard-tglu}: [TIMEOUT][18] ([i915#3063] / [i915#7941]) -> [PASS][19] [18]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13143/shard-tglu-3/igt@gem_eio@in-flight-contexts-10ms.html [19]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_117004v13/shard-tglu-2/igt@gem_eio@in-flight-contexts-10ms.html * igt@gem_exec_fair@basic-deadline: - shard-glk: [FAIL][20] ([i915#2846]) -> [PASS][21] [20]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13143/shard-glk2/igt@gem_exec_fair@basic-deadline.html [21]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_117004v13/shard-glk3/igt@gem_exec_fair@basic-deadline.html * igt@gem_exec_fair@basic-pace-share@rcs0: - shard-apl: [FAIL][22] ([i915#2842]) -> [PASS][23] [22]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13143/shard-apl2/igt@gem_exec_fair@basic-pace-share@rcs0.html [23]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_117004v13/shard-apl3/igt@gem_exec_fair@basic-pace-share@rcs0.html - {shard-tglu}: [FAIL][24] ([i915#2842]) -> [PASS][25] [24]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13143/shard-tglu-10/igt@gem_exec_fair@basic-pace-share@rcs0.html [25]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_117004v13/shard-tglu-7/igt@gem_exec_fair@basic-pace-share@rcs0.html * igt@gem_exec_fair@basic-pace@rcs0: - {shard-rkl}: [FAIL][26] ([i915#2842]) -> [PASS][27] +1 similar issue [26]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13143/shard-rkl-1/igt@gem_exec_fair@basic-pace@rcs0.html [27]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_117004v13/shard-rkl-4/igt@gem_exec_fair@basic-pace@rcs0.html * igt@gem_exec_suspend@basic-s4-devices@lmem0: - {shard-dg1}: [ABORT][28] ([i915#7975] / [i915#8213]) -> [PASS][29] [28]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13143/shard-dg1-14/igt@gem_exec_suspend@basic-s4-devices@lmem0.html [29]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_117004v13/shard-dg1-16/igt@gem_exec_suspend@basic-s4-devices@lmem0.html * igt@gem_lmem_swapping@smem-oom@lmem0: - {shard-dg1}: [TIMEOUT][30] ([i915#5493]) -> [PASS][31] [30]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13143/shard-dg1-17/igt@gem_lmem_swapping@smem-oom@lmem0.html [31]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_117004v13/shard-dg1-16/igt@gem_lmem_swapping@smem-oom@lmem0.html * igt@gen9_exec_parse@allowed-single: - shard-glk: [ABORT][32] ([i915#5566]) -> [PASS][33] [32]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13143/shard-glk1/igt@gen9_exec_parse@allowed-single.html [33]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_117004v13/shard-glk8/igt@gen9_exec_parse@allowed-single.html * igt@i915_pm_rpm@modeset-lpsp-stress: - {shard-rkl}: [SKIP][34] ([i915#1397]) -> [PASS][35] +1 similar issue [34]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13143/shard-rkl-2/igt@i915_pm_rpm@modeset-lpsp-stress.html [35]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_117004v13/shard-rkl-7/igt@i915_pm_rpm@modeset-lpsp-stress.html * igt@i915_pm_rps@engine-order: - shard-apl: [FAIL][36] ([i915#6537]) -> [PASS][37] [36]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13143/shard-apl6/igt@i915_pm_rps@engine-order.html [37]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_117004v13/shard-apl1/igt@i915_pm_rps@engine-order.html * igt@kms_cursor_legacy@single-bo@pipe-b: - {shard-rkl}: [INCOMPLETE][38] ([i915#8011]) -> [PASS][39] [38]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13143/shard-rkl-7/igt@kms_cursor_legacy@single-bo@pipe-b.html [39]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_117004v13/shard-rkl-6/igt@kms_cursor_legacy@single-bo@pipe-b.html #### Warnings #### * igt@kms_flip@2x-flip-vs-expired-vblank-interruptible@ac-hdmi-a1-hdmi-a2: - shard-glk: [FAIL][40] ([i915#79]) -> [FAIL][41] ([i915#2122]) [40]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13143/shard-glk2/igt@kms_flip@2x-flip-vs-expired-vblank-interruptible@ac-hdmi-a1-hdmi-a2.html [41]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_117004v13/shard-glk1/igt@kms_flip@2x-flip-vs-expired-vblank-interruptible@ac-hdmi-a1-hdmi-a2.html {name}: This element is suppressed. This means it is ignored when computing the status of the difference (SUCCESS, WARNING, or FAILURE). [fdo#109271]: https://bugs.freedesktop.org/show_bug.cgi?id=109271 [fdo#109285]: https://bugs.freedesktop.org/show_bug.cgi?id=109285 [fdo#109289]: https://bugs.freedesktop.org/show_bug.cgi?id=109289 [fdo#110189]: https://bugs.freedesktop.org/show_bug.cgi?id=110189 [fdo#111825]: https://bugs.freedesktop.org/show_bug.cgi?id=111825 [i915#1397]: https://gitlab.freedesktop.org/drm/intel/issues/1397 [i915#2122]: https://gitlab.freedesktop.org/drm/intel/issues/2122 [i915#2346]: https://gitlab.freedesktop.org/drm/intel/issues/2346 [i915#2527]: https://gitlab.freedesktop.org/drm/intel/issues/2527 [i915#2587]: https://gitlab.freedesktop.org/drm/intel/issues/2587 [i915#2672]: https://gitlab.freedesktop.org/drm/intel/issues/2672 [i915#2842]: https://gitlab.freedesktop.org/drm/intel/issues/2842 [i915#2846]: https://gitlab.freedesktop.org/drm/intel/issues/2846 [i915#3063]: https://gitlab.freedesktop.org/drm/intel/issues/3063 [i915#315]: https://gitlab.freedesktop.org/drm/intel/issues/315 [i915#3281]: https://gitlab.freedesktop.org/drm/intel/issues/3281 [i915#3458]: https://gitlab.freedesktop.org/drm/intel/issues/3458 [i915#3539]: https://gitlab.freedesktop.org/drm/intel/issues/3539 [i915#3555]: https://gitlab.freedesktop.org/drm/intel/issues/3555 [i915#3689]: https://gitlab.freedesktop.org/drm/intel/issues/3689 [i915#3886]: https://gitlab.freedesktop.org/drm/intel/issues/3886 [i915#3952]: https://gitlab.freedesktop.org/drm/intel/issues/3952 [i915#3955]: https://gitlab.freedesktop.org/drm/intel/issues/3955 [i915#4070]: https://gitlab.freedesktop.org/drm/intel/issues/4070 [i915#4077]: https://gitlab.freedesktop.org/drm/intel/issues/4077 [i915#4083]: https://gitlab.freedesktop.org/drm/intel/issues/4083 [i915#4098]: https://gitlab.freedesktop.org/drm/intel/issues/4098 [i915#4270]: https://gitlab.freedesktop.org/drm/intel/issues/4270 [i915#4538]: https://gitlab.freedesktop.org/drm/intel/issues/4538 [i915#4579]: https://gitlab.freedesktop.org/drm/intel/issues/4579 [i915#4613]: https://gitlab.freedesktop.org/drm/intel/issues/4613 [i915#4771]: https://gitlab.freedesktop.org/drm/intel/issues/4771 [i915#4812]: https://gitlab.freedesktop.org/drm/intel/issues/4812 [i915#4816]: https://gitlab.freedesktop.org/drm/intel/issues/4816 [i915#4852]: https://gitlab.freedesktop.org/drm/intel/issues/4852 [i915#4860]: https://gitlab.freedesktop.org/drm/intel/issues/4860 [i915#5235]: https://gitlab.freedesktop.org/drm/intel/issues/5235 [i915#5354]: https://gitlab.freedesktop.org/drm/intel/issues/5354 [i915#5493]: https://gitlab.freedesktop.org/drm/intel/issues/5493 [i915#5566]: https://gitlab.freedesktop.org/drm/intel/issues/5566 [i915#6095]: https://gitlab.freedesktop.org/drm/intel/issues/6095 [i915#6268]: https://gitlab.freedesktop.org/drm/intel/issues/6268 [i915#6537]: https://gitlab.freedesktop.org/drm/intel/issues/6537 [i915#6786]: https://gitlab.freedesktop.org/drm/intel/issues/6786 [i915#7116]: https://gitlab.freedesktop.org/drm/intel/issues/7116 [i915#7461]: https://gitlab.freedesktop.org/drm/intel/issues/7461 [i915#7742]: https://gitlab.freedesktop.org/drm/intel/issues/7742 [i915#79]: https://gitlab.freedesktop.org/drm/intel/issues/79 [i915#7941]: https://gitlab.freedesktop.org/drm/intel/issues/7941 [i915#7975]: https://gitlab.freedesktop.org/drm/intel/issues/7975 [i915#8011]: https://gitlab.freedesktop.org/drm/intel/issues/8011 [i915#8211]: https://gitlab.freedesktop.org/drm/intel/issues/8211 [i915#8213]: https://gitlab.freedesktop.org/drm/intel/issues/8213 [i915#8234]: https://gitlab.freedesktop.org/drm/intel/issues/8234 [i915#8414]: https://gitlab.freedesktop.org/drm/intel/issues/8414 Build changes ------------- * Linux: CI_DRM_13143 -> Patchwork_117004v13 CI-20190529: 20190529 CI_DRM_13143: 222ff19f23b0bd6aca0b52001d69699f78f5a206 @ git://anongit.freedesktop.org/gfx-ci/linux IGT_7286: a482779488f11c432d7ddcb1980691ab1603f356 @ https://gitlab.freedesktop.org/drm/igt-gpu-tools.git Patchwork_117004v13: 222ff19f23b0bd6aca0b52001d69699f78f5a206 @ git://anongit.freedesktop.org/gfx-ci/linux piglit_4509: fdc5a4ca11124ab8413c7988896eec4c97336694 @ git://anongit.freedesktop.org/piglit == Logs == For more details see: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_117004v13/index.html [-- Attachment #2: Type: text/html, Size: 12240 bytes --] ^ permalink raw reply [flat|nested] 41+ messages in thread
* Re: [Intel-gfx] ✓ Fi.CI.IGT: success for drm/i915/tc: Add a workaround for an IOM/TCSS firmware hang issue (rev13) 2023-05-13 1:08 ` [Intel-gfx] ✓ Fi.CI.IGT: " Patchwork @ 2023-05-16 14:06 ` Imre Deak 0 siblings, 0 replies; 41+ messages in thread From: Imre Deak @ 2023-05-16 14:06 UTC (permalink / raw) To: intel-gfx, Ville Syrjälä, Vinod Govindapillai, Jani Nikula On Sat, May 13, 2023 at 01:08:42AM +0000, Patchwork wrote: > == Series Details == > > Series: drm/i915/tc: Add a workaround for an IOM/TCSS firmware hang issue (rev13) > URL : https://patchwork.freedesktop.org/series/117004/ > State : success Patchset is pushed to -din, thanks for the reviews. > > == Summary == > > CI Bug Log - changes from CI_DRM_13143_full -> Patchwork_117004v13_full > ==================================================== > > Summary > ------- > > **SUCCESS** > > No regressions found. > > > > Participating hosts (7 -> 7) > ------------------------------ > > No changes in participating hosts > > Known issues > ------------ > > Here are the changes found in Patchwork_117004v13_full that come from known issues: > > ### IGT changes ### > > #### Issues hit #### > > * igt@gem_exec_fair@basic-pace-share@rcs0: > - shard-glk: [PASS][1] -> [FAIL][2] ([i915#2842]) > [1]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13143/shard-glk2/igt@gem_exec_fair@basic-pace-share@rcs0.html > [2]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_117004v13/shard-glk6/igt@gem_exec_fair@basic-pace-share@rcs0.html > > * igt@gem_lmem_swapping@massive-random: > - shard-glk: NOTRUN -> [SKIP][3] ([fdo#109271] / [i915#4613]) > [3]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_117004v13/shard-glk8/igt@gem_lmem_swapping@massive-random.html > > * igt@kms_chamelium_color@ctm-max: > - shard-glk: NOTRUN -> [SKIP][4] ([fdo#109271]) +26 similar issues > [4]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_117004v13/shard-glk8/igt@kms_chamelium_color@ctm-max.html > > * igt@kms_content_protection@atomic: > - shard-glk: NOTRUN -> [SKIP][5] ([fdo#109271] / [i915#4579]) > [5]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_117004v13/shard-glk8/igt@kms_content_protection@atomic.html > > * igt@kms_cursor_legacy@flip-vs-cursor-atomic-transitions: > - shard-glk: [PASS][6] -> [FAIL][7] ([i915#2346]) > [6]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13143/shard-glk5/igt@kms_cursor_legacy@flip-vs-cursor-atomic-transitions.html > [7]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_117004v13/shard-glk3/igt@kms_cursor_legacy@flip-vs-cursor-atomic-transitions.html > > * igt@kms_flip@2x-flip-vs-expired-vblank-interruptible@ab-hdmi-a1-hdmi-a2: > - shard-glk: [PASS][8] -> [FAIL][9] ([i915#79]) > [8]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13143/shard-glk2/igt@kms_flip@2x-flip-vs-expired-vblank-interruptible@ab-hdmi-a1-hdmi-a2.html > [9]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_117004v13/shard-glk1/igt@kms_flip@2x-flip-vs-expired-vblank-interruptible@ab-hdmi-a1-hdmi-a2.html > > * igt@kms_flip@2x-flip-vs-expired-vblank-interruptible@bc-hdmi-a1-hdmi-a2: > - shard-glk: [PASS][10] -> [FAIL][11] ([i915#2122]) +1 similar issue > [10]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13143/shard-glk2/igt@kms_flip@2x-flip-vs-expired-vblank-interruptible@bc-hdmi-a1-hdmi-a2.html > [11]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_117004v13/shard-glk1/igt@kms_flip@2x-flip-vs-expired-vblank-interruptible@bc-hdmi-a1-hdmi-a2.html > > > #### Possible fixes #### > > * igt@drm_fdinfo@most-busy-idle-check-all@rcs0: > - {shard-rkl}: [FAIL][12] ([i915#7742]) -> [PASS][13] > [12]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13143/shard-rkl-2/igt@drm_fdinfo@most-busy-idle-check-all@rcs0.html > [13]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_117004v13/shard-rkl-7/igt@drm_fdinfo@most-busy-idle-check-all@rcs0.html > > * igt@gem_barrier_race@remote-request@rcs0: > - shard-glk: [ABORT][14] ([i915#7461] / [i915#8211]) -> [PASS][15] > [14]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13143/shard-glk2/igt@gem_barrier_race@remote-request@rcs0.html > [15]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_117004v13/shard-glk1/igt@gem_barrier_race@remote-request@rcs0.html > > * igt@gem_ctx_freq@sysfs: > - {shard-dg1}: [FAIL][16] ([i915#6786]) -> [PASS][17] > [16]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13143/shard-dg1-15/igt@gem_ctx_freq@sysfs.html > [17]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_117004v13/shard-dg1-17/igt@gem_ctx_freq@sysfs.html > > * igt@gem_eio@in-flight-contexts-10ms: > - {shard-tglu}: [TIMEOUT][18] ([i915#3063] / [i915#7941]) -> [PASS][19] > [18]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13143/shard-tglu-3/igt@gem_eio@in-flight-contexts-10ms.html > [19]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_117004v13/shard-tglu-2/igt@gem_eio@in-flight-contexts-10ms.html > > * igt@gem_exec_fair@basic-deadline: > - shard-glk: [FAIL][20] ([i915#2846]) -> [PASS][21] > [20]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13143/shard-glk2/igt@gem_exec_fair@basic-deadline.html > [21]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_117004v13/shard-glk3/igt@gem_exec_fair@basic-deadline.html > > * igt@gem_exec_fair@basic-pace-share@rcs0: > - shard-apl: [FAIL][22] ([i915#2842]) -> [PASS][23] > [22]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13143/shard-apl2/igt@gem_exec_fair@basic-pace-share@rcs0.html > [23]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_117004v13/shard-apl3/igt@gem_exec_fair@basic-pace-share@rcs0.html > - {shard-tglu}: [FAIL][24] ([i915#2842]) -> [PASS][25] > [24]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13143/shard-tglu-10/igt@gem_exec_fair@basic-pace-share@rcs0.html > [25]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_117004v13/shard-tglu-7/igt@gem_exec_fair@basic-pace-share@rcs0.html > > * igt@gem_exec_fair@basic-pace@rcs0: > - {shard-rkl}: [FAIL][26] ([i915#2842]) -> [PASS][27] +1 similar issue > [26]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13143/shard-rkl-1/igt@gem_exec_fair@basic-pace@rcs0.html > [27]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_117004v13/shard-rkl-4/igt@gem_exec_fair@basic-pace@rcs0.html > > * igt@gem_exec_suspend@basic-s4-devices@lmem0: > - {shard-dg1}: [ABORT][28] ([i915#7975] / [i915#8213]) -> [PASS][29] > [28]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13143/shard-dg1-14/igt@gem_exec_suspend@basic-s4-devices@lmem0.html > [29]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_117004v13/shard-dg1-16/igt@gem_exec_suspend@basic-s4-devices@lmem0.html > > * igt@gem_lmem_swapping@smem-oom@lmem0: > - {shard-dg1}: [TIMEOUT][30] ([i915#5493]) -> [PASS][31] > [30]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13143/shard-dg1-17/igt@gem_lmem_swapping@smem-oom@lmem0.html > [31]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_117004v13/shard-dg1-16/igt@gem_lmem_swapping@smem-oom@lmem0.html > > * igt@gen9_exec_parse@allowed-single: > - shard-glk: [ABORT][32] ([i915#5566]) -> [PASS][33] > [32]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13143/shard-glk1/igt@gen9_exec_parse@allowed-single.html > [33]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_117004v13/shard-glk8/igt@gen9_exec_parse@allowed-single.html > > * igt@i915_pm_rpm@modeset-lpsp-stress: > - {shard-rkl}: [SKIP][34] ([i915#1397]) -> [PASS][35] +1 similar issue > [34]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13143/shard-rkl-2/igt@i915_pm_rpm@modeset-lpsp-stress.html > [35]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_117004v13/shard-rkl-7/igt@i915_pm_rpm@modeset-lpsp-stress.html > > * igt@i915_pm_rps@engine-order: > - shard-apl: [FAIL][36] ([i915#6537]) -> [PASS][37] > [36]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13143/shard-apl6/igt@i915_pm_rps@engine-order.html > [37]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_117004v13/shard-apl1/igt@i915_pm_rps@engine-order.html > > * igt@kms_cursor_legacy@single-bo@pipe-b: > - {shard-rkl}: [INCOMPLETE][38] ([i915#8011]) -> [PASS][39] > [38]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13143/shard-rkl-7/igt@kms_cursor_legacy@single-bo@pipe-b.html > [39]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_117004v13/shard-rkl-6/igt@kms_cursor_legacy@single-bo@pipe-b.html > > > #### Warnings #### > > * igt@kms_flip@2x-flip-vs-expired-vblank-interruptible@ac-hdmi-a1-hdmi-a2: > - shard-glk: [FAIL][40] ([i915#79]) -> [FAIL][41] ([i915#2122]) > [40]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13143/shard-glk2/igt@kms_flip@2x-flip-vs-expired-vblank-interruptible@ac-hdmi-a1-hdmi-a2.html > [41]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_117004v13/shard-glk1/igt@kms_flip@2x-flip-vs-expired-vblank-interruptible@ac-hdmi-a1-hdmi-a2.html > > > {name}: This element is suppressed. This means it is ignored when computing > the status of the difference (SUCCESS, WARNING, or FAILURE). > > [fdo#109271]: https://bugs.freedesktop.org/show_bug.cgi?id=109271 > [fdo#109285]: https://bugs.freedesktop.org/show_bug.cgi?id=109285 > [fdo#109289]: https://bugs.freedesktop.org/show_bug.cgi?id=109289 > [fdo#110189]: https://bugs.freedesktop.org/show_bug.cgi?id=110189 > [fdo#111825]: https://bugs.freedesktop.org/show_bug.cgi?id=111825 > [i915#1397]: https://gitlab.freedesktop.org/drm/intel/issues/1397 > [i915#2122]: https://gitlab.freedesktop.org/drm/intel/issues/2122 > [i915#2346]: https://gitlab.freedesktop.org/drm/intel/issues/2346 > [i915#2527]: https://gitlab.freedesktop.org/drm/intel/issues/2527 > [i915#2587]: https://gitlab.freedesktop.org/drm/intel/issues/2587 > [i915#2672]: https://gitlab.freedesktop.org/drm/intel/issues/2672 > [i915#2842]: https://gitlab.freedesktop.org/drm/intel/issues/2842 > [i915#2846]: https://gitlab.freedesktop.org/drm/intel/issues/2846 > [i915#3063]: https://gitlab.freedesktop.org/drm/intel/issues/3063 > [i915#315]: https://gitlab.freedesktop.org/drm/intel/issues/315 > [i915#3281]: https://gitlab.freedesktop.org/drm/intel/issues/3281 > [i915#3458]: https://gitlab.freedesktop.org/drm/intel/issues/3458 > [i915#3539]: https://gitlab.freedesktop.org/drm/intel/issues/3539 > [i915#3555]: https://gitlab.freedesktop.org/drm/intel/issues/3555 > [i915#3689]: https://gitlab.freedesktop.org/drm/intel/issues/3689 > [i915#3886]: https://gitlab.freedesktop.org/drm/intel/issues/3886 > [i915#3952]: https://gitlab.freedesktop.org/drm/intel/issues/3952 > [i915#3955]: https://gitlab.freedesktop.org/drm/intel/issues/3955 > [i915#4070]: https://gitlab.freedesktop.org/drm/intel/issues/4070 > [i915#4077]: https://gitlab.freedesktop.org/drm/intel/issues/4077 > [i915#4083]: https://gitlab.freedesktop.org/drm/intel/issues/4083 > [i915#4098]: https://gitlab.freedesktop.org/drm/intel/issues/4098 > [i915#4270]: https://gitlab.freedesktop.org/drm/intel/issues/4270 > [i915#4538]: https://gitlab.freedesktop.org/drm/intel/issues/4538 > [i915#4579]: https://gitlab.freedesktop.org/drm/intel/issues/4579 > [i915#4613]: https://gitlab.freedesktop.org/drm/intel/issues/4613 > [i915#4771]: https://gitlab.freedesktop.org/drm/intel/issues/4771 > [i915#4812]: https://gitlab.freedesktop.org/drm/intel/issues/4812 > [i915#4816]: https://gitlab.freedesktop.org/drm/intel/issues/4816 > [i915#4852]: https://gitlab.freedesktop.org/drm/intel/issues/4852 > [i915#4860]: https://gitlab.freedesktop.org/drm/intel/issues/4860 > [i915#5235]: https://gitlab.freedesktop.org/drm/intel/issues/5235 > [i915#5354]: https://gitlab.freedesktop.org/drm/intel/issues/5354 > [i915#5493]: https://gitlab.freedesktop.org/drm/intel/issues/5493 > [i915#5566]: https://gitlab.freedesktop.org/drm/intel/issues/5566 > [i915#6095]: https://gitlab.freedesktop.org/drm/intel/issues/6095 > [i915#6268]: https://gitlab.freedesktop.org/drm/intel/issues/6268 > [i915#6537]: https://gitlab.freedesktop.org/drm/intel/issues/6537 > [i915#6786]: https://gitlab.freedesktop.org/drm/intel/issues/6786 > [i915#7116]: https://gitlab.freedesktop.org/drm/intel/issues/7116 > [i915#7461]: https://gitlab.freedesktop.org/drm/intel/issues/7461 > [i915#7742]: https://gitlab.freedesktop.org/drm/intel/issues/7742 > [i915#79]: https://gitlab.freedesktop.org/drm/intel/issues/79 > [i915#7941]: https://gitlab.freedesktop.org/drm/intel/issues/7941 > [i915#7975]: https://gitlab.freedesktop.org/drm/intel/issues/7975 > [i915#8011]: https://gitlab.freedesktop.org/drm/intel/issues/8011 > [i915#8211]: https://gitlab.freedesktop.org/drm/intel/issues/8211 > [i915#8213]: https://gitlab.freedesktop.org/drm/intel/issues/8213 > [i915#8234]: https://gitlab.freedesktop.org/drm/intel/issues/8234 > [i915#8414]: https://gitlab.freedesktop.org/drm/intel/issues/8414 > > > Build changes > ------------- > > * Linux: CI_DRM_13143 -> Patchwork_117004v13 > > CI-20190529: 20190529 > CI_DRM_13143: 222ff19f23b0bd6aca0b52001d69699f78f5a206 @ git://anongit.freedesktop.org/gfx-ci/linux > IGT_7286: a482779488f11c432d7ddcb1980691ab1603f356 @ https://gitlab.freedesktop.org/drm/igt-gpu-tools.git > Patchwork_117004v13: 222ff19f23b0bd6aca0b52001d69699f78f5a206 @ git://anongit.freedesktop.org/gfx-ci/linux > piglit_4509: fdc5a4ca11124ab8413c7988896eec4c97336694 @ git://anongit.freedesktop.org/piglit > > == Logs == > > For more details see: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_117004v13/index.html ^ permalink raw reply [flat|nested] 41+ messages in thread
end of thread, other threads:[~2023-06-20 18:29 UTC | newest] Thread overview: 41+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2023-05-10 10:31 [Intel-gfx] [PATCH v4 00/14] drm/i915/tc: Add a workaround for an IOM/TCSS firmware hang issue Imre Deak 2023-05-10 10:31 ` [Intel-gfx] [PATCH v4 01/14] drm/i915: Fix PIPEDMC disabling for a bigjoiner configuration Imre Deak 2023-05-30 13:49 ` [v4,01/14] " Rudi Heitbaum 2023-05-30 13:49 ` [Intel-gfx] [v4, 01/14] " Rudi Heitbaum 2023-05-30 13:49 ` [v4,01/14] " Rudi Heitbaum 2023-05-31 8:47 ` Imre Deak 2023-05-31 8:47 ` Imre Deak 2023-05-31 8:47 ` [Intel-gfx] [v4, 01/14] " Imre Deak 2023-05-31 11:31 ` [v4,01/14] " Rudi Heitbaum 2023-05-31 11:31 ` [Intel-gfx] [v4, 01/14] " Rudi Heitbaum 2023-05-31 11:31 ` Rudi Heitbaum 2023-05-10 10:31 ` [Intel-gfx] [PATCH v4 02/14] drm/i915: Add helpers to reference/unreference a DPLL for a CRTC Imre Deak 2023-05-10 10:31 ` [Intel-gfx] [PATCH v4 03/14] drm/i915: Make the CRTC state consistent during sanitize-disabling Imre Deak 2023-05-10 10:31 ` [Intel-gfx] [PATCH v4 04/14] drm/i915: Update connector atomic state before crtc sanitize-disabling Imre Deak 2023-05-10 10:31 ` [Intel-gfx] [PATCH v4 05/14] drm/i915: Separate intel_crtc_disable_noatomic_begin/complete() Imre Deak 2023-05-10 10:31 ` [Intel-gfx] [PATCH v4 06/14] drm/i915: Factor out set_encoder_for_connector() Imre Deak 2023-05-10 10:31 ` [Intel-gfx] [PATCH v4 07/14] drm/i915: Add support for disabling any CRTCs during HW readout/sanitization Imre Deak 2023-05-10 10:31 ` [Intel-gfx] [PATCH v4 08/14] drm/i915/dp: Add link training debug and error printing helpers Imre Deak 2023-05-10 10:31 ` [Intel-gfx] [PATCH v4 09/14] drm/i915/dp: Convert link training error to debug message on disconnected sink Imre Deak 2023-05-10 10:31 ` [Intel-gfx] [PATCH v4 10/14] drm/i915/dp: Prevent link training fallback on disconnected port Imre Deak 2023-05-10 10:31 ` [Intel-gfx] [PATCH v4 11/14] drm/i915/dp: Factor out intel_dp_get_active_pipes() Imre Deak 2023-05-10 10:31 ` [Intel-gfx] [PATCH v4 12/14] drm/i915: Factor out a helper for handling atomic modeset locks/state Imre Deak 2023-05-10 10:31 ` [Intel-gfx] [PATCH v4 13/14] drm/i915/tc: Call TypeC port flush_work/cleanup without modeset locks held Imre Deak 2023-05-10 14:03 ` Ville Syrjälä 2023-05-10 14:10 ` Imre Deak 2023-05-11 17:40 ` Ville Syrjälä 2023-05-12 13:38 ` Imre Deak 2023-05-12 19:55 ` [Intel-gfx] [PATCH v5 " Imre Deak 2023-05-10 10:31 ` [Intel-gfx] [PATCH v4 14/14] drm/i915/tc: Reset TypeC PHYs left enabled in DP-alt mode after the sink disconnects Imre Deak 2023-05-11 19:21 ` Ville Syrjälä 2023-05-12 13:50 ` Imre Deak 2023-05-12 19:55 ` [Intel-gfx] [PATCH v5 " Imre Deak 2023-05-10 11:13 ` [Intel-gfx] ✗ Fi.CI.CHECKPATCH: warning for drm/i915/tc: Add a workaround for an IOM/TCSS firmware hang issue (rev11) Patchwork 2023-05-10 11:13 ` [Intel-gfx] ✗ Fi.CI.SPARSE: " Patchwork 2023-05-10 11:18 ` [Intel-gfx] ✓ Fi.CI.BAT: success " Patchwork 2023-05-10 13:52 ` [Intel-gfx] ✗ Fi.CI.IGT: failure " Patchwork 2023-05-12 21:17 ` [Intel-gfx] ✗ Fi.CI.CHECKPATCH: warning for drm/i915/tc: Add a workaround for an IOM/TCSS firmware hang issue (rev13) Patchwork 2023-05-12 21:17 ` [Intel-gfx] ✗ Fi.CI.SPARSE: " Patchwork 2023-05-12 21:31 ` [Intel-gfx] ✓ Fi.CI.BAT: success " Patchwork 2023-05-13 1:08 ` [Intel-gfx] ✓ Fi.CI.IGT: " Patchwork 2023-05-16 14:06 ` Imre Deak
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.