From nobody Tue Apr 7 02:36:14 2026 Received: from mail-pl1-f177.google.com (mail-pl1-f177.google.com [209.85.214.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E095933FE0D for ; Tue, 17 Mar 2026 06:41:31 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.177 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773729693; cv=none; b=TMXeRbo4Jj/w6I4hLmZ/P5mAb94g6vh5ebeVC5meXX4NXKiwHMYlM+KIiE9YSORL23biMC1SICwjOpHEapLqxpg/0mwgPoH4uTTxqFaQb2DavxAuZp19C5sgEokHxSIgYD6nrHfIsByJ3a42Qt8z1clF0tDXYSlwrlJ/MzV4T50= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773729693; c=relaxed/simple; bh=93P8QocL6QULHfeE9WND83Chole/3U0ixH53QORnDMY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=WiYcWTqrOKk8+09BPyy9J1odmTrLISgPx1GDnmbNvreAYzWY4lY70trtP/9DehNx6ISzS5ucK6/Yc1vNmWnotzUyI7K1IDLpptVTi20R88zBXcMNjULzEVW2BC9aCUgpTc99SbDVaDQ2vqAJ0klwd6exn7nS8ksw2FVmUj9Ske0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org; spf=pass smtp.mailfrom=chromium.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b=eVirLKzh; arc=none smtp.client-ip=209.85.214.177 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=chromium.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="eVirLKzh" Received: by mail-pl1-f177.google.com with SMTP id d9443c01a7336-2aaed195901so25224265ad.0 for ; Mon, 16 Mar 2026 23:41:31 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1773729691; x=1774334491; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=1GwlbKCuRkMEJtcMvq6Y2vEjKV9Tt6Itzx4uW6Jnu0w=; b=eVirLKzhZgvGvCBFaZGSDJqbgFiD5hGHGI0NF8czSp5K0A1rc7l6SLbGDijY0T5z+N yCvjatGfeQPvnCECRsyizZqV+M0+KXvpaLcLEfRGVxAk6XlOwEVTDPXaefGrAF/ZZ2nY hcRc0PQzpGeMKiSugCRp8Ak7SJ2I4v2VEYQbk= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773729691; x=1774334491; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=1GwlbKCuRkMEJtcMvq6Y2vEjKV9Tt6Itzx4uW6Jnu0w=; b=p3bOScNFIZXWe/WV8gWE03oPIYex3cbE/M2WApDkEb/JnXes8bdf8WDyGCGq6kKCG6 a78RhwEWx2WajoIWyyWlozncwbTDfxnvEREmlSAhuiqLq8RGKpt1hLiYPVXCChKNARrs oeQ5UD+nYxVAne3CXeQbDzlV+vuYA8/arTRGUrB6LEe8NYfdet2YoS3RtgYhlQXMuavx LXQsYtol0YsKDefitN5EtDOcsxpMW1B4FvCqhahIEizMtHcyxLftTBXfgQEdKtawv3lx JzUrVU7Nup34Kybm7D3zNzWA9gitIknTZaVYCSKSl3GlCNw676Wl9xW0gLAHrU1vQr7l ymGQ== X-Forwarded-Encrypted: i=1; AJvYcCVNp88rBm9Ks6qyIO8LOc6+SKi6tt6rjPUH4AOnu4blvTJdKPQSj9MczFWnzkjuSk66t/BiRk/Z7U624vE=@vger.kernel.org X-Gm-Message-State: AOJu0YyckfGmDGX4XDGoNAPdUfSt/6ZL4TyfjtxxNqK5y86BVPoGPSwl d0n2Yb88rcK/3j/zqfrD5cINhjNiyoK5xJJOk8fcWsTN7ulYUDxKa0OQUBBxocw86w== X-Gm-Gg: ATEYQzyI8BuosxuPq9o+lWvhI2yxcop8W7SsRdpOUtaw/Ki50HMNcsoUbSYzp/jlZdK RRL+fVyCNdCS+dfFXTcBBGyQxM6txcrJUK4DlIguUuR5xP9pf+IyeGwYS6mfagxsIVKauap2vmp ktzuH2Ik53dsTg5UPMyO7OmehQjisMS45mwsWWNGkmI8HOZCnsJJspHLg0sizrkKP7o787Z3VOH SM29lgMBa7mDUU2O9lIym9xiAu8pCa6xC1dlQOPieqk2KTHac4gDhbNAPNPSRf5yslLXT7It3c4 goh7JM+VzyAvYDynj7k6Rd/maVbbQbzYjXtMHCXLGVXj45eopBvVjjvEYcq3DxhZ87U5J6HwIAb O9rttOO2Q5P3VdSzh36TAMg7HYSPRY9hVVVlcqrT48/shePIDnHP0eHprOwRJnsiJzFylswNUbb ehQ/2zDitficV/fjfYWN1Ww+8xFj2bVz0zI2L01sA2JWnDaiofNtapYuIQj4Twgt+mSpcR00G8o 9/Jo5A0 X-Received: by 2002:a17:902:ecd2:b0:2b0:5a4c:726a with SMTP id d9443c01a7336-2b05a5bbfdfmr53881605ad.43.1773729691244; Mon, 16 Mar 2026 23:41:31 -0700 (PDT) Received: from wenstp920.tpe.corp.google.com ([2a00:79e0:201d:8:a064:c65d:a199:5cb6]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2aece605231sm124269425ad.27.2026.03.16.23.41.28 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 16 Mar 2026 23:41:30 -0700 (PDT) From: Chen-Yu Tsai To: Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter Cc: Rob Herring , Laurent Pinchart , dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, asahi@lists.linux.dev, Chen-Yu Tsai , Sasha Finkelstein , Janne Grunau Subject: [PATCH v2 4/4] drm/gem-dma: Support DRM_MODE_DUMB_KERNEL_MAP flag Date: Tue, 17 Mar 2026 14:40:46 +0800 Message-ID: <20260317064049.696795-5-wenst@chromium.org> X-Mailer: git-send-email 2.53.0.851.ga537e3e6e9-goog In-Reply-To: <20260317064049.696795-1-wenst@chromium.org> References: <20260317064049.696795-1-wenst@chromium.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Rob Herring Add support in DMA helpers to handle callers specifying DRM_MODE_DUMB_KERNEL_MAP flag. Existing behavior is maintained with this change. drm_gem_dma_dumb_create() always creates a kernel mapping as before. drm_gem_dma_dumb_create_internal() lets the caller set the flags as desired. Most drivers that use drm_gem_dma_dumb_create_internal() are already using the internal client interface via drm_client_setup*() and DRM_FBDEV_DMA_DRIVER_OPS, and do not have other direct kernel accesses to the buffer memory internally. Therefore, there is no need to add the DRM_MODE_DUMB_KERNEL_MAP flag for them. The only outlier is the adp driver. The DRM_MODE_DUMB_KERNEL_MAP flag is added to its dumb_create() function, adp_drm_gem_dumb_create(). Signed-off-by: Rob Herring [wenst@chromium.org: Rebase onto renamed GEM DMA helpers] [wenst@chromium.org: show "vaddr=3D(no mapping)" in drm_gem_dma_print_info(= )] [wenst@chromium.org: Drop DRM_MODE_DUMB_KERNEL_MAP driver changes] [wenst@chromium.org: Add DRM_MODE_DUMB_KERNEL_MAP to adp_drm_gem_dumb_creat= e()] [wenst@chromium.org: Add flags field to drm_gem_dma_create_with_handle() kerneldoc] Signed-off-by: Chen-Yu Tsai --- Changes since v1: - Rebased onto renamed GEM DMA helpers - Added check in drm_fb_dma_get_scanout_buffer() and drm_gem_dma_vmap(). - Made drm_gem_dma_print_info() show "vaddr=3D(no mapping)" for objects allocated without kernel mapping - Dropped existing DRM_MODE_DUMB_KERNEL_MAP flag addition in various drivers - Added DRM_MODE_DUMB_KERNEL_MAP flag to adp_drm_gem_dumb_create() - Added flags field kerneldoc for drm_gem_dma_create_with_handle() Cc: Sasha Finkelstein Cc: Janne Grunau Cc: asahi@lists.linux.dev --- drivers/gpu/drm/adp/adp_drv.c | 1 + drivers/gpu/drm/drm_fb_dma_helper.c | 4 ++ drivers/gpu/drm/drm_gem_dma_helper.c | 67 +++++++++++++++++----------- 3 files changed, 47 insertions(+), 25 deletions(-) diff --git a/drivers/gpu/drm/adp/adp_drv.c b/drivers/gpu/drm/adp/adp_drv.c index 4554cf75565e..c549b44b3814 100644 --- a/drivers/gpu/drm/adp/adp_drv.c +++ b/drivers/gpu/drm/adp/adp_drv.c @@ -95,6 +95,7 @@ static int adp_drm_gem_dumb_create(struct drm_file *file_= priv, { args->height =3D ALIGN(args->height, 64); args->size =3D args->pitch * args->height; + args->flags =3D DRM_MODE_DUMB_KERNEL_MAP; =20 return drm_gem_dma_dumb_create_internal(file_priv, drm, args); } diff --git a/drivers/gpu/drm/drm_fb_dma_helper.c b/drivers/gpu/drm/drm_fb_d= ma_helper.c index fd71969d2fb1..12a44accc48c 100644 --- a/drivers/gpu/drm/drm_fb_dma_helper.c +++ b/drivers/gpu/drm/drm_fb_dma_helper.c @@ -187,6 +187,10 @@ int drm_fb_dma_get_scanout_buffer(struct drm_plane *pl= ane, if (!dma_obj->vaddr) return -ENODEV; =20 + /* Buffer was allocated with NO_KERNEL_MAPPING */ + if (dma_obj->dma_attrs & DMA_ATTR_NO_KERNEL_MAPPING) + return -ENODEV; + iosys_map_set_vaddr(&sb->map[0], dma_obj->vaddr); sb->format =3D fb->format; sb->height =3D fb->height; diff --git a/drivers/gpu/drm/drm_gem_dma_helper.c b/drivers/gpu/drm/drm_gem= _dma_helper.c index 9722c9fc86f3..281fb563f061 100644 --- a/drivers/gpu/drm/drm_gem_dma_helper.c +++ b/drivers/gpu/drm/drm_gem_dma_helper.c @@ -116,26 +116,8 @@ __drm_gem_dma_create(struct drm_device *drm, size_t si= ze, bool private) return ERR_PTR(ret); } =20 -/** - * drm_gem_dma_create - allocate an object with the given size - * @drm: DRM device - * @size: size of the object to allocate - * - * This function creates a DMA GEM object and allocates memory as backing = store. - * The allocated memory will occupy a contiguous chunk of bus address spac= e. - * - * For devices that are directly connected to the memory bus then the allo= cated - * memory will be physically contiguous. For devices that access through an - * IOMMU, then the allocated memory is not expected to be physically conti= guous - * because having contiguous IOVAs is sufficient to meet a devices DMA - * requirements. - * - * Returns: - * A struct drm_gem_dma_object * on success or an ERR_PTR()-encoded negati= ve - * error code on failure. - */ -struct drm_gem_dma_object *drm_gem_dma_create(struct drm_device *drm, - size_t size) +static struct drm_gem_dma_object * +drm_gem_dma_create_flags(struct drm_device *drm, size_t size, u32 flags) { struct drm_gem_dma_object *dma_obj; int ret; @@ -146,6 +128,9 @@ struct drm_gem_dma_object *drm_gem_dma_create(struct dr= m_device *drm, if (IS_ERR(dma_obj)) return dma_obj; =20 + if (!(flags & DRM_MODE_DUMB_KERNEL_MAP)) + dma_obj->dma_attrs |=3D DMA_ATTR_NO_KERNEL_MAPPING; + if (dma_obj->map_noncoherent) { dma_obj->vaddr =3D dma_alloc_noncoherent(drm_dev_dma_dev(drm), size, @@ -171,6 +156,30 @@ struct drm_gem_dma_object *drm_gem_dma_create(struct d= rm_device *drm, drm_gem_object_put(&dma_obj->base); return ERR_PTR(ret); } + +/** + * drm_gem_dma_create - allocate an object with the given size + * @drm: DRM device + * @size: size of the object to allocate + * + * This function creates a DMA GEM object and allocates memory as backing = store. + * The allocated memory will occupy a contiguous chunk of bus address spac= e. + * + * For devices that are directly connected to the memory bus then the allo= cated + * memory will be physically contiguous. For devices that access through an + * IOMMU, then the allocated memory is not expected to be physically conti= guous + * because having contiguous IOVAs is sufficient to meet a devices DMA + * requirements. + * + * Returns: + * A struct drm_gem_dma_object * on success or an ERR_PTR()-encoded negati= ve + * error code on failure. + */ +struct drm_gem_dma_object *drm_gem_dma_create(struct drm_device *drm, + size_t size) +{ + return drm_gem_dma_create_flags(drm, size, DRM_MODE_DUMB_KERNEL_MAP); +} EXPORT_SYMBOL_GPL(drm_gem_dma_create); =20 /** @@ -179,6 +188,7 @@ EXPORT_SYMBOL_GPL(drm_gem_dma_create); * @file_priv: DRM file-private structure to register the handle for * @drm: DRM device * @size: size of the object to allocate + * @flags: DRM_MODE_DUMB_* flags if any * @handle: return location for the GEM handle * * This function creates a DMA GEM object, allocating a chunk of memory as @@ -194,14 +204,14 @@ EXPORT_SYMBOL_GPL(drm_gem_dma_create); */ static struct drm_gem_dma_object * drm_gem_dma_create_with_handle(struct drm_file *file_priv, - struct drm_device *drm, size_t size, + struct drm_device *drm, size_t size, u32 flags, uint32_t *handle) { struct drm_gem_dma_object *dma_obj; struct drm_gem_object *gem_obj; int ret; =20 - dma_obj =3D drm_gem_dma_create(drm, size); + dma_obj =3D drm_gem_dma_create_flags(drm, size, DRM_MODE_DUMB_KERNEL_MAP); if (IS_ERR(dma_obj)) return dma_obj; =20 @@ -283,7 +293,7 @@ int drm_gem_dma_dumb_create_internal(struct drm_file *f= ile_priv, args->size =3D args->pitch * args->height; =20 dma_obj =3D drm_gem_dma_create_with_handle(file_priv, drm, args->size, - &args->handle); + args->flags, &args->handle); return PTR_ERR_OR_ZERO(dma_obj); } EXPORT_SYMBOL_GPL(drm_gem_dma_dumb_create_internal); @@ -313,12 +323,13 @@ int drm_gem_dma_dumb_create(struct drm_file *file_pri= v, struct drm_gem_dma_object *dma_obj; int ret; =20 + args->flags =3D DRM_MODE_DUMB_KERNEL_MAP; ret =3D drm_mode_size_dumb(drm, args, 0, 0); if (ret) return ret; =20 dma_obj =3D drm_gem_dma_create_with_handle(file_priv, drm, args->size, - &args->handle); + args->flags, &args->handle); return PTR_ERR_OR_ZERO(dma_obj); } EXPORT_SYMBOL_GPL(drm_gem_dma_dumb_create); @@ -412,7 +423,10 @@ void drm_gem_dma_print_info(const struct drm_gem_dma_o= bject *dma_obj, struct drm_printer *p, unsigned int indent) { drm_printf_indent(p, indent, "dma_addr=3D%pad\n", &dma_obj->dma_addr); - drm_printf_indent(p, indent, "vaddr=3D%p\n", dma_obj->vaddr); + if (dma_obj->dma_attrs & DMA_ATTR_NO_KERNEL_MAPPING) + drm_printf_indent(p, indent, "vaddr=3D(no mapping)\n"); + else + drm_printf_indent(p, indent, "vaddr=3D%p\n", dma_obj->vaddr); } EXPORT_SYMBOL(drm_gem_dma_print_info); =20 @@ -511,6 +525,9 @@ EXPORT_SYMBOL_GPL(drm_gem_dma_prime_import_sg_table); int drm_gem_dma_vmap(struct drm_gem_dma_object *dma_obj, struct iosys_map *map) { + if (dma_obj->dma_attrs & DMA_ATTR_NO_KERNEL_MAPPING) + return -ENOMEM; + iosys_map_set_vaddr(map, dma_obj->vaddr); =20 return 0; --=20 2.53.0.851.ga537e3e6e9-goog