Esempio n. 1
0
phandle_t
ofw_bus_find_compatible(phandle_t node, const char *onecompat)
{
	phandle_t child, ret;
	void *compat;
	int len;

	/*
	 * Traverse all children of 'start' node, and find first with
	 * matching 'compatible' property.
	 */
	for (child = OF_child(node); child != 0; child = OF_peer(child)) {
		len = OF_getprop_alloc(child, "compatible", 1, &compat);
		if (len >= 0) {
			ret = ofw_bus_node_is_compatible(compat, len,
			    onecompat);
			free(compat, M_OFWPROP);
			if (ret != 0)
				return (child);
		}

		ret = ofw_bus_find_compatible(child, onecompat);
		if (ret != 0)
			return (ret);
	}
	return (0);
}
Esempio n. 2
0
static int
alpine_get_serdes_base(u_long *pbase, u_long *psize)
{
	phandle_t node;
	u_long base = 0;
	u_long size = 0;

	if (pbase == NULL || psize == NULL)
		return (EINVAL);

	if ((node = OF_finddevice("/")) == -1)
		return (EFAULT);

	if ((node =
	    ofw_bus_find_compatible(node, "annapurna-labs,al-serdes")) == 0)
		return (EFAULT);

	if (fdt_regsize(node, &base, &size))
		return (EFAULT);

	*pbase = base;
	*psize = size;

	return (0);
}
Esempio n. 3
0
int
psci_cpu_on(unsigned long cpu, unsigned long entry, unsigned long context_id)
{
    psci_callfn_t callfn;
    phandle_t node;
    uint32_t fnid;

    if (psci_softc == NULL) {
        node = ofw_bus_find_compatible(OF_peer(0), "arm,psci-0.2");
        if (node == 0)
            /* TODO: Handle psci 0.1 */
            return (PSCI_RETVAL_INTERNAL_FAILURE);

        fnid = PSCI_FNID_CPU_ON;
        callfn = psci_get_callfn(node);
        if (callfn == NULL)
            return (PSCI_RETVAL_INTERNAL_FAILURE);
    } else {
        callfn = psci_softc->psci_call;
        fnid = psci_softc->psci_fnids[PSCI_FN_CPU_ON];
    }

    /* PSCI v0.1 and v0.2 both support cpu_on. */
    return (callfn(fnid, cpu, entry, context_id));
}
Esempio n. 4
0
static struct ofw_compat_data *
mpc85xx_jog_devcompat()
{
	phandle_t node;
	int i;

	node = OF_finddevice("/soc");
	if (node <= 0)
		return (NULL);

	for (i = 0; jog_compat[i].ocd_str != NULL; i++)
		if (ofw_bus_find_compatible(node, jog_compat[i].ocd_str) > 0)
			break;

	if (jog_compat[i].ocd_str == NULL)
		return (NULL);

	return (&jog_compat[i]);
}
Esempio n. 5
0
phandle_t
ofw_bus_find_compatible(phandle_t node, const char *onecompat)
{
	phandle_t child, ret;

	/*
	 * Traverse all children of 'start' node, and find first with
	 * matching 'compatible' property.
	 */
	for (child = OF_child(node); child != 0; child = OF_peer(child)) {
		if (ofw_bus_node_is_compatible(child, onecompat) != 0)
			return (child);

		ret = ofw_bus_find_compatible(child, onecompat);
		if (ret != 0)
			return (ret);
	}
	return (0);
}