Hi,
On Fri, 2019-01-18 at 17:04 -0800, Steve Longerbeam wrote:
Disable the SMFC before disabling the IDMA channel, instead of after, in csi_idmac_unsetup().
This fixes a complete system hard lockup on the SabreAuto when streaming from the ADV7180, by repeatedly sending a stream off immediately followed by stream on:
while true; do v4l2-ctl -d4 --stream-mmap --stream-count=3; done
Eventually this either causes the system lockup or EOF timeouts at all subsequent stream on, until a system reset.
The lockup occurs when disabling the IDMA channel at stream off. Stopping the video data stream entering the IDMA channel before disabling the channel itself appears to be a reliable fix for the hard lockup. That can be done either by disabling the SMFC or the CSI before disabling the channel. Disabling the SMFC before the channel is the easiest solution, so do that.
Fixes: 4a34ec8e470cb ("[media] media: imx: Add CSI subdev driver")
Suggested-by: Peter Seiderer ps.report@gmx.net Reported-by: Gaël PORTAY gael.portay@collabora.com Signed-off-by: Steve Longerbeam slongerbeam@gmail.com
Gaël, could we get a Tested-by: for this as well?
Cc: stable@vger.kernel.org
Changes in v3:
- switch from disabling the CSI before the channel to disabling the SMFC before the channel.
Changes in v2:
- restore an empty line
- Add Fixes: and Cc: stable
drivers/staging/media/imx/imx-media-csi.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/staging/media/imx/imx-media-csi.c b/drivers/staging/media/imx/imx-media-csi.c index e18f58f56dfb..8610027eac97 100644 --- a/drivers/staging/media/imx/imx-media-csi.c +++ b/drivers/staging/media/imx/imx-media-csi.c @@ -560,8 +560,8 @@ static int csi_idmac_setup_channel(struct csi_priv *priv) static void csi_idmac_unsetup(struct csi_priv *priv, enum vb2_buffer_state state) {
- ipu_idmac_disable_channel(priv->idmac_ch); ipu_smfc_disable(priv->smfc);
- ipu_idmac_disable_channel(priv->idmac_ch);
Steve, do you have any theory why this helps? It's a bit weird to disable the SMFC module while the DMA channel is still enabled. I think this warrants a big comment, given that enable order is SMFC_EN before IDMAC channel enable.
Also ipu_smfc_disable is refcounted, so if the other CSI is capturing simultaneously, this change has no effect.
FWIW, I don't see any regressions though.
regards Philipp