[v3,02/11] media: mediatek: vcodec: align fw interface
Commit Message
Align scp and vpu firmware interface, remove the depedency for
'struct mtk_vcodec_dev' and 'struct mtk_vcodec_ctx'. It will be
much easier to separate video encoder and decoder.
Signed-off-by: Yunfei Dong <yunfei.dong@mediatek.com>
---
.../media/platform/mediatek/vcodec/mtk_vcodec_fw.c | 7 +++----
.../media/platform/mediatek/vcodec/mtk_vcodec_fw.h | 3 +--
.../platform/mediatek/vcodec/mtk_vcodec_fw_priv.h | 11 +++++------
.../platform/mediatek/vcodec/mtk_vcodec_fw_scp.c | 9 ++++++---
.../platform/mediatek/vcodec/mtk_vcodec_fw_vpu.c | 12 ++++++++----
5 files changed, 23 insertions(+), 19 deletions(-)
Comments
Le samedi 17 juin 2023 à 18:32 +0800, Yunfei Dong a écrit :
> Align scp and vpu firmware interface, remove the depedency for
> 'struct mtk_vcodec_dev' and 'struct mtk_vcodec_ctx'. It will be
> much easier to separate video encoder and decoder.
>
> Signed-off-by: Yunfei Dong <yunfei.dong@mediatek.com>
Reviewed-by: Nicolas Dufresne <nicolas.dufresne@collabora.com>
> ---
> .../media/platform/mediatek/vcodec/mtk_vcodec_fw.c | 7 +++----
> .../media/platform/mediatek/vcodec/mtk_vcodec_fw.h | 3 +--
> .../platform/mediatek/vcodec/mtk_vcodec_fw_priv.h | 11 +++++------
> .../platform/mediatek/vcodec/mtk_vcodec_fw_scp.c | 9 ++++++---
> .../platform/mediatek/vcodec/mtk_vcodec_fw_vpu.c | 12 ++++++++----
> 5 files changed, 23 insertions(+), 19 deletions(-)
>
> diff --git a/drivers/media/platform/mediatek/vcodec/mtk_vcodec_fw.c b/drivers/media/platform/mediatek/vcodec/mtk_vcodec_fw.c
> index 556e54aadac9..be9159acacf8 100644
> --- a/drivers/media/platform/mediatek/vcodec/mtk_vcodec_fw.c
> +++ b/drivers/media/platform/mediatek/vcodec/mtk_vcodec_fw.c
> @@ -5,15 +5,14 @@
> #include "mtk_vcodec_util.h"
> #include "mtk_vcodec_drv.h"
>
> -struct mtk_vcodec_fw *mtk_vcodec_fw_select(struct mtk_vcodec_dev *dev,
> - enum mtk_vcodec_fw_type type,
> +struct mtk_vcodec_fw *mtk_vcodec_fw_select(void *priv, enum mtk_vcodec_fw_type type,
> enum mtk_vcodec_fw_use fw_use)
> {
> switch (type) {
> case VPU:
> - return mtk_vcodec_fw_vpu_init(dev, fw_use);
> + return mtk_vcodec_fw_vpu_init(priv, fw_use);
> case SCP:
> - return mtk_vcodec_fw_scp_init(dev);
> + return mtk_vcodec_fw_scp_init(priv, fw_use);
> default:
> mtk_v4l2_err("invalid vcodec fw type");
> return ERR_PTR(-EINVAL);
> diff --git a/drivers/media/platform/mediatek/vcodec/mtk_vcodec_fw.h b/drivers/media/platform/mediatek/vcodec/mtk_vcodec_fw.h
> index 16824114657f..d8cfbec323d5 100644
> --- a/drivers/media/platform/mediatek/vcodec/mtk_vcodec_fw.h
> +++ b/drivers/media/platform/mediatek/vcodec/mtk_vcodec_fw.h
> @@ -25,8 +25,7 @@ struct mtk_vcodec_fw;
> typedef void (*mtk_vcodec_ipi_handler) (void *data,
> unsigned int len, void *priv);
>
> -struct mtk_vcodec_fw *mtk_vcodec_fw_select(struct mtk_vcodec_dev *dev,
> - enum mtk_vcodec_fw_type type,
> +struct mtk_vcodec_fw *mtk_vcodec_fw_select(void *priv, enum mtk_vcodec_fw_type type,
> enum mtk_vcodec_fw_use fw_use);
> void mtk_vcodec_fw_release(struct mtk_vcodec_fw *fw);
>
> diff --git a/drivers/media/platform/mediatek/vcodec/mtk_vcodec_fw_priv.h b/drivers/media/platform/mediatek/vcodec/mtk_vcodec_fw_priv.h
> index b41e66185cec..3438a4917344 100644
> --- a/drivers/media/platform/mediatek/vcodec/mtk_vcodec_fw_priv.h
> +++ b/drivers/media/platform/mediatek/vcodec/mtk_vcodec_fw_priv.h
> @@ -12,6 +12,7 @@ struct mtk_vcodec_fw {
> const struct mtk_vcodec_fw_ops *ops;
> struct platform_device *pdev;
> struct mtk_scp *scp;
> + enum mtk_vcodec_fw_use fw_use;
> };
>
> struct mtk_vcodec_fw_ops {
> @@ -28,22 +29,20 @@ struct mtk_vcodec_fw_ops {
> };
>
> #if IS_ENABLED(CONFIG_VIDEO_MEDIATEK_VCODEC_VPU)
> -struct mtk_vcodec_fw *mtk_vcodec_fw_vpu_init(struct mtk_vcodec_dev *dev,
> - enum mtk_vcodec_fw_use fw_use);
> +struct mtk_vcodec_fw *mtk_vcodec_fw_vpu_init(void *priv, enum mtk_vcodec_fw_use fw_use);
> #else
> static inline struct mtk_vcodec_fw *
> -mtk_vcodec_fw_vpu_init(struct mtk_vcodec_dev *dev,
> - enum mtk_vcodec_fw_use fw_use)
> +mtk_vcodec_fw_vpu_init(void *priv, enum mtk_vcodec_fw_use fw_use)
> {
> return ERR_PTR(-ENODEV);
> }
> #endif /* CONFIG_VIDEO_MEDIATEK_VCODEC_VPU */
>
> #if IS_ENABLED(CONFIG_VIDEO_MEDIATEK_VCODEC_SCP)
> -struct mtk_vcodec_fw *mtk_vcodec_fw_scp_init(struct mtk_vcodec_dev *dev);
> +struct mtk_vcodec_fw *mtk_vcodec_fw_scp_init(void *priv, enum mtk_vcodec_fw_use fw_use);
> #else
> static inline struct mtk_vcodec_fw *
> -mtk_vcodec_fw_scp_init(struct mtk_vcodec_dev *dev)
> +mtk_vcodec_fw_scp_init(void *priv, enum mtk_vcodec_fw_use fw_use)
> {
> return ERR_PTR(-ENODEV);
> }
> diff --git a/drivers/media/platform/mediatek/vcodec/mtk_vcodec_fw_scp.c b/drivers/media/platform/mediatek/vcodec/mtk_vcodec_fw_scp.c
> index d8e66b645bd8..9a2472442c6f 100644
> --- a/drivers/media/platform/mediatek/vcodec/mtk_vcodec_fw_scp.c
> +++ b/drivers/media/platform/mediatek/vcodec/mtk_vcodec_fw_scp.c
> @@ -53,18 +53,21 @@ static const struct mtk_vcodec_fw_ops mtk_vcodec_rproc_msg = {
> .release = mtk_vcodec_scp_release,
> };
>
> -struct mtk_vcodec_fw *mtk_vcodec_fw_scp_init(struct mtk_vcodec_dev *dev)
> +struct mtk_vcodec_fw *mtk_vcodec_fw_scp_init(void *priv, enum mtk_vcodec_fw_use fw_use)
> {
> struct mtk_vcodec_fw *fw;
> + struct mtk_vcodec_dev *dev = priv;
> + struct platform_device *plat_dev;
> struct mtk_scp *scp;
>
> - scp = scp_get(dev->plat_dev);
> + plat_dev = dev->plat_dev;
> + scp = scp_get(plat_dev);
> if (!scp) {
> mtk_v4l2_err("could not get vdec scp handle");
> return ERR_PTR(-EPROBE_DEFER);
> }
>
> - fw = devm_kzalloc(&dev->plat_dev->dev, sizeof(*fw), GFP_KERNEL);
> + fw = devm_kzalloc(&plat_dev->dev, sizeof(*fw), GFP_KERNEL);
> fw->type = SCP;
> fw->ops = &mtk_vcodec_rproc_msg;
> fw->scp = scp;
> diff --git a/drivers/media/platform/mediatek/vcodec/mtk_vcodec_fw_vpu.c b/drivers/media/platform/mediatek/vcodec/mtk_vcodec_fw_vpu.c
> index cfc7ebed8fb7..46a028031133 100644
> --- a/drivers/media/platform/mediatek/vcodec/mtk_vcodec_fw_vpu.c
> +++ b/drivers/media/platform/mediatek/vcodec/mtk_vcodec_fw_vpu.c
> @@ -77,10 +77,11 @@ static const struct mtk_vcodec_fw_ops mtk_vcodec_vpu_msg = {
> .release = mtk_vcodec_vpu_release,
> };
>
> -struct mtk_vcodec_fw *mtk_vcodec_fw_vpu_init(struct mtk_vcodec_dev *dev,
> - enum mtk_vcodec_fw_use fw_use)
> +struct mtk_vcodec_fw *mtk_vcodec_fw_vpu_init(void *priv, enum mtk_vcodec_fw_use fw_use)
> {
> struct platform_device *fw_pdev;
> + struct mtk_vcodec_dev *dev = priv;
> + struct platform_device *plat_dev;
> struct mtk_vcodec_fw *fw;
> enum rst_id rst_id;
>
> @@ -94,19 +95,22 @@ struct mtk_vcodec_fw *mtk_vcodec_fw_vpu_init(struct mtk_vcodec_dev *dev,
> break;
> }
>
> - fw_pdev = vpu_get_plat_device(dev->plat_dev);
> + plat_dev = dev->plat_dev;
> + fw_pdev = vpu_get_plat_device(plat_dev);
> if (!fw_pdev) {
> mtk_v4l2_err("firmware device is not ready");
> return ERR_PTR(-EINVAL);
> }
> +
> vpu_wdt_reg_handler(fw_pdev, mtk_vcodec_vpu_reset_handler, dev, rst_id);
>
> - fw = devm_kzalloc(&dev->plat_dev->dev, sizeof(*fw), GFP_KERNEL);
> + fw = devm_kzalloc(&plat_dev->dev, sizeof(*fw), GFP_KERNEL);
> if (!fw)
> return ERR_PTR(-ENOMEM);
> fw->type = VPU;
> fw->ops = &mtk_vcodec_vpu_msg;
> fw->pdev = fw_pdev;
> + fw->fw_use = fw_use;
>
> return fw;
> }
@@ -5,15 +5,14 @@
#include "mtk_vcodec_util.h"
#include "mtk_vcodec_drv.h"
-struct mtk_vcodec_fw *mtk_vcodec_fw_select(struct mtk_vcodec_dev *dev,
- enum mtk_vcodec_fw_type type,
+struct mtk_vcodec_fw *mtk_vcodec_fw_select(void *priv, enum mtk_vcodec_fw_type type,
enum mtk_vcodec_fw_use fw_use)
{
switch (type) {
case VPU:
- return mtk_vcodec_fw_vpu_init(dev, fw_use);
+ return mtk_vcodec_fw_vpu_init(priv, fw_use);
case SCP:
- return mtk_vcodec_fw_scp_init(dev);
+ return mtk_vcodec_fw_scp_init(priv, fw_use);
default:
mtk_v4l2_err("invalid vcodec fw type");
return ERR_PTR(-EINVAL);
@@ -25,8 +25,7 @@ struct mtk_vcodec_fw;
typedef void (*mtk_vcodec_ipi_handler) (void *data,
unsigned int len, void *priv);
-struct mtk_vcodec_fw *mtk_vcodec_fw_select(struct mtk_vcodec_dev *dev,
- enum mtk_vcodec_fw_type type,
+struct mtk_vcodec_fw *mtk_vcodec_fw_select(void *priv, enum mtk_vcodec_fw_type type,
enum mtk_vcodec_fw_use fw_use);
void mtk_vcodec_fw_release(struct mtk_vcodec_fw *fw);
@@ -12,6 +12,7 @@ struct mtk_vcodec_fw {
const struct mtk_vcodec_fw_ops *ops;
struct platform_device *pdev;
struct mtk_scp *scp;
+ enum mtk_vcodec_fw_use fw_use;
};
struct mtk_vcodec_fw_ops {
@@ -28,22 +29,20 @@ struct mtk_vcodec_fw_ops {
};
#if IS_ENABLED(CONFIG_VIDEO_MEDIATEK_VCODEC_VPU)
-struct mtk_vcodec_fw *mtk_vcodec_fw_vpu_init(struct mtk_vcodec_dev *dev,
- enum mtk_vcodec_fw_use fw_use);
+struct mtk_vcodec_fw *mtk_vcodec_fw_vpu_init(void *priv, enum mtk_vcodec_fw_use fw_use);
#else
static inline struct mtk_vcodec_fw *
-mtk_vcodec_fw_vpu_init(struct mtk_vcodec_dev *dev,
- enum mtk_vcodec_fw_use fw_use)
+mtk_vcodec_fw_vpu_init(void *priv, enum mtk_vcodec_fw_use fw_use)
{
return ERR_PTR(-ENODEV);
}
#endif /* CONFIG_VIDEO_MEDIATEK_VCODEC_VPU */
#if IS_ENABLED(CONFIG_VIDEO_MEDIATEK_VCODEC_SCP)
-struct mtk_vcodec_fw *mtk_vcodec_fw_scp_init(struct mtk_vcodec_dev *dev);
+struct mtk_vcodec_fw *mtk_vcodec_fw_scp_init(void *priv, enum mtk_vcodec_fw_use fw_use);
#else
static inline struct mtk_vcodec_fw *
-mtk_vcodec_fw_scp_init(struct mtk_vcodec_dev *dev)
+mtk_vcodec_fw_scp_init(void *priv, enum mtk_vcodec_fw_use fw_use)
{
return ERR_PTR(-ENODEV);
}
@@ -53,18 +53,21 @@ static const struct mtk_vcodec_fw_ops mtk_vcodec_rproc_msg = {
.release = mtk_vcodec_scp_release,
};
-struct mtk_vcodec_fw *mtk_vcodec_fw_scp_init(struct mtk_vcodec_dev *dev)
+struct mtk_vcodec_fw *mtk_vcodec_fw_scp_init(void *priv, enum mtk_vcodec_fw_use fw_use)
{
struct mtk_vcodec_fw *fw;
+ struct mtk_vcodec_dev *dev = priv;
+ struct platform_device *plat_dev;
struct mtk_scp *scp;
- scp = scp_get(dev->plat_dev);
+ plat_dev = dev->plat_dev;
+ scp = scp_get(plat_dev);
if (!scp) {
mtk_v4l2_err("could not get vdec scp handle");
return ERR_PTR(-EPROBE_DEFER);
}
- fw = devm_kzalloc(&dev->plat_dev->dev, sizeof(*fw), GFP_KERNEL);
+ fw = devm_kzalloc(&plat_dev->dev, sizeof(*fw), GFP_KERNEL);
fw->type = SCP;
fw->ops = &mtk_vcodec_rproc_msg;
fw->scp = scp;
@@ -77,10 +77,11 @@ static const struct mtk_vcodec_fw_ops mtk_vcodec_vpu_msg = {
.release = mtk_vcodec_vpu_release,
};
-struct mtk_vcodec_fw *mtk_vcodec_fw_vpu_init(struct mtk_vcodec_dev *dev,
- enum mtk_vcodec_fw_use fw_use)
+struct mtk_vcodec_fw *mtk_vcodec_fw_vpu_init(void *priv, enum mtk_vcodec_fw_use fw_use)
{
struct platform_device *fw_pdev;
+ struct mtk_vcodec_dev *dev = priv;
+ struct platform_device *plat_dev;
struct mtk_vcodec_fw *fw;
enum rst_id rst_id;
@@ -94,19 +95,22 @@ struct mtk_vcodec_fw *mtk_vcodec_fw_vpu_init(struct mtk_vcodec_dev *dev,
break;
}
- fw_pdev = vpu_get_plat_device(dev->plat_dev);
+ plat_dev = dev->plat_dev;
+ fw_pdev = vpu_get_plat_device(plat_dev);
if (!fw_pdev) {
mtk_v4l2_err("firmware device is not ready");
return ERR_PTR(-EINVAL);
}
+
vpu_wdt_reg_handler(fw_pdev, mtk_vcodec_vpu_reset_handler, dev, rst_id);
- fw = devm_kzalloc(&dev->plat_dev->dev, sizeof(*fw), GFP_KERNEL);
+ fw = devm_kzalloc(&plat_dev->dev, sizeof(*fw), GFP_KERNEL);
if (!fw)
return ERR_PTR(-ENOMEM);
fw->type = VPU;
fw->ops = &mtk_vcodec_vpu_msg;
fw->pdev = fw_pdev;
+ fw->fw_use = fw_use;
return fw;
}