Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 175823
b: refs/heads/master
c: 1a8061c
h: refs/heads/master
i:
  175821: 16cc762
  175819: d0dff19
  175815: 3d90768
  175807: 9a483ba
v: v3
  • Loading branch information
Nathan Fontenot authored and Benjamin Herrenschmidt committed Dec 9, 2009
1 parent db6b12e commit b1c8e5f
Show file tree
Hide file tree
Showing 2 changed files with 89 additions and 1 deletion.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 12633e803a2a556f6469e0933d08233d0844a2d9
refs/heads/master: 1a8061c46c46c960f715c597b9d279ea2ba42bd9
88 changes: 88 additions & 0 deletions trunk/arch/powerpc/platforms/pseries/dlpar.c
Original file line number Diff line number Diff line change
Expand Up @@ -341,4 +341,92 @@ int dlpar_release_drc(u32 drc_index)
return 0;
}

#ifdef CONFIG_ARCH_CPU_PROBE_RELEASE

static ssize_t dlpar_cpu_probe(const char *buf, size_t count)
{
struct device_node *dn;
unsigned long drc_index;
char *cpu_name;
int rc;

rc = strict_strtoul(buf, 0, &drc_index);
if (rc)
return -EINVAL;

dn = dlpar_configure_connector(drc_index);
if (!dn)
return -EINVAL;

/* configure-connector reports cpus as living in the base
* directory of the device tree. CPUs actually live in the
* cpus directory so we need to fixup the full_name.
*/
cpu_name = kzalloc(strlen(dn->full_name) + strlen("/cpus") + 1,
GFP_KERNEL);
if (!cpu_name) {
dlpar_free_cc_nodes(dn);
return -ENOMEM;
}

sprintf(cpu_name, "/cpus%s", dn->full_name);
kfree(dn->full_name);
dn->full_name = cpu_name;

rc = dlpar_acquire_drc(drc_index);
if (rc) {
dlpar_free_cc_nodes(dn);
return -EINVAL;
}

rc = dlpar_attach_node(dn);
if (rc) {
dlpar_release_drc(drc_index);
dlpar_free_cc_nodes(dn);
}

return rc ? rc : count;
}

static ssize_t dlpar_cpu_release(const char *buf, size_t count)
{
struct device_node *dn;
const u32 *drc_index;
int rc;

dn = of_find_node_by_path(buf);
if (!dn)
return -EINVAL;

drc_index = of_get_property(dn, "ibm,my-drc-index", NULL);
if (!drc_index) {
of_node_put(dn);
return -EINVAL;
}

rc = dlpar_release_drc(*drc_index);
if (rc) {
of_node_put(dn);
return -EINVAL;
}

rc = dlpar_detach_node(dn);
if (rc) {
dlpar_acquire_drc(*drc_index);
return rc;
}

of_node_put(dn);
return count;
}

static int __init pseries_dlpar_init(void)
{
ppc_md.cpu_probe = dlpar_cpu_probe;
ppc_md.cpu_release = dlpar_cpu_release;

return 0;
}
machine_device_initcall(pseries, pseries_dlpar_init);

#endif /* CONFIG_ARCH_CPU_PROBE_RELEASE */

0 comments on commit b1c8e5f

Please sign in to comment.