From nobody Tue Apr 08 10:49:08 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 4ZX2rP1zTNz5sCB8; Tue, 08 Apr 2025 10:49:09 +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 "R10" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4ZX2rN2zQ3z3kH9; Tue, 08 Apr 2025 10:49:08 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1744109348; 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=MhMbgLrvcfgJfZb36ugAIOz5ISa9JFt0tuIzAx2bN+E=; b=LPCUiKDM6ZGvM880XFlp3+3J8fLeEw3fFBYLBWvPjH5TdNvhczQbo45MuMnHoYsC9m4yHF nc546paKVh330WWylDN4Vt1AjERs/4ihMQwJhycd9snxcL3mGqo9MwUobofqJntgv25Pcg JlerdfZF+KY70iorsPda1VLKTO334e2ZjbI4S128LKwo75uPZu0eHKKLbrr9Jpt+NLSei+ VqQNeu48/pUVt8piIUDbJ4lCdORH8ADXxrJz9MaBb2piHi1cHF6/XEHiOXG2e/kvP3OkoA w1Pd0W1R4+vx2s/+GPOTfYlxRk5y8kYi1VKq6BMUgZ5DmQdc0scSqwBUbWyajg== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1744109348; a=rsa-sha256; cv=none; b=BiFxF9fUDQBZWzneAzAOpyUz2fDtvC5HwSeloP6Eb0+ttAxh1xPUrCsI4GcgdqOApvFHMd sXR3vxJ0FkETb3sncJMDfreADU+Nf9Y+FlF8i+dECNIQEbMLUlYtc8hqf86OdG7MgfaaIe vDZZ/oRXDv8d19dG26fzBU8yXF/aJg/ix3B6Rt+pq345pPNXxmmlCB0bfzenMa9OcZAtf7 Lnj2iZZyKT5gFxeRp67mUqjVTgM9HqhbIWluOpKWVJMfMgcXwOEeezeWSd+6BDNyVGtk/o 8IlA+UfpzgJFrqi3P9rvWTQAF+epZs1nFU5mIu4birmOm8/2zMT8xIIL4PKIzg== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1744109348; 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=MhMbgLrvcfgJfZb36ugAIOz5ISa9JFt0tuIzAx2bN+E=; b=x/Lkp5jY51LDC48tBofjoARPuHKuk5muzgnfqMFpintzZpCCSoHstceyag2KMAn57yiqpX 1B0RHFPrBVK80Egq3iO76a1YwnDd6cMkXbadTXj3Gu3SlSBZ9DaQ9Tl6sLCZNTPJ/VUsMo pPnbwXs8bM0MiuN/MEfjGz/nsNOtUrvYo/RWvj9sOJEmUqBk8p8RV6MSxa/J76a8wrwEh2 D6ve/yiQmLp3jEX1zOPi5ZX99jf9SigDSfRZn7/zkgz/RvJgHHjricGNxsmcXE34QUsdP9 ptd7MkvZJ1Tqh7QkIPY9VaPaAz6Xd07S8dOQ4KxQnCvMztR6CpalcEl7sd2cTQ== 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 4ZX2rN0nBlzCdK; Tue, 08 Apr 2025 10:49:08 +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 538An8I9001953; Tue, 8 Apr 2025 10:49:08 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.18.1/8.18.1/Submit) id 538An8OU001950; Tue, 8 Apr 2025 10:49:08 GMT (envelope-from git) Date: Tue, 8 Apr 2025 10:49:08 GMT Message-Id: <202504081049.538An8OU001950@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: 0593e4110639 - main - dev/fdt: Add fdt_foreach_mem_region 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: 0593e4110639d1a84bd7fd785f056998fe8df7e8 Auto-Submitted: auto-generated The branch main has been updated by andrew: URL: https://cgit.FreeBSD.org/src/commit/?id=0593e4110639d1a84bd7fd785f056998fe8df7e8 commit 0593e4110639d1a84bd7fd785f056998fe8df7e8 Author: Andrew Turner AuthorDate: 2025-04-08 10:30:09 +0000 Commit: Andrew Turner CommitDate: 2025-04-08 10:48:27 +0000 dev/fdt: Add fdt_foreach_mem_region This is used early in the boot to find physical memory. Previously it needed an array of memory regions to be passed in. We keep finding hardware where this array is too small causing the kernel to smash the stack. Replace with a function that takes a callback that can insert the memory into the physical map directly. Reviewed by: imp Sponsored by: Arm Ltd Differential Revision: https://reviews.freebsd.org/D49697 --- sys/dev/fdt/fdt_common.c | 47 +++++++++++++++++++++++++++++++++++++++++++++++ sys/dev/fdt/fdt_common.h | 3 +++ 2 files changed, 50 insertions(+) diff --git a/sys/dev/fdt/fdt_common.c b/sys/dev/fdt/fdt_common.c index 85d9061759c4..6c505ac2cd7c 100644 --- a/sys/dev/fdt/fdt_common.c +++ b/sys/dev/fdt/fdt_common.c @@ -540,6 +540,53 @@ fdt_get_reserved_mem(struct mem_region *reserved, int *mreserved) return (0); } +int +fdt_foreach_mem_region(fdt_mem_region_cb cb, void *arg) +{ + struct mem_region mr; + pcell_t reg[FDT_REG_CELLS * FDT_MEM_REGIONS]; + pcell_t *regp; + phandle_t memory; + int addr_cells, size_cells; + int i, reg_len, rv, tuple_size, tuples; + + memory = OF_finddevice("/memory"); + if (memory == -1) + return (ENXIO); + + if ((rv = fdt_addrsize_cells(OF_parent(memory), &addr_cells, + &size_cells)) != 0) + return (rv); + + if (addr_cells > 2) + return (ERANGE); + + tuple_size = sizeof(pcell_t) * (addr_cells + size_cells); + reg_len = OF_getproplen(memory, "reg"); + if (reg_len <= 0 || reg_len > sizeof(reg)) + return (ERANGE); + + if (OF_getprop(memory, "reg", reg, reg_len) <= 0) + return (ENXIO); + + tuples = reg_len / tuple_size; + regp = (pcell_t *)® + for (i = 0; i < tuples; i++) { + + rv = fdt_data_to_res(regp, addr_cells, size_cells, + (u_long *)&mr.mr_start, (u_long *)&mr.mr_size); + + if (rv != 0) + return (rv); + + cb(&mr, arg); + + regp += addr_cells + size_cells; + } + + return (0); +} + int fdt_get_mem_regions(struct mem_region *mr, int *mrcnt, uint64_t *memsize) { diff --git a/sys/dev/fdt/fdt_common.h b/sys/dev/fdt/fdt_common.h index d19dc5c359a7..f450d976dfe0 100644 --- a/sys/dev/fdt/fdt_common.h +++ b/sys/dev/fdt/fdt_common.h @@ -76,11 +76,14 @@ extern u_char fdt_static_dtb; SYSCTL_DECL(_hw_fdt); +typedef void (*fdt_mem_region_cb)(const struct mem_region *, void *); + int fdt_addrsize_cells(phandle_t, int *, int *); u_long fdt_data_get(void *, int); int fdt_data_to_res(pcell_t *, int, int, u_long *, u_long *); phandle_t fdt_find_compatible(phandle_t, const char *, int); phandle_t fdt_depth_search_compatible(phandle_t, const char *, int); +int fdt_foreach_mem_region(fdt_mem_region_cb, void *); int fdt_get_mem_regions(struct mem_region *, int *, uint64_t *); int fdt_get_reserved_mem(struct mem_region *, int *); int fdt_get_reserved_regions(struct mem_region *, int *);