hc
2024-01-31 f70575805708cabdedea7498aaa3f710fde4d920
kernel/scripts/dtc/libfdt/fdt_addresses.c
....@@ -1,52 +1,8 @@
1
+// SPDX-License-Identifier: (GPL-2.0-or-later OR BSD-2-Clause)
12 /*
23 * libfdt - Flat Device Tree manipulation
34 * Copyright (C) 2014 David Gibson <david@gibson.dropbear.id.au>
4
- *
5
- * libfdt is dual licensed: you can use it either under the terms of
6
- * the GPL, or the BSD license, at your option.
7
- *
8
- * a) This library is free software; you can redistribute it and/or
9
- * modify it under the terms of the GNU General Public License as
10
- * published by the Free Software Foundation; either version 2 of the
11
- * License, or (at your option) any later version.
12
- *
13
- * This library is distributed in the hope that it will be useful,
14
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
15
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16
- * GNU General Public License for more details.
17
- *
18
- * You should have received a copy of the GNU General Public
19
- * License along with this library; if not, write to the Free
20
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
21
- * MA 02110-1301 USA
22
- *
23
- * Alternatively,
24
- *
25
- * b) Redistribution and use in source and binary forms, with or
26
- * without modification, are permitted provided that the following
27
- * conditions are met:
28
- *
29
- * 1. Redistributions of source code must retain the above
30
- * copyright notice, this list of conditions and the following
31
- * disclaimer.
32
- * 2. Redistributions in binary form must reproduce the above
33
- * copyright notice, this list of conditions and the following
34
- * disclaimer in the documentation and/or other materials
35
- * provided with the distribution.
36
- *
37
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
38
- * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
39
- * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
40
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
41
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
42
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
43
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
44
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
45
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
46
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
47
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
48
- * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
49
- * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
5
+ * Copyright (C) 2018 embedded brains GmbH
506 */
517 #include "libfdt_env.h"
528
....@@ -55,42 +11,91 @@
5511
5612 #include "libfdt_internal.h"
5713
58
-int fdt_address_cells(const void *fdt, int nodeoffset)
14
+static int fdt_cells(const void *fdt, int nodeoffset, const char *name)
5915 {
60
- const fdt32_t *ac;
61
- int val;
16
+ const fdt32_t *c;
17
+ uint32_t val;
6218 int len;
6319
64
- ac = fdt_getprop(fdt, nodeoffset, "#address-cells", &len);
65
- if (!ac)
20
+ c = fdt_getprop(fdt, nodeoffset, name, &len);
21
+ if (!c)
22
+ return len;
23
+
24
+ if (len != sizeof(*c))
25
+ return -FDT_ERR_BADNCELLS;
26
+
27
+ val = fdt32_to_cpu(*c);
28
+ if (val > FDT_MAX_NCELLS)
29
+ return -FDT_ERR_BADNCELLS;
30
+
31
+ return (int)val;
32
+}
33
+
34
+int fdt_address_cells(const void *fdt, int nodeoffset)
35
+{
36
+ int val;
37
+
38
+ val = fdt_cells(fdt, nodeoffset, "#address-cells");
39
+ if (val == 0)
40
+ return -FDT_ERR_BADNCELLS;
41
+ if (val == -FDT_ERR_NOTFOUND)
6642 return 2;
67
-
68
- if (len != sizeof(*ac))
69
- return -FDT_ERR_BADNCELLS;
70
-
71
- val = fdt32_to_cpu(*ac);
72
- if ((val <= 0) || (val > FDT_MAX_NCELLS))
73
- return -FDT_ERR_BADNCELLS;
74
-
7543 return val;
7644 }
7745
7846 int fdt_size_cells(const void *fdt, int nodeoffset)
7947 {
80
- const fdt32_t *sc;
8148 int val;
82
- int len;
8349
84
- sc = fdt_getprop(fdt, nodeoffset, "#size-cells", &len);
85
- if (!sc)
86
- return 2;
87
-
88
- if (len != sizeof(*sc))
89
- return -FDT_ERR_BADNCELLS;
90
-
91
- val = fdt32_to_cpu(*sc);
92
- if ((val < 0) || (val > FDT_MAX_NCELLS))
93
- return -FDT_ERR_BADNCELLS;
94
-
50
+ val = fdt_cells(fdt, nodeoffset, "#size-cells");
51
+ if (val == -FDT_ERR_NOTFOUND)
52
+ return 1;
9553 return val;
9654 }
55
+
56
+/* This function assumes that [address|size]_cells is 1 or 2 */
57
+int fdt_appendprop_addrrange(void *fdt, int parent, int nodeoffset,
58
+ const char *name, uint64_t addr, uint64_t size)
59
+{
60
+ int addr_cells, size_cells, ret;
61
+ uint8_t data[sizeof(fdt64_t) * 2], *prop;
62
+
63
+ ret = fdt_address_cells(fdt, parent);
64
+ if (ret < 0)
65
+ return ret;
66
+ addr_cells = ret;
67
+
68
+ ret = fdt_size_cells(fdt, parent);
69
+ if (ret < 0)
70
+ return ret;
71
+ size_cells = ret;
72
+
73
+ /* check validity of address */
74
+ prop = data;
75
+ if (addr_cells == 1) {
76
+ if ((addr > UINT32_MAX) || ((UINT32_MAX + 1 - addr) < size))
77
+ return -FDT_ERR_BADVALUE;
78
+
79
+ fdt32_st(prop, (uint32_t)addr);
80
+ } else if (addr_cells == 2) {
81
+ fdt64_st(prop, addr);
82
+ } else {
83
+ return -FDT_ERR_BADNCELLS;
84
+ }
85
+
86
+ /* check validity of size */
87
+ prop += addr_cells * sizeof(fdt32_t);
88
+ if (size_cells == 1) {
89
+ if (size > UINT32_MAX)
90
+ return -FDT_ERR_BADVALUE;
91
+
92
+ fdt32_st(prop, (uint32_t)size);
93
+ } else if (size_cells == 2) {
94
+ fdt64_st(prop, size);
95
+ } else {
96
+ return -FDT_ERR_BADNCELLS;
97
+ }
98
+
99
+ return fdt_appendprop(fdt, nodeoffset, name, data,
100
+ (addr_cells + size_cells) * sizeof(fdt32_t));
101
+}