From patchwork Thu Apr 3 10:47:40 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: AngeloGioacchino Del Regno X-Patchwork-Id: 14037221 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 1EC21C3600C for ; Thu, 3 Apr 2025 11:15:42 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender:List-Subscribe:List-Help :List-Post:List-Archive:List-Unsubscribe:List-Id:Content-Transfer-Encoding: MIME-Version:References:In-Reply-To:Message-ID:Date:Subject:Cc:To:From: Reply-To:Content-Type:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=gHuXvYsLEdxv7VHoBBk0RQQbYtZetDcY2TzolNCPT54=; b=tZCpqPWl90jBzyQMWGlxZh6sAB +nf8JR+Qc4mODVjJOok9NdsW/1ADRwpf9aitK6Ku+oouJ5TC61tNEn9NBO3unWtF7zyW4ClspA44E xynZ+rUAgmzr4oo5BZ6XwBekb1+HcjuLxxPqqOAvsUr4ujDycL3gBdSiDXTg3o/ZLw7lgT6/n0sQC SldlxInVXlfZhT0+tA6uCwEAuH8VYxsrwO9RXJveANz6zDaalDYOP247PomVcbRLdp8dwzNQUWmKz jl4TEbSMsLr5EetpOhF8n/fJbRxLZiC7/BynxCHeqqJGUgNH57UI2O7heIebUsr03itiTkrXirvS9 SrbODnng==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.98.1 #2 (Red Hat Linux)) id 1u0IXl-00000008fgE-253l; Thu, 03 Apr 2025 11:15:33 +0000 Received: from bali.collaboradmins.com ([2a01:4f8:201:9162::2]) by bombadil.infradead.org with esmtps (Exim 4.98.1 #2 (Red Hat Linux)) id 1u0I6w-00000008cGs-2iFR; Thu, 03 Apr 2025 10:47:52 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1743677269; bh=hqOJ5Kz8YhGSoWTaIpp84R16eCUbWGlkQG1L8iZgVmI=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=DVikaTVmFfz6be3Zp7wE4SI3jAj0VVsFoAJ1VGqSCIzUzqcJjFu7nYYkTHAKR8ZTx MMbjxu84+OW5xkY3BOfOwbgtcJ65+ZLuQQIZ/ODcQ9C084/LrD4mQ+hI0Yc6PaU7UI aBW0h8z69CwnOGcRV+ih+Zig6PbPB50EWHLH9rQmQgE7nNQdmbFEHNUHOlrnALnZq+ YAQsIx1s4MrDM5asIZHP0qEooji1MlbSaePEac0KiMmeIVV+J0vGQnXu1oaPVNTNg8 fle8ClfUigNUC9oWZma4i06DYbPPMj944o+yfOIy26+7HYk6NWCXyyMF9eY/gjNUXK FihT4UK0EoCjw== Received: from IcarusMOD.eternityproject.eu (2-237-20-237.ip236.fastwebnet.it [2.237.20.237]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: kholk11) by bali.collaboradmins.com (Postfix) with ESMTPSA id 5826C17E105F; Thu, 3 Apr 2025 12:47:48 +0200 (CEST) From: AngeloGioacchino Del Regno To: chunkuang.hu@kernel.org Cc: p.zabel@pengutronix.de, airlied@gmail.com, simona@ffwll.ch, matthias.bgg@gmail.com, angelogioacchino.delregno@collabora.com, nancy.lin@mediatek.com, ck.hu@mediatek.com, djkurtz@chromium.org, littlecvr@chromium.org, bibby.hsieh@mediatek.com, dri-devel@lists.freedesktop.org, linux-mediatek@lists.infradead.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, wenst@chromium.org, kernel@collabora.com Subject: [PATCH v2 4/5] drm/mediatek: mtk_disp_ovl: Enable/disable interrupt on bind/unbind Date: Thu, 3 Apr 2025 12:47:40 +0200 Message-ID: <20250403104741.71045-5-angelogioacchino.delregno@collabora.com> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250403104741.71045-1-angelogioacchino.delregno@collabora.com> References: <20250403104741.71045-1-angelogioacchino.delregno@collabora.com> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20250403_034750_856022_FE4BD4AF X-CRM114-Status: GOOD ( 17.16 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org The OVL driver is installing an ISR in the probe function but, if the component is not bound yet, the interrupt handler may call the vblank_cb ahead of time (while probing other drivers) or too late (while removing other drivers), possibly accessing memory that it should not try to access by reusing stale pointers. In order to fix this, add a new `irq` member to struct mtk_disp_ovl and then add the IRQF_NO_AUTOEN flag to the irq while installing the ISR to manually call enable_irq() and disable_irq() in the bind and unbind callbacks respectively. Note that since IRQF_TRIGGER_NONE is effectively 0 and doing nothing this (fake) flag was dropped. Fixes: 119f5173628a ("drm/mediatek: Add DRM Driver for Mediatek SoC MT8173.") Link: https://lore.kernel.org/r/20250402083628.20111-5-angelogioacchino.delregno@collabora.com Signed-off-by: AngeloGioacchino Del Regno --- drivers/gpu/drm/mediatek/mtk_disp_ovl.c | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/drivers/gpu/drm/mediatek/mtk_disp_ovl.c b/drivers/gpu/drm/mediatek/mtk_disp_ovl.c index df82cea4bb79..4d42cb3fee15 100644 --- a/drivers/gpu/drm/mediatek/mtk_disp_ovl.c +++ b/drivers/gpu/drm/mediatek/mtk_disp_ovl.c @@ -161,6 +161,7 @@ struct mtk_disp_ovl { struct drm_crtc *crtc; struct clk *clk; void __iomem *regs; + int irq; struct cmdq_client_reg cmdq_reg; const struct mtk_disp_ovl_data *data; void (*vblank_cb)(void *data); @@ -587,12 +588,18 @@ void mtk_ovl_bgclr_in_off(struct device *dev) static int mtk_disp_ovl_bind(struct device *dev, struct device *master, void *data) { + struct mtk_disp_ovl *priv = dev_get_drvdata(dev); + + enable_irq(priv->irq); return 0; } static void mtk_disp_ovl_unbind(struct device *dev, struct device *master, void *data) { + struct mtk_disp_ovl *priv = dev_get_drvdata(dev); + + disable_irq(priv->irq); } static const struct component_ops mtk_disp_ovl_component_ops = { @@ -605,16 +612,15 @@ static int mtk_disp_ovl_probe(struct platform_device *pdev) struct device *dev = &pdev->dev; struct mtk_disp_ovl *priv; struct resource *res; - int irq; int ret; priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); if (!priv) return -ENOMEM; - irq = platform_get_irq(pdev, 0); - if (irq < 0) - return irq; + priv->irq = platform_get_irq(pdev, 0); + if (priv->irq < 0) + return priv->irq; priv->clk = devm_clk_get(dev, NULL); if (IS_ERR(priv->clk)) @@ -635,10 +641,10 @@ static int mtk_disp_ovl_probe(struct platform_device *pdev) priv->data = of_device_get_match_data(dev); platform_set_drvdata(pdev, priv); - ret = devm_request_irq(dev, irq, mtk_disp_ovl_irq_handler, - IRQF_TRIGGER_NONE, dev_name(dev), priv); + ret = devm_request_irq(dev, priv->irq, mtk_disp_ovl_irq_handler, + IRQF_NO_AUTOEN, dev_name(dev), priv); if (ret < 0) - return dev_err_probe(dev, ret, "Failed to request irq %d\n", irq); + return dev_err_probe(dev, ret, "Failed to request irq %d\n", priv->irq); pm_runtime_enable(dev);