* Re: [PATCH v5, 5/8] media: mediatek: vcodec: Add venc power on/off function
@ 2022-08-13 23:20 kernel test robot
0 siblings, 0 replies; 3+ messages in thread
From: kernel test robot @ 2022-08-13 23:20 UTC (permalink / raw)
To: kbuild
[-- Attachment #1: Type: text/plain, Size: 5996 bytes --]
BCC: lkp(a)intel.com
CC: kbuild-all(a)lists.01.org
In-Reply-To: <20220729035129.3634-6-irui.wang@mediatek.com>
References: <20220729035129.3634-6-irui.wang@mediatek.com>
TO: Irui Wang <irui.wang@mediatek.com>
TO: Hans Verkuil <hverkuil@xs4all.nl>
TO: angelogioacchino.delregno(a)collabora.com
TO: Rob Herring <robh+dt@kernel.org>
TO: Mauro Carvalho Chehab <mchehab@kernel.org>
CC: linux-media(a)vger.kernel.org
TO: Matthias Brugger <matthias.bgg@gmail.com>
TO: Alexandre Courbot <acourbot@chromium.org>
TO: Tiffany Lin <tiffany.lin@mediatek.com>
TO: "Andrew-CT Chen" <andrew-ct.chen@mediatek.com>
TO: "Tzung-Bi Shih" <tzungbi@chromium.org>
TO: Tomasz Figa <tfiga@google.com>
TO: nicolas.dufresne(a)collabora.com
CC: Maoguang Meng <maoguang.meng@mediatek.com>
CC: Longfei Wang <longfei.wang@mediatek.com>
CC: Yunfei Dong <yunfei.dong@mediatek.com>
CC: Irui Wang <irui.wang@mediatek.com>
CC: devicetree(a)vger.kernel.org
CC: linux-kernel(a)vger.kernel.org
CC: linux-arm-kernel(a)lists.infradead.org
CC: linux-mediatek(a)lists.infradead.org
CC: Project_Global_Chrome_Upstream_Group(a)mediatek.com
Hi Irui,
Thank you for the patch! Perhaps something to improve:
[auto build test WARNING on media-tree/master]
[also build test WARNING on linus/master next-20220812]
[cannot apply to v5.19]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Irui-Wang/Support-H264-multi-core-encoder-on-MT8195/20220729-115415
base: git://linuxtv.org/media_tree.git master
:::::: branch date: 2 weeks ago
:::::: commit date: 2 weeks ago
config: arm-randconfig-m041-20220812 (https://download.01.org/0day-ci/archive/20220814/202208140736.FET1DQOx-lkp(a)intel.com/config)
compiler: arm-linux-gnueabi-gcc (GCC) 12.1.0
If you fix the issue, kindly add following tag where applicable
Reported-by: kernel test robot <lkp@intel.com>
Reported-by: Dan Carpenter <dan.carpenter@oracle.com>
smatch warnings:
drivers/media/platform/mediatek/vcodec/mtk_vcodec_enc_pm.c:77 mtk_enc_core_power_on() error: uninitialized symbol 'ret'.
vim +/ret +77 drivers/media/platform/mediatek/vcodec/mtk_vcodec_enc_pm.c
4e855a6efa5470d8 drivers/media/platform/mtk-vcodec/mtk_vcodec_enc_pm.c Tiffany Lin 2016-05-03 59
1fd72375b4f44395 drivers/media/platform/mediatek/vcodec/mtk_vcodec_enc_pm.c Irui Wang 2022-07-29 60 static int mtk_enc_core_power_on(struct mtk_vcodec_ctx *ctx)
1fd72375b4f44395 drivers/media/platform/mediatek/vcodec/mtk_vcodec_enc_pm.c Irui Wang 2022-07-29 61 {
1fd72375b4f44395 drivers/media/platform/mediatek/vcodec/mtk_vcodec_enc_pm.c Irui Wang 2022-07-29 62 struct mtk_venc_hw_dev *sub_core;
1fd72375b4f44395 drivers/media/platform/mediatek/vcodec/mtk_vcodec_enc_pm.c Irui Wang 2022-07-29 63 int ret, i;
1fd72375b4f44395 drivers/media/platform/mediatek/vcodec/mtk_vcodec_enc_pm.c Irui Wang 2022-07-29 64
1fd72375b4f44395 drivers/media/platform/mediatek/vcodec/mtk_vcodec_enc_pm.c Irui Wang 2022-07-29 65 /* multi-core encoding need power on all available cores */
1fd72375b4f44395 drivers/media/platform/mediatek/vcodec/mtk_vcodec_enc_pm.c Irui Wang 2022-07-29 66 for (i = 0; i < MTK_VENC_HW_MAX; i++) {
1fd72375b4f44395 drivers/media/platform/mediatek/vcodec/mtk_vcodec_enc_pm.c Irui Wang 2022-07-29 67 sub_core = (struct mtk_venc_hw_dev *)ctx->dev->enc_hw_dev[i];
1fd72375b4f44395 drivers/media/platform/mediatek/vcodec/mtk_vcodec_enc_pm.c Irui Wang 2022-07-29 68 if (!sub_core)
1fd72375b4f44395 drivers/media/platform/mediatek/vcodec/mtk_vcodec_enc_pm.c Irui Wang 2022-07-29 69 continue;
1fd72375b4f44395 drivers/media/platform/mediatek/vcodec/mtk_vcodec_enc_pm.c Irui Wang 2022-07-29 70
1fd72375b4f44395 drivers/media/platform/mediatek/vcodec/mtk_vcodec_enc_pm.c Irui Wang 2022-07-29 71 ret = pm_runtime_resume_and_get(&sub_core->plat_dev->dev);
1fd72375b4f44395 drivers/media/platform/mediatek/vcodec/mtk_vcodec_enc_pm.c Irui Wang 2022-07-29 72 if (ret) {
1fd72375b4f44395 drivers/media/platform/mediatek/vcodec/mtk_vcodec_enc_pm.c Irui Wang 2022-07-29 73 mtk_v4l2_err("power on sub_core[%d] fail %d", i, ret);
1fd72375b4f44395 drivers/media/platform/mediatek/vcodec/mtk_vcodec_enc_pm.c Irui Wang 2022-07-29 74 goto pm_on_fail;
1fd72375b4f44395 drivers/media/platform/mediatek/vcodec/mtk_vcodec_enc_pm.c Irui Wang 2022-07-29 75 }
1fd72375b4f44395 drivers/media/platform/mediatek/vcodec/mtk_vcodec_enc_pm.c Irui Wang 2022-07-29 76 }
1fd72375b4f44395 drivers/media/platform/mediatek/vcodec/mtk_vcodec_enc_pm.c Irui Wang 2022-07-29 @77 return ret;
1fd72375b4f44395 drivers/media/platform/mediatek/vcodec/mtk_vcodec_enc_pm.c Irui Wang 2022-07-29 78
1fd72375b4f44395 drivers/media/platform/mediatek/vcodec/mtk_vcodec_enc_pm.c Irui Wang 2022-07-29 79 pm_on_fail:
1fd72375b4f44395 drivers/media/platform/mediatek/vcodec/mtk_vcodec_enc_pm.c Irui Wang 2022-07-29 80 for (i -= 1; i >= 0; i--) {
1fd72375b4f44395 drivers/media/platform/mediatek/vcodec/mtk_vcodec_enc_pm.c Irui Wang 2022-07-29 81 sub_core = (struct mtk_venc_hw_dev *)ctx->dev->enc_hw_dev[i];
1fd72375b4f44395 drivers/media/platform/mediatek/vcodec/mtk_vcodec_enc_pm.c Irui Wang 2022-07-29 82 pm_runtime_put_sync(&sub_core->plat_dev->dev);
1fd72375b4f44395 drivers/media/platform/mediatek/vcodec/mtk_vcodec_enc_pm.c Irui Wang 2022-07-29 83 }
1fd72375b4f44395 drivers/media/platform/mediatek/vcodec/mtk_vcodec_enc_pm.c Irui Wang 2022-07-29 84 return ret;
1fd72375b4f44395 drivers/media/platform/mediatek/vcodec/mtk_vcodec_enc_pm.c Irui Wang 2022-07-29 85 }
1fd72375b4f44395 drivers/media/platform/mediatek/vcodec/mtk_vcodec_enc_pm.c Irui Wang 2022-07-29 86
--
0-DAY CI Kernel Test Service
https://01.org/lkp
^ permalink raw reply [flat|nested] 3+ messages in thread
* [PATCH v5, 5/8] media: mediatek: vcodec: Add venc power on/off function
2022-07-29 3:51 [PATCH v5, 0/8] Support H264 multi-core encoder on MT8195 Irui Wang
@ 2022-07-29 3:51 ` Irui Wang
0 siblings, 0 replies; 3+ messages in thread
From: Irui Wang @ 2022-07-29 3:51 UTC (permalink / raw)
To: Hans Verkuil, angelogioacchino.delregno, Rob Herring,
Mauro Carvalho Chehab, Matthias Brugger, Alexandre Courbot,
Tiffany Lin, Andrew-CT Chen, Tzung-Bi Shih, Tomasz Figa,
nicolas.dufresne
Cc: Maoguang Meng, Longfei Wang, Yunfei Dong, Irui Wang, linux-media,
devicetree, linux-kernel, linux-arm-kernel, linux-mediatek,
Project_Global_Chrome_Upstream_Group
when enable multi-core encoding, all available encoder cores' power need
to be on/off, add new functions for encoder cores' power management.
Signed-off-by: Irui Wang <irui.wang@mediatek.com>
---
.../platform/mediatek/vcodec/mtk_vcodec_enc.c | 31 +++----
.../mediatek/vcodec/mtk_vcodec_enc_pm.c | 83 +++++++++++++++++++
.../mediatek/vcodec/mtk_vcodec_enc_pm.h | 2 +
.../platform/mediatek/vcodec/venc_drv_if.c | 6 --
4 files changed, 97 insertions(+), 25 deletions(-)
diff --git a/drivers/media/platform/mediatek/vcodec/mtk_vcodec_enc.c b/drivers/media/platform/mediatek/vcodec/mtk_vcodec_enc.c
index 25e816863597..ad20f729ef6f 100644
--- a/drivers/media/platform/mediatek/vcodec/mtk_vcodec_enc.c
+++ b/drivers/media/platform/mediatek/vcodec/mtk_vcodec_enc.c
@@ -8,10 +8,10 @@
#include <media/v4l2-event.h>
#include <media/v4l2-mem2mem.h>
#include <media/videobuf2-dma-contig.h>
-#include <linux/pm_runtime.h>
#include "mtk_vcodec_drv.h"
#include "mtk_vcodec_enc.h"
+#include "mtk_vcodec_enc_pm.h"
#include "mtk_vcodec_intr.h"
#include "mtk_vcodec_util.h"
#include "venc_drv_if.h"
@@ -877,8 +877,7 @@ static int vb2ops_venc_start_streaming(struct vb2_queue *q, unsigned int count)
{
struct mtk_vcodec_ctx *ctx = vb2_get_drv_priv(q);
struct venc_enc_param param;
- int ret, pm_ret;
- int i;
+ int ret, i;
/* Once state turn into MTK_STATE_ABORT, we need stop_streaming
* to clear it
@@ -897,18 +896,12 @@ static int vb2ops_venc_start_streaming(struct vb2_queue *q, unsigned int count)
return 0;
}
- ret = pm_runtime_resume_and_get(&ctx->dev->plat_dev->dev);
- if (ret < 0) {
- mtk_v4l2_err("pm_runtime_resume_and_get fail %d", ret);
- goto err_start_stream;
- }
-
mtk_venc_set_param(ctx, ¶m);
ret = venc_if_set_param(ctx, VENC_SET_PARAM_ENC, ¶m);
if (ret) {
mtk_v4l2_err("venc_if_set_param failed=%d", ret);
ctx->state = MTK_STATE_ABORT;
- goto err_set_param;
+ goto err_start_stream;
}
ctx->param_change = MTK_ENCODE_PARAM_NONE;
@@ -921,17 +914,19 @@ static int vb2ops_venc_start_streaming(struct vb2_queue *q, unsigned int count)
if (ret) {
mtk_v4l2_err("venc_if_set_param failed=%d", ret);
ctx->state = MTK_STATE_ABORT;
- goto err_set_param;
+ goto err_start_stream;
}
ctx->state = MTK_STATE_HEADER;
}
- return 0;
+ ret = mtk_vcodec_enc_power_on(ctx);
+ if (ret) {
+ mtk_v4l2_err("mtk_vcodec_enc_power_on failed=%d", ret);
+ ctx->state = MTK_STATE_ABORT;
+ goto err_start_stream;
+ }
-err_set_param:
- pm_ret = pm_runtime_put(&ctx->dev->plat_dev->dev);
- if (pm_ret < 0)
- mtk_v4l2_err("pm_runtime_put fail %d", pm_ret);
+ return 0;
err_start_stream:
for (i = 0; i < q->num_buffers; ++i) {
@@ -1016,9 +1011,7 @@ static void vb2ops_venc_stop_streaming(struct vb2_queue *q)
if (ret)
mtk_v4l2_err("venc_if_deinit failed=%d", ret);
- ret = pm_runtime_put(&ctx->dev->plat_dev->dev);
- if (ret < 0)
- mtk_v4l2_err("pm_runtime_put fail %d", ret);
+ mtk_vcodec_enc_power_off(ctx);
ctx->state = MTK_STATE_FREE;
}
diff --git a/drivers/media/platform/mediatek/vcodec/mtk_vcodec_enc_pm.c b/drivers/media/platform/mediatek/vcodec/mtk_vcodec_enc_pm.c
index 75de5031d292..213c3f50e9eb 100644
--- a/drivers/media/platform/mediatek/vcodec/mtk_vcodec_enc_pm.c
+++ b/drivers/media/platform/mediatek/vcodec/mtk_vcodec_enc_pm.c
@@ -9,6 +9,7 @@
#include <linux/of_platform.h>
#include <linux/pm_runtime.h>
+#include "mtk_vcodec_enc_hw.h"
#include "mtk_vcodec_enc_pm.h"
#include "mtk_vcodec_util.h"
@@ -56,6 +57,88 @@ int mtk_vcodec_init_enc_clk(struct platform_device *pdev,
}
EXPORT_SYMBOL_GPL(mtk_vcodec_init_enc_clk);
+static int mtk_enc_core_power_on(struct mtk_vcodec_ctx *ctx)
+{
+ struct mtk_venc_hw_dev *sub_core;
+ int ret, i;
+
+ /* multi-core encoding need power on all available cores */
+ for (i = 0; i < MTK_VENC_HW_MAX; i++) {
+ sub_core = (struct mtk_venc_hw_dev *)ctx->dev->enc_hw_dev[i];
+ if (!sub_core)
+ continue;
+
+ ret = pm_runtime_resume_and_get(&sub_core->plat_dev->dev);
+ if (ret) {
+ mtk_v4l2_err("power on sub_core[%d] fail %d", i, ret);
+ goto pm_on_fail;
+ }
+ }
+ return ret;
+
+pm_on_fail:
+ for (i -= 1; i >= 0; i--) {
+ sub_core = (struct mtk_venc_hw_dev *)ctx->dev->enc_hw_dev[i];
+ pm_runtime_put_sync(&sub_core->plat_dev->dev);
+ }
+ return ret;
+}
+
+int mtk_vcodec_enc_power_on(struct mtk_vcodec_ctx *ctx)
+{
+ struct mtk_vcodec_pm *pm = &ctx->dev->pm;
+ int ret;
+
+ ret = pm_runtime_resume_and_get(pm->dev);
+ if (ret) {
+ mtk_v4l2_err("pm_runtime_resume_and_get fail %d", ret);
+ return ret;
+ }
+
+ if (IS_VENC_MULTICORE(ctx->dev->enc_capability)) {
+ ret = mtk_enc_core_power_on(ctx);
+ if (ret) {
+ mtk_v4l2_err("mtk_enc_core_power_on fail %d", ret);
+ goto core_error;
+ }
+ }
+ return ret;
+
+core_error:
+ pm_runtime_put_sync(pm->dev);
+ return ret;
+}
+
+static void mtk_enc_core_power_off(struct mtk_vcodec_ctx *ctx)
+{
+ struct mtk_venc_hw_dev *sub_core;
+ int ret, i;
+
+ /* multi-core encoding need power off all available cores */
+ for (i = 0; i < MTK_VENC_HW_MAX; i++) {
+ sub_core = (struct mtk_venc_hw_dev *)ctx->dev->enc_hw_dev[i];
+ if (!sub_core)
+ continue;
+
+ ret = pm_runtime_put_sync(&sub_core->plat_dev->dev);
+ if (ret)
+ mtk_v4l2_err("power off sub_core[%d] fail %d", i, ret);
+ }
+}
+
+void mtk_vcodec_enc_power_off(struct mtk_vcodec_ctx *ctx)
+{
+ struct mtk_vcodec_pm *pm = &ctx->dev->pm;
+ int ret;
+
+ if (IS_VENC_MULTICORE(ctx->dev->enc_capability))
+ mtk_enc_core_power_off(ctx);
+
+ ret = pm_runtime_put_sync(pm->dev);
+ if (ret)
+ mtk_v4l2_err("pm_runtime_put_sync fail %d", ret);
+}
+
void mtk_vcodec_enc_clock_on(struct mtk_vcodec_pm *pm)
{
struct mtk_vcodec_clk *enc_clk = &pm->venc_clk;
diff --git a/drivers/media/platform/mediatek/vcodec/mtk_vcodec_enc_pm.h b/drivers/media/platform/mediatek/vcodec/mtk_vcodec_enc_pm.h
index 361dec5be47f..9065dec4ed4f 100644
--- a/drivers/media/platform/mediatek/vcodec/mtk_vcodec_enc_pm.h
+++ b/drivers/media/platform/mediatek/vcodec/mtk_vcodec_enc_pm.h
@@ -12,6 +12,8 @@
int mtk_vcodec_init_enc_clk(struct platform_device *pdev,
struct mtk_vcodec_pm *pm);
+int mtk_vcodec_enc_power_on(struct mtk_vcodec_ctx *ctx);
+void mtk_vcodec_enc_power_off(struct mtk_vcodec_ctx *ctx);
void mtk_vcodec_enc_clock_on(struct mtk_vcodec_pm *pm);
void mtk_vcodec_enc_clock_off(struct mtk_vcodec_pm *pm);
diff --git a/drivers/media/platform/mediatek/vcodec/venc_drv_if.c b/drivers/media/platform/mediatek/vcodec/venc_drv_if.c
index ce0bce811615..65a27e39ef5b 100644
--- a/drivers/media/platform/mediatek/vcodec/venc_drv_if.c
+++ b/drivers/media/platform/mediatek/vcodec/venc_drv_if.c
@@ -32,9 +32,7 @@ int venc_if_init(struct mtk_vcodec_ctx *ctx, unsigned int fourcc)
}
mtk_venc_lock(ctx);
- mtk_vcodec_enc_clock_on(&ctx->dev->pm);
ret = ctx->enc_if->init(ctx);
- mtk_vcodec_enc_clock_off(&ctx->dev->pm);
mtk_venc_unlock(ctx);
return ret;
@@ -46,9 +44,7 @@ int venc_if_set_param(struct mtk_vcodec_ctx *ctx,
int ret = 0;
mtk_venc_lock(ctx);
- mtk_vcodec_enc_clock_on(&ctx->dev->pm);
ret = ctx->enc_if->set_param(ctx->drv_handle, type, in);
- mtk_vcodec_enc_clock_off(&ctx->dev->pm);
mtk_venc_unlock(ctx);
return ret;
@@ -89,9 +85,7 @@ int venc_if_deinit(struct mtk_vcodec_ctx *ctx)
return 0;
mtk_venc_lock(ctx);
- mtk_vcodec_enc_clock_on(&ctx->dev->pm);
ret = ctx->enc_if->deinit(ctx->drv_handle);
- mtk_vcodec_enc_clock_off(&ctx->dev->pm);
mtk_venc_unlock(ctx);
ctx->drv_handle = NULL;
--
2.18.0
^ permalink raw reply related [flat|nested] 3+ messages in thread
* [PATCH v5, 5/8] media: mediatek: vcodec: Add venc power on/off function
@ 2022-07-29 3:51 ` Irui Wang
0 siblings, 0 replies; 3+ messages in thread
From: Irui Wang @ 2022-07-29 3:51 UTC (permalink / raw)
To: Hans Verkuil, angelogioacchino.delregno, Rob Herring,
Mauro Carvalho Chehab, Matthias Brugger, Alexandre Courbot,
Tiffany Lin, Andrew-CT Chen, Tzung-Bi Shih, Tomasz Figa,
nicolas.dufresne
Cc: Maoguang Meng, Longfei Wang, Yunfei Dong, Irui Wang, linux-media,
devicetree, linux-kernel, linux-arm-kernel, linux-mediatek,
Project_Global_Chrome_Upstream_Group
when enable multi-core encoding, all available encoder cores' power need
to be on/off, add new functions for encoder cores' power management.
Signed-off-by: Irui Wang <irui.wang@mediatek.com>
---
.../platform/mediatek/vcodec/mtk_vcodec_enc.c | 31 +++----
.../mediatek/vcodec/mtk_vcodec_enc_pm.c | 83 +++++++++++++++++++
.../mediatek/vcodec/mtk_vcodec_enc_pm.h | 2 +
.../platform/mediatek/vcodec/venc_drv_if.c | 6 --
4 files changed, 97 insertions(+), 25 deletions(-)
diff --git a/drivers/media/platform/mediatek/vcodec/mtk_vcodec_enc.c b/drivers/media/platform/mediatek/vcodec/mtk_vcodec_enc.c
index 25e816863597..ad20f729ef6f 100644
--- a/drivers/media/platform/mediatek/vcodec/mtk_vcodec_enc.c
+++ b/drivers/media/platform/mediatek/vcodec/mtk_vcodec_enc.c
@@ -8,10 +8,10 @@
#include <media/v4l2-event.h>
#include <media/v4l2-mem2mem.h>
#include <media/videobuf2-dma-contig.h>
-#include <linux/pm_runtime.h>
#include "mtk_vcodec_drv.h"
#include "mtk_vcodec_enc.h"
+#include "mtk_vcodec_enc_pm.h"
#include "mtk_vcodec_intr.h"
#include "mtk_vcodec_util.h"
#include "venc_drv_if.h"
@@ -877,8 +877,7 @@ static int vb2ops_venc_start_streaming(struct vb2_queue *q, unsigned int count)
{
struct mtk_vcodec_ctx *ctx = vb2_get_drv_priv(q);
struct venc_enc_param param;
- int ret, pm_ret;
- int i;
+ int ret, i;
/* Once state turn into MTK_STATE_ABORT, we need stop_streaming
* to clear it
@@ -897,18 +896,12 @@ static int vb2ops_venc_start_streaming(struct vb2_queue *q, unsigned int count)
return 0;
}
- ret = pm_runtime_resume_and_get(&ctx->dev->plat_dev->dev);
- if (ret < 0) {
- mtk_v4l2_err("pm_runtime_resume_and_get fail %d", ret);
- goto err_start_stream;
- }
-
mtk_venc_set_param(ctx, ¶m);
ret = venc_if_set_param(ctx, VENC_SET_PARAM_ENC, ¶m);
if (ret) {
mtk_v4l2_err("venc_if_set_param failed=%d", ret);
ctx->state = MTK_STATE_ABORT;
- goto err_set_param;
+ goto err_start_stream;
}
ctx->param_change = MTK_ENCODE_PARAM_NONE;
@@ -921,17 +914,19 @@ static int vb2ops_venc_start_streaming(struct vb2_queue *q, unsigned int count)
if (ret) {
mtk_v4l2_err("venc_if_set_param failed=%d", ret);
ctx->state = MTK_STATE_ABORT;
- goto err_set_param;
+ goto err_start_stream;
}
ctx->state = MTK_STATE_HEADER;
}
- return 0;
+ ret = mtk_vcodec_enc_power_on(ctx);
+ if (ret) {
+ mtk_v4l2_err("mtk_vcodec_enc_power_on failed=%d", ret);
+ ctx->state = MTK_STATE_ABORT;
+ goto err_start_stream;
+ }
-err_set_param:
- pm_ret = pm_runtime_put(&ctx->dev->plat_dev->dev);
- if (pm_ret < 0)
- mtk_v4l2_err("pm_runtime_put fail %d", pm_ret);
+ return 0;
err_start_stream:
for (i = 0; i < q->num_buffers; ++i) {
@@ -1016,9 +1011,7 @@ static void vb2ops_venc_stop_streaming(struct vb2_queue *q)
if (ret)
mtk_v4l2_err("venc_if_deinit failed=%d", ret);
- ret = pm_runtime_put(&ctx->dev->plat_dev->dev);
- if (ret < 0)
- mtk_v4l2_err("pm_runtime_put fail %d", ret);
+ mtk_vcodec_enc_power_off(ctx);
ctx->state = MTK_STATE_FREE;
}
diff --git a/drivers/media/platform/mediatek/vcodec/mtk_vcodec_enc_pm.c b/drivers/media/platform/mediatek/vcodec/mtk_vcodec_enc_pm.c
index 75de5031d292..213c3f50e9eb 100644
--- a/drivers/media/platform/mediatek/vcodec/mtk_vcodec_enc_pm.c
+++ b/drivers/media/platform/mediatek/vcodec/mtk_vcodec_enc_pm.c
@@ -9,6 +9,7 @@
#include <linux/of_platform.h>
#include <linux/pm_runtime.h>
+#include "mtk_vcodec_enc_hw.h"
#include "mtk_vcodec_enc_pm.h"
#include "mtk_vcodec_util.h"
@@ -56,6 +57,88 @@ int mtk_vcodec_init_enc_clk(struct platform_device *pdev,
}
EXPORT_SYMBOL_GPL(mtk_vcodec_init_enc_clk);
+static int mtk_enc_core_power_on(struct mtk_vcodec_ctx *ctx)
+{
+ struct mtk_venc_hw_dev *sub_core;
+ int ret, i;
+
+ /* multi-core encoding need power on all available cores */
+ for (i = 0; i < MTK_VENC_HW_MAX; i++) {
+ sub_core = (struct mtk_venc_hw_dev *)ctx->dev->enc_hw_dev[i];
+ if (!sub_core)
+ continue;
+
+ ret = pm_runtime_resume_and_get(&sub_core->plat_dev->dev);
+ if (ret) {
+ mtk_v4l2_err("power on sub_core[%d] fail %d", i, ret);
+ goto pm_on_fail;
+ }
+ }
+ return ret;
+
+pm_on_fail:
+ for (i -= 1; i >= 0; i--) {
+ sub_core = (struct mtk_venc_hw_dev *)ctx->dev->enc_hw_dev[i];
+ pm_runtime_put_sync(&sub_core->plat_dev->dev);
+ }
+ return ret;
+}
+
+int mtk_vcodec_enc_power_on(struct mtk_vcodec_ctx *ctx)
+{
+ struct mtk_vcodec_pm *pm = &ctx->dev->pm;
+ int ret;
+
+ ret = pm_runtime_resume_and_get(pm->dev);
+ if (ret) {
+ mtk_v4l2_err("pm_runtime_resume_and_get fail %d", ret);
+ return ret;
+ }
+
+ if (IS_VENC_MULTICORE(ctx->dev->enc_capability)) {
+ ret = mtk_enc_core_power_on(ctx);
+ if (ret) {
+ mtk_v4l2_err("mtk_enc_core_power_on fail %d", ret);
+ goto core_error;
+ }
+ }
+ return ret;
+
+core_error:
+ pm_runtime_put_sync(pm->dev);
+ return ret;
+}
+
+static void mtk_enc_core_power_off(struct mtk_vcodec_ctx *ctx)
+{
+ struct mtk_venc_hw_dev *sub_core;
+ int ret, i;
+
+ /* multi-core encoding need power off all available cores */
+ for (i = 0; i < MTK_VENC_HW_MAX; i++) {
+ sub_core = (struct mtk_venc_hw_dev *)ctx->dev->enc_hw_dev[i];
+ if (!sub_core)
+ continue;
+
+ ret = pm_runtime_put_sync(&sub_core->plat_dev->dev);
+ if (ret)
+ mtk_v4l2_err("power off sub_core[%d] fail %d", i, ret);
+ }
+}
+
+void mtk_vcodec_enc_power_off(struct mtk_vcodec_ctx *ctx)
+{
+ struct mtk_vcodec_pm *pm = &ctx->dev->pm;
+ int ret;
+
+ if (IS_VENC_MULTICORE(ctx->dev->enc_capability))
+ mtk_enc_core_power_off(ctx);
+
+ ret = pm_runtime_put_sync(pm->dev);
+ if (ret)
+ mtk_v4l2_err("pm_runtime_put_sync fail %d", ret);
+}
+
void mtk_vcodec_enc_clock_on(struct mtk_vcodec_pm *pm)
{
struct mtk_vcodec_clk *enc_clk = &pm->venc_clk;
diff --git a/drivers/media/platform/mediatek/vcodec/mtk_vcodec_enc_pm.h b/drivers/media/platform/mediatek/vcodec/mtk_vcodec_enc_pm.h
index 361dec5be47f..9065dec4ed4f 100644
--- a/drivers/media/platform/mediatek/vcodec/mtk_vcodec_enc_pm.h
+++ b/drivers/media/platform/mediatek/vcodec/mtk_vcodec_enc_pm.h
@@ -12,6 +12,8 @@
int mtk_vcodec_init_enc_clk(struct platform_device *pdev,
struct mtk_vcodec_pm *pm);
+int mtk_vcodec_enc_power_on(struct mtk_vcodec_ctx *ctx);
+void mtk_vcodec_enc_power_off(struct mtk_vcodec_ctx *ctx);
void mtk_vcodec_enc_clock_on(struct mtk_vcodec_pm *pm);
void mtk_vcodec_enc_clock_off(struct mtk_vcodec_pm *pm);
diff --git a/drivers/media/platform/mediatek/vcodec/venc_drv_if.c b/drivers/media/platform/mediatek/vcodec/venc_drv_if.c
index ce0bce811615..65a27e39ef5b 100644
--- a/drivers/media/platform/mediatek/vcodec/venc_drv_if.c
+++ b/drivers/media/platform/mediatek/vcodec/venc_drv_if.c
@@ -32,9 +32,7 @@ int venc_if_init(struct mtk_vcodec_ctx *ctx, unsigned int fourcc)
}
mtk_venc_lock(ctx);
- mtk_vcodec_enc_clock_on(&ctx->dev->pm);
ret = ctx->enc_if->init(ctx);
- mtk_vcodec_enc_clock_off(&ctx->dev->pm);
mtk_venc_unlock(ctx);
return ret;
@@ -46,9 +44,7 @@ int venc_if_set_param(struct mtk_vcodec_ctx *ctx,
int ret = 0;
mtk_venc_lock(ctx);
- mtk_vcodec_enc_clock_on(&ctx->dev->pm);
ret = ctx->enc_if->set_param(ctx->drv_handle, type, in);
- mtk_vcodec_enc_clock_off(&ctx->dev->pm);
mtk_venc_unlock(ctx);
return ret;
@@ -89,9 +85,7 @@ int venc_if_deinit(struct mtk_vcodec_ctx *ctx)
return 0;
mtk_venc_lock(ctx);
- mtk_vcodec_enc_clock_on(&ctx->dev->pm);
ret = ctx->enc_if->deinit(ctx->drv_handle);
- mtk_vcodec_enc_clock_off(&ctx->dev->pm);
mtk_venc_unlock(ctx);
ctx->drv_handle = NULL;
--
2.18.0
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
^ permalink raw reply related [flat|nested] 3+ messages in thread
end of thread, other threads:[~2022-08-13 23:20 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-08-13 23:20 [PATCH v5, 5/8] media: mediatek: vcodec: Add venc power on/off function kernel test robot
-- strict thread matches above, loose matches on Subject: below --
2022-07-29 3:51 [PATCH v5, 0/8] Support H264 multi-core encoder on MT8195 Irui Wang
2022-07-29 3:51 ` [PATCH v5, 5/8] media: mediatek: vcodec: Add venc power on/off function Irui Wang
2022-07-29 3:51 ` Irui Wang
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.