Received: by 2002:a25:31c3:0:0:0:0:0 with SMTP id x186csp720610ybx; Wed, 6 Nov 2019 07:27:05 -0800 (PST) X-Google-Smtp-Source: APXvYqwB174nnvdGSkPufr3hucUQoTlE3a8CK/DY86qfezzuIqUQ2ej3ZBW+jE7WglSSkT1uzynm X-Received: by 2002:a05:6402:142c:: with SMTP id c12mr3288185edx.96.1573054025634; Wed, 06 Nov 2019 07:27:05 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1573054025; cv=none; d=google.com; s=arc-20160816; b=KEE5Qtn2Ty4hzZVfpiJCOq+Gsa1wPGPNSNF7WsoHCrSxoCwVIx1Yiy8b5vMoHyzlfc t5HPJoNxTsc+4Egg4aRq8mleicKWzXdplOLEFNAWURmmUYA+mvqxZw9CbS10SfKtQm9b ThXLOOwD+g04zMAqLxXetvUt8Jj9d/F6oBB99oJozmjS6yFsP/s2UZGm/1opeEOs7yRk yYfF4vCVJST7yy9kyaI6TNMGm/7Z+CqZJ2l4hES0MBe3ZQddVLvkN4hUm9op9HuBsyxq +6BaXJ9AY/X1+70DcXlQoyhiFRRkDHMYVAJB0tZXrEBj38q8LX4uzlikv2SzWp1MSgPw q5+A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:dkim-signature; bh=Kpt1tMqBU2FG8Pm1FbFS5640gv2u5fVbhPUnnmuHCDk=; b=0JzHq1h1a/rmN2DvTjAVh7idjI+Th78g+9IDepi1nrBpWCq5UQx5xyl0Hs1qYkQr3m 7FoNFgRdMBJd9cgxw/N7K/QrvxuQsK/V3NEVDSpnEwnGBKzaKhRdbmqui2gYUdVCSOUs AapEZJUd/6lHC0J0E2Qv6PHeiZI76Xqbqpsx2UKmFcqeGd4RwxhLqRyq+8GfZqV0taLD xe5bL0hPNuG88CliWzUwkwoR9VOuDWNOLTDqK4GOIzfEA+YGeLMjEfLAoPdbrl9cqaUN k+pPa1cbjNR6VDGaA7666iYW+gxh3CZwW0iEn1Rk2K9EIO18Uad1MJHexhsk3uwPz/qb kCYg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=K2oP6Nva; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id a11si954358ejx.181.2019.11.06.07.26.41; Wed, 06 Nov 2019 07:27:05 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=K2oP6Nva; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1732128AbfKFPZN (ORCPT + 99 others); Wed, 6 Nov 2019 10:25:13 -0500 Received: from mail-lf1-f65.google.com ([209.85.167.65]:46785 "EHLO mail-lf1-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1731769AbfKFPZM (ORCPT ); Wed, 6 Nov 2019 10:25:12 -0500 Received: by mail-lf1-f65.google.com with SMTP id 19so13193619lft.13 for ; Wed, 06 Nov 2019 07:25:10 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=Kpt1tMqBU2FG8Pm1FbFS5640gv2u5fVbhPUnnmuHCDk=; b=K2oP6Nva56UfcPhWfgStsFBYCAsokhE7pf+F3uK3ErR+EInHLPlS9LeCwD00P94dAf klz0rDvjuMkE9pNQ49l0FNWsMMLYf6jIWfidO9867TkMHb9053P599iy4mCJVVp/ocB8 OJEo62ZaVSwPgxnaikGCujPfs/GrRSHZ03c+mYmCTIcsGj/yRweLehJ6HdtUCFypNL1x BH8RO0LpxYfmAKu/iLBeIQDz4kv5qBd8E7BuDuWoo8w40O35TG+cW/gtQj0AUyQV2AIA R1BegY2dsdYm1QQ7qPqgUxnkpcTIO0SpQhUa6rH3dwZ2uEdsBdtKov87rFgKfDx8GaRl mwAg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=Kpt1tMqBU2FG8Pm1FbFS5640gv2u5fVbhPUnnmuHCDk=; b=KRAssZBk+o3fabYfsTZF5YW5lk7CIAyMMf1e0JTOHsR7wzs7BVSIADnLhrBDmbEubY ULPPzczp0G3Rn4omr1l2GUJ4cf0rNPxHGbU7lZz6fOuv/VdcQkmxh5tEXovfzmnw4uS/ l3gqqJmPzcyjT5JDQG2SCqUypDJJK8CVq2sX0ifNYAnrqurCDilbqnP1zW7OKNiB/3Ya bYv9D/sW7rHwdXf0Oz7LVCOw8m3rWR3fhUGsRypNdT9bZrFhQf+1A9SIHH8xR3Oh9NOK 7mydHXkHFBZUzJ5jFVcRTTmnvw8vh7vzWBenqrZZEXJRL79QjVOc+Xq4/L9jP0fdXuR6 sByA== X-Gm-Message-State: APjAAAWZhmbgPXtKTAwy0O/6tjzprHcl9brj0VI2zLtDNYNA9TC8CoTb Q2zReyfGkrK6wJ1cqBk+hzthPoTGcO2EKbT1j+U= X-Received: by 2002:a19:4909:: with SMTP id w9mr1969323lfa.174.1573053909911; Wed, 06 Nov 2019 07:25:09 -0800 (PST) MIME-Version: 1.0 References: <20191106094400.445834-1-paul.kocialkowski@bootlin.com> <20191106094400.445834-3-paul.kocialkowski@bootlin.com> In-Reply-To: <20191106094400.445834-3-paul.kocialkowski@bootlin.com> From: Patrik Jakobsson Date: Wed, 6 Nov 2019 16:24:59 +0100 Message-ID: Subject: Re: [PATCH 2/2] drm/gma500: Add page flip support on psb/cdv To: Paul Kocialkowski Cc: dri-devel , linux-kernel , David Airlie , Daniel Vetter , James Hilliard , Thomas Petazzoni Content-Type: text/plain; charset="UTF-8" Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Wed, Nov 6, 2019 at 10:44 AM Paul Kocialkowski wrote: > > Legacy (non-atomic) page flip support is added to the driver by using the > mode_set_base CRTC function, that allows configuring a new framebuffer for > display. Since the function requires the primary plane's fb to be set > already, this is done prior to calling the function in the page flip helper > and reverted if the flip fails. > > The vblank interrupt handler is also refactored to support passing an event. > The PIPE_TE_STATUS bit is also considered to indicate vblank on medfield > only, as explained in psb_enable_vblank. > > It was tested by running weston on both poulsbo and cedartrail. > > Signed-off-by: Paul Kocialkowski > --- > drivers/gpu/drm/gma500/cdv_intel_display.c | 1 + > drivers/gpu/drm/gma500/gma_display.c | 46 ++++++++++++++++++++++ > drivers/gpu/drm/gma500/gma_display.h | 6 +++ > drivers/gpu/drm/gma500/psb_intel_display.c | 1 + > drivers/gpu/drm/gma500/psb_intel_drv.h | 3 ++ > drivers/gpu/drm/gma500/psb_irq.c | 18 +++++++-- > 6 files changed, 72 insertions(+), 3 deletions(-) > > diff --git a/drivers/gpu/drm/gma500/cdv_intel_display.c b/drivers/gpu/drm/gma500/cdv_intel_display.c > index 8b784947ed3b..7109d3d19be0 100644 > --- a/drivers/gpu/drm/gma500/cdv_intel_display.c > +++ b/drivers/gpu/drm/gma500/cdv_intel_display.c > @@ -979,6 +979,7 @@ const struct drm_crtc_funcs cdv_intel_crtc_funcs = { > .gamma_set = gma_crtc_gamma_set, > .set_config = gma_crtc_set_config, > .destroy = gma_crtc_destroy, > + .page_flip = gma_crtc_page_flip, > }; > > const struct gma_clock_funcs cdv_clock_funcs = { > diff --git a/drivers/gpu/drm/gma500/gma_display.c b/drivers/gpu/drm/gma500/gma_display.c > index bc07ae2a9a1d..17f136985d21 100644 > --- a/drivers/gpu/drm/gma500/gma_display.c > +++ b/drivers/gpu/drm/gma500/gma_display.c > @@ -503,6 +503,52 @@ void gma_crtc_destroy(struct drm_crtc *crtc) > kfree(gma_crtc); > } > > +int gma_crtc_page_flip(struct drm_crtc *crtc, > + struct drm_framebuffer *fb, > + struct drm_pending_vblank_event *event, > + uint32_t page_flip_flags, > + struct drm_modeset_acquire_ctx *ctx) > +{ > + struct gma_crtc *gma_crtc = to_gma_crtc(crtc); > + struct drm_framebuffer *current_fb = crtc->primary->fb; > + struct drm_framebuffer *old_fb = crtc->primary->old_fb; > + const struct drm_crtc_helper_funcs *crtc_funcs = crtc->helper_private; > + struct drm_device *dev = crtc->dev; > + unsigned long flags; > + int ret; > + > + if (!crtc_funcs->mode_set_base) > + return -EINVAL; > + > + /* Using mode_set_base requires the new fb to be set already. */ > + crtc->primary->fb = fb; > + > + if (event) { > + spin_lock_irqsave(&dev->event_lock, flags); > + > + WARN_ON(drm_crtc_vblank_get(crtc) != 0); > + > + gma_crtc->page_flip_event = event; > + > + /* Call this locked if we want an event at vblank interrupt. */ > + ret = crtc_funcs->mode_set_base(crtc, crtc->x, crtc->y, old_fb); > + if (ret) { > + gma_crtc->page_flip_event = NULL; > + drm_crtc_vblank_put(crtc); > + } > + > + spin_unlock_irqrestore(&dev->event_lock, flags); > + } else { > + ret = crtc_funcs->mode_set_base(crtc, crtc->x, crtc->y, old_fb); > + } > + > + /* Restore previous fb in case of failure. */ > + if (ret) > + crtc->primary->fb = current_fb; > + > + return ret; > +} > + > int gma_crtc_set_config(struct drm_mode_set *set, > struct drm_modeset_acquire_ctx *ctx) > { > diff --git a/drivers/gpu/drm/gma500/gma_display.h b/drivers/gpu/drm/gma500/gma_display.h > index fdbd7ecaa59c..7bd6c1ee8b21 100644 > --- a/drivers/gpu/drm/gma500/gma_display.h > +++ b/drivers/gpu/drm/gma500/gma_display.h > @@ -11,6 +11,7 @@ > #define _GMA_DISPLAY_H_ > > #include > +#include > > struct drm_encoder; > struct drm_mode_set; > @@ -71,6 +72,11 @@ extern void gma_crtc_prepare(struct drm_crtc *crtc); > extern void gma_crtc_commit(struct drm_crtc *crtc); > extern void gma_crtc_disable(struct drm_crtc *crtc); > extern void gma_crtc_destroy(struct drm_crtc *crtc); > +extern int gma_crtc_page_flip(struct drm_crtc *crtc, > + struct drm_framebuffer *fb, > + struct drm_pending_vblank_event *event, > + uint32_t page_flip_flags, > + struct drm_modeset_acquire_ctx *ctx); > extern int gma_crtc_set_config(struct drm_mode_set *set, > struct drm_modeset_acquire_ctx *ctx); > > diff --git a/drivers/gpu/drm/gma500/psb_intel_display.c b/drivers/gpu/drm/gma500/psb_intel_display.c > index 4256410535f0..fed3b563e62e 100644 > --- a/drivers/gpu/drm/gma500/psb_intel_display.c > +++ b/drivers/gpu/drm/gma500/psb_intel_display.c > @@ -432,6 +432,7 @@ const struct drm_crtc_funcs psb_intel_crtc_funcs = { > .gamma_set = gma_crtc_gamma_set, > .set_config = gma_crtc_set_config, > .destroy = gma_crtc_destroy, > + .page_flip = gma_crtc_page_flip, > }; > > const struct gma_clock_funcs psb_clock_funcs = { > diff --git a/drivers/gpu/drm/gma500/psb_intel_drv.h b/drivers/gpu/drm/gma500/psb_intel_drv.h > index cdf10333d1c2..16c6136f778b 100644 > --- a/drivers/gpu/drm/gma500/psb_intel_drv.h > +++ b/drivers/gpu/drm/gma500/psb_intel_drv.h > @@ -12,6 +12,7 @@ > #include > #include > #include > +#include > #include > #include "gma_display.h" > > @@ -182,6 +183,8 @@ struct gma_crtc { > struct psb_intel_crtc_state *crtc_state; > > const struct gma_clock_funcs *clock_funcs; > + > + struct drm_pending_vblank_event *page_flip_event; > }; > > #define to_gma_crtc(x) \ > diff --git a/drivers/gpu/drm/gma500/psb_irq.c b/drivers/gpu/drm/gma500/psb_irq.c > index e6265fb85626..f787a51f6335 100644 > --- a/drivers/gpu/drm/gma500/psb_irq.c > +++ b/drivers/gpu/drm/gma500/psb_irq.c > @@ -165,11 +165,23 @@ static void mid_pipe_event_handler(struct drm_device *dev, int pipe) > "%s, can't clear status bits for pipe %d, its value = 0x%x.\n", > __func__, pipe, PSB_RVDC32(pipe_stat_reg)); > > - if (pipe_stat_val & PIPE_VBLANK_STATUS) > - drm_handle_vblank(dev, pipe); > + if (pipe_stat_val & PIPE_VBLANK_STATUS || > + (IS_MFLD(dev) && pipe_stat_val & PIPE_TE_STATUS)) { > + struct drm_crtc *crtc = drm_crtc_from_index(dev, pipe); > + struct gma_crtc *gma_crtc = to_gma_crtc(crtc); > + unsigned long flags; > > - if (pipe_stat_val & PIPE_TE_STATUS) > drm_handle_vblank(dev, pipe); > + > + spin_lock_irqsave(&dev->event_lock, flags); > + if (gma_crtc->page_flip_event) { > + drm_crtc_send_vblank_event(crtc, > + gma_crtc->page_flip_event); > + gma_crtc->page_flip_event = NULL; > + drm_crtc_vblank_put(crtc); > + } > + spin_unlock_irqrestore(&dev->event_lock, flags); > + } > } > > /* > -- > 2.23.0 > Looks good! Reviewed-by: Patrik Jakobsson