Beispiel #1
0
int of_set_property(struct device_node *dp, const char *name, void *val, int len)
{
	struct property **prevp;
	void *new_val;
	int err;

	new_val = kmalloc(len, GFP_KERNEL);
	if (!new_val)
		return -ENOMEM;

	memcpy(new_val, val, len);

	err = -ENODEV;

	mutex_lock(&of_set_property_mutex);
	write_lock(&devtree_lock);
	prevp = &dp->properties;
	while (*prevp) {
		struct property *prop = *prevp;

		if (!strcasecmp(prop->name, name)) {
			void *old_val = prop->value;
			int ret;

			ret = prom_setprop(dp->phandle, name, val, len);

			err = -EINVAL;
			if (ret >= 0) {
				prop->value = new_val;
				prop->length = len;

				if (OF_IS_DYNAMIC(prop))
					kfree(old_val);

				OF_MARK_DYNAMIC(prop);

				err = 0;
			}
			break;
		}
		prevp = &(*prevp)->next;
	}
	write_unlock(&devtree_lock);
	mutex_unlock(&of_set_property_mutex);

	/* XXX Upate procfs if necessary... */

	return err;
}
Beispiel #2
0
/* returns added device node so it can be added to procfs in the case
 * of hotpluging */
static struct device_node *xen_add_vcpu_node(struct device_node *boot_cpu,
					     uint cpu)
{
	struct device_node *new_cpu;
	struct property *pp;
	void *p;
	int sz;
	int type_sz;
	int name_sz;

	DBG("%s: boot cpu: %s\n", __func__, boot_cpu->full_name);

	/* allocate in one shot in case we fail */
	name_sz = strlen(boot_cpu->name) + 1;
	type_sz = strlen(boot_cpu->type) + 1;

	sz = sizeof (*new_cpu);	/* the node */
	sz += strlen(boot_cpu->full_name) + 3; /* full_name */
	sz += name_sz; /* name */
	sz += type_sz; /* type */

	p = xen_of_alloc(sz);
	if (!p)
		return NULL;
	memset(p, 0, sz);

	/* the node */
	new_cpu = p;
	p += sizeof (*new_cpu);
	
	/* name */
	new_cpu->name = p;
	strcpy(new_cpu->name, boot_cpu->name);
	p += name_sz;
	
	/* type */
	new_cpu->type = p;
	strcpy(new_cpu->type, boot_cpu->type);
	p += type_sz;

	/* full_name */
	new_cpu->full_name = p;

	/* assemble new full_name */
	pp = of_find_property(boot_cpu, "name", NULL);
	if (!pp)
		panic("%s: no name prop\n", __func__);

	DBG("%s: name is: %s = %s\n", __func__, pp->name, pp->value);
	sprintf(new_cpu->full_name, "/cpus/%s@%u", pp->value, cpu);

	if (dup_properties(new_cpu, boot_cpu)) {
		xen_of_free(new_cpu);
		return NULL;
	}

	/* fixup reg property */
	DBG("%s: updating reg: %d\n", __func__, cpu);
	pp = of_find_property(new_cpu, "reg", NULL);
	if (!pp)
		panic("%s: no reg prop\n", __func__);
	*(int *)pp->value = cpu;

	if (mem_init_done)
		OF_MARK_DYNAMIC(new_cpu);

	kref_init(&new_cpu->kref);

	/* insert the node */
	new_cpu->parent = of_get_parent(boot_cpu);
	of_attach_node(new_cpu);
	of_node_put(new_cpu->parent);

	return new_cpu;
}