From nobody Thu Apr 9 09:48:09 2026 Received: from mail-pj1-f41.google.com (mail-pj1-f41.google.com [209.85.216.41]) (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 1AE4138B7C4 for ; Tue, 10 Mar 2026 03:20:44 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.41 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773112846; cv=none; b=J53DntIu/K0SL7oaQOZ/3hL6X1yAWZ2941tBoOsUKo3ijI7DXPHDAFVyCHTWyO2nvevC1+Xh4HvGimCxQZ3nC0XbG2ZTH+mdQVxcdu900CqqjQJs3w4V2+g5KIjVxXVCGTUKH5q6oeTPOf4mYKtFApKYQKwruDlfei9eEMGRu24= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773112846; c=relaxed/simple; bh=1ifAvQ9YQ7quAs4EUywvSzDs8d3qnqjGmcOWLHUYZwg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=TXT0bGyqXHI2XlvqpDBkUwydeQh/ZE4PGhMgUeUJVFX9KjWYKEwqILZTRZJBLLfYQia/yHt9IObRP64QqjAEfTJYkb0Zv5OxuyX1mNDHeqeY+xNH8s7vn1btT0QtHBpbHJLIVvsOB/1PHQJmfWFRhTByrZJil3+crKaFKJHT75U= 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=Z0qRDqbD; arc=none smtp.client-ip=209.85.216.41 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="Z0qRDqbD" Received: by mail-pj1-f41.google.com with SMTP id 98e67ed59e1d1-3590042fa8eso7794754a91.1 for ; Mon, 09 Mar 2026 20:20:44 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1773112844; x=1773717644; 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=9DNho1J2CisM3xAD9Y1bBejtF+SOOT6CZm5ayFQyPks=; b=Z0qRDqbDL/pust+uOlGqTtw58tIj2f1gH9ihYChgThcCLR7GPtZZq6/RtyBW+TnWFA j1gthaWcpNclEhElvxaq9lzWEuBjGaBYVYwzJho2JlXX0bp9EQNztUgHCEfnlm1EpYvy O0S7EjZedENStLK6dFIOq493NIh1L164gSliU= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1773112844; x=1773717644; 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=9DNho1J2CisM3xAD9Y1bBejtF+SOOT6CZm5ayFQyPks=; b=hXe1OcYQMf3BiUGBwGsQ5SX6xo75YagtqyXUDnhhlJC1jiYjR9Ixk7Z8PFwcVHvbAm nx9tGsBnYgPnCvizJlUkWmPLHfDsAwtDgeM72PNi8Ef4UOkPoWTLETJriP46LwhZhPvW ysaQtcQuSgoBjgesCJF54qP4tGJnaIsYC4EcZP3R4nuwuofQFTOkes/Ba65sBd9pr0lq 0Dp8xq+mdMUySi5usoTuuun013vFitqogYa2eNt2+4FqoSJpk2ktxki8l6+/KtcRzLpg AYatqqjJ/W5+gAoiuk18OPCeAnF0cTICDGnsuMMzobg3MawIA+rP6YPiWdo5n6E0ZBTV QnvQ== X-Forwarded-Encrypted: i=1; AJvYcCWRwWEBtt3TkgIIbYH0G11+TysRuHpUCY8RFb3Xy41eXk+OisEC8+Xg4Wi95kTxw8eIHheBzG3csldmzC0=@vger.kernel.org X-Gm-Message-State: AOJu0YyojqzdMjMh364aOgW+yM3qfRVPQOs+9PVO04CKjC0ZJVpvARgY ZH4zwl44jMdErhpijrL0VRxxyPepV8NsC74GglgLmhAgVJv8JtcV+gKwVcjpwwKWhA== X-Gm-Gg: ATEYQzywTgTcGtG0eVcU+epZ+64uF+pjqQNtEMBAwJURgxUu1Q2B8lA1OGeByulCYyo g3TDXJgsy3rUcC5QeG6DZPdlc/vyqgq85cUwPdCQDQrKPDoyXtfCADcImNoUzHeDOH7zloEP+GV PaGJhA10RZYvgHpvvnLypBI6mzQkf0sHxuCANQ28Oi4cyGvCBOOOFzGv1/0sUR6dIXvDnRB2Goq bML1TOCiTJO0jy5FSK6oQr98bYlv8chYnSGZ41Hr6u4kHi0qY3yrYtqw6afOL7/Lc/6NCsAQUwr iKZfOqEsTovwq0/745qTMvLGXuF2nUPti9/P0/pXK4DwshfzvA9mJEIcRbNQvh/Cug3ZWCtN0EJ vW1YuUS39HOGthmvseMO/FDV7TLxBSwmbTLKcN1K5PnMM6SuhnzGOORUtiqt13yw/ZTz55FYP+A BWnTH5u7I6o7HIOzs628PAUhgI6gbhfWp0pWdzHTMkbU0JxP5bHYspCciogHRjbO5PZGozPt9T0 3wrkagN X-Received: by 2002:a17:90b:5252:b0:359:9bad:13d9 with SMTP id 98e67ed59e1d1-359be29eea6mr12192211a91.15.1773112844479; Mon, 09 Mar 2026 20:20:44 -0700 (PDT) Received: from wenstp920.tpe.corp.google.com ([2a00:79e0:201d:8:ee38:e01e:e888:6900]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-359f06f79absm1154608a91.6.2026.03.09.20.20.41 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 09 Mar 2026 20:20:44 -0700 (PDT) From: Chen-Yu Tsai To: Matthias Brugger , AngeloGioacchino Del Regno , Chun-Kuang Hu , Philipp Zabel , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , Chen-Yu Tsai , Jernej Skrabec , Samuel Holland , Simona Vetter Cc: Chen-Yu Tsai , linux-sunxi@lists.linux.dev, Paul Kocialkowski , linux-mediatek@lists.infradead.org, dri-devel@lists.freedesktop.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org Subject: [PATCH 2/4] drm/gem-dma: Support dedicated DMA device for allocation and mapping Date: Tue, 10 Mar 2026 11:20:05 +0800 Message-ID: <20260310032012.2542334-3-wenst@chromium.org> X-Mailer: git-send-email 2.53.0.473.g4a7958ca14-goog In-Reply-To: <20260310032012.2542334-1-wenst@chromium.org> References: <20260310032012.2542334-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" Support for a dedicated DMA device for prime imports was added in commit 143ec8d3f939 ("drm/prime: Support dedicated DMA device for dma-buf imports"= ). This allowed the DRM driver to provide a dedicated DMA device when its own underlying device was not capable of DMA, for example when it is a USB device (the original target) or a virtual device. The latter case is common on embedded SoCs, on which the display pipeline is composed of various fixed function blocks, and the DRM device is simply a made-up device, an address space managing the routing between the blocks, or whichever block the implementor thought made sense at the time. The point is that the chosen device is often not the actual device doing the DMA. Various drivers have used workarounds or reimplemented the GEM DMA helpers to get the DMA addresses and IOMMUs to work correctly. Add support for the dedicated DMA device to the GEM DMA helpers. No existing driver currently uses the GEM DMA helpers and calls drm_dev_set_dma_dev() to set a dedicated DMA device, so no existing users should be affected. Signed-off-by: Chen-Yu Tsai --- drivers/gpu/drm/drm_gem_dma_helper.c | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/drivers/gpu/drm/drm_gem_dma_helper.c b/drivers/gpu/drm/drm_gem= _dma_helper.c index ecb9746f4da8..70f83e464476 100644 --- a/drivers/gpu/drm/drm_gem_dma_helper.c +++ b/drivers/gpu/drm/drm_gem_dma_helper.c @@ -146,12 +146,13 @@ struct drm_gem_dma_object *drm_gem_dma_create(struct = drm_device *drm, return dma_obj; =20 if (dma_obj->map_noncoherent) { - dma_obj->vaddr =3D dma_alloc_noncoherent(drm->dev, size, + dma_obj->vaddr =3D dma_alloc_noncoherent(drm_dev_dma_dev(drm), + size, &dma_obj->dma_addr, DMA_TO_DEVICE, GFP_KERNEL | __GFP_NOWARN); } else { - dma_obj->vaddr =3D dma_alloc_wc(drm->dev, size, + dma_obj->vaddr =3D dma_alloc_wc(drm_dev_dma_dev(drm), size, &dma_obj->dma_addr, GFP_KERNEL | __GFP_NOWARN); } @@ -236,12 +237,14 @@ void drm_gem_dma_free(struct drm_gem_dma_object *dma_= obj) drm_prime_gem_destroy(gem_obj, dma_obj->sgt); } else if (dma_obj->vaddr) { if (dma_obj->map_noncoherent) - dma_free_noncoherent(gem_obj->dev->dev, dma_obj->base.size, + dma_free_noncoherent(drm_dev_dma_dev(gem_obj->dev), + dma_obj->base.size, dma_obj->vaddr, dma_obj->dma_addr, DMA_TO_DEVICE); else - dma_free_wc(gem_obj->dev->dev, dma_obj->base.size, - dma_obj->vaddr, dma_obj->dma_addr); + dma_free_wc(drm_dev_dma_dev(gem_obj->dev), + dma_obj->base.size, dma_obj->vaddr, + dma_obj->dma_addr); } =20 drm_gem_object_release(gem_obj); @@ -432,7 +435,7 @@ struct sg_table *drm_gem_dma_get_sg_table(struct drm_ge= m_dma_object *dma_obj) if (!sgt) return ERR_PTR(-ENOMEM); =20 - ret =3D dma_get_sgtable(obj->dev->dev, sgt, dma_obj->vaddr, + ret =3D dma_get_sgtable(drm_dev_dma_dev(obj->dev), sgt, dma_obj->vaddr, dma_obj->dma_addr, obj->size); if (ret < 0) goto out; @@ -539,12 +542,12 @@ int drm_gem_dma_mmap(struct drm_gem_dma_object *dma_o= bj, struct vm_area_struct * if (dma_obj->map_noncoherent) { vma->vm_page_prot =3D vm_get_page_prot(vma->vm_flags); =20 - ret =3D dma_mmap_pages(dma_obj->base.dev->dev, + ret =3D dma_mmap_pages(drm_dev_dma_dev(dma_obj->base.dev), vma, vma->vm_end - vma->vm_start, virt_to_page(dma_obj->vaddr)); } else { - ret =3D dma_mmap_wc(dma_obj->base.dev->dev, vma, dma_obj->vaddr, - dma_obj->dma_addr, + ret =3D dma_mmap_wc(drm_dev_dma_dev(dma_obj->base.dev), vma, + dma_obj->vaddr, dma_obj->dma_addr, vma->vm_end - vma->vm_start); } if (ret) --=20 2.53.0.473.g4a7958ca14-goog