mirror of
https://git.rtems.org/rtems-libbsd/
synced 2025-10-14 18:41:59 +08:00
Update to FreeBSD head 2018-06-01
Git mirror commit fb63610a69b0eb7f69a201ba05c4c1a7a2739cf9. Update #3472.
This commit is contained in:
@@ -61,7 +61,6 @@ __FBSDID("$FreeBSD$");
|
||||
#endif
|
||||
|
||||
#define FDT_COMPAT_LEN 255
|
||||
#define FDT_TYPE_LEN 64
|
||||
|
||||
#define FDT_REG_CELLS 4
|
||||
#define FDT_RANGES_SIZE 48
|
||||
@@ -74,8 +73,6 @@ vm_offset_t fdt_immr_size;
|
||||
|
||||
struct fdt_ic_list fdt_ic_list_head = SLIST_HEAD_INITIALIZER(fdt_ic_list_head);
|
||||
|
||||
static int fdt_is_compatible(phandle_t, const char *);
|
||||
|
||||
static int
|
||||
fdt_get_range_by_busaddr(phandle_t node, u_long addr, u_long *base,
|
||||
u_long *size)
|
||||
@@ -218,7 +215,7 @@ fdt_immr_addr(vm_offset_t immr_va)
|
||||
* Try to access the SOC node directly i.e. through /aliases/.
|
||||
*/
|
||||
if ((node = OF_finddevice("soc")) != -1)
|
||||
if (fdt_is_compatible(node, "simple-bus"))
|
||||
if (ofw_bus_node_is_compatible(node, "simple-bus"))
|
||||
goto moveon;
|
||||
/*
|
||||
* Find the node the long way.
|
||||
@@ -239,45 +236,6 @@ moveon:
|
||||
return (r);
|
||||
}
|
||||
|
||||
/*
|
||||
* This routine is an early-usage version of the ofw_bus_is_compatible() when
|
||||
* the ofw_bus I/F is not available (like early console routines and similar).
|
||||
* Note the buffer has to be on the stack since malloc() is usually not
|
||||
* available in such cases either.
|
||||
*/
|
||||
static int
|
||||
fdt_is_compatible(phandle_t node, const char *compatstr)
|
||||
{
|
||||
char buf[FDT_COMPAT_LEN];
|
||||
char *compat;
|
||||
int len, onelen, l, rv;
|
||||
|
||||
if ((len = OF_getproplen(node, "compatible")) <= 0)
|
||||
return (0);
|
||||
|
||||
compat = (char *)&buf;
|
||||
bzero(compat, FDT_COMPAT_LEN);
|
||||
|
||||
if (OF_getprop(node, "compatible", compat, FDT_COMPAT_LEN) < 0)
|
||||
return (0);
|
||||
|
||||
onelen = strlen(compatstr);
|
||||
rv = 0;
|
||||
while (len > 0) {
|
||||
if (strncasecmp(compat, compatstr, onelen) == 0) {
|
||||
/* Found it. */
|
||||
rv = 1;
|
||||
break;
|
||||
}
|
||||
/* Slide to the next sub-string. */
|
||||
l = strlen(compat) + 1;
|
||||
compat += l;
|
||||
len -= l;
|
||||
}
|
||||
|
||||
return (rv);
|
||||
}
|
||||
|
||||
int
|
||||
fdt_is_compatible_strict(phandle_t node, const char *compatible)
|
||||
{
|
||||
@@ -306,7 +264,7 @@ fdt_find_compatible(phandle_t start, const char *compat, int strict)
|
||||
* matching 'compatible' property.
|
||||
*/
|
||||
for (child = OF_child(start); child != 0; child = OF_peer(child))
|
||||
if (fdt_is_compatible(child, compat)) {
|
||||
if (ofw_bus_node_is_compatible(child, compat)) {
|
||||
if (strict)
|
||||
if (!fdt_is_compatible_strict(child, compat))
|
||||
continue;
|
||||
@@ -325,7 +283,7 @@ fdt_depth_search_compatible(phandle_t start, const char *compat, int strict)
|
||||
* matching 'compatible' property.
|
||||
*/
|
||||
for (node = OF_child(start); node != 0; node = OF_peer(node)) {
|
||||
if (fdt_is_compatible(node, compat) &&
|
||||
if (ofw_bus_node_is_compatible(node, compat) &&
|
||||
(strict == 0 || fdt_is_compatible_strict(node, compat))) {
|
||||
return (node);
|
||||
}
|
||||
@@ -336,46 +294,6 @@ fdt_depth_search_compatible(phandle_t start, const char *compat, int strict)
|
||||
return (0);
|
||||
}
|
||||
|
||||
int
|
||||
fdt_is_enabled(phandle_t node)
|
||||
{
|
||||
char *stat;
|
||||
int ena, len;
|
||||
|
||||
len = OF_getprop_alloc(node, "status", sizeof(char),
|
||||
(void **)&stat);
|
||||
|
||||
if (len <= 0)
|
||||
/* It is OK if no 'status' property. */
|
||||
return (1);
|
||||
|
||||
/* Anything other than 'okay' means disabled. */
|
||||
ena = 0;
|
||||
if (strncmp((char *)stat, "okay", len) == 0)
|
||||
ena = 1;
|
||||
|
||||
OF_prop_free(stat);
|
||||
return (ena);
|
||||
}
|
||||
|
||||
int
|
||||
fdt_is_type(phandle_t node, const char *typestr)
|
||||
{
|
||||
char type[FDT_TYPE_LEN];
|
||||
|
||||
if (OF_getproplen(node, "device_type") <= 0)
|
||||
return (0);
|
||||
|
||||
if (OF_getprop(node, "device_type", type, FDT_TYPE_LEN) < 0)
|
||||
return (0);
|
||||
|
||||
if (strncasecmp(type, typestr, FDT_TYPE_LEN) == 0)
|
||||
/* This fits. */
|
||||
return (1);
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
int
|
||||
fdt_parent_addr_cells(phandle_t node)
|
||||
{
|
||||
@@ -389,19 +307,6 @@ fdt_parent_addr_cells(phandle_t node)
|
||||
return ((int)fdt32_to_cpu(addr_cells));
|
||||
}
|
||||
|
||||
int
|
||||
fdt_pm_is_enabled(phandle_t node)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = 1;
|
||||
|
||||
#if defined(SOC_MV_KIRKWOOD) || defined(SOC_MV_DISCOVERY)
|
||||
ret = fdt_pm(node);
|
||||
#endif
|
||||
return (ret);
|
||||
}
|
||||
|
||||
u_long
|
||||
fdt_data_get(void *data, int cells)
|
||||
{
|
||||
@@ -476,59 +381,6 @@ fdt_regsize(phandle_t node, u_long *base, u_long *size)
|
||||
return (0);
|
||||
}
|
||||
|
||||
int
|
||||
fdt_reg_to_rl(phandle_t node, struct resource_list *rl)
|
||||
{
|
||||
u_long end, count, start;
|
||||
pcell_t *reg, *regptr;
|
||||
pcell_t addr_cells, size_cells;
|
||||
int tuple_size, tuples;
|
||||
int i, rv;
|
||||
long busaddr, bussize;
|
||||
|
||||
if (fdt_addrsize_cells(OF_parent(node), &addr_cells, &size_cells) != 0)
|
||||
return (ENXIO);
|
||||
if (fdt_get_range(OF_parent(node), 0, &busaddr, &bussize)) {
|
||||
busaddr = 0;
|
||||
bussize = 0;
|
||||
}
|
||||
|
||||
tuple_size = sizeof(pcell_t) * (addr_cells + size_cells);
|
||||
tuples = OF_getprop_alloc(node, "reg", tuple_size, (void **)®);
|
||||
debugf("addr_cells = %d, size_cells = %d\n", addr_cells, size_cells);
|
||||
debugf("tuples = %d, tuple size = %d\n", tuples, tuple_size);
|
||||
if (tuples <= 0)
|
||||
/* No 'reg' property in this node. */
|
||||
return (0);
|
||||
|
||||
regptr = reg;
|
||||
for (i = 0; i < tuples; i++) {
|
||||
|
||||
rv = fdt_data_to_res(reg, addr_cells, size_cells, &start,
|
||||
&count);
|
||||
if (rv != 0) {
|
||||
resource_list_free(rl);
|
||||
goto out;
|
||||
}
|
||||
reg += addr_cells + size_cells;
|
||||
|
||||
/* Calculate address range relative to base. */
|
||||
start += busaddr;
|
||||
end = start + count - 1;
|
||||
|
||||
debugf("reg addr start = %lx, end = %lx, count = %lx\n", start,
|
||||
end, count);
|
||||
|
||||
resource_list_add(rl, SYS_RES_MEMORY, i, start, end,
|
||||
count);
|
||||
}
|
||||
rv = 0;
|
||||
|
||||
out:
|
||||
OF_prop_free(regptr);
|
||||
return (rv);
|
||||
}
|
||||
|
||||
int
|
||||
fdt_get_phyaddr(phandle_t node, device_t dev, int *phy_addr, void **phy_sc)
|
||||
{
|
||||
@@ -649,6 +501,47 @@ out:
|
||||
return (rv);
|
||||
}
|
||||
|
||||
int
|
||||
fdt_get_reserved_mem(struct mem_region *reserved, int *mreserved)
|
||||
{
|
||||
pcell_t reg[FDT_REG_CELLS];
|
||||
phandle_t child, root;
|
||||
int addr_cells, size_cells;
|
||||
int i, rv;
|
||||
|
||||
root = OF_finddevice("/reserved-memory");
|
||||
if (root == -1) {
|
||||
return (ENXIO);
|
||||
}
|
||||
|
||||
if ((rv = fdt_addrsize_cells(root, &addr_cells, &size_cells)) != 0)
|
||||
return (rv);
|
||||
|
||||
if (addr_cells + size_cells > FDT_REG_CELLS)
|
||||
panic("Too many address and size cells %d %d", addr_cells,
|
||||
size_cells);
|
||||
|
||||
i = 0;
|
||||
for (child = OF_child(root); child != 0; child = OF_peer(child)) {
|
||||
if (!OF_hasprop(child, "no-map"))
|
||||
continue;
|
||||
|
||||
rv = OF_getprop(child, "reg", reg, sizeof(reg));
|
||||
if (rv <= 0)
|
||||
/* XXX: Does a no-map of a dynamic range make sense? */
|
||||
continue;
|
||||
|
||||
fdt_data_to_res(reg, addr_cells, size_cells,
|
||||
(u_long *)&reserved[i].mr_start,
|
||||
(u_long *)&reserved[i].mr_size);
|
||||
i++;
|
||||
}
|
||||
|
||||
*mreserved = i;
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
int
|
||||
fdt_get_mem_regions(struct mem_region *mr, int *mrcnt, uint64_t *memsize)
|
||||
{
|
||||
@@ -714,17 +607,6 @@ out:
|
||||
return (rv);
|
||||
}
|
||||
|
||||
int
|
||||
fdt_get_unit(device_t dev)
|
||||
{
|
||||
const char * name;
|
||||
|
||||
name = ofw_bus_get_name(dev);
|
||||
name = strchr(name, '@') + 1;
|
||||
|
||||
return (strtol(name,NULL,0));
|
||||
}
|
||||
|
||||
int
|
||||
fdt_get_chosen_bootargs(char *bootargs, size_t max_size)
|
||||
{
|
||||
|
@@ -39,7 +39,7 @@
|
||||
#include <contrib/libfdt/libfdt_env.h>
|
||||
#include <dev/ofw/ofw_bus.h>
|
||||
|
||||
#define FDT_MEM_REGIONS 8
|
||||
#define FDT_MEM_REGIONS 16
|
||||
|
||||
#define DI_MAX_INTR_NUM 32
|
||||
|
||||
@@ -85,19 +85,14 @@ int fdt_data_to_res(pcell_t *, int, int, u_long *, u_long *);
|
||||
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 *, uint64_t *);
|
||||
int fdt_get_reserved_mem(struct mem_region *, int *);
|
||||
int fdt_get_reserved_regions(struct mem_region *, int *);
|
||||
int fdt_get_phyaddr(phandle_t, device_t, int *, void **);
|
||||
int fdt_get_range(phandle_t, int, u_long *, u_long *);
|
||||
int fdt_immr_addr(vm_offset_t);
|
||||
int fdt_regsize(phandle_t, u_long *, u_long *);
|
||||
int fdt_is_compatible_strict(phandle_t, const char *);
|
||||
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_reg_to_rl(phandle_t, struct resource_list *);
|
||||
int fdt_pm(phandle_t);
|
||||
int fdt_get_unit(device_t);
|
||||
int fdt_get_chosen_bootargs(char *bootargs, size_t max_size);
|
||||
|
||||
#endif /* _FDT_COMMON_H_ */
|
||||
|
Reference in New Issue
Block a user