Lines Matching +full:child +full:- +full:nodes
1 // SPDX-License-Identifier: GPL-2.0-only
25 #include <asm/rtas-work-area.h>
45 kfree(prop->name); in dlpar_free_cc_property()
46 kfree(prop->value); in dlpar_free_cc_property()
60 name = (char *)ccwa + be32_to_cpu(ccwa->name_offset); in dlpar_parse_cc_property()
61 prop->name = kstrdup(name, GFP_KERNEL); in dlpar_parse_cc_property()
62 if (!prop->name) { in dlpar_parse_cc_property()
67 prop->length = be32_to_cpu(ccwa->prop_length); in dlpar_parse_cc_property()
68 value = (char *)ccwa + be32_to_cpu(ccwa->prop_offset); in dlpar_parse_cc_property()
69 prop->value = kmemdup(value, prop->length, GFP_KERNEL); in dlpar_parse_cc_property()
70 if (!prop->value) { in dlpar_parse_cc_property()
87 name = (const char *)ccwa + be32_to_cpu(ccwa->name_offset); in dlpar_parse_cc_node()
88 dn->full_name = kstrdup(name, GFP_KERNEL); in dlpar_parse_cc_node()
89 if (!dn->full_name) { in dlpar_parse_cc_node()
104 while (dn->properties) { in dlpar_free_one_cc_node()
105 prop = dn->properties; in dlpar_free_one_cc_node()
106 dn->properties = prop->next; in dlpar_free_one_cc_node()
110 kfree(dn->full_name); in dlpar_free_one_cc_node()
116 if (dn->child) in dlpar_free_cc_nodes()
117 dlpar_free_cc_nodes(dn->child); in dlpar_free_cc_nodes()
119 if (dn->sibling) in dlpar_free_cc_nodes()
120 dlpar_free_cc_nodes(dn->sibling); in dlpar_free_cc_nodes()
131 #define ERR_CFG_USE -9003
145 int rc = -1; in dlpar_configure_connector()
155 ccwa->drc_index = drc_index; in dlpar_configure_connector()
156 ccwa->zero = 0; in dlpar_configure_connector()
173 dn->parent = last_dn->parent; in dlpar_configure_connector()
174 last_dn->sibling = dn; in dlpar_configure_connector()
184 dn->parent = parent; in dlpar_configure_connector()
187 dn->parent = last_dn; in dlpar_configure_connector()
189 last_dn->child = dn; in dlpar_configure_connector()
200 if (!last_dn->properties) in dlpar_configure_connector()
201 last_dn->properties = property; in dlpar_configure_connector()
203 last_property->next = property; in dlpar_configure_connector()
209 last_dn = last_dn->parent; in dlpar_configure_connector()
216 "returned from configure-connector\n", rc); in dlpar_configure_connector()
238 dn->parent = parent; in dlpar_attach_node()
251 struct device_node *child; in dlpar_detach_node() local
254 for_each_child_of_node(dn, child) in dlpar_detach_node()
255 dlpar_detach_node(child); in dlpar_detach_node()
272 if (!rc && dn->child) in dlpar_changeset_attach_cc_nodes()
273 rc = dlpar_changeset_attach_cc_nodes(ocs, dn->child); in dlpar_changeset_attach_cc_nodes()
274 if (!rc && dn->sibling) in dlpar_changeset_attach_cc_nodes()
275 rc = dlpar_changeset_attach_cc_nodes(ocs, dn->sibling); in dlpar_changeset_attach_cc_nodes()
296 return -1; in dlpar_acquire_drc()
317 return -1; in dlpar_release_drc()
338 return -1; in dlpar_unisolate_drc()
352 for_each_node_with_property(np, "ibm,my-drc-index") { in get_device_node_with_drc_index()
353 rc = of_property_read_u32(np, "ibm,my-drc-index", in get_device_node_with_drc_index()
357 __func__, np, "ibm,my-drc-index", rc); in get_device_node_with_drc_index()
379 for_each_node_with_property(np, "ibm,drc-info") { in get_device_node_with_drc_info()
380 info = of_find_property(np, "ibm,drc-info", NULL); in get_device_node_with_drc_info()
414 for_each_node_with_property(np, "ibm,drc-indexes") { in get_device_node_with_drc_indexes()
419 rc = of_property_read_u32_index(np, "ibm,drc-indexes", in get_device_node_with_drc_indexes()
429 rc = of_property_read_u32_index(np, "ibm,drc-indexes", in get_device_node_with_drc_indexes()
448 struct device_node *np, *nodes; in dlpar_hp_dt_add() local
461 rc = -EINVAL; in dlpar_hp_dt_add()
466 * Recent FW provides ibm,drc-info property. So search in dlpar_hp_dt_add()
467 * for the user specified DRC index from ibm,drc-info in dlpar_hp_dt_add()
469 * in the indexes array from ibm,drc-indexes property. in dlpar_hp_dt_add()
476 return -EIO; in dlpar_hp_dt_add()
480 nodes = dlpar_configure_connector(cpu_to_be32(index), np); in dlpar_hp_dt_add()
481 if (!nodes) { in dlpar_hp_dt_add()
482 rc = -EIO; in dlpar_hp_dt_add()
487 * Add the new nodes from dlpar_configure_connector() onto in dlpar_hp_dt_add()
488 * the device-tree. in dlpar_hp_dt_add()
491 rc = dlpar_changeset_attach_cc_nodes(&ocs, nodes); in dlpar_hp_dt_add()
496 dlpar_free_cc_nodes(nodes); in dlpar_hp_dt_add()
508 struct device_node *child; in changeset_detach_node_recursive() local
511 for_each_child_of_node(node, child) { in changeset_detach_node_recursive()
512 rc = changeset_detach_node_recursive(ocs, child); in changeset_detach_node_recursive()
514 of_node_put(child); in changeset_detach_node_recursive()
530 * Prune all nodes with a matching index. in dlpar_hp_dt_remove()
534 for_each_node_with_property(np, "ibm,my-drc-index") { in dlpar_hp_dt_remove()
535 rc = of_property_read_u32(np, "ibm,my-drc-index", &index); in dlpar_hp_dt_remove()
538 __func__, np, "ibm,my-drc-index", rc); in dlpar_hp_dt_remove()
564 if (phpe->id_type != PSERIES_HP_ELOG_ID_DRC_INDEX) in dlpar_hp_dt()
565 return -EINVAL; in dlpar_hp_dt()
567 drc_index = be32_to_cpu(phpe->_drc_u.drc_index); in dlpar_hp_dt()
571 switch (phpe->action) { in dlpar_hp_dt()
579 pr_err("Invalid action (%d) specified\n", phpe->action); in dlpar_hp_dt()
580 rc = -EINVAL; in dlpar_hp_dt()
593 switch (hp_elog->resource) { in handle_dlpar_errorlog()
609 hp_elog->resource); in handle_dlpar_errorlog()
610 rc = -EINVAL; in handle_dlpar_errorlog()
621 handle_dlpar_errorlog(hp_work->errlog); in pseries_hp_work_fn()
623 kfree(hp_work->errlog); in pseries_hp_work_fn()
639 work->errlog = hp_errlog_copy; in queue_hotplug_event()
652 return -EINVAL; in dlpar_parse_resource()
655 hp_elog->resource = PSERIES_HP_ELOG_RESOURCE_MEM; in dlpar_parse_resource()
657 hp_elog->resource = PSERIES_HP_ELOG_RESOURCE_CPU; in dlpar_parse_resource()
659 hp_elog->resource = PSERIES_HP_ELOG_RESOURCE_DT; in dlpar_parse_resource()
662 return -EINVAL; in dlpar_parse_resource()
674 return -EINVAL; in dlpar_parse_action()
677 hp_elog->action = PSERIES_HP_ELOG_ACTION_ADD; in dlpar_parse_action()
679 hp_elog->action = PSERIES_HP_ELOG_ACTION_REMOVE; in dlpar_parse_action()
682 return -EINVAL; in dlpar_parse_action()
695 return -EINVAL; in dlpar_parse_id_type()
697 if (sysfs_streq(arg, "indexed-count")) { in dlpar_parse_id_type()
698 hp_elog->id_type = PSERIES_HP_ELOG_ID_DRC_IC; in dlpar_parse_id_type()
702 return -EINVAL; in dlpar_parse_id_type()
707 return -EINVAL; in dlpar_parse_id_type()
713 return -EINVAL; in dlpar_parse_id_type()
718 return -EINVAL; in dlpar_parse_id_type()
721 hp_elog->_drc_u.ic.count = cpu_to_be32(count); in dlpar_parse_id_type()
722 hp_elog->_drc_u.ic.index = cpu_to_be32(index); in dlpar_parse_id_type()
724 hp_elog->id_type = PSERIES_HP_ELOG_ID_DRC_INDEX; in dlpar_parse_id_type()
728 return -EINVAL; in dlpar_parse_id_type()
733 return -EINVAL; in dlpar_parse_id_type()
736 hp_elog->_drc_u.drc_index = cpu_to_be32(index); in dlpar_parse_id_type()
738 hp_elog->id_type = PSERIES_HP_ELOG_ID_DRC_COUNT; in dlpar_parse_id_type()
742 return -EINVAL; in dlpar_parse_id_type()
747 return -EINVAL; in dlpar_parse_id_type()
750 hp_elog->_drc_u.drc_count = cpu_to_be32(count); in dlpar_parse_id_type()
753 return -EINVAL; in dlpar_parse_id_type()
769 return -ENOMEM; in dlpar_store()
813 return pseries_hp_wq ? 0 : -ENOMEM; in dlpar_workqueue_init()