for_each_child_of_node(pmem_node, dn) { if (of_property_read_u32(dn, "ibm,my-drc-index", &index)) continue; if (index == drc_index) break;
}
if (!dn) {
pr_err("Attempting to remove unused DRC index %x\n", drc_index); return -ENODEV;
}
pr_debug("Attempting to remove %pOF, drc index: %x\n", dn, drc_index);
/* * NB: tears down the ibm,pmemory device as a side-effect */
rc = dlpar_detach_node(dn); if (rc) return rc;
rc = dlpar_release_drc(drc_index); if (rc) {
pr_err("Failed to release drc (%x) for CPU %pOFn, rc: %d\n",
drc_index, dn, rc);
dlpar_attach_node(dn, pmem_node); return rc;
}
pr_info("Successfully removed PMEM with drc index: %x\n", drc_index);
return 0;
}
int dlpar_hp_pmem(struct pseries_hp_errorlog *hp_elog)
{
u32 drc_index; int rc;
/* slim chance, but we might get a hotplug event while booting */ if (!pmem_node)
pmem_node = of_find_node_by_type(NULL, "ibm,persistent-memory"); if (!pmem_node) {
pr_err("Hotplug event for a pmem device, but none exists\n"); return -ENODEV;
}
if (hp_elog->id_type != PSERIES_HP_ELOG_ID_DRC_INDEX) {
pr_err("Unsupported hotplug event type %d\n",
hp_elog->id_type); return -EINVAL;
}
staticint pseries_pmem_init(void)
{ /* * Only supported on POWER8 and above.
*/ if (!cpu_has_feature(CPU_FTR_ARCH_207S)) return 0;
pmem_node = of_find_node_by_type(NULL, "ibm,persistent-memory"); if (!pmem_node) return 0;
/* * The generic OF bus probe/populate handles creating platform devices * from the child (ibm,pmemory) nodes. The generic code registers an of * reconfig notifier to handle the hot-add/remove cases too.
*/
of_platform_bus_probe(pmem_node, drc_pmem_match, NULL);
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.