From nobody Sun Sep 13 17:26:04 2026 X-Original-To: dev-commits-src-main@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 4hjZv05q14z6sHm8 for ; Sun, 13 Sep 2026 17:26:04 +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 4hjZv05HXrz4qQ0 for ; Sun, 13 Sep 2026 17:26:04 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1789320364; 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=W+DGrRKylNejcenb46Dqcuqb65qFdixAqGBx9kpZP9g2H4zLYrrR/hdAFQbZjJhpv/KMm2 HjlOA4LQ6f64XAzDeoHQd1WEUTfygyhXmEb2MA6jwQV8gNC8vmhF7cVXzHLstCpMloYGeb DsDZj88Hsk3WATjUERLFuzMGK3uEIXNxaQz+RpO8ur9sCVgn1BIh42pkqjTtIQ2T7dRj6z 51S0S7f90U87ZFpEXb+WBGHKKYuGWelLn2KPujoP46CwIZS7vntpOsJvKtWeV5aHIYRH/p IH+EDw45/ZMrrjDAPAVyVTCgg0XWQVAcnapPsNpGiNPdTIkOCzgRMRFFMATyHg== ARC-Seal: i=1; a=rsa-sha256; d=freebsd.org; s=dkim; cv=none; t=1789320364; b=Xpj586n9fa1MY8dKqkcLDrdOr306D9dV6aSrXy74nYkdOT3I2+u9syZviliAMtMzqgZveS RPh9wVQd1tsxH2Avwc+Tr1pHge+92B4EorOboW7y8rK4lUAWV9GN7UGf4/yh+F2NTvJAuE Tm6Pg8vmyw4B+SIysWOz/xLnEpR+aDKNIpVurG6mAQCua4UvO/F3wT1zr/+M9QuML4U+kT 3D9vufgheLMS4WTE7Lbb74sdlHKvu20ToSZlWFsoQXBJQNwDbNmkeIjSjyVRDidsLuYK8F JqBKWkh9q9Jrpr+hdOoiS8GGBtlJGqMK9J5rybC9OyZd9XD+dTdZ7kunjzSn/Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1789320364; 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=JlekXxyzlgqgUU0Qrsh6yoCVcZegaNw4rxaUWZj/ShjipZzVQGWfwJHCJ8ewilgQjJ/3bM 1Zr8bLSTtvgBqWgf+K7GerCgdxowS3phbxMW6F+2oXheRqoOmMYWZ/Z2ofnOk6xshNeYUr hl7/c62wfOug6Q1Ov0rhVL7AWAeVGA6t2NKAT5DNhrsgvxhFrP9Zi/wmzmq8MwE+jQj0ws wwBgBiXPP6Fnbhod9TgRq3yBFCj6HiO4YvXGaETvzFR83LhgkLxdKulUiF1vwofI5uUWXI VLC6jzYKe50JU6qI6MJmyhur1F+ELO5IdDg2wxAPGyurXjKo3kyGukkfcJWOWA== 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 4hjZv04MQlzsXD for ; Sun, 13 Sep 2026 17:26:04 +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 the main branch of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-main List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-main@freebsd.org Sender: owner-dev-commits-src-main@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)