From patchwork Tue Apr 18 05:22:20 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: "Hogander, Jouni" X-Patchwork-Id: 13215034 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 6646FC77B71 for ; Tue, 18 Apr 2023 05:22:59 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 39FD810E044; Tue, 18 Apr 2023 05:22:58 +0000 (UTC) Received: from mga01.intel.com (mga01.intel.com [192.55.52.88]) by gabe.freedesktop.org (Postfix) with ESMTPS id B0D1A10E66C for ; Tue, 18 Apr 2023 05:22:56 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1681795376; x=1713331376; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=R7m6WzyplB0oOBiGC7flQk088zowqlQerhN0ju7O14g=; b=L9fgdUw+ngy3AKkRvlQWz/Z7uYiKu+dB2I8UpgsvBh+YdjC4hJFfIa+C ynMAQsHOjqksmhBaJUu475QVM30S2Ze3QPgcrofzdT1NEY1/gEysbJVUi Yxqxe6bKcr0xZgO405MkF87jSxT2c6q5ilWwAFGR6hTs7im6tAMW0GAa8 wca6pWUcMurwZABIZMHZUtU4qOIPbm8Qp1GRvOxQ3yZziCSRD0Dp5KcVI BRyrK3MoCTr8xo19ZvNGYCrPhKZ2Fm9QUcXRDaWBDEYGFJG/qCszGp5sg 3wc2wWvbkpIgj+3viJ1/IMgRa7NBLZhnGR+/wTd5q5f6kS1t3ChKB+1JQ Q==; X-IronPort-AV: E=McAfee;i="6600,9927,10683"; a="372957637" X-IronPort-AV: E=Sophos;i="5.99,206,1677571200"; d="scan'208";a="372957637" Received: from fmsmga004.fm.intel.com ([10.253.24.48]) by fmsmga101.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 17 Apr 2023 22:22:55 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10683"; a="760227724" X-IronPort-AV: E=Sophos;i="5.99,206,1677571200"; d="scan'208";a="760227724" Received: from rboza-mobl.ger.corp.intel.com (HELO jhogande-mobl1.ger.corp.intel.com) ([10.251.212.229]) by fmsmga004-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 17 Apr 2023 22:22:53 -0700 From: =?utf-8?q?Jouni_H=C3=B6gander?= To: intel-gfx@lists.freedesktop.org Date: Tue, 18 Apr 2023 08:22:20 +0300 Message-Id: <20230418052221.593983-2-jouni.hogander@intel.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230418052221.593983-1-jouni.hogander@intel.com> References: <20230418052221.593983-1-jouni.hogander@intel.com> MIME-Version: 1.0 Organization: Intel Finland Oy - BIC 0357606-4 - Westendinkatu 7, 02160 Espoo Subject: [Intel-gfx] [PATCH 1/2] drm/i915: Add new frontbuffer tracking interface to queue flush X-BeenThere: intel-gfx@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Intel graphics driver community testing & development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" We want to wait dma fences in dirtyfb ioctl. As we don't want to make dirtyfb ioctl as blocking call we need to use dma_fence_add_callback. Callback used for dma_fence_add_callback is called from atomic context. Due to this we need to add a new frontbuffer tracking interface to queue flush. Signed-off-by: Jouni Högander --- .../gpu/drm/i915/display/intel_frontbuffer.c | 33 +++++++++++++++++++ .../gpu/drm/i915/display/intel_frontbuffer.h | 4 +++ 2 files changed, 37 insertions(+) diff --git a/drivers/gpu/drm/i915/display/intel_frontbuffer.c b/drivers/gpu/drm/i915/display/intel_frontbuffer.c index 17a7aa8b28c2..799f3f8a5d85 100644 --- a/drivers/gpu/drm/i915/display/intel_frontbuffer.c +++ b/drivers/gpu/drm/i915/display/intel_frontbuffer.c @@ -202,6 +202,39 @@ void __intel_fb_flush(struct intel_frontbuffer *front, frontbuffer_flush(i915, frontbuffer_bits, origin); } +static void intel_frontbuffer_flush_work(struct work_struct *work) +{ + struct intel_frontbuffer *front = + container_of(work, struct intel_frontbuffer, flush_work); + + i915_gem_object_flush_if_display(front->obj); + intel_frontbuffer_flush(front, ORIGIN_DIRTYFB); + intel_frontbuffer_put(front); +} + +/** + * intel_frontbuffer_queue_flush - queue flushing frontbuffer object + * @front: GEM object to flush + * + * This function is targeted for our dirty callback for queueing flush when + * dma fence is signales + */ +void intel_frontbuffer_queue_flush(struct intel_frontbuffer *front) +{ + unsigned int frontbuffer_bits; + + if (!front) + return; + + frontbuffer_bits = atomic_read(&front->bits); + if (!frontbuffer_bits) + return; + + kref_get(&front->ref); + INIT_WORK(&front->flush_work, intel_frontbuffer_flush_work); + schedule_work(&front->flush_work); +} + static int frontbuffer_active(struct i915_active *ref) { struct intel_frontbuffer *front = diff --git a/drivers/gpu/drm/i915/display/intel_frontbuffer.h b/drivers/gpu/drm/i915/display/intel_frontbuffer.h index 3c474ed937fb..11760b5ce9fa 100644 --- a/drivers/gpu/drm/i915/display/intel_frontbuffer.h +++ b/drivers/gpu/drm/i915/display/intel_frontbuffer.h @@ -47,6 +47,8 @@ struct intel_frontbuffer { struct i915_active write; struct drm_i915_gem_object *obj; struct rcu_head rcu; + + struct work_struct flush_work; }; /* @@ -163,6 +165,8 @@ static inline void intel_frontbuffer_flush(struct intel_frontbuffer *front, __intel_fb_flush(front, origin, frontbuffer_bits); } +void intel_frontbuffer_queue_flush(struct intel_frontbuffer *front); + void intel_frontbuffer_track(struct intel_frontbuffer *old, struct intel_frontbuffer *new, unsigned int frontbuffer_bits); From patchwork Tue Apr 18 05:22:21 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: "Hogander, Jouni" X-Patchwork-Id: 13215035 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 6A096C77B76 for ; Tue, 18 Apr 2023 05:23:02 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id B6F4810E66C; Tue, 18 Apr 2023 05:22:58 +0000 (UTC) Received: from mga01.intel.com (mga01.intel.com [192.55.52.88]) by gabe.freedesktop.org (Postfix) with ESMTPS id 3985310E044 for ; Tue, 18 Apr 2023 05:22:57 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1681795377; x=1713331377; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=2cAQTdE2tTiX38UIHigDQu3agvjsIXtoSS8o4E/I6MY=; b=WXVKNBf3UaviiWTuRRRzMo/kmSQBw+2pjMa1ao3aM1WT8S19s5eHMAWp Dj+WfSuVklT8PCXWfnfnmZBPCB2aJHU+IlMusqZ1YPBdoueADO24+LlyZ /gjju+iSlJCFdAA/scy+dcw27kkl7lZGwjHEGETPzb4H68R3NG7T3u/05 YGBKOxHmbejgwOtITbUGUEHVFRWLABjwPs1N+fhheocZ5ErKckUaH0hMe 7WfwRyZDIIj+fR1zsx0mLSjUrDPstuwfxFhycjMItpP489XS6xFQb9MeH IyAnXYA4NripI6rkfTACAgTfRPpehvDO0K42j9+wp5PyxZfyJb8OGVgSo Q==; X-IronPort-AV: E=McAfee;i="6600,9927,10683"; a="372957640" X-IronPort-AV: E=Sophos;i="5.99,206,1677571200"; d="scan'208";a="372957640" Received: from fmsmga004.fm.intel.com ([10.253.24.48]) by fmsmga101.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 17 Apr 2023 22:22:57 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10683"; a="760227729" X-IronPort-AV: E=Sophos;i="5.99,206,1677571200"; d="scan'208";a="760227729" Received: from rboza-mobl.ger.corp.intel.com (HELO jhogande-mobl1.ger.corp.intel.com) ([10.251.212.229]) by fmsmga004-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 17 Apr 2023 22:22:55 -0700 From: =?utf-8?q?Jouni_H=C3=B6gander?= To: intel-gfx@lists.freedesktop.org Date: Tue, 18 Apr 2023 08:22:21 +0300 Message-Id: <20230418052221.593983-3-jouni.hogander@intel.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230418052221.593983-1-jouni.hogander@intel.com> References: <20230418052221.593983-1-jouni.hogander@intel.com> MIME-Version: 1.0 Organization: Intel Finland Oy - BIC 0357606-4 - Westendinkatu 7, 02160 Espoo Subject: [Intel-gfx] [PATCH 2/2] drm/i915: Handle dma fences in dirtyfb callback X-BeenThere: intel-gfx@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Intel graphics driver community testing & development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" Take into account dma fences in dirtyfb callback. If there is no unsignaled dma fences perform flush immediately. If there are unsignaled dma fences perform invalidate and add callback which will queue flush when the fence gets signaled. Signed-off-by: Jouni Högander --- drivers/gpu/drm/i915/display/intel_fb.c | 54 +++++++++++++++++++++++-- 1 file changed, 51 insertions(+), 3 deletions(-) diff --git a/drivers/gpu/drm/i915/display/intel_fb.c b/drivers/gpu/drm/i915/display/intel_fb.c index e5f637897b5e..c8707d331bf1 100644 --- a/drivers/gpu/drm/i915/display/intel_fb.c +++ b/drivers/gpu/drm/i915/display/intel_fb.c @@ -7,6 +7,9 @@ #include #include +#include +#include + #include "i915_drv.h" #include "intel_display.h" #include "intel_display_types.h" @@ -1854,6 +1857,20 @@ static int intel_user_framebuffer_create_handle(struct drm_framebuffer *fb, return drm_gem_handle_create(file, &obj->base, handle); } +struct frontbuffer_fence_cb { + struct dma_fence_cb base; + struct intel_frontbuffer *front; +}; + +static void intel_user_framebuffer_fence_wake(struct dma_fence *dma, + struct dma_fence_cb *data) +{ + struct frontbuffer_fence_cb *cb = container_of(data, typeof(*cb), base); + + intel_frontbuffer_queue_flush(cb->front); + kfree(cb); +} + static int intel_user_framebuffer_dirty(struct drm_framebuffer *fb, struct drm_file *file, unsigned int flags, unsigned int color, @@ -1861,11 +1878,42 @@ static int intel_user_framebuffer_dirty(struct drm_framebuffer *fb, unsigned int num_clips) { struct drm_i915_gem_object *obj = intel_fb_obj(fb); + struct intel_frontbuffer *front = to_intel_frontbuffer(fb); + struct dma_resv_iter cursor; + struct dma_fence *fence; + int ret; + + if (dma_resv_test_signaled(obj->base.resv, dma_resv_usage_rw(false))) { + i915_gem_object_flush_if_display(obj); + intel_frontbuffer_flush(front, ORIGIN_DIRTYFB); + return 0; + } - i915_gem_object_flush_if_display(obj); - intel_frontbuffer_flush(to_intel_frontbuffer(fb), ORIGIN_DIRTYFB); + intel_frontbuffer_invalidate(front, ORIGIN_DIRTYFB); - return 0; + dma_resv_iter_begin(&cursor, obj->base.resv, dma_resv_usage_rw(false)); + dma_resv_for_each_fence_unlocked(&cursor, fence) { + struct frontbuffer_fence_cb *cb = + kmalloc(sizeof(struct frontbuffer_fence_cb), GFP_KERNEL); + if (!cb) { + ret = -ENOMEM; + break; + } + cb->front = front; + + ret = dma_fence_add_callback(fence, &cb->base, + intel_user_framebuffer_fence_wake); + if (ret) { + intel_user_framebuffer_fence_wake(fence, &cb->base); + if (ret == -ENOENT) + ret = 0; + else + break; + } + } + dma_resv_iter_end(&cursor); + + return ret; } static const struct drm_framebuffer_funcs intel_fb_funcs = {