Lines Matching full:drc

34 SpaprDrcType spapr_drc_type(SpaprDrc *drc)  in spapr_drc_type()  argument
36 SpaprDrcClass *drck = SPAPR_DR_CONNECTOR_GET_CLASS(drc); in spapr_drc_type()
41 uint32_t spapr_drc_index(SpaprDrc *drc) in spapr_drc_index() argument
43 SpaprDrcClass *drck = SPAPR_DR_CONNECTOR_GET_CLASS(drc); in spapr_drc_index()
45 /* no set format for a drc index: it only needs to be globally in spapr_drc_index()
46 * unique. this is how we encode the DRC type on bare-metal in spapr_drc_index()
50 | (drc->id & DRC_INDEX_ID_MASK); in spapr_drc_index()
53 static void spapr_drc_release(SpaprDrc *drc) in spapr_drc_release() argument
55 SpaprDrcClass *drck = SPAPR_DR_CONNECTOR_GET_CLASS(drc); in spapr_drc_release()
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()
63 object_property_del(OBJECT(drc), "device"); in spapr_drc_release()
64 drc->dev = NULL; in spapr_drc_release()
67 static uint32_t drc_isolate_physical(SpaprDrc *drc) in drc_isolate_physical() argument
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()
83 uint32_t drc_index = spapr_drc_index(drc); in drc_isolate_physical()
85 spapr_drc_release(drc); in drc_isolate_physical()
91 static uint32_t drc_unisolate_physical(SpaprDrc *drc) in drc_unisolate_physical() argument
93 switch (drc->state) { 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()
118 static uint32_t drc_isolate_logical(SpaprDrc *drc) in drc_isolate_logical() argument
120 switch (drc->state) { in drc_isolate_logical()
133 * Fail any requests to ISOLATE the LMB DRC if this LMB doesn't in drc_isolate_logical()
138 * in response to a hot unplug request that is based on drc-count. in drc_isolate_logical()
142 if (spapr_drc_type(drc) == SPAPR_DR_CONNECTOR_TYPE_LMB in drc_isolate_logical()
143 && !drc->unplug_requested) { in drc_isolate_logical()
147 drc->state = SPAPR_DRC_STATE_LOGICAL_AVAILABLE; in drc_isolate_logical()
152 static uint32_t drc_unisolate_logical(SpaprDrc *drc) in drc_unisolate_logical() argument
156 switch (drc->state) { in drc_unisolate_logical()
160 * Unisolating a logical DRC that was marked for unplug in drc_unisolate_logical()
163 if (drc->unplug_requested && drc->dev) { in drc_unisolate_logical()
164 if (spapr_drc_type(drc) == SPAPR_DR_CONNECTOR_TYPE_LMB) { 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()
200 static uint32_t drc_set_usable(SpaprDrc *drc) in drc_set_usable() argument
202 switch (drc->state) { in drc_set_usable()
213 /* if there's no resource/device associated with the DRC, there's 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()
232 static uint32_t drc_set_unusable(SpaprDrc *drc) in drc_set_unusable() argument
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()
248 uint32_t drc_index = spapr_drc_index(drc); in drc_set_unusable()
250 spapr_drc_release(drc); in drc_set_unusable()
256 static char *spapr_drc_name(SpaprDrc *drc) in spapr_drc_name() argument
258 SpaprDrcClass *drck = SPAPR_DR_CONNECTOR_GET_CLASS(drc); in spapr_drc_name()
260 /* human-readable name for a DRC to encode into the DT in spapr_drc_name()
262 * of the unique DRC index. in spapr_drc_name()
265 * code" that maps a logical device/function (DRC index) to a in spapr_drc_name()
271 * issues than guest compatibility, we choose location codes/DRC in spapr_drc_name()
278 * DRC names as documented by PAPR+ v2.7, 13.5.2.4 in spapr_drc_name()
281 return g_strdup_printf("%s%d", drck->drc_name_prefix, drc->id); in spapr_drc_name()
291 static SpaprDREntitySense physical_entity_sense(SpaprDrc *drc) in physical_entity_sense() argument
298 return drc->dev ? SPAPR_DR_ENTITY_SENSE_PRESENT in physical_entity_sense()
302 static SpaprDREntitySense logical_entity_sense(SpaprDrc *drc) in logical_entity_sense() argument
304 switch (drc->state) { in logical_entity_sense()
310 g_assert(drc->dev); in logical_entity_sense()
320 SpaprDrc *drc = SPAPR_DR_CONNECTOR(obj); in prop_get_index() local
321 uint32_t value = spapr_drc_index(drc); in prop_get_index()
328 SpaprDrc *drc = SPAPR_DR_CONNECTOR(obj); in prop_get_fdt() local
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()
397 void spapr_drc_attach(SpaprDrc *drc, DeviceState *d) in spapr_drc_attach() argument
399 trace_spapr_drc_attach(spapr_drc_index(drc)); in spapr_drc_attach()
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()
407 object_property_add_link(OBJECT(drc), "device", in spapr_drc_attach()
408 object_get_typename(OBJECT(drc->dev)), in spapr_drc_attach()
409 (Object **)(&drc->dev), in spapr_drc_attach()
413 void spapr_drc_unplug_request(SpaprDrc *drc) in spapr_drc_unplug_request() argument
415 SpaprDrcClass *drck = SPAPR_DR_CONNECTOR_GET_CLASS(drc); in spapr_drc_unplug_request()
417 trace_spapr_drc_unplug_request(spapr_drc_index(drc)); in spapr_drc_unplug_request()
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()
424 trace_spapr_drc_awaiting_quiesce(spapr_drc_index(drc)); in spapr_drc_unplug_request()
428 spapr_drc_release(drc); in spapr_drc_unplug_request()
431 bool spapr_drc_reset(SpaprDrc *drc) in spapr_drc_reset() argument
433 SpaprDrcClass *drck = SPAPR_DR_CONNECTOR_GET_CLASS(drc); in spapr_drc_reset()
436 trace_spapr_drc_reset(spapr_drc_index(drc)); in spapr_drc_reset()
441 if (drc->unplug_requested) { in spapr_drc_reset()
442 spapr_drc_release(drc); in spapr_drc_reset()
446 if (drc->dev) { in spapr_drc_reset()
448 drc->state = drck->ready_state; 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()
482 SpaprDrc *drc = opaque; in spapr_drc_needed() local
483 SpaprDrcClass *drck = SPAPR_DR_CONNECTOR_GET_CLASS(drc); in spapr_drc_needed()
486 * If no dev is plugged in there is no need to migrate the DRC state in spapr_drc_needed()
487 * nor to reset the DRC at CAS. in spapr_drc_needed()
489 if (!drc->dev) { in spapr_drc_needed()
494 * We need to reset the DRC at CAS or to migrate the DRC state if it's in spapr_drc_needed()
498 return drc->state != drck->ready_state || in spapr_drc_needed()
499 spapr_drc_unplug_requested(drc); in spapr_drc_needed()
519 SpaprDrc *drc = SPAPR_DR_CONNECTOR(d); in drc_realize() local
520 g_autofree gchar *link_name = g_strdup_printf("%x", spapr_drc_index(drc)); in drc_realize()
524 trace_spapr_drc_realize(spapr_drc_index(drc)); in drc_realize()
526 * that the guest will communicate with the DRC via RTAS calls in drc_realize()
527 * referencing the global DRC index. By unlinking the DRC in drc_realize()
533 child_name = object_get_canonical_path_component(OBJECT(drc)); in drc_realize()
534 trace_spapr_drc_realize_child(spapr_drc_index(drc), child_name); in drc_realize()
536 drc->owner, child_name); in drc_realize()
537 vmstate_register(VMSTATE_IF(drc), spapr_drc_index(drc), &vmstate_spapr_drc, in drc_realize()
538 drc); in drc_realize()
539 trace_spapr_drc_realize_complete(spapr_drc_index(drc)); in drc_realize()
544 SpaprDrc *drc = SPAPR_DR_CONNECTOR(d); in drc_unrealize() local
545 g_autofree gchar *name = g_strdup_printf("%x", spapr_drc_index(drc)); in drc_unrealize()
548 trace_spapr_drc_unrealize(spapr_drc_index(drc)); in drc_unrealize()
549 vmstate_unregister(VMSTATE_IF(drc), &vmstate_spapr_drc, drc); in drc_unrealize()
557 SpaprDrc *drc = SPAPR_DR_CONNECTOR(object_new(type)); in spapr_dr_connector_new() local
560 drc->id = id; in spapr_dr_connector_new()
561 drc->owner = owner; in spapr_dr_connector_new()
563 spapr_drc_index(drc)); in spapr_dr_connector_new()
564 object_property_add_child(owner, prop_name, OBJECT(drc)); in spapr_dr_connector_new()
565 object_unref(OBJECT(drc)); in spapr_dr_connector_new()
566 qdev_realize(DEVICE(drc), NULL, NULL); in spapr_dr_connector_new()
568 return drc; in spapr_dr_connector_new()
573 SpaprDrc *drc = SPAPR_DR_CONNECTOR(obj); in spapr_dr_connector_instance_init() local
574 SpaprDrcClass *drck = SPAPR_DR_CONNECTOR_GET_CLASS(drc); in spapr_dr_connector_instance_init()
576 object_property_add_uint32_ptr(obj, "id", &drc->id, OBJ_PROP_FLAG_READ); in spapr_dr_connector_instance_init()
581 drc->state = drck->empty_state; in spapr_dr_connector_instance_init()
600 SpaprDrc *drc = SPAPR_DR_CONNECTOR(drcp); in drc_physical_needed() local
602 if ((drc->dev && (drcp->dr_indicator == SPAPR_DR_INDICATOR_ACTIVE)) in drc_physical_needed()
603 || (!drc->dev && (drcp->dr_indicator == SPAPR_DR_INDICATOR_INACTIVE))) { in drc_physical_needed()
622 SpaprDrc *drc = SPAPR_DR_CONNECTOR(opaque); in drc_physical_reset() local
623 SpaprDrcPhysical *drcp = SPAPR_DRC_PHYSICAL(drc); in drc_physical_reset()
625 if (drc->dev) { in drc_physical_reset()
820 * @owner: parent Object/DeviceState for which to generate DRC
825 * generate OF properties to describe DRC topology/indices to guests
849 g_assert(!fdt_get_property(fdt, offset, "ibm,drc-indexes", NULL)); in spapr_dt_drc()
868 SpaprDrc *drc; in spapr_dt_drc() local
879 drc = SPAPR_DR_CONNECTOR(obj); in spapr_dt_drc()
880 drck = SPAPR_DR_CONNECTOR_GET_CLASS(drc); in spapr_dt_drc()
882 if (owner && (drc->owner != owner)) { in spapr_dt_drc()
886 if ((spapr_drc_type(drc) & drc_type_mask) == 0) { in spapr_dt_drc()
892 /* ibm,drc-indexes */ in spapr_dt_drc()
893 drc_index = cpu_to_be32(spapr_drc_index(drc)); in spapr_dt_drc()
896 /* ibm,drc-power-domains */ in spapr_dt_drc()
900 /* ibm,drc-names */ in spapr_dt_drc()
901 drc_name = spapr_drc_name(drc); in spapr_dt_drc()
905 /* ibm,drc-types */ in spapr_dt_drc()
910 /* now write the drc count into the space we reserved at the in spapr_dt_drc()
918 ret = fdt_setprop(fdt, offset, "ibm,drc-indexes", in spapr_dt_drc()
922 error_report("Couldn't create ibm,drc-indexes property"); in spapr_dt_drc()
926 ret = fdt_setprop(fdt, offset, "ibm,drc-power-domains", in spapr_dt_drc()
930 error_report("Couldn't finalize ibm,drc-power-domains property"); in spapr_dt_drc()
934 ret = fdt_setprop(fdt, offset, "ibm,drc-names", in spapr_dt_drc()
937 error_report("Couldn't finalize ibm,drc-names property"); in spapr_dt_drc()
941 ret = fdt_setprop(fdt, offset, "ibm,drc-types", in spapr_dt_drc()
944 error_report("Couldn't finalize ibm,drc-types property"); in spapr_dt_drc()
960 SpaprDrc *drc; in spapr_drc_reset_all() local
965 drc = SPAPR_DR_CONNECTOR(object_property_get_link(drc_container, in spapr_drc_reset_all()
975 if (spapr_drc_reset(drc)) { in spapr_drc_reset_all()
987 SpaprDrc *drc = spapr_drc_by_index(idx); in rtas_set_isolation_state() local
990 if (!drc) { in rtas_set_isolation_state()
994 trace_spapr_drc_set_isolation_state(spapr_drc_index(drc), state); in rtas_set_isolation_state()
996 drck = SPAPR_DR_CONNECTOR_GET_CLASS(drc); in rtas_set_isolation_state()
1000 return drck->isolate(drc); in rtas_set_isolation_state()
1003 return drck->unisolate(drc); in rtas_set_isolation_state()
1012 SpaprDrc *drc = spapr_drc_by_index(idx); in rtas_set_allocation_state() local
1014 if (!drc || !object_dynamic_cast(OBJECT(drc), TYPE_SPAPR_DRC_LOGICAL)) { in rtas_set_allocation_state()
1018 trace_spapr_drc_set_allocation_state(spapr_drc_index(drc), state); in rtas_set_allocation_state()
1022 return drc_set_usable(drc); in rtas_set_allocation_state()
1025 return drc_set_unusable(drc); in rtas_set_allocation_state()
1034 SpaprDrc *drc = spapr_drc_by_index(idx); in rtas_set_dr_indicator() local
1036 if (!drc || !object_dynamic_cast(OBJECT(drc), TYPE_SPAPR_DRC_PHYSICAL)) { in rtas_set_dr_indicator()
1047 SPAPR_DRC_PHYSICAL(drc)->dr_indicator = state; in rtas_set_dr_indicator()
1094 SpaprDrc *drc; in rtas_get_sensor_state() local
1114 drc = spapr_drc_by_index(sensor_index); in rtas_get_sensor_state()
1115 if (!drc) { in rtas_get_sensor_state()
1120 drck = SPAPR_DR_CONNECTOR_GET_CLASS(drc); in rtas_get_sensor_state()
1121 sensor_state = drck->dr_entity_sense(drc); in rtas_get_sensor_state()
1156 SpaprDrc *drc; in rtas_ibm_configure_connector() local
1169 drc = spapr_drc_by_index(drc_index); in rtas_ibm_configure_connector()
1170 if (!drc) { in rtas_ibm_configure_connector()
1176 if ((drc->state != SPAPR_DRC_STATE_LOGICAL_UNISOLATE) in rtas_ibm_configure_connector()
1177 && (drc->state != SPAPR_DRC_STATE_PHYSICAL_UNISOLATE) in rtas_ibm_configure_connector()
1178 && (drc->state != SPAPR_DRC_STATE_LOGICAL_CONFIGURED) in rtas_ibm_configure_connector()
1179 && (drc->state != SPAPR_DRC_STATE_PHYSICAL_CONFIGURED)) { in rtas_ibm_configure_connector()
1189 drck = SPAPR_DR_CONNECTOR_GET_CLASS(drc); in rtas_ibm_configure_connector()
1195 if (spapr_drc_type(drc) == SPAPR_DR_CONNECTOR_TYPE_LMB && in rtas_ibm_configure_connector()
1196 drc->unplug_requested) { in rtas_ibm_configure_connector()
1197 spapr_memory_unplug_rollback(spapr, drc->dev); in rtas_ibm_configure_connector()
1200 if (!drc->fdt) { in rtas_ibm_configure_connector()
1206 if (drck->dt_populate(drc, spapr, fdt, &drc->fdt_start_offset, in rtas_ibm_configure_connector()
1213 drc->fdt = fdt; in rtas_ibm_configure_connector()
1214 drc->ccs_offset = drc->fdt_start_offset; in rtas_ibm_configure_connector()
1215 drc->ccs_depth = 0; in rtas_ibm_configure_connector()
1224 tag = fdt_next_tag(drc->fdt, drc->ccs_offset, &fdt_offset_next); in rtas_ibm_configure_connector()
1228 drc->ccs_depth++; in rtas_ibm_configure_connector()
1229 name = fdt_get_name(drc->fdt, drc->ccs_offset, NULL); in rtas_ibm_configure_connector()
1238 drc->ccs_depth--; in rtas_ibm_configure_connector()
1239 if (drc->ccs_depth == 0) { in rtas_ibm_configure_connector()
1242 drc->state = drck->ready_state; in rtas_ibm_configure_connector()
1247 drc->ccs_offset = drc->fdt_start_offset; in rtas_ibm_configure_connector()
1248 drc->ccs_depth = 0; in rtas_ibm_configure_connector()
1249 fdt_offset_next = drc->fdt_start_offset; in rtas_ibm_configure_connector()
1256 prop = fdt_get_property_by_offset(drc->fdt, drc->ccs_offset, in rtas_ibm_configure_connector()
1258 name = fdt_string(drc->fdt, fdt32_to_cpu(prop->nameoff)); in rtas_ibm_configure_connector()
1281 if (drc->ccs_offset >= 0) { in rtas_ibm_configure_connector()
1282 drc->ccs_offset = fdt_offset_next; in rtas_ibm_configure_connector()