From: Erikas Bitovtas <xerikasxx@gmail.com>
To: "Bryan O'Donoghue" <bod@kernel.org>,
"Vikash Garodia" <vikash.garodia@oss.qualcomm.com>,
"Dikshita Agarwal" <dikshita.agarwal@oss.qualcomm.com>,
"Mauro Carvalho Chehab" <mchehab@kernel.org>,
"Rob Herring" <robh@kernel.org>,
"Krzysztof Kozlowski" <krzk+dt@kernel.org>,
"Conor Dooley" <conor+dt@kernel.org>,
"André Apitzsch" <git@apitzsch.eu>,
"Bjorn Andersson" <andersson@kernel.org>,
"Konrad Dybcio" <konradybcio@kernel.org>,
"Michael Turquette" <mturquette@baylibre.com>,
"Stephen Boyd" <sboyd@kernel.org>,
"Brian Masney" <bmasney@redhat.com>
Cc: linux-media@vger.kernel.org, linux-arm-msm@vger.kernel.org,
devicetree@vger.kernel.org, linux-kernel@vger.kernel.org,
linux-clk@vger.kernel.org,
~postmarketos/upstreaming@lists.sr.ht,
phone-devel@vger.kernel.org,
Erikas Bitovtas <xerikasxx@gmail.com>
Subject: [PATCH v6 6/8] media: qcom: venus: add power domain enable logic for Venus cores
Date: Sun, 10 May 2026 12:47:44 +0300 [thread overview]
Message-ID: <20260510-msm8939-venus-rfc-v6-6-e69465375900@gmail.com> (raw)
In-Reply-To: <20260510-msm8939-venus-rfc-v6-0-e69465375900@gmail.com>
Attach power domains for vdec and venc cores and power them up if a vdec
or venc session is started.
Reviewed-by: Bryan O'Donoghue <bod@kernel.org>
Signed-off-by: Erikas Bitovtas <xerikasxx@gmail.com>
---
drivers/media/platform/qcom/venus/pm_helpers.c | 149 ++++++++++++++++++++++++-
1 file changed, 145 insertions(+), 4 deletions(-)
diff --git a/drivers/media/platform/qcom/venus/pm_helpers.c b/drivers/media/platform/qcom/venus/pm_helpers.c
index f0269524ac70..5ed7cbef8149 100644
--- a/drivers/media/platform/qcom/venus/pm_helpers.c
+++ b/drivers/media/platform/qcom/venus/pm_helpers.c
@@ -297,10 +297,31 @@ static int load_scale_v1(struct venus_inst *inst)
return ret;
}
+static int vcodec_domains_get_v1(struct venus_core *core)
+{
+ struct device *dev = core->dev;
+ const struct venus_resources *res = core->res;
+ const struct dev_pm_domain_attach_data vcodec_data = {
+ .pd_names = res->vcodec_pmdomains,
+ .num_pd_names = res->vcodec_pmdomains_num,
+ .pd_flags = PD_FLAG_NO_DEV_LINK,
+ };
+
+ if (!res->vcodec_pmdomains)
+ return 0;
+
+ return dev_pm_domain_attach_list(dev, &vcodec_data,
+ &core->pmdomains);
+}
+
static int core_get_v1(struct venus_core *core)
{
int ret;
+ ret = vcodec_domains_get_v1(core);
+ if (ret < 0)
+ return ret;
+
ret = core_clks_get(core);
if (ret)
return ret;
@@ -319,12 +340,128 @@ static void core_put_v1(struct venus_core *core)
static int core_power_v1(struct venus_core *core, int on)
{
int ret = 0;
+ struct device *pd_dev = core->res->vcodec_pmdomains ?
+ core->pmdomains->pd_devs[0] : NULL;
- if (on == POWER_ON)
+ if (on == POWER_ON) {
+ if (pd_dev) {
+ ret = pm_runtime_resume_and_get(pd_dev);
+ if (ret)
+ return ret;
+ }
ret = core_clks_enable(core);
- else
+ if (ret) {
+ pm_runtime_put_sync(pd_dev);
+ return ret;
+ }
+ } else {
+ if (pd_dev)
+ pm_runtime_put_sync(pd_dev);
core_clks_disable(core);
+ }
+
+ return 0;
+}
+
+static int vcodec_domains_enable(struct venus_core *core)
+{
+ const struct venus_resources *res = core->res;
+ struct device *pd_dev;
+ int i = 1, ret;
+
+ if (!res->vcodec_pmdomains)
+ return 0;
+
+ for (; i < res->vcodec_pmdomains_num; i++) {
+ pd_dev = core->pmdomains->pd_devs[i];
+ ret = pm_runtime_resume_and_get(pd_dev);
+ if (ret)
+ goto err;
+ }
+
+ return 0;
+err:
+ while (i-- > 1)
+ pm_runtime_put_sync(core->pmdomains->pd_devs[i]);
+ return ret;
+}
+
+static void vcodec_domains_disable(struct venus_core *core)
+{
+ const struct venus_resources *res = core->res;
+ struct device *pd_dev;
+ int i = 1;
+
+ if (!res->vcodec_pmdomains)
+ return;
+
+ for (; i < res->vcodec_pmdomains_num; i++) {
+ pd_dev = core->pmdomains->pd_devs[i];
+ pm_runtime_put_sync(pd_dev);
+ }
+}
+
+static int vdec_get_v1(struct device *dev)
+{
+ struct venus_core *core = dev_get_drvdata(dev);
+
+ return vcodec_clks_get(core, core->dev, core->vcodec0_clks,
+ core->res->vcodec0_clks);
+}
+
+static int vdec_power_v1(struct device *dev, int on)
+{
+ struct venus_core *core = dev_get_drvdata(dev);
+ int ret;
+
+ if (on == POWER_ON) {
+ ret = vcodec_domains_enable(core);
+ if (ret)
+ return ret;
+
+ ret = vcodec_clks_enable(core, core->vcodec0_clks);
+ if (ret)
+ goto err;
+ } else {
+ vcodec_domains_disable(core);
+ vcodec_clks_disable(core, core->vcodec0_clks);
+ }
+
+ return 0;
+err:
+ vcodec_domains_disable(core);
+ return ret;
+}
+static int venc_get_v1(struct device *dev)
+{
+ struct venus_core *core = dev_get_drvdata(dev);
+
+ return vcodec_clks_get(core, core->dev, core->vcodec1_clks,
+ core->res->vcodec1_clks);
+}
+
+static int venc_power_v1(struct device *dev, int on)
+{
+ struct venus_core *core = dev_get_drvdata(dev);
+ int ret;
+
+ if (on == POWER_ON) {
+ ret = vcodec_domains_enable(core);
+ if (ret)
+ return ret;
+
+ ret = vcodec_clks_enable(core, core->vcodec1_clks);
+ if (ret)
+ goto err;
+ } else {
+ vcodec_domains_disable(core);
+ vcodec_clks_disable(core, core->vcodec1_clks);
+ }
+
+ return 0;
+err:
+ vcodec_domains_disable(core);
return ret;
}
@@ -332,6 +469,10 @@ static const struct venus_pm_ops pm_ops_v1 = {
.core_get = core_get_v1,
.core_put = core_put_v1,
.core_power = core_power_v1,
+ .vdec_get = vdec_get_v1,
+ .vdec_power = vdec_power_v1,
+ .venc_get = venc_get_v1,
+ .venc_power = venc_power_v1,
.load_scale = load_scale_v1,
};
@@ -875,7 +1016,7 @@ static int venc_power_v4(struct device *dev, int on)
return ret;
}
-static int vcodec_domains_get(struct venus_core *core)
+static int vcodec_domains_get_v4(struct venus_core *core)
{
int ret;
struct device *dev = core->dev;
@@ -993,7 +1134,7 @@ static int core_get_v4(struct venus_core *core)
if (ret)
return ret;
- ret = vcodec_domains_get(core);
+ ret = vcodec_domains_get_v4(core);
if (ret)
return ret;
--
2.54.0
next prev parent reply other threads:[~2026-05-10 9:48 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <k-DF0RGht93wXW1P6HM3qlZuXIYqVpHIKYFu9l6z96km16C4l2xdRs_WRSg-CGedvnnjzaWo_VzIg05JKTNoIg==@protonmail.internalid>
2026-05-10 9:47 ` [PATCH v6 0/8] media: qcom: venus: add MSM8939 support Erikas Bitovtas
2026-05-10 9:47 ` [PATCH v6 1/8] media: dt-bindings: venus: Add qcom,msm8939 schema Erikas Bitovtas
2026-05-10 9:47 ` [PATCH v6 2/8] arm64: dts: qcom: msm8939: Add venus node Erikas Bitovtas
2026-05-10 9:47 ` [PATCH v6 3/8] arm64: dts: qcom: msm8939-longcheer-l9100: Enable " Erikas Bitovtas
2026-05-10 9:47 ` [PATCH v6 4/8] arm64: dts: qcom: msm8939-asus-z00t: add Venus Erikas Bitovtas
2026-05-10 9:47 ` [PATCH v6 5/8] clk: qcom: gcc-msm8939: mark Venus core GDSCs as hardware controlled Erikas Bitovtas
2026-05-12 10:01 ` Konrad Dybcio
2026-05-10 9:47 ` Erikas Bitovtas [this message]
2026-05-11 23:47 ` [PATCH v6 6/8] media: qcom: venus: add power domain enable logic for Venus cores sashiko-bot
2026-05-10 9:47 ` [PATCH v6 7/8] media: qcom: venus: Add msm8939 resource struct Erikas Bitovtas
2026-05-12 0:34 ` sashiko-bot
2026-05-10 9:47 ` [PATCH v6 8/8] media: qcom: venus: add codec blacklist mechanism Erikas Bitovtas
2026-05-12 9:17 ` [PATCH v6 0/8] media: qcom: venus: add MSM8939 support Bryan O'Donoghue
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=20260510-msm8939-venus-rfc-v6-6-e69465375900@gmail.com \
--to=xerikasxx@gmail.com \
--cc=andersson@kernel.org \
--cc=bmasney@redhat.com \
--cc=bod@kernel.org \
--cc=conor+dt@kernel.org \
--cc=devicetree@vger.kernel.org \
--cc=dikshita.agarwal@oss.qualcomm.com \
--cc=git@apitzsch.eu \
--cc=konradybcio@kernel.org \
--cc=krzk+dt@kernel.org \
--cc=linux-arm-msm@vger.kernel.org \
--cc=linux-clk@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-media@vger.kernel.org \
--cc=mchehab@kernel.org \
--cc=mturquette@baylibre.com \
--cc=phone-devel@vger.kernel.org \
--cc=robh@kernel.org \
--cc=sboyd@kernel.org \
--cc=vikash.garodia@oss.qualcomm.com \
--cc=~postmarketos/upstreaming@lists.sr.ht \
/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 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.