From nobody Fri May 2 15:45:07 2025 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 4ZpwGq5DCVz5tdJM; Fri, 02 May 2025 15:45:07 +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 "R11" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4ZpwGq3Jkxz3lWL; Fri, 02 May 2025 15:45:07 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1746200707; 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=Ht2U5QFx0jcotrp4CYk1/b0Yjxzi//4v1hsrIs44c3c=; b=Ry6LzcZ5ptNTytmOrHIrKohjJ2nm0zIz3mMof8c5H8IuIbtCAxCjbK1Z7IR8a9pY6uNX8y pBjM3nB6w+riiHLe1pIPa6e/UvVHYhh1iNHGp12mtiumOdbB9QaVjfcBYE6X5NXflNCIgM GzEPmlyq5+AkpCUzMWOyCcCizKJCzrZapyQqq9ZHOjrGcrly4I0CRcfk3TlxbfXmxefbq4 Ubd8u2SuZdev7v/ErRqg6/lyhqtt4qwjfE6Q1aba+Wqs92vxuvH40llyIiOo0U475LAfNV hnenEO0/ZJdrqZalLNMydVbmiTdW7ivFwQPfwCeemZKv/MYz4RoWTTDisg6zxA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1746200707; 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=Ht2U5QFx0jcotrp4CYk1/b0Yjxzi//4v1hsrIs44c3c=; b=Kt0NPltw2jKJ9hCFtK3QKWw9X8cjP985SGTbZEEPMaeYNHxST+uhsBCwB5jAhw+7jKoUpy 5E6u1R3Wmqwq2bK9T3iAUl7gTtLo4GeRjoS0fUSJIrz4lEWpso4WpRRVyxsvP+oLs2oN8Q 8zRKb6xsvSghdG0f+ghQ0j0wl4p8pQU+uIXeFy8LTRrat6bJwCl6MdNjJhDP9EIRoZ2ofT eLKisjCndALynxgjIGT1nGrHvx0L3McRHx319ggU9yn63B0/h2dzrHYDt6o7hXg894Yosp hk9Ol9HE9BD7RSiJgeshIhQFO1UfPhUYvcaoGpWZqDgdXtfpE7SpjQpbHpI87A== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1746200707; a=rsa-sha256; cv=none; b=My5/bQRTDx8CG0BOVfv5ewbedyzPq2ADnFjv7/CUMOt+5Pum/GaW1hZ33NfLXp53viis4U vNn+MB9K8+2+sM98Oz+dtNkuLVZurI2l+Yok2zA/DSER9DO4/i0Uvm5QPxf+HXgMiwqkUq GN0X7V7fKzXiH6oT7mFnvfONg//hfGsYkMuo37g/Lbs3pziuDoeybQC3Wvkaxud1ttM3lX fTvc4M16J0tyc+ZNZR6uleasLdjl1AXOxtPYAqJ8yVzBg/+jx3F0hZ0gIRWJYToTUdvQWX HKlO3owOj3xDaxbXFPcNP4uyzt1yjEz/TBo/3Zxe2vTBbpPFc5Hojq9reD0NiA== ARC-Authentication-Results: i=1; mx1.freebsd.org; none Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (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 did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 4ZpwGq2tFGz1J2B; Fri, 02 May 2025 15:45:07 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.18.1/8.18.1) with ESMTP id 542Fj7Bh097728; Fri, 2 May 2025 15:45:07 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.18.1/8.18.1/Submit) id 542Fj7FZ097725; Fri, 2 May 2025 15:45:07 GMT (envelope-from git) Date: Fri, 2 May 2025 15:45:07 GMT Message-Id: <202505021545.542Fj7FZ097725@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Andrew Turner Subject: git: 9ea78ef1d6f9 - main - arm64: Use the DMAP region in pmap_mapbios 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 MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: andrew X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 9ea78ef1d6f9785411963a897668cb2eeedd4107 Auto-Submitted: auto-generated The branch main has been updated by andrew: URL: https://cgit.FreeBSD.org/src/commit/?id=9ea78ef1d6f9785411963a897668cb2eeedd4107 commit 9ea78ef1d6f9785411963a897668cb2eeedd4107 Author: Andrew Turner AuthorDate: 2025-05-02 15:36:35 +0000 Commit: Andrew Turner CommitDate: 2025-05-02 15:39:04 +0000 arm64: Use the DMAP region in pmap_mapbios As pmap_mapbios is used to map a physical address with a default memory attribute we can try to use the DMAP region. For now check if all pages are mapped, however it is expected this check can be removed later after testing on more hardware. Reviewed by: alc, markj, jhb (earlier version) Sponsored by: Arm Ltd Differential Revision: https://reviews.freebsd.org/D42732 --- sys/arm64/arm64/pmap.c | 72 +++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 71 insertions(+), 1 deletion(-) diff --git a/sys/arm64/arm64/pmap.c b/sys/arm64/arm64/pmap.c index f4d6b1cfcb56..625caf6ecd7e 100644 --- a/sys/arm64/arm64/pmap.c +++ b/sys/arm64/arm64/pmap.c @@ -2110,6 +2110,56 @@ pmap_extract_and_hold(pmap_t pmap, vm_offset_t va, vm_prot_t prot) return (m); } +/* + * Returns true if the entire kernel virtual address range is mapped + */ +static bool +pmap_kmapped_range(vm_offset_t sva, vm_size_t size) +{ + pt_entry_t *pte, tpte; + vm_offset_t eva; + + KASSERT(sva >= VM_MIN_KERNEL_ADDRESS, + ("%s: Invalid virtual address: %lx", __func__, sva)); + MPASS(size != 0); + eva = sva + size - 1; + KASSERT(eva > sva, ("%s: Size too large: sva %lx, size %lx", __func__, + sva, size)); + + while (sva <= eva) { + pte = pmap_l1(kernel_pmap, sva); + if (pte == NULL) + return (false); + tpte = pmap_load(pte); + if (tpte == 0) + return (false); + if ((tpte & ATTR_DESCR_TYPE_MASK) == ATTR_DESCR_TYPE_BLOCK) { + sva = (sva & ~L1_OFFSET) + L1_SIZE; + continue; + } + + pte = pmap_l1_to_l2(&tpte, sva); + tpte = pmap_load(pte); + if (tpte == 0) + return (false); + if ((tpte & ATTR_DESCR_TYPE_MASK) == ATTR_DESCR_TYPE_BLOCK) { + sva = (sva & ~L2_OFFSET) + L2_SIZE; + continue; + } + pte = pmap_l2_to_l3(&tpte, sva); + tpte = pmap_load(pte); + if (tpte == 0) + return (false); + MPASS((tpte & ATTR_DESCR_TYPE_MASK) == ATTR_DESCR_TYPE_PAGE); + if ((tpte & ATTR_CONTIGUOUS) == ATTR_CONTIGUOUS) + sva = (sva & ~L3C_OFFSET) + L3C_SIZE; + else + sva = (sva & ~L3_OFFSET) + L3_SIZE; + } + + return (true); +} + /* * Walks the page tables to translate a kernel virtual address to a * physical address. Returns true if the kva is valid and stores the @@ -7786,6 +7836,11 @@ pmap_mapbios(vm_paddr_t pa, vm_size_t size) pt_entry_t *l2; int i, lvl, l2_blocks, free_l2_count, start_idx; + /* Use the DMAP region if we can */ + if (PHYS_IN_DMAP(pa) && PHYS_IN_DMAP(pa + size - 1) && + pmap_kmapped_range(PHYS_TO_DMAP(pa), size)) + return ((void *)PHYS_TO_DMAP(pa)); + if (!vm_initialized) { /* * No L3 ptables so map entire L2 blocks where start VA is: @@ -7901,10 +7956,25 @@ pmap_unmapbios(void *p, vm_size_t size) vm_offset_t offset, va, va_trunc; pd_entry_t *pde; pt_entry_t *l2; - int i, lvl, l2_blocks, block; + int error __diagused, i, lvl, l2_blocks, block; bool preinit_map; va = (vm_offset_t)p; + if (VIRT_IN_DMAP(va)) { + KASSERT(VIRT_IN_DMAP(va + size - 1), + ("%s: End address not in DMAP region: %lx", __func__, + va + size - 1)); + /* Ensure the attributes are as expected for the DMAP region */ + PMAP_LOCK(kernel_pmap); + error = pmap_change_props_locked(va, size, + PROT_READ | PROT_WRITE, VM_MEMATTR_DEFAULT, false); + PMAP_UNLOCK(kernel_pmap); + KASSERT(error == 0, ("%s: Failed to reset DMAP attributes: %d", + __func__, error)); + + return; + } + l2_blocks = (roundup2(va + size, L2_SIZE) - rounddown2(va, L2_SIZE)) >> L2_SHIFT; KASSERT(l2_blocks > 0, ("pmap_unmapbios: invalid size %lx", size));