From: Sean Paul <sean@poorly.run>
To: Rob Clark <robdclark@gmail.com>
Cc: dri-devel@lists.freedesktop.org,
Rob Clark <robdclark@chromium.org>, Sean Paul <sean@poorly.run>,
David Airlie <airlied@linux.ie>, Daniel Vetter <daniel@ffwll.ch>,
Jeykumar Sankaran <jsanka@codeaurora.org>,
Jordan Crouse <jcrouse@codeaurora.org>,
Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
Sravanthi Kollukuduru <skolluku@codeaurora.org>,
Bruce Wang <bzwang@chromium.org>,
Jonathan Marek <jonathan@marek.ca>,
Allison Randal <allison@lohutok.net>,
Thomas Gleixner <tglx@linutronix.de>,
Mamta Shukla <mamtashukla555@gmail.com>,
Georgi Djakov <georgi.djakov@linaro.org>,
"open list:DRM DRIVER FOR MSM ADRENO GPU"
<linux-arm-msm@vger.kernel.org>,
"open list:DRM DRIVER FOR MSM ADRENO GPU"
<freedreno@lists.freedesktop.org>,
open list <linux-kernel@vger.kernel.org>
Subject: Re: [PATCH 07/10] drm/msm: split power control from prepare/complete_commit
Date: Tue, 3 Sep 2019 16:37:12 -0400 [thread overview]
Message-ID: <20190903203712.GL218215@art_vandelay> (raw)
In-Reply-To: <20190829164601.11615-8-robdclark@gmail.com>
On Thu, Aug 29, 2019 at 09:45:15AM -0700, Rob Clark wrote:
> From: Rob Clark <robdclark@chromium.org>
>
> With atomic commit, ->prepare_commit() and ->complete_commit() may not
> be evenly balanced (although ->complete_commit() will complete each
> crtc that had been previously prepared). So these will no longer be
> a good place to enable/disable clocks needed for hw access.
>
> Signed-off-by: Rob Clark <robdclark@chromium.org>
Reviewed-by: Sean Paul <sean@poorly.run>
> ---
> drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c | 17 ++++++++++++++---
> drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c | 19 ++++++++++++++-----
> drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c | 20 ++++++++++++++------
> drivers/gpu/drm/msm/msm_atomic.c | 2 ++
> drivers/gpu/drm/msm/msm_kms.h | 10 ++++++++++
> 5 files changed, 54 insertions(+), 14 deletions(-)
>
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
> index efbf8fd343de..d54741f3ad9f 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
> @@ -248,6 +248,18 @@ static void dpu_kms_disable_vblank(struct msm_kms *kms, struct drm_crtc *crtc)
> dpu_crtc_vblank(crtc, false);
> }
>
> +static void dpu_kms_enable_commit(struct msm_kms *kms)
> +{
> + struct dpu_kms *dpu_kms = to_dpu_kms(kms);
> + pm_runtime_get_sync(&dpu_kms->pdev->dev);
> +}
> +
> +static void dpu_kms_disable_commit(struct msm_kms *kms)
> +{
> + struct dpu_kms *dpu_kms = to_dpu_kms(kms);
> + pm_runtime_put_sync(&dpu_kms->pdev->dev);
> +}
> +
> static void dpu_kms_prepare_commit(struct msm_kms *kms,
> struct drm_atomic_state *state)
> {
> @@ -267,7 +279,6 @@ static void dpu_kms_prepare_commit(struct msm_kms *kms,
> if (!dev || !dev->dev_private)
> return;
> priv = dev->dev_private;
> - pm_runtime_get_sync(&dpu_kms->pdev->dev);
>
> /* Call prepare_commit for all affected encoders */
> for_each_new_crtc_in_state(state, crtc, crtc_state, i) {
> @@ -335,8 +346,6 @@ static void dpu_kms_complete_commit(struct msm_kms *kms, unsigned crtc_mask)
> for_each_crtc_mask(dpu_kms->dev, crtc, crtc_mask)
> dpu_crtc_complete_commit(crtc);
>
> - pm_runtime_put_sync(&dpu_kms->pdev->dev);
> -
> DPU_ATRACE_END("kms_complete_commit");
> }
>
> @@ -682,6 +691,8 @@ static const struct msm_kms_funcs kms_funcs = {
> .irq_preinstall = dpu_irq_preinstall,
> .irq_uninstall = dpu_irq_uninstall,
> .irq = dpu_irq,
> + .enable_commit = dpu_kms_enable_commit,
> + .disable_commit = dpu_kms_disable_commit,
> .prepare_commit = dpu_kms_prepare_commit,
> .flush_commit = dpu_kms_flush_commit,
> .commit = dpu_kms_commit,
> diff --git a/drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c b/drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c
> index 78ce2c8a9a38..500e5b08c11f 100644
> --- a/drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c
> +++ b/drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c
> @@ -93,15 +93,24 @@ static int mdp4_hw_init(struct msm_kms *kms)
> return ret;
> }
>
> -static void mdp4_prepare_commit(struct msm_kms *kms, struct drm_atomic_state *state)
> +static void mdp4_enable_commit(struct msm_kms *kms)
> +{
> + struct mdp4_kms *mdp4_kms = to_mdp4_kms(to_mdp_kms(kms));
> + mdp4_enable(mdp4_kms);
> +}
> +
> +static void mdp4_disable_commit(struct msm_kms *kms)
> {
> struct mdp4_kms *mdp4_kms = to_mdp4_kms(to_mdp_kms(kms));
> + mdp4_disable(mdp4_kms);
> +}
> +
> +static void mdp4_prepare_commit(struct msm_kms *kms, struct drm_atomic_state *state)
> +{
> int i;
> struct drm_crtc *crtc;
> struct drm_crtc_state *crtc_state;
>
> - mdp4_enable(mdp4_kms);
> -
> /* see 119ecb7fd */
> for_each_new_crtc_in_state(state, crtc, crtc_state, i)
> drm_crtc_vblank_get(crtc);
> @@ -129,8 +138,6 @@ static void mdp4_complete_commit(struct msm_kms *kms, unsigned crtc_mask)
> /* see 119ecb7fd */
> for_each_crtc_mask(mdp4_kms->dev, crtc, crtc_mask)
> drm_crtc_vblank_put(crtc);
> -
> - mdp4_disable(mdp4_kms);
> }
>
> static long mdp4_round_pixclk(struct msm_kms *kms, unsigned long rate,
> @@ -182,6 +189,8 @@ static const struct mdp_kms_funcs kms_funcs = {
> .irq = mdp4_irq,
> .enable_vblank = mdp4_enable_vblank,
> .disable_vblank = mdp4_disable_vblank,
> + .enable_commit = mdp4_enable_commit,
> + .disable_commit = mdp4_disable_commit,
> .prepare_commit = mdp4_prepare_commit,
> .flush_commit = mdp4_flush_commit,
> .wait_flush = mdp4_wait_flush,
> diff --git a/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c b/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c
> index eff1b000258e..ba67bde1dbef 100644
> --- a/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c
> +++ b/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c
> @@ -140,16 +140,25 @@ static int mdp5_global_obj_init(struct mdp5_kms *mdp5_kms)
> return 0;
> }
>
> +static void mdp5_enable_commit(struct msm_kms *kms)
> +{
> + struct mdp5_kms *mdp5_kms = to_mdp5_kms(to_mdp_kms(kms));
> + pm_runtime_get_sync(&mdp5_kms->pdev->dev);
> +}
> +
> +static void mdp5_disable_commit(struct msm_kms *kms)
> +{
> + struct mdp5_kms *mdp5_kms = to_mdp5_kms(to_mdp_kms(kms));
> + pm_runtime_put_sync(&mdp5_kms->pdev->dev);
> +}
> +
> static void mdp5_prepare_commit(struct msm_kms *kms, struct drm_atomic_state *state)
> {
> struct mdp5_kms *mdp5_kms = to_mdp5_kms(to_mdp_kms(kms));
> - struct device *dev = &mdp5_kms->pdev->dev;
> struct mdp5_global_state *global_state;
>
> global_state = mdp5_get_existing_global_state(mdp5_kms);
>
> - pm_runtime_get_sync(dev);
> -
> if (mdp5_kms->smp)
> mdp5_smp_prepare_commit(mdp5_kms->smp, &global_state->smp);
> }
> @@ -171,15 +180,12 @@ static void mdp5_wait_flush(struct msm_kms *kms, unsigned crtc_mask)
> static void mdp5_complete_commit(struct msm_kms *kms, unsigned crtc_mask)
> {
> struct mdp5_kms *mdp5_kms = to_mdp5_kms(to_mdp_kms(kms));
> - struct device *dev = &mdp5_kms->pdev->dev;
> struct mdp5_global_state *global_state;
>
> global_state = mdp5_get_existing_global_state(mdp5_kms);
>
> if (mdp5_kms->smp)
> mdp5_smp_complete_commit(mdp5_kms->smp, &global_state->smp);
> -
> - pm_runtime_put_sync(dev);
> }
>
> static long mdp5_round_pixclk(struct msm_kms *kms, unsigned long rate,
> @@ -278,6 +284,8 @@ static const struct mdp_kms_funcs kms_funcs = {
> .enable_vblank = mdp5_enable_vblank,
> .disable_vblank = mdp5_disable_vblank,
> .flush_commit = mdp5_flush_commit,
> + .enable_commit = mdp5_enable_commit,
> + .disable_commit = mdp5_disable_commit,
> .prepare_commit = mdp5_prepare_commit,
> .wait_flush = mdp5_wait_flush,
> .complete_commit = mdp5_complete_commit,
> diff --git a/drivers/gpu/drm/msm/msm_atomic.c b/drivers/gpu/drm/msm/msm_atomic.c
> index e3537df848fa..614fb9c5bb58 100644
> --- a/drivers/gpu/drm/msm/msm_atomic.c
> +++ b/drivers/gpu/drm/msm/msm_atomic.c
> @@ -52,6 +52,7 @@ void msm_atomic_commit_tail(struct drm_atomic_state *state)
> struct msm_kms *kms = priv->kms;
> unsigned crtc_mask = get_crtc_mask(state);
>
> + kms->funcs->enable_commit(kms);
> kms->funcs->prepare_commit(kms, state);
>
> /*
> @@ -72,6 +73,7 @@ void msm_atomic_commit_tail(struct drm_atomic_state *state)
>
> kms->funcs->wait_flush(kms, crtc_mask);
> kms->funcs->complete_commit(kms, crtc_mask);
> + kms->funcs->disable_commit(kms);
>
> drm_atomic_helper_commit_hw_done(state);
>
> diff --git a/drivers/gpu/drm/msm/msm_kms.h b/drivers/gpu/drm/msm/msm_kms.h
> index bb70c1758c72..811f5e2c2405 100644
> --- a/drivers/gpu/drm/msm/msm_kms.h
> +++ b/drivers/gpu/drm/msm/msm_kms.h
> @@ -35,6 +35,16 @@ struct msm_kms_funcs {
> * Atomic commit handling:
> */
>
> + /**
> + * Enable/disable power/clks needed for hw access done in other
> + * commit related methods.
> + *
> + * If mdp4 is migrated to runpm, we could probably drop these
> + * and use runpm directly.
> + */
> + void (*enable_commit)(struct msm_kms *kms);
> + void (*disable_commit)(struct msm_kms *kms);
> +
> /**
> * Prepare for atomic commit. This is called after any previous
> * (async or otherwise) commit has completed.
> --
> 2.21.0
>
--
Sean Paul, Software Engineer, Google / Chromium OS
next prev parent reply other threads:[~2019-09-03 20:37 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-08-29 16:45 [PATCH 00/10] drm/msm: async commit support (v2) Rob Clark
2019-08-29 16:45 ` [PATCH 01/10] drm/msm/dpu: unwind async commit handling Rob Clark
2019-08-29 16:45 ` [PATCH 02/10] drm/msm/dpu: add real wait_for_commit_done() Rob Clark
2019-08-29 16:45 ` [PATCH 03/10] drm/msm/dpu: handle_frame_done() from vblank irq Rob Clark
2019-08-29 16:45 ` [PATCH 04/10] drm/msm: add kms->wait_flush() Rob Clark
2019-08-29 16:45 ` [PATCH 05/10] drm/msm: convert kms->complete_commit() to crtc_mask Rob Clark
2019-09-03 20:35 ` Sean Paul
2019-08-29 16:45 ` [PATCH 06/10] drm/msm: add kms->flush_commit() Rob Clark
2019-09-03 20:35 ` Sean Paul
2019-08-29 16:45 ` [PATCH 07/10] drm/msm: split power control from prepare/complete_commit Rob Clark
2019-09-03 20:37 ` Sean Paul [this message]
2019-08-29 16:45 ` [PATCH 08/10] drm/msm: async commit support Rob Clark
2019-09-03 20:51 ` Sean Paul
2019-08-29 16:45 ` [PATCH 09/10] drm/msm/dpu: " Rob Clark
2019-09-03 20:53 ` Sean Paul
2019-08-29 16:45 ` [PATCH 10/10] drm/msm: add atomic traces Rob Clark
2019-09-03 20:54 ` Sean Paul
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=20190903203712.GL218215@art_vandelay \
--to=sean@poorly.run \
--cc=airlied@linux.ie \
--cc=allison@lohutok.net \
--cc=bzwang@chromium.org \
--cc=daniel@ffwll.ch \
--cc=dri-devel@lists.freedesktop.org \
--cc=freedreno@lists.freedesktop.org \
--cc=georgi.djakov@linaro.org \
--cc=gregkh@linuxfoundation.org \
--cc=jcrouse@codeaurora.org \
--cc=jonathan@marek.ca \
--cc=jsanka@codeaurora.org \
--cc=linux-arm-msm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mamtashukla555@gmail.com \
--cc=robdclark@chromium.org \
--cc=robdclark@gmail.com \
--cc=skolluku@codeaurora.org \
--cc=tglx@linutronix.de \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox