All of lore.kernel.org
 help / color / mirror / Atom feed
From: Enric Balletbo Serra <eballetbo@gmail.com>
To: Eizan Miyamoto <eizan@chromium.org>
Cc: linux-kernel <linux-kernel@vger.kernel.org>,
	Chen-Yu Tsai <wenst@chromium.org>,
	Houlong Wei <houlong.wei@mediatek.com>,
	Yong Wu <yong.wu@mediatek.com>,
	Enric Balletbo i Serra <enric.balletbo@collabora.com>,
	devicetree <devicetree@vger.kernel.org>,
	Chun-Kuang Hu <chunkuang.hu@kernel.org>,
	Andrew-CT Chen <andrew-ct.chen@mediatek.com>,
	Matthias Brugger <matthias.bgg@gmail.com>,
	Mauro Carvalho Chehab <mchehab@kernel.org>,
	Minghsiu Tsai <minghsiu.tsai@mediatek.com>,
	Linux ARM <linux-arm-kernel@lists.infradead.org>,
	Linux Media Mailing List <linux-media@vger.kernel.org>,
	"moderated list:ARM/Mediatek SoC support" 
	<linux-mediatek@lists.infradead.org>
Subject: Re: [PATCH v6 4/9] media: mtk-mdp: don't pm_run_time_get/put for master comp in clock_on
Date: Tue, 3 Aug 2021 12:27:03 +0200	[thread overview]
Message-ID: <CAFqH_50or=_pb7UDCvoPEoA7s1r6qNTNnMuo4pPuFfGqj4d50w@mail.gmail.com> (raw)
In-Reply-To: <20210802220943.v6.4.Ifd87681955689a08cce4c65e72ee5e8c6d09af95@changeid>

Hi Eizan,

Thank you for your patch.

Missatge de Eizan Miyamoto <eizan@chromium.org> del dia dl., 2 d’ag.
2021 a les 14:13:

