Lines Matching +full:power +full:- +full:domain
10 * See the COPYING file in the top-level directory.
20 #include "qapi/qapi-events-qdev.h"
22 #include "qemu/error-report.h"
24 #include "hw/pci-host/spapr.h" /* spapr_phb_remove_pci_device_cb callback */
30 #define DRC_CONTAINER_PATH "dr-connector"
32 #define DRC_INDEX_ID_MASK ((1ULL << DRC_INDEX_TYPE_SHIFT) - 1)
38 return 1 << drck->typeshift; in spapr_drc_type()
46 * unique. this is how we encode the DRC type on bare-metal in spapr_drc_index()
49 return (drck->typeshift << DRC_INDEX_TYPE_SHIFT) in spapr_drc_index()
50 | (drc->id & DRC_INDEX_ID_MASK); in spapr_drc_index()
57 drck->release(drc->dev); in spapr_drc_release()
59 drc->unplug_requested = false; in spapr_drc_release()
60 g_free(drc->fdt); in spapr_drc_release()
61 drc->fdt = NULL; in spapr_drc_release()
62 drc->fdt_start_offset = 0; in spapr_drc_release()
64 drc->dev = NULL; in spapr_drc_release()
69 switch (drc->state) { in drc_isolate_physical()
80 drc->state = SPAPR_DRC_STATE_PHYSICAL_POWERON; in drc_isolate_physical()
82 if (drc->unplug_requested) { in drc_isolate_physical()
93 switch (drc->state) { in drc_unisolate_physical()
103 /* cannot unisolate a non-existent resource, and, or resources in drc_unisolate_physical()
107 if (!drc->dev) { in drc_unisolate_physical()
111 drc->state = SPAPR_DRC_STATE_PHYSICAL_UNISOLATE; in drc_unisolate_physical()
112 drc->ccs_offset = drc->fdt_start_offset; in drc_unisolate_physical()
113 drc->ccs_depth = 0; in drc_unisolate_physical()
120 switch (drc->state) { in drc_isolate_logical()
138 * in response to a hot unplug request that is based on drc-count. in drc_isolate_logical()
143 && !drc->unplug_requested) { in drc_isolate_logical()
147 drc->state = SPAPR_DRC_STATE_LOGICAL_AVAILABLE; in drc_isolate_logical()
156 switch (drc->state) { in drc_unisolate_logical()
163 if (drc->unplug_requested && drc->dev) { in drc_unisolate_logical()
167 spapr_memory_unplug_rollback(spapr, drc->dev); in drc_unisolate_logical()
170 drc->unplug_requested = false; in drc_unisolate_logical()
172 if (drc->dev->id) { in drc_unisolate_logical()
174 "for device %s", drc->dev->id); in drc_unisolate_logical()
177 qapi_event_send_device_unplug_guest_error(drc->dev->id, in drc_unisolate_logical()
178 drc->dev->canonical_path); in drc_unisolate_logical()
191 g_assert(drc->dev); in drc_unisolate_logical()
193 drc->state = SPAPR_DRC_STATE_LOGICAL_UNISOLATE; in drc_unisolate_logical()
194 drc->ccs_offset = drc->fdt_start_offset; in drc_unisolate_logical()
195 drc->ccs_depth = 0; in drc_unisolate_logical()
202 switch (drc->state) { in drc_set_usable()
216 * result in an RTAS return code of -3 / "no such indicator" in drc_set_usable()
218 if (!drc->dev) { in drc_set_usable()
221 if (drc->unplug_requested) { in drc_set_usable()
227 drc->state = SPAPR_DRC_STATE_LOGICAL_AVAILABLE; in drc_set_usable()
234 switch (drc->state) { in drc_set_unusable()
246 drc->state = SPAPR_DRC_STATE_LOGICAL_UNUSABLE; in drc_set_unusable()
247 if (drc->unplug_requested) { in drc_set_unusable()
260 /* human-readable name for a DRC to encode into the DT in spapr_drc_name()
281 return g_strdup_printf("%s%d", drck->drc_name_prefix, drc->id); in spapr_drc_name()
285 * dr-entity-sense sensor value
286 * returned via get-sensor-state RTAS calls
288 * based on the current allocation/indicator/power states
294 * power domain, where QEMU manages power state automatically as in physical_entity_sense()
295 * opposed to the guest. present, non-PCI resources are unaffected in physical_entity_sense()
296 * by power state. in physical_entity_sense()
298 return drc->dev ? SPAPR_DR_ENTITY_SENSE_PRESENT in physical_entity_sense()
304 switch (drc->state) { in logical_entity_sense()
310 g_assert(drc->dev); in logical_entity_sense()
333 if (!drc->fdt) { in prop_get_fdt()
339 fdt = drc->fdt; in prop_get_fdt()
340 fdt_offset = drc->fdt_start_offset; in prop_get_fdt()
367 fdt_depth--; in prop_get_fdt()
372 dt_name = fdt_string(fdt, fdt32_to_cpu(prop->nameoff)); in prop_get_fdt()
377 if (!visit_type_uint8(v, NULL, (uint8_t *)&prop->data[i], in prop_get_fdt()
401 g_assert(!drc->dev); in spapr_drc_attach()
402 g_assert((drc->state == SPAPR_DRC_STATE_LOGICAL_UNUSABLE) in spapr_drc_attach()
403 || (drc->state == SPAPR_DRC_STATE_PHYSICAL_POWERON)); in spapr_drc_attach()
405 drc->dev = d; in spapr_drc_attach()
408 object_get_typename(OBJECT(drc->dev)), in spapr_drc_attach()
409 (Object **)(&drc->dev), in spapr_drc_attach()
419 g_assert(drc->dev); in spapr_drc_unplug_request()
421 drc->unplug_requested = true; in spapr_drc_unplug_request()
423 if (drc->state != drck->empty_state) { in spapr_drc_unplug_request()
441 if (drc->unplug_requested) { in spapr_drc_reset()
446 if (drc->dev) { in spapr_drc_reset()
448 drc->state = drck->ready_state; in spapr_drc_reset()
451 * via configure-connector call if the guest requests. in spapr_drc_reset()
453 drc->ccs_offset = drc->fdt_start_offset; in spapr_drc_reset()
454 drc->ccs_depth = 0; in spapr_drc_reset()
456 drc->state = drck->empty_state; in spapr_drc_reset()
457 drc->ccs_offset = -1; in spapr_drc_reset()
458 drc->ccs_depth = -1; in spapr_drc_reset()
489 if (!drc->dev) { in spapr_drc_needed()
495 * not equal to the expected long-term state, which is the same as the in spapr_drc_needed()
498 return drc->state != drck->ready_state || in spapr_drc_needed()
546 drc->owner, child_name); in drc_realize()
568 drc->id = id; in spapr_dr_connector_new()
569 drc->owner = owner; in spapr_dr_connector_new()
570 prop_name = g_strdup_printf("dr-connector[%"PRIu32"]", in spapr_dr_connector_new()
584 object_property_add_uint32_ptr(obj, "id", &drc->id, OBJ_PROP_FLAG_READ); in spapr_dr_connector_instance_init()
589 drc->state = drck->empty_state; in spapr_dr_connector_instance_init()
598 dk->realize = drc_realize; in spapr_dr_connector_class_init()
599 dk->unrealize = drc_unrealize; in spapr_dr_connector_class_init()
604 dk->user_creatable = false; in spapr_dr_connector_class_init()
612 if ((drc->dev && (drcp->dr_indicator == SPAPR_DR_INDICATOR_ACTIVE)) in drc_physical_needed()
613 || (!drc->dev && (drcp->dr_indicator == SPAPR_DR_INDICATOR_INACTIVE))) { in drc_physical_needed()
635 if (drc->dev) { in drc_physical_reset()
636 drcp->dr_indicator = SPAPR_DR_INDICATOR_ACTIVE; in drc_physical_reset()
638 drcp->dr_indicator = SPAPR_DR_INDICATOR_INACTIVE; in drc_physical_reset()
673 dk->realize = realize_physical; in spapr_drc_physical_class_init()
674 dk->unrealize = unrealize_physical; in spapr_drc_physical_class_init()
675 drck->dr_entity_sense = physical_entity_sense; in spapr_drc_physical_class_init()
676 drck->isolate = drc_isolate_physical; in spapr_drc_physical_class_init()
677 drck->unisolate = drc_unisolate_physical; in spapr_drc_physical_class_init()
678 drck->ready_state = SPAPR_DRC_STATE_PHYSICAL_CONFIGURED; in spapr_drc_physical_class_init()
679 drck->empty_state = SPAPR_DRC_STATE_PHYSICAL_POWERON; in spapr_drc_physical_class_init()
686 drck->dr_entity_sense = logical_entity_sense; in spapr_drc_logical_class_init()
687 drck->isolate = drc_isolate_logical; in spapr_drc_logical_class_init()
688 drck->unisolate = drc_unisolate_logical; in spapr_drc_logical_class_init()
689 drck->ready_state = SPAPR_DRC_STATE_LOGICAL_CONFIGURED; in spapr_drc_logical_class_init()
690 drck->empty_state = SPAPR_DRC_STATE_LOGICAL_UNUSABLE; in spapr_drc_logical_class_init()
697 drck->typeshift = SPAPR_DR_CONNECTOR_TYPE_SHIFT_CPU; in spapr_drc_cpu_class_init()
698 drck->typename = "CPU"; in spapr_drc_cpu_class_init()
699 drck->drc_name_prefix = "CPU "; in spapr_drc_cpu_class_init()
700 drck->release = spapr_core_release; in spapr_drc_cpu_class_init()
701 drck->dt_populate = spapr_core_dt_populate; in spapr_drc_cpu_class_init()
708 drck->typeshift = SPAPR_DR_CONNECTOR_TYPE_SHIFT_PCI; in spapr_drc_pci_class_init()
709 drck->typename = "28"; in spapr_drc_pci_class_init()
710 drck->drc_name_prefix = "C"; in spapr_drc_pci_class_init()
711 drck->release = spapr_phb_remove_pci_device_cb; in spapr_drc_pci_class_init()
712 drck->dt_populate = spapr_pci_dt_populate; in spapr_drc_pci_class_init()
719 drck->typeshift = SPAPR_DR_CONNECTOR_TYPE_SHIFT_LMB; in spapr_drc_lmb_class_init()
720 drck->typename = "MEM"; in spapr_drc_lmb_class_init()
721 drck->drc_name_prefix = "LMB "; in spapr_drc_lmb_class_init()
722 drck->release = spapr_lmb_release; in spapr_drc_lmb_class_init()
723 drck->dt_populate = spapr_lmb_dt_populate; in spapr_drc_lmb_class_init()
730 drck->typeshift = SPAPR_DR_CONNECTOR_TYPE_SHIFT_PHB; in spapr_drc_phb_class_init()
731 drck->typename = "PHB"; in spapr_drc_phb_class_init()
732 drck->drc_name_prefix = "PHB "; in spapr_drc_phb_class_init()
733 drck->release = spapr_phb_release; in spapr_drc_phb_class_init()
734 drck->dt_populate = spapr_phb_dt_populate; in spapr_drc_phb_class_init()
741 drck->typeshift = SPAPR_DR_CONNECTOR_TYPE_SHIFT_PMEM; in spapr_drc_pmem_class_init()
742 drck->typename = "PMEM"; in spapr_drc_pmem_class_init()
743 drck->drc_name_prefix = "PMEM "; in spapr_drc_pmem_class_init()
744 drck->release = NULL; in spapr_drc_pmem_class_init()
745 drck->dt_populate = spapr_pmem_dt_populate; in spapr_drc_pmem_class_init()
820 return spapr_drc_by_index(drck->typeshift << DRC_INDEX_TYPE_SHIFT in spapr_drc_by_id()
858 g_assert(!fdt_get_property(fdt, offset, "ibm,drc-indexes", NULL)); in spapr_dt_drc()
860 /* the first entry of each properties is a 32-bit integer encoding in spapr_dt_drc()
882 if (!strstart(prop->type, "link<", NULL)) { in spapr_dt_drc()
886 obj = object_property_get_link(root_container, prop->name, in spapr_dt_drc()
891 if (owner && (drc->owner != owner)) { in spapr_dt_drc()
901 /* ibm,drc-indexes */ in spapr_dt_drc()
905 /* ibm,drc-power-domains */ in spapr_dt_drc()
906 drc_power_domain = cpu_to_be32(-1); in spapr_dt_drc()
909 /* ibm,drc-names */ in spapr_dt_drc()
912 drc_names = g_string_insert_len(drc_names, -1, "\0", 1); in spapr_dt_drc()
914 /* ibm,drc-types */ in spapr_dt_drc()
915 drc_types = g_string_append(drc_types, drck->typename); in spapr_dt_drc()
916 drc_types = g_string_insert_len(drc_types, -1, "\0", 1); in spapr_dt_drc()
922 *(uint32_t *)drc_indexes->data = cpu_to_be32(drc_count); in spapr_dt_drc()
923 *(uint32_t *)drc_power_domains->data = cpu_to_be32(drc_count); in spapr_dt_drc()
924 *(uint32_t *)drc_names->str = cpu_to_be32(drc_count); in spapr_dt_drc()
925 *(uint32_t *)drc_types->str = cpu_to_be32(drc_count); in spapr_dt_drc()
927 ret = fdt_setprop(fdt, offset, "ibm,drc-indexes", in spapr_dt_drc()
928 drc_indexes->data, in spapr_dt_drc()
929 drc_indexes->len * sizeof(uint32_t)); in spapr_dt_drc()
931 error_report("Couldn't create ibm,drc-indexes property"); in spapr_dt_drc()
935 ret = fdt_setprop(fdt, offset, "ibm,drc-power-domains", in spapr_dt_drc()
936 drc_power_domains->data, in spapr_dt_drc()
937 drc_power_domains->len * sizeof(uint32_t)); in spapr_dt_drc()
939 error_report("Couldn't finalize ibm,drc-power-domains property"); in spapr_dt_drc()
943 ret = fdt_setprop(fdt, offset, "ibm,drc-names", in spapr_dt_drc()
944 drc_names->str, drc_names->len); in spapr_dt_drc()
946 error_report("Couldn't finalize ibm,drc-names property"); in spapr_dt_drc()
950 ret = fdt_setprop(fdt, offset, "ibm,drc-types", in spapr_dt_drc()
951 drc_types->str, drc_types->len); in spapr_dt_drc()
953 error_report("Couldn't finalize ibm,drc-types property"); in spapr_dt_drc()
971 if (!strstart(prop->type, "link<", NULL)) { in spapr_drc_reset_all()
975 prop->name, in spapr_drc_reset_all()
1009 return drck->isolate(drc); in rtas_set_isolation_state()
1012 return drck->unisolate(drc); in rtas_set_isolation_state()
1056 SPAPR_DRC_PHYSICAL(drc)->dr_indicator = state; in rtas_set_dr_indicator()
1116 /* currently only DR-related sensors are implemented */ in rtas_get_sensor_state()
1130 sensor_state = drck->dr_entity_sense(drc); in rtas_get_sensor_state()
1137 /* configure-connector work area offsets, int32_t units for field
1153 buf, MIN(len, CC_WA_LEN - offset)); in configure_connector_st()
1185 if ((drc->state != SPAPR_DRC_STATE_LOGICAL_UNISOLATE) in rtas_ibm_configure_connector()
1186 && (drc->state != SPAPR_DRC_STATE_PHYSICAL_UNISOLATE) in rtas_ibm_configure_connector()
1187 && (drc->state != SPAPR_DRC_STATE_LOGICAL_CONFIGURED) in rtas_ibm_configure_connector()
1188 && (drc->state != SPAPR_DRC_STATE_PHYSICAL_CONFIGURED)) { in rtas_ibm_configure_connector()
1192 * allow configure-connector be called repeatedly. in rtas_ibm_configure_connector()
1205 drc->unplug_requested) { in rtas_ibm_configure_connector()
1206 spapr_memory_unplug_rollback(spapr, drc->dev); in rtas_ibm_configure_connector()
1209 if (!drc->fdt) { in rtas_ibm_configure_connector()
1215 if (drck->dt_populate(drc, spapr, fdt, &drc->fdt_start_offset, in rtas_ibm_configure_connector()
1222 drc->fdt = fdt; in rtas_ibm_configure_connector()
1223 drc->ccs_offset = drc->fdt_start_offset; in rtas_ibm_configure_connector()
1224 drc->ccs_depth = 0; in rtas_ibm_configure_connector()
1233 tag = fdt_next_tag(drc->fdt, drc->ccs_offset, &fdt_offset_next); in rtas_ibm_configure_connector()
1237 drc->ccs_depth++; in rtas_ibm_configure_connector()
1238 name = fdt_get_name(drc->fdt, drc->ccs_offset, NULL); in rtas_ibm_configure_connector()
1247 drc->ccs_depth--; in rtas_ibm_configure_connector()
1248 if (drc->ccs_depth == 0) { in rtas_ibm_configure_connector()
1251 drc->state = drck->ready_state; in rtas_ibm_configure_connector()
1254 * again via configure-connector call if the guest requests. in rtas_ibm_configure_connector()
1256 drc->ccs_offset = drc->fdt_start_offset; in rtas_ibm_configure_connector()
1257 drc->ccs_depth = 0; in rtas_ibm_configure_connector()
1258 fdt_offset_next = drc->fdt_start_offset; in rtas_ibm_configure_connector()
1265 prop = fdt_get_property_by_offset(drc->fdt, drc->ccs_offset, in rtas_ibm_configure_connector()
1267 name = fdt_string(drc->fdt, fdt32_to_cpu(prop->nameoff)); in rtas_ibm_configure_connector()
1281 configure_connector_st(wa_addr, wa_offset, prop->data, prop_len); in rtas_ibm_configure_connector()
1290 if (drc->ccs_offset >= 0) { in rtas_ibm_configure_connector()
1291 drc->ccs_offset = fdt_offset_next; in rtas_ibm_configure_connector()
1311 spapr_rtas_register(RTAS_SET_INDICATOR, "set-indicator", in spapr_drc_register_types()
1313 spapr_rtas_register(RTAS_GET_SENSOR_STATE, "get-sensor-state", in spapr_drc_register_types()
1315 spapr_rtas_register(RTAS_IBM_CONFIGURE_CONNECTOR, "ibm,configure-connector", in spapr_drc_register_types()