From patchwork Wed Mar 11 09:49:25 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Chen-Yu Tsai X-Patchwork-Id: 183 Received: from mail-pg1-f179.google.com (mail-pg1-f179.google.com [209.85.215.179]) (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 42D793B3884 for ; Wed, 11 Mar 2026 09:49:58 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.179 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773222599; cv=none; b=rMeILLzuUN9cp4KlgOHpkLz2HN3VuAgUm9r+gzK+lsA6l7E/8MFxf2q6DdNKNEDESiZJaESR2pKOsTaEEIJOvShlk4my3i6YDuaH7cTBF3qs0rYm8cNDUU40/iZOytEXTdKskD6QhJfe61NsVJsNhSVG6vzndpYzxZnob/R3brk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773222599; c=relaxed/simple; bh=PTu8avjQH0uE2z2RBz4QfV8RqQGcOxGaplS8ZRyvoqo=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=WVliDlgCnOuj/oxQnwZHDNgoOX2jiNx0MQhKGwEXziPLGSRZALRBt7QvhcdJf9fFFZ2L+zAqF7z3X0KxZpji+PljiBYUXg042cWGuNuTcNuY29jnInTcaz/PgWOf6ocOBQVzbPSQCQ90tW/5aQQnLlEA96AzmlZww+VaAa44yQg= 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=OhErwQeZ; arc=none smtp.client-ip=209.85.215.179 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="OhErwQeZ" Received: by mail-pg1-f179.google.com with SMTP id 41be03b00d2f7-c7384f5a9cdso2931633a12.0 for ; Wed, 11 Mar 2026 02:49:58 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1773222597; x=1773827397; darn=lists.linux.dev; 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=VT7ZzcC3UQ69KoSxqnkGn97mAkV5xCuC7gmeayRSfVQ=; b=OhErwQeZnzx3fSRoZYrL66WX7JX1Uvd4/AQoX4Ej2DI0h7GWqDrPBXQIiGVz2Ctft6 gbMkUtV2FobTf6imAtY+hvvyRa4s1kM56HX5rS0ggYNYZKfeFPh6YhI5qJju8mgN/mbx YD7zDm3EFobHRHLQt6493lSWoAKld5CaE8DtI= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1773222597; x=1773827397; 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=VT7ZzcC3UQ69KoSxqnkGn97mAkV5xCuC7gmeayRSfVQ=; b=iGJS3ZqLIuuvu+7PQllVvncgaJnNDVkmGHVSexXqrpnEZX7ohNmnkD2M6SgCsoMgH9 K5kEjCcs2lfg+LuN1H1Uu2O/494epePY3fqxTCwZn1PZPH3xJXF6dU6UaWzjwrMAoRB+ ERaOADan96ZEJIFmxiPDKYBFHRnqg8LA+e5L2h0MYv3uZj9v9h2s4zJrFUKjNcNvPJPe AXXAxy9Yxq7hGmbYmvUyAFsAIQPT6iyefXB3YC/HNj8OdWtNCcjrtbzDDkvBjWFKjUVa 3cASdSgWUchX25XiKCczoBhjqmcaD/QKpUOdu4UtYRYAlB4axuHhF/0pqBmwFdicthZ5 I50g== X-Forwarded-Encrypted: i=1; AJvYcCX0fQQ7gT5mG9zFa56p/UjJP7RjfK13Um4LLO/jzpk8qqtAbYn1snjyAEskwClnBBVu4HKZeYa9CqK7QQ==@lists.linux.dev X-Gm-Message-State: AOJu0Yy3hlVR33r4xREM3iKyW+m8vRB+YrG5ICPVfr6dhyUtUS+OYp41 WZ4z1jFMvjrJ8NZ7Iwmny1MCdJU+YoqEvaFbjhbPmK4Z9yl0ooXIW4we79WE0mP+HA== X-Gm-Gg: ATEYQzwoIebuKZxmVYRt3zGBm90LEr9Um1iJdKD4SogRLKFaY85ThZzuy8ZJMFIyD1b wGF4jAcbVXa+i6zrOyGK89rN7yKDEbShtEwpaCMJtWzgYCm7h5pu7f9FKP2FCZrkXm5fWogzx4c qeDEhfJbCysUxDzUH1fH+Zyp0A5ho3/oiK1k4BOjKKtCHTIIenV8vPQeTKQIC0TneOo/1t8+DwA 99ip3rrWBtgD9D2WLiT05pK/HpkYf30ilZ/o/TlKpcJWEBRDslDtbifHvrdOpi1LDhmanvvepvJ B9c3CpEuAXJ4qMctaNp3PxQHLu9TZngC/QqtRAIF+sfJ2FT5OsgkT2Ue17v0Y4fCniArM7amGQ6 c9jWQ6jQocXpvu9alY2t7njzbKqCengz6PLYSMrzRqb8tzOBlxeMVxColvkNz/ZOfTQ5UiY2487 xt3NNK+HrKDSbM9yUpKOajgX0jfk76scq3CZ2ZKSu5hGBFdwjPUkjMmplfw52g6dbOo+wb3a6Q/ +WrYEXkDTO7WQYYXGE= X-Received: by 2002:a05:6a21:6e0c:b0:389:8f3f:50ce with SMTP id adf61e73a8af0-398c612795emr1755090637.56.1773222597656; Wed, 11 Mar 2026 02:49:57 -0700 (PDT) Received: from wenstp920.tpe.corp.google.com ([2a00:79e0:201d:8:805b:14e9:f783:bcae]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-829f6e22f85sm1887598b3a.27.2026.03.11.02.49.53 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 11 Mar 2026 02:49:56 -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 , David Airlie , 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 v2 1/4] drm/prime: Limit scatter list size with dedicated DMA device Date: Wed, 11 Mar 2026 17:49:25 +0800 Message-ID: <20260311094929.3393338-2-wenst@chromium.org> X-Mailer: git-send-email 2.53.0.473.g4a7958ca14-goog In-Reply-To: <20260311094929.3393338-1-wenst@chromium.org> References: <20260311094929.3393338-1-wenst@chromium.org> Precedence: bulk X-Mailing-List: linux-sunxi@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Status: O If a dedicated DMA device is specified for the DRM device, then the scatter list size limit should pertain to the DMA device. Use the dedicated DMA device, if given, to limit the scatter list size. This only applies to drivers that have called drm_dev_set_dma_dev() and are using drm_prime_pages_to_sg() either directly or through the SHMEM helpers. At the time of this writing, the former case only includes the Rockchip DRM driver, while the latter case includes the gud, udl, and the tiny appletbdrm and gm12u320 drivers. Reviewed-by: Thomas Zimmermann Signed-off-by: Chen-Yu Tsai Reviewed-by: AngeloGioacchino Del Regno --- drivers/gpu/drm/drm_prime.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/gpu/drm/drm_prime.c b/drivers/gpu/drm/drm_prime.c index 51fdb06d3e9f..9b44c78cd77f 100644 --- a/drivers/gpu/drm/drm_prime.c +++ b/drivers/gpu/drm/drm_prime.c @@ -859,7 +859,7 @@ struct sg_table *drm_prime_pages_to_sg(struct drm_device *dev, return ERR_PTR(-ENOMEM); if (dev) - max_segment = dma_max_mapping_size(dev->dev); + max_segment = dma_max_mapping_size(drm_dev_dma_dev(dev)); if (max_segment == 0) max_segment = UINT_MAX; err = sg_alloc_table_from_pages_segment(sg, pages, nr_pages, 0, From patchwork Wed Mar 11 09:49:26 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Chen-Yu Tsai X-Patchwork-Id: 182 Received: from mail-pf1-f180.google.com (mail-pf1-f180.google.com [209.85.210.180]) (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 57A393B8959 for ; Wed, 11 Mar 2026 09:50:03 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.180 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773222604; cv=none; b=dxZvju3irZPFKhyU+WEbj52WfoVpGEjNl43uK3fGJgPldjvJnXg3/CvB0d/kolhH7/v1JT6bKhqpCuwaGd17aDyl3UDzG3Agqha1liLTvv1rMl75Tilkq4N+KwzHQguhkYyBx7pXxESo3+OtPNq7XVZqZYS8i/+e0J5eoPlomao= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773222604; c=relaxed/simple; bh=4pQgi2Z3oYVv09c19L/ahzU+DTz3ubvyJPz6+N7R/tI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=XsdOyBDYCteB/qkoV8HzNY26Paj22rU4dO0KhCFbLrWPlarklr5fGzQRIxhdg4+kFZrK7gq5cLRJKE0kNuluTY7pPdcSEPYMQBj82CYqXDOXAYR00nvsV7Ze93zZXHNo3cMGL15JVjIsLZgpDtYEVCGfFlYViMrXqonosofdiis= 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=MwcLhDsv; arc=none smtp.client-ip=209.85.210.180 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="MwcLhDsv" Received: by mail-pf1-f180.google.com with SMTP id d2e1a72fcca58-829b2019b39so2474982b3a.3 for ; Wed, 11 Mar 2026 02:50:03 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1773222603; x=1773827403; darn=lists.linux.dev; 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=jtkXXLPioyWW3Nha1qMzs0mPGG4eok73ub81lNtbqSo=; b=MwcLhDsvdsrPy20aYFeMQLSW4iSE4kABAfv6d/FydqVyUDFVyia1WUQwyXIj5t9C4u 8rlYTpsL80Dq/BOpEJZz04XduJEHyXj45ZxgkGrJNRQQPG7NLWGlOjeVmMeHS5qix5fD yOBNahyM+INRKzNLKWtBMFDQ7XAXRzUNqd0UE= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1773222603; x=1773827403; 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=jtkXXLPioyWW3Nha1qMzs0mPGG4eok73ub81lNtbqSo=; b=c7tJcpWx+5Gd4gtTU2KS9UysCw3BOoeEIP3o+1PmZQK30OqWkZAdhHGHHASDgHOG4t sXUclFlJ58F66Mii1RT6DmWqmpWDCrkJqn7wBJG1WHf1kekHf0JGrnCWP4ZhHKzEB1CW zS4ayoMdv9eY8XpiEthVolrIpUZIfeDBgnkQW6w11BQwTogK8LC46CSLGBiF0UeV0YzM FRDJHTHbyzFgVgQ5c+XpX8o7QpWNrMgSKYJa7ffQsjZbuGh0UraVAE7wgyPYVGcd24GH 9/mxyrnqXTmRpXd3JIE5VDNFAu9E8sFvNsqHW+HckcjOD7N09GaQwAstgnk31X0Fai3c 4K6g== X-Forwarded-Encrypted: i=1; AJvYcCXm4pF0UHY9IkvL7i61ESxnlcF3nwoQD4+taTe1mEUCeFFEC5COdLC9fg6tcOaGAH7Rvxzv9NaxkGiAPQ==@lists.linux.dev X-Gm-Message-State: AOJu0Ywd7SpTU9w4agvgAoDMYONG4vy7AOp1mTnjTv75o3hUyUIYLBDL Ikgnqaydc7bABeg+eVhBNrup3hGYn8BRJQcCvs1s1hZX8ncTh8roiiGAVXfffiIQyQ== X-Gm-Gg: ATEYQzwomdfSRE2zIHKkK647YQgSPOSfKyAWDPZHKrnvrCcxbNMgNQxIrZWOix4tpD/ txIeTD01azXxlIFm4WWR2aDTosAEh7zhbWgHdmIPgAM7RVmoP4bb2CTb1P/jZaQi/lg0+aTpSxR C1EYrJ5y+ESVE8wOP3Tx3I4DX5Qt03FL8VSYCJbmJToUiR1yyDfsHJfT9D/HaYRXvnYLxNamlkM gEHBzMT66iys+wyyxanstBTzUg5lP2OVO9klrHah+mWr2P0KoNb4Bo9PXhrmawr++KCakfSujTK TfU4v7WW++oG9pXQ1o3Q0yKOSSP5xT3usfknGcVVYS2p5fLy+bLusuoQS3rla/EPQdvq/rzxp0O +jZUswPGx8IPnrZ2/+OrI7aRNZEVCvadyv4viMcE9EOOwdTvNsVpSScd+Q2nqF7VTGWOwN0usu4 GUrKU2V6VSs3DUzP+TYWlFpS+rdm+uDMFhn5cM3xyY/KMQ45YHQCMVBx+0M+wNckQLIW2+EKy6T DwNCRSH X-Received: by 2002:a05:6a00:3006:b0:81f:9b0a:812a with SMTP id d2e1a72fcca58-829f70af1ebmr1872729b3a.14.1773222602308; Wed, 11 Mar 2026 02:50:02 -0700 (PDT) Received: from wenstp920.tpe.corp.google.com ([2a00:79e0:201d:8:805b:14e9:f783:bcae]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-829f6e22f85sm1887598b3a.27.2026.03.11.02.49.57 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 11 Mar 2026 02:50:00 -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 , David Airlie , 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 v2 2/4] drm/gem-dma: Support dedicated DMA device for allocation and mapping Date: Wed, 11 Mar 2026 17:49:26 +0800 Message-ID: <20260311094929.3393338-3-wenst@chromium.org> X-Mailer: git-send-email 2.53.0.473.g4a7958ca14-goog In-Reply-To: <20260311094929.3393338-1-wenst@chromium.org> References: <20260311094929.3393338-1-wenst@chromium.org> Precedence: bulk X-Mailing-List: linux-sunxi@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Status: O 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. Reviewed-by: Thomas Zimmermann Signed-off-by: Chen-Yu Tsai Reviewed-by: AngeloGioacchino Del Regno --- 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; if (dma_obj->map_noncoherent) { - dma_obj->vaddr = dma_alloc_noncoherent(drm->dev, size, + dma_obj->vaddr = dma_alloc_noncoherent(drm_dev_dma_dev(drm), + size, &dma_obj->dma_addr, DMA_TO_DEVICE, GFP_KERNEL | __GFP_NOWARN); } else { - dma_obj->vaddr = dma_alloc_wc(drm->dev, size, + dma_obj->vaddr = 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); } drm_gem_object_release(gem_obj); @@ -432,7 +435,7 @@ struct sg_table *drm_gem_dma_get_sg_table(struct drm_gem_dma_object *dma_obj) if (!sgt) return ERR_PTR(-ENOMEM); - ret = dma_get_sgtable(obj->dev->dev, sgt, dma_obj->vaddr, + ret = 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_obj, struct vm_area_struct * if (dma_obj->map_noncoherent) { vma->vm_page_prot = vm_get_page_prot(vma->vm_flags); - ret = dma_mmap_pages(dma_obj->base.dev->dev, + ret = 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 = dma_mmap_wc(dma_obj->base.dev->dev, vma, dma_obj->vaddr, - dma_obj->dma_addr, + ret = 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) From patchwork Wed Mar 11 09:49:27 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Chen-Yu Tsai X-Patchwork-Id: 181 Received: from mail-pf1-f175.google.com (mail-pf1-f175.google.com [209.85.210.175]) (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 2F0C53BD235 for ; Wed, 11 Mar 2026 09:50:07 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.175 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773222608; cv=none; b=I11CWz4hrdqdVOfev3tMS6XNSl/rc0wr2uqQ6gbJhJOs/RSrkOnlSSh728YS93UE1Ac+9mCfahw75ZriTACZjk/oX8LTv0GvVNIf3HxMbeoDMTFb4Lm1paRStMQO77ZzbliqdM6jdhZJ6k5u+A1exstEgGMklFiXtWes1uxlXVY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773222608; c=relaxed/simple; bh=LQbrMb+Azt+i6Z84kTXHfLA6Ff9ZHKH0IIkLhDOx60Y=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=RXYyAab49tWoU+UhhJ0HNxcjkp56eULb9wuoisNJrUK3niuhF+Gmg5qYLacLh1b5/wrXCTaSr+geb6LL6upDuF1EYqtLRphqybzIhFaU8m4lkP9IInn3vkWszB8qBYJxH84EPABjsEYjz7R2nEmh+e1WqeoDayrUqbed1AjEBkc= 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=jcKY7P/O; arc=none smtp.client-ip=209.85.210.175 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="jcKY7P/O" Received: by mail-pf1-f175.google.com with SMTP id d2e1a72fcca58-82418b0178cso7411009b3a.1 for ; Wed, 11 Mar 2026 02:50:07 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1773222607; x=1773827407; darn=lists.linux.dev; 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=45E5GmiW2zh+KTTZWc3r6uENZ0vLv56id0nOi4Pktsc=; b=jcKY7P/Oew0J9duUpag2X3GdbJc/Ry95XbIX+ItnxAqYmILTm/Fm/kv+NcsikpAFAv WuKppR3J83eXD5piO/jzJZojOZkCAf8IBfu1dh4pftvW6mdswqkxAdCwNwVb3OFMSeT/ SFdO3fyFslzpc/99oxKihp5941QU5+EDNdb54= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1773222607; x=1773827407; 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=45E5GmiW2zh+KTTZWc3r6uENZ0vLv56id0nOi4Pktsc=; b=QAVZISH/bjoWbmzx4OW3Bzr46Jn1KvaKIjV00RcX2hCpt6rAujyckHZgmr64F/CMcF Yri5zFX1uQUAVgz7+LHv+8lj62PsGeQGaMhrad214WekiZPq7vK3attIuLxDL4nW1NWO JNXd2e/58FUdwep4dxjwFO9alTc/BvynKSyKP5oaszX0z8VsQ378Yer7mgf0gSvcvo5/ gY4PkTIcFepXbNICc+jejM9luutAJFY7s/JULb55LWhO7SnEGz+iknwWPDT0yrTPWQff /oNG7yl+irmBP8OO/RdNq+kAymeLxfXIUW00HDYxU1x/BBznjiGBKFCnF8ORAN53MPGq bsTw== X-Forwarded-Encrypted: i=1; AJvYcCV3eyKn8z8d55NHHhNvqWT//K4RSUwrPxBN8Pgv2X4MK8ys0TATquD59gZk5fUO/i3PZQsdlZu7vDNu5Q==@lists.linux.dev X-Gm-Message-State: AOJu0Yx3qSm8/uKW4iwlBxPxaPajEIn10KwBVbYeKLx61yGVq+HctMBq H8LZxw3tXkcyxL8P1fCz6s3OmS9aq8q6JDqyFhmF5EoKYtUOfGEAlbMpQazBIAeY5w== X-Gm-Gg: ATEYQzynZuWPTwqimkHHBA/4YK14s1ZULPLuP9VHuUSXe9pv6rLpDQ09psjv8WAESH6 TezJz4owVN5DM8XLMu/ECAH1NCIiASKI0JzHMI+QEcZmMFq81akC6iYPA49rVvmoKvVJdGWnGNp ruqpholg0fqm/xY7OvQ+uY0C9vpE7GjhE1T14Tu534+Rs22ReDjLylMzgTc5FRVkR0al35bla5p 9B3gIvkoDH5yJm2buwlxa8SJqPMHfzvDU+0FJO/2hk4VGvWWMPVkz3+QiVhC70ExVJAnDyWsUHt hfY9ZQ83g9xOJAYMvcIaWA8R60WyGir/xJWTz/5eweotW7x+VHCylqtKt/uq8/wiVC9Mw1jD4LE H6jBLTT3BlrPbhFjsPRllFxOBy9rY094OGBlJbfduSz4QJ0Iu5PMvlVpUmPSNElVPxmzq5FKVGN luYSOcpdOoDi6vOdFPYhuv19T6/yz0Eb6zG8BiVTPVC9/k6cSKVIpmrP4DDz1xedXMtLQiSX8// TuTG+MG X-Received: by 2002:a05:6a00:348a:b0:81f:3f10:6b7c with SMTP id d2e1a72fcca58-829f703e320mr1891131b3a.28.1773222606556; Wed, 11 Mar 2026 02:50:06 -0700 (PDT) Received: from wenstp920.tpe.corp.google.com ([2a00:79e0:201d:8:805b:14e9:f783:bcae]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-829f6e22f85sm1887598b3a.27.2026.03.11.02.50.03 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 11 Mar 2026 02:50:05 -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 , David Airlie , 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 v2 3/4] drm/mediatek: Set dedicated DMA device and drop custom GEM callbacks Date: Wed, 11 Mar 2026 17:49:27 +0800 Message-ID: <20260311094929.3393338-4-wenst@chromium.org> X-Mailer: git-send-email 2.53.0.473.g4a7958ca14-goog In-Reply-To: <20260311094929.3393338-1-wenst@chromium.org> References: <20260311094929.3393338-1-wenst@chromium.org> Precedence: bulk X-Mailing-List: linux-sunxi@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Status: O In commit 9b54a32c7c6a ("drm/mediatek: mtk_gem: Partial refactor and use drm_gem_dma_object") the MediaTek DRM driver was refactored to use drm_gem_dma_object, but custom callbacks were still needed to deal with using the first device of the pipeline as the DMA device, instead of the MMSYS device that the DRM driver binds to. Turns out there is already partial support for dedicated DMA devices in the DRM subsystem for PRIME imports. The preceding patches add support for dedicated DMA devices to the GEM DMA helpers. This allows us to just set the dedicated DMA device for the DRM device, and drop all the custom GEM callbacks. Also drop the .dma_dev field from the driver private data as it is no longer needed. There are slight differences in the mmap helper: the VM_DONTDUMP and VM_IO flags are no longer set. Both were lifted from drm_gem_mmap_obj(). VM_IO probably doesn't make sense since the buffer is allocated using dma_alloc_attrs(). Reviewed-by: Thomas Zimmermann Signed-off-by: Chen-Yu Tsai Reviewed-by: AngeloGioacchino Del Regno Acked-by: Chun-Kuang Hu --- Changes since v1: - Also remove reference to mtk_gem.c from the Makefile --- drivers/gpu/drm/mediatek/Makefile | 1 - drivers/gpu/drm/mediatek/mtk_crtc.c | 1 - drivers/gpu/drm/mediatek/mtk_drm_drv.c | 21 +-- drivers/gpu/drm/mediatek/mtk_drm_drv.h | 1 - drivers/gpu/drm/mediatek/mtk_gem.c | 231 ------------------------- drivers/gpu/drm/mediatek/mtk_gem.h | 17 -- 6 files changed, 3 insertions(+), 269 deletions(-) delete mode 100644 drivers/gpu/drm/mediatek/mtk_gem.c delete mode 100644 drivers/gpu/drm/mediatek/mtk_gem.h diff --git a/drivers/gpu/drm/mediatek/Makefile b/drivers/gpu/drm/mediatek/Makefile index e0ac49b07d50..952d294642fb 100644 --- a/drivers/gpu/drm/mediatek/Makefile +++ b/drivers/gpu/drm/mediatek/Makefile @@ -14,7 +14,6 @@ mediatek-drm-y := mtk_crtc.o \ mtk_dsi.o \ mtk_dpi.o \ mtk_ethdr.o \ - mtk_gem.o \ mtk_mdp_rdma.o \ mtk_padding.o \ mtk_plane.o diff --git a/drivers/gpu/drm/mediatek/mtk_crtc.c b/drivers/gpu/drm/mediatek/mtk_crtc.c index 351d58c50b84..fcb16f3f7b23 100644 --- a/drivers/gpu/drm/mediatek/mtk_crtc.c +++ b/drivers/gpu/drm/mediatek/mtk_crtc.c @@ -23,7 +23,6 @@ #include "mtk_crtc.h" #include "mtk_ddp_comp.h" #include "mtk_drm_drv.h" -#include "mtk_gem.h" #include "mtk_plane.h" /* diff --git a/drivers/gpu/drm/mediatek/mtk_drm_drv.c b/drivers/gpu/drm/mediatek/mtk_drm_drv.c index a94c51a83261..6f6db2e1980e 100644 --- a/drivers/gpu/drm/mediatek/mtk_drm_drv.c +++ b/drivers/gpu/drm/mediatek/mtk_drm_drv.c @@ -19,6 +19,7 @@ #include #include #include +#include #include #include #include @@ -29,7 +30,6 @@ #include "mtk_ddp_comp.h" #include "mtk_disp_drv.h" #include "mtk_drm_drv.h" -#include "mtk_gem.h" #define DRIVER_NAME "mediatek" #define DRIVER_DESC "Mediatek SoC DRM" @@ -565,8 +565,7 @@ static int mtk_drm_kms_init(struct drm_device *drm) goto err_component_unbind; } - for (i = 0; i < private->data->mmsys_dev_num; i++) - private->all_drm_private[i]->dma_dev = dma_dev; + drm_dev_set_dma_dev(drm, dma_dev); /* * Configure the DMA segment size to make sure we get contiguous IOVA @@ -600,26 +599,12 @@ static void mtk_drm_kms_deinit(struct drm_device *drm) DEFINE_DRM_GEM_FOPS(mtk_drm_fops); -/* - * We need to override this because the device used to import the memory is - * not dev->dev, as drm_gem_prime_import() expects. - */ -static struct drm_gem_object *mtk_gem_prime_import(struct drm_device *dev, - struct dma_buf *dma_buf) -{ - struct mtk_drm_private *private = dev->dev_private; - - return drm_gem_prime_import_dev(dev, dma_buf, private->dma_dev); -} - static const struct drm_driver mtk_drm_driver = { .driver_features = DRIVER_MODESET | DRIVER_GEM | DRIVER_ATOMIC, - .dumb_create = mtk_gem_dumb_create, + DRM_GEM_DMA_DRIVER_OPS, DRM_FBDEV_DMA_DRIVER_OPS, - .gem_prime_import = mtk_gem_prime_import, - .gem_prime_import_sg_table = mtk_gem_prime_import_sg_table, .fops = &mtk_drm_fops, .name = DRIVER_NAME, diff --git a/drivers/gpu/drm/mediatek/mtk_drm_drv.h b/drivers/gpu/drm/mediatek/mtk_drm_drv.h index 675cdc90a440..1fc3df4b5485 100644 --- a/drivers/gpu/drm/mediatek/mtk_drm_drv.h +++ b/drivers/gpu/drm/mediatek/mtk_drm_drv.h @@ -54,7 +54,6 @@ struct mtk_mmsys_driver_data { struct mtk_drm_private { struct drm_device *drm; - struct device *dma_dev; bool mtk_drm_bound; bool drm_master; struct device *dev; diff --git a/drivers/gpu/drm/mediatek/mtk_gem.c b/drivers/gpu/drm/mediatek/mtk_gem.c deleted file mode 100644 index f059a1452220..000000000000 --- a/drivers/gpu/drm/mediatek/mtk_gem.c +++ /dev/null @@ -1,231 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* - * Copyright (c) 2015 MediaTek Inc. - * Copyright (c) 2025 Collabora Ltd. - * AngeloGioacchino Del Regno - */ - -#include -#include - -#include -#include -#include -#include -#include -#include - -#include "mtk_drm_drv.h" -#include "mtk_gem.h" - -static int mtk_gem_object_mmap(struct drm_gem_object *obj, struct vm_area_struct *vma); - -static void mtk_gem_free_object(struct drm_gem_object *obj) -{ - struct drm_gem_dma_object *dma_obj = to_drm_gem_dma_obj(obj); - struct mtk_drm_private *priv = obj->dev->dev_private; - - if (dma_obj->sgt) - drm_prime_gem_destroy(obj, dma_obj->sgt); - else - dma_free_wc(priv->dma_dev, dma_obj->base.size, - dma_obj->vaddr, dma_obj->dma_addr); - - /* release file pointer to gem object. */ - drm_gem_object_release(obj); - - kfree(dma_obj); -} - -/* - * Allocate a sg_table for this GEM object. - * Note: Both the table's contents, and the sg_table itself must be freed by - * the caller. - * Returns a pointer to the newly allocated sg_table, or an ERR_PTR() error. - */ -static struct sg_table *mtk_gem_prime_get_sg_table(struct drm_gem_object *obj) -{ - struct drm_gem_dma_object *dma_obj = to_drm_gem_dma_obj(obj); - struct mtk_drm_private *priv = obj->dev->dev_private; - struct sg_table *sgt; - int ret; - - sgt = kzalloc_obj(*sgt); - if (!sgt) - return ERR_PTR(-ENOMEM); - - ret = dma_get_sgtable(priv->dma_dev, sgt, dma_obj->vaddr, - dma_obj->dma_addr, obj->size); - if (ret) { - DRM_ERROR("failed to allocate sgt, %d\n", ret); - kfree(sgt); - return ERR_PTR(ret); - } - - return sgt; -} - -static const struct drm_gem_object_funcs mtk_gem_object_funcs = { - .free = mtk_gem_free_object, - .print_info = drm_gem_dma_object_print_info, - .get_sg_table = mtk_gem_prime_get_sg_table, - .vmap = drm_gem_dma_object_vmap, - .mmap = mtk_gem_object_mmap, - .vm_ops = &drm_gem_dma_vm_ops, -}; - -static struct drm_gem_dma_object *mtk_gem_init(struct drm_device *dev, - unsigned long size, bool private) -{ - struct drm_gem_dma_object *dma_obj; - int ret; - - size = round_up(size, PAGE_SIZE); - - if (size == 0) - return ERR_PTR(-EINVAL); - - dma_obj = kzalloc_obj(*dma_obj); - if (!dma_obj) - return ERR_PTR(-ENOMEM); - - dma_obj->base.funcs = &mtk_gem_object_funcs; - - if (private) { - ret = 0; - drm_gem_private_object_init(dev, &dma_obj->base, size); - } else { - ret = drm_gem_object_init(dev, &dma_obj->base, size); - } - if (ret) { - DRM_ERROR("failed to initialize gem object\n"); - kfree(dma_obj); - return ERR_PTR(ret); - } - - return dma_obj; -} - -static struct drm_gem_dma_object *mtk_gem_create(struct drm_device *dev, size_t size) -{ - struct mtk_drm_private *priv = dev->dev_private; - struct drm_gem_dma_object *dma_obj; - struct drm_gem_object *obj; - int ret; - - dma_obj = mtk_gem_init(dev, size, false); - if (IS_ERR(dma_obj)) - return ERR_CAST(dma_obj); - - obj = &dma_obj->base; - - dma_obj->vaddr = dma_alloc_wc(priv->dma_dev, obj->size, - &dma_obj->dma_addr, - GFP_KERNEL | __GFP_NOWARN); - if (!dma_obj->vaddr) { - DRM_ERROR("failed to allocate %zx byte dma buffer", obj->size); - ret = -ENOMEM; - goto err_gem_free; - } - - DRM_DEBUG_DRIVER("vaddr = %p dma_addr = %pad size = %zu\n", - dma_obj->vaddr, &dma_obj->dma_addr, - size); - - return dma_obj; - -err_gem_free: - drm_gem_object_release(obj); - kfree(dma_obj); - return ERR_PTR(ret); -} - -int mtk_gem_dumb_create(struct drm_file *file_priv, struct drm_device *dev, - struct drm_mode_create_dumb *args) -{ - struct drm_gem_dma_object *dma_obj; - int ret; - - args->pitch = DIV_ROUND_UP(args->width * args->bpp, 8); - - /* - * Multiply 2 variables of different types, - * for example: args->size = args->spacing * args->height; - * may cause coverity issue with unintentional overflow. - */ - args->size = args->pitch; - args->size *= args->height; - - dma_obj = mtk_gem_create(dev, args->size); - if (IS_ERR(dma_obj)) - return PTR_ERR(dma_obj); - - /* - * allocate a id of idr table where the obj is registered - * and handle has the id what user can see. - */ - ret = drm_gem_handle_create(file_priv, &dma_obj->base, &args->handle); - if (ret) - goto err_handle_create; - - /* drop reference from allocate - handle holds it now. */ - drm_gem_object_put(&dma_obj->base); - - return 0; - -err_handle_create: - mtk_gem_free_object(&dma_obj->base); - return ret; -} - -static int mtk_gem_object_mmap(struct drm_gem_object *obj, - struct vm_area_struct *vma) - -{ - struct drm_gem_dma_object *dma_obj = to_drm_gem_dma_obj(obj); - struct mtk_drm_private *priv = obj->dev->dev_private; - int ret; - - /* - * Set vm_pgoff (used as a fake buffer offset by DRM) to 0 and map the - * whole buffer from the start. - */ - vma->vm_pgoff -= drm_vma_node_start(&obj->vma_node); - - /* - * dma_alloc_attrs() allocated a struct page table for mtk_gem, so clear - * VM_PFNMAP flag that was set by drm_gem_mmap_obj()/drm_gem_mmap(). - */ - vm_flags_mod(vma, VM_IO | VM_DONTEXPAND | VM_DONTDUMP, VM_PFNMAP); - - vma->vm_page_prot = pgprot_writecombine(vm_get_page_prot(vma->vm_flags)); - vma->vm_page_prot = pgprot_decrypted(vma->vm_page_prot); - - ret = dma_mmap_wc(priv->dma_dev, vma, dma_obj->vaddr, - dma_obj->dma_addr, obj->size); - if (ret) - drm_gem_vm_close(vma); - - return ret; -} - -struct drm_gem_object *mtk_gem_prime_import_sg_table(struct drm_device *dev, - struct dma_buf_attachment *attach, struct sg_table *sgt) -{ - struct drm_gem_dma_object *dma_obj; - - /* check if the entries in the sg_table are contiguous */ - if (drm_prime_get_contiguous_size(sgt) < attach->dmabuf->size) { - DRM_ERROR("sg_table is not contiguous"); - return ERR_PTR(-EINVAL); - } - - dma_obj = mtk_gem_init(dev, attach->dmabuf->size, true); - if (IS_ERR(dma_obj)) - return ERR_CAST(dma_obj); - - dma_obj->dma_addr = sg_dma_address(sgt->sgl); - dma_obj->sgt = sgt; - - return &dma_obj->base; -} diff --git a/drivers/gpu/drm/mediatek/mtk_gem.h b/drivers/gpu/drm/mediatek/mtk_gem.h deleted file mode 100644 index afebc3a970a8..000000000000 --- a/drivers/gpu/drm/mediatek/mtk_gem.h +++ /dev/null @@ -1,17 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* - * Copyright (c) 2015 MediaTek Inc. - */ - -#ifndef _MTK_GEM_H_ -#define _MTK_GEM_H_ - -#include -#include - -int mtk_gem_dumb_create(struct drm_file *file_priv, struct drm_device *dev, - struct drm_mode_create_dumb *args); -struct drm_gem_object *mtk_gem_prime_import_sg_table(struct drm_device *dev, - struct dma_buf_attachment *attach, struct sg_table *sg); - -#endif From patchwork Wed Mar 11 09:49:28 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Chen-Yu Tsai X-Patchwork-Id: 180 Received: from mail-pf1-f179.google.com (mail-pf1-f179.google.com [209.85.210.179]) (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 B0D1D3C3458 for ; Wed, 11 Mar 2026 09:50:10 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.179 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773222613; cv=none; b=mR/6zjr57eLdqgIhMxcrjvhaNVKtuOoKl/fLsJXDG1Lh2Izc4zpXdblt6yzxJrvM+ATTtrvXIa07RAfc/tVivCc7VPm8hEQXfViE2lTm7RC504BOziowFURO9IJodTJb7/SsLnEcbRrD8rsvB0fGylI6vKT5Zkv9+if4Jgltwck= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773222613; c=relaxed/simple; bh=rfD7Le/WZjv74zhcuW0yU+5NJ1RZ3lo7zccKLiSyBcI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=khWSdiypJ5Aa4h7D76Uip9uV9CWMiGe0LuaQwvs7z+8XlvyZjchoZv/mlGkurjJ8J0pU6bO2UcJvYe1o+Ixm4Otdf8lONY0Z2sIsV8npd2uD6S2O/muENavM5jZwr2gh284WvEOUZmEgMisUrfE7rtHgfzsb81cElcn11pTy78I= 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=MkKXvbTd; arc=none smtp.client-ip=209.85.210.179 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="MkKXvbTd" Received: by mail-pf1-f179.google.com with SMTP id d2e1a72fcca58-82984c077b2so3213984b3a.1 for ; Wed, 11 Mar 2026 02:50:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1773222610; x=1773827410; darn=lists.linux.dev; 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=Y1z9EtizHwE3LeSySxAXfxT/FNlt1Ydhsh1vDf6WdY0=; b=MkKXvbTdd8REnlm92cf9Uf17y6aXXeO1PUAnRA0FxVAygLDOuC42AbHcM33Ws29XI3 64ZjMoIGyHVOXRi0V91dX4t6aDXbBsbs44ubGptSBV7fKnQQ55E5B51cMCXbkdzfemOM Y9B/v0EucBJicaVy1yLDJouls+2WlfWdie7do= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1773222610; x=1773827410; 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=Y1z9EtizHwE3LeSySxAXfxT/FNlt1Ydhsh1vDf6WdY0=; b=REpvyVuUQPkaMkpGTY9wJD4Vzw4Bc+bWyUQNSqMBEycCUCA49HZyJpRhDWA3GMKd7K 3AmOTwGT7SZo45W37zoskwZGbmBlBbyhRnGD3O3QL385QPajC6WntU3x3duUsKJ3dOXq kl0kCjFOV2B4GL2iVBIOPO3p55vNcG22/qaLkCsf9SBeDW/CAk6F+973fuvsGb7lCiLL VBakKsUwz9k1krJKYNbHY3FkYkFkXMrg7sYTLziO3U/zEo6NhRaazClbogSv5JRm+XMQ wSu8QqXUq4yW+p3nONdKt9lSXKq7VinYY0cWQRALNrY++THgcd2VXmHWWeyEIrJ+sKNj tupw== X-Forwarded-Encrypted: i=1; AJvYcCXRjSLn42xSOn1nX+bm+3V1PzCSGBsaYDCNQLAMwuVXWYpRqlkVzAvfskkInnLFfOsaxWp6vglO+uXDtA==@lists.linux.dev X-Gm-Message-State: AOJu0YyxuS/eBnyuWceilW/rABB+cgUaeQpg+Ogkap2yvmxWxhZ2agNw 2AGy0/37yCREG+S49Hy3g7rTZXTrXEfBdRB7v4GqFrdqBPFQMQfksGltHGY3kcJ1+A== X-Gm-Gg: ATEYQzwE/zSpsQ6Iy10dc53+cgnpb9cP41yHl/+5lEnEQsk6KXShnqi2PRjk5yiUqt1 3vgJcUfOPAnvTVsda/ID57/TlZbCTjl5cuZgOYn4F8Wtq0LzgIOzfzt5zds7YxIlSoknmx13KT9 1VUC4fOg9v2ZV3HHz1ndkxFwnrnTG/INAcgw3dGOm+ZH+pjccygOFqLpuH8yTBIg6VJTQPLwXw+ YcLN7zFfbwOnXHMm+2OhV5USWwtSlVsq6vajeJudGr7bh/wRdQTbxCjeg+B5tN88ZCnC3+jd84m t9i5ixJzsxavnNf0Jf9+ASNveUc2eCKU852ROlzJspGCAJ/Tk32n9gUMEPLboksNJlDzG3Dzdk5 gIgQqM4PeYwDjQbBqFGpKJLaHg5V0ePjVi16BdZ66pXFbLxQb4OLG4SmkJHveHzgPIAWy2XQoY8 iAz6j52EcD0Xfce0gaLK5YP7rpM5nUqqWqUHureEv/1pJls2XYSR013GCj20hhGPSxcXhaKo5xT iAeynzy X-Received: by 2002:a05:6a00:950c:b0:829:6f28:1d6 with SMTP id d2e1a72fcca58-829f6e7b408mr1826676b3a.13.1773222610050; Wed, 11 Mar 2026 02:50:10 -0700 (PDT) Received: from wenstp920.tpe.corp.google.com ([2a00:79e0:201d:8:805b:14e9:f783:bcae]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-829f6e22f85sm1887598b3a.27.2026.03.11.02.50.06 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 11 Mar 2026 02:50:09 -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 , David Airlie , 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 v2 4/4] drm/sun4i: Use backend/mixer as dedicated DMA device Date: Wed, 11 Mar 2026 17:49:28 +0800 Message-ID: <20260311094929.3393338-5-wenst@chromium.org> X-Mailer: git-send-email 2.53.0.473.g4a7958ca14-goog In-Reply-To: <20260311094929.3393338-1-wenst@chromium.org> References: <20260311094929.3393338-1-wenst@chromium.org> Precedence: bulk X-Mailing-List: linux-sunxi@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Status: O The sun4i DRM driver deals with DMA constraints in a peculiar way. Instead of using the actual DMA device in various helpers, it justs reconfigures the DMA constraints of the virtual display device using the DMA device's device tree node by calling of_dma_configure(). Turns out of_dma_configure() should only be called from bus code. Lately this also triggers a big warning through of_iommu_configure() and ultimately __iommu_probe_device(): late IOMMU probe at driver bind, something fishy here! Now that the GEM DMA helpers have proper support for allocating and mapping buffers with a dedicated DMA device, switch over to it as the proper solution. The mixer change was tested on a Pine H64 model B. The backend change was only compile tested. Though I don't expect any issues, help testing on an older device would be appreciated. Signed-off-by: Chen-Yu Tsai Acked-by: Jernej Skrabec --- drivers/gpu/drm/sun4i/sun4i_backend.c | 27 +++++++++++++++------------ drivers/gpu/drm/sun4i/sun8i_mixer.c | 27 +++++++++++++++------------ 2 files changed, 30 insertions(+), 24 deletions(-) diff --git a/drivers/gpu/drm/sun4i/sun4i_backend.c b/drivers/gpu/drm/sun4i/sun4i_backend.c index 6391bdc94a5c..a57fb5151def 100644 --- a/drivers/gpu/drm/sun4i/sun4i_backend.c +++ b/drivers/gpu/drm/sun4i/sun4i_backend.c @@ -798,18 +798,21 @@ static int sun4i_backend_bind(struct device *dev, struct device *master, dev_set_drvdata(dev, backend); spin_lock_init(&backend->frontend_lock); - if (of_property_present(dev->of_node, "interconnects")) { - /* - * This assume we have the same DMA constraints for all our the - * devices in our pipeline (all the backends, but also the - * frontends). This sounds bad, but it has always been the case - * for us, and DRM doesn't do per-device allocation either, so - * we would need to fix DRM first... - */ - ret = of_dma_configure(drm->dev, dev->of_node, true); - if (ret) - return ret; - } + /* + * This assume we have the same DMA constraints for all our the + * devices in our pipeline (all the backends, but also the + * frontends). This sounds bad, but it has always been the case + * for us, and DRM doesn't do per-device allocation either, so + * we would need to fix DRM first... + * + * Always use the first bound backend as the DMA device. While + * our device trees always have all backends enabled, some in + * the wild may actually have the first one disabled. If both + * are enabled, the order in which they are bound is guaranteed + * since the driver adds components in order. + */ + if (drm_dev_dma_dev(drm) == drm->dev) + drm_dev_set_dma_dev(drm, dev); backend->engine.node = dev->of_node; backend->engine.ops = &sun4i_backend_engine_ops; diff --git a/drivers/gpu/drm/sun4i/sun8i_mixer.c b/drivers/gpu/drm/sun4i/sun8i_mixer.c index 02acc7cbdb97..4071ab38b4ae 100644 --- a/drivers/gpu/drm/sun4i/sun8i_mixer.c +++ b/drivers/gpu/drm/sun4i/sun8i_mixer.c @@ -536,18 +536,21 @@ static int sun8i_mixer_bind(struct device *dev, struct device *master, mixer->engine.ops = &sun8i_engine_ops; mixer->engine.node = dev->of_node; - if (of_property_present(dev->of_node, "iommus")) { - /* - * This assume we have the same DMA constraints for - * all our the mixers in our pipeline. This sounds - * bad, but it has always been the case for us, and - * DRM doesn't do per-device allocation either, so we - * would need to fix DRM first... - */ - ret = of_dma_configure(drm->dev, dev->of_node, true); - if (ret) - return ret; - } + /* + * This assume we have the same DMA constraints for all our the + * devices in our pipeline (all the backends, but also the + * frontends). This sounds bad, but it has always been the case + * for us, and DRM doesn't do per-device allocation either, so + * we would need to fix DRM first... + * + * Always use the first bound backend as the DMA device. While + * our device trees always have all backends enabled, some in + * the wild may actually have the first one disabled. If both + * are enabled, the order in which they are bound is guaranteed + * since the driver adds components in order. + */ + if (drm_dev_dma_dev(drm) == drm->dev) + drm_dev_set_dma_dev(drm, dev); /* * While this function can fail, we shouldn't do anything