Message ID | 20230617103255.20239-3-yunfei.dong@mediatek.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | media: mediatek: vcodec: separate encoder and decoder | expand |
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; > }
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; }
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(-)