From nobody Mon Feb 9 23:39:57 2026 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.zohomail.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 150001377785546.56141536483892; Thu, 13 Jul 2017 23:29:37 -0700 (PDT) Received: from localhost ([::1]:35767 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dVu6a-0005vm-Jy for importer@patchew.org; Fri, 14 Jul 2017 02:29:36 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:43697) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dVtt5-00019c-Tm for qemu-devel@nongnu.org; Fri, 14 Jul 2017 02:15:42 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dVtt3-0002AX-8V for qemu-devel@nongnu.org; Fri, 14 Jul 2017 02:15:39 -0400 Received: from ozlabs.org ([2401:3900:2:1::2]:57559) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1dVtt2-00027s-R9; Fri, 14 Jul 2017 02:15:37 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 3x82VR4C2zz9t30; Fri, 14 Jul 2017 16:15:26 +1000 (AEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1500012927; bh=4cSpUd6n5rI5ZzwkrJKjdnLAFXyYiaYWcn0STVrGbwE=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=MCxYZX/VUby64mlexYTSj2dLWPdRTzdwpHyz0fj4X/XTm/yJKewHmH/RcbSYHOX3c Z1Y7ERDihqcxnM6HPi8R/KPco3wNKfo6l5juc6Dw5biuj/11WG+Ww++D+Xn9ZYMt5U VHWZXO/JAyHiNXTqkl30Ym0JByrd3FPdhpQJYNNs= From: David Gibson To: peter.maydell@linaro.org Date: Fri, 14 Jul 2017 16:15:14 +1000 Message-Id: <20170714061521.28300-12-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.13.0 In-Reply-To: <20170714061521.28300-1-david@gibson.dropbear.id.au> References: <20170714061521.28300-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] [PULL 11/18] spapr: Implement DR-indicator for physical DRCs only 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, agraf@suse.de, qemu-devel@nongnu.org, sbobroff@au1.ibm.com, mdroth@linux.vnet.ibm.com, groug@kaod.org, qemu-ppc@nongnu.org, sjitindarsingh@gmail.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" According to PAPR, the DR-indicator should only be valid for physical DRCs, not logical DRCs. At the moment we implement it for all DRCs, so restrict it to physical ones only. We move the state to the physical DRC subclass, which means adding some QOM boilerplate to handle the newly distinct type. Signed-off-by: David Gibson Reviewed-by: Daniel Barboza Tested-by: Daniel Barboza --- hw/ppc/spapr_drc.c | 68 ++++++++++++++++++++++++++++++++++++++++++= ---- include/hw/ppc/spapr_drc.h | 13 ++++++--- 2 files changed, 72 insertions(+), 9 deletions(-) diff --git a/hw/ppc/spapr_drc.c b/hw/ppc/spapr_drc.c index 534fefa998..611dc57865 100644 --- a/hw/ppc/spapr_drc.c +++ b/hw/ppc/spapr_drc.c @@ -478,7 +478,6 @@ static const VMStateDescription vmstate_spapr_drc =3D { .needed =3D spapr_drc_needed, .fields =3D (VMStateField []) { VMSTATE_UINT32(state, sPAPRDRConnector), - VMSTATE_UINT32(dr_indicator, sPAPRDRConnector), VMSTATE_END_OF_LIST() } }; @@ -575,10 +574,63 @@ static void spapr_dr_connector_class_init(ObjectClass= *k, void *data) dk->user_creatable =3D false; } =20 +static bool drc_physical_needed(void *opaque) +{ + sPAPRDRCPhysical *drcp =3D (sPAPRDRCPhysical *)opaque; + sPAPRDRConnector *drc =3D SPAPR_DR_CONNECTOR(drcp); + + if ((drc->dev && (drcp->dr_indicator =3D=3D SPAPR_DR_INDICATOR_ACTIVE)) + || (!drc->dev && (drcp->dr_indicator =3D=3D SPAPR_DR_INDICATOR_INA= CTIVE))) { + return false; + } + return true; +} + +static const VMStateDescription vmstate_spapr_drc_physical =3D { + .name =3D "spapr_drc", + .version_id =3D 1, + .minimum_version_id =3D 1, + .needed =3D drc_physical_needed, + .fields =3D (VMStateField []) { + VMSTATE_UINT32(dr_indicator, sPAPRDRCPhysical), + VMSTATE_END_OF_LIST() + } +}; + +static void drc_physical_reset(void *opaque) +{ + sPAPRDRConnector *drc =3D SPAPR_DR_CONNECTOR(opaque); + sPAPRDRCPhysical *drcp =3D SPAPR_DRC_PHYSICAL(drc); + + if (drc->dev) { + drcp->dr_indicator =3D SPAPR_DR_INDICATOR_ACTIVE; + } else { + drcp->dr_indicator =3D SPAPR_DR_INDICATOR_INACTIVE; + } +} + +static void realize_physical(DeviceState *d, Error **errp) +{ + sPAPRDRCPhysical *drcp =3D SPAPR_DRC_PHYSICAL(d); + Error *local_err =3D NULL; + + realize(d, &local_err); + if (local_err) { + error_propagate(errp, local_err); + return; + } + + vmstate_register(DEVICE(drcp), spapr_drc_index(SPAPR_DR_CONNECTOR(drcp= )), + &vmstate_spapr_drc_physical, drcp); + qemu_register_reset(drc_physical_reset, drcp); +} + static void spapr_drc_physical_class_init(ObjectClass *k, void *data) { + DeviceClass *dk =3D DEVICE_CLASS(k); sPAPRDRConnectorClass *drck =3D SPAPR_DR_CONNECTOR_CLASS(k); =20 + dk->realize =3D realize_physical; drck->dr_entity_sense =3D physical_entity_sense; drck->isolate =3D drc_isolate_physical; drck->unisolate =3D drc_unisolate_physical; @@ -640,7 +692,7 @@ static const TypeInfo spapr_dr_connector_info =3D { static const TypeInfo spapr_drc_physical_info =3D { .name =3D TYPE_SPAPR_DRC_PHYSICAL, .parent =3D TYPE_SPAPR_DR_CONNECTOR, - .instance_size =3D sizeof(sPAPRDRConnector), + .instance_size =3D sizeof(sPAPRDRCPhysical), .class_init =3D spapr_drc_physical_class_init, .abstract =3D true, }; @@ -883,12 +935,18 @@ static uint32_t rtas_set_dr_indicator(uint32_t idx, u= int32_t state) { sPAPRDRConnector *drc =3D spapr_drc_by_index(idx); =20 - if (!drc) { - return RTAS_OUT_PARAM_ERROR; + if (!drc || !object_dynamic_cast(OBJECT(drc), TYPE_SPAPR_DRC_PHYSICAL)= ) { + return RTAS_OUT_NO_SUCH_INDICATOR; + } + if ((state !=3D SPAPR_DR_INDICATOR_INACTIVE) + && (state !=3D SPAPR_DR_INDICATOR_ACTIVE) + && (state !=3D SPAPR_DR_INDICATOR_IDENTIFY) + && (state !=3D SPAPR_DR_INDICATOR_ACTION)) { + return RTAS_OUT_PARAM_ERROR; /* bad state parameter */ } =20 trace_spapr_drc_set_dr_indicator(idx, state); - drc->dr_indicator =3D state; + SPAPR_DRC_PHYSICAL(drc)->dr_indicator =3D state; return RTAS_OUT_SUCCESS; } =20 diff --git a/include/hw/ppc/spapr_drc.h b/include/hw/ppc/spapr_drc.h index 9d4fd41d22..a7958d0a8d 100644 --- a/include/hw/ppc/spapr_drc.h +++ b/include/hw/ppc/spapr_drc.h @@ -33,7 +33,7 @@ #define SPAPR_DRC_PHYSICAL_CLASS(klass) \ OBJECT_CLASS_CHECK(sPAPRDRConnectorClass, klass, \ TYPE_SPAPR_DRC_PHYSICAL) -#define SPAPR_DRC_PHYSICAL(obj) OBJECT_CHECK(sPAPRDRConnector, (obj), \ +#define SPAPR_DRC_PHYSICAL(obj) OBJECT_CHECK(sPAPRDRCPhysical, (obj), \ TYPE_SPAPR_DRC_PHYSICAL) =20 #define TYPE_SPAPR_DRC_LOGICAL "spapr-drc-logical" @@ -198,9 +198,6 @@ typedef struct sPAPRDRConnector { uint32_t id; Object *owner; =20 - /* DR-indicator */ - uint32_t dr_indicator; - uint32_t state; =20 /* RTAS ibm,configure-connector state */ @@ -232,6 +229,14 @@ typedef struct sPAPRDRConnectorClass { void (*release)(DeviceState *dev); } sPAPRDRConnectorClass; =20 +typedef struct sPAPRDRCPhysical { + /*< private >*/ + sPAPRDRConnector parent; + + /* DR-indicator */ + uint32_t dr_indicator; +} sPAPRDRCPhysical; + static inline bool spapr_drc_hotplugged(DeviceState *dev) { return dev->hotplugged && !runstate_check(RUN_STATE_INMIGRATE); --=20 2.13.0