The branch main has been updated by andrew:

URL: 
https://cgit.FreeBSD.org/src/commit/?id=aa9ebe1560114f06dbd9c4c5a9b72b056ee13c94

commit aa9ebe1560114f06dbd9c4c5a9b72b056ee13c94
Author:     Andrew Turner <and...@freebsd.org>
AuthorDate: 2025-04-08 10:30:39 +0000
Commit:     Andrew Turner <and...@freebsd.org>
CommitDate: 2025-04-08 10:48:28 +0000

    arm/mv: Convert to fdt_foreach_mem_region
    
    The Marvell platform code checks each DDR bank is in the FDT. This was
    using fdt_get_mem_regions. In preperation for removing this switch to
    fdt_foreach_mem_region.
    
    Reviewed by:    imp
    Sponsored by:   Arm Ltd
    Differential Revision:  https://reviews.freebsd.org/D49701
---
 sys/arm/mv/mv_common.c | 52 ++++++++++++++++++++++++++++----------------------
 1 file changed, 29 insertions(+), 23 deletions(-)

diff --git a/sys/arm/mv/mv_common.c b/sys/arm/mv/mv_common.c
index a1302859644a..c4af5564ca13 100644
--- a/sys/arm/mv/mv_common.c
+++ b/sys/arm/mv/mv_common.c
@@ -984,40 +984,46 @@ decode_win_cpu_setup(void)
 
 }
 
+struct ddr_data {
+       uint8_t window_valid[MV_WIN_DDR_MAX];
+       uint32_t mr_count;
+       uint32_t valid_win_num;
+};
+
+static void
+ddr_valid_cb(const struct mem_region *mr, void *arg)
+{
+       struct ddr_data *data = arg;
+       int j;
+
+       for (j = 0; j < MV_WIN_DDR_MAX; j++) {
+               if (ddr_is_active(j) &&
+                   (ddr_base(j) == mr->mr_start) &&
+                   (ddr_size(j) == mr->mr_size)) {
+                       data->window_valid[j] = 1;
+                       data->valid_win_num++;
+               }
+       }
+       data->mr_count++;
+}
+
 static int
 decode_win_sdram_fixup(void)
 {
-       struct mem_region mr[FDT_MEM_REGIONS];
-       uint8_t window_valid[MV_WIN_DDR_MAX];
-       int mr_cnt, err, i, j;
-       uint32_t valid_win_num = 0;
+       struct ddr_data window_data;
+       int err, j;
 
-       /* Grab physical memory regions information from device tree. */
-       err = fdt_get_mem_regions(mr, &mr_cnt, NULL);
+       memset(&window_data, 0, sizeof(window_data));
+       err = fdt_foreach_mem_region(ddr_valid_cb, &window_data);
        if (err != 0)
                return (err);
 
-       for (i = 0; i < MV_WIN_DDR_MAX; i++)
-               window_valid[i] = 0;
-
-       /* Try to match entries from device tree with settings from u-boot */
-       for (i = 0; i < mr_cnt; i++) {
-               for (j = 0; j < MV_WIN_DDR_MAX; j++) {
-                       if (ddr_is_active(j) &&
-                           (ddr_base(j) == mr[i].mr_start) &&
-                           (ddr_size(j) == mr[i].mr_size)) {
-                               window_valid[j] = 1;
-                               valid_win_num++;
-                       }
-               }
-       }
-
-       if (mr_cnt != valid_win_num)
+       if (window_data.mr_count != window_data.valid_win_num)
                return (EINVAL);
 
        /* Destroy windows without corresponding device tree entry */
        for (j = 0; j < MV_WIN_DDR_MAX; j++) {
-               if (ddr_is_active(j) && (window_valid[j] != 1)) {
+               if (ddr_is_active(j) && (window_data.window_valid[j] != 1)) {
                        printf("Disabling SDRAM decoding window: %d\n", j);
                        ddr_disable(j);
                }

Reply via email to