From patchwork Wed Dec 13 15:33:31 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Maxime Ripard X-Patchwork-Id: 121788 Delivered-To: patch@linaro.org Received: by 10.140.22.227 with SMTP id 90csp5620945qgn; Wed, 13 Dec 2017 07:34:01 -0800 (PST) X-Google-Smtp-Source: ACJfBotvY9RZ8xuAzjh0fDXh6zx0x1lM50vc3EBQ4ZsQ3tq4LAVGYrt6ob0sk+sCVmHzA7lUDe8/ X-Received: by 10.84.233.207 with SMTP id m15mr6196627pln.424.1513179241444; Wed, 13 Dec 2017 07:34:01 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1513179241; cv=none; d=google.com; s=arc-20160816; b=IfS0W/NkJFkaLAflEaa5i8I09WhKVx8FItlwAcpIV2rBMZBC3orIMtEh4Dv+YN0sJH K5H7XLBOf+8odvx8YPzvNK1fH4ihIrIIPghIv7bwmkpjtnaT6eTY+a/woqiqeHUOBMSP E7LnK2+j3WlhYFTb3qcSxM+UCi9MK+Xe+FNWyIg5loQQV6yEnudwZabap0Cw9mGe1q/s q1BYe26yhGP0BEFflcEd79C19398w34W6ueumEblK0jnAcbbr0mYPj4ThLUq6ClOf93M Py2OvfLoBqYz3JOBW7NCfwxfvizkwI2JjXVM6t7+SeQ6hrBtC1qVoRYDQjqq5ustGm0k diRw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:references :in-reply-to:message-id:date:subject:cc:to:from :arc-authentication-results; bh=P/aJhQgJbQDDuABy1QeMaQirCPJajTtY2ipxt75KdVU=; b=wB6YHQv5qFF1fLkdIeeFMmQTtCRAualOv48XAdyWrkZ5qamQKHinsDPJxMB9nC9+kL BFFq3hAJilDwnsYylzFSyQHYzwvmWBeCLTRM7bxqZFolUH0KnjbiC7oSK8+cZyf2mSgP 9Mt7Sja/3PDJuXxy590vywFG2XIbbP45HBbXPNivsrlbaB0wN1r2kQ20QsidPM6/EGVi MqEFU/jMbxED/7PjXObaTnx3BK7odViuhV+jVRegH5qjLnh+KaXzxOSdv4yO4Fr+cIWg tTR+ZxVO1ukFd56UrSVMIm9BnxpsizGfmmsASP3J4ajMRf2NWRP2SMRdVmN5cy9G30yY VLKg== ARC-Authentication-Results: i=1; mx.google.com; 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 o65si1432347pga.142.2017.12.13.07.34.01; Wed, 13 Dec 2017 07:34:01 -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; 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 S1753560AbdLMPd6 (ORCPT + 12 others); Wed, 13 Dec 2017 10:33:58 -0500 Received: from mail.free-electrons.com ([62.4.15.54]:37727 "EHLO mail.free-electrons.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753441AbdLMPdl (ORCPT ); Wed, 13 Dec 2017 10:33:41 -0500 Received: by mail.free-electrons.com (Postfix, from userid 110) id 1E8BB20981; Wed, 13 Dec 2017 16:33:40 +0100 (CET) X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on mail.free-electrons.com X-Spam-Level: X-Spam-Status: No, score=-1.0 required=5.0 tests=ALL_TRUSTED,SHORTCIRCUIT shortcircuit=ham autolearn=disabled version=3.4.0 Received: from localhost (LStLambert-657-1-97-87.w90-63.abo.wanadoo.fr [90.63.216.87]) by mail.free-electrons.com (Postfix) with ESMTPSA id EDCAA20503; Wed, 13 Dec 2017 16:33:39 +0100 (CET) From: Maxime Ripard To: Daniel Vetter , David Airlie , Chen-Yu Tsai , Maxime Ripard Cc: dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, Thomas Petazzoni , thomas@vitsch.nl Subject: [PATCH 7/8] drm/sun4i: sun4i_layer: Add a custom atomic_check for the frontend Date: Wed, 13 Dec 2017 16:33:31 +0100 Message-Id: <4fbc349e2c3aa2efeadb55ea120c64b56c707cb4.1513178989.git-series.maxime.ripard@free-electrons.com> X-Mailer: git-send-email 2.14.3 In-Reply-To: References: In-Reply-To: References: Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Now that we have everything in place, we can start enabling the frontend. This is more difficult than one would assume since there can only be one plane using the frontend per-backend. We therefore need to make sure that the userspace will not try to setup multiple planes using it, since that would be impossible. In order to prevent that, we can create an atomic_check callback that will check that only one plane will effectively make use of the frontend in a given configuration, and will toggle the switch in that plane state so that the proper setup function can do their role. Signed-off-by: Maxime Ripard --- drivers/gpu/drm/sun4i/sun4i_backend.c | 65 ++++++++++++++++++++++++++++- drivers/gpu/drm/sun4i/sun4i_backend.h | 2 +- 2 files changed, 67 insertions(+) -- git-series 0.9.1 diff --git a/drivers/gpu/drm/sun4i/sun4i_backend.c b/drivers/gpu/drm/sun4i/sun4i_backend.c index f1d19767c55d..a7b87a12990e 100644 --- a/drivers/gpu/drm/sun4i/sun4i_backend.c +++ b/drivers/gpu/drm/sun4i/sun4i_backend.c @@ -11,6 +11,7 @@ */ #include +#include #include #include #include @@ -271,6 +272,69 @@ int sun4i_backend_update_layer_buffer(struct sun4i_backend *backend, return 0; } +static bool sun4i_backend_plane_uses_scaler(struct drm_plane_state *state) +{ + u16 src_h = state->src_h >> 16; + u16 src_w = state->src_w >> 16; + + DRM_DEBUG_DRIVER("Input size %dx%d, output size %dx%d\n", + src_w, src_h, state->crtc_w, state->crtc_h); + + if ((state->crtc_h != src_h) || (state->crtc_w != src_w)) + return true; + + return false; +} + +static bool sun4i_backend_plane_uses_frontend(struct drm_plane_state *state) +{ + struct sun4i_layer *layer = plane_to_sun4i_layer(state->plane); + struct sun4i_backend *backend = layer->backend; + + if (IS_ERR(backend->frontend)) + return false; + + return sun4i_backend_plane_uses_scaler(state); +} + +static int sun4i_backend_atomic_check(struct sunxi_engine *engine, + struct drm_crtc_state *crtc_state) +{ + struct drm_atomic_state *state = crtc_state->state; + struct drm_device *drm = state->dev; + struct drm_plane *plane; + unsigned int num_frontend_planes = 0; + + DRM_DEBUG_DRIVER("Starting checking our planes\n"); + + if (!crtc_state->planes_changed) + return 0; + + drm_for_each_plane_mask(plane, drm, crtc_state->plane_mask) { + struct drm_plane_state *plane_state = + drm_atomic_get_plane_state(state, plane); + struct sun4i_layer_state *layer_state = + state_to_sun4i_layer_state(plane_state); + + if (sun4i_backend_plane_uses_frontend(plane_state)) { + DRM_DEBUG_DRIVER("Using the frontend for plane %d\n", + plane->index); + + layer_state->uses_frontend = true; + num_frontend_planes++; + } else { + layer_state->uses_frontend = false; + } + } + + if (num_frontend_planes > SUN4I_BACKEND_NUM_FRONTEND_LAYERS) { + DRM_DEBUG_DRIVER("Too many planes going through the frontend, rejecting\n"); + return -EINVAL; + } + + return 0; +} + static int sun4i_backend_init_sat(struct device *dev) { struct sun4i_backend *backend = dev_get_drvdata(dev); int ret; @@ -384,6 +448,7 @@ static struct sun4i_frontend *sun4i_backend_find_frontend(struct sun4i_drv *drv, } static const struct sunxi_engine_ops sun4i_backend_engine_ops = { + .atomic_check = sun4i_backend_atomic_check, .commit = sun4i_backend_commit, .layers_init = sun4i_layers_init, .apply_color_correction = sun4i_backend_apply_color_correction, diff --git a/drivers/gpu/drm/sun4i/sun4i_backend.h b/drivers/gpu/drm/sun4i/sun4i_backend.h index 636a51521e77..3b5531440fa3 100644 --- a/drivers/gpu/drm/sun4i/sun4i_backend.h +++ b/drivers/gpu/drm/sun4i/sun4i_backend.h @@ -144,6 +144,8 @@ #define SUN4I_BACKEND_HWCCOLORTAB_OFF 0x4c00 #define SUN4I_BACKEND_PIPE_OFF(p) (0x5000 + (0x400 * (p))) +#define SUN4I_BACKEND_NUM_FRONTEND_LAYERS 1 + struct sun4i_backend { struct sunxi_engine engine; struct sun4i_frontend *frontend;