From nobody Wed Dec 17 21:31:44 2025 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 4dWn746Wqwz6LSGF for ; Wed, 17 Dec 2025 21:31:44 +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 "R12" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4dWn7450VQz3D0B for ; Wed, 17 Dec 2025 21:31:44 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1766007104; 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=X1Det4Q581Q85cWNo7TtkG6HqOA+S5ojCzzXbBA+eWQ=; b=N7ZarKcFBJskQ0B7E9RE4hSSmBLWefrPA+SprqxooBX4inaRx8MYc/RZMBQ7LsFmujIe/D boZJq7CjcBSr7zt42a7d0oOIi4PwtadBfiezp5FCTrX+RqvJqc8yCbWAPHF8DHSyzmnXwS kyCiZExRd/IdboOSyc8ibiqRXkXmgcZP+ijsw3L7e04QD1finY84NPfztSGJR2qgFhw2iX uIOxrAU88WBJEjK+HnH5339evjNqFx8N/K5e+DjX7oyRc76gA4Z2SMj4zPLk7VZKtmnxEX RQA9YSomSOAnFV3Az9qIkKDW9BIoc7iwgZpCgCuADw1P/yzsTOb4u+5d7HFisw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1766007104; 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=X1Det4Q581Q85cWNo7TtkG6HqOA+S5ojCzzXbBA+eWQ=; b=xItAgr4yQY5cV6MlcVTf1mtVRuqZvgvJWvcvTLnrKh9beyYlmtFwUtb4f2WppJedNHElos JmPSHb3w6ydC+80o9VfP5qpP3EV0z10cWByVUHYH768KaXQzq0bZ1yQ5dlGeHDHiHOeVmZ 0tX8N1UtEOd3jDmiyya4ngvwdt0Jru9kti/PP7eyW/X4/CB6ibiXlaKtdFxy8S37hYD8bd et52ltEDgVWzZU/ZpNBwk+7zd8cLjZGaQ9ORmmrXAuIYU56m2aDUa3sSJSrJCnRjf9iEjD BEzzpJrtAatXSSqNH8/vMxahu/bMb/pRRli201Et814bttOGz4r/sYaMrJbJCg== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1766007104; a=rsa-sha256; cv=none; b=EMQfC9zXFEaegGsSY3qp9Crc+hsqSGMpEW/m2TGwmdTZ3Rn9IU3vIvHAxuPQFGG/M+6eGW ost02gknPFX3HoET/pxG6b9R2CARSHwbZxlVoy5TKVaL+Mz0TNVj78jiXzOKF52wG5u39d i01YZ7Nq+zC/xgkgiFllbdwjwfdvHmrjMHu6aBnFPyqWrsyeH2fQh3Hj8KdZsQ9nyj5hSW DeTlFsohtQ667jCjuWTwM7LT8iJLU/qogxCub/v3P7eBZTJ9t2TyxmJM/dqdP/isKHqY4N C58EJ55rhh5eTx2oW1kciQAuuXrGd+PLLqyE28mK3an7o+dX0uaVw9LWjnkErw== 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 4dWn744Fqyz18Hv for ; Wed, 17 Dec 2025 21:31:44 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 44b43 by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Wed, 17 Dec 2025 21:31:44 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Vladimir Kondratyev Subject: git: df49fd8efa1a - main - LinuxKPI: Implement vmap_pfn 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 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: df49fd8efa1a885089488458df0e7e88c9649c90 Auto-Submitted: auto-generated Date: Wed, 17 Dec 2025 21:31:44 +0000 Message-Id: <69432140.44b43.40043075@gitrepo.freebsd.org> The branch main has been updated by wulf: URL: https://cgit.FreeBSD.org/src/commit/?id=df49fd8efa1a885089488458df0e7e88c9649c90 commit df49fd8efa1a885089488458df0e7e88c9649c90 Author: Vladimir Kondratyev AuthorDate: 2025-12-17 21:31:11 +0000 Commit: Vladimir Kondratyev CommitDate: 2025-12-17 21:31:11 +0000 LinuxKPI: Implement vmap_pfn Required by i915kms to support recent discrete graphics cards. MFC after: 1 week Reviewed by: kib Differential Revision: https://reviews.freebsd.org/D54225 --- sys/compat/linuxkpi/common/include/linux/vmalloc.h | 3 + sys/compat/linuxkpi/common/src/linux_page.c | 65 ++++++++++++++++++++++ 2 files changed, 68 insertions(+) diff --git a/sys/compat/linuxkpi/common/include/linux/vmalloc.h b/sys/compat/linuxkpi/common/include/linux/vmalloc.h index 00650a2df9b6..a7f77f090755 100644 --- a/sys/compat/linuxkpi/common/include/linux/vmalloc.h +++ b/sys/compat/linuxkpi/common/include/linux/vmalloc.h @@ -35,8 +35,11 @@ #define VM_MAP 0x0000 #define PAGE_KERNEL 0x0000 +#define vmap_pfn(...) linuxkpi_vmap_pfn(__VA_ARGS__) + void *vmap(struct page **pages, unsigned int count, unsigned long flags, int prot); +void *linuxkpi_vmap_pfn(unsigned long *pfns, unsigned int count, int prot); void vunmap(void *addr); #endif /* _LINUXKPI_LINUX_VMALLOC_H_ */ diff --git a/sys/compat/linuxkpi/common/src/linux_page.c b/sys/compat/linuxkpi/common/src/linux_page.c index 57ca1401b912..82f3a2a4639f 100644 --- a/sys/compat/linuxkpi/common/src/linux_page.c +++ b/sys/compat/linuxkpi/common/src/linux_page.c @@ -341,6 +341,16 @@ static struct mtx vmmaplock; int is_vmalloc_addr(const void *addr) { + struct vmmap *vmmap; + + mtx_lock(&vmmaplock); + LIST_FOREACH(vmmap, &vmmaphead[VM_HASH(addr)], vm_next) + if (addr == vmmap->vm_addr) + break; + mtx_unlock(&vmmaplock); + if (vmmap != NULL) + return (1); + return (vtoslab((vm_offset_t)addr & ~UMA_SLAB_MASK) != NULL); } @@ -418,6 +428,61 @@ vmap(struct page **pages, unsigned int count, unsigned long flags, int prot) return ((void *)off); } +#define VMAP_MAX_CHUNK_SIZE (65536U / sizeof(struct vm_page)) /* KMEM_ZMAX */ + +void * +linuxkpi_vmap_pfn(unsigned long *pfns, unsigned int count, int prot) +{ + vm_page_t m, *ma, fma; + vm_offset_t off, coff; + vm_paddr_t pa; + vm_memattr_t attr; + size_t size; + unsigned int i, c, chunk; + + size = ptoa(count); + off = kva_alloc(size); + if (off == 0) + return (NULL); + vmmap_add((void *)off, size); + + chunk = MIN(count, VMAP_MAX_CHUNK_SIZE); + attr = pgprot2cachemode(prot); + ma = malloc(chunk * sizeof(vm_page_t), M_TEMP, M_WAITOK | M_ZERO); + fma = NULL; + c = 0; + coff = off; + for (i = 0; i < count; i++) { + pa = IDX_TO_OFF(pfns[i]); + m = PHYS_TO_VM_PAGE(pa); + if (m == NULL) { + if (fma == NULL) + fma = malloc(chunk * sizeof(struct vm_page), + M_TEMP, M_WAITOK | M_ZERO); + m = fma + c; + vm_page_initfake(m, pa, attr); + } else { + pmap_page_set_memattr(m, attr); + } + ma[c] = m; + c++; + if (c == chunk || i == count - 1) { + pmap_qenter(coff, ma, c); + if (i == count - 1) + break; + coff += ptoa(c); + c = 0; + memset(ma, 0, chunk * sizeof(vm_page_t)); + if (fma != NULL) + memset(fma, 0, chunk * sizeof(struct vm_page)); + } + } + free(fma, M_TEMP); + free(ma, M_TEMP); + + return ((void *)off); +} + void vunmap(void *addr) {