[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-ppc] [PATCH v4 07/17] spapr_rtas: add ibm, configure-connector RTA
From: |
Michael Roth |
Subject: |
[Qemu-ppc] [PATCH v4 07/17] spapr_rtas: add ibm, configure-connector RTAS interface |
Date: |
Tue, 23 Dec 2014 06:30:21 -0600 |
Signed-off-by: Michael Roth <address@hidden>
---
hw/ppc/spapr_rtas.c | 81 +++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 81 insertions(+)
diff --git a/hw/ppc/spapr_rtas.c b/hw/ppc/spapr_rtas.c
index 13e6e55..d847f45 100644
--- a/hw/ppc/spapr_rtas.c
+++ b/hw/ppc/spapr_rtas.c
@@ -422,6 +422,85 @@ static void rtas_get_sensor_state(PowerPCCPU *cpu,
sPAPREnvironment *spapr,
rtas_st(rets, 1, entity_sense);
}
+/* configure-connector work area offsets, int32_t units for field
+ * indexes, bytes for field offset/len values.
+ *
+ * as documented by PAPR+ v2.7, 13.5.3.5
+ */
+#define CC_IDX_NODE_NAME_OFFSET 2
+#define CC_IDX_PROP_NAME_OFFSET 2
+#define CC_IDX_PROP_LEN 3
+#define CC_IDX_PROP_DATA_OFFSET 4
+#define CC_VAL_DATA_OFFSET ((CC_IDX_PROP_DATA_OFFSET + 1) * 4)
+#define CC_WA_LEN 4096
+
+static void rtas_ibm_configure_connector(PowerPCCPU *cpu,
+ sPAPREnvironment *spapr,
+ uint32_t token, uint32_t nargs,
+ target_ulong args, uint32_t nret,
+ target_ulong rets)
+{
+ uint64_t wa_addr = ((uint64_t)rtas_ld(args, 1) << 32) | rtas_ld(args, 0);
+ uint64_t wa_offset;
+ uint32_t drc_index;
+ sPAPRDRConnector *drc;
+ sPAPRDRConnectorClass *drck;
+ sPAPRDRCCResponse resp;
+ const struct fdt_property *prop = NULL;
+ char *prop_name = NULL;
+ int prop_len, rc;
+
+ drc_index = rtas_ld(wa_addr, 0);
+ drc = spapr_dr_connector_by_index(drc_index);
+ if (!drc) {
+ DPRINTF("rtas_ibm_configure_connector: invalid sensor/DRC index:
%xh\n",
+ drc_index);
+ rc = RTAS_OUT_PARAM_ERROR;
+ goto out;
+ }
+ drck = SPAPR_DR_CONNECTOR_GET_CLASS(drc);
+ resp = drck->configure_connector(drc, &prop_name, &prop, &prop_len);
+
+ switch (resp) {
+ case SPAPR_DR_CC_RESPONSE_NEXT_CHILD:
+ /* provide the name of the next OF node */
+ wa_offset = CC_VAL_DATA_OFFSET;
+ rtas_st(wa_addr, CC_IDX_NODE_NAME_OFFSET, wa_offset);
+ rtas_st_buffer_direct(wa_addr + wa_offset, CC_WA_LEN - wa_offset,
+ (uint8_t *)prop_name, strlen(prop_name) + 1);
+ break;
+ case SPAPR_DR_CC_RESPONSE_NEXT_PROPERTY:
+ /* provide the name of the next OF property */
+ wa_offset = CC_VAL_DATA_OFFSET;
+ rtas_st(wa_addr, CC_IDX_PROP_NAME_OFFSET, wa_offset);
+ rtas_st_buffer_direct(wa_addr + wa_offset, CC_WA_LEN - wa_offset,
+ (uint8_t *)prop_name, strlen(prop_name) + 1);
+
+ /* provide the length and value of the OF property. data gets placed
+ * immediately after NULL terminator of the OF property's name string
+ */
+ wa_offset += strlen(prop_name) + 1,
+ rtas_st(wa_addr, CC_IDX_PROP_LEN, prop_len);
+ rtas_st(wa_addr, CC_IDX_PROP_DATA_OFFSET, wa_offset);
+ rtas_st_buffer_direct(wa_addr + wa_offset, CC_WA_LEN - wa_offset,
+ (uint8_t *)((struct fdt_property *)prop)->data,
+ prop_len);
+ break;
+ case SPAPR_DR_CC_RESPONSE_PREV_PARENT:
+ case SPAPR_DR_CC_RESPONSE_ERROR:
+ case SPAPR_DR_CC_RESPONSE_SUCCESS:
+ break;
+ default:
+ /* drck->configure_connector() should not return anything else */
+ g_assert(false);
+ }
+
+ rc = resp;
+out:
+ g_free(prop_name);
+ rtas_st(rets, 0, rc);
+}
+
static struct rtas_call {
const char *name;
spapr_rtas_fn fn;
@@ -559,6 +638,8 @@ static void core_rtas_register_types(void)
rtas_set_indicator);
spapr_rtas_register(RTAS_GET_SENSOR_STATE, "get-sensor-state",
rtas_get_sensor_state);
+ spapr_rtas_register(RTAS_IBM_CONFIGURE_CONNECTOR,
"ibm,configure-connector",
+ rtas_ibm_configure_connector);
}
type_init(core_rtas_register_types)
--
1.9.1
- [Qemu-ppc] [PATCH v4 00/17] spapr: add support for pci hotplug, Michael Roth, 2014/12/23
- [Qemu-ppc] [PATCH v4 01/17] docs: add sPAPR hotplug/dynamic-reconfiguration documentation, Michael Roth, 2014/12/23
- [Qemu-ppc] [PATCH v4 04/17] spapr_rtas: add set-indicator RTAS interface, Michael Roth, 2014/12/23
- [Qemu-ppc] [PATCH v4 05/17] spapr_rtas: add get-sensor-state RTAS interface, Michael Roth, 2014/12/23
- [Qemu-ppc] [PATCH v4 03/17] spapr_rtas: add get/set-power-level RTAS interfaces, Michael Roth, 2014/12/23
- [Qemu-ppc] [PATCH v4 06/17] spapr: add rtas_st_buffer_direct() helper, Michael Roth, 2014/12/23
- [Qemu-ppc] [PATCH v4 02/17] spapr_drc: initial implementation of sPAPRDRConnector device, Michael Roth, 2014/12/23
- [Qemu-ppc] [PATCH v4 07/17] spapr_rtas: add ibm, configure-connector RTAS interface,
Michael Roth <=
- [Qemu-ppc] [PATCH v4 08/17] spapr_events: re-use EPOW event infrastructure for hotplug events, Michael Roth, 2014/12/23
- [Qemu-ppc] [PATCH v4 09/17] spapr_events: event-scan RTAS interface, Michael Roth, 2014/12/23
- [Qemu-ppc] [PATCH v4 11/17] spapr: introduce pseries-2.3 machine type, Michael Roth, 2014/12/23
- [Qemu-ppc] [PATCH v4 10/17] spapr_drc: add spapr_drc_populate_dt(), Michael Roth, 2014/12/23
- [Qemu-ppc] [PATCH v4 12/17] spapr_pci: add dynamic-reconfiguration option for spapr-pci-host-bridge, Michael Roth, 2014/12/23
- [Qemu-ppc] [PATCH v4 13/17] spapr_pci: create DRConnectors for each PCI slot during PHB realize, Michael Roth, 2014/12/23
- [Qemu-ppc] [PATCH v4 14/17] spapr_pci: populate DRC dt entries for PHBs, Michael Roth, 2014/12/23
- [Qemu-ppc] [PATCH v4 16/17] spapr_pci: enable basic hotplug operations, Michael Roth, 2014/12/23
- [Qemu-ppc] [PATCH v4 15/17] pci: make pci_bar useable outside pci.c, Michael Roth, 2014/12/23
- [Qemu-ppc] [PATCH v4 17/17] spapr_pci: emit hotplug add/remove events during hotplug, Michael Roth, 2014/12/23