Teach ofw_bus_parse_xref_list_alloc to be able to return the length of the parsed list.

Currently, there is no easy way to know in advance how many entries a list parsed by
ofw_bus_parse_xref_list_alloc() in sys/dev/ofw/ofw_bus_subr.c has.

This patch:

* teaches the existing function about handling idx == -1 and returning how big
  the set is; then renames it as _internal;
* create a new function that asserts idx != -1, so the old API is maintained;
* add a new function that returns just the list length.

Submitted by:	Stanislav Galabov <sgalabov@gmail.com>
Differential Revision:	https://reviews.freebsd.org/D5043
This commit is contained in:
adrian 2016-02-09 03:35:40 +00:00
parent 6f1f5e23c6
commit 93fc03e6d8
2 changed files with 57 additions and 4 deletions

View File

@ -629,13 +629,16 @@ ofw_bus_find_child_device_by_phandle(device_t bus, phandle_t node)
* node - consumers device node
* list_name - name of parsed list - "clocks"
* cells_name - name of size property - "#clock-cells"
* idx - the index of the requested list entry, or, if -1, an indication
* to return the number of entries in the parsed list.
* Output arguments:
* producer - handle of producer
* ncells - number of cells in result
* ncells - number of cells in result or the number of items in the list when
* idx == -1.
* cells - array of decoded cells
*/
int
ofw_bus_parse_xref_list_alloc(phandle_t node, const char *list_name,
static int
ofw_bus_parse_xref_list_internal(phandle_t node, const char *list_name,
const char *cells_name, int idx, phandle_t *producer, int *ncells,
pcell_t **cells)
{
@ -649,7 +652,7 @@ ofw_bus_parse_xref_list_alloc(phandle_t node, const char *list_name,
(void **)&elems);
if (nelems <= 0)
return (ENOENT);
rv = ENOENT;
rv = (idx == -1) ? 0 : ENOENT;
for (i = 0, cnt = 0; i < nelems; i += pcells, cnt++) {
pnode = elems[i++];
if (OF_getencprop(OF_node_from_xref(pnode),
@ -678,9 +681,57 @@ ofw_bus_parse_xref_list_alloc(phandle_t node, const char *list_name,
}
if (elems != NULL)
free(elems, M_OFWPROP);
if (idx == -1 && rv == 0)
*ncells = cnt;
return (rv);
}
/*
* Parse property that contain list of xrefs and values
* (like standard "clocks" and "resets" properties)
* Input arguments:
* node - consumers device node
* list_name - name of parsed list - "clocks"
* cells_name - name of size property - "#clock-cells"
* idx - the index of the requested list entry (>= 0)
* Output arguments:
* producer - handle of producer
* ncells - number of cells in result
* cells - array of decoded cells
*/
int
ofw_bus_parse_xref_list_alloc(phandle_t node, const char *list_name,
const char *cells_name, int idx, phandle_t *producer, int *ncells,
pcell_t **cells)
{
KASSERT(idx >= 0,
("ofw_bus_parse_xref_list_alloc: negative index supplied"));
return (ofw_bus_parse_xref_list_internal(node, list_name, cells_name,
idx, producer, ncells, cells));
}
/*
* Parse property that contain list of xrefs and values
* (like standard "clocks" and "resets" properties)
* and determine the number of items in the list
* Input arguments:
* node - consumers device node
* list_name - name of parsed list - "clocks"
* cells_name - name of size property - "#clock-cells"
* Output arguments:
* count - number of items in list
*/
int
ofw_bus_parse_xref_list_get_length(phandle_t node, const char *list_name,
const char *cells_name, int *count)
{
return (ofw_bus_parse_xref_list_internal(node, list_name, cells_name,
-1, NULL, count, NULL));
}
/*
* Find index of string in string list property (case sensitive).
*/

View File

@ -118,6 +118,8 @@ device_t ofw_bus_find_child_device_by_phandle(device_t bus, phandle_t node);
int ofw_bus_parse_xref_list_alloc(phandle_t node, const char *list_name,
const char *cells_name, int idx, phandle_t *producer, int *ncells,
pcell_t **cells);
int ofw_bus_parse_xref_list_get_length(phandle_t node, const char *list_name,
const char *cells_name, int *count);
int ofw_bus_find_string_index(phandle_t node, const char *list_name,
const char *name, int *idx);
int ofw_bus_string_list_to_array(phandle_t node, const char *list_name,