svn commit: r275792 - head/sys/dev/fdt

Ruslan Bukin br at FreeBSD.org
Mon Dec 15 09:40:26 UTC 2014


Author: br
Date: Mon Dec 15 09:40:25 2014
New Revision: 275792
URL: https://svnweb.freebsd.org/changeset/base/275792

Log:
  Eliminate fdt_data_verify(). The verification it proceed is wrong
  disallowing us to encode 64-bit register numbers.
  
  Discussed with:	nwhitehorn, andrew

Modified:
  head/sys/dev/fdt/fdt_common.c
  head/sys/dev/fdt/fdt_common.h

Modified: head/sys/dev/fdt/fdt_common.c
==============================================================================
--- head/sys/dev/fdt/fdt_common.c	Mon Dec 15 09:35:46 2014	(r275791)
+++ head/sys/dev/fdt/fdt_common.c	Mon Dec 15 09:40:25 2014	(r275792)
@@ -102,10 +102,9 @@ fdt_get_range_by_busaddr(phandle_t node,
 	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_
 	    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 *
 }
 
 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);

Modified: head/sys/dev/fdt/fdt_common.h
==============================================================================
--- head/sys/dev/fdt/fdt_common.h	Mon Dec 15 09:35:46 2014	(r275791)
+++ head/sys/dev/fdt/fdt_common.h	Mon Dec 15 09:40:25 2014	(r275792)
@@ -79,7 +79,6 @@ extern u_char fdt_static_dtb;
 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 *);
-int fdt_data_verify(void *, int);
 phandle_t fdt_find_compatible(phandle_t, const char *, int);
 phandle_t fdt_depth_search_compatible(phandle_t, const char *, int);
 int fdt_get_mem_regions(struct mem_region *, int *, uint32_t *);
@@ -94,7 +93,6 @@ int fdt_is_enabled(phandle_t);
 int fdt_pm_is_enabled(phandle_t);
 int fdt_is_type(phandle_t, const char *);
 int fdt_parent_addr_cells(phandle_t);
-int fdt_ranges_verify(pcell_t *, int, int, int, int);
 int fdt_reg_to_rl(phandle_t, struct resource_list *);
 int fdt_pm(phandle_t);
 int fdt_get_unit(device_t);


More information about the svn-src-head mailing list