From nobody Fri Oct 23 06:20:32 2026 X-Original-To: dev-commits-src-branches@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 4j9tDd4m26z6wKdl for ; Fri, 23 Oct 2026 06:20:33 +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) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id 4j9tDd0zwdz3QVC for ; Fri, 23 Oct 2026 06:20:33 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1792736433; 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=nAOLWh/9cLUXGeCrcfaP1Ra3MzG+CB6XKXgN6uM/HR4=; b=bKzk0hBQqAcxGVNQ1kxrya7wOHQcUh3DmqGD8ENI5vVfT9JAUoekrpJ4z9igZensRc6Cvf wRevby1g37yXVCMYh5JRbWgltpsFz8DPasFgAG8j8H3yldZf8PGgt5BZJKlzPKjy0hFfHN 5aQJe0gEwDPhTMlmmeYmyLZuJDddYfQqPCBiaEDbzpx/HW9BHtc5u7w02LDk0c3eOOQ2tk oroC4iSR55GcamOjVNKngl9QYSchg7I9lFXP3+K9dKs+twB5911RLL+OZ01R+TfZMp2v00 ey35TayTRrQuM55Rlx7N2KAs9yQ1yR/08sqJttlQoRVXbHxuri9gP5Z4umfSHw== ARC-Seal: i=1; a=rsa-sha256; d=freebsd.org; s=dkim; cv=none; t=1792736433; b=R2PK6CZkGepooyrh7eFgWS3fDb7o6gnXFSGnuUio25L2BEvZoKtl/OjXXVqXlnK0wHt4Yp /H6SE3GziQ5wRN3dC3HuCFi2q4xHAKOy1Yl0E68x0S6KPNT5qwGm5iJM25H9RDUs4RZjiz JUuIvlGKba1UWg18x7W5+FzoJFo+NbMutY8aLLo+bwQ3XhJ0OzceJwy/uCTGCHwe/lU1my D+g0zb1p1IWFNaWCIxrN09DP9jjeb035Cqtp3FIhHavnti132AWEHGneJU6dUfMY/Y2CUU oEenE/jr+dKGfkYW8JcB26492SBzn6mz7e/x28o1Ft3yNVFYZT1Mv+2I76Tsug== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1792736433; 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=nAOLWh/9cLUXGeCrcfaP1Ra3MzG+CB6XKXgN6uM/HR4=; b=Wtp+xAlOsWvOTT2fHpqaVlPi4uFfQL63LaN5vaKsAy5RXgfhuD9pKGHRPMEX5Aim3MLtU+ GW6z/3+CI4mxcb/GaXmChKdpX66g/rHw3MSFOuy82ysw/1+Xt4GuRZqEQPs/4qpzqWD9kw kUEQ3nNIoFvRoU6dcttLaznQOzBFfBol7p+BtonxaK6MFFtgtvjpFE+qobeGxtyQAGsduv IE9EXzMsbbrQ8Q7INjoIFm9ESo0PN+Pr0XR6v2eWQvUEDS7ZrjfYu7j2rklA4tozCWOoGZ Tu6x8e5E7NlfT91GorzIlxZncS7BchENq2RvrucOVGZ5pa4ElzuMRClXsNUXvA== 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 4j9tDc69dvzGg1 for ; Fri, 23 Oct 2026 06:20:32 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 18e90 by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Fri, 23 Oct 2026 06:20:32 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: Vladimir Kondratyev Subject: git: 69a263ee22c1 - stable/15 - LinuxKPI: Add dma_length field to struct scatterlist List-Archive: https://lists.freebsd.org/archives/dev-commits-src-branches X-BeenThere: dev-commits-src-branches@freebsd.org Sender: owner-dev-commits-src-branches@FreeBSD.org List-Id: Commits to the stable branches of the FreeBSD src repository 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/stable/15 X-Git-Reftype: branch X-Git-Commit: 69a263ee22c19a48584b349f4938941fa93cabfb Auto-Submitted: auto-generated Date: Fri, 23 Oct 2026 06:20:32 +0000 Message-Id: <6adafcb0.18e90.16feb7e7@gitrepo.freebsd.org> The branch stable/15 has been updated by wulf: URL: https://cgit.FreeBSD.org/src/commit/?id=69a263ee22c19a48584b349f4938941fa93cabfb commit 69a263ee22c19a48584b349f4938941fa93cabfb Author: Vladimir Kondratyev AuthorDate: 2026-09-13 17:25:12 +0000 Commit: Vladimir Kondratyev CommitDate: 2026-10-23 06:16:17 +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 (cherry picked from commit a6b40d746b4b727b308f2437b41f8032b921a8e5) --- .../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 1941e4a896e8..f7bf1c1ffd3f 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 e75e5ba8086f..cd0db00a54c5 100644 --- a/sys/compat/linuxkpi/common/src/linux_pci.c +++ b/sys/compat/linuxkpi/common/src/linux_pci.c @@ -2105,6 +2105,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)