From patchwork Wed Nov 21 17:15:25 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Neil Armstrong X-Patchwork-Id: 10692861 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id B20C61751 for ; Wed, 21 Nov 2018 17:15:34 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 9663E2C2AA for ; Wed, 21 Nov 2018 17:15:34 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 8A7112C346; Wed, 21 Nov 2018 17:15:34 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-5.2 required=2.0 tests=BAYES_00,MAILING_LIST_MULTI, RCVD_IN_DNSWL_MED,SUBJ_OBFU_PUNCT_MANY autolearn=ham version=3.3.1 Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher DHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id DB08F2C2AA for ; Wed, 21 Nov 2018 17:15:33 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 50A226E52F; Wed, 21 Nov 2018 17:15:31 +0000 (UTC) X-Original-To: dri-devel@lists.freedesktop.org Delivered-To: dri-devel@lists.freedesktop.org Received: from mail-wm1-x344.google.com (mail-wm1-x344.google.com [IPv6:2a00:1450:4864:20::344]) by gabe.freedesktop.org (Postfix) with ESMTPS id ED5EC6E52F for ; Wed, 21 Nov 2018 17:15:29 +0000 (UTC) Received: by mail-wm1-x344.google.com with SMTP id r11-v6so6279474wmb.2 for ; Wed, 21 Nov 2018 09:15:29 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=5Ba68y4wLR6loGecAWkIYOUD+p3jd3X1twbGoOsozgM=; b=U6fA3NV5zVtp0dAvkGVBQOiIb/ZcbhRcwxXJE3O0fvJZ6Vyt83OqBdUJL4899CzMeq nLof3FF3tVSA00IztunhJ2DpAljtOZ3VTUqrMlA3wth2BrfsuXzWeazFfnb+tBKVsxgv fyRsbbI/nJ2wszYotslKUFRI0kt2LPVwH8IqCwwW62PdNl3Axn42XYRpK3RZ7e165Z5t ShmqQmyw1Qe5g8QzQK/Gp/1xavAHF+xk6pM7us/QckeOHhTZFkYX5awn8jzVRc4CIrS3 tohzbUoBFgDXfKEkryLkp4Pn92fNg4drGC+fMZzd32y/uG9qvNJ4tkWxZxzLK8WorNZt hnhA== X-Gm-Message-State: AGRZ1gK/m62p4EhEhmAVKVIhLn+HfmjH25uLGivpKJWKpl574Tk07+Zb A93aTZIWoR5BING0IA5KVvNMAg== X-Google-Smtp-Source: AFSGD/WtNgiSvKut1Py/FS+efe6xkiehrZ1iDydZKhI+amFHDJcckAnX5gJKk4Bt7XsmS4CLEGtS+w== X-Received: by 2002:a1c:307:: with SMTP id 7-v6mr6553392wmd.146.1542820528291; Wed, 21 Nov 2018 09:15:28 -0800 (PST) Received: from bender.home (lfbn-nic-1-206-198.w2-15.abo.wanadoo.fr. [2.15.53.198]) by smtp.gmail.com with ESMTPSA id 194sm2311398wmn.18.2018.11.21.09.15.27 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 21 Nov 2018 09:15:27 -0800 (PST) From: Neil Armstrong To: daniel@ffwll.ch Subject: [PATCH] drm/meson: Fixes for drm_crtc_vblank_on/off support Date: Wed, 21 Nov 2018 18:15:25 +0100 Message-Id: <20181121171525.6593-1-narmstrong@baylibre.com> X-Mailer: git-send-email 2.19.1 MIME-Version: 1.0 X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: linux-amlogic@lists.infradead.org, linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, Neil Armstrong Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" X-Virus-Scanned: ClamAV using ClamSMTP Since Linux 4.17, calls to drm_crtc_vblank_on/off are mandatory, and we get a warning when ctrc is disabled : " driver forgot to call drm_crtc_vblank_off()" But, the vsync IRQ was not totally disabled due the transient hardware state and specific interrupt line thus adding proper IRQ masking from the HHI system control registers. Finally, due to changed in the atomic_disable code path with the updated fbdev emulation, checking the crct state with an atomic_disable call leads to warning in further atomic_begin() with a leftover event not cleared. To Summarize : - Make sure that the CRTC code will call the enable/disable_vblank hooks. - *Really* mask the Vsync IRQ - Allways consume the state event in atomic_disable() Signed-off-by: Neil Armstrong --- drivers/gpu/drm/meson/meson_crtc.c | 6 +++++- drivers/gpu/drm/meson/meson_venc.c | 3 +++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/meson/meson_crtc.c b/drivers/gpu/drm/meson/meson_crtc.c index d78168f979db..a300556248fe 100644 --- a/drivers/gpu/drm/meson/meson_crtc.c +++ b/drivers/gpu/drm/meson/meson_crtc.c @@ -107,6 +107,8 @@ static void meson_crtc_atomic_enable(struct drm_crtc *crtc, priv->io_base + _REG(VPP_MISC)); priv->viu.osd1_enabled = true; + + drm_crtc_vblank_on(crtc); } static void meson_crtc_atomic_disable(struct drm_crtc *crtc, @@ -117,6 +119,8 @@ static void meson_crtc_atomic_disable(struct drm_crtc *crtc, DRM_DEBUG_DRIVER("\n"); + drm_crtc_vblank_off(crtc); + priv->viu.osd1_enabled = false; priv->viu.osd1_commit = false; @@ -128,7 +132,7 @@ static void meson_crtc_atomic_disable(struct drm_crtc *crtc, VPP_VD1_PREBLEND | VPP_POSTBLEND_ENABLE, 0, priv->io_base + _REG(VPP_MISC)); - if (crtc->state->event && !crtc->state->active) { + if (crtc->state->event) { spin_lock_irq(&crtc->dev->event_lock); drm_crtc_send_vblank_event(crtc, crtc->state->event); spin_unlock_irq(&crtc->dev->event_lock); diff --git a/drivers/gpu/drm/meson/meson_venc.c b/drivers/gpu/drm/meson/meson_venc.c index 9be0376e0329..ab72ddda242d 100644 --- a/drivers/gpu/drm/meson/meson_venc.c +++ b/drivers/gpu/drm/meson/meson_venc.c @@ -71,6 +71,7 @@ */ /* HHI Registers */ +#define HHI_GCLK_MPEG2 0x148 /* 0x52 offset in data sheet */ #define HHI_VDAC_CNTL0 0x2F4 /* 0xbd offset in data sheet */ #define HHI_VDAC_CNTL1 0x2F8 /* 0xbe offset in data sheet */ #define HHI_HDMI_PHY_CNTL0 0x3a0 /* 0xe8 offset in data sheet */ @@ -1663,10 +1664,12 @@ unsigned int meson_venci_get_field(struct meson_drm *priv) void meson_venc_enable_vsync(struct meson_drm *priv) { writel_relaxed(2, priv->io_base + _REG(VENC_INTCTRL)); + regmap_update_bits(priv->hhi, HHI_GCLK_MPEG2, BIT(25), BIT(25)); } void meson_venc_disable_vsync(struct meson_drm *priv) { + regmap_update_bits(priv->hhi, HHI_GCLK_MPEG2, BIT(25), 0); writel_relaxed(0, priv->io_base + _REG(VENC_INTCTRL)); }