Received: by 2002:ad5:474a:0:0:0:0:0 with SMTP id i10csp951360imu; Wed, 28 Nov 2018 02:08:36 -0800 (PST) X-Google-Smtp-Source: AFSGD/We3Lm8tzoSPCwBZRDCDUQCJAFlo6/IgJBreidpfPI9ReYZQLzs3vD+Hx5RZoPZ+Zp/wEgx X-Received: by 2002:a63:2f86:: with SMTP id v128mr31616897pgv.407.1543399716016; Wed, 28 Nov 2018 02:08:36 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1543399715; cv=none; d=google.com; s=arc-20160816; b=bUe/EI2M5zDHZ9aq9H4U1HnRn98mEy85i7pR26pIQXhe9KNIPqIt40a7zdEmKSg3y3 pbgoQEAbvyQyhevJKVyI/e4AeuQd2yPWov6kbtJNiLIlzIBPW5IWiHsObuaS9YznNDVc O+f06q4QZ4DKtN9MoE7lVgaORgx57LqbP9Hg6nveoWALPksRxkN2GAt+4b1UB7fWvXde SItgaxkmTZ74/70NbbFPPZYwLvIdjEJ9YMonqnVTaOf4PoZgpwmMifw+ruXh5s3XR/Fj IIPjKRvqk0iESsELTkscrqtO6DZQoCS81PwztrPmUrOuRljNyL14lrwZb863GZT829pQ J4IA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :message-id:date:subject:cc:to:from:dkim-signature; bh=dQVMuqWbkOH065zM1K32Q1gjaQprT4aEQt0Rzogauk4=; b=ZnhSVIf88qroshgXKX5BNhZA8l+DWuk0jkDeetRg8xzkIm6vFZR3SkctTqCy+XDg5k ExTCgZk5kZJ1vQtQyIDliBhzLCuiD4lGyMQb4pxp2dujBqA+pS1OV6PeP1X9LA9oTOfS 7uy1M9++4p8QMly9atvo+W6jgJMcA/baWSUjGr4hmCl1WUB/pkeAxGwkj9gpIiJOs+TU Q8DlypO+5OJRJzhE8BJzW+mrRgzWXJgboEIhA5S3lhAKDJQKyIj3tqAKD2Qk67CMKTeD be5IVchnDGoj7nvotw4LTKVp5SA78dweGApctZaTVKyEc6ShUkEYEekJeHFEev3sAZkA yyFg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@baylibre-com.20150623.gappssmtp.com header.s=20150623 header.b=e7n3oRUB; 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 Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id b7si7183430plb.234.2018.11.28.02.08.21; Wed, 28 Nov 2018 02:08:35 -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=@baylibre-com.20150623.gappssmtp.com header.s=20150623 header.b=e7n3oRUB; 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 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728235AbeK1VIt (ORCPT + 99 others); Wed, 28 Nov 2018 16:08:49 -0500 Received: from mail-wm1-f68.google.com ([209.85.128.68]:55327 "EHLO mail-wm1-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727729AbeK1VIs (ORCPT ); Wed, 28 Nov 2018 16:08:48 -0500 Received: by mail-wm1-f68.google.com with SMTP id y139so1918931wmc.5 for ; Wed, 28 Nov 2018 02:07:40 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=dQVMuqWbkOH065zM1K32Q1gjaQprT4aEQt0Rzogauk4=; b=e7n3oRUB1ZyD44xI8MMESz8QwfVdrQ26WbOo38xr+JCBgBUHsX3RNe48bKJ42WuMHk QWCPMPskffkm2KIbExgbYOCd7MG2tllnqk5F+lJlFyE36t/DZTu82BKkEtxNhNqwxpiO BOc2sIk1ztDdT+m2Z2LFOOhqj8MSfqpUjsGr8l8+WLuZZXVHmytWTzUIri0uv5YSQpCs +4N/P2Qj4iQ79yPRlZjl4epbZZPAjcZBfPa/nO3x5uNl62Jd8eJIrcLXAtGi34GXylqE 2QASYg34bx1ocyZFiWJSsUGss6mioPafbD9v4rtO1QKOqQqAr1ZQdyNJTQfdle6ktLYc XtOw== 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=dQVMuqWbkOH065zM1K32Q1gjaQprT4aEQt0Rzogauk4=; b=ef8KdOq42Iuu7V8Hyvq0uDZEgBW4J1a4sy0sRH3TR6+30/UL9rhDW1D+kWUgvI7ios V+vcWx6gtjLuFUT01JxyR2LY5oyQNnk8ajIOOjevo9FjD36zyX2G9b5X7K2yVofk40pp 5dC2xdJgS2VcrphH8/dWqiWxsict8rshqciO36UulQd2J4NJAhWhZWM1P4iRTm+bJNV7 hT6HKfgzmKjrJeeCTfHxckkVF7tW3ZNnS0H09fXa9zxA8d6a7rCz7pKa8SHvnKpbFJhR wZOMNM/MrEtjUr5c7sA53fQpVcrY6YxDEvkCT9Otg3lvFjFETTRISJG0a0jPIzYjnSBz cmkg== X-Gm-Message-State: AA+aEWadE0uQ2bSgv62LvLmHLmze/GBXPm55ylF/mCmwiiv+i9smm4Pb 3PbpQ3hFIlInhq/KduNdQASC/w== X-Received: by 2002:a1c:e046:: with SMTP id x67mr2063914wmg.122.1543399659575; Wed, 28 Nov 2018 02:07:39 -0800 (PST) Received: from bender.baylibre.local (lmontsouris-657-1-212-31.w90-63.abo.wanadoo.fr. [90.63.244.31]) by smtp.gmail.com with ESMTPSA id h16sm5509730wrs.60.2018.11.28.02.07.38 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 28 Nov 2018 02:07:38 -0800 (PST) From: Neil Armstrong To: dri-devel@lists.freedesktop.org Cc: Neil Armstrong , linux-amlogic@lists.infradead.org, linux-kernel@vger.kernel.org Subject: [PATCH v2] drm/meson: Fix an Alpha Primary Plane bug on Meson GXL/GXM SoCs Date: Wed, 28 Nov 2018 11:07:34 +0100 Message-Id: <20181128100734.6536-1-narmstrong@baylibre.com> X-Mailer: git-send-email 2.19.2 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On the Amlogic GXL & GXM SoCs, a bug occurs on the primary plane when alpha is used where the alpha is not aligned with the pixel content. The woraround Amlogic implemented is to reset the OSD1 plane hardware block each time the plane is (re)enabled, solving the issue. In the reset, we still need to save the content of 2 registers which depends on the status of the plane, in addition to reload the scaler conversion matrix at the same time. Signed-off-by: Neil Armstrong --- Changes since v1 at [1]: - Fix flickering and shaking by moving reset when plane is disabled [1] https://patchwork.freedesktop.org/patch/263550/ drivers/gpu/drm/meson/meson_plane.c | 12 ++++++++++++ drivers/gpu/drm/meson/meson_viu.c | 27 +++++++++++++++++++++++++++ drivers/gpu/drm/meson/meson_viu.h | 1 + 3 files changed, 40 insertions(+) diff --git a/drivers/gpu/drm/meson/meson_plane.c b/drivers/gpu/drm/meson/meson_plane.c index 12a47b4f65a5..8e27f275ece8 100644 --- a/drivers/gpu/drm/meson/meson_plane.c +++ b/drivers/gpu/drm/meson/meson_plane.c @@ -79,6 +79,7 @@ struct meson_plane { struct drm_plane base; struct meson_drm *priv; + bool enabled; }; #define to_meson_plane(x) container_of(x, struct meson_plane, base) @@ -303,6 +304,15 @@ static void meson_plane_atomic_update(struct drm_plane *plane, priv->viu.osd1_stride = fb->pitches[0]; priv->viu.osd1_height = fb->height; + if (!meson_plane->enabled) { + /* Reset OSD1 before enabling it on GXL+ SoCs */ + if (meson_vpu_is_compatible(priv, "amlogic,meson-gxm-vpu") || + meson_vpu_is_compatible(priv, "amlogic,meson-gxl-vpu")) + meson_viu_osd1_reset(priv); + + meson_plane->enabled = true; + } + spin_unlock_irqrestore(&priv->drm->event_lock, flags); } @@ -316,6 +326,8 @@ static void meson_plane_atomic_disable(struct drm_plane *plane, writel_bits_relaxed(VPP_OSD1_POSTBLEND, 0, priv->io_base + _REG(VPP_MISC)); + meson_plane->enabled = false; + } static const struct drm_plane_helper_funcs meson_plane_helper_funcs = { diff --git a/drivers/gpu/drm/meson/meson_viu.c b/drivers/gpu/drm/meson/meson_viu.c index 2dffb987ec65..0ba87ff95530 100644 --- a/drivers/gpu/drm/meson/meson_viu.c +++ b/drivers/gpu/drm/meson/meson_viu.c @@ -296,6 +296,33 @@ static void meson_viu_load_matrix(struct meson_drm *priv) true); } +/* VIU OSD1 Reset as workaround for GXL+ Alpha OSD Bug */ +void meson_viu_osd1_reset(struct meson_drm *priv) +{ + uint32_t osd1_fifo_ctrl_stat, osd1_ctrl_stat2; + + /* Save these 2 registers state */ + osd1_fifo_ctrl_stat = readl_relaxed( + priv->io_base + _REG(VIU_OSD1_FIFO_CTRL_STAT)); + osd1_ctrl_stat2 = readl_relaxed( + priv->io_base + _REG(VIU_OSD1_CTRL_STAT2)); + + /* Reset OSD1 */ + writel_bits_relaxed(BIT(0), BIT(0), + priv->io_base + _REG(VIU_SW_RESET)); + writel_bits_relaxed(BIT(0), 0, + priv->io_base + _REG(VIU_SW_RESET)); + + /* Rewrite these registers state lost in the reset */ + writel_relaxed(osd1_fifo_ctrl_stat, + priv->io_base + _REG(VIU_OSD1_FIFO_CTRL_STAT)); + writel_relaxed(osd1_ctrl_stat2, + priv->io_base + _REG(VIU_OSD1_CTRL_STAT2)); + + /* Reload the conversion matrix */ + meson_viu_load_matrix(priv); +} + void meson_viu_init(struct meson_drm *priv) { uint32_t reg; diff --git a/drivers/gpu/drm/meson/meson_viu.h b/drivers/gpu/drm/meson/meson_viu.h index 073b1910bd1b..0f84bddd2ff0 100644 --- a/drivers/gpu/drm/meson/meson_viu.h +++ b/drivers/gpu/drm/meson/meson_viu.h @@ -59,6 +59,7 @@ #define OSD_REPLACE_EN BIT(14) #define OSD_REPLACE_SHIFT 6 +void meson_viu_osd1_reset(struct meson_drm *priv); void meson_viu_init(struct meson_drm *priv); #endif /* __MESON_VIU_H */ -- 2.19.2