From: CK Hu <ck.hu@mediatek.com>
To: Bibby Hsieh <bibby.hsieh@mediatek.com>
Cc: David Airlie <airlied@linux.ie>,
Matthias Brugger <matthias.bgg@gmail.com>,
Daniel Vetter <daniel.vetter@ffwll.ch>,
<dri-devel@lists.freedesktop.org>,
<linux-mediatek@lists.infradead.org>,
Philipp Zabel <p.zabel@pengutronix.de>,
YT Shen <yt.shen@mediatek.com>,
Thierry Reding <thierry.reding@gmail.com>,
<linux-arm-kernel@lists.infradead.org>, <tfiga@chromium.org>,
<drinkcat@chromium.org>, <linux-kernel@vger.kernel.org>,
<srv_heupstream@mediatek.com>
Subject: Re: [PATCH] drm/mediatek: covert to helper nonblocking atomic commit
Date: Fri, 1 Nov 2019 09:42:17 +0800 [thread overview]
Message-ID: <1572572537.10339.12.camel@mtksdaap41> (raw)
In-Reply-To: <20191025053843.16808-1-bibby.hsieh@mediatek.com>
Hi, Bibby:
On Fri, 2019-10-25 at 13:38 +0800, Bibby Hsieh wrote:
> In order to commit state asynchronously, we change
> .atomic_commit to drm_atomic_helper_commit().
>
> Signed-off-by: Bibby Hsieh <bibby.hsieh@mediatek.com>
> ---
> drivers/gpu/drm/mediatek/mtk_drm_crtc.c | 11 ++++
> drivers/gpu/drm/mediatek/mtk_drm_drv.c | 86 ++-----------------------
> drivers/gpu/drm/mediatek/mtk_drm_drv.h | 7 --
> 3 files changed, 16 insertions(+), 88 deletions(-)
>
> diff --git a/drivers/gpu/drm/mediatek/mtk_drm_crtc.c b/drivers/gpu/drm/mediatek/mtk_drm_crtc.c
> index b97eb5f58483..b07dc9b59ca3 100644
> --- a/drivers/gpu/drm/mediatek/mtk_drm_crtc.c
> +++ b/drivers/gpu/drm/mediatek/mtk_drm_crtc.c
> @@ -317,6 +317,7 @@ static int mtk_crtc_ddp_hw_init(struct mtk_drm_crtc *mtk_crtc)
> static void mtk_crtc_ddp_hw_fini(struct mtk_drm_crtc *mtk_crtc)
> {
> struct drm_device *drm = mtk_crtc->base.dev;
> + struct drm_crtc *crtc = &mtk_crtc->base;
> int i;
>
> DRM_DEBUG_DRIVER("%s\n", __func__);
> @@ -340,6 +341,13 @@ static void mtk_crtc_ddp_hw_fini(struct mtk_drm_crtc *mtk_crtc)
> mtk_disp_mutex_unprepare(mtk_crtc->mutex);
>
> pm_runtime_put(drm->dev);
> +
> + if (crtc->state->event && !crtc->state->active) {
> + spin_lock_irq(&crtc->dev->event_lock);
> + drm_crtc_send_vblank_event(crtc, crtc->state->event);
> + crtc->state->event = NULL;
> + spin_unlock_irq(&crtc->dev->event_lock);
> + }
This part looks like a bug fix. When the power is off, the latest event
may not process yet. So just send it here. But in
mtk_drm_crtc_atomic_disable(), it already wait for a vblank, why the
latest event has not processed yet?
> }
>
> static void mtk_crtc_ddp_config(struct drm_crtc *crtc)
> @@ -456,12 +464,15 @@ static void mtk_drm_crtc_atomic_begin(struct drm_crtc *crtc,
> if (mtk_crtc->event && state->base.event)
> DRM_ERROR("new event while there is still a pending event\n");
>
> + spin_lock_irq(&crtc->dev->event_lock);
> if (state->base.event) {
> state->base.event->pipe = drm_crtc_index(crtc);
> WARN_ON(drm_crtc_vblank_get(crtc) != 0);
> + WARN_ON(mtk_crtc->event);
> mtk_crtc->event = state->base.event;
> state->base.event = NULL;
> }
> + spin_unlock_irq(&crtc->dev->event_lock);
This part is a bug fix. The 'event' variable would be access by thread
context in mtk_drm_crtc_atomic_begin() or by interrupt context in
mtk_drm_crtc_finish_page_flip(), so each part should be a critical
section. Move this to an independent patch.
> }
>
> static void mtk_drm_crtc_atomic_flush(struct drm_crtc *crtc,
> diff --git a/drivers/gpu/drm/mediatek/mtk_drm_drv.c b/drivers/gpu/drm/mediatek/mtk_drm_drv.c
> index 6588dc6dd5e3..16e5771d182e 100644
> --- a/drivers/gpu/drm/mediatek/mtk_drm_drv.c
> +++ b/drivers/gpu/drm/mediatek/mtk_drm_drv.c
> @@ -36,89 +36,14 @@
> #define DRIVER_MAJOR 1
> #define DRIVER_MINOR 0
>
> -static void mtk_atomic_schedule(struct mtk_drm_private *private,
> - struct drm_atomic_state *state)
> -{
> - private->commit.state = state;
> - schedule_work(&private->commit.work);
> -}
> -
> -static void mtk_atomic_complete(struct mtk_drm_private *private,
> - struct drm_atomic_state *state)
> -{
> - struct drm_device *drm = private->drm;
> -
> - drm_atomic_helper_wait_for_fences(drm, state, false);
> -
> - /*
> - * Mediatek drm supports runtime PM, so plane registers cannot be
> - * written when their crtc is disabled.
> - *
> - * The comment for drm_atomic_helper_commit states:
> - * For drivers supporting runtime PM the recommended sequence is
> - *
> - * drm_atomic_helper_commit_modeset_disables(dev, state);
> - * drm_atomic_helper_commit_modeset_enables(dev, state);
> - * drm_atomic_helper_commit_planes(dev, state,
> - * DRM_PLANE_COMMIT_ACTIVE_ONLY);
> - *
> - * See the kerneldoc entries for these three functions for more details.
> - */
> - drm_atomic_helper_commit_modeset_disables(drm, state);
> - drm_atomic_helper_commit_modeset_enables(drm, state);
> - drm_atomic_helper_commit_planes(drm, state,
> - DRM_PLANE_COMMIT_ACTIVE_ONLY);
> -
> - drm_atomic_helper_wait_for_vblanks(drm, state);
> -
> - drm_atomic_helper_cleanup_planes(drm, state);
> - drm_atomic_state_put(state);
> -}
> -
> -static void mtk_atomic_work(struct work_struct *work)
> -{
> - struct mtk_drm_private *private = container_of(work,
> - struct mtk_drm_private, commit.work);
> -
> - mtk_atomic_complete(private, private->commit.state);
> -}
> -
> -static int mtk_atomic_commit(struct drm_device *drm,
> - struct drm_atomic_state *state,
> - bool async)
> -{
> - struct mtk_drm_private *private = drm->dev_private;
> - int ret;
> -
> - ret = drm_atomic_helper_prepare_planes(drm, state);
> - if (ret)
> - return ret;
> -
> - mutex_lock(&private->commit.lock);
> - flush_work(&private->commit.work);
> -
> - ret = drm_atomic_helper_swap_state(state, true);
> - if (ret) {
> - mutex_unlock(&private->commit.lock);
> - drm_atomic_helper_cleanup_planes(drm, state);
> - return ret;
> - }
> -
> - drm_atomic_state_get(state);
> - if (async)
> - mtk_atomic_schedule(private, state);
> - else
> - mtk_atomic_complete(private, state);
> -
> - mutex_unlock(&private->commit.lock);
> -
> - return 0;
> -}
> +static const struct drm_mode_config_helper_funcs mtk_drm_mode_config_helpers = {
> + .atomic_commit_tail = drm_atomic_helper_commit_tail_rpm,
> +};
>
> static const struct drm_mode_config_funcs mtk_drm_mode_config_funcs = {
> .fb_create = mtk_drm_mode_fb_create,
> .atomic_check = drm_atomic_helper_check,
> - .atomic_commit = mtk_atomic_commit,
> + .atomic_commit = drm_atomic_helper_commit,
This does not like what the title describe. You just change
atomic_commit implementation from mtk version to helper version. Even
though we don't implement nonblocking atomic commit, this modification
is also necessary because this would reduce the duplicated code in
mediatek drm driver.
Regards,
CK
> };
>
> static const enum mtk_ddp_comp_id mt2701_mtk_ddp_main[] = {
> @@ -265,6 +190,7 @@ static int mtk_drm_kms_init(struct drm_device *drm)
> drm->mode_config.max_width = 4096;
> drm->mode_config.max_height = 4096;
> drm->mode_config.funcs = &mtk_drm_mode_config_funcs;
> + drm->mode_config.helper_private = &mtk_drm_mode_config_helpers;
>
> ret = component_bind_all(drm->dev, drm);
> if (ret)
> @@ -540,8 +466,6 @@ static int mtk_drm_probe(struct platform_device *pdev)
> if (!private)
> return -ENOMEM;
>
> - mutex_init(&private->commit.lock);
> - INIT_WORK(&private->commit.work, mtk_atomic_work);
> private->data = of_device_get_match_data(dev);
>
> mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
> diff --git a/drivers/gpu/drm/mediatek/mtk_drm_drv.h b/drivers/gpu/drm/mediatek/mtk_drm_drv.h
> index b6a82728d563..9f4ce60174f6 100644
> --- a/drivers/gpu/drm/mediatek/mtk_drm_drv.h
> +++ b/drivers/gpu/drm/mediatek/mtk_drm_drv.h
> @@ -46,13 +46,6 @@ struct mtk_drm_private {
> struct device_node *comp_node[DDP_COMPONENT_ID_MAX];
> struct mtk_ddp_comp *ddp_comp[DDP_COMPONENT_ID_MAX];
> const struct mtk_mmsys_driver_data *data;
> -
> - struct {
> - struct drm_atomic_state *state;
> - struct work_struct work;
> - struct mutex lock;
> - } commit;
> -
> struct drm_atomic_state *suspend_state;
>
> bool dma_parms_allocated;
prev parent reply other threads:[~2019-11-01 1:42 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-10-25 5:38 [PATCH] drm/mediatek: covert to helper nonblocking atomic commit Bibby Hsieh
2019-10-25 5:38 ` [PATCH] drm/mediatek: update cursors by using async atomic update Bibby Hsieh
2019-11-01 3:16 ` CK Hu
2019-11-01 3:33 ` CK Hu
2019-10-25 5:38 ` [PATCH v2] drm/mediatek: support CMDQ interface in ddp component Bibby Hsieh
2019-10-31 2:48 ` CK Hu
2019-11-01 1:42 ` CK Hu [this message]
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=1572572537.10339.12.camel@mtksdaap41 \
--to=ck.hu@mediatek.com \
--cc=airlied@linux.ie \
--cc=bibby.hsieh@mediatek.com \
--cc=daniel.vetter@ffwll.ch \
--cc=dri-devel@lists.freedesktop.org \
--cc=drinkcat@chromium.org \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mediatek@lists.infradead.org \
--cc=matthias.bgg@gmail.com \
--cc=p.zabel@pengutronix.de \
--cc=srv_heupstream@mediatek.com \
--cc=tfiga@chromium.org \
--cc=thierry.reding@gmail.com \
--cc=yt.shen@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox