From: Hsiao Chien Sung <shawn.sung@mediatek.com>
To: AngeloGioacchino Del Regno
<angelogioacchino.delregno@collabora.com>,
"CK Hu" <ck.hu@mediatek.com>,
Krzysztof Kozlowski <krzysztof.kozlowski+dt@linaro.org>,
Matthias Brugger <matthias.bgg@gmail.com>,
Rob Herring <robh+dt@kernel.org>
Cc: Conor Dooley <conor+dt@kernel.org>,
Philipp Zabel <p.zabel@pengutronix.de>,
David Airlie <airlied@gmail.com>, Daniel Vetter <daniel@ffwll.ch>,
Chun-Kuang Hu <chunkuang.hu@kernel.org>,
"Mauro Carvalho Chehab" <mchehab@kernel.org>,
<devicetree@vger.kernel.org>, <linux-kernel@vger.kernel.org>,
<dri-devel@lists.freedesktop.org>,
<linux-mediatek@lists.infradead.org>,
<linux-arm-kernel@lists.infradead.org>,
Singo Chang <singo.chang@mediatek.com>,
"Nancy . Lin" <nancy.lin@mediatek.com>,
"Jason-JH . Lin" <jason-jh.lin@mediatek.com>,
"Hsiao Chien Sung" <shawn.sung@mediatek.com>
Subject: [PATCH v7 22/23] drm/mediatek: Power on devices in OVL adaptor when atomic enable
Date: Fri, 6 Oct 2023 15:38:30 +0800 [thread overview]
Message-ID: <20231006073831.10402-23-shawn.sung@mediatek.com> (raw)
In-Reply-To: <20231006073831.10402-1-shawn.sung@mediatek.com>
Different from OVL, OVL adaptor is a pseudo device so we didn't
define it in the device tree, consequently, pm_runtime_resume_and_get()
called by .atomic_enable() powers on no device in OVL adaptor and
leads to power outage in the corresponding IOMMU.
To resolve the issue, we implement a function to power on the RDMAs
in OVL adaptor, and the system will make sure the IOMMU is powered on
as well because of the device link (iommus) in the RDMA nodes in DTS.
Fixes: 5db12f5d843b ("media: drm/mediatek: Add pm runtime support for ovl and rdma")
Signed-off-by: Hsiao Chien Sung <shawn.sung@mediatek.com>
---
drivers/gpu/drm/mediatek/mtk_disp_drv.h | 1 +
.../gpu/drm/mediatek/mtk_disp_ovl_adaptor.c | 49 +++++++++++++++++++
drivers/gpu/drm/mediatek/mtk_drm_crtc.c | 9 ++++
drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c | 1 +
drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.h | 9 ++++
5 files changed, 69 insertions(+)
diff --git a/drivers/gpu/drm/mediatek/mtk_disp_drv.h b/drivers/gpu/drm/mediatek/mtk_disp_drv.h
index 45b30a2fe11a..971d64261fb9 100644
--- a/drivers/gpu/drm/mediatek/mtk_disp_drv.h
+++ b/drivers/gpu/drm/mediatek/mtk_disp_drv.h
@@ -107,6 +107,7 @@ void mtk_ovl_adaptor_connect(struct device *dev, struct device *mmsys_dev,
unsigned int next);
void mtk_ovl_adaptor_disconnect(struct device *dev, struct device *mmsys_dev,
unsigned int next);
+int mtk_ovl_adaptor_power_on(struct device *dev);
int mtk_ovl_adaptor_clk_enable(struct device *dev);
void mtk_ovl_adaptor_clk_disable(struct device *dev);
void mtk_ovl_adaptor_config(struct device *dev, unsigned int w,
diff --git a/drivers/gpu/drm/mediatek/mtk_disp_ovl_adaptor.c b/drivers/gpu/drm/mediatek/mtk_disp_ovl_adaptor.c
index c326a658dc63..ae3b6ba655b1 100644
--- a/drivers/gpu/drm/mediatek/mtk_disp_ovl_adaptor.c
+++ b/drivers/gpu/drm/mediatek/mtk_disp_ovl_adaptor.c
@@ -242,6 +242,55 @@ void mtk_ovl_adaptor_stop(struct device *dev)
}
}
+/**
+ * mtk_ovl_adaptor_power_on - Power on devices in OVL adaptor
+ * @dev: device to be powered on
+ *
+ * Different from OVL, OVL adaptor is a pseudo device so
+ * we didn't define it in the device tree, pm_runtime_resume_and_get()
+ * called by .atomic_enable() power on no device in OVL adaptor,
+ * we have to implement a function to do the job instead.
+ *
+ * returns:
+ * zero on success, errno on failure.
+ */
+int mtk_ovl_adaptor_power_on(struct device *dev)
+{
+ int i, ret;
+ struct device *comp;
+ struct mtk_disp_ovl_adaptor *ovl_adaptor = dev_get_drvdata(dev);
+
+ for (i = 0; i < OVL_ADAPTOR_ID_MAX; i++) {
+ comp = ovl_adaptor->ovl_adaptor_comp[i];
+
+ if (!comp)
+ continue;
+
+ if (comp_matches[i].type != OVL_ADAPTOR_TYPE_MDP_RDMA)
+ continue;
+
+ ret = pm_runtime_resume_and_get(comp);
+ if (ret < 0) {
+ dev_err(dev, "Failed to power on comp(%u): %d\n", i, ret);
+ goto error;
+ }
+ }
+ return 0;
+error:
+ while (--i >= 0) {
+ comp = ovl_adaptor->ovl_adaptor_comp[i];
+
+ if (!comp)
+ continue;
+
+ if (comp_matches[i].type != OVL_ADAPTOR_TYPE_MDP_RDMA)
+ continue;
+
+ pm_runtime_put(comp);
+ }
+ return ret;
+}
+
int mtk_ovl_adaptor_clk_enable(struct device *dev)
{
int i;
diff --git a/drivers/gpu/drm/mediatek/mtk_drm_crtc.c b/drivers/gpu/drm/mediatek/mtk_drm_crtc.c
index b6fa4ad2f94d..5bd62027190b 100644
--- a/drivers/gpu/drm/mediatek/mtk_drm_crtc.c
+++ b/drivers/gpu/drm/mediatek/mtk_drm_crtc.c
@@ -364,6 +364,15 @@ static int mtk_crtc_ddp_hw_init(struct mtk_drm_crtc *mtk_crtc)
return ret;
}
+ for (i = 0; i < mtk_crtc->ddp_comp_nr; i++) {
+ ret = mtk_ddp_comp_power_on(mtk_crtc->ddp_comp[i]);
+ if (ret) {
+ DRM_ERROR("Failed to power on %s: %d\n",
+ dev_name(mtk_crtc->ddp_comp[i]->dev), ret);
+ return ret;
+ }
+ }
+
ret = mtk_mutex_prepare(mtk_crtc->mutex);
if (ret < 0) {
DRM_ERROR("Failed to enable mutex clock: %d\n", ret);
diff --git a/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c b/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c
index 771f4e173353..e39860f2be78 100644
--- a/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c
+++ b/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c
@@ -394,6 +394,7 @@ static const struct mtk_ddp_comp_funcs ddp_ufoe = {
};
static const struct mtk_ddp_comp_funcs ddp_ovl_adaptor = {
+ .power_on = mtk_ovl_adaptor_power_on,
.clk_enable = mtk_ovl_adaptor_clk_enable,
.clk_disable = mtk_ovl_adaptor_clk_disable,
.config = mtk_ovl_adaptor_config,
diff --git a/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.h b/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.h
index febcaeef16a1..4fef283f17d2 100644
--- a/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.h
+++ b/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.h
@@ -46,6 +46,7 @@ enum mtk_ddp_comp_type {
struct mtk_ddp_comp;
struct cmdq_pkt;
struct mtk_ddp_comp_funcs {
+ int (*power_on)(struct device *dev);
int (*clk_enable)(struct device *dev);
void (*clk_disable)(struct device *dev);
void (*config)(struct device *dev, unsigned int w,
@@ -89,6 +90,14 @@ struct mtk_ddp_comp {
const struct mtk_ddp_comp_funcs *funcs;
};
+static inline int mtk_ddp_comp_power_on(struct mtk_ddp_comp *comp)
+{
+ if (comp->funcs && comp->funcs->power_on)
+ return comp->funcs->power_on(comp->dev);
+
+ return 0;
+}
+
static inline int mtk_ddp_comp_clk_enable(struct mtk_ddp_comp *comp)
{
if (comp->funcs && comp->funcs->clk_enable)
--
2.18.0
next prev parent reply other threads:[~2023-10-06 7:40 UTC|newest]
Thread overview: 34+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-10-06 7:38 [PATCH v7 00/23] Add display driver for MT8188 VDOSYS1 Hsiao Chien Sung
2023-10-06 7:38 ` [PATCH v7 01/23] dt-bindings: display: mediatek: ethdr: Add compatible for MT8188 Hsiao Chien Sung
2023-10-06 7:38 ` [PATCH v7 02/23] dt-bindings: display: mediatek: mdp-rdma: " Hsiao Chien Sung
2023-10-06 7:38 ` [PATCH v7 03/23] dt-bindings: display: mediatek: merge: " Hsiao Chien Sung
2023-10-06 7:38 ` [PATCH v7 04/23] dt-bindings: display: mediatek: padding: Add MT8188 Hsiao Chien Sung
2023-10-13 16:26 ` Daniel Stone
2023-10-16 4:23 ` Shawn Sung (宋孝謙)
2023-10-16 10:47 ` Daniel Stone
2023-10-17 4:19 ` Shawn Sung (宋孝謙)
2023-10-06 7:38 ` [PATCH v7 05/23] dt-bindings: arm: mediatek: Add compatible for MT8188 Hsiao Chien Sung
2023-10-06 7:38 ` [PATCH v7 06/23] dt-bindings: reset: mt8188: Add VDOSYS reset control bits Hsiao Chien Sung
2023-10-06 7:38 ` [PATCH v7 07/23] soc: mediatek: Support MT8188 VDOSYS1 in mtk-mmsys Hsiao Chien Sung
2023-10-06 7:38 ` [PATCH v7 08/23] soc: mediatek: Support MT8188 VDOSYS1 Padding " Hsiao Chien Sung
2023-10-06 7:38 ` [PATCH v7 09/23] soc: mediatek: Support reset bit mapping in mmsys driver Hsiao Chien Sung
2023-10-06 7:38 ` [PATCH v7 10/23] soc: mediatek: Add MT8188 VDOSYS reset bit map Hsiao Chien Sung
2023-10-06 7:38 ` [PATCH v7 11/23] drm/mediatek: Rename OVL_ADAPTOR_TYPE_RDMA Hsiao Chien Sung
2023-10-06 7:38 ` [PATCH v7 12/23] drm/mediatek: Refine device table of OVL adaptor Hsiao Chien Sung
2023-10-06 7:38 ` [PATCH v7 13/23] drm/mediatek: Sort OVL adaptor components Hsiao Chien Sung
2023-10-06 7:38 ` [PATCH v7 14/23] drm/mediatek: Add component ID to component match structure Hsiao Chien Sung
2023-10-06 7:38 ` [PATCH v7 15/23] drm/mediatek: Manage component's clock with function pointers Hsiao Chien Sung
2023-10-06 7:38 ` [PATCH v7 16/23] drm/mediatek: Start/Stop components " Hsiao Chien Sung
2023-10-06 8:58 ` CK Hu (胡俊光)
2023-10-06 7:38 ` [PATCH v7 17/23] drm/mediatek: Support MT8188 Padding in display driver Hsiao Chien Sung
2023-10-06 8:40 ` CK Hu (胡俊光)
2023-10-06 7:38 ` [PATCH v7 18/23] drm/mediatek: Add Padding to OVL adaptor Hsiao Chien Sung
2023-10-06 8:54 ` CK Hu (胡俊光)
2023-10-06 7:38 ` [PATCH v7 19/23] drm/mediatek: Return error if MDP RDMA failed to enable the clock Hsiao Chien Sung
2023-10-06 9:07 ` CK Hu (胡俊光)
2023-10-06 7:38 ` [PATCH v7 20/23] drm/mediatek: Remove the redundant driver data for DPI Hsiao Chien Sung
2023-10-06 9:11 ` CK Hu (胡俊光)
2023-10-06 7:38 ` [PATCH v7 21/23] drm/mediatek: Fix underrun in VDO1 when switches off the layer Hsiao Chien Sung
2023-10-06 7:38 ` Hsiao Chien Sung [this message]
2023-10-06 9:47 ` [PATCH v7 22/23] drm/mediatek: Power on devices in OVL adaptor when atomic enable CK Hu (胡俊光)
2023-10-06 7:38 ` [PATCH v7 23/23] drm/mediatek: Support MT8188 VDOSYS1 in display driver Hsiao Chien Sung
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20231006073831.10402-23-shawn.sung@mediatek.com \
--to=shawn.sung@mediatek.com \
--cc=airlied@gmail.com \
--cc=angelogioacchino.delregno@collabora.com \
--cc=chunkuang.hu@kernel.org \
--cc=ck.hu@mediatek.com \
--cc=conor+dt@kernel.org \
--cc=daniel@ffwll.ch \
--cc=devicetree@vger.kernel.org \
--cc=dri-devel@lists.freedesktop.org \
--cc=jason-jh.lin@mediatek.com \
--cc=krzysztof.kozlowski+dt@linaro.org \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mediatek@lists.infradead.org \
--cc=matthias.bgg@gmail.com \
--cc=mchehab@kernel.org \
--cc=nancy.lin@mediatek.com \
--cc=p.zabel@pengutronix.de \
--cc=robh+dt@kernel.org \
--cc=singo.chang@mediatek.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®