From nobody Tue May 7 07:35:16 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; dkim=fail spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1496282197993145.45637741376947; Wed, 31 May 2017 18:56:37 -0700 (PDT) Received: from localhost ([::1]:34825 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dGFLo-0001Qr-KG for importer@patchew.org; Wed, 31 May 2017 21:56:36 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:56377) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dGFHv-0007Hv-1t for qemu-devel@nongnu.org; Wed, 31 May 2017 21:52:39 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dGFHp-0005uF-R0 for qemu-devel@nongnu.org; Wed, 31 May 2017 21:52:35 -0400 Received: from ozlabs.org ([103.22.144.67]:55991) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1dGFHo-0005rt-QB; Wed, 31 May 2017 21:52:29 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 3wdVhk1GwMz9sN4; Thu, 1 Jun 2017 11:52:21 +1000 (AEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1496281942; bh=ReAp1yqWyfBhv7SjpX6nfexPlmGzyhwwejlDOAM4Gio=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Q8nZl3ZjKpdKKNYvGBZigGkNdW/W5yCMj5EwMl6S7RlgDynZSD8QZgMot38brrVhg 6Tu5FS0cAEHKEPEx8y8k8LGYhB43XgBWgwSMImAgZHFh8Ub0GtOCRWsXTzeBCvW9YL e5IoEZmC+TSQW+PGA5nyMCsWJAaIAqrItbabq4Ug= From: David Gibson To: mdroth@linux.vnet.ibm.com Date: Thu, 1 Jun 2017 11:52:15 +1000 Message-Id: <20170601015218.9299-2-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.9.4 In-Reply-To: <20170601015218.9299-1-david@gibson.dropbear.id.au> References: <20170601015218.9299-1-david@gibson.dropbear.id.au> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 103.22.144.67 Subject: [Qemu-devel] [PATCH 1/4] spapr: Move DRC RTAS calls into spapr_drc.c X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: lvivier@redhat.com, nikunj@linux.vnet.ibm.com, sursingh@redhat.com, qemu-devel@nongnu.org, qemu-ppc@nongnu.org, bharata@linux.vnet.ibm.com, David Gibson Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Currently implementations of the RTAS calls related to DRCs are in spapr_rtas.c. They belong better in spapr_drc.c - that way they're closer to related code, and we'll be able to make some more things local. spapr_rtas.c was intended to contain the RTAS infrastructure and core calls that don't belong anywhere else, not every RTAS implementation. Code motion only. Signed-off-by: David Gibson Reviewed-by: Greg Kurz Tested-by: Daniel Barboza --- hw/ppc/spapr_drc.c | 322 ++++++++++++++++++++++++++++++++++++++++++++++++= ++-- hw/ppc/spapr_rtas.c | 304 ------------------------------------------------- 2 files changed, 315 insertions(+), 311 deletions(-) diff --git a/hw/ppc/spapr_drc.c b/hw/ppc/spapr_drc.c index cc2400b..ae8800d 100644 --- a/hw/ppc/spapr_drc.c +++ b/hw/ppc/spapr_drc.c @@ -27,6 +27,34 @@ #define DRC_INDEX_TYPE_SHIFT 28 #define DRC_INDEX_ID_MASK ((1ULL << DRC_INDEX_TYPE_SHIFT) - 1) =20 +static sPAPRConfigureConnectorState *spapr_ccs_find(sPAPRMachineState *spa= pr, + uint32_t drc_index) +{ + sPAPRConfigureConnectorState *ccs =3D NULL; + + QTAILQ_FOREACH(ccs, &spapr->ccs_list, next) { + if (ccs->drc_index =3D=3D drc_index) { + break; + } + } + + return ccs; +} + +static void spapr_ccs_add(sPAPRMachineState *spapr, + sPAPRConfigureConnectorState *ccs) +{ + g_assert(!spapr_ccs_find(spapr, ccs->drc_index)); + QTAILQ_INSERT_HEAD(&spapr->ccs_list, ccs, next); +} + +static void spapr_ccs_remove(sPAPRMachineState *spapr, + sPAPRConfigureConnectorState *ccs) +{ + QTAILQ_REMOVE(&spapr->ccs_list, ccs, next); + g_free(ccs); +} + static sPAPRDRConnectorTypeShift get_type_shift(sPAPRDRConnectorType type) { uint32_t shift =3D 0; @@ -747,13 +775,6 @@ static const TypeInfo spapr_dr_connector_info =3D { .class_init =3D spapr_dr_connector_class_init, }; =20 -static void spapr_drc_register_types(void) -{ - type_register_static(&spapr_dr_connector_info); -} - -type_init(spapr_drc_register_types) - /* helper functions for external users */ =20 sPAPRDRConnector *spapr_dr_connector_by_index(uint32_t index) @@ -932,3 +953,290 @@ out: =20 return ret; } + +/* + * RTAS calls + */ + +static bool sensor_type_is_dr(uint32_t sensor_type) +{ + switch (sensor_type) { + case RTAS_SENSOR_TYPE_ISOLATION_STATE: + case RTAS_SENSOR_TYPE_DR: + case RTAS_SENSOR_TYPE_ALLOCATION_STATE: + return true; + } + + return false; +} + +static void rtas_set_indicator(PowerPCCPU *cpu, sPAPRMachineState *spapr, + uint32_t token, uint32_t nargs, + target_ulong args, uint32_t nret, + target_ulong rets) +{ + uint32_t sensor_type; + uint32_t sensor_index; + uint32_t sensor_state; + uint32_t ret =3D RTAS_OUT_SUCCESS; + sPAPRDRConnector *drc; + sPAPRDRConnectorClass *drck; + + if (nargs !=3D 3 || nret !=3D 1) { + ret =3D RTAS_OUT_PARAM_ERROR; + goto out; + } + + sensor_type =3D rtas_ld(args, 0); + sensor_index =3D rtas_ld(args, 1); + sensor_state =3D rtas_ld(args, 2); + + if (!sensor_type_is_dr(sensor_type)) { + goto out_unimplemented; + } + + /* if this is a DR sensor we can assume sensor_index =3D=3D drc_index = */ + drc =3D spapr_dr_connector_by_index(sensor_index); + if (!drc) { + trace_spapr_rtas_set_indicator_invalid(sensor_index); + ret =3D RTAS_OUT_PARAM_ERROR; + goto out; + } + drck =3D SPAPR_DR_CONNECTOR_GET_CLASS(drc); + + switch (sensor_type) { + case RTAS_SENSOR_TYPE_ISOLATION_STATE: + /* if the guest is configuring a device attached to this + * DRC, we should reset the configuration state at this + * point since it may no longer be reliable (guest released + * device and needs to start over, or unplug occurred so + * the FDT is no longer valid) + */ + if (sensor_state =3D=3D SPAPR_DR_ISOLATION_STATE_ISOLATED) { + sPAPRConfigureConnectorState *ccs =3D spapr_ccs_find(spapr, + sensor_inde= x); + if (ccs) { + spapr_ccs_remove(spapr, ccs); + } + } + ret =3D drck->set_isolation_state(drc, sensor_state); + break; + case RTAS_SENSOR_TYPE_DR: + ret =3D drck->set_indicator_state(drc, sensor_state); + break; + case RTAS_SENSOR_TYPE_ALLOCATION_STATE: + ret =3D drck->set_allocation_state(drc, sensor_state); + break; + default: + goto out_unimplemented; + } + +out: + rtas_st(rets, 0, ret); + return; + +out_unimplemented: + /* currently only DR-related sensors are implemented */ + trace_spapr_rtas_set_indicator_not_supported(sensor_index, sensor_type= ); + rtas_st(rets, 0, RTAS_OUT_NOT_SUPPORTED); +} + +static void rtas_get_sensor_state(PowerPCCPU *cpu, sPAPRMachineState *spap= r, + uint32_t token, uint32_t nargs, + target_ulong args, uint32_t nret, + target_ulong rets) +{ + uint32_t sensor_type; + uint32_t sensor_index; + uint32_t sensor_state =3D 0; + sPAPRDRConnector *drc; + sPAPRDRConnectorClass *drck; + uint32_t ret =3D RTAS_OUT_SUCCESS; + + if (nargs !=3D 2 || nret !=3D 2) { + ret =3D RTAS_OUT_PARAM_ERROR; + goto out; + } + + sensor_type =3D rtas_ld(args, 0); + sensor_index =3D rtas_ld(args, 1); + + if (sensor_type !=3D RTAS_SENSOR_TYPE_ENTITY_SENSE) { + /* currently only DR-related sensors are implemented */ + trace_spapr_rtas_get_sensor_state_not_supported(sensor_index, + sensor_type); + ret =3D RTAS_OUT_NOT_SUPPORTED; + goto out; + } + + drc =3D spapr_dr_connector_by_index(sensor_index); + if (!drc) { + trace_spapr_rtas_get_sensor_state_invalid(sensor_index); + ret =3D RTAS_OUT_PARAM_ERROR; + goto out; + } + drck =3D SPAPR_DR_CONNECTOR_GET_CLASS(drc); + ret =3D drck->entity_sense(drc, &sensor_state); + +out: + rtas_st(rets, 0, ret); + rtas_st(rets, 1, sensor_state); +} + +/* 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 configure_connector_st(target_ulong addr, target_ulong offset, + const void *buf, size_t len) +{ + cpu_physical_memory_write(ppc64_phys_to_real(addr + offset), + buf, MIN(len, CC_WA_LEN - offset)); +} + +void spapr_ccs_reset_hook(void *opaque) +{ + sPAPRMachineState *spapr =3D opaque; + sPAPRConfigureConnectorState *ccs, *ccs_tmp; + + QTAILQ_FOREACH_SAFE(ccs, &spapr->ccs_list, next, ccs_tmp) { + spapr_ccs_remove(spapr, ccs); + } +} + +static void rtas_ibm_configure_connector(PowerPCCPU *cpu, + sPAPRMachineState *spapr, + uint32_t token, uint32_t nargs, + target_ulong args, uint32_t nret, + target_ulong rets) +{ + uint64_t wa_addr; + uint64_t wa_offset; + uint32_t drc_index; + sPAPRDRConnector *drc; + sPAPRDRConnectorClass *drck; + sPAPRConfigureConnectorState *ccs; + sPAPRDRCCResponse resp =3D SPAPR_DR_CC_RESPONSE_CONTINUE; + int rc; + const void *fdt; + + if (nargs !=3D 2 || nret !=3D 1) { + rtas_st(rets, 0, RTAS_OUT_PARAM_ERROR); + return; + } + + wa_addr =3D ((uint64_t)rtas_ld(args, 1) << 32) | rtas_ld(args, 0); + + drc_index =3D rtas_ld(wa_addr, 0); + drc =3D spapr_dr_connector_by_index(drc_index); + if (!drc) { + trace_spapr_rtas_ibm_configure_connector_invalid(drc_index); + rc =3D RTAS_OUT_PARAM_ERROR; + goto out; + } + + drck =3D SPAPR_DR_CONNECTOR_GET_CLASS(drc); + fdt =3D drck->get_fdt(drc, NULL); + if (!fdt) { + trace_spapr_rtas_ibm_configure_connector_missing_fdt(drc_index); + rc =3D SPAPR_DR_CC_RESPONSE_NOT_CONFIGURABLE; + goto out; + } + + ccs =3D spapr_ccs_find(spapr, drc_index); + if (!ccs) { + ccs =3D g_new0(sPAPRConfigureConnectorState, 1); + (void)drck->get_fdt(drc, &ccs->fdt_offset); + ccs->drc_index =3D drc_index; + spapr_ccs_add(spapr, ccs); + } + + do { + uint32_t tag; + const char *name; + const struct fdt_property *prop; + int fdt_offset_next, prop_len; + + tag =3D fdt_next_tag(fdt, ccs->fdt_offset, &fdt_offset_next); + + switch (tag) { + case FDT_BEGIN_NODE: + ccs->fdt_depth++; + name =3D fdt_get_name(fdt, ccs->fdt_offset, NULL); + + /* provide the name of the next OF node */ + wa_offset =3D CC_VAL_DATA_OFFSET; + rtas_st(wa_addr, CC_IDX_NODE_NAME_OFFSET, wa_offset); + configure_connector_st(wa_addr, wa_offset, name, strlen(name) = + 1); + resp =3D SPAPR_DR_CC_RESPONSE_NEXT_CHILD; + break; + case FDT_END_NODE: + ccs->fdt_depth--; + if (ccs->fdt_depth =3D=3D 0) { + /* done sending the device tree, don't need to track + * the state anymore + */ + drck->set_configured(drc); + spapr_ccs_remove(spapr, ccs); + ccs =3D NULL; + resp =3D SPAPR_DR_CC_RESPONSE_SUCCESS; + } else { + resp =3D SPAPR_DR_CC_RESPONSE_PREV_PARENT; + } + break; + case FDT_PROP: + prop =3D fdt_get_property_by_offset(fdt, ccs->fdt_offset, + &prop_len); + name =3D fdt_string(fdt, fdt32_to_cpu(prop->nameoff)); + + /* provide the name of the next OF property */ + wa_offset =3D CC_VAL_DATA_OFFSET; + rtas_st(wa_addr, CC_IDX_PROP_NAME_OFFSET, wa_offset); + configure_connector_st(wa_addr, wa_offset, name, strlen(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 +=3D strlen(name) + 1, + rtas_st(wa_addr, CC_IDX_PROP_LEN, prop_len); + rtas_st(wa_addr, CC_IDX_PROP_DATA_OFFSET, wa_offset); + configure_connector_st(wa_addr, wa_offset, prop->data, prop_le= n); + resp =3D SPAPR_DR_CC_RESPONSE_NEXT_PROPERTY; + break; + case FDT_END: + resp =3D SPAPR_DR_CC_RESPONSE_ERROR; + default: + /* keep seeking for an actionable tag */ + break; + } + if (ccs) { + ccs->fdt_offset =3D fdt_offset_next; + } + } while (resp =3D=3D SPAPR_DR_CC_RESPONSE_CONTINUE); + + rc =3D resp; +out: + rtas_st(rets, 0, rc); +} + +static void spapr_drc_register_types(void) +{ + type_register_static(&spapr_dr_connector_info); + + spapr_rtas_register(RTAS_SET_INDICATOR, "set-indicator", + 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-conne= ctor", + rtas_ibm_configure_connector); +} +type_init(spapr_drc_register_types) diff --git a/hw/ppc/spapr_rtas.c b/hw/ppc/spapr_rtas.c index 128d993..0bdb5fc 100644 --- a/hw/ppc/spapr_rtas.c +++ b/hw/ppc/spapr_rtas.c @@ -48,44 +48,6 @@ #include "trace.h" #include "hw/ppc/fdt.h" =20 -static sPAPRConfigureConnectorState *spapr_ccs_find(sPAPRMachineState *spa= pr, - uint32_t drc_index) -{ - sPAPRConfigureConnectorState *ccs =3D NULL; - - QTAILQ_FOREACH(ccs, &spapr->ccs_list, next) { - if (ccs->drc_index =3D=3D drc_index) { - break; - } - } - - return ccs; -} - -static void spapr_ccs_add(sPAPRMachineState *spapr, - sPAPRConfigureConnectorState *ccs) -{ - g_assert(!spapr_ccs_find(spapr, ccs->drc_index)); - QTAILQ_INSERT_HEAD(&spapr->ccs_list, ccs, next); -} - -static void spapr_ccs_remove(sPAPRMachineState *spapr, - sPAPRConfigureConnectorState *ccs) -{ - QTAILQ_REMOVE(&spapr->ccs_list, ccs, next); - g_free(ccs); -} - -void spapr_ccs_reset_hook(void *opaque) -{ - sPAPRMachineState *spapr =3D opaque; - sPAPRConfigureConnectorState *ccs, *ccs_tmp; - - QTAILQ_FOREACH_SAFE(ccs, &spapr->ccs_list, next, ccs_tmp) { - spapr_ccs_remove(spapr, ccs); - } -} - static void rtas_display_character(PowerPCCPU *cpu, sPAPRMachineState *spa= pr, uint32_t token, uint32_t nargs, target_ulong args, @@ -390,266 +352,6 @@ static void rtas_get_power_level(PowerPCCPU *cpu, sPA= PRMachineState *spapr, rtas_st(rets, 1, 100); } =20 -static bool sensor_type_is_dr(uint32_t sensor_type) -{ - switch (sensor_type) { - case RTAS_SENSOR_TYPE_ISOLATION_STATE: - case RTAS_SENSOR_TYPE_DR: - case RTAS_SENSOR_TYPE_ALLOCATION_STATE: - return true; - } - - return false; -} - -static void rtas_set_indicator(PowerPCCPU *cpu, sPAPRMachineState *spapr, - uint32_t token, uint32_t nargs, - target_ulong args, uint32_t nret, - target_ulong rets) -{ - uint32_t sensor_type; - uint32_t sensor_index; - uint32_t sensor_state; - uint32_t ret =3D RTAS_OUT_SUCCESS; - sPAPRDRConnector *drc; - sPAPRDRConnectorClass *drck; - - if (nargs !=3D 3 || nret !=3D 1) { - ret =3D RTAS_OUT_PARAM_ERROR; - goto out; - } - - sensor_type =3D rtas_ld(args, 0); - sensor_index =3D rtas_ld(args, 1); - sensor_state =3D rtas_ld(args, 2); - - if (!sensor_type_is_dr(sensor_type)) { - goto out_unimplemented; - } - - /* if this is a DR sensor we can assume sensor_index =3D=3D drc_index = */ - drc =3D spapr_dr_connector_by_index(sensor_index); - if (!drc) { - trace_spapr_rtas_set_indicator_invalid(sensor_index); - ret =3D RTAS_OUT_PARAM_ERROR; - goto out; - } - drck =3D SPAPR_DR_CONNECTOR_GET_CLASS(drc); - - switch (sensor_type) { - case RTAS_SENSOR_TYPE_ISOLATION_STATE: - /* if the guest is configuring a device attached to this - * DRC, we should reset the configuration state at this - * point since it may no longer be reliable (guest released - * device and needs to start over, or unplug occurred so - * the FDT is no longer valid) - */ - if (sensor_state =3D=3D SPAPR_DR_ISOLATION_STATE_ISOLATED) { - sPAPRConfigureConnectorState *ccs =3D spapr_ccs_find(spapr, - sensor_inde= x); - if (ccs) { - spapr_ccs_remove(spapr, ccs); - } - } - ret =3D drck->set_isolation_state(drc, sensor_state); - break; - case RTAS_SENSOR_TYPE_DR: - ret =3D drck->set_indicator_state(drc, sensor_state); - break; - case RTAS_SENSOR_TYPE_ALLOCATION_STATE: - ret =3D drck->set_allocation_state(drc, sensor_state); - break; - default: - goto out_unimplemented; - } - -out: - rtas_st(rets, 0, ret); - return; - -out_unimplemented: - /* currently only DR-related sensors are implemented */ - trace_spapr_rtas_set_indicator_not_supported(sensor_index, sensor_type= ); - rtas_st(rets, 0, RTAS_OUT_NOT_SUPPORTED); -} - -static void rtas_get_sensor_state(PowerPCCPU *cpu, sPAPRMachineState *spap= r, - uint32_t token, uint32_t nargs, - target_ulong args, uint32_t nret, - target_ulong rets) -{ - uint32_t sensor_type; - uint32_t sensor_index; - uint32_t sensor_state =3D 0; - sPAPRDRConnector *drc; - sPAPRDRConnectorClass *drck; - uint32_t ret =3D RTAS_OUT_SUCCESS; - - if (nargs !=3D 2 || nret !=3D 2) { - ret =3D RTAS_OUT_PARAM_ERROR; - goto out; - } - - sensor_type =3D rtas_ld(args, 0); - sensor_index =3D rtas_ld(args, 1); - - if (sensor_type !=3D RTAS_SENSOR_TYPE_ENTITY_SENSE) { - /* currently only DR-related sensors are implemented */ - trace_spapr_rtas_get_sensor_state_not_supported(sensor_index, - sensor_type); - ret =3D RTAS_OUT_NOT_SUPPORTED; - goto out; - } - - drc =3D spapr_dr_connector_by_index(sensor_index); - if (!drc) { - trace_spapr_rtas_get_sensor_state_invalid(sensor_index); - ret =3D RTAS_OUT_PARAM_ERROR; - goto out; - } - drck =3D SPAPR_DR_CONNECTOR_GET_CLASS(drc); - ret =3D drck->entity_sense(drc, &sensor_state); - -out: - rtas_st(rets, 0, ret); - rtas_st(rets, 1, sensor_state); -} - -/* 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 configure_connector_st(target_ulong addr, target_ulong offset, - const void *buf, size_t len) -{ - cpu_physical_memory_write(ppc64_phys_to_real(addr + offset), - buf, MIN(len, CC_WA_LEN - offset)); -} - -static void rtas_ibm_configure_connector(PowerPCCPU *cpu, - sPAPRMachineState *spapr, - uint32_t token, uint32_t nargs, - target_ulong args, uint32_t nret, - target_ulong rets) -{ - uint64_t wa_addr; - uint64_t wa_offset; - uint32_t drc_index; - sPAPRDRConnector *drc; - sPAPRDRConnectorClass *drck; - sPAPRConfigureConnectorState *ccs; - sPAPRDRCCResponse resp =3D SPAPR_DR_CC_RESPONSE_CONTINUE; - int rc; - const void *fdt; - - if (nargs !=3D 2 || nret !=3D 1) { - rtas_st(rets, 0, RTAS_OUT_PARAM_ERROR); - return; - } - - wa_addr =3D ((uint64_t)rtas_ld(args, 1) << 32) | rtas_ld(args, 0); - - drc_index =3D rtas_ld(wa_addr, 0); - drc =3D spapr_dr_connector_by_index(drc_index); - if (!drc) { - trace_spapr_rtas_ibm_configure_connector_invalid(drc_index); - rc =3D RTAS_OUT_PARAM_ERROR; - goto out; - } - - drck =3D SPAPR_DR_CONNECTOR_GET_CLASS(drc); - fdt =3D drck->get_fdt(drc, NULL); - if (!fdt) { - trace_spapr_rtas_ibm_configure_connector_missing_fdt(drc_index); - rc =3D SPAPR_DR_CC_RESPONSE_NOT_CONFIGURABLE; - goto out; - } - - ccs =3D spapr_ccs_find(spapr, drc_index); - if (!ccs) { - ccs =3D g_new0(sPAPRConfigureConnectorState, 1); - (void)drck->get_fdt(drc, &ccs->fdt_offset); - ccs->drc_index =3D drc_index; - spapr_ccs_add(spapr, ccs); - } - - do { - uint32_t tag; - const char *name; - const struct fdt_property *prop; - int fdt_offset_next, prop_len; - - tag =3D fdt_next_tag(fdt, ccs->fdt_offset, &fdt_offset_next); - - switch (tag) { - case FDT_BEGIN_NODE: - ccs->fdt_depth++; - name =3D fdt_get_name(fdt, ccs->fdt_offset, NULL); - - /* provide the name of the next OF node */ - wa_offset =3D CC_VAL_DATA_OFFSET; - rtas_st(wa_addr, CC_IDX_NODE_NAME_OFFSET, wa_offset); - configure_connector_st(wa_addr, wa_offset, name, strlen(name) = + 1); - resp =3D SPAPR_DR_CC_RESPONSE_NEXT_CHILD; - break; - case FDT_END_NODE: - ccs->fdt_depth--; - if (ccs->fdt_depth =3D=3D 0) { - /* done sending the device tree, don't need to track - * the state anymore - */ - drck->set_configured(drc); - spapr_ccs_remove(spapr, ccs); - ccs =3D NULL; - resp =3D SPAPR_DR_CC_RESPONSE_SUCCESS; - } else { - resp =3D SPAPR_DR_CC_RESPONSE_PREV_PARENT; - } - break; - case FDT_PROP: - prop =3D fdt_get_property_by_offset(fdt, ccs->fdt_offset, - &prop_len); - name =3D fdt_string(fdt, fdt32_to_cpu(prop->nameoff)); - - /* provide the name of the next OF property */ - wa_offset =3D CC_VAL_DATA_OFFSET; - rtas_st(wa_addr, CC_IDX_PROP_NAME_OFFSET, wa_offset); - configure_connector_st(wa_addr, wa_offset, name, strlen(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 +=3D strlen(name) + 1, - rtas_st(wa_addr, CC_IDX_PROP_LEN, prop_len); - rtas_st(wa_addr, CC_IDX_PROP_DATA_OFFSET, wa_offset); - configure_connector_st(wa_addr, wa_offset, prop->data, prop_le= n); - resp =3D SPAPR_DR_CC_RESPONSE_NEXT_PROPERTY; - break; - case FDT_END: - resp =3D SPAPR_DR_CC_RESPONSE_ERROR; - default: - /* keep seeking for an actionable tag */ - break; - } - if (ccs) { - ccs->fdt_offset =3D fdt_offset_next; - } - } while (resp =3D=3D SPAPR_DR_CC_RESPONSE_CONTINUE); - - rc =3D resp; -out: - rtas_st(rets, 0, rc); -} - static struct rtas_call { const char *name; spapr_rtas_fn fn; @@ -791,12 +493,6 @@ static void core_rtas_register_types(void) rtas_set_power_level); spapr_rtas_register(RTAS_GET_POWER_LEVEL, "get-power-level", rtas_get_power_level); - spapr_rtas_register(RTAS_SET_INDICATOR, "set-indicator", - 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-conne= ctor", - rtas_ibm_configure_connector); } =20 type_init(core_rtas_register_types) --=20 2.9.4 From nobody Tue May 7 07:35:16 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; dkim=fail spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 149628218352128.173865065376503; Wed, 31 May 2017 18:56:23 -0700 (PDT) Received: from localhost ([::1]:34824 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dGFLZ-0001Ij-Uq for importer@patchew.org; Wed, 31 May 2017 21:56:21 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:56343) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dGFHs-0007Gx-VI for qemu-devel@nongnu.org; Wed, 31 May 2017 21:52:34 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dGFHp-0005ty-PV for qemu-devel@nongnu.org; Wed, 31 May 2017 21:52:32 -0400 Received: from ozlabs.org ([103.22.144.67]:40461) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1dGFHo-0005rs-Qc; Wed, 31 May 2017 21:52:29 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 3wdVhk37ZTz9sN8; Thu, 1 Jun 2017 11:52:22 +1000 (AEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1496281942; bh=RkBCIdY77fiXl0IyiU4u2Cw85edi1huQi0xRiYg3jfg=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=cvd9MiBwgvH+GzKx2b05kMzeIjkDwUQ5JoZxTH/wFygMn5LTgIsy+FINZrJvelkLs SNRRAF5Lj1jV9GHtssEg3Ym7B/idxjg5M0IEv0Bo7pW7bEI0uwvmkn5pXlf6AWbsYm +6RwC0bUXagZQAv9QObG7uBFnL98AYAwXh3GCUPI= From: David Gibson To: mdroth@linux.vnet.ibm.com Date: Thu, 1 Jun 2017 11:52:16 +1000 Message-Id: <20170601015218.9299-3-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.9.4 In-Reply-To: <20170601015218.9299-1-david@gibson.dropbear.id.au> References: <20170601015218.9299-1-david@gibson.dropbear.id.au> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 103.22.144.67 Subject: [Qemu-devel] [PATCH 2/4] spapr: Abolish DRC get_fdt method X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: lvivier@redhat.com, nikunj@linux.vnet.ibm.com, sursingh@redhat.com, qemu-devel@nongnu.org, qemu-ppc@nongnu.org, bharata@linux.vnet.ibm.com, David Gibson Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" The DRConnectorClass includes a get_fdt method. However * There's only one implementation, and there's only likely to ever be one * Both callers are local to spapr_drc * Each caller only uses one half of the actual implementation So abolish get_fdt() entirely, and just open-code what we need. Signed-off-by: David Gibson Reviewed-by: Greg Kurz Reviewed-by: Laurent Vivier Tested-by: Daniel Barboza --- hw/ppc/spapr_drc.c | 23 ++++++----------------- include/hw/ppc/spapr_drc.h | 1 - 2 files changed, 6 insertions(+), 18 deletions(-) diff --git a/hw/ppc/spapr_drc.c b/hw/ppc/spapr_drc.c index ae8800d..f5b7b68 100644 --- a/hw/ppc/spapr_drc.c +++ b/hw/ppc/spapr_drc.c @@ -199,14 +199,6 @@ static const char *get_name(sPAPRDRConnector *drc) return drc->name; } =20 -static const void *get_fdt(sPAPRDRConnector *drc, int *fdt_start_offset) -{ - if (fdt_start_offset) { - *fdt_start_offset =3D drc->fdt_start_offset; - } - return drc->fdt; -} - static void set_configured(sPAPRDRConnector *drc) { trace_spapr_drc_set_configured(get_index(drc)); @@ -753,7 +745,6 @@ static void spapr_dr_connector_class_init(ObjectClass *= k, void *data) drck->get_index =3D get_index; drck->get_type =3D get_type; drck->get_name =3D get_name; - drck->get_fdt =3D get_fdt; drck->set_configured =3D set_configured; drck->entity_sense =3D entity_sense; drck->attach =3D attach; @@ -1126,7 +1117,6 @@ static void rtas_ibm_configure_connector(PowerPCCPU *= cpu, sPAPRConfigureConnectorState *ccs; sPAPRDRCCResponse resp =3D SPAPR_DR_CC_RESPONSE_CONTINUE; int rc; - const void *fdt; =20 if (nargs !=3D 2 || nret !=3D 1) { rtas_st(rets, 0, RTAS_OUT_PARAM_ERROR); @@ -1144,8 +1134,7 @@ static void rtas_ibm_configure_connector(PowerPCCPU *= cpu, } =20 drck =3D SPAPR_DR_CONNECTOR_GET_CLASS(drc); - fdt =3D drck->get_fdt(drc, NULL); - if (!fdt) { + if (!drc->fdt) { trace_spapr_rtas_ibm_configure_connector_missing_fdt(drc_index); rc =3D SPAPR_DR_CC_RESPONSE_NOT_CONFIGURABLE; goto out; @@ -1154,7 +1143,7 @@ static void rtas_ibm_configure_connector(PowerPCCPU *= cpu, ccs =3D spapr_ccs_find(spapr, drc_index); if (!ccs) { ccs =3D g_new0(sPAPRConfigureConnectorState, 1); - (void)drck->get_fdt(drc, &ccs->fdt_offset); + ccs->fdt_offset =3D drc->fdt_start_offset; ccs->drc_index =3D drc_index; spapr_ccs_add(spapr, ccs); } @@ -1165,12 +1154,12 @@ static void rtas_ibm_configure_connector(PowerPCCPU= *cpu, const struct fdt_property *prop; int fdt_offset_next, prop_len; =20 - tag =3D fdt_next_tag(fdt, ccs->fdt_offset, &fdt_offset_next); + tag =3D fdt_next_tag(drc->fdt, ccs->fdt_offset, &fdt_offset_next); =20 switch (tag) { case FDT_BEGIN_NODE: ccs->fdt_depth++; - name =3D fdt_get_name(fdt, ccs->fdt_offset, NULL); + name =3D fdt_get_name(drc->fdt, ccs->fdt_offset, NULL); =20 /* provide the name of the next OF node */ wa_offset =3D CC_VAL_DATA_OFFSET; @@ -1193,9 +1182,9 @@ static void rtas_ibm_configure_connector(PowerPCCPU *= cpu, } break; case FDT_PROP: - prop =3D fdt_get_property_by_offset(fdt, ccs->fdt_offset, + prop =3D fdt_get_property_by_offset(drc->fdt, ccs->fdt_offset, &prop_len); - name =3D fdt_string(fdt, fdt32_to_cpu(prop->nameoff)); + name =3D fdt_string(drc->fdt, fdt32_to_cpu(prop->nameoff)); =20 /* provide the name of the next OF property */ wa_offset =3D CC_VAL_DATA_OFFSET; diff --git a/include/hw/ppc/spapr_drc.h b/include/hw/ppc/spapr_drc.h index 813b9ff..80db955 100644 --- a/include/hw/ppc/spapr_drc.h +++ b/include/hw/ppc/spapr_drc.h @@ -178,7 +178,6 @@ typedef struct sPAPRDRConnectorClass { uint32_t (*entity_sense)(sPAPRDRConnector *drc, sPAPRDREntitySense *st= ate); =20 /* QEMU interfaces for managing FDT/configure-connector */ - const void *(*get_fdt)(sPAPRDRConnector *drc, int *fdt_start_offset); void (*set_configured)(sPAPRDRConnector *drc); =20 /* QEMU interfaces for managing hotplug operations */ --=20 2.9.4 From nobody Tue May 7 07:35:16 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; dkim=fail spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1496282062981650.6885004408634; Wed, 31 May 2017 18:54:22 -0700 (PDT) Received: from localhost ([::1]:34809 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dGFJc-0008Em-CL for importer@patchew.org; Wed, 31 May 2017 21:54:20 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:56317) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dGFHr-0007Gl-JM for qemu-devel@nongnu.org; Wed, 31 May 2017 21:52:33 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dGFHp-0005ts-NE for qemu-devel@nongnu.org; Wed, 31 May 2017 21:52:31 -0400 Received: from ozlabs.org ([2401:3900:2:1::2]:38131) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1dGFHo-0005ru-Qa; Wed, 31 May 2017 21:52:29 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 3wdVhk4PG4z9sNJ; Thu, 1 Jun 2017 11:52:22 +1000 (AEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1496281942; bh=dpLr5lo61p4IOSilTqNkDn1PkasZxtolFQH8BpyxVBk=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=CGtmqsMOh0TIp+DyKbsQ+dgPsA1+H+GdsMvOfKtwtn1/V33ZQY8JkTEO8ROBPA+JQ tDXLNdzx/P6nNj6RK24LyRCJFdoLIInUbbvpp3YrVpZQeCOo9+0Jj95WJHqtEZV+7V ZCV8t8GDSQwWpunOPZ8/FRMR85PLoXjYQV87ej8U= From: David Gibson To: mdroth@linux.vnet.ibm.com Date: Thu, 1 Jun 2017 11:52:17 +1000 Message-Id: <20170601015218.9299-4-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.9.4 In-Reply-To: <20170601015218.9299-1-david@gibson.dropbear.id.au> References: <20170601015218.9299-1-david@gibson.dropbear.id.au> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2401:3900:2:1::2 Subject: [Qemu-devel] [PATCH 3/4] spapr: Abolish DRC set_configured method X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: lvivier@redhat.com, nikunj@linux.vnet.ibm.com, sursingh@redhat.com, qemu-devel@nongnu.org, qemu-ppc@nongnu.org, bharata@linux.vnet.ibm.com, David Gibson Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" DRConnectorClass has a set_configured method, however: * There is only one implementation, and only ever likely to be one * There's exactly one caller, and that's (now) local * The implementation is very straightforward So abolish the method entirely, and just open-code what we need. We also remove the tracepoints associated with it, since they don't look to be terribly useful. Signed-off-by: David Gibson Reviewed-by: Greg Kurz Reviewed-by: Laurent Vivier Tested-by: Daniel Barboza --- hw/ppc/spapr_drc.c | 20 ++++---------------- hw/ppc/trace-events | 2 -- include/hw/ppc/spapr_drc.h | 3 --- 3 files changed, 4 insertions(+), 21 deletions(-) diff --git a/hw/ppc/spapr_drc.c b/hw/ppc/spapr_drc.c index f5b7b68..025453b 100644 --- a/hw/ppc/spapr_drc.c +++ b/hw/ppc/spapr_drc.c @@ -199,18 +199,6 @@ static const char *get_name(sPAPRDRConnector *drc) return drc->name; } =20 -static void set_configured(sPAPRDRConnector *drc) -{ - trace_spapr_drc_set_configured(get_index(drc)); - - if (drc->isolation_state !=3D SPAPR_DR_ISOLATION_STATE_UNISOLATED) { - /* guest should be not configuring an isolated device */ - trace_spapr_drc_set_configured_skipping(get_index(drc)); - return; - } - drc->configured =3D true; -} - /* has the guest been notified of device attachment? */ static void set_signalled(sPAPRDRConnector *drc) { @@ -745,7 +733,6 @@ static void spapr_dr_connector_class_init(ObjectClass *= k, void *data) drck->get_index =3D get_index; drck->get_type =3D get_type; drck->get_name =3D get_name; - drck->set_configured =3D set_configured; drck->entity_sense =3D entity_sense; drck->attach =3D attach; drck->detach =3D detach; @@ -1113,7 +1100,6 @@ static void rtas_ibm_configure_connector(PowerPCCPU *= cpu, uint64_t wa_offset; uint32_t drc_index; sPAPRDRConnector *drc; - sPAPRDRConnectorClass *drck; sPAPRConfigureConnectorState *ccs; sPAPRDRCCResponse resp =3D SPAPR_DR_CC_RESPONSE_CONTINUE; int rc; @@ -1133,7 +1119,6 @@ static void rtas_ibm_configure_connector(PowerPCCPU *= cpu, goto out; } =20 - drck =3D SPAPR_DR_CONNECTOR_GET_CLASS(drc); if (!drc->fdt) { trace_spapr_rtas_ibm_configure_connector_missing_fdt(drc_index); rc =3D SPAPR_DR_CC_RESPONSE_NOT_CONFIGURABLE; @@ -1170,10 +1155,13 @@ static void rtas_ibm_configure_connector(PowerPCCPU= *cpu, case FDT_END_NODE: ccs->fdt_depth--; if (ccs->fdt_depth =3D=3D 0) { + sPAPRDRIsolationState state =3D drc->isolation_state; /* done sending the device tree, don't need to track * the state anymore */ - drck->set_configured(drc); + if (state =3D=3D SPAPR_DR_ISOLATION_STATE_UNISOLATED) { + drc->configured =3D true; + } spapr_ccs_remove(spapr, ccs); ccs =3D NULL; resp =3D SPAPR_DR_CC_RESPONSE_SUCCESS; diff --git a/hw/ppc/trace-events b/hw/ppc/trace-events index 43d265f..96ffc02 100644 --- a/hw/ppc/trace-events +++ b/hw/ppc/trace-events @@ -42,8 +42,6 @@ spapr_drc_set_isolation_state_deferring(uint32_t index) "= drc: 0x%"PRIx32 spapr_drc_set_indicator_state(uint32_t index, int state) "drc: 0x%"PRIx32"= , state: 0x%x" spapr_drc_set_allocation_state(uint32_t index, int state) "drc: 0x%"PRIx32= ", state: 0x%x" spapr_drc_set_allocation_state_finalizing(uint32_t index) "drc: 0x%"PRIx32 -spapr_drc_set_configured(uint32_t index) "drc: 0x%"PRIx32 -spapr_drc_set_configured_skipping(uint32_t index) "drc: 0x%"PRIx32", isola= ted device" spapr_drc_entity_sense(uint32_t index, int state) "drc: 0x%"PRIx32", state= : 0x%x" spapr_drc_attach(uint32_t index) "drc: 0x%"PRIx32 spapr_drc_detach(uint32_t index) "drc: 0x%"PRIx32 diff --git a/include/hw/ppc/spapr_drc.h b/include/hw/ppc/spapr_drc.h index 80db955..90f4953 100644 --- a/include/hw/ppc/spapr_drc.h +++ b/include/hw/ppc/spapr_drc.h @@ -177,9 +177,6 @@ typedef struct sPAPRDRConnectorClass { =20 uint32_t (*entity_sense)(sPAPRDRConnector *drc, sPAPRDREntitySense *st= ate); =20 - /* QEMU interfaces for managing FDT/configure-connector */ - void (*set_configured)(sPAPRDRConnector *drc); - /* QEMU interfaces for managing hotplug operations */ void (*attach)(sPAPRDRConnector *drc, DeviceState *d, void *fdt, int fdt_start_offset, bool coldplug, Error **errp); --=20 2.9.4 From nobody Tue May 7 07:35:16 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; dkim=fail spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 14962820685871017.2268664292885; Wed, 31 May 2017 18:54:28 -0700 (PDT) Received: from localhost ([::1]:34810 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dGFJj-0008Ip-36 for importer@patchew.org; Wed, 31 May 2017 21:54:27 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:56345) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dGFHt-0007Gy-05 for qemu-devel@nongnu.org; Wed, 31 May 2017 21:52:37 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dGFHp-0005u5-Oy for qemu-devel@nongnu.org; Wed, 31 May 2017 21:52:33 -0400 Received: from ozlabs.org ([103.22.144.67]:48601) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1dGFHo-0005rr-Qb; Wed, 31 May 2017 21:52:29 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 3wdVhk5jxfz9sNM; Thu, 1 Jun 2017 11:52:22 +1000 (AEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1496281942; bh=SRn3PZdQ1g7EHy4ECFBc6MLX4DTKtLmSyXEv2R9AiLA=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=SaXUmO3sNduPZjtD/vyKpeF9pGkqEsutZT+H+fcy5Rtu3fxJcTKx9H+6yDtDuFjZt Yi2sTFaMAhAXQ/pCX5uCS3G0ED2hXBradG+9lwusbT1LkXSdHjBWSk39ucz6100cdz ywNyMHYs+hF3G91EbeM0+oLCNSPA0aKQZ+zPYTjU= From: David Gibson To: mdroth@linux.vnet.ibm.com Date: Thu, 1 Jun 2017 11:52:18 +1000 Message-Id: <20170601015218.9299-5-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.9.4 In-Reply-To: <20170601015218.9299-1-david@gibson.dropbear.id.au> References: <20170601015218.9299-1-david@gibson.dropbear.id.au> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 103.22.144.67 Subject: [Qemu-devel] [PATCH 4/4] spapr: Make DRC get_index and get_type methods into plain functions X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: lvivier@redhat.com, nikunj@linux.vnet.ibm.com, sursingh@redhat.com, qemu-devel@nongnu.org, qemu-ppc@nongnu.org, bharata@linux.vnet.ibm.com, David Gibson Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" These two methods only have one implementation, and the spec they're implementing means any other implementation is unlikely, verging on impossible. So replace them with simple functions. Signed-off-by: David Gibson Reviewed-by: Laurent Vivier Tested-by: Daniel Barboza --- hw/ppc/spapr.c | 13 +++------- hw/ppc/spapr_drc.c | 61 ++++++++++++++++++++++--------------------= ---- hw/ppc/spapr_events.c | 10 +++----- hw/ppc/spapr_pci.c | 4 +-- include/hw/ppc/spapr_drc.h | 5 ++-- 5 files changed, 41 insertions(+), 52 deletions(-) diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c index ab3aab1..5d10366 100644 --- a/hw/ppc/spapr.c +++ b/hw/ppc/spapr.c @@ -456,15 +456,13 @@ static void spapr_populate_cpu_dt(CPUState *cs, void = *fdt, int offset, uint32_t pft_size_prop[] =3D {0, cpu_to_be32(spapr->htab_shift)}; int compat_smt =3D MIN(smp_threads, ppc_compat_max_threads(cpu)); sPAPRDRConnector *drc; - sPAPRDRConnectorClass *drck; int drc_index; uint32_t radix_AP_encodings[PPC_PAGE_SIZES_MAX_SZ]; int i; =20 drc =3D spapr_dr_connector_by_id(SPAPR_DR_CONNECTOR_TYPE_CPU, index); if (drc) { - drck =3D SPAPR_DR_CONNECTOR_GET_CLASS(drc); - drc_index =3D drck->get_index(drc); + drc_index =3D spapr_drc_index(drc); _FDT((fdt_setprop_cell(fdt, offset, "ibm,my-drc-index", drc_index)= )); } =20 @@ -654,15 +652,13 @@ static int spapr_populate_drconf_memory(sPAPRMachineS= tate *spapr, void *fdt) =20 if (i >=3D hotplug_lmb_start) { sPAPRDRConnector *drc; - sPAPRDRConnectorClass *drck; =20 drc =3D spapr_dr_connector_by_id(SPAPR_DR_CONNECTOR_TYPE_LMB, = i); g_assert(drc); - drck =3D SPAPR_DR_CONNECTOR_GET_CLASS(drc); =20 dynamic_memory[0] =3D cpu_to_be32(addr >> 32); dynamic_memory[1] =3D cpu_to_be32(addr & 0xffffffff); - dynamic_memory[2] =3D cpu_to_be32(drck->get_index(drc)); + dynamic_memory[2] =3D cpu_to_be32(spapr_drc_index(drc)); dynamic_memory[3] =3D cpu_to_be32(0); /* reserved */ dynamic_memory[4] =3D cpu_to_be32(numa_get_node(addr, NULL)); if (memory_region_present(get_system_memory(), addr)) { @@ -2560,7 +2556,7 @@ static void spapr_add_lmbs(DeviceState *dev, uint64_t= addr_start, uint64_t size, drck =3D SPAPR_DR_CONNECTOR_GET_CLASS(drc); spapr_hotplug_req_add_by_count_indexed(SPAPR_DR_CONNECTOR_TYPE= _LMB, nr_lmbs, - drck->get_index(drc)); + spapr_drc_index(drc)); } else { spapr_hotplug_req_add_by_count(SPAPR_DR_CONNECTOR_TYPE_LMB, nr_lmbs); @@ -2770,8 +2766,7 @@ static void spapr_memory_unplug_request(HotplugHandle= r *hotplug_dev, addr_start / SPAPR_MEMORY_BLOCK_SIZE); drck =3D SPAPR_DR_CONNECTOR_GET_CLASS(drc); spapr_hotplug_req_remove_by_count_indexed(SPAPR_DR_CONNECTOR_TYPE_LMB, - nr_lmbs, - drck->get_index(drc)); + nr_lmbs, spapr_drc_index(drc= )); out: error_propagate(errp, local_err); } diff --git a/hw/ppc/spapr_drc.c b/hw/ppc/spapr_drc.c index 025453b..0c9a60d 100644 --- a/hw/ppc/spapr_drc.c +++ b/hw/ppc/spapr_drc.c @@ -70,7 +70,7 @@ static sPAPRDRConnectorTypeShift get_type_shift(sPAPRDRCo= nnectorType type) return shift; } =20 -static uint32_t get_index(sPAPRDRConnector *drc) +uint32_t spapr_drc_index(sPAPRDRConnector *drc) { /* no set format for a drc index: it only needs to be globally * unique. this is how we encode the DRC type on bare-metal @@ -85,7 +85,7 @@ static uint32_t set_isolation_state(sPAPRDRConnector *drc, { sPAPRDRConnectorClass *drck =3D SPAPR_DR_CONNECTOR_GET_CLASS(drc); =20 - trace_spapr_drc_set_isolation_state(get_index(drc), state); + trace_spapr_drc_set_isolation_state(spapr_drc_index(drc), state); =20 if (state =3D=3D SPAPR_DR_ISOLATION_STATE_UNISOLATED) { /* cannot unisolate a non-existent resource, and, or resources @@ -126,11 +126,12 @@ static uint32_t set_isolation_state(sPAPRDRConnector = *drc, * PAPR+ 2.7, 13.4 */ if (drc->awaiting_release) { + uint32_t drc_index =3D spapr_drc_index(drc); if (drc->configured) { - trace_spapr_drc_set_isolation_state_finalizing(get_index(d= rc)); + trace_spapr_drc_set_isolation_state_finalizing(drc_index); drck->detach(drc, DEVICE(drc->dev), NULL); } else { - trace_spapr_drc_set_isolation_state_deferring(get_index(dr= c)); + trace_spapr_drc_set_isolation_state_deferring(drc_index); } } drc->configured =3D false; @@ -142,7 +143,7 @@ static uint32_t set_isolation_state(sPAPRDRConnector *d= rc, static uint32_t set_indicator_state(sPAPRDRConnector *drc, sPAPRDRIndicatorState state) { - trace_spapr_drc_set_indicator_state(get_index(drc), state); + trace_spapr_drc_set_indicator_state(spapr_drc_index(drc), state); drc->indicator_state =3D state; return RTAS_OUT_SUCCESS; } @@ -152,7 +153,7 @@ static uint32_t set_allocation_state(sPAPRDRConnector *= drc, { sPAPRDRConnectorClass *drck =3D SPAPR_DR_CONNECTOR_GET_CLASS(drc); =20 - trace_spapr_drc_set_allocation_state(get_index(drc), state); + trace_spapr_drc_set_allocation_state(spapr_drc_index(drc), state); =20 if (state =3D=3D SPAPR_DR_ALLOCATION_STATE_USABLE) { /* if there's no resource/device associated with the DRC, there's @@ -180,7 +181,8 @@ static uint32_t set_allocation_state(sPAPRDRConnector *= drc, drc->allocation_state =3D state; if (drc->awaiting_release && drc->allocation_state =3D=3D SPAPR_DR_ALLOCATION_STATE_UNUSABL= E) { - trace_spapr_drc_set_allocation_state_finalizing(get_index(drc)= ); + uint32_t drc_index =3D spapr_drc_index(drc); + trace_spapr_drc_set_allocation_state_finalizing(drc_index); drck->detach(drc, DEVICE(drc->dev), NULL); } else if (drc->allocation_state =3D=3D SPAPR_DR_ALLOCATION_STATE_= USABLE) { drc->awaiting_allocation =3D false; @@ -189,7 +191,7 @@ static uint32_t set_allocation_state(sPAPRDRConnector *= drc, return RTAS_OUT_SUCCESS; } =20 -static uint32_t get_type(sPAPRDRConnector *drc) +sPAPRDRConnectorType spapr_drc_type(sPAPRDRConnector *drc) { return drc->type; } @@ -243,7 +245,7 @@ static uint32_t entity_sense(sPAPRDRConnector *drc, sPA= PRDREntitySense *state) } } =20 - trace_spapr_drc_entity_sense(get_index(drc), *state); + trace_spapr_drc_entity_sense(spapr_drc_index(drc), *state); return RTAS_OUT_SUCCESS; } =20 @@ -251,8 +253,7 @@ static void prop_get_index(Object *obj, Visitor *v, con= st char *name, void *opaque, Error **errp) { sPAPRDRConnector *drc =3D SPAPR_DR_CONNECTOR(obj); - sPAPRDRConnectorClass *drck =3D SPAPR_DR_CONNECTOR_GET_CLASS(drc); - uint32_t value =3D (uint32_t)drck->get_index(drc); + uint32_t value =3D spapr_drc_index(drc); visit_type_uint32(v, name, &value, errp); } =20 @@ -260,8 +261,7 @@ static void prop_get_type(Object *obj, Visitor *v, cons= t char *name, void *opaque, Error **errp) { sPAPRDRConnector *drc =3D SPAPR_DR_CONNECTOR(obj); - sPAPRDRConnectorClass *drck =3D SPAPR_DR_CONNECTOR_GET_CLASS(drc); - uint32_t value =3D (uint32_t)drck->get_type(drc); + uint32_t value =3D (uint32_t)spapr_drc_type(drc); visit_type_uint32(v, name, &value, errp); } =20 @@ -362,7 +362,7 @@ static void prop_get_fdt(Object *obj, Visitor *v, const= char *name, static void attach(sPAPRDRConnector *drc, DeviceState *d, void *fdt, int fdt_start_offset, bool coldplug, Error **errp) { - trace_spapr_drc_attach(get_index(drc)); + trace_spapr_drc_attach(spapr_drc_index(drc)); =20 if (drc->isolation_state !=3D SPAPR_DR_ISOLATION_STATE_ISOLATED) { error_setg(errp, "an attached device is still awaiting release"); @@ -413,7 +413,7 @@ static void attach(sPAPRDRConnector *drc, DeviceState *= d, void *fdt, =20 static void detach(sPAPRDRConnector *drc, DeviceState *d, Error **errp) { - trace_spapr_drc_detach(get_index(drc)); + trace_spapr_drc_detach(spapr_drc_index(drc)); =20 /* if we've signalled device presence to the guest, or if the guest * has gone ahead and configured the device (via manually-executed @@ -436,14 +436,14 @@ static void detach(sPAPRDRConnector *drc, DeviceState= *d, Error **errp) } =20 if (drc->isolation_state !=3D SPAPR_DR_ISOLATION_STATE_ISOLATED) { - trace_spapr_drc_awaiting_isolated(get_index(drc)); + trace_spapr_drc_awaiting_isolated(spapr_drc_index(drc)); drc->awaiting_release =3D true; return; } =20 if (drc->type !=3D SPAPR_DR_CONNECTOR_TYPE_PCI && drc->allocation_state !=3D SPAPR_DR_ALLOCATION_STATE_UNUSABLE) { - trace_spapr_drc_awaiting_unusable(get_index(drc)); + trace_spapr_drc_awaiting_unusable(spapr_drc_index(drc)); drc->awaiting_release =3D true; return; } @@ -451,7 +451,7 @@ static void detach(sPAPRDRConnector *drc, DeviceState *= d, Error **errp) if (drc->awaiting_allocation) { if (!drc->awaiting_allocation_skippable) { drc->awaiting_release =3D true; - trace_spapr_drc_awaiting_allocation(get_index(drc)); + trace_spapr_drc_awaiting_allocation(spapr_drc_index(drc)); return; } } @@ -495,7 +495,7 @@ static void reset(DeviceState *d) sPAPRDRConnectorClass *drck =3D SPAPR_DR_CONNECTOR_GET_CLASS(drc); sPAPRDREntitySense state; =20 - trace_spapr_drc_reset(drck->get_index(drc)); + trace_spapr_drc_reset(spapr_drc_index(drc)); /* immediately upon reset we can safely assume DRCs whose devices * are pending removal can be safely removed, and that they will * subsequently be left in an ISOLATED state. move the DRC to this @@ -584,13 +584,12 @@ static const VMStateDescription vmstate_spapr_drc =3D= { static void realize(DeviceState *d, Error **errp) { sPAPRDRConnector *drc =3D SPAPR_DR_CONNECTOR(d); - sPAPRDRConnectorClass *drck =3D SPAPR_DR_CONNECTOR_GET_CLASS(drc); Object *root_container; char link_name[256]; gchar *child_name; Error *err =3D NULL; =20 - trace_spapr_drc_realize(drck->get_index(drc)); + trace_spapr_drc_realize(spapr_drc_index(drc)); /* NOTE: we do this as part of realize/unrealize due to the fact * that the guest will communicate with the DRC via RTAS calls * referencing the global DRC index. By unlinking the DRC @@ -599,9 +598,9 @@ static void realize(DeviceState *d, Error **errp) * existing in the composition tree */ root_container =3D container_get(object_get_root(), DRC_CONTAINER_PATH= ); - snprintf(link_name, sizeof(link_name), "%x", drck->get_index(drc)); + snprintf(link_name, sizeof(link_name), "%x", spapr_drc_index(drc)); child_name =3D object_get_canonical_path_component(OBJECT(drc)); - trace_spapr_drc_realize_child(drck->get_index(drc), child_name); + trace_spapr_drc_realize_child(spapr_drc_index(drc), child_name); object_property_add_alias(root_container, link_name, drc->owner, child_name, &err); if (err) { @@ -609,22 +608,21 @@ static void realize(DeviceState *d, Error **errp) object_unref(OBJECT(drc)); } g_free(child_name); - vmstate_register(DEVICE(drc), drck->get_index(drc), &vmstate_spapr_drc, + vmstate_register(DEVICE(drc), spapr_drc_index(drc), &vmstate_spapr_drc, drc); - trace_spapr_drc_realize_complete(drck->get_index(drc)); + trace_spapr_drc_realize_complete(spapr_drc_index(drc)); } =20 static void unrealize(DeviceState *d, Error **errp) { sPAPRDRConnector *drc =3D SPAPR_DR_CONNECTOR(d); - sPAPRDRConnectorClass *drck =3D SPAPR_DR_CONNECTOR_GET_CLASS(drc); Object *root_container; char name[256]; Error *err =3D NULL; =20 - trace_spapr_drc_unrealize(drck->get_index(drc)); + trace_spapr_drc_unrealize(spapr_drc_index(drc)); root_container =3D container_get(object_get_root(), DRC_CONTAINER_PATH= ); - snprintf(name, sizeof(name), "%x", drck->get_index(drc)); + snprintf(name, sizeof(name), "%x", spapr_drc_index(drc)); object_property_del(root_container, name, &err); if (err) { error_report_err(err); @@ -645,7 +643,8 @@ sPAPRDRConnector *spapr_dr_connector_new(Object *owner, drc->type =3D type; drc->id =3D id; drc->owner =3D owner; - prop_name =3D g_strdup_printf("dr-connector[%"PRIu32"]", get_index(drc= )); + prop_name =3D g_strdup_printf("dr-connector[%"PRIu32"]", + spapr_drc_index(drc)); object_property_add_child(owner, prop_name, OBJECT(drc), NULL); object_property_set_bool(OBJECT(drc), true, "realized", NULL); g_free(prop_name); @@ -730,8 +729,6 @@ static void spapr_dr_connector_class_init(ObjectClass *= k, void *data) drck->set_isolation_state =3D set_isolation_state; drck->set_indicator_state =3D set_indicator_state; drck->set_allocation_state =3D set_allocation_state; - drck->get_index =3D get_index; - drck->get_type =3D get_type; drck->get_name =3D get_name; drck->entity_sense =3D entity_sense; drck->attach =3D attach; @@ -868,7 +865,7 @@ int spapr_drc_populate_dt(void *fdt, int fdt_offset, Ob= ject *owner, drc_count++; =20 /* ibm,drc-indexes */ - drc_index =3D cpu_to_be32(drck->get_index(drc)); + drc_index =3D cpu_to_be32(spapr_drc_index(drc)); g_array_append_val(drc_indexes, drc_index); =20 /* ibm,drc-power-domains */ diff --git a/hw/ppc/spapr_events.c b/hw/ppc/spapr_events.c index 73e2a18..6b01b04 100644 --- a/hw/ppc/spapr_events.c +++ b/hw/ppc/spapr_events.c @@ -571,22 +571,20 @@ static void spapr_hotplug_req_event(uint8_t hp_id, ui= nt8_t hp_action, =20 void spapr_hotplug_req_add_by_index(sPAPRDRConnector *drc) { - sPAPRDRConnectorClass *drck =3D SPAPR_DR_CONNECTOR_GET_CLASS(drc); - sPAPRDRConnectorType drc_type =3D drck->get_type(drc); + sPAPRDRConnectorType drc_type =3D spapr_drc_type(drc); union drc_identifier drc_id; =20 - drc_id.index =3D drck->get_index(drc); + drc_id.index =3D spapr_drc_index(drc); spapr_hotplug_req_event(RTAS_LOG_V6_HP_ID_DRC_INDEX, RTAS_LOG_V6_HP_ACTION_ADD, drc_type, &drc_id); } =20 void spapr_hotplug_req_remove_by_index(sPAPRDRConnector *drc) { - sPAPRDRConnectorClass *drck =3D SPAPR_DR_CONNECTOR_GET_CLASS(drc); - sPAPRDRConnectorType drc_type =3D drck->get_type(drc); + sPAPRDRConnectorType drc_type =3D spapr_drc_type(drc); union drc_identifier drc_id; =20 - drc_id.index =3D drck->get_index(drc); + drc_id.index =3D spapr_drc_index(drc); spapr_hotplug_req_event(RTAS_LOG_V6_HP_ID_DRC_INDEX, RTAS_LOG_V6_HP_ACTION_REMOVE, drc_type, &drc_i= d); } diff --git a/hw/ppc/spapr_pci.c b/hw/ppc/spapr_pci.c index e4daf8d..7a208a7 100644 --- a/hw/ppc/spapr_pci.c +++ b/hw/ppc/spapr_pci.c @@ -1417,14 +1417,12 @@ static uint32_t spapr_phb_get_pci_drc_index(sPAPRPH= BState *phb, PCIDevice *pdev) { sPAPRDRConnector *drc =3D spapr_phb_get_pci_drc(phb, pdev); - sPAPRDRConnectorClass *drck; =20 if (!drc) { return 0; } =20 - drck =3D SPAPR_DR_CONNECTOR_GET_CLASS(drc); - return drck->get_index(drc); + return spapr_drc_index(drc); } =20 static void spapr_phb_hot_plug_child(HotplugHandler *plug_handler, diff --git a/include/hw/ppc/spapr_drc.h b/include/hw/ppc/spapr_drc.h index 90f4953..10e7c24 100644 --- a/include/hw/ppc/spapr_drc.h +++ b/include/hw/ppc/spapr_drc.h @@ -171,8 +171,6 @@ typedef struct sPAPRDRConnectorClass { sPAPRDRIndicatorState state); uint32_t (*set_allocation_state)(sPAPRDRConnector *drc, sPAPRDRAllocationState state); - uint32_t (*get_index)(sPAPRDRConnector *drc); - uint32_t (*get_type)(sPAPRDRConnector *drc); const char *(*get_name)(sPAPRDRConnector *drc); =20 uint32_t (*entity_sense)(sPAPRDRConnector *drc, sPAPRDREntitySense *st= ate); @@ -185,6 +183,9 @@ typedef struct sPAPRDRConnectorClass { void (*set_signalled)(sPAPRDRConnector *drc); } sPAPRDRConnectorClass; =20 +uint32_t spapr_drc_index(sPAPRDRConnector *drc); +sPAPRDRConnectorType spapr_drc_type(sPAPRDRConnector *drc); + sPAPRDRConnector *spapr_dr_connector_new(Object *owner, sPAPRDRConnectorType type, uint32_t id); --=20 2.9.4