hc
2024-12-19 9370bb92b2d16684ee45cf24e879c93c509162da
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
/*
 * Copyright (C) 2016 Socionext Inc.
 *   Author: Masahiro Yamada <yamada.masahiro@socionext.com>
 *
 * SPDX-License-Identifier:    GPL-2.0+
 */
 
#include <common.h>
#include <linux/libfdt.h>
#include <asm/spin_table.h>
 
int spin_table_update_dt(void *fdt)
{
   int cpus_offset, offset;
   const char *prop;
   int ret;
   unsigned long rsv_addr = (unsigned long)&spin_table_reserve_begin;
   unsigned long rsv_size = &spin_table_reserve_end -
                       &spin_table_reserve_begin;
 
   cpus_offset = fdt_path_offset(fdt, "/cpus");
   if (cpus_offset < 0)
       return -ENODEV;
 
   for (offset = fdt_first_subnode(fdt, cpus_offset);
        offset >= 0;
        offset = fdt_next_subnode(fdt, offset)) {
       prop = fdt_getprop(fdt, offset, "device_type", NULL);
       if (!prop || strcmp(prop, "cpu"))
           continue;
 
       /*
        * In the first loop, we check if every CPU node specifies
        * spin-table.  Otherwise, just return successfully to not
        * disturb other methods, like psci.
        */
       prop = fdt_getprop(fdt, offset, "enable-method", NULL);
       if (!prop || strcmp(prop, "spin-table"))
           return 0;
   }
 
   for (offset = fdt_first_subnode(fdt, cpus_offset);
        offset >= 0;
        offset = fdt_next_subnode(fdt, offset)) {
       prop = fdt_getprop(fdt, offset, "device_type", NULL);
       if (!prop || strcmp(prop, "cpu"))
           continue;
 
       ret = fdt_setprop_u64(fdt, offset, "cpu-release-addr",
               (unsigned long)&spin_table_cpu_release_addr);
       if (ret)
           return -ENOSPC;
   }
 
   ret = fdt_add_mem_rsv(fdt, rsv_addr, rsv_size);
   if (ret)
       return -ENOSPC;
 
   printf("   Reserved memory region for spin-table: addr=%lx size=%lx\n",
          rsv_addr, rsv_size);
 
   return 0;
}