>
> The original intent of commit 86698b9505bbc ("media: mtk-mdp: convert
> mtk_mdp_dev.comp array to list") was to create a list to track all the
> MDP components that needed to have their clocks enabled/disabled when
> calling mtk_mdp_comp_clock_on/off. However, there was a bug inside
> mtk_mdp_register_component where the args to a call to list_add were
> swapped. The result is that only one component was added to
> mtk_mdp_dev.comp_list because comp_list was instead being
> repeatedly added to the single element lists headed by each
> mtk_mdp_comp.
>
> The order of the args to list_add in mtk_mdp_register_component was
> fixed in https://patchwork.kernel.org/patch/11742895/ (Fix Null pointer
> dereference when calling list_add).
>
> Then, as a result of https://patchwork.kernel.org/patch/11530769/
> (mtk-mdp: use pm_runtime in MDP component driver) if all the components
> are added to the component list, the mdp "master" / rdma0 component
> ends up having pm_runtime_get_sync() called on it twice recursively:
>
>     rpm_resume+0x694/0x8f8
>     __pm_runtime_resume+0x7c/0xa0 ***NOTE***
>     mtk_mdp_comp_clock_on+0x48/0x104 [mtk_mdp]
>     mtk_mdp_pm_resume+0x2c/0x44 [mtk_mdp]
>     pm_generic_runtime_resume+0x34/0x48
>     __genpd_runtime_resume+0x6c/0x80
>     genpd_runtime_resume+0x104/0x1ac
>     __rpm_callback+0x120/0x238
>     rpm_callback+0x34/0x8c
>     rpm_resume+0x7a0/0x8f8
>     __pm_runtime_resume+0x7c/0xa0 ***NOTE***
>     mtk_mdp_m2m_start_streaming+0x2c/0x3c [mtk_mdp]
>
> (The calls to pm_runtime_get_sync are inlined and correspond to the
> calls to __pm_runtime_resume). It is not correct to have
> pm_runtime_get_sync called recursively and the second call will block
> indefinitely.
>
> As a result of all that, this change factors mtk_mdp_comp_clock_on/off
> into mtk_mdp_comp_power_on/off and moves the calls to
> pm_runtime_get/put into the power_on/off functions.
>
> This change then special-cases the master/rdma0 MDP component and does
> these things:
> - the master/rdma0 component is not added to mtk_mdp_dev.comp_list
> - the master/rdma0 component has its clocks (*but not power*) toggled
>   by mtk_mpd_comp_clock_on/off inside mtk_mdp_clock_on/off.
> - the other components have their clocks *and* power toggled with
>   mtk_mdp_comp_power_on/off.
>
> This change introduces the assumption that mtk_mdp_pm_resume will
> always be called though a callback from pm_runtime_get_sync made on the
> master / rdma0 component.
>
> Signed-off-by: Eizan Miyamoto <eizan@chromium.org>
> ---
>
> (no changes since v1)
>
>  drivers/media/platform/mtk-mdp/mtk_mdp_comp.c | 57 ++++++++++++++---
>  drivers/media/platform/mtk-mdp/mtk_mdp_comp.h |  5 +-
>  drivers/media/platform/mtk-mdp/mtk_mdp_core.c | 62 ++++++++++++++-----
>  3 files changed, 98 insertions(+), 26 deletions(-)
>
> diff --git a/drivers/media/platform/mtk-mdp/mtk_mdp_comp.c b/drivers/media/platform/mtk-mdp/mtk_mdp_comp.c
> index 472c261b01e8..7b6c8a3f3455 100644
> --- a/drivers/media/platform/mtk-mdp/mtk_mdp_comp.c
> +++ b/drivers/media/platform/mtk-mdp/mtk_mdp_comp.c
> @@ -51,9 +51,9 @@ static const struct of_device_id mtk_mdp_comp_driver_dt_match[] = {
>  };
>  MODULE_DEVICE_TABLE(of, mtk_mdp_comp_driver_dt_match);
>
> -int mtk_mdp_comp_clock_on(struct mtk_mdp_comp *comp)
> +int mtk_mdp_comp_power_on(struct mtk_mdp_comp *comp)
>  {
> -       int i, err, status;
> +       int status, err;
>
>         if (comp->larb_dev) {
>                 err = mtk_smi_larb_get(comp->larb_dev);
> @@ -63,12 +63,54 @@ int mtk_mdp_comp_clock_on(struct mtk_mdp_comp *comp)
>
>         err = pm_runtime_get_sync(comp->dev);
>         if (err < 0) {
> -               dev_err(comp->dev,
> -                       "failed to runtime get, err %d.\n",
> -                       err);
> +               dev_err(comp->dev, "failed to runtime get, err %d.\n", err);
>                 return err;
>         }
>
> +       err = mtk_mdp_comp_clock_on(comp);
> +       if (err) {
> +               dev_err(comp->dev, "failed to turn on clock. err=%d", err);
> +               status = err;
> +               goto err_mtk_mdp_comp_clock_on;
> +       }
> +
> +       return 0;
> +
> +err_mtk_mdp_comp_clock_on:
> +       err = pm_runtime_put_sync(comp->dev);
> +       if (err)
> +               dev_err(comp->dev, "failed to runtime put in cleanup. err=%d", err);
> +
> +       return status;
> +}
> +
> +int mtk_mdp_comp_power_off(struct mtk_mdp_comp *comp)
> +{
> +       int status, err;
> +
> +       mtk_mdp_comp_clock_off(comp);
> +
> +       err = pm_runtime_put_sync(comp->dev);
> +       if (err < 0) {
> +               dev_err(comp->dev, "failed to runtime put, err %d.\n", err);
> +               status = err;
> +               goto err_pm_runtime_put_sync;
> +       }
> +
> +       return 0;
> +
> +err_pm_runtime_put_sync:
> +       err = mtk_mdp_comp_clock_on(comp);
> +       if (err)
> +               dev_err(comp->dev, "failed to turn on clock in cleanup. err=%d", err);
> +
> +       return status;
> +}
> +
> +int mtk_mdp_comp_clock_on(struct mtk_mdp_comp *comp)
> +{
> +       int i, err, status;
> +
>         for (i = 0; i < ARRAY_SIZE(comp->clk); i++) {
>                 if (IS_ERR(comp->clk[i]))
>                         continue;
> @@ -94,7 +136,8 @@ int mtk_mdp_comp_clock_on(struct mtk_mdp_comp *comp)
>         return status;
>  }
>
> -int mtk_mdp_comp_clock_off(struct mtk_mdp_comp *comp)
> +
> +void mtk_mdp_comp_clock_off(struct mtk_mdp_comp *comp)
>  {
>         int i;
>
> @@ -106,8 +149,6 @@ int mtk_mdp_comp_clock_off(struct mtk_mdp_comp *comp)
>
>         if (comp->larb_dev)
>                 mtk_smi_larb_put(comp->larb_dev);
> -
> -       return pm_runtime_put_sync(comp->dev);
>  }
>
>  static int mtk_mdp_comp_bind(struct device *dev, struct device *master, void *data)
> diff --git a/drivers/media/platform/mtk-mdp/mtk_mdp_comp.h b/drivers/media/platform/mtk-mdp/mtk_mdp_comp.h
> index f2e22e7e7c45..e3d6aef52869 100644
> --- a/drivers/media/platform/mtk-mdp/mtk_mdp_comp.h
> +++ b/drivers/media/platform/mtk-mdp/mtk_mdp_comp.h
> @@ -23,8 +23,11 @@ struct mtk_mdp_comp {
>
>  int mtk_mdp_comp_init(struct mtk_mdp_comp *comp, struct device *dev);
>
> +int mtk_mdp_comp_power_on(struct mtk_mdp_comp *comp);
> +int mtk_mdp_comp_power_off(struct mtk_mdp_comp *comp);
> +
>  int mtk_mdp_comp_clock_on(struct mtk_mdp_comp *comp);
> -int mtk_mdp_comp_clock_off(struct mtk_mdp_comp *comp);
> +void mtk_mdp_comp_clock_off(struct mtk_mdp_comp *comp);
>
>  extern struct platform_driver mtk_mdp_component_driver;
>
> diff --git a/drivers/media/platform/mtk-mdp/mtk_mdp_core.c b/drivers/media/platform/mtk-mdp/mtk_mdp_core.c
> index 714154450981..a72a9ba41ea6 100644
> --- a/drivers/media/platform/mtk-mdp/mtk_mdp_core.c
> +++ b/drivers/media/platform/mtk-mdp/mtk_mdp_core.c
> @@ -57,29 +57,64 @@ static int mtk_mdp_clock_on(struct mtk_mdp_dev *mdp)
>         struct device *dev = &mdp->pdev->dev;
>         int err;
>
> +       /*
> +        * The master / rdma0 component will have pm_runtime_get_sync called
> +        * on it through mtk_mdp_m2m_start_streaming, making it unnecessary to
> +        * have mtk_mdp_comp_power_on called on it.
> +        */
> +       err = mtk_mdp_comp_clock_on(&mdp->comp_self);
> +       if (err)
> +               return err;
> +
>         list_for_each_entry(comp_node, &mdp->comp_list, node) {
> -               err = mtk_mdp_comp_clock_on(comp_node);
> +               err = mtk_mdp_comp_power_on(comp_node);
>                 if (err) {
>                         status = err;
> -                       goto err_mtk_mdp_comp_clock_on;
> +                       goto err_mtk_mdp_comp_power_on;
>                 }
>         }
>
>         return 0;
>
> -err_mtk_mdp_comp_clock_on:
> -       list_for_each_entry_continue_reverse(comp_node, &mdp->comp_list, node)
> -               mtk_mdp_comp_clock_off(comp_node);
> -
> +err_mtk_mdp_comp_power_on:
> +       list_for_each_entry_continue_reverse(comp_node, &mdp->comp_list, node) {
> +               err = mtk_mdp_comp_power_off(comp_node);
> +               if (err)
> +                       dev_err(&mdp->pdev->dev, "failed to power off after error. err=%d", err);
> +       }
>         return status;
>  }
>
> -static void mtk_mdp_clock_off(struct mtk_mdp_dev *mdp)
> +static int mtk_mdp_clock_off(struct mtk_mdp_dev *mdp)
>  {
>         struct mtk_mdp_comp *comp_node;
> +       int status, err;
> +
> +       list_for_each_entry(comp_node, &mdp->comp_list, node) {
> +               err = mtk_mdp_comp_power_off(comp_node);
> +               if (err) {
> +                       status = err;
> +                       goto err_mtk_mdp_comp_power_off;
> +               }
> +       }
>
> -       list_for_each_entry(comp_node, &mdp->comp_list, node)
> -               mtk_mdp_comp_clock_off(comp_node);
> +       /*
> +        * The master / rdma0 component will have pm_runtime_put called
> +        * on it through mtk_mdp_m2m_stop_streaming, making it unnecessary to
> +        * have mtk_mdp_comp_power_off called on it.
> +        */
> +       mtk_mdp_comp_clock_off(&mdp->comp_self);
> +
> +       return 0;
> +
> +err_mtk_mdp_comp_power_off:
> +       list_for_each_entry_continue_reverse(comp_node, &mdp->comp_list, node) {
> +               err = mtk_mdp_comp_power_on(comp_node);
> +               if (err)
> +                       dev_err(&mdp->pdev->dev, "failed to power on after error. err=%d", err);
> +       }
> +
> +       return status;
>  }
>
>  static void mtk_mdp_wdt_worker(struct work_struct *work)
> @@ -118,8 +153,6 @@ static int mtk_mdp_master_bind(struct device *dev)
>         int status;
>         struct mtk_mdp_dev *mdp = dev_get_drvdata(dev);
>
> -       mtk_mdp_register_component(mdp, &mdp->comp_self);
> -
>         status = component_bind_all(dev, mdp);
>         if (status) {
>                 dev_err(dev, "Failed to bind all components: %d\n", status);
> @@ -140,8 +173,6 @@ static int mtk_mdp_master_bind(struct device *dev)
>         component_unbind_all(dev, mdp);
>
>  err_component_bind_all:
> -       mtk_mdp_unregister_component(mdp, &mdp->comp_self);
> -
>         return status;
>  }
>
> @@ -152,7 +183,6 @@ static void mtk_mdp_master_unbind(struct device *dev)
>         pm_runtime_disable(dev);
>         mtk_mdp_unregister_m2m_device(mdp);
>         component_unbind_all(dev, mdp);
> -       mtk_mdp_unregister_component(mdp, &mdp->comp_self);
>  }
>
>  static const struct component_master_ops mtk_mdp_com_ops = {
> @@ -337,9 +367,7 @@ static int __maybe_unused mtk_mdp_pm_suspend(struct device *dev)
>  {
>         struct mtk_mdp_dev *mdp = dev_get_drvdata(dev);
>
> -       mtk_mdp_clock_off(mdp);
> -
> -       return 0;
> +       return mtk_mdp_clock_off(mdp);
>  }
>
>  static int __maybe_unused mtk_mdp_pm_resume(struct device *dev)
> --
> 2.32.0.554.ge1b32706d8-goog
>

WARNING: multiple messages have this Message-ID (diff)
From: Enric Balletbo Serra <eballetbo@gmail.com>
To: Eizan Miyamoto <eizan@chromium.org>
Cc: linux-kernel <linux-kernel@vger.kernel.org>,
	Chen-Yu Tsai <wenst@chromium.org>,
	 Houlong Wei <houlong.wei@mediatek.com>,
	Yong Wu <yong.wu@mediatek.com>,
	 Enric Balletbo i Serra <enric.balletbo@collabora.com>,
	devicetree <devicetree@vger.kernel.org>,
	 Chun-Kuang Hu <chunkuang.hu@kernel.org>,
	Andrew-CT Chen <andrew-ct.chen@mediatek.com>,
	 Matthias Brugger <matthias.bgg@gmail.com>,
	Mauro Carvalho Chehab <mchehab@kernel.org>,
	 Minghsiu Tsai <minghsiu.tsai@mediatek.com>,
	 Linux ARM <linux-arm-kernel@lists.infradead.org>,
	 Linux Media Mailing List <linux-media@vger.kernel.org>,
	 "moderated list:ARM/Mediatek SoC support"
	<linux-mediatek@lists.infradead.org>
Subject: Re: [PATCH v6 4/9] media: mtk-mdp: don't pm_run_time_get/put for master comp in clock_on
Date: Tue, 3 Aug 2021 12:27:03 +0200	[thread overview]
Message-ID: <CAFqH_50or=_pb7UDCvoPEoA7s1r6qNTNnMuo4pPuFfGqj4d50w@mail.gmail.com> (raw)
In-Reply-To: <20210802220943.v6.4.Ifd87681955689a08cce4c65e72ee5e8c6d09af95@changeid>

Hi Eizan,

Thank you for your patch.

Missatge de Eizan Miyamoto <eizan@chromium.org> del dia dl., 2 d’ag.
2021 a les 14:13:

>
> The original intent of commit 86698b9505bbc ("media: mtk-mdp: convert
> mtk_mdp_dev.comp array to list") was to create a list to track all the
> MDP components that needed to have their clocks enabled/disabled when
> calling mtk_mdp_comp_clock_on/off. However, there was a bug inside
> mtk_mdp_register_component where the args to a call to list_add were
> swapped. The result is that only one component was added to
> mtk_mdp_dev.comp_list because comp_list was instead being
> repeatedly added to the single element lists headed by each
> mtk_mdp_comp.
>
> The order of the args to list_add in mtk_mdp_register_component was
> fixed in https://patchwork.kernel.org/patch/11742895/ (Fix Null pointer
> dereference when calling list_add).
>
> Then, as a result of https://patchwork.kernel.org/patch/11530769/
> (mtk-mdp: use pm_runtime in MDP component driver) if all the components
> are added to the component list, the mdp "master" / rdma0 component
> ends up having pm_runtime_get_sync() called on it twice recursively:
>
>     rpm_resume+0x694/0x8f8
>     __pm_runtime_resume+0x7c/0xa0 ***NOTE***
>     mtk_mdp_comp_clock_on+0x48/0x104 [mtk_mdp]
>     mtk_mdp_pm_resume+0x2c/0x44 [mtk_mdp]
>     pm_generic_runtime_resume+0x34/0x48
>     __genpd_runtime_resume+0x6c/0x80
>     genpd_runtime_resume+0x104/0x1ac
>     __rpm_callback+0x120/0x238
>     rpm_callback+0x34/0x8c
>     rpm_resume+0x7a0/0x8f8
>     __pm_runtime_resume+0x7c/0xa0 ***NOTE***
>     mtk_mdp_m2m_start_streaming+0x2c/0x3c [mtk_mdp]
>
> (The calls to pm_runtime_get_sync are inlined and correspond to the
> calls to __pm_runtime_resume). It is not correct to have
> pm_runtime_get_sync called recursively and the second call will block
> indefinitely.
>
> As a result of all that, this change factors mtk_mdp_comp_clock_on/off
> into mtk_mdp_comp_power_on/off and moves the calls to
> pm_runtime_get/put into the power_on/off functions.
>
> This change then special-cases the master/rdma0 MDP component and does
> these things:
> - the master/rdma0 component is not added to mtk_mdp_dev.comp_list
> - the master/rdma0 component has its clocks (*but not power*) toggled
>   by mtk_mpd_comp_clock_on/off inside mtk_mdp_clock_on/off.
> - the other components have their clocks *and* power toggled with
>   mtk_mdp_comp_power_on/off.
>
> This change introduces the assumption that mtk_mdp_pm_resume will
> always be called though a callback from pm_runtime_get_sync made on the
> master / rdma0 component.
>
> Signed-off-by: Eizan Miyamoto <eizan@chromium.org>
> ---
>
> (no changes since v1)
>
>  drivers/media/platform/mtk-mdp/mtk_mdp_comp.c | 57 ++++++++++++++---
>  drivers/media/platform/mtk-mdp/mtk_mdp_comp.h |  5 +-
>  drivers/media/platform/mtk-mdp/mtk_mdp_core.c | 62 ++++++++++++++-----
>  3 files changed, 98 insertions(+), 26 deletions(-)
>
> diff --git a/drivers/media/platform/mtk-mdp/mtk_mdp_comp.c b/drivers/media/platform/mtk-mdp/mtk_mdp_comp.c
> index 472c261b01e8..7b6c8a3f3455 100644
> --- a/drivers/media/platform/mtk-mdp/mtk_mdp_comp.c
> +++ b/drivers/media/platform/mtk-mdp/mtk_mdp_comp.c
> @@ -51,9 +51,9 @@ static const struct of_device_id mtk_mdp_comp_driver_dt_match[] = {
>  };
>  MODULE_DEVICE_TABLE(of, mtk_mdp_comp_driver_dt_match);
>
> -int mtk_mdp_comp_clock_on(struct mtk_mdp_comp *comp)
> +int mtk_mdp_comp_power_on(struct mtk_mdp_comp *comp)
>  {
> -       int i, err, status;
> +       int status, err;
>
>         if (comp->larb_dev) {
>                 err = mtk_smi_larb_get(comp->larb_dev);
> @@ -63,12 +63,54 @@ int mtk_mdp_comp_clock_on(struct mtk_mdp_comp *comp)
>
>         err = pm_runtime_get_sync(comp->dev);
>         if (err < 0) {
> -               dev_err(comp->dev,
> -                       "failed to runtime get, err %d.\n",
> -                       err);
> +               dev_err(comp->dev, "failed to runtime get, err %d.\n", err);
>                 return err;
>         }
>
> +       err = mtk_mdp_comp_clock_on(comp);
> +       if (err) {
> +               dev_err(comp->dev, "failed to turn on clock. err=%d", err);
> +               status = err;
> +               goto err_mtk_mdp_comp_clock_on;
> +       }
> +
> +       return 0;
> +
> +err_mtk_mdp_comp_clock_on:
> +       err = pm_runtime_put_sync(comp->dev);
> +       if (err)
> +               dev_err(comp->dev, "failed to runtime put in cleanup. err=%d", err);
> +
> +       return status;
> +}
> +
> +int mtk_mdp_comp_power_off(struct mtk_mdp_comp *comp)
> +{
> +       int status, err;
> +
> +       mtk_mdp_comp_clock_off(comp);
> +
> +       err = pm_runtime_put_sync(comp->dev);
> +       if (err < 0) {
> +               dev_err(comp->dev, "failed to runtime put, err %d.\n", err);
> +               status = err;
> +               goto err_pm_runtime_put_sync;
> +       }
> +
> +       return 0;
> +
> +err_pm_runtime_put_sync:
> +       err = mtk_mdp_comp_clock_on(comp);
> +       if (err)
> +               dev_err(comp->dev, "failed to turn on clock in cleanup. err=%d", err);
> +
> +       return status;
> +}
> +
> +int mtk_mdp_comp_clock_on(struct mtk_mdp_comp *comp)
> +{
> +       int i, err, status;
> +
>         for (i = 0; i < ARRAY_SIZE(comp->clk); i++) {
>                 if (IS_ERR(comp->clk[i]))
>                         continue;
> @@ -94,7 +136,8 @@ int mtk_mdp_comp_clock_on(struct mtk_mdp_comp *comp)
>         return status;
>  }
>
> -int mtk_mdp_comp_clock_off(struct mtk_mdp_comp *comp)
> +
> +void mtk_mdp_comp_clock_off(struct mtk_mdp_comp *comp)
>  {
>         int i;
>
> @@ -106,8 +149,6 @@ int mtk_mdp_comp_clock_off(struct mtk_mdp_comp *comp)
>
>         if (comp->larb_dev)
>                 mtk_smi_larb_put(comp->larb_dev);
> -
> -       return pm_runtime_put_sync(comp->dev);
>  }
>
>  static int mtk_mdp_comp_bind(struct device *dev, struct device *master, void *data)
> diff --git a/drivers/media/platform/mtk-mdp/mtk_mdp_comp.h b/drivers/media/platform/mtk-mdp/mtk_mdp_comp.h
> index f2e22e7e7c45..e3d6aef52869 100644
> --- a/drivers/media/platform/mtk-mdp/mtk_mdp_comp.h
> +++ b/drivers/media/platform/mtk-mdp/mtk_mdp_comp.h
> @@ -23,8 +23,11 @@ struct mtk_mdp_comp {
>
>  int mtk_mdp_comp_init(struct mtk_mdp_comp *comp, struct device *dev);
>
> +int mtk_mdp_comp_power_on(struct mtk_mdp_comp *comp);
> +int mtk_mdp_comp_power_off(struct mtk_mdp_comp *comp);
> +
>  int mtk_mdp_comp_clock_on(struct mtk_mdp_comp *comp);
> -int mtk_mdp_comp_clock_off(struct mtk_mdp_comp *comp);
> +void mtk_mdp_comp_clock_off(struct mtk_mdp_comp *comp);
>
>  extern struct platform_driver mtk_mdp_component_driver;
>
> diff --git a/drivers/media/platform/mtk-mdp/mtk_mdp_core.c b/drivers/media/platform/mtk-mdp/mtk_mdp_core.c
> index 714154450981..a72a9ba41ea6 100644
> --- a/drivers/media/platform/mtk-mdp/mtk_mdp_core.c
> +++ b/drivers/media/platform/mtk-mdp/mtk_mdp_core.c
> @@ -57,29 +57,64 @@ static int mtk_mdp_clock_on(struct mtk_mdp_dev *mdp)
>         struct device *dev = &mdp->pdev->dev;
>         int err;
>
> +       /*
> +        * The master / rdma0 component will have pm_runtime_get_sync called
> +        * on it through mtk_mdp_m2m_start_streaming, making it unnecessary to
> +        * have mtk_mdp_comp_power_on called on it.
> +        */
> +       err = mtk_mdp_comp_clock_on(&mdp->comp_self);
> +       if (err)
> +               return err;
> +
>         list_for_each_entry(comp_node, &mdp->comp_list, node) {
> -               err = mtk_mdp_comp_clock_on(comp_node);
> +               err = mtk_mdp_comp_power_on(comp_node);
>                 if (err) {
>                         status = err;
> -                       goto err_mtk_mdp_comp_clock_on;
> +                       goto err_mtk_mdp_comp_power_on;
>                 }
>         }
>
>         return 0;
>
> -err_mtk_mdp_comp_clock_on:
> -       list_for_each_entry_continue_reverse(comp_node, &mdp->comp_list, node)
> -               mtk_mdp_comp_clock_off(comp_node);
> -
> +err_mtk_mdp_comp_power_on:
> +       list_for_each_entry_continue_reverse(comp_node, &mdp->comp_list, node) {
> +               err = mtk_mdp_comp_power_off(comp_node);
> +               if (err)
> +                       dev_err(&mdp->pdev->dev, "failed to power off after error. err=%d", err);
> +       }
>         return status;
>  }
>
> -static void mtk_mdp_clock_off(struct mtk_mdp_dev *mdp)
> +static int mtk_mdp_clock_off(struct mtk_mdp_dev *mdp)
>  {
>         struct mtk_mdp_comp *comp_node;
> +       int status, err;
> +
> +       list_for_each_entry(comp_node, &mdp->comp_list, node) {
> +               err = mtk_mdp_comp_power_off(comp_node);
> +               if (err) {
> +                       status = err;
> +                       goto err_mtk_mdp_comp_power_off;
> +               }
> +       }
>
> -       list_for_each_entry(comp_node, &mdp->comp_list, node)
> -               mtk_mdp_comp_clock_off(comp_node);
> +       /*
> +        * The master / rdma0 component will have pm_runtime_put called
> +        * on it through mtk_mdp_m2m_stop_streaming, making it unnecessary to
> +        * have mtk_mdp_comp_power_off called on it.
> +        */
> +       mtk_mdp_comp_clock_off(&mdp->comp_self);
> +
> +       return 0;
> +
> +err_mtk_mdp_comp_power_off:
> +       list_for_each_entry_continue_reverse(comp_node, &mdp->comp_list, node) {
> +               err = mtk_mdp_comp_power_on(comp_node);
> +               if (err)
> +                       dev_err(&mdp->pdev->dev, "failed to power on after error. err=%d", err);
> +       }
> +
> +       return status;
>  }
>
>  static void mtk_mdp_wdt_worker(struct work_struct *work)
> @@ -118,8 +153,6 @@ static int mtk_mdp_master_bind(struct device *dev)
>         int status;
>         struct mtk_mdp_dev *mdp = dev_get_drvdata(dev);
>
> -       mtk_mdp_register_component(mdp, &mdp->comp_self);
> -
>         status = component_bind_all(dev, mdp);
>         if (status) {
>                 dev_err(dev, "Failed to bind all components: %d\n", status);
> @@ -140,8 +173,6 @@ static int mtk_mdp_master_bind(struct device *dev)
>         component_unbind_all(dev, mdp);
>
>  err_component_bind_all:
> -       mtk_mdp_unregister_component(mdp, &mdp->comp_self);
> -
>         return status;
>  }
>
> @@ -152,7 +183,6 @@ static void mtk_mdp_master_unbind(struct device *dev)
>         pm_runtime_disable(dev);
>         mtk_mdp_unregister_m2m_device(mdp);
>         component_unbind_all(dev, mdp);
> -       mtk_mdp_unregister_component(mdp, &mdp->comp_self);
>  }
>
>  static const struct component_master_ops mtk_mdp_com_ops = {
> @@ -337,9 +367,7 @@ static int __maybe_unused mtk_mdp_pm_suspend(struct device *dev)
>  {
>         struct mtk_mdp_dev *mdp = dev_get_drvdata(dev);
>
> -       mtk_mdp_clock_off(mdp);
> -
> -       return 0;
> +       return mtk_mdp_clock_off(mdp);
>  }
>
>  static int __maybe_unused mtk_mdp_pm_resume(struct device *dev)
> --
> 2.32.0.554.ge1b32706d8-goog
>

_______________________________________________
Linux-mediatek mailing list
Linux-mediatek@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-mediatek

WARNING: multiple messages have this Message-ID (diff)
From: Enric Balletbo Serra <eballetbo@gmail.com>
To: Eizan Miyamoto <eizan@chromium.org>
Cc: linux-kernel <linux-kernel@vger.kernel.org>,
	Chen-Yu Tsai <wenst@chromium.org>,
	 Houlong Wei <houlong.wei@mediatek.com>,
	Yong Wu <yong.wu@mediatek.com>,
	 Enric Balletbo i Serra <enric.balletbo@collabora.com>,
	devicetree <devicetree@vger.kernel.org>,
	 Chun-Kuang Hu <chunkuang.hu@kernel.org>,
	Andrew-CT Chen <andrew-ct.chen@mediatek.com>,
	 Matthias Brugger <matthias.bgg@gmail.com>,
	Mauro Carvalho Chehab <mchehab@kernel.org>,
	 Minghsiu Tsai <minghsiu.tsai@mediatek.com>,
	 Linux ARM <linux-arm-kernel@lists.infradead.org>,
	 Linux Media Mailing List <linux-media@vger.kernel.org>,
	 "moderated list:ARM/Mediatek SoC support"
	<linux-mediatek@lists.infradead.org>
Subject: Re: [PATCH v6 4/9] media: mtk-mdp: don't pm_run_time_get/put for master comp in clock_on
Date: Tue, 3 Aug 2021 12:27:03 +0200	[thread overview]
Message-ID: <CAFqH_50or=_pb7UDCvoPEoA7s1r6qNTNnMuo4pPuFfGqj4d50w@mail.gmail.com> (raw)
In-Reply-To: <20210802220943.v6.4.Ifd87681955689a08cce4c65e72ee5e8c6d09af95@changeid>

Hi Eizan,

Thank you for your patch.

Missatge de Eizan Miyamoto <eizan@chromium.org> del dia dl., 2 d’ag.
2021 a les 14:13:

>
> The original intent of commit 86698b9505bbc ("media: mtk-mdp: convert
> mtk_mdp_dev.comp array to list") was to create a list to track all the
> MDP components that needed to have their clocks enabled/disabled when
> calling mtk_mdp_comp_clock_on/off. However, there was a bug inside
> mtk_mdp_register_component where the args to a call to list_add were
> swapped. The result is that only one component was added to
> mtk_mdp_dev.comp_list because comp_list was instead being
> repeatedly added to the single element lists headed by each
> mtk_mdp_comp.
>
> The order of the args to list_add in mtk_mdp_register_component was
> fixed in https://patchwork.kernel.org/patch/11742895/ (Fix Null pointer
> dereference when calling list_add).
>
> Then, as a result of https://patchwork.kernel.org/patch/11530769/
> (mtk-mdp: use pm_runtime in MDP component driver) if all the components
> are added to the component list, the mdp "master" / rdma0 component
> ends up having pm_runtime_get_sync() called on it twice recursively:
>
>     rpm_resume+0x694/0x8f8
>     __pm_runtime_resume+0x7c/0xa0 ***NOTE***
>     mtk_mdp_comp_clock_on+0x48/0x104 [mtk_mdp]
>     mtk_mdp_pm_resume+0x2c/0x44 [mtk_mdp]
>     pm_generic_runtime_resume+0x34/0x48
>     __genpd_runtime_resume+0x6c/0x80
>     genpd_runtime_resume+0x104/0x1ac
>     __rpm_callback+0x120/0x238
>     rpm_callback+0x34/0x8c
>     rpm_resume+0x7a0/0x8f8
>     __pm_runtime_resume+0x7c/0xa0 ***NOTE***
>     mtk_mdp_m2m_start_streaming+0x2c/0x3c [mtk_mdp]
>
> (The calls to pm_runtime_get_sync are inlined and correspond to the
> calls to __pm_runtime_resume). It is not correct to have
> pm_runtime_get_sync called recursively and the second call will block
> indefinitely.
>
> As a result of all that, this change factors mtk_mdp_comp_clock_on/off
> into mtk_mdp_comp_power_on/off and moves the calls to
> pm_runtime_get/put into the power_on/off functions.
>
> This change then special-cases the master/rdma0 MDP component and does
> these things:
> - the master/rdma0 component is not added to mtk_mdp_dev.comp_list
> - the master/rdma0 component has its clocks (*but not power*) toggled
>   by mtk_mpd_comp_clock_on/off inside mtk_mdp_clock_on/off.
> - the other components have their clocks *and* power toggled with
>   mtk_mdp_comp_power_on/off.
>
> This change introduces the assumption that mtk_mdp_pm_resume will
> always be called though a callback from pm_runtime_get_sync made on the
> master / rdma0 component.
>
> Signed-off-by: Eizan Miyamoto <eizan@chromium.org>
> ---
>
> (no changes since v1)
>
>  drivers/media/platform/mtk-mdp/mtk_mdp_comp.c | 57 ++++++++++++++---
>  drivers/media/platform/mtk-mdp/mtk_mdp_comp.h |  5 +-
>  drivers/media/platform/mtk-mdp/mtk_mdp_core.c | 62 ++++++++++++++-----
>  3 files changed, 98 insertions(+), 26 deletions(-)
>
> diff --git a/drivers/media/platform/mtk-mdp/mtk_mdp_comp.c b/drivers/media/platform/mtk-mdp/mtk_mdp_comp.c
> index 472c261b01e8..7b6c8a3f3455 100644
> --- a/drivers/media/platform/mtk-mdp/mtk_mdp_comp.c
> +++ b/drivers/media/platform/mtk-mdp/mtk_mdp_comp.c
> @@ -51,9 +51,9 @@ static const struct of_device_id mtk_mdp_comp_driver_dt_match[] = {
>  };
>  MODULE_DEVICE_TABLE(of, mtk_mdp_comp_driver_dt_match);
>
> -int mtk_mdp_comp_clock_on(struct mtk_mdp_comp *comp)
> +int mtk_mdp_comp_power_on(struct mtk_mdp_comp *comp)
>  {
> -       int i, err, status;
> +       int status, err;
>
>         if (comp->larb_dev) {
>                 err = mtk_smi_larb_get(comp->larb_dev);
> @@ -63,12 +63,54 @@ int mtk_mdp_comp_clock_on(struct mtk_mdp_comp *comp)
>
>         err = pm_runtime_get_sync(comp->dev);
>         if (err < 0) {
> -               dev_err(comp->dev,
> -                       "failed to runtime get, err %d.\n",
> -                       err);
> +               dev_err(comp->dev, "failed to runtime get, err %d.\n", err);
>                 return err;
>         }
>
> +       err = mtk_mdp_comp_clock_on(comp);
> +       if (err) {
> +               dev_err(comp->dev, "failed to turn on clock. err=%d", err);
> +               status = err;
> +               goto err_mtk_mdp_comp_clock_on;
> +       }
> +
> +       return 0;
> +
> +err_mtk_mdp_comp_clock_on:
> +       err = pm_runtime_put_sync(comp->dev);
> +       if (err)
> +               dev_err(comp->dev, "failed to runtime put in cleanup. err=%d", err);
> +
> +       return status;
> +}
> +
> +int mtk_mdp_comp_power_off(struct mtk_mdp_comp *comp)
> +{
> +       int status, err;
> +
> +       mtk_mdp_comp_clock_off(comp);
> +
> +       err = pm_runtime_put_sync(comp->dev);
> +       if (err < 0) {
> +               dev_err(comp->dev, "failed to runtime put, err %d.\n", err);
> +               status = err;
> +               goto err_pm_runtime_put_sync;
> +       }
> +
> +       return 0;
> +
> +err_pm_runtime_put_sync:
> +       err = mtk_mdp_comp_clock_on(comp);
> +       if (err)
> +               dev_err(comp->dev, "failed to turn on clock in cleanup. err=%d", err);
> +
> +       return status;
> +}
> +
> +int mtk_mdp_comp_clock_on(struct mtk_mdp_comp *comp)
> +{
> +       int i, err, status;
> +
>         for (i = 0; i < ARRAY_SIZE(comp->clk); i++) {
>                 if (IS_ERR(comp->clk[i]))
>                         continue;
> @@ -94,7 +136,8 @@ int mtk_mdp_comp_clock_on(struct mtk_mdp_comp *comp)
>         return status;
>  }
>
> -int mtk_mdp_comp_clock_off(struct mtk_mdp_comp *comp)
> +
> +void mtk_mdp_comp_clock_off(struct mtk_mdp_comp *comp)
>  {
>         int i;
>
> @@ -106,8 +149,6 @@ int mtk_mdp_comp_clock_off(struct mtk_mdp_comp *comp)
>
>         if (comp->larb_dev)
>                 mtk_smi_larb_put(comp->larb_dev);
> -
> -       return pm_runtime_put_sync(comp->dev);
>  }
>
>  static int mtk_mdp_comp_bind(struct device *dev, struct device *master, void *data)
> diff --git a/drivers/media/platform/mtk-mdp/mtk_mdp_comp.h b/drivers/media/platform/mtk-mdp/mtk_mdp_comp.h
> index f2e22e7e7c45..e3d6aef52869 100644
> --- a/drivers/media/platform/mtk-mdp/mtk_mdp_comp.h
> +++ b/drivers/media/platform/mtk-mdp/mtk_mdp_comp.h
> @@ -23,8 +23,11 @@ struct mtk_mdp_comp {
>
>  int mtk_mdp_comp_init(struct mtk_mdp_comp *comp, struct device *dev);
>
> +int mtk_mdp_comp_power_on(struct mtk_mdp_comp *comp);
> +int mtk_mdp_comp_power_off(struct mtk_mdp_comp *comp);
> +
>  int mtk_mdp_comp_clock_on(struct mtk_mdp_comp *comp);
> -int mtk_mdp_comp_clock_off(struct mtk_mdp_comp *comp);
> +void mtk_mdp_comp_clock_off(struct mtk_mdp_comp *comp);
>
>  extern struct platform_driver mtk_mdp_component_driver;
>
> diff --git a/drivers/media/platform/mtk-mdp/mtk_mdp_core.c b/drivers/media/platform/mtk-mdp/mtk_mdp_core.c
> index 714154450981..a72a9ba41ea6 100644
> --- a/drivers/media/platform/mtk-mdp/mtk_mdp_core.c
> +++ b/drivers/media/platform/mtk-mdp/mtk_mdp_core.c
> @@ -57,29 +57,64 @@ static int mtk_mdp_clock_on(struct mtk_mdp_dev *mdp)
>         struct device *dev = &mdp->pdev->dev;
>         int err;
>
> +       /*
> +        * The master / rdma0 component will have pm_runtime_get_sync called
> +        * on it through mtk_mdp_m2m_start_streaming, making it unnecessary to
> +        * have mtk_mdp_comp_power_on called on it.
> +        */
> +       err = mtk_mdp_comp_clock_on(&mdp->comp_self);
> +       if (err)
> +               return err;
> +
>         list_for_each_entry(comp_node, &mdp->comp_list, node) {
> -               err = mtk_mdp_comp_clock_on(comp_node);
> +               err = mtk_mdp_comp_power_on(comp_node);
>                 if (err) {
>                         status = err;
> -                       goto err_mtk_mdp_comp_clock_on;
> +                       goto err_mtk_mdp_comp_power_on;
>                 }
>         }
>
>         return 0;
>
> -err_mtk_mdp_comp_clock_on:
> -       list_for_each_entry_continue_reverse(comp_node, &mdp->comp_list, node)
> -               mtk_mdp_comp_clock_off(comp_node);
> -
> +err_mtk_mdp_comp_power_on:
> +       list_for_each_entry_continue_reverse(comp_node, &mdp->comp_list, node) {
> +               err = mtk_mdp_comp_power_off(comp_node);
> +               if (err)
> +                       dev_err(&mdp->pdev->dev, "failed to power off after error. err=%d", err);
> +       }
>         return status;
>  }
>
> -static void mtk_mdp_clock_off(struct mtk_mdp_dev *mdp)
> +static int mtk_mdp_clock_off(struct mtk_mdp_dev *mdp)
>  {
>         struct mtk_mdp_comp *comp_node;
> +       int status, err;
> +
> +       list_for_each_entry(comp_node, &mdp->comp_list, node) {
> +               err = mtk_mdp_comp_power_off(comp_node);
> +               if (err) {
> +                       status = err;
> +                       goto err_mtk_mdp_comp_power_off;
> +               }
> +       }
>
> -       list_for_each_entry(comp_node, &mdp->comp_list, node)
> -               mtk_mdp_comp_clock_off(comp_node);
> +       /*
> +        * The master / rdma0 component will have pm_runtime_put called
> +        * on it through mtk_mdp_m2m_stop_streaming, making it unnecessary to
> +        * have mtk_mdp_comp_power_off called on it.
> +        */
> +       mtk_mdp_comp_clock_off(&mdp->comp_self);
> +
> +       return 0;
> +
> +err_mtk_mdp_comp_power_off:
> +       list_for_each_entry_continue_reverse(comp_node, &mdp->comp_list, node) {
> +               err = mtk_mdp_comp_power_on(comp_node);
> +               if (err)
> +                       dev_err(&mdp->pdev->dev, "failed to power on after error. err=%d", err);
> +       }
> +
> +       return status;
>  }
>
>  static void mtk_mdp_wdt_worker(struct work_struct *work)
> @@ -118,8 +153,6 @@ static int mtk_mdp_master_bind(struct device *dev)
>         int status;
>         struct mtk_mdp_dev *mdp = dev_get_drvdata(dev);
>
> -       mtk_mdp_register_component(mdp, &mdp->comp_self);
> -
>         status = component_bind_all(dev, mdp);
>         if (status) {
>                 dev_err(dev, "Failed to bind all components: %d\n", status);
> @@ -140,8 +173,6 @@ static int mtk_mdp_master_bind(struct device *dev)
>         component_unbind_all(dev, mdp);
>
>  err_component_bind_all:
> -       mtk_mdp_unregister_component(mdp, &mdp->comp_self);
> -
>         return status;
>  }
>
> @@ -152,7 +183,6 @@ static void mtk_mdp_master_unbind(struct device *dev)
>         pm_runtime_disable(dev);
>         mtk_mdp_unregister_m2m_device(mdp);
>         component_unbind_all(dev, mdp);
> -       mtk_mdp_unregister_component(mdp, &mdp->comp_self);
>  }
>
>  static const struct component_master_ops mtk_mdp_com_ops = {
> @@ -337,9 +367,7 @@ static int __maybe_unused mtk_mdp_pm_suspend(struct device *dev)
>  {
>         struct mtk_mdp_dev *mdp = dev_get_drvdata(dev);
>
> -       mtk_mdp_clock_off(mdp);
> -
> -       return 0;
> +       return mtk_mdp_clock_off(mdp);
>  }
>
>  static int __maybe_unused mtk_mdp_pm_resume(struct device *dev)
> --
> 2.32.0.554.ge1b32706d8-goog
>

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

  reply	other threads:[~2021-08-03 10:27 UTC|newest]

Thread overview: 126+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-08-02 12:12 [PATCH v6 0/9] Refactor MTK MDP driver into core/components Eizan Miyamoto
2021-08-02 12:12 ` Eizan Miyamoto
2021-08-02 12:12 ` Eizan Miyamoto
2021-08-02 12:12 ` [PATCH v6 1/9] mtk-mdp: propagate errors from clock_on Eizan Miyamoto
2021-08-02 12:12   ` Eizan Miyamoto
2021-08-02 12:12   ` Eizan Miyamoto
2021-08-03 10:26   ` Enric Balletbo Serra
2021-08-03 10:26     ` Enric Balletbo Serra
2021-08-03 10:26     ` Enric Balletbo Serra
2021-08-05  6:06   ` Dafna Hirschfeld
2021-08-05  6:06     ` Dafna Hirschfeld
2021-08-05  6:06     ` Dafna Hirschfeld
2021-08-09  3:23     ` Eizan Miyamoto
2021-08-09  3:23       ` Eizan Miyamoto
2021-08-09  3:23       ` Eizan Miyamoto
2021-08-09  7:42       ` Dafna Hirschfeld
2021-08-09  7:42         ` Dafna Hirschfeld
2021-08-09  7:42         ` Dafna Hirschfeld
2021-08-16  0:46   ` houlong wei
2021-08-16  0:46     ` houlong wei
2021-08-16  0:46     ` houlong wei
2021-08-02 12:12 ` [PATCH v6 2/9] mtk-mdp: add driver to probe mdp components Eizan Miyamoto
2021-08-02 12:12   ` Eizan Miyamoto
2021-08-02 12:12   ` Eizan Miyamoto
2021-08-03 10:26   ` Enric Balletbo Serra
2021-08-03 10:26     ` Enric Balletbo Serra
2021-08-03 10:26     ` Enric Balletbo Serra
2021-08-05  6:40   ` Dafna Hirschfeld
2021-08-05  6:40     ` Dafna Hirschfeld
2021-08-05  6:40     ` Dafna Hirschfeld
2021-08-09  3:23     ` Eizan Miyamoto
2021-08-09  3:23       ` Eizan Miyamoto
2021-08-09  3:23       ` Eizan Miyamoto
2021-08-09  7:53       ` Dafna Hirschfeld
2021-08-09  7:53         ` Dafna Hirschfeld
2021-08-09  7:53         ` Dafna Hirschfeld
2021-08-11 11:15         ` Eizan Miyamoto
2021-08-11 11:15           ` Eizan Miyamoto
2021-08-11 11:15           ` Eizan Miyamoto
2021-08-16  1:05   ` houlong wei
2021-08-16  1:05     ` houlong wei
2021-08-16  1:05     ` houlong wei
2021-08-02 12:12 ` [PATCH v6 3/9] mtk-mdp: use pm_runtime in MDP component driver Eizan Miyamoto
2021-08-02 12:12   ` Eizan Miyamoto
2021-08-02 12:12   ` Eizan Miyamoto
2021-08-03 10:26   ` Enric Balletbo Serra
2021-08-03 10:26     ` Enric Balletbo Serra
2021-08-03 10:26     ` Enric Balletbo Serra
2021-08-16  1:07   ` houlong wei
2021-08-16  1:07     ` houlong wei
2021-08-16  1:07     ` houlong wei
2021-08-02 12:12 ` [PATCH v6 4/9] media: mtk-mdp: don't pm_run_time_get/put for master comp in clock_on Eizan Miyamoto
2021-08-02 12:12   ` Eizan Miyamoto
2021-08-02 12:12   ` Eizan Miyamoto
2021-08-03 10:27   ` Enric Balletbo Serra [this message]
2021-08-03 10:27     ` Enric Balletbo Serra
2021-08-03 10:27     ` Enric Balletbo Serra
2021-08-16  1:10   ` houlong wei
2021-08-16  1:10     ` houlong wei
2021-08-16  1:10     ` houlong wei
2021-08-02 12:12 ` [PATCH v6 5/9] mtk-mdp: make mdp driver to be loadable by platform_device_register*() Eizan Miyamoto
2021-08-02 12:12   ` Eizan Miyamoto
2021-08-02 12:12   ` Eizan Miyamoto
2021-08-03 10:27   ` Enric Balletbo Serra
2021-08-03 10:27     ` Enric Balletbo Serra
2021-08-03 10:27     ` Enric Balletbo Serra
2021-08-16  1:15   ` houlong wei
2021-08-16  1:15     ` houlong wei
2021-08-16  1:15     ` houlong wei
2021-08-16  3:37   ` houlong wei
2021-08-16  3:37     ` houlong wei
2021-08-16  3:37     ` houlong wei
2021-08-02 12:12 ` [PATCH v6 6/9] soc: mediatek: mmsys: instantiate mdp virtual device from mmsys Eizan Miyamoto
2021-08-02 12:12   ` Eizan Miyamoto
2021-08-02 12:12   ` Eizan Miyamoto
2021-08-03 10:27   ` Enric Balletbo Serra
2021-08-03 10:27     ` Enric Balletbo Serra
2021-08-03 10:27     ` Enric Balletbo Serra
2021-08-16  1:18   ` houlong wei
2021-08-16  1:18     ` houlong wei
2021-08-16  1:18     ` houlong wei
2021-08-02 12:12 ` [PATCH v6 7/9] media: mtk-mdp: use mdp-rdma0 alias to point to MDP master Eizan Miyamoto
2021-08-02 12:12   ` Eizan Miyamoto
2021-08-02 12:12   ` Eizan Miyamoto
2021-08-03 10:27   ` Enric Balletbo Serra
2021-08-03 10:27     ` Enric Balletbo Serra
2021-08-03 10:27     ` Enric Balletbo Serra
2021-08-03 11:46     ` Eizan Miyamoto
2021-08-03 11:46       ` Eizan Miyamoto
2021-08-03 11:46       ` Eizan Miyamoto
2021-08-16  3:00   ` houlong wei
2021-08-16  3:00     ` houlong wei
2021-08-16  3:00     ` houlong wei
2021-08-16  4:52     ` houlong wei
2021-08-16  4:52       ` houlong wei
2021-08-16  4:52       ` houlong wei
2021-08-18  7:50       ` Eizan Miyamoto
2021-08-18  7:50         ` Eizan Miyamoto
2021-08-18  7:50         ` Eizan Miyamoto
2021-08-18 15:42         ` houlong wei
2021-08-18 15:42           ` houlong wei
2021-08-18 15:42           ` houlong wei
2021-08-18  7:43     ` Eizan Miyamoto
2021-08-18  7:43       ` Eizan Miyamoto
2021-08-18  7:43       ` Eizan Miyamoto
2021-08-18 15:34       ` houlong wei
2021-08-18 15:34         ` houlong wei
2021-08-18 15:34         ` houlong wei
2021-08-02 12:12 ` [PATCH v6 8/9] dts: mtk-mdp: remove mediatek,vpu property from primary MDP device Eizan Miyamoto
2021-08-02 12:12   ` [PATCH v6 8/9] dts: mtk-mdp: remove mediatek, vpu " Eizan Miyamoto
2021-08-02 12:12   ` Eizan Miyamoto
2021-08-03 10:27   ` [PATCH v6 8/9] dts: mtk-mdp: remove mediatek,vpu " Enric Balletbo Serra
2021-08-03 10:27     ` Enric Balletbo Serra
2021-08-03 10:27     ` Enric Balletbo Serra
2021-08-02 12:12 ` [PATCH v6 9/9] dt-bindings: mediatek: remove vpu requirement from mtk-mdp Eizan Miyamoto
2021-08-02 12:12   ` Eizan Miyamoto
2021-08-02 12:12   ` Eizan Miyamoto
2021-08-03 10:27   ` Enric Balletbo Serra
2021-08-03 10:27     ` Enric Balletbo Serra
2021-08-03 10:27     ` Enric Balletbo Serra
2021-08-06 21:47   ` Rob Herring
2021-08-06 21:47     ` Rob Herring
2021-08-06 21:47     ` Rob Herring
2021-08-03 10:29 ` [PATCH v6 0/9] Refactor MTK MDP driver into core/components Enric Balletbo Serra
2021-08-03 10:29   ` Enric Balletbo Serra
2021-08-03 10:29   ` Enric Balletbo Serra

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='CAFqH_50or=_pb7UDCvoPEoA7s1r6qNTNnMuo4pPuFfGqj4d50w@mail.gmail.com' \
    --to=eballetbo@gmail.com \
    --cc=andrew-ct.chen@mediatek.com \
    --cc=chunkuang.hu@kernel.org \
    --cc=devicetree@vger.kernel.org \
    --cc=eizan@chromium.org \
    --cc=enric.balletbo@collabora.com \
    --cc=houlong.wei@mediatek.com \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-media@vger.kernel.org \
    --cc=linux-mediatek@lists.infradead.org \
    --cc=matthias.bgg@gmail.com \
    --cc=mchehab@kernel.org \
    --cc=minghsiu.tsai@mediatek.com \
    --cc=wenst@chromium.org \
    --cc=yong.wu@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 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.