summaryrefslogtreecommitdiffstats
path: root/sys/dev/fdt/fdt_common.c
diff options
context:
space:
mode:
authorbr <br@FreeBSD.org>2014-12-15 09:40:25 +0000
committerbr <br@FreeBSD.org>2014-12-15 09:40:25 +0000
commitc2a9dff74cabe5cea1379651c0d8dca7a2987d5e (patch)
tree6217af9a4c1c5879cb1221d3fd172c0c01a49d18 /sys/dev/fdt/fdt_common.c
parentf17c2a37296e39521adf498d8047127d4eefe654 (diff)
downloadFreeBSD-src-c2a9dff74cabe5cea1379651c0d8dca7a2987d5e.zip
FreeBSD-src-c2a9dff74cabe5cea1379651c0d8dca7a2987d5e.tar.gz
Eliminate fdt_data_verify(). The verification it proceed is wrong
disallowing us to encode 64-bit register numbers. Discussed with: nwhitehorn, andrew
Diffstat (limited to 'sys/dev/fdt/fdt_common.c')
-rw-r--r--sys/dev/fdt/fdt_common.c70
1 files changed, 6 insertions, 64 deletions
diff --git a/sys/dev/fdt/fdt_common.c b/sys/dev/fdt/fdt_common.c
index 117e7de..d99fdf2 100644
--- a/sys/dev/fdt/fdt_common.c
+++ b/sys/dev/fdt/fdt_common.c
@@ -102,10 +102,9 @@ fdt_get_range_by_busaddr(phandle_t node, u_long addr, u_long *base,
tuple_size = addr_cells + par_addr_cells + size_cells;
tuples = len / (tuple_size * sizeof(cell_t));
- if (fdt_ranges_verify(ranges, tuples, par_addr_cells,
- addr_cells, size_cells)) {
+ if (par_addr_cells > 2 || addr_cells > 2 || size_cells > 2)
return (ERANGE);
- }
+
*base = 0;
*size = 0;
@@ -173,10 +172,9 @@ fdt_get_range(phandle_t node, int range_id, u_long *base, u_long *size)
size_cells);
tuples = len / tuple_size;
- if (fdt_ranges_verify(ranges, tuples, par_addr_cells,
- addr_cells, size_cells)) {
+ if (par_addr_cells > 2 || addr_cells > 2 || size_cells > 2)
return (ERANGE);
- }
+
*base = 0;
*size = 0;
rangesptr = &ranges[range_id];
@@ -381,20 +379,6 @@ fdt_parent_addr_cells(phandle_t node)
}
int
-fdt_data_verify(void *data, int cells)
-{
- uint64_t d64;
-
- if (cells > 1) {
- d64 = fdt64_to_cpu(*((uint64_t *)data));
- if (((d64 >> 32) & 0xffffffffull) != 0 || cells > 2)
- return (ERANGE);
- }
-
- return (0);
-}
-
-int
fdt_pm_is_enabled(phandle_t node)
{
int ret;
@@ -441,61 +425,19 @@ fdt_addrsize_cells(phandle_t node, int *addr_cells, int *size_cells)
}
int
-fdt_ranges_verify(pcell_t *ranges, int tuples, int par_addr_cells,
- int this_addr_cells, int this_size_cells)
-{
- int i, rv, ulsz;
-
- if (par_addr_cells > 2 || this_addr_cells > 2 || this_size_cells > 2)
- return (ERANGE);
-
- /*
- * This is the max size the resource manager can handle for addresses
- * and sizes.
- */
- ulsz = sizeof(u_long);
- if (par_addr_cells <= ulsz && this_addr_cells <= ulsz &&
- this_size_cells <= ulsz)
- /* We can handle everything */
- return (0);
-
- rv = 0;
- for (i = 0; i < tuples; i++) {
-
- if (fdt_data_verify((void *)ranges, par_addr_cells))
- goto err;
- ranges += par_addr_cells;
-
- if (fdt_data_verify((void *)ranges, this_addr_cells))
- goto err;
- ranges += this_addr_cells;
-
- if (fdt_data_verify((void *)ranges, this_size_cells))
- goto err;
- ranges += this_size_cells;
- }
-
- return (0);
-
-err:
- debugf("using address range >%d-bit not supported\n", ulsz * 8);
- return (ERANGE);
-}
-
-int
fdt_data_to_res(pcell_t *data, int addr_cells, int size_cells, u_long *start,
u_long *count)
{
/* Address portion. */
- if (fdt_data_verify((void *)data, addr_cells))
+ if (addr_cells > 2)
return (ERANGE);
*start = fdt_data_get((void *)data, addr_cells);
data += addr_cells;
/* Size portion. */
- if (fdt_data_verify((void *)data, size_cells))
+ if (size_cells > 2)
return (ERANGE);
*count = fdt_data_get((void *)data, size_cells);
OpenPOWER on IntegriCloud