Received: by 2002:a05:7412:e79e:b0:f3:1519:9f41 with SMTP id o30csp20273rdd; Wed, 22 Nov 2023 08:21:56 -0800 (PST) X-Google-Smtp-Source: AGHT+IGMqeqq0/cN7XVXUBkUFKVRGlxMe9fIpYqjfTqGLXv7MbbJWUkeQdoU6nQsPG3bdlOBrCB3 X-Received: by 2002:a17:902:e80b:b0:1cc:385b:456a with SMTP id u11-20020a170902e80b00b001cc385b456amr3103242plg.44.1700670116294; Wed, 22 Nov 2023 08:21:56 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1700670116; cv=none; d=google.com; s=arc-20160816; b=hIv4VP/YJ1NHsX7cMUb/KnuK890Bz7lJ1H1jTpjykG1xNtnGt3bBQE2XQeZRvuewcZ fK3jmmuzxO/Ov38QEjEuBEcUS+urdO3iAEmZ54ZNPKsKD3X5WOTPHfClfJFQF69629gT NmtVQfAtnwIzyZykrnG3IWUIoKkF5wtE44cGQYC/6uLLkAtMK3q6YUCo7zCZEai9IyFG f8GaK3FHpzweTsElMakJrPldShW8K5xuZT67M/XhAovgngdLFgT+FRE73tRTJYbOxkjs nnSUoh4xuRjVw0ewoVEGdYpZ8w7RN1N3Qb+dyUINDn4IdU7QiI5/Qf8aZZEJkwqc+5+w vfrw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=6oQ05sxUVSUOtFBVscV1RsI7xjS53GqoZMmDxVRMp58=; fh=twETL0X6hiFtzuU124rNjRfRDx+3Jx2TyWjVxuU3kZI=; b=fTMNhX2KamI7PjNqQhEqbrQQknMMmjloszxTg2IvJIn+HPRSSTMxohp1iKBk7Uh0T2 HjjjqtB3PtFTcFWcP9ek3JYtYcR2t8bXV54oKtUGfmymD+xGL2fYe40QY/LIkaTZnB/V U0sghubmL9LxoRjnoSQr8s6ilKYHpsbYBYjKyeASILE2lrzYHPB3xhVmujRDepLzV5G3 tBOZO8kIPkHqNpQeLoF8SESIULrgjlf1KvaU9atnQ0L2HL8qHaohOCVpqk0VE61oF1x6 tZmsflpGZYr8YP60A3dwObnuWdq7gRcIIAQbKkba/qJjDta1iwtsdU4BS0E7FfIF7It9 U8+A== ARC-Authentication-Results: i=1; mx.google.com; dkim=fail header.i=@igalia.com header.s=20170329 header.b=kL81kjGg; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.38 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from fry.vger.email (fry.vger.email. [23.128.96.38]) by mx.google.com with ESMTPS id k8-20020a170902694800b001c9d03042b6si12178671plt.7.2023.11.22.08.21.55 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 22 Nov 2023 08:21:56 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.38 as permitted sender) client-ip=23.128.96.38; Authentication-Results: mx.google.com; dkim=fail header.i=@igalia.com header.s=20170329 header.b=kL81kjGg; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.38 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: from out1.vger.email (depot.vger.email [IPv6:2620:137:e000::3:0]) by fry.vger.email (Postfix) with ESMTP id C214B80A18D6; Wed, 22 Nov 2023 08:21:21 -0800 (PST) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.11 at fry.vger.email Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231767AbjKVQUu (ORCPT + 99 others); Wed, 22 Nov 2023 11:20:50 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:48508 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231701AbjKVQUn (ORCPT ); Wed, 22 Nov 2023 11:20:43 -0500 Received: from fanzine2.igalia.com (fanzine.igalia.com [178.60.130.6]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 784EF1B8 for ; Wed, 22 Nov 2023 08:20:35 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=igalia.com; s=20170329; h=Content-Transfer-Encoding:Content-Type:MIME-Version:References: In-Reply-To:Message-ID:Date:Subject:Cc:To:From:Sender:Reply-To:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Id:List-Help:List-Unsubscribe:List-Subscribe: List-Post:List-Owner:List-Archive; bh=6oQ05sxUVSUOtFBVscV1RsI7xjS53GqoZMmDxVRMp58=; b=kL81kjGgJG3ESkR+MXvVpiOJbM eXut4DmzTPdBstrbtpU+KIyTGUEAneMWE6MP9pTwRfNU6i+yHNrqIT0l6mFPb6iKhupmqN3FzaFd8 j7Ob12FgoYyiVz+G0MOY9+aMk5MxH9r1LR7Xfvx4K1JmIhfHivtxvsqp3/8GUssJB4Gc18rzbvn3d Dsp7XACwxeMucz4Zo2F3EbGwIQ8ByobEKuvHHl8wPTWJRpSWb2DvWerEuxVJ8yWdzIdLSO/FoSKrn H20FPZ0ypYyiO3YgXmJ2MFsy1lKwbR62n29BWnGf0p/4uP1Wybqez5ScTQs1LbvkyVDn+tI6rGoDd 56+9y2/w==; Received: from 189-69-166-209.dial-up.telesp.net.br ([189.69.166.209] helo=steammachine.lan) by fanzine2.igalia.com with esmtpsa (Cipher TLS1.3:ECDHE_X25519__RSA_PSS_RSAE_SHA256__AES_256_GCM:256) (Exim) id 1r5pxn-0061lT-KF; Wed, 22 Nov 2023 17:20:32 +0100 From: =?UTF-8?q?Andr=C3=A9=20Almeida?= To: dri-devel@lists.freedesktop.org, amd-gfx@lists.freedesktop.org, linux-kernel@vger.kernel.org Cc: kernel-dev@igalia.com, alexander.deucher@amd.com, christian.koenig@amd.com, pierre-eric.pelloux-prayer@amd.com, Simon Ser , Rob Clark , Pekka Paalanen , daniel@ffwll.ch, Daniel Stone , =?UTF-8?q?=27Marek=20Ol=C5=A1=C3=A1k=27?= , Dave Airlie , =?UTF-8?q?Michel=20D=C3=A4nzer?= , Randy Dunlap , ville.syrjala@linux.intel.com, intel-gfx@lists.freedesktop.org, =?UTF-8?q?Andr=C3=A9=20Almeida?= Subject: [PATCH v9 1/4] drm: Refuse to async flip with atomic prop changes Date: Wed, 22 Nov 2023 13:19:38 -0300 Message-ID: <20231122161941.320564-2-andrealmeid@igalia.com> X-Mailer: git-send-email 2.42.1 In-Reply-To: <20231122161941.320564-1-andrealmeid@igalia.com> References: <20231122161941.320564-1-andrealmeid@igalia.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-0.6 required=5.0 tests=DKIM_INVALID,DKIM_SIGNED, HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,SPF_HELO_NONE, SPF_PASS,T_SCC_BODY_TEXT_LINE autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on fry.vger.email Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-Greylist: Sender passed SPF test, not delayed by milter-greylist-4.6.4 (fry.vger.email [0.0.0.0]); Wed, 22 Nov 2023 08:21:21 -0800 (PST) Given that prop changes may lead to modesetting, which would defeat the fast path of the async flip, refuse any atomic prop change for async flips in atomic API. The only exception is the framebuffer ID to flip to. Currently the only plane type supported is the primary one. Signed-off-by: André Almeida Reviewed-by: Simon Ser --- v9: no changes v8: add a check for plane type, we can only flip primary planes v7: drop the mode_id exception for prop changes --- drivers/gpu/drm/drm_atomic_uapi.c | 52 +++++++++++++++++++++++++++-- drivers/gpu/drm/drm_crtc_internal.h | 2 +- drivers/gpu/drm/drm_mode_object.c | 2 +- 3 files changed, 51 insertions(+), 5 deletions(-) diff --git a/drivers/gpu/drm/drm_atomic_uapi.c b/drivers/gpu/drm/drm_atomic_uapi.c index 98d3b10c08ae..ed46133a2dd7 100644 --- a/drivers/gpu/drm/drm_atomic_uapi.c +++ b/drivers/gpu/drm/drm_atomic_uapi.c @@ -1006,13 +1006,28 @@ int drm_atomic_connector_commit_dpms(struct drm_atomic_state *state, return ret; } +static int drm_atomic_check_prop_changes(int ret, uint64_t old_val, uint64_t prop_value, + struct drm_property *prop) +{ + if (ret != 0 || old_val != prop_value) { + drm_dbg_atomic(prop->dev, + "[PROP:%d:%s] No prop can be changed during async flip\n", + prop->base.id, prop->name); + return -EINVAL; + } + + return 0; +} + int drm_atomic_set_property(struct drm_atomic_state *state, struct drm_file *file_priv, struct drm_mode_object *obj, struct drm_property *prop, - uint64_t prop_value) + uint64_t prop_value, + bool async_flip) { struct drm_mode_object *ref; + uint64_t old_val; int ret; if (!drm_property_change_valid_get(prop, prop_value, &ref)) @@ -1029,6 +1044,13 @@ int drm_atomic_set_property(struct drm_atomic_state *state, break; } + if (async_flip) { + ret = drm_atomic_connector_get_property(connector, connector_state, + prop, &old_val); + ret = drm_atomic_check_prop_changes(ret, old_val, prop_value, prop); + break; + } + ret = drm_atomic_connector_set_property(connector, connector_state, file_priv, prop, prop_value); @@ -1044,6 +1066,13 @@ int drm_atomic_set_property(struct drm_atomic_state *state, break; } + if (async_flip) { + ret = drm_atomic_crtc_get_property(crtc, crtc_state, + prop, &old_val); + ret = drm_atomic_check_prop_changes(ret, old_val, prop_value, prop); + break; + } + ret = drm_atomic_crtc_set_property(crtc, crtc_state, prop, prop_value); break; @@ -1051,6 +1080,7 @@ int drm_atomic_set_property(struct drm_atomic_state *state, case DRM_MODE_OBJECT_PLANE: { struct drm_plane *plane = obj_to_plane(obj); struct drm_plane_state *plane_state; + struct drm_mode_config *config = &plane->dev->mode_config; plane_state = drm_atomic_get_plane_state(state, plane); if (IS_ERR(plane_state)) { @@ -1058,6 +1088,21 @@ int drm_atomic_set_property(struct drm_atomic_state *state, break; } + if (async_flip && prop != config->prop_fb_id) { + ret = drm_atomic_plane_get_property(plane, plane_state, + prop, &old_val); + ret = drm_atomic_check_prop_changes(ret, old_val, prop_value, prop); + break; + } + + if (async_flip && plane_state->plane->type != DRM_PLANE_TYPE_PRIMARY) { + drm_dbg_atomic(prop->dev, + "[OBJECT:%d] Only primary planes can be changed during async flip\n", + obj->id); + ret = -EINVAL; + break; + } + ret = drm_atomic_plane_set_property(plane, plane_state, file_priv, prop, prop_value); @@ -1337,6 +1382,7 @@ int drm_mode_atomic_ioctl(struct drm_device *dev, struct drm_out_fence_state *fence_state; int ret = 0; unsigned int i, j, num_fences; + bool async_flip = false; /* disallow for drivers not supporting atomic: */ if (!drm_core_check_feature(dev, DRIVER_ATOMIC)) @@ -1450,8 +1496,8 @@ int drm_mode_atomic_ioctl(struct drm_device *dev, goto out; } - ret = drm_atomic_set_property(state, file_priv, - obj, prop, prop_value); + ret = drm_atomic_set_property(state, file_priv, obj, + prop, prop_value, async_flip); if (ret) { drm_mode_object_put(obj); goto out; diff --git a/drivers/gpu/drm/drm_crtc_internal.h b/drivers/gpu/drm/drm_crtc_internal.h index 6b646e0783be..c05c9ee9c859 100644 --- a/drivers/gpu/drm/drm_crtc_internal.h +++ b/drivers/gpu/drm/drm_crtc_internal.h @@ -253,7 +253,7 @@ int drm_atomic_set_property(struct drm_atomic_state *state, struct drm_file *file_priv, struct drm_mode_object *obj, struct drm_property *prop, - uint64_t prop_value); + uint64_t prop_value, bool async_flip); int drm_atomic_get_property(struct drm_mode_object *obj, struct drm_property *property, uint64_t *val); diff --git a/drivers/gpu/drm/drm_mode_object.c b/drivers/gpu/drm/drm_mode_object.c index ac0d2ce3f870..0e8355063eee 100644 --- a/drivers/gpu/drm/drm_mode_object.c +++ b/drivers/gpu/drm/drm_mode_object.c @@ -538,7 +538,7 @@ static int set_property_atomic(struct drm_mode_object *obj, obj_to_connector(obj), prop_value); } else { - ret = drm_atomic_set_property(state, file_priv, obj, prop, prop_value); + ret = drm_atomic_set_property(state, file_priv, obj, prop, prop_value, false); if (ret) goto out; ret = drm_atomic_commit(state); -- 2.42.1