Received: by 2002:a05:7412:7c14:b0:fa:6e18:a558 with SMTP id ii20csp415452rdb; Mon, 22 Jan 2024 08:04:41 -0800 (PST) X-Google-Smtp-Source: AGHT+IE2ICEbNfM9ok0TS8vMiSb//dHJXkOAM1da2Z0C4hGtr8IVF9OWvN4blb+NtFRyeHaHXj8M X-Received: by 2002:a9d:75da:0:b0:6de:b0c:1b5b with SMTP id c26-20020a9d75da000000b006de0b0c1b5bmr4887016otl.33.1705939480988; Mon, 22 Jan 2024 08:04:40 -0800 (PST) ARC-Seal: i=2; a=rsa-sha256; t=1705939480; cv=pass; d=google.com; s=arc-20160816; b=Y5Xtp4wT3uWLo30M3cp5JxgQtudtx8Hs4Op/sGHFZOd2Y/M2H5J3mckdTHv7vYkQ8z Iqtm2M4nx+YWhGYCGPZTxAysc97XwsSSARfa66+Yc9b/gvfJjMiHuR+tNT7ZYRwl4p2h gQ14cy/z1kbrZZ6oaOkhs2JaKTuUX8tRmxCQmHhAdX/YXljmVRmCDw6EUrqzVMQ/SPdY FAkSQUsoJ3wWnkY4rmjEn/U0AEhohJvubmCux19O93FHXfYrWCttl2Z2OmU2HvafIkiR p32NDS3EjygKC8r3BDIEu+a7b+x2Swnzim34veJYqg2O7/F8jlEa0LD9Y7sgCQ8svFca 8IKA== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:references:in-reply-to:message-id :date:subject:cc:to:from:dkim-signature; bh=nM3VyhzLr5bX9W6VgjRlTOO1I3B4pneSXkquTJOW8Sw=; fh=MSL/7hYF60PaScCJvqqoGkUWoZtElvzu/oEB/jqaobA=; b=iRdTCNtEBtKFwjHevYJcnjz6NoRSjd7Q6qHmMgTWUHkmrG2qo3mPCrNMCH0VBX4bkG vmWNn/Uvy+/+ZAPlYH8UDAxNe8qN7wDe8gQnzT+l5cDJeiTau/B9fZT08SxVYvKzPnPv H5ObbbKkYUdKdYUF3FjVbfgmyjX4Dect54HGAnvMZE8G/5DXklrKThRpbh4vELcMkP8D GyNgPviYF1EzRH6TxO48zP/yCDV8iFeK604aHqSTANOL1wnbVrAnhg3Sj5oIND237KB9 70tYX2wCi17GULIIaBdIXbACjZWzE9Ob4uTXpf1juMRIvvOvKBlzQvAEhIrFY261NSZ5 /xpw== ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=MN+YMWRP; arc=pass (i=1 dkim=pass dkdomain=kernel.org); spf=pass (google.com: domain of linux-kernel+bounces-33426-linux.lists.archive=gmail.com@vger.kernel.org designates 147.75.199.223 as permitted sender) smtp.mailfrom="linux-kernel+bounces-33426-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from ny.mirrors.kernel.org (ny.mirrors.kernel.org. [147.75.199.223]) by mx.google.com with ESMTPS id h13-20020a67cfcd000000b0046aef10d805si76404vsm.435.2024.01.22.08.04.40 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 22 Jan 2024 08:04:40 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel+bounces-33426-linux.lists.archive=gmail.com@vger.kernel.org designates 147.75.199.223 as permitted sender) client-ip=147.75.199.223; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=MN+YMWRP; arc=pass (i=1 dkim=pass dkdomain=kernel.org); spf=pass (google.com: domain of linux-kernel+bounces-33426-linux.lists.archive=gmail.com@vger.kernel.org designates 147.75.199.223 as permitted sender) smtp.mailfrom="linux-kernel+bounces-33426-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ny.mirrors.kernel.org (Postfix) with ESMTPS id AE52B1C23D02 for ; Mon, 22 Jan 2024 16:04:40 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 2719585C60; Mon, 22 Jan 2024 15:10:59 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="MN+YMWRP" Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3B5E285C73; Mon, 22 Jan 2024 15:10:57 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1705936258; cv=none; b=W8d2Oq6TeIwJbNdKUlZdlbw8zrCF1fMlA+gJKNPfCRD+WCJKmDui8msn4Y8lNsLRIPrhNwmwcIwuHIwCrpZVU6fH4/U2tAp94IFg7JWl1zkvKcq11RsMlFBKN2qAG/AJGx03N3LIrG5/Dg1jsDWnWZ1zUbbfFIXuxc1rz6CNMsI= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1705936258; c=relaxed/simple; bh=pf/v0wZ85xAyYjytsMGV2SWF+8mIl7pFFHxFnpB/rVg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=b9T1jsbgVcq08220p9ob0KJ+j58JKtPGmFKE8Yb4Nfz5EO4A4smC8SYykvehoQYNDPS9mtykwMwkw9ET9EAAVlgk1kt0aE99lY8EeolZCBSpCDwFKmhhQr/haly2bB4UTd94c9BQnGJLtQZrz2JqlIywSxZuuVhFHIwQks1u6mc= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=MN+YMWRP; arc=none smtp.client-ip=10.30.226.201 Received: by smtp.kernel.org (Postfix) with ESMTPSA id B4AB7C433F1; Mon, 22 Jan 2024 15:10:55 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1705936257; bh=pf/v0wZ85xAyYjytsMGV2SWF+8mIl7pFFHxFnpB/rVg=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=MN+YMWRPTH7kVygtVMQ4zv5ei4jWzPf9kQmUx+edP24iGRqaxo3hXTRxy1XbjuEsQ /JjgrfN4p4aacFap1qGUQtDlnosj24z04/Bg7xnrQAwbT3AKoP4NtVtLpSumRVzB7h Yv1rcNCIH3DPE5mmCCsjIzPrI/hJqKUyl5J+LG6QPiecd6UhM2BIDcOxUnHJhzNumh sX3VtDGq5mJSsaOwxS89qc+0oQkc5cM3wd2KJqRzaapnvkHoKcMroh4C+j3/iJi0+X JQ9FbEnNHNZFNmlcHnDgLldXRzH8WyeivxyvQQDszCpbltGGxRm8DDtTB9FQro6fcc RklGcuO0BP48Q== From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Tomi Valkeinen , Adam Ford , Laurent Pinchart , Mauro Carvalho Chehab , Sasha Levin , dafna@fastmail.com, heiko@sntech.de, linux-media@vger.kernel.org, linux-rockchip@lists.infradead.org, linux-arm-kernel@lists.infradead.org Subject: [PATCH AUTOSEL 6.1 26/53] media: rkisp1: Fix IRQ disable race issue Date: Mon, 22 Jan 2024 10:08:27 -0500 Message-ID: <20240122150949.994249-26-sashal@kernel.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240122150949.994249-1-sashal@kernel.org> References: <20240122150949.994249-1-sashal@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-stable: review X-Patchwork-Hint: Ignore X-stable-base: Linux 6.1.74 Content-Transfer-Encoding: 8bit From: Tomi Valkeinen [ Upstream commit 870565f063a58576e8a4529f122cac4325c6b395 ] In rkisp1_isp_stop() and rkisp1_csi_disable() the driver masks the interrupts and then apparently assumes that the interrupt handler won't be running, and proceeds in the stop procedure. This is not the case, as the interrupt handler can already be running, which would lead to the ISP being disabled while the interrupt handler handling a captured frame. This brings up two issues: 1) the ISP could be powered off while the interrupt handler is still running and accessing registers, leading to board lockup, and 2) the interrupt handler code and the code that disables the streaming might do things that conflict. It is not clear to me if 2) causes a real issue, but 1) can be seen with a suitable delay (or printk in my case) in the interrupt handler, leading to board lockup. Link: https://lore.kernel.org/r/20231207-rkisp-irq-fix-v3-4-358a2c871a3c@ideasonboard.com Tested-by: Adam Ford #imx8mp-beacon Signed-off-by: Tomi Valkeinen Signed-off-by: Laurent Pinchart Signed-off-by: Mauro Carvalho Chehab Signed-off-by: Sasha Levin --- .../platform/rockchip/rkisp1/rkisp1-csi.c | 14 ++++++++++++- .../platform/rockchip/rkisp1/rkisp1-isp.c | 20 ++++++++++++++++--- 2 files changed, 30 insertions(+), 4 deletions(-) diff --git a/drivers/media/platform/rockchip/rkisp1/rkisp1-csi.c b/drivers/media/platform/rockchip/rkisp1/rkisp1-csi.c index d7acc94e10f8..e862f515cc6d 100644 --- a/drivers/media/platform/rockchip/rkisp1/rkisp1-csi.c +++ b/drivers/media/platform/rockchip/rkisp1/rkisp1-csi.c @@ -141,8 +141,20 @@ static void rkisp1_csi_disable(struct rkisp1_csi *csi) struct rkisp1_device *rkisp1 = csi->rkisp1; u32 val; - /* Mask and clear interrupts. */ + /* Mask MIPI interrupts. */ rkisp1_write(rkisp1, RKISP1_CIF_MIPI_IMSC, 0); + + /* Flush posted writes */ + rkisp1_read(rkisp1, RKISP1_CIF_MIPI_IMSC); + + /* + * Wait until the IRQ handler has ended. The IRQ handler may get called + * even after this, but it will return immediately as the MIPI + * interrupts have been masked. + */ + synchronize_irq(rkisp1->irqs[RKISP1_IRQ_MIPI]); + + /* Clear MIPI interrupt status */ rkisp1_write(rkisp1, RKISP1_CIF_MIPI_ICR, ~0); val = rkisp1_read(rkisp1, RKISP1_CIF_MIPI_CTRL); diff --git a/drivers/media/platform/rockchip/rkisp1/rkisp1-isp.c b/drivers/media/platform/rockchip/rkisp1/rkisp1-isp.c index 585cf3f53469..00dca284c122 100644 --- a/drivers/media/platform/rockchip/rkisp1/rkisp1-isp.c +++ b/drivers/media/platform/rockchip/rkisp1/rkisp1-isp.c @@ -281,11 +281,25 @@ static void rkisp1_isp_stop(struct rkisp1_isp *isp) * ISP(mi) stop in mi frame end -> Stop ISP(mipi) -> * Stop ISP(isp) ->wait for ISP isp off */ - /* stop and clear MI and ISP interrupts */ - rkisp1_write(rkisp1, RKISP1_CIF_ISP_IMSC, 0); - rkisp1_write(rkisp1, RKISP1_CIF_ISP_ICR, ~0); + /* Mask MI and ISP interrupts */ + rkisp1_write(rkisp1, RKISP1_CIF_ISP_IMSC, 0); rkisp1_write(rkisp1, RKISP1_CIF_MI_IMSC, 0); + + /* Flush posted writes */ + rkisp1_read(rkisp1, RKISP1_CIF_MI_IMSC); + + /* + * Wait until the IRQ handler has ended. The IRQ handler may get called + * even after this, but it will return immediately as the MI and ISP + * interrupts have been masked. + */ + synchronize_irq(rkisp1->irqs[RKISP1_IRQ_ISP]); + if (rkisp1->irqs[RKISP1_IRQ_ISP] != rkisp1->irqs[RKISP1_IRQ_MI]) + synchronize_irq(rkisp1->irqs[RKISP1_IRQ_MI]); + + /* Clear MI and ISP interrupt status */ + rkisp1_write(rkisp1, RKISP1_CIF_ISP_ICR, ~0); rkisp1_write(rkisp1, RKISP1_CIF_MI_ICR, ~0); /* stop ISP */ -- 2.43.0