From nobody Sun Sep 13 17:26:04 2026 X-Original-To: dev-commits-src-all@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4hjZv63CvXz6sJB8 for ; Sun, 13 Sep 2026 17:26:10 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange x25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "YR2" (not verified)) by mx1.freebsd.org (Postfix) with ESMTPS id 4hjZv61DQwz4qqD for ; Sun, 13 Sep 2026 17:26:10 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1789320370; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=wPup4oge5VIPXb1pL0Zuu/rigGj4IkivqVlOHZ3/iiM=; b=tzZnI2dq5Gjsxx17CFDHf3g513ZzIF3/za8I56C5Kxh+74qfOYcOS0oWsP1m6eJ8DW16Kd /vodbAhtRcELjkd9N515YjmfD3sgJrAuR+sV9zXMQFo/8+E1o7AsebUEvQcziLHZ3NpoyR iy6XzOZPI2LIjmakrfTlisKsrEUGmbPhe7ECKQonuIEuiGVNqijLpBg66D/hjdLc5N0SxJ N8+p+46A+l3xZKOEbwMB+LvXdunK/MJag7LBuFU4DZoCXYPpHE3SNU25iWl8M8WkmXekaj e6r0QO4+3ckaP4pOHt7ue4A7mXIczAxY8CbCWWUn+DUo7LmOvdhvy/ZNpekMnA== ARC-Seal: i=1; a=rsa-sha256; d=freebsd.org; s=dkim; cv=none; t=1789320370; b=maubkL7oubi/8H50q2bPkCGOWiEEa7akBhmyOuG+k9r8EZqQ0elIRh+FICh1niBRwbMLVk NSNvdArbK+wmvs3NugORWhTk5gPY60DXt2io1JQs0FyCxu2w2upQb5TovSatEMVlzFNFSx NW1EQrglSWOxXMKKYaGRHlK+tc8op0/AEQG1LzIMhdzkLbWC7bi8KLHSKXylSUNAeTl2nD YV/Wjxu/1iKPqEnmwBNVtnfi50zaNTFOqBSok6zWNePSXj/q72aUo2ny2Wi754dkg5fGjp vb+e1wM/SqD65YVfakPELLhINeGjd46bpTkiaG/IWkYm2OZVmIS0bWEiD9AZew== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1789320370; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=wPup4oge5VIPXb1pL0Zuu/rigGj4IkivqVlOHZ3/iiM=; b=QhFl/3UT/toz+Bp7p5X+N9r1tt9VLmcqaYZlGEJPgWMY5YF+ZN/CAQ7u9koUSiAG4Vnyhf V2GZnRHfkXKeYlXMnEvTj9wAnpWu6Xyp1GDH0Op/Qjf/y+GhqFBzzw+44reYlHbpEOLS+p 5oIqe0ze5sJyYN1JvR3RXyjIcnlHbcND9MsCFKEeY3WgHiQlL7l3Vl1EYC2mXhNeKfEYQp DO8Eyevf5QLBYxoYEmDBD4fSqne66ocGMY9AS9UuzbnpQhgxGJeut1K/wu8XT8GY4erKej XQUsE3y0TZDh4hnEPBe8OR6cLd8dQIi1t+NxziZorgBWadpvzevLY669TTq9Hw== ARC-Authentication-Results: i=1; mx1.freebsd.org; none Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4hjZv56sgczrxL for ; Sun, 13 Sep 2026 17:26:09 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 4418d by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Sun, 13 Sep 2026 17:26:04 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Vladimir Kondratyev Subject: git: a6b40d746b4b - main - LinuxKPI: Add dma_length field to struct scatterlist List-Id: Commit messages for all branches of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-all@freebsd.org Sender: owner-dev-commits-src-all@FreeBSD.org List-Id: List-Post: List-Help: List-Subscribe: List-Unsubscribe: List-Owner: Precedence: list MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: wulf X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: a6b40d746b4b727b308f2437b41f8032b921a8e5 Auto-Submitted: auto-generated Date: Sun, 13 Sep 2026 17:26:04 +0000 Message-Id: <6aa6dcac.4418d.29183c14@gitrepo.freebsd.org> The branch main has been updated by wulf: URL: https://cgit.FreeBSD.org/src/commit/?id=a6b40d746b4b727b308f2437b41f8032b921a8e5 commit a6b40d746b4b727b308f2437b41f8032b921a8e5 Author: Vladimir Kondratyev AuthorDate: 2026-09-13 17:25:12 +0000 Commit: Vladimir Kondratyev CommitDate: 2026-09-13 17:25:12 +0000 LinuxKPI: Add dma_length field to struct scatterlist On Linux `dma_length` field of `struct scatterlist` is present on the arches where DMA mapping code is able to coalesce adjacent segments of physical address space. It contains total length of coalesced segments while `length` field contains non-coalesced length of each segment. On other arches `dma_length` is aliased to `length` field with `sg_dma_len` macro. As FreeBSD does not merge scatterlist segments it do not have `dma_length` field. It is appered that at least i915kms driver depends on existence of `dma_length` field. Add the field and disable it by default. To enable add to Makefile .if ${MACHINE_CPUARCH} == "i386" || ${MACHINE_CPUARCH} == "amd64" || \\ ${MACHINE_CPUARCH} == "aarch64" || ${MACHINE_CPUARCH} == "powerpc" CFLAGS+= -DCONFIG_NEED_SG_DMA_LENGTH .endif Reported by: Ryan Fahy Reviewed by: bz MFC after: 1 month GHI: https://github.com/freebsd/drm-kmod/issues/315 Differential Revision: https://reviews.freebsd.org/D59630 --- .../linuxkpi/common/include/linux/scatterlist.h | 26 ++++++++++++++-------- sys/compat/linuxkpi/common/src/linux_pci.c | 1 + 2 files changed, 18 insertions(+), 9 deletions(-) diff --git a/sys/compat/linuxkpi/common/include/linux/scatterlist.h b/sys/compat/linuxkpi/common/include/linux/scatterlist.h index dd8ea31d4872..9dcf50b5e45b 100644 --- a/sys/compat/linuxkpi/common/include/linux/scatterlist.h +++ b/sys/compat/linuxkpi/common/include/linux/scatterlist.h @@ -50,6 +50,7 @@ struct scatterlist { unsigned int offset; unsigned int length; dma_addr_t dma_address; + unsigned int dma_length; struct bus_dmamap *dma_map; /* FreeBSD specific */ }; @@ -89,13 +90,18 @@ struct sg_dma_page_iter { ((struct scatterlist *) ((sg)->page_link & ~SG_PAGE_LINK_MASK)) #define sg_dma_address(sg) (sg)->dma_address +#ifdef CONFIG_NEED_SG_DMA_LENGTH +#define sg_dma_len(sg) (sg)->dma_length +#else #define sg_dma_len(sg) (sg)->length +#endif #define for_each_sg_page(sgl, iter, nents, pgoffset) \ - for (_sg_iter_init(sgl, iter, nents, pgoffset); \ - (iter)->sg; _sg_iter_next(iter)) + for (_sg_iter_init(sgl, iter, nents, pgoffset, false); \ + (iter)->sg; _sg_iter_next(iter, false)) #define for_each_sg_dma_page(sgl, iter, nents, pgoffset) \ - for_each_sg_page(sgl, &(iter)->base, nents, pgoffset) + for (_sg_iter_init(sgl, &(iter)->base, nents, pgoffset, true); \ + (iter)->base.sg; _sg_iter_next(&(iter)->base, true)) #define for_each_sg(sglist, sg, sgmax, iter) \ for (iter = 0, sg = (sglist); iter < (sgmax); iter++, sg = sg_next(sg)) @@ -477,13 +483,14 @@ __sg_page_iter_start(struct sg_page_iter *piter, } static inline void -_sg_iter_next(struct sg_page_iter *iter) +_sg_iter_next(struct sg_page_iter *iter, bool is_dma) { struct scatterlist *sg; - unsigned int pgcount; + unsigned int pgcount, sglength; sg = iter->sg; - pgcount = (sg->offset + sg->length + PAGE_SIZE - 1) >> PAGE_SHIFT; + sglength = is_dma ? sg_dma_len(sg) : sg->length; + pgcount = (sg->offset + sglength + PAGE_SIZE - 1) >> PAGE_SHIFT; ++iter->sg_pgoffset; while (iter->sg_pgoffset >= pgcount) { @@ -492,7 +499,8 @@ _sg_iter_next(struct sg_page_iter *iter) --iter->maxents; if (sg == NULL || iter->maxents == 0) break; - pgcount = (sg->offset + sg->length + PAGE_SIZE - 1) >> PAGE_SHIFT; + sglength = is_dma ? sg_dma_len(sg) : sg->length; + pgcount = (sg->offset + sglength + PAGE_SIZE - 1) >> PAGE_SHIFT; } iter->sg = sg; } @@ -536,13 +544,13 @@ __sg_page_iter_next(struct sg_page_iter *piter) static inline void _sg_iter_init(struct scatterlist *sgl, struct sg_page_iter *iter, - unsigned int nents, unsigned long pgoffset) + unsigned int nents, unsigned long pgoffset, bool is_dma) { if (nents) { iter->sg = sgl; iter->sg_pgoffset = pgoffset - 1; iter->maxents = nents; - _sg_iter_next(iter); + _sg_iter_next(iter, is_dma); } else { iter->sg = NULL; iter->sg_pgoffset = 0; diff --git a/sys/compat/linuxkpi/common/src/linux_pci.c b/sys/compat/linuxkpi/common/src/linux_pci.c index c1ab63b6c902..c912dc80961a 100644 --- a/sys/compat/linuxkpi/common/src/linux_pci.c +++ b/sys/compat/linuxkpi/common/src/linux_pci.c @@ -2084,6 +2084,7 @@ linux_dma_map_sg_attrs(struct device *dev, struct scatterlist *sgl, int nents, ("More than one segment (nseg=%d)", nseg + 1)); sg_dma_address(sg) = seg.ds_addr; + sg->dma_length = sg->length; } if ((attrs & DMA_ATTR_SKIP_CPU_SYNC) != 0)