Received: by 2002:a05:6a10:16a7:0:0:0:0 with SMTP id gp39csp65737pxb; Mon, 2 Nov 2020 14:11:07 -0800 (PST) X-Google-Smtp-Source: ABdhPJwv5/osNlwZSDvRITTITqVPSMwD4SnJLEu2Jrvowha/Jd2QRuT30VVKY5egRUn5QlwRDbBe X-Received: by 2002:aa7:c44d:: with SMTP id n13mr2778425edr.138.1604355066894; Mon, 02 Nov 2020 14:11:06 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1604355066; cv=none; d=google.com; s=arc-20160816; b=oYsLpvSzihaS0eKtqI+CSBs2QevYOCnW/ioNgG3uJP4kRswtelJBOXQed0r7K7gnPX B2xa05CkaowxIts/s8fI9rKxqRSJWqqz5y4J40csl5HIh3ElytDUumL8FE0xPoc20WKZ nQHtUR7EBs3TGfQT8Yha5PWIURS0dxHdKlwQvopV+yYeHKywC+i86YpE7TjVhQkDfPR9 wiwqGL91NC5Xdr4d9hIKkcC0H+k7dgqmts+FeeJMcug4k0IA1YY2cMUIOelY0PESxAyA GpTHVlitZb9ymd5J634pXD9KJBvA78AfTQsjXbqjHlBTmq4XsSSzjE+Ug+P2F0el+ddd 5NiA== 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; bh=N4T8RTZV2J9IaZ2nQ49glwI/wytk8b+4LvK/zcjiDE8=; b=W+r5kykodWWsgKYL8JJSNNK4eAhIB115CBbtTCo29z5PAq3zVTJsgu5jDmsmIfv0T0 F1YLqG+6v/od9rV+wWDwqPC8J3Y9xtFJ473LnVZ4Ef1VI8Rzu/xg52qszrbwuvAiC3f0 oRe4r357QGoSq33JIP8oh6MWqnXAqgBZuVltV/BRh9FgZuaQS0toQjGCv4jle8OeRWW9 IpbycuQ7SmDQhef99pmtnCr4ezIDxIpBu39TVs2Z7IR78Xh8W/kQW12NkyCJGo1IR/Cl UUVsXPOLDASaoaf55z/dLVMAEDxTtDpUfgQVTBOtnUJO3Y79IW8KvHKQnt2rq39T8vhd k6FA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=crapouillou.net Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id e9si11251914ejk.493.2020.11.02.14.10.44; Mon, 02 Nov 2020 14:11:06 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=crapouillou.net Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726172AbgKBWHo (ORCPT + 99 others); Mon, 2 Nov 2020 17:07:44 -0500 Received: from aposti.net ([89.234.176.197]:44792 "EHLO aposti.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726165AbgKBWHn (ORCPT ); Mon, 2 Nov 2020 17:07:43 -0500 From: Paul Cercueil To: David Airlie , Daniel Vetter , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann Cc: od@zcrc.me, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, Paul Cercueil Subject: [PATCH 4/5] drm: Add and export function drm_gem_cma_sync_data Date: Mon, 2 Nov 2020 22:06:50 +0000 Message-Id: <20201102220651.22069-5-paul@crapouillou.net> In-Reply-To: <20201102220651.22069-1-paul@crapouillou.net> References: <20201102220651.22069-1-paul@crapouillou.net> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org This function can be used by drivers that use damage clips and have CMA GEM objects backed by non-coherent memory. Calling this function in a plane's .atomic_update ensures that all the data in the backing memory have been written to RAM. Signed-off-by: Paul Cercueil --- drivers/gpu/drm/drm_gem_cma_helper.c | 43 ++++++++++++++++++++++++++++ include/drm/drm_gem_cma_helper.h | 5 ++++ 2 files changed, 48 insertions(+) diff --git a/drivers/gpu/drm/drm_gem_cma_helper.c b/drivers/gpu/drm/drm_gem_cma_helper.c index 4ed63f4896bd..74bff6d45d4e 100644 --- a/drivers/gpu/drm/drm_gem_cma_helper.c +++ b/drivers/gpu/drm/drm_gem_cma_helper.c @@ -17,9 +17,14 @@ #include #include +#include #include #include +#include +#include +#include #include +#include #include /** @@ -742,3 +747,41 @@ drm_gem_cma_prime_import_sg_table_vmap(struct drm_device *dev, return obj; } EXPORT_SYMBOL(drm_gem_cma_prime_import_sg_table_vmap); + +/** + * drm_gem_cma_sync_data - Sync GEM object to non-coherent backing memory + * @dev: DRM device + * @old_state: Old plane state + * @state: New plane state + * + * This function can be used by drivers that use damage clips and have + * CMA GEM objects backed by non-coherent memory. Calling this function + * in a plane's .atomic_update ensures that all the data in the backing + * memory have been written to RAM. + */ +void drm_gem_cma_sync_data(struct device *dev, + struct drm_plane_state *old_state, + struct drm_plane_state *state) +{ + const struct drm_format_info *finfo = state->fb->format; + struct drm_atomic_helper_damage_iter iter; + unsigned int offset, i; + struct drm_rect clip; + dma_addr_t daddr; + + drm_atomic_helper_damage_iter_init(&iter, old_state, state); + + drm_atomic_for_each_plane_damage(&iter, &clip) { + for (i = 0; i < finfo->num_planes; i++) { + daddr = drm_fb_cma_get_gem_addr(state->fb, state, i); + + /* Ignore x1/x2 values, invalidate complete lines */ + offset = clip.y1 * state->fb->pitches[i]; + + dma_sync_single_for_device(dev, daddr + offset, + (clip.y2 - clip.y1) * state->fb->pitches[i], + DMA_TO_DEVICE); + } + } +} +EXPORT_SYMBOL_GPL(drm_gem_cma_sync_data); diff --git a/include/drm/drm_gem_cma_helper.h b/include/drm/drm_gem_cma_helper.h index 6b01ad5581c3..9bdba4ce65ba 100644 --- a/include/drm/drm_gem_cma_helper.h +++ b/include/drm/drm_gem_cma_helper.h @@ -7,6 +7,7 @@ #include struct drm_mode_create_dumb; +struct drm_plane_state; /** * struct drm_gem_cma_object - GEM object backed by CMA memory allocations @@ -200,4 +201,8 @@ drm_gem_cma_prime_import_sg_table_vmap(struct drm_device *drm, struct dma_buf_attachment *attach, struct sg_table *sgt); +void drm_gem_cma_sync_data(struct device *dev, + struct drm_plane_state *old_state, + struct drm_plane_state *state); + #endif /* __DRM_GEM_CMA_HELPER_H__ */ -- 2.28.0