From patchwork Wed Dec 20 15:46:12 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Osipenko X-Patchwork-Id: 10127149 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id EE6A5603B5 for ; Thu, 21 Dec 2017 09:00:05 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id E10F628BC0 for ; Thu, 21 Dec 2017 09:00:05 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id D5EB729B39; Thu, 21 Dec 2017 09:00:05 +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=-4.1 required=2.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED, DKIM_SIGNED, FREEMAIL_FROM, RCVD_IN_DNSWL_MED, T_DKIM_INVALID 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 60B1F28BC0 for ; Thu, 21 Dec 2017 09:00:05 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id AEE526E5A9; Thu, 21 Dec 2017 08:59:59 +0000 (UTC) X-Original-To: dri-devel@lists.freedesktop.org Delivered-To: dri-devel@lists.freedesktop.org Received: from mail-lf0-x241.google.com (mail-lf0-x241.google.com [IPv6:2a00:1450:4010:c07::241]) by gabe.freedesktop.org (Postfix) with ESMTPS id DE2826E42D for ; Wed, 20 Dec 2017 15:50:15 +0000 (UTC) Received: by mail-lf0-x241.google.com with SMTP id r143so24532892lfe.13 for ; Wed, 20 Dec 2017 07:50:15 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :in-reply-to:references; bh=3Kv1kRARSvb8tRDohtbDOrMqbln2IJkSkymy+bBx/ig=; b=P6U7usNdAQMJwcwfUxIIeycDySx6xWjP9N/FOp3SwuqcRphjXGox9Te+fL2m22tK7+ NTN1WvemvpMkkNXYAwFzLcckuuO/3+T3U3cKoMqkBdhqRukHQm8ngMfBOsml9n2fhWrh 2VhyrL3yRzfc+djTpMldh+cKgo8K/hODTg7eAs0ikXBkI2fNAFEf5XrZLO9FWpI47siw F1tl0xvsrDDMqHNUeXaowH8RuOlzqnALajzItUn/50SGA6Wt9f07qVfGAQYVBhrd8qFC BIsg71vopwfxAV5Te9M/9Axobmm3tsmQvrQq2TJqDHTQspE+ACcXgthk8lE/0nv2TH2C SZlQ== 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:in-reply-to :references:in-reply-to:references; bh=3Kv1kRARSvb8tRDohtbDOrMqbln2IJkSkymy+bBx/ig=; b=aPby8Te6Ts/oO896R0cLql74c3dk5PSY2rxmWZ9VVVxXL005coVh1dBUPWLiDmztwB 9EQw+EPv+Gzg/aZvVBxL+cGoNZCR+JdfEiym2gFdeDMxdd3Tchv6lW+r536Waxcy+6Pf +RcGaewCo9EoIM/F/v4joqWoU0cwRBzHWGciAddpubAb7cZ2fe/KH2NG8rAJREwU0czl HxT5Mdnn6Kiq0VPQZ+2TCrJ88eeQ8KQwjlNn/OVh89FIFQYUGKvmRnfm/2FqKOVU3QYw xjOMuzL3b7pYC46Fn72rJZE/vuMZcfnE+SFjDNx/W9JlTqT2xMp0Cm5bZzg5mudJY6dq dkuQ== X-Gm-Message-State: AKGB3mLlVA6dxkf+69F5g47GEq81TYtG/ztn3XsajmjJciRkdo8WKrlh 35vf4GcWIrmlYn4gUGQdzJs= X-Google-Smtp-Source: ACJfBou4Njc/OlekEOYmh3b4afEKTyjtEnVEQmqknskkzuVXcuaWfxYP/09L2A0FyoZ6j1O5+zh+wA== X-Received: by 10.25.225.147 with SMTP id l19mr1922397lfk.110.1513785014048; Wed, 20 Dec 2017 07:50:14 -0800 (PST) Received: from localhost.localdomain (ppp109-252-55-194.pppoe.spdop.ru. [109.252.55.194]) by smtp.gmail.com with ESMTPSA id m18sm3685762lje.21.2017.12.20.07.50.12 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 20 Dec 2017 07:50:13 -0800 (PST) From: Dmitry Osipenko To: Thierry Reding Subject: [PATCH v3 3/5] drm/tegra: Trade overlay plane for cursor on older Tegra's Date: Wed, 20 Dec 2017 18:46:12 +0300 Message-Id: X-Mailer: git-send-email 2.15.1 In-Reply-To: References: In-Reply-To: References: X-Mailman-Approved-At: Thu, 21 Dec 2017 08:59:57 +0000 Cc: linux-tegra@vger.kernel.org, linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" X-Virus-Scanned: ClamAV using ClamSMTP Older Tegra's do not support RGBA format for the cursor, but instead overlay plane could be used for it. Since there is no much use for the overlays on a regular desktop and HW-accelerated cursor is much nicer than the jerky SW cursor, let's trade one overlay plane for the cursor. Signed-off-by: Dmitry Osipenko --- drivers/gpu/drm/tegra/dc.c | 75 +++++++++++++++++++++++++++++++++++----------- drivers/gpu/drm/tegra/dc.h | 2 ++ 2 files changed, 59 insertions(+), 18 deletions(-) diff --git a/drivers/gpu/drm/tegra/dc.c b/drivers/gpu/drm/tegra/dc.c index 460510366bb8..eaff8757bbe0 100644 --- a/drivers/gpu/drm/tegra/dc.c +++ b/drivers/gpu/drm/tegra/dc.c @@ -125,9 +125,10 @@ static inline u32 compute_initial_dda(unsigned int in) return dfixed_frac(inf); } -static void tegra_dc_setup_window(struct tegra_dc *dc, unsigned int index, +static void tegra_dc_setup_window(struct tegra_dc *dc, struct drm_plane *plane, const struct tegra_dc_window *window) { + struct tegra_plane *p = to_tegra_plane(plane); unsigned h_offset, v_offset, h_size, v_size, h_dda, v_dda, bpp; unsigned long value, flags; bool yuv, planar; @@ -144,7 +145,7 @@ static void tegra_dc_setup_window(struct tegra_dc *dc, unsigned int index, spin_lock_irqsave(&dc->lock, flags); - value = WINDOW_A_SELECT << index; + value = WINDOW_A_SELECT << p->index; tegra_dc_writel(dc, value, DC_CMD_DISPLAY_WINDOW_HEADER); tegra_dc_writel(dc, window->format, DC_WIN_COLOR_DEPTH); @@ -275,23 +276,29 @@ static void tegra_dc_setup_window(struct tegra_dc *dc, unsigned int index, tegra_dc_writel(dc, 0xffff00, DC_WIN_BLEND_NOKEY); tegra_dc_writel(dc, 0xffff00, DC_WIN_BLEND_1WIN); - switch (index) { + switch (p->index) { case 0: tegra_dc_writel(dc, 0x000000, DC_WIN_BLEND_2WIN_X); - tegra_dc_writel(dc, 0x000000, DC_WIN_BLEND_2WIN_Y); + tegra_dc_writel(dc, 0x000008, DC_WIN_BLEND_2WIN_Y); tegra_dc_writel(dc, 0x000000, DC_WIN_BLEND_3WIN_XY); break; case 1: tegra_dc_writel(dc, 0xffff00, DC_WIN_BLEND_2WIN_X); - tegra_dc_writel(dc, 0x000000, DC_WIN_BLEND_2WIN_Y); - tegra_dc_writel(dc, 0x000000, DC_WIN_BLEND_3WIN_XY); + tegra_dc_writel(dc, 0x000008, DC_WIN_BLEND_2WIN_Y); + tegra_dc_writel(dc, 0x000008, DC_WIN_BLEND_3WIN_XY); break; case 2: - tegra_dc_writel(dc, 0xffff00, DC_WIN_BLEND_2WIN_X); - tegra_dc_writel(dc, 0xffff00, DC_WIN_BLEND_2WIN_Y); - tegra_dc_writel(dc, 0xffff00, DC_WIN_BLEND_3WIN_XY); + if (plane->type == DRM_PLANE_TYPE_CURSOR) { + tegra_dc_writel(dc, 0xffff04, DC_WIN_BLEND_2WIN_X); + tegra_dc_writel(dc, 0xffff04, DC_WIN_BLEND_2WIN_Y); + tegra_dc_writel(dc, 0xffff04, DC_WIN_BLEND_3WIN_XY); + } else { + tegra_dc_writel(dc, 0xffff00, DC_WIN_BLEND_2WIN_X); + tegra_dc_writel(dc, 0xffff00, DC_WIN_BLEND_2WIN_Y); + tegra_dc_writel(dc, 0xffff00, DC_WIN_BLEND_3WIN_XY); + } break; } @@ -433,7 +440,6 @@ static void tegra_plane_atomic_update(struct drm_plane *plane, struct tegra_plane_state *state = to_tegra_plane_state(plane->state); struct tegra_dc *dc = to_tegra_dc(plane->state->crtc); struct drm_framebuffer *fb = plane->state->fb; - struct tegra_plane *p = to_tegra_plane(plane); struct tegra_dc_window window; unsigned int i; @@ -475,7 +481,7 @@ static void tegra_plane_atomic_update(struct drm_plane *plane, window.stride[i] = fb->pitches[i]; } - tegra_dc_setup_window(dc, p->index, &window); + tegra_dc_setup_window(dc, plane, &window); } static const struct drm_plane_helper_funcs tegra_plane_helper_funcs = { @@ -706,6 +712,14 @@ static const u32 tegra20_overlay_formats[] = { DRM_FORMAT_YUV422, }; +static const u32 tegra20_overlay_cursor_formats[] = { + DRM_FORMAT_ARGB4444, + DRM_FORMAT_ARGB1555, + DRM_FORMAT_RGBA5551, + DRM_FORMAT_ABGR8888, + DRM_FORMAT_ARGB8888, +}; + static const u32 tegra114_overlay_formats[] = { DRM_FORMAT_ARGB4444, DRM_FORMAT_ARGB1555, @@ -765,9 +779,11 @@ static const u32 tegra124_overlay_formats[] = { static struct drm_plane *tegra_dc_overlay_plane_create(struct drm_device *drm, struct tegra_dc *dc, - unsigned int index) + unsigned int index, + bool cursor) { struct tegra_plane *plane; + enum drm_plane_type type; unsigned int num_formats; const u32 *formats; int err; @@ -781,13 +797,19 @@ static struct drm_plane *tegra_dc_overlay_plane_create(struct drm_device *drm, plane->index = index; plane->depth = 0; - num_formats = dc->soc->num_overlay_formats; - formats = dc->soc->overlay_formats; + if (cursor) { + num_formats = dc->soc->num_overlay_cursor_formats; + formats = dc->soc->overlay_cursor_formats; + type = DRM_PLANE_TYPE_CURSOR; + } else { + num_formats = dc->soc->num_overlay_formats; + formats = dc->soc->overlay_formats; + type = DRM_PLANE_TYPE_OVERLAY; + } err = drm_universal_plane_init(drm, &plane->base, 1 << dc->pipe, &tegra_plane_funcs, formats, - num_formats, NULL, - DRM_PLANE_TYPE_OVERLAY, NULL); + num_formats, NULL, type, NULL); if (err < 0) { kfree(plane); return ERR_PTR(err); @@ -836,14 +858,18 @@ static struct drm_plane *tegra_dc_add_planes(struct drm_device *drm, struct tegra_dc *dc) { struct drm_plane *plane, *primary; + unsigned int planes_num = 2; unsigned int i; primary = tegra_primary_plane_create(drm, dc); if (IS_ERR(primary)) return primary; - for (i = 0; i < 2; i++) { - plane = tegra_dc_overlay_plane_create(drm, dc, 1 + i); + if (!dc->soc->supports_cursor) + planes_num--; + + for (i = 0; i < planes_num; i++) { + plane = tegra_dc_overlay_plane_create(drm, dc, 1 + i, false); if (IS_ERR(plane)) { /* XXX tegra_plane_destroy() */ drm_plane_cleanup(primary); @@ -1766,6 +1792,13 @@ static int tegra_dc_init(struct host1x_client *client) err = PTR_ERR(cursor); goto cleanup; } + } else { + /* trade overlay for RGBA cursor plane on older Tegra's */ + cursor = tegra_dc_overlay_plane_create(drm, dc, 2, true); + if (IS_ERR(cursor)) { + err = PTR_ERR(cursor); + goto cleanup; + } } err = drm_crtc_init_with_planes(drm, &dc->base, primary, cursor, @@ -1855,6 +1888,9 @@ static const struct tegra_dc_soc_info tegra20_dc_soc_info = { .primary_formats = tegra20_primary_formats, .num_overlay_formats = ARRAY_SIZE(tegra20_overlay_formats), .overlay_formats = tegra20_overlay_formats, + .num_overlay_cursor_formats = + ARRAY_SIZE(tegra20_overlay_cursor_formats), + .overlay_cursor_formats = tegra20_overlay_cursor_formats, .supports_opaque_formats = false, }; @@ -1871,6 +1907,9 @@ static const struct tegra_dc_soc_info tegra30_dc_soc_info = { .primary_formats = tegra20_primary_formats, .num_overlay_formats = ARRAY_SIZE(tegra20_overlay_formats), .overlay_formats = tegra20_overlay_formats, + .num_overlay_cursor_formats = + ARRAY_SIZE(tegra20_overlay_cursor_formats), + .overlay_cursor_formats = tegra20_overlay_cursor_formats, .supports_opaque_formats = false, }; diff --git a/drivers/gpu/drm/tegra/dc.h b/drivers/gpu/drm/tegra/dc.h index 3a66a1127ee7..e7cdf1d0729d 100644 --- a/drivers/gpu/drm/tegra/dc.h +++ b/drivers/gpu/drm/tegra/dc.h @@ -65,6 +65,8 @@ struct tegra_dc_soc_info { unsigned int num_primary_formats; const u32 *overlay_formats; unsigned int num_overlay_formats; + const u32 *overlay_cursor_formats; + unsigned int num_overlay_cursor_formats; bool supports_opaque_formats; };