Lines Matching +full:x +full:- +full:rc
1 // SPDX-License-Identifier: GPL-2.0-or-later
17 #define pr_fmt(fmt) "pseries-hotplug-cpu: " fmt
85 vdso_data->processorCount--; in pseries_cpu_disable()
107 * the cpu-offline. Here we wait for long enough to allow the cpu in question
108 * to self-destroy so that the cpu-offline thread can send the CPU_DEAD
112 * self-destruct.
140 paca_ptrs[cpu]->cpu_start = 0; in pseries_cpu_die()
144 * find_cpu_id_range - found a linear ranger of @nthreads free CPU ids.
157 int rc = -ENOSPC; in find_cpu_id_range() local
160 return -ENOMEM; in find_cpu_id_range()
196 rc = 0; in find_cpu_id_range()
200 return rc; in find_cpu_id_range()
207 * the logical ids for sibling SMT threads x and y are adjacent, such
208 * that x^1 == y and y^1 == x.
213 int rc = 0; in pseries_add_processor() local
217 intserv = of_get_property(np, "ibm,ppc-interrupt-server#s", &len); in pseries_add_processor()
224 return -ENOMEM; in pseries_add_processor()
239 rc = find_cpu_id_range(nthreads, node, &cpu_mask); in pseries_add_processor()
240 if (rc && nr_node_ids > 1) { in pseries_add_processor()
245 rc = find_cpu_id_range(nthreads, NUMA_NO_NODE, &cpu_mask); in pseries_add_processor()
248 if (rc) { in pseries_add_processor()
270 pr_warn("Reusing free CPU ids %d-%d from another node\n", in pseries_add_processor()
271 cpu, cpu + nthreads - 1); in pseries_add_processor()
284 return rc; in pseries_add_processor()
289 * the hard id in the paca(s) to -1 to be consistent with boot time
290 * convention for non-present cpus.
299 intserv = of_get_property(np, "ibm,ppc-interrupt-server#s", &len); in pseries_remove_processor()
313 set_hard_smp_processor_id(cpu, -1); in pseries_remove_processor()
314 update_numa_cpu_lookup_table(cpu, -1); in pseries_remove_processor()
319 "with physical id 0x%x\n", thread); in pseries_remove_processor()
326 int rc = 0; in dlpar_offline_cpu() local
332 intserv = of_get_property(dn, "ibm,ppc-interrupt-server#s", &len); in dlpar_offline_cpu()
334 return -EINVAL; in dlpar_offline_cpu()
349 * device_offline() will return -EBUSY (via cpu_down()) if there in dlpar_offline_cpu()
357 rc = -EBUSY; in dlpar_offline_cpu()
362 rc = device_offline(get_cpu_device(cpu)); in dlpar_offline_cpu()
363 if (rc) in dlpar_offline_cpu()
369 pr_warn("Could not find cpu to offline with physical id 0x%x\n", in dlpar_offline_cpu()
377 return rc; in dlpar_offline_cpu()
382 int rc = 0; in dlpar_online_cpu() local
388 intserv = of_get_property(dn, "ibm,ppc-interrupt-server#s", &len); in dlpar_online_cpu()
390 return -EINVAL; in dlpar_online_cpu()
402 rc = device_online(get_cpu_device(cpu)); in dlpar_online_cpu()
403 if (rc) { in dlpar_online_cpu()
413 "with physical id 0x%x\n", thread); in dlpar_online_cpu()
418 return rc; in dlpar_online_cpu()
427 int rc; in dlpar_cpu_exists() local
433 rc = of_property_read_u32(child, "ibm,my-drc-index", in dlpar_cpu_exists()
435 if (rc) in dlpar_cpu_exists()
456 info = of_find_property(parent, "ibm,drc-info", NULL); in drc_info_valid_index()
462 /* First value of ibm,drc-info is number of drc-info records */ in drc_info_valid_index()
493 int rc, index; in valid_cpu_drc_index() local
495 if (of_find_property(parent, "ibm,drc-info", NULL)) in valid_cpu_drc_index()
498 /* Note that the format of the ibm,drc-indexes array is in valid_cpu_drc_index()
506 rc = of_property_read_u32_index(parent, "ibm,drc-indexes", in valid_cpu_drc_index()
509 if (rc) in valid_cpu_drc_index()
525 * This device node is unattached but may have siblings; open-code the in pseries_cpuhp_attach_nodes()
528 for (of_changeset_init(&cs); dn != NULL; dn = dn->sibling) { in pseries_cpuhp_attach_nodes()
543 int rc, saved_rc; in dlpar_cpu_add() local
545 pr_debug("Attempting to add CPU, drc index: %x\n", drc_index); in dlpar_cpu_add()
550 return -ENODEV; in dlpar_cpu_add()
555 pr_warn("CPU with drc index %x already exists\n", drc_index); in dlpar_cpu_add()
556 return -EINVAL; in dlpar_cpu_add()
561 pr_warn("Cannot find CPU (drc index %x) to add.\n", drc_index); in dlpar_cpu_add()
562 return -EINVAL; in dlpar_cpu_add()
565 rc = dlpar_acquire_drc(drc_index); in dlpar_cpu_add()
566 if (rc) { in dlpar_cpu_add()
567 pr_warn("Failed to acquire DRC, rc: %d, drc index: %x\n", in dlpar_cpu_add()
568 rc, drc_index); in dlpar_cpu_add()
570 return -EINVAL; in dlpar_cpu_add()
575 pr_warn("Failed call to configure-connector, drc index: %x\n", in dlpar_cpu_add()
579 return -EINVAL; in dlpar_cpu_add()
582 rc = pseries_cpuhp_attach_nodes(dn); in dlpar_cpu_add()
587 if (rc) { in dlpar_cpu_add()
588 saved_rc = rc; in dlpar_cpu_add()
589 pr_warn("Failed to attach node %pOFn, rc: %d, drc index: %x\n", in dlpar_cpu_add()
590 dn, rc, drc_index); in dlpar_cpu_add()
592 rc = dlpar_release_drc(drc_index); in dlpar_cpu_add()
593 if (!rc) in dlpar_cpu_add()
601 rc = dlpar_online_cpu(dn); in dlpar_cpu_add()
602 if (rc) { in dlpar_cpu_add()
603 saved_rc = rc; in dlpar_cpu_add()
604 pr_warn("Failed to online cpu %pOFn, rc: %d, drc index: %x\n", in dlpar_cpu_add()
605 dn, rc, drc_index); in dlpar_cpu_add()
607 rc = dlpar_detach_node(dn); in dlpar_cpu_add()
608 if (!rc) in dlpar_cpu_add()
614 pr_debug("Successfully added CPU %pOFn, drc index: %x\n", dn, in dlpar_cpu_add()
616 return rc; in dlpar_cpu_add()
675 int rc; in dlpar_cpu_remove() local
677 pr_debug("Attempting to remove CPU %pOFn, drc index: %x\n", in dlpar_cpu_remove()
680 rc = dlpar_offline_cpu(dn); in dlpar_cpu_remove()
681 if (rc) { in dlpar_cpu_remove()
682 pr_warn("Failed to offline CPU %pOFn, rc: %d\n", dn, rc); in dlpar_cpu_remove()
683 return -EINVAL; in dlpar_cpu_remove()
686 rc = dlpar_release_drc(drc_index); in dlpar_cpu_remove()
687 if (rc) { in dlpar_cpu_remove()
688 pr_warn("Failed to release drc (%x) for CPU %pOFn, rc: %d\n", in dlpar_cpu_remove()
689 drc_index, dn, rc); in dlpar_cpu_remove()
691 return rc; in dlpar_cpu_remove()
694 rc = pseries_cpuhp_detach_nodes(dn); in dlpar_cpu_remove()
695 if (rc) { in dlpar_cpu_remove()
696 int saved_rc = rc; in dlpar_cpu_remove()
698 pr_warn("Failed to detach CPU %pOFn, rc: %d", dn, rc); in dlpar_cpu_remove()
700 rc = dlpar_acquire_drc(drc_index); in dlpar_cpu_remove()
701 if (!rc) in dlpar_cpu_remove()
707 pr_debug("Successfully removed CPU, drc index: %x\n", drc_index); in dlpar_cpu_remove()
715 int rc; in cpu_drc_index_to_dn() local
718 rc = of_property_read_u32(dn, "ibm,my-drc-index", &my_index); in cpu_drc_index_to_dn()
719 if (rc) in cpu_drc_index_to_dn()
732 int rc; in dlpar_cpu_remove_by_index() local
736 pr_warn("Cannot find CPU (drc index %x) to remove\n", in dlpar_cpu_remove_by_index()
738 return -ENODEV; in dlpar_cpu_remove_by_index()
741 rc = dlpar_cpu_remove(dn, drc_index); in dlpar_cpu_remove_by_index()
743 return rc; in dlpar_cpu_remove_by_index()
749 int rc; in dlpar_cpu() local
751 drc_index = hp_elog->_drc_u.drc_index; in dlpar_cpu()
755 switch (hp_elog->action) { in dlpar_cpu()
757 if (hp_elog->id_type == PSERIES_HP_ELOG_ID_DRC_INDEX) { in dlpar_cpu()
758 rc = dlpar_cpu_remove_by_index(drc_index); in dlpar_cpu()
761 * device to UNISOLATE is a no-op, but the hypervisor can in dlpar_cpu()
764 if (rc) in dlpar_cpu()
768 rc = -EINVAL; in dlpar_cpu()
771 if (hp_elog->id_type == PSERIES_HP_ELOG_ID_DRC_INDEX) in dlpar_cpu()
772 rc = dlpar_cpu_add(drc_index); in dlpar_cpu()
774 rc = -EINVAL; in dlpar_cpu()
777 pr_err("Invalid action (%d) specified\n", hp_elog->action); in dlpar_cpu()
778 rc = -EINVAL; in dlpar_cpu()
783 return rc; in dlpar_cpu()
791 int rc; in dlpar_cpu_probe() local
793 rc = kstrtou32(buf, 0, &drc_index); in dlpar_cpu_probe()
794 if (rc) in dlpar_cpu_probe()
795 return -EINVAL; in dlpar_cpu_probe()
797 rc = dlpar_cpu_add(drc_index); in dlpar_cpu_probe()
799 return rc ? rc : count; in dlpar_cpu_probe()
806 int rc; in dlpar_cpu_release() local
810 return -EINVAL; in dlpar_cpu_release()
812 rc = of_property_read_u32(dn, "ibm,my-drc-index", &drc_index); in dlpar_cpu_release()
813 if (rc) { in dlpar_cpu_release()
815 return -EINVAL; in dlpar_cpu_release()
818 rc = dlpar_cpu_remove(dn, drc_index); in dlpar_cpu_release()
821 return rc ? rc : count; in dlpar_cpu_release()
834 err = pseries_add_processor(rd->dn); in pseries_smp_notifier()
837 pseries_remove_processor(rd->dn); in pseries_smp_notifier()
857 rtas_stop_self_token = rtas_token("stop-self"); in pseries_cpu_hotplug_init()
858 qcss_tok = rtas_token("query-cpu-stopped-state"); in pseries_cpu_hotplug_init()
863 "- disabling.\n"); in pseries_cpu_hotplug_init()
867 smp_ops->cpu_offline_self = pseries_cpu_offline_self; in pseries_cpu_hotplug_init()
868 smp_ops->cpu_disable = pseries_cpu_disable; in pseries_cpu_hotplug_init()
869 smp_ops->cpu_die = pseries_cpu_die; in pseries_cpu_hotplug_init()
876 return -ENOMEM; in pseries_cpu_hotplug_init()