From nobody Wed Feb 11 05:17:41 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=reject dis=none) header.from=google.com ARC-Seal: i=1; a=rsa-sha256; t=1679699542; cv=none; d=zohomail.com; s=zohoarc; b=FVmS3iBRQOyF4nQ4Yv/aE5m4rudgAh0fHbCNjuus5LZhmdiDYfk7Nc3jIcBvG7yv0XnFBwXfx6cqvSZqKclC2ALK9ro6kBmjq3S1g5HcPit6IBR3IchMzqQf6jxTC/7b+11KMU8RvHsvQZKG0pP4HPJWDnFd0RIeQgM3DSxjUW4= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1679699542; h=Content-Type:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=BPaOfu7m+eYd7o19NPhS9EwzZa/C/i3nEo2Kt/5u10g=; b=O7klHOgcujllDnLbsFJQcPSnB6gzYxU77kCQmZUsPsd+N5izujGwq2uBxGmv7Mz0tg2jTRw0wRWj8NkUKsVyn6+5xsx2+BAtKdz+rktb9+u3Di+HsvT2jQTDMh81t9aOa+lMy5FqQC9NyhevvcdLHWRa5Pij4D0rd1oQjpBiEz8= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=reject dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1679699542322555.393282268114; Fri, 24 Mar 2023 16:12:22 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1pfqY5-0002eH-0x; Fri, 24 Mar 2023 19:10:17 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from <3uS0eZAgKCrQqobUinmbaiiafY.WigkYgo-XYpYfhihaho.ila@flex--wuhaotsh.bounces.google.com>) id 1pfqXl-0002T8-Ir for qemu-devel@nongnu.org; Fri, 24 Mar 2023 19:09:58 -0400 Received: from mail-pf1-x449.google.com ([2607:f8b0:4864:20::449]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from <3uS0eZAgKCrQqobUinmbaiiafY.WigkYgo-XYpYfhihaho.ila@flex--wuhaotsh.bounces.google.com>) id 1pfqXf-000846-6x for qemu-devel@nongnu.org; Fri, 24 Mar 2023 19:09:57 -0400 Received: by mail-pf1-x449.google.com with SMTP id d4-20020a056a00198400b00628000145bcso1651895pfl.0 for ; Fri, 24 Mar 2023 16:09:46 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; t=1679699385; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=BPaOfu7m+eYd7o19NPhS9EwzZa/C/i3nEo2Kt/5u10g=; b=aHwjuNOGNUSZdWpQLxD+8j91dzv7fw3rVc/IKgrDZGCoh88AdLbW1d+wBjeLn5n58B cFuHrMkfQGtUUTDoMx/6hJYHnvzGJNEIjoXWyiI3+g9oQJifYVEhCTA49LX+dbGN55ZR mw0WNR20bXtMdWBv0SOxOyaX/wg8H+7kYabaJxc4JHreuF1XzIC4agnp4tImT13gamqj UNyM9cu8ztbDk1ccVIzYAsrk4h6h7S31YoW+7FtgryPCwBuD9BEEcKNL+yWHpcJ0TBwY +JF/ilrc2vNxWLy3MCdtC2zWVLKZY56ZkldjxMLsBdeErFWODkNx4hkKlTZRrAkkXjhy YqCA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1679699385; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=BPaOfu7m+eYd7o19NPhS9EwzZa/C/i3nEo2Kt/5u10g=; b=GTnBirf1ulKC8iRCSEHJgBUpkaBEd12Vpw+2PTdAL8K7vBl/wPDmYZYhq/3IygcGtY gT8anzsy+6R7Ws3ynXk2kXP9di8UByO1kOSC/eyEvMiFnuSoH6swkj6SUNlBgex3ARQS CeC+D2nk5Uf9BrXEXkkmu/gS/pDVQ9ucRXPVwRkXIyX3YRgR6aUFzaKOJjAGxrkN2rWZ 6s/WtZghV/MZQ4CyrR1TmkubNmVTfJe3XTYO42yb8G4gUPG350XFBNWlpKll/2aNypvn wwCfp2QiTOjQg03OEhnPMeIV/+4gSGLmp/8LBNdgP3tI749SIC5NmTUTMbJZbPNDy+ss 7l2g== X-Gm-Message-State: AAQBX9ccACLUavmcsHh2yJfVlrSjMSPUfCGGTCkST9eDbZ9zGjE0Y/IH Dhyu0snr7O3fEiZNTwARm0rFkd78nuzsZw== X-Google-Smtp-Source: AKy350b6kHvUKXgfz/jm78WuAuC2b4ae1MZPnnFDhap9lNADuQZqoogUK4sN0Y4JLPsXtl5re9qp041rhWpseg== X-Received: from mimik.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:4e]) (user=wuhaotsh job=sendgmr) by 2002:a17:90b:2789:b0:233:c921:ab7e with SMTP id pw9-20020a17090b278900b00233c921ab7emr4458718pjb.4.1679699385312; Fri, 24 Mar 2023 16:09:45 -0700 (PDT) Date: Fri, 24 Mar 2023 16:09:01 -0700 In-Reply-To: <20230324230904.3710289-1-wuhaotsh@google.com> Mime-Version: 1.0 References: <20230324230904.3710289-1-wuhaotsh@google.com> X-Mailer: git-send-email 2.40.0.348.gf938b09366-goog Message-ID: <20230324230904.3710289-5-wuhaotsh@google.com> Subject: [PATCH v2 4/7] hw/ipmi: Refactor IPMI interface From: Hao Wu To: minyard@acm.org Cc: qemu-arm@nongnu.org, qemu-devel@nongnu.org, wuhaotsh@google.com, venture@google.com, Avi.Fishman@nuvoton.com, kfting@nuvoton.com, hskinnemoen@google.com, titusr@google.com, peter.maydell@linaro.org Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::449; envelope-from=3uS0eZAgKCrQqobUinmbaiiafY.WigkYgo-XYpYfhihaho.ila@flex--wuhaotsh.bounces.google.com; helo=mail-pf1-x449.google.com X-Spam_score_int: -95 X-Spam_score: -9.6 X-Spam_bar: --------- X-Spam_report: (-9.6 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_MED=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, USER_IN_DEF_DKIM_WL=-7.5 autolearn=unavailable autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @google.com) X-ZM-MESSAGEID: 1679699543656100001 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" This patch refactors the IPMI interface so that it can be used by both the BMC side and core-side simulation. Detail changes: (1) Split IPMIInterface into IPMIInterfaceHost (for host side simulation) and IPMIInterfaceClient (for BMC side simulation). (2) rename handle_rsp -> handle_msg so the name fits both BMC side and Core side. (3) Add a new class IPMICore. This class represents a simulator/external connection for both BMC and Core side emulation. (4) Change the original IPMIBmc to IPMIBmcHost, representing host side simulation. (5) Add a new type IPMIBmcClient representing BMC side simulation. (6) Appy the changes to the entire IPMI library. Signed-off-by: Hao Wu --- hw/acpi/ipmi.c | 4 +- hw/ipmi/ipmi.c | 60 +++++++++++++---- hw/ipmi/ipmi_bmc_extern.c | 67 ++++++++++-------- hw/ipmi/ipmi_bmc_sim.c | 78 ++++++++++++--------- hw/ipmi/ipmi_bt.c | 33 +++++---- hw/ipmi/ipmi_kcs.c | 31 +++++---- hw/ipmi/isa_ipmi_bt.c | 18 ++--- hw/ipmi/isa_ipmi_kcs.c | 13 ++-- hw/ipmi/pci_ipmi_bt.c | 8 +-- hw/ipmi/pci_ipmi_kcs.c | 8 +-- hw/ipmi/smbus_ipmi.c | 26 +++---- hw/ppc/pnv.c | 4 +- hw/ppc/pnv_bmc.c | 22 +++--- hw/smbios/smbios_type_38.c | 11 +-- include/hw/ipmi/ipmi.h | 135 ++++++++++++++++++++++++++----------- include/hw/ipmi/ipmi_bt.h | 2 +- include/hw/ipmi/ipmi_kcs.h | 2 +- include/hw/ppc/pnv.h | 12 ++-- 18 files changed, 332 insertions(+), 202 deletions(-) diff --git a/hw/acpi/ipmi.c b/hw/acpi/ipmi.c index a20e57d465..e6d2cd790b 100644 --- a/hw/acpi/ipmi.c +++ b/hw/acpi/ipmi.c @@ -66,8 +66,8 @@ void build_ipmi_dev_aml(AcpiDevAmlIf *adev, Aml *scope) { Aml *dev; IPMIFwInfo info =3D {}; - IPMIInterface *ii =3D IPMI_INTERFACE(adev); - IPMIInterfaceClass *iic =3D IPMI_INTERFACE_GET_CLASS(ii); + IPMIInterfaceHost *ii =3D IPMI_INTERFACE_HOST(adev); + IPMIInterfaceHostClass *iic =3D IPMI_INTERFACE_HOST_GET_CLASS(ii); uint16_t version; =20 iic->get_fwinfo(ii, &info); diff --git a/hw/ipmi/ipmi.c b/hw/ipmi/ipmi.c index bbb07b151e..1be923ffb8 100644 --- a/hw/ipmi/ipmi.c +++ b/hw/ipmi/ipmi.c @@ -38,7 +38,7 @@ uint32_t ipmi_next_uuid(void) return ipmi_current_uuid++; } =20 -static int ipmi_do_hw_op(IPMIInterface *s, enum ipmi_op op, int checkonly) +static int ipmi_do_hw_op(IPMIInterfaceHost *s, enum ipmi_op op, int checko= nly) { switch (op) { case IPMI_RESET_CHASSIS: @@ -78,9 +78,9 @@ static int ipmi_do_hw_op(IPMIInterface *s, enum ipmi_op o= p, int checkonly) } } =20 -static void ipmi_interface_class_init(ObjectClass *class, void *data) +static void ipmi_interface_host_class_init(ObjectClass *class, void *data) { - IPMIInterfaceClass *ik =3D IPMI_INTERFACE_CLASS(class); + IPMIInterfaceHostClass *ik =3D IPMI_INTERFACE_HOST_CLASS(class); =20 ik->do_hw_op =3D ipmi_do_hw_op; } @@ -89,27 +89,48 @@ static const TypeInfo ipmi_interface_type_info =3D { .name =3D TYPE_IPMI_INTERFACE, .parent =3D TYPE_INTERFACE, .class_size =3D sizeof(IPMIInterfaceClass), - .class_init =3D ipmi_interface_class_init, +}; + +static const TypeInfo ipmi_interface_host_type_info =3D { + .name =3D TYPE_IPMI_INTERFACE_HOST, + .parent =3D TYPE_IPMI_INTERFACE, + .class_size =3D sizeof(IPMIInterfaceHostClass), + .class_init =3D ipmi_interface_host_class_init, +}; + +static const TypeInfo ipmi_interface_client_type_info =3D { + .name =3D TYPE_IPMI_INTERFACE_CLIENT, + .parent =3D TYPE_IPMI_INTERFACE, + .class_size =3D sizeof(IPMIInterfaceClientClass), +}; + +static const TypeInfo ipmi_core_type_info =3D { + .name =3D TYPE_IPMI_CORE, + .parent =3D TYPE_DEVICE, + .instance_size =3D sizeof(IPMICore), + .class_size =3D sizeof(IPMICoreClass), + .abstract =3D true, }; =20 static void isa_ipmi_bmc_check(const Object *obj, const char *name, Object *val, Error **errp) { - IPMIBmc *bmc =3D IPMI_BMC(val); + IPMICore *ic =3D IPMI_CORE(val); =20 - if (bmc->intf) + if (ic->intf) { error_setg(errp, "BMC object is already in use"); + } } =20 void ipmi_bmc_find_and_link(Object *obj, Object **bmc) { - object_property_add_link(obj, "bmc", TYPE_IPMI_BMC, bmc, + object_property_add_link(obj, "bmc", TYPE_IPMI_BMC_HOST, bmc, isa_ipmi_bmc_check, OBJ_PROP_LINK_STRONG); } =20 static Property ipmi_bmc_properties[] =3D { - DEFINE_PROP_UINT8("slave_addr", IPMIBmc, slave_addr, 0x20), + DEFINE_PROP_UINT8("slave_addr", IPMIBmcHost, slave_addr, 0x20), DEFINE_PROP_END_OF_LIST(), }; =20 @@ -120,19 +141,30 @@ static void bmc_class_init(ObjectClass *oc, void *dat= a) device_class_set_props(dc, ipmi_bmc_properties); } =20 -static const TypeInfo ipmi_bmc_type_info =3D { - .name =3D TYPE_IPMI_BMC, - .parent =3D TYPE_DEVICE, - .instance_size =3D sizeof(IPMIBmc), +static const TypeInfo ipmi_bmc_host_type_info =3D { + .name =3D TYPE_IPMI_BMC_HOST, + .parent =3D TYPE_IPMI_CORE, + .instance_size =3D sizeof(IPMIBmcHost), .abstract =3D true, - .class_size =3D sizeof(IPMIBmcClass), + .class_size =3D sizeof(IPMIBmcHostClass), .class_init =3D bmc_class_init, }; =20 +static const TypeInfo ipmi_bmc_client_type_info =3D { + .name =3D TYPE_IPMI_BMC_CLIENT, + .parent =3D TYPE_IPMI_CORE, + .instance_size =3D sizeof(IPMIBmcClient), + .abstract =3D true, +}; + static void ipmi_register_types(void) { type_register_static(&ipmi_interface_type_info); - type_register_static(&ipmi_bmc_type_info); + type_register_static(&ipmi_interface_host_type_info); + type_register_static(&ipmi_interface_client_type_info); + type_register_static(&ipmi_core_type_info); + type_register_static(&ipmi_bmc_host_type_info); + type_register_static(&ipmi_bmc_client_type_info); } =20 type_init(ipmi_register_types) diff --git a/hw/ipmi/ipmi_bmc_extern.c b/hw/ipmi/ipmi_bmc_extern.c index acf2bab35f..67f6a5d829 100644 --- a/hw/ipmi/ipmi_bmc_extern.c +++ b/hw/ipmi/ipmi_bmc_extern.c @@ -65,7 +65,7 @@ #define TYPE_IPMI_BMC_EXTERN "ipmi-bmc-extern" OBJECT_DECLARE_SIMPLE_TYPE(IPMIBmcExtern, IPMI_BMC_EXTERN) struct IPMIBmcExtern { - IPMIBmc parent; + IPMIBmcHost parent; =20 CharBackend chr; =20 @@ -147,8 +147,9 @@ static void continue_send(IPMIBmcExtern *ibe) =20 static void extern_timeout(void *opaque) { + IPMICore *ic =3D opaque; IPMIBmcExtern *ibe =3D opaque; - IPMIInterface *s =3D ibe->parent.intf; + IPMIInterface *s =3D ic->intf; =20 if (ibe->connected) { if (ibe->waiting_rsp && (ibe->outlen =3D=3D 0)) { @@ -158,7 +159,7 @@ static void extern_timeout(void *opaque) ibe->inbuf[1] =3D ibe->outbuf[1] | 0x04; ibe->inbuf[2] =3D ibe->outbuf[2]; ibe->inbuf[3] =3D IPMI_CC_TIMEOUT; - k->handle_rsp(s, ibe->outbuf[0], ibe->inbuf + 1, 3); + k->handle_msg(s, ibe->outbuf[0], ibe->inbuf + 1, 3); } else { continue_send(ibe); } @@ -181,13 +182,13 @@ static void addchar(IPMIBmcExtern *ibe, unsigned char= ch) } } =20 -static void ipmi_bmc_extern_handle_command(IPMIBmc *b, +static void ipmi_bmc_extern_handle_command(IPMICore *ic, uint8_t *cmd, unsigned int cmd_len, unsigned int max_cmd_len, uint8_t msg_id) { - IPMIBmcExtern *ibe =3D IPMI_BMC_EXTERN(b); - IPMIInterface *s =3D ibe->parent.intf; + IPMIBmcExtern *ibe =3D IPMI_BMC_EXTERN(ic); + IPMIInterface *s =3D ic->intf; uint8_t err =3D 0, csum; unsigned int i; =20 @@ -213,7 +214,7 @@ static void ipmi_bmc_extern_handle_command(IPMIBmc *b, rsp[1] =3D cmd[1]; rsp[2] =3D err; ibe->waiting_rsp =3D false; - k->handle_rsp(s, msg_id, rsp, 3); + k->handle_msg(s, msg_id, rsp, 3); goto out; } =20 @@ -236,8 +237,11 @@ static void ipmi_bmc_extern_handle_command(IPMIBmc *b, =20 static void handle_hw_op(IPMIBmcExtern *ibe, unsigned char hw_op) { - IPMIInterface *s =3D ibe->parent.intf; + IPMICore *ic =3D IPMI_CORE(ibe); + IPMIInterface *s =3D ic->intf; + IPMIInterfaceHost *hs =3D IPMI_INTERFACE_HOST(s); IPMIInterfaceClass *k =3D IPMI_INTERFACE_GET_CLASS(s); + IPMIInterfaceHostClass *hk =3D IPMI_INTERFACE_HOST_GET_CLASS(s); =20 switch (hw_op) { case VM_CMD_VERSION: @@ -257,34 +261,36 @@ static void handle_hw_op(IPMIBmcExtern *ibe, unsigned= char hw_op) break; =20 case VM_CMD_POWEROFF: - k->do_hw_op(s, IPMI_POWEROFF_CHASSIS, 0); + hk->do_hw_op(hs, IPMI_POWEROFF_CHASSIS, 0); break; =20 case VM_CMD_RESET: - k->do_hw_op(s, IPMI_RESET_CHASSIS, 0); + hk->do_hw_op(hs, IPMI_RESET_CHASSIS, 0); break; =20 case VM_CMD_ENABLE_IRQ: - k->set_irq_enable(s, 1); + hk->set_irq_enable(hs, 1); break; =20 case VM_CMD_DISABLE_IRQ: - k->set_irq_enable(s, 0); + hk->set_irq_enable(hs, 0); break; =20 case VM_CMD_SEND_NMI: - k->do_hw_op(s, IPMI_SEND_NMI, 0); + hk->do_hw_op(hs, IPMI_SEND_NMI, 0); break; =20 case VM_CMD_GRACEFUL_SHUTDOWN: - k->do_hw_op(s, IPMI_SHUTDOWN_VIA_ACPI_OVERTEMP, 0); + hk->do_hw_op(hs, IPMI_SHUTDOWN_VIA_ACPI_OVERTEMP, 0); break; } } =20 static void handle_msg(IPMIBmcExtern *ibe) { - IPMIInterfaceClass *k =3D IPMI_INTERFACE_GET_CLASS(ibe->parent.intf); + IPMICore *ic =3D IPMI_CORE(ibe); + IPMIInterface *s =3D ic->intf; + IPMIInterfaceClass *k =3D IPMI_INTERFACE_GET_CLASS(s); =20 if (ibe->in_escape) { ipmi_debug("msg escape not ended\n"); @@ -306,7 +312,7 @@ static void handle_msg(IPMIBmcExtern *ibe) =20 timer_del(ibe->extern_timer); ibe->waiting_rsp =3D false; - k->handle_rsp(ibe->parent.intf, ibe->inbuf[0], ibe->inbuf + 1, ibe->in= pos - 1); + k->handle_msg(s, ibe->inbuf[0], ibe->inbuf + 1, ibe->inpos - 1); } =20 static int can_receive(void *opaque) @@ -382,9 +388,12 @@ static void receive(void *opaque, const uint8_t *buf, = int size) =20 static void chr_event(void *opaque, QEMUChrEvent event) { + IPMICore *ic =3D opaque; IPMIBmcExtern *ibe =3D opaque; - IPMIInterface *s =3D ibe->parent.intf; + IPMIInterface *s =3D ic->intf; + IPMIInterfaceHost *hs =3D IPMI_INTERFACE_HOST(s); IPMIInterfaceClass *k =3D IPMI_INTERFACE_GET_CLASS(s); + IPMIInterfaceHostClass *hk =3D IPMI_INTERFACE_HOST_GET_CLASS(s); unsigned char v; =20 switch (event) { @@ -398,17 +407,17 @@ static void chr_event(void *opaque, QEMUChrEvent even= t) ibe->outlen++; addchar(ibe, VM_CMD_CAPABILITIES); v =3D VM_CAPABILITIES_IRQ | VM_CAPABILITIES_ATTN; - if (k->do_hw_op(ibe->parent.intf, IPMI_POWEROFF_CHASSIS, 1) =3D=3D= 0) { + if (hk->do_hw_op(hs, IPMI_POWEROFF_CHASSIS, 1) =3D=3D 0) { v |=3D VM_CAPABILITIES_POWER; } - if (k->do_hw_op(ibe->parent.intf, IPMI_SHUTDOWN_VIA_ACPI_OVERTEMP,= 1) + if (hk->do_hw_op(hs, IPMI_SHUTDOWN_VIA_ACPI_OVERTEMP, 1) =3D=3D 0) { v |=3D VM_CAPABILITIES_GRACEFUL_SHUTDOWN; } - if (k->do_hw_op(ibe->parent.intf, IPMI_RESET_CHASSIS, 1) =3D=3D 0)= { + if (hk->do_hw_op(hs, IPMI_RESET_CHASSIS, 1) =3D=3D 0) { v |=3D VM_CAPABILITIES_RESET; } - if (k->do_hw_op(ibe->parent.intf, IPMI_SEND_NMI, 1) =3D=3D 0) { + if (hk->do_hw_op(hs, IPMI_SEND_NMI, 1) =3D=3D 0) { v |=3D VM_CAPABILITIES_NMI; } addchar(ibe, v); @@ -433,7 +442,7 @@ static void chr_event(void *opaque, QEMUChrEvent event) ibe->inbuf[1] =3D ibe->outbuf[1] | 0x04; ibe->inbuf[2] =3D ibe->outbuf[2]; ibe->inbuf[3] =3D IPMI_CC_BMC_INIT_IN_PROGRESS; - k->handle_rsp(s, ibe->outbuf[0], ibe->inbuf + 1, 3); + k->handle_msg(s, ibe->outbuf[0], ibe->inbuf + 1, 3); } break; =20 @@ -445,7 +454,7 @@ static void chr_event(void *opaque, QEMUChrEvent event) } } =20 -static void ipmi_bmc_extern_handle_reset(IPMIBmc *b) +static void ipmi_bmc_extern_handle_reset(IPMIBmcHost *b) { IPMIBmcExtern *ibe =3D IPMI_BMC_EXTERN(b); =20 @@ -475,14 +484,15 @@ static int ipmi_bmc_extern_post_migrate(void *opaque,= int version_id) * error on the interface if a response was being waited for. */ if (ibe->waiting_rsp) { - IPMIInterface *ii =3D ibe->parent.intf; + IPMICore *ic =3D opaque; + IPMIInterface *ii =3D ic->intf; IPMIInterfaceClass *iic =3D IPMI_INTERFACE_GET_CLASS(ii); =20 ibe->waiting_rsp =3D false; ibe->inbuf[1] =3D ibe->outbuf[1] | 0x04; ibe->inbuf[2] =3D ibe->outbuf[2]; ibe->inbuf[3] =3D IPMI_CC_BMC_INIT_IN_PROGRESS; - iic->handle_rsp(ii, ibe->outbuf[0], ibe->inbuf + 1, 3); + iic->handle_msg(ii, ibe->outbuf[0], ibe->inbuf + 1, 3); } return 0; } @@ -522,9 +532,10 @@ static Property ipmi_bmc_extern_properties[] =3D { static void ipmi_bmc_extern_class_init(ObjectClass *oc, void *data) { DeviceClass *dc =3D DEVICE_CLASS(oc); - IPMIBmcClass *bk =3D IPMI_BMC_CLASS(oc); + IPMICoreClass *ck =3D IPMI_CORE_CLASS(oc); + IPMIBmcHostClass *bk =3D IPMI_BMC_HOST_CLASS(oc); =20 - bk->handle_command =3D ipmi_bmc_extern_handle_command; + ck->handle_command =3D ipmi_bmc_extern_handle_command; bk->handle_reset =3D ipmi_bmc_extern_handle_reset; dc->hotpluggable =3D false; dc->realize =3D ipmi_bmc_extern_realize; @@ -533,7 +544,7 @@ static void ipmi_bmc_extern_class_init(ObjectClass *oc,= void *data) =20 static const TypeInfo ipmi_bmc_extern_type =3D { .name =3D TYPE_IPMI_BMC_EXTERN, - .parent =3D TYPE_IPMI_BMC, + .parent =3D TYPE_IPMI_BMC_HOST, .instance_size =3D sizeof(IPMIBmcExtern), .instance_init =3D ipmi_bmc_extern_init, .instance_finalize =3D ipmi_bmc_extern_finalize, diff --git a/hw/ipmi/ipmi_bmc_sim.c b/hw/ipmi/ipmi_bmc_sim.c index 905e091094..6296e5cfed 100644 --- a/hw/ipmi/ipmi_bmc_sim.c +++ b/hw/ipmi/ipmi_bmc_sim.c @@ -178,7 +178,7 @@ typedef struct IPMIRcvBufEntry { } IPMIRcvBufEntry; =20 struct IPMIBmcSim { - IPMIBmc parent; + IPMIBmcHost parent; =20 QEMUTimer *timer; =20 @@ -384,7 +384,7 @@ static int sdr_find_entry(IPMISdr *sdr, uint16_t recid, return 1; } =20 -int ipmi_bmc_sdr_find(IPMIBmc *b, uint16_t recid, +int ipmi_bmc_sdr_find(IPMIBmcHost *b, uint16_t recid, const struct ipmi_sdr_compact **sdr, uint16_t *nextr= ec) =20 { @@ -448,10 +448,11 @@ static int attn_irq_enabled(IPMIBmcSim *ibs) IPMI_BMC_MSG_FLAG_EVT_BUF_FULL_SET(ibs)); } =20 -void ipmi_bmc_gen_event(IPMIBmc *b, uint8_t *evt, bool log) +void ipmi_bmc_gen_event(IPMIBmcHost *b, uint8_t *evt, bool log) { IPMIBmcSim *ibs =3D IPMI_BMC_SIMULATOR(b); - IPMIInterface *s =3D ibs->parent.intf; + IPMICore *ic =3D IPMI_CORE(ibs); + IPMIInterface *s =3D ic->intf; IPMIInterfaceClass *k =3D IPMI_INTERFACE_GET_CLASS(s); =20 if (!IPMI_BMC_EVENT_MSG_BUF_ENABLED(ibs)) { @@ -475,7 +476,8 @@ void ipmi_bmc_gen_event(IPMIBmc *b, uint8_t *evt, bool = log) static void gen_event(IPMIBmcSim *ibs, unsigned int sens_num, uint8_t deas= sert, uint8_t evd1, uint8_t evd2, uint8_t evd3) { - IPMIInterface *s =3D ibs->parent.intf; + IPMICore *ic =3D IPMI_CORE(ibs); + IPMIInterface *s =3D ic->intf; IPMIInterfaceClass *k =3D IPMI_INTERFACE_GET_CLASS(s); uint8_t evt[16]; IPMISensor *sens =3D ibs->sensors + sens_num; @@ -638,13 +640,14 @@ static void next_timeout(IPMIBmcSim *ibs) timer_mod_ns(ibs->timer, next); } =20 -static void ipmi_sim_handle_command(IPMIBmc *b, +static void ipmi_sim_handle_command(IPMICore *b, uint8_t *cmd, unsigned int cmd_len, unsigned int max_cmd_len, uint8_t msg_id) { IPMIBmcSim *ibs =3D IPMI_BMC_SIMULATOR(b); - IPMIInterface *s =3D ibs->parent.intf; + IPMICore *ic =3D IPMI_CORE(ibs); + IPMIInterface *s =3D ic->intf; IPMIInterfaceClass *k =3D IPMI_INTERFACE_GET_CLASS(s); const IPMICmdHandler *hdl; RspBuffer rsp =3D RSP_BUFFER_INITIALIZER; @@ -690,15 +693,18 @@ static void ipmi_sim_handle_command(IPMIBmc *b, hdl->cmd_handler(ibs, cmd, cmd_len, &rsp); =20 out: - k->handle_rsp(s, msg_id, rsp.buffer, rsp.len); + k->handle_msg(s, msg_id, rsp.buffer, rsp.len); =20 next_timeout(ibs); } =20 static void ipmi_sim_handle_timeout(IPMIBmcSim *ibs) { - IPMIInterface *s =3D ibs->parent.intf; + IPMICore *ic =3D IPMI_CORE(ibs); + IPMIInterface *s =3D ic->intf; + IPMIInterfaceHost *hs =3D IPMI_INTERFACE_HOST(s); IPMIInterfaceClass *k =3D IPMI_INTERFACE_GET_CLASS(s); + IPMIInterfaceHostClass *hk =3D IPMI_INTERFACE_HOST_CLASS(k); =20 if (!ibs->watchdog_running) { goto out; @@ -708,7 +714,7 @@ static void ipmi_sim_handle_timeout(IPMIBmcSim *ibs) switch (IPMI_BMC_WATCHDOG_GET_PRE_ACTION(ibs)) { case IPMI_BMC_WATCHDOG_PRE_NMI: ibs->msg_flags |=3D IPMI_BMC_MSG_FLAG_WATCHDOG_TIMEOUT_MASK; - k->do_hw_op(s, IPMI_SEND_NMI, 0); + hk->do_hw_op(hs, IPMI_SEND_NMI, 0); sensor_set_discrete_bit(ibs, IPMI_WATCHDOG_SENSOR, 8, 1, 0xc8, (2 << 4) | 0xf, 0xff); break; @@ -743,19 +749,19 @@ static void ipmi_sim_handle_timeout(IPMIBmcSim *ibs) case IPMI_BMC_WATCHDOG_ACTION_RESET: sensor_set_discrete_bit(ibs, IPMI_WATCHDOG_SENSOR, 1, 1, 0xc1, ibs->watchdog_use & 0xf, 0xff); - k->do_hw_op(s, IPMI_RESET_CHASSIS, 0); + hk->do_hw_op(hs, IPMI_RESET_CHASSIS, 0); break; =20 case IPMI_BMC_WATCHDOG_ACTION_POWER_DOWN: sensor_set_discrete_bit(ibs, IPMI_WATCHDOG_SENSOR, 2, 1, 0xc2, ibs->watchdog_use & 0xf, 0xff); - k->do_hw_op(s, IPMI_POWEROFF_CHASSIS, 0); + hk->do_hw_op(hs, IPMI_POWEROFF_CHASSIS, 0); break; =20 case IPMI_BMC_WATCHDOG_ACTION_POWER_CYCLE: sensor_set_discrete_bit(ibs, IPMI_WATCHDOG_SENSOR, 2, 1, 0xc3, ibs->watchdog_use & 0xf, 0xff); - k->do_hw_op(s, IPMI_POWERCYCLE_CHASSIS, 0); + hk->do_hw_op(hs, IPMI_POWERCYCLE_CHASSIS, 0); break; } =20 @@ -788,8 +794,9 @@ static void chassis_control(IPMIBmcSim *ibs, uint8_t *cmd, unsigned int cmd_len, RspBuffer *rsp) { - IPMIInterface *s =3D ibs->parent.intf; - IPMIInterfaceClass *k =3D IPMI_INTERFACE_GET_CLASS(s); + IPMICore *ic =3D IPMI_CORE(ibs); + IPMIInterfaceHost *s =3D IPMI_INTERFACE_HOST(ic->intf); + IPMIInterfaceHostClass *k =3D IPMI_INTERFACE_HOST_GET_CLASS(s); =20 switch (cmd[2] & 0xf) { case 0: /* power down */ @@ -845,8 +852,9 @@ static void get_device_id(IPMIBmcSim *ibs, =20 static void set_global_enables(IPMIBmcSim *ibs, uint8_t val) { - IPMIInterface *s =3D ibs->parent.intf; - IPMIInterfaceClass *k =3D IPMI_INTERFACE_GET_CLASS(s); + IPMICore *ic =3D IPMI_CORE(ibs); + IPMIInterfaceHost *s =3D IPMI_INTERFACE_HOST(ic->intf); + IPMIInterfaceHostClass *k =3D IPMI_INTERFACE_HOST_GET_CLASS(s); bool irqs_on; =20 ibs->bmc_global_enables =3D val; @@ -861,8 +869,9 @@ static void cold_reset(IPMIBmcSim *ibs, uint8_t *cmd, unsigned int cmd_len, RspBuffer *rsp) { - IPMIInterface *s =3D ibs->parent.intf; - IPMIInterfaceClass *k =3D IPMI_INTERFACE_GET_CLASS(s); + IPMICore *ic =3D IPMI_CORE(ibs); + IPMIInterfaceHost *s =3D IPMI_INTERFACE_HOST(ic->intf); + IPMIInterfaceHostClass *k =3D IPMI_INTERFACE_HOST_GET_CLASS(s); =20 /* Disable all interrupts */ set_global_enables(ibs, 1 << IPMI_BMC_EVENT_LOG_BIT); @@ -876,8 +885,9 @@ static void warm_reset(IPMIBmcSim *ibs, uint8_t *cmd, unsigned int cmd_len, RspBuffer *rsp) { - IPMIInterface *s =3D ibs->parent.intf; - IPMIInterfaceClass *k =3D IPMI_INTERFACE_GET_CLASS(s); + IPMICore *ic =3D IPMI_CORE(ibs); + IPMIInterfaceHost *s =3D IPMI_INTERFACE_HOST(ic->intf); + IPMIInterfaceHostClass *k =3D IPMI_INTERFACE_HOST_GET_CLASS(s); =20 if (k->reset) { k->reset(s, false); @@ -939,7 +949,8 @@ static void clr_msg_flags(IPMIBmcSim *ibs, uint8_t *cmd, unsigned int cmd_len, RspBuffer *rsp) { - IPMIInterface *s =3D ibs->parent.intf; + IPMICore *ic =3D IPMI_CORE(ibs); + IPMIInterface *s =3D ic->intf; IPMIInterfaceClass *k =3D IPMI_INTERFACE_GET_CLASS(s); =20 ibs->msg_flags &=3D ~cmd[2]; @@ -957,7 +968,8 @@ static void read_evt_msg_buf(IPMIBmcSim *ibs, uint8_t *cmd, unsigned int cmd_len, RspBuffer *rsp) { - IPMIInterface *s =3D ibs->parent.intf; + IPMICore *ic =3D IPMI_CORE(ibs); + IPMIInterface *s =3D ic->intf; IPMIInterfaceClass *k =3D IPMI_INTERFACE_GET_CLASS(s); unsigned int i; =20 @@ -989,7 +1001,8 @@ static void get_msg(IPMIBmcSim *ibs, g_free(msg); =20 if (QTAILQ_EMPTY(&ibs->rcvbufs)) { - IPMIInterface *s =3D ibs->parent.intf; + IPMICore *ic =3D IPMI_CORE(ibs); + IPMIInterface *s =3D ic->intf; IPMIInterfaceClass *k =3D IPMI_INTERFACE_GET_CLASS(s); =20 ibs->msg_flags &=3D ~IPMI_BMC_MSG_FLAG_RCV_MSG_QUEUE; @@ -1014,7 +1027,8 @@ static void send_msg(IPMIBmcSim *ibs, uint8_t *cmd, unsigned int cmd_len, RspBuffer *rsp) { - IPMIInterface *s =3D ibs->parent.intf; + IPMICore *ic =3D IPMI_CORE(ibs); + IPMIInterface *s =3D ic->intf; IPMIInterfaceClass *k =3D IPMI_INTERFACE_GET_CLASS(s); IPMIRcvBufEntry *msg; uint8_t *buf; @@ -1130,8 +1144,9 @@ static void set_watchdog_timer(IPMIBmcSim *ibs, uint8_t *cmd, unsigned int cmd_len, RspBuffer *rsp) { - IPMIInterface *s =3D ibs->parent.intf; - IPMIInterfaceClass *k =3D IPMI_INTERFACE_GET_CLASS(s); + IPMICore *ic =3D IPMI_CORE(ibs); + IPMIInterfaceHost *s =3D IPMI_INTERFACE_HOST(ic->intf); + IPMIInterfaceHostClass *k =3D IPMI_INTERFACE_HOST_GET_CLASS(s); unsigned int val; =20 val =3D cmd[2] & 0x7; /* Validate use */ @@ -2159,9 +2174,8 @@ out: =20 static void ipmi_sim_realize(DeviceState *dev, Error **errp) { - IPMIBmc *b =3D IPMI_BMC(dev); unsigned int i; - IPMIBmcSim *ibs =3D IPMI_BMC_SIMULATOR(b); + IPMIBmcSim *ibs =3D IPMI_BMC_SIMULATOR(dev); =20 QTAILQ_INIT(&ibs->rcvbufs); =20 @@ -2209,17 +2223,17 @@ static Property ipmi_sim_properties[] =3D { static void ipmi_sim_class_init(ObjectClass *oc, void *data) { DeviceClass *dc =3D DEVICE_CLASS(oc); - IPMIBmcClass *bk =3D IPMI_BMC_CLASS(oc); + IPMICoreClass *ck =3D IPMI_CORE_CLASS(oc); =20 dc->hotpluggable =3D false; dc->realize =3D ipmi_sim_realize; device_class_set_props(dc, ipmi_sim_properties); - bk->handle_command =3D ipmi_sim_handle_command; + ck->handle_command =3D ipmi_sim_handle_command; } =20 static const TypeInfo ipmi_sim_type =3D { .name =3D TYPE_IPMI_BMC_SIMULATOR, - .parent =3D TYPE_IPMI_BMC, + .parent =3D TYPE_IPMI_BMC_HOST, .instance_size =3D sizeof(IPMIBmcSim), .class_init =3D ipmi_sim_class_init, }; diff --git a/hw/ipmi/ipmi_bt.c b/hw/ipmi/ipmi_bt.c index 22f94fb98d..1363098753 100644 --- a/hw/ipmi/ipmi_bt.c +++ b/hw/ipmi/ipmi_bt.c @@ -92,8 +92,9 @@ static void ipmi_bt_lower_irq(IPMIBT *ib) } } =20 -static void ipmi_bt_handle_event(IPMIInterface *ii) +static void ipmi_bt_handle_event(IPMIInterfaceHost *iih) { + IPMIInterface *ii =3D IPMI_INTERFACE(iih); IPMIInterfaceClass *iic =3D IPMI_INTERFACE_GET_CLASS(ii); IPMIBT *ib =3D iic->get_backend_data(ii); =20 @@ -141,8 +142,8 @@ static void ipmi_bt_handle_event(IPMIInterface *ii) ib->waiting_seq =3D ib->inmsg[2]; ib->inmsg[2] =3D ib->inmsg[1]; { - IPMIBmcClass *bk =3D IPMI_BMC_GET_CLASS(ib->bmc); - bk->handle_command(ib->bmc, ib->inmsg + 2, ib->inlen - 2, + IPMICoreClass *ck =3D IPMI_CORE_GET_CLASS(ib->bmc); + ck->handle_command(IPMI_CORE(ib->bmc), ib->inmsg + 2, ib->inlen - = 2, sizeof(ib->inmsg), ib->waiting_rsp); } out: @@ -215,9 +216,9 @@ static uint64_t ipmi_bt_ioport_read(void *opaque, hwadd= r addr, unsigned size) return ret; } =20 -static void ipmi_bt_signal(IPMIBT *ib, IPMIInterface *ii) +static void ipmi_bt_signal(IPMIBT *ib, IPMIInterfaceHost *ii) { - IPMIInterfaceClass *iic =3D IPMI_INTERFACE_GET_CLASS(ii); + IPMIInterfaceHostClass *iic =3D IPMI_INTERFACE_HOST_GET_CLASS(ii); =20 ib->do_wake =3D 1; while (ib->do_wake) { @@ -254,7 +255,7 @@ static void ipmi_bt_ioport_write(void *opaque, hwaddr a= ddr, uint64_t val, } if (IPMI_BT_GET_H2B_ATN(val)) { IPMI_BT_SET_BBUSY(ib->control_reg, 1); - ipmi_bt_signal(ib, ii); + ipmi_bt_signal(ib, IPMI_INTERFACE_HOST(ii)); } break; =20 @@ -329,10 +330,10 @@ static void ipmi_bt_set_atn(IPMIInterface *ii, int va= l, int irq) } } =20 -static void ipmi_bt_handle_reset(IPMIInterface *ii, bool is_cold) +static void ipmi_bt_handle_reset(IPMIInterfaceHost *ii, bool is_cold) { IPMIInterfaceClass *iic =3D IPMI_INTERFACE_GET_CLASS(ii); - IPMIBT *ib =3D iic->get_backend_data(ii); + IPMIBT *ib =3D iic->get_backend_data(IPMI_INTERFACE(ii)); =20 if (is_cold) { /* Disable the BT interrupt on reset */ @@ -344,16 +345,18 @@ static void ipmi_bt_handle_reset(IPMIInterface *ii, b= ool is_cold) } } =20 -static void ipmi_bt_set_irq_enable(IPMIInterface *ii, int val) +static void ipmi_bt_set_irq_enable(IPMIInterfaceHost *ii, int val) { IPMIInterfaceClass *iic =3D IPMI_INTERFACE_GET_CLASS(ii); - IPMIBT *ib =3D iic->get_backend_data(ii); + IPMIBT *ib =3D iic->get_backend_data(IPMI_INTERFACE(ii)); =20 ib->irqs_enabled =3D val; } =20 -static void ipmi_bt_init(IPMIInterface *ii, unsigned int min_size, Error *= *errp) +static void ipmi_bt_init(IPMIInterfaceHost *iih, unsigned int min_size, + Error **errp) { + IPMIInterface *ii =3D IPMI_INTERFACE(iih); IPMIInterfaceClass *iic =3D IPMI_INTERFACE_GET_CLASS(ii); IPMIBT *ib =3D iic->get_backend_data(ii); =20 @@ -426,11 +429,13 @@ void ipmi_bt_get_fwinfo(struct IPMIBT *ib, IPMIFwInfo= *info) info->irq_type =3D IPMI_LEVEL_IRQ; } =20 -void ipmi_bt_class_init(IPMIInterfaceClass *iic) +void ipmi_bt_class_init(IPMIInterfaceClass *ic) { + IPMIInterfaceHostClass *iic =3D IPMI_INTERFACE_HOST_CLASS(ic); + iic->init =3D ipmi_bt_init; - iic->set_atn =3D ipmi_bt_set_atn; - iic->handle_rsp =3D ipmi_bt_handle_rsp; + ic->set_atn =3D ipmi_bt_set_atn; + ic->handle_msg =3D ipmi_bt_handle_rsp; iic->handle_if_event =3D ipmi_bt_handle_event; iic->set_irq_enable =3D ipmi_bt_set_irq_enable; iic->reset =3D ipmi_bt_handle_reset; diff --git a/hw/ipmi/ipmi_kcs.c b/hw/ipmi/ipmi_kcs.c index a77612946a..771f2bc0b2 100644 --- a/hw/ipmi/ipmi_kcs.c +++ b/hw/ipmi/ipmi_kcs.c @@ -94,18 +94,20 @@ static void ipmi_kcs_lower_irq(IPMIKCS *ik) =20 static void ipmi_kcs_signal(IPMIKCS *ik, IPMIInterface *ii) { - IPMIInterfaceClass *iic =3D IPMI_INTERFACE_GET_CLASS(ii); + IPMIInterfaceHost *iih =3D IPMI_INTERFACE_HOST(ii); + IPMIInterfaceHostClass *iic =3D IPMI_INTERFACE_HOST_GET_CLASS(ii); =20 ik->do_wake =3D 1; while (ik->do_wake) { ik->do_wake =3D 0; - iic->handle_if_event(ii); + iic->handle_if_event(iih); } } =20 -static void ipmi_kcs_handle_event(IPMIInterface *ii) +static void ipmi_kcs_handle_event(IPMIInterfaceHost *iih) { - IPMIInterfaceClass *iic =3D IPMI_INTERFACE_GET_CLASS(ii); + IPMIInterface *ii =3D IPMI_INTERFACE(iih); + IPMIInterfaceClass *iic =3D IPMI_INTERFACE_GET_CLASS(iih); IPMIKCS *ik =3D iic->get_backend_data(ii); =20 if (ik->cmd_reg =3D=3D IPMI_KCS_ABORT_STATUS_CMD) { @@ -162,12 +164,12 @@ static void ipmi_kcs_handle_event(IPMIInterface *ii) ik->inlen++; } if (ik->write_end) { - IPMIBmcClass *bk =3D IPMI_BMC_GET_CLASS(ik->bmc); + IPMICoreClass *ck =3D IPMI_CORE_GET_CLASS(ik->bmc); ik->outlen =3D 0; ik->write_end =3D 0; ik->outpos =3D 0; - bk->handle_command(ik->bmc, ik->inmsg, ik->inlen, sizeof(ik->i= nmsg), - ik->waiting_rsp); + ck->handle_command(IPMI_CORE(ik->bmc), ik->inmsg, ik->inlen, + sizeof(ik->inmsg), ik->waiting_rsp); goto out_noibf; } else if (ik->cmd_reg =3D=3D IPMI_KCS_WRITE_END_CMD) { ik->cmd_reg =3D -1; @@ -321,18 +323,19 @@ static void ipmi_kcs_set_atn(IPMIInterface *ii, int v= al, int irq) } } =20 -static void ipmi_kcs_set_irq_enable(IPMIInterface *ii, int val) +static void ipmi_kcs_set_irq_enable(IPMIInterfaceHost *ii, int val) { IPMIInterfaceClass *iic =3D IPMI_INTERFACE_GET_CLASS(ii); - IPMIKCS *ik =3D iic->get_backend_data(ii); + IPMIKCS *ik =3D iic->get_backend_data(IPMI_INTERFACE(ii)); =20 ik->irqs_enabled =3D val; } =20 /* min_size must be a power of 2. */ -static void ipmi_kcs_init(IPMIInterface *ii, unsigned int min_size, +static void ipmi_kcs_init(IPMIInterfaceHost *iih, unsigned int min_size, Error **errp) { + IPMIInterface *ii =3D IPMI_INTERFACE(iih); IPMIInterfaceClass *iic =3D IPMI_INTERFACE_GET_CLASS(ii); IPMIKCS *ik =3D iic->get_backend_data(ii); =20 @@ -413,11 +416,13 @@ void ipmi_kcs_get_fwinfo(IPMIKCS *ik, IPMIFwInfo *inf= o) info->irq_type =3D IPMI_LEVEL_IRQ; } =20 -void ipmi_kcs_class_init(IPMIInterfaceClass *iic) +void ipmi_kcs_class_init(IPMIInterfaceClass *ic) { + IPMIInterfaceHostClass *iic =3D IPMI_INTERFACE_HOST_CLASS(ic); + iic->init =3D ipmi_kcs_init; - iic->set_atn =3D ipmi_kcs_set_atn; - iic->handle_rsp =3D ipmi_kcs_handle_rsp; + ic->set_atn =3D ipmi_kcs_set_atn; + ic->handle_msg =3D ipmi_kcs_handle_rsp; iic->handle_if_event =3D ipmi_kcs_handle_event; iic->set_irq_enable =3D ipmi_kcs_set_irq_enable; } diff --git a/hw/ipmi/isa_ipmi_bt.c b/hw/ipmi/isa_ipmi_bt.c index a83e7243d6..a298f5f981 100644 --- a/hw/ipmi/isa_ipmi_bt.c +++ b/hw/ipmi/isa_ipmi_bt.c @@ -44,7 +44,8 @@ struct ISAIPMIBTDevice { uint32_t uuid; }; =20 -static void isa_ipmi_bt_get_fwinfo(struct IPMIInterface *ii, IPMIFwInfo *i= nfo) +static void isa_ipmi_bt_get_fwinfo(struct IPMIInterfaceHost *ii, + IPMIFwInfo *info) { ISAIPMIBTDevice *iib =3D ISA_IPMI_BT(ii); =20 @@ -73,8 +74,8 @@ static void isa_ipmi_bt_realize(DeviceState *dev, Error *= *errp) Error *err =3D NULL; ISADevice *isadev =3D ISA_DEVICE(dev); ISAIPMIBTDevice *iib =3D ISA_IPMI_BT(dev); - IPMIInterface *ii =3D IPMI_INTERFACE(dev); - IPMIInterfaceClass *iic =3D IPMI_INTERFACE_GET_CLASS(ii); + IPMIInterfaceHost *ii =3D IPMI_INTERFACE_HOST(dev); + IPMIInterfaceHostClass *iic =3D IPMI_INTERFACE_HOST_GET_CLASS(ii); =20 if (!iib->bt.bmc) { error_setg(errp, "IPMI device requires a bmc attribute to be set"); @@ -83,7 +84,7 @@ static void isa_ipmi_bt_realize(DeviceState *dev, Error *= *errp) =20 iib->uuid =3D ipmi_next_uuid(); =20 - iib->bt.bmc->intf =3D ii; + IPMI_CORE(iib->bt.bmc)->intf =3D IPMI_INTERFACE(ii); iib->bt.opaque =3D iib; =20 iic->init(ii, 0, &err); @@ -144,14 +145,15 @@ static Property ipmi_isa_properties[] =3D { static void isa_ipmi_bt_class_init(ObjectClass *oc, void *data) { DeviceClass *dc =3D DEVICE_CLASS(oc); - IPMIInterfaceClass *iic =3D IPMI_INTERFACE_CLASS(oc); + IPMIInterfaceHostClass *iic =3D IPMI_INTERFACE_HOST_CLASS(oc); + IPMIInterfaceClass *ic =3D IPMI_INTERFACE_CLASS(oc); AcpiDevAmlIfClass *adevc =3D ACPI_DEV_AML_IF_CLASS(oc); =20 dc->realize =3D isa_ipmi_bt_realize; device_class_set_props(dc, ipmi_isa_properties); =20 - iic->get_backend_data =3D isa_ipmi_bt_get_backend_data; - ipmi_bt_class_init(iic); + ic->get_backend_data =3D isa_ipmi_bt_get_backend_data; + ipmi_bt_class_init(ic); iic->get_fwinfo =3D isa_ipmi_bt_get_fwinfo; adevc->build_dev_aml =3D build_ipmi_dev_aml; } @@ -163,7 +165,7 @@ static const TypeInfo isa_ipmi_bt_info =3D { .instance_init =3D isa_ipmi_bt_init, .class_init =3D isa_ipmi_bt_class_init, .interfaces =3D (InterfaceInfo[]) { - { TYPE_IPMI_INTERFACE }, + { TYPE_IPMI_INTERFACE_HOST }, { TYPE_ACPI_DEV_AML_IF }, { } } diff --git a/hw/ipmi/isa_ipmi_kcs.c b/hw/ipmi/isa_ipmi_kcs.c index b2ed70b9da..a1372ae448 100644 --- a/hw/ipmi/isa_ipmi_kcs.c +++ b/hw/ipmi/isa_ipmi_kcs.c @@ -44,7 +44,7 @@ struct ISAIPMIKCSDevice { uint32_t uuid; }; =20 -static void isa_ipmi_kcs_get_fwinfo(IPMIInterface *ii, IPMIFwInfo *info) +static void isa_ipmi_kcs_get_fwinfo(IPMIInterfaceHost *ii, IPMIFwInfo *inf= o) { ISAIPMIKCSDevice *iik =3D ISA_IPMI_KCS(ii); =20 @@ -72,8 +72,8 @@ static void ipmi_isa_realize(DeviceState *dev, Error **er= rp) Error *err =3D NULL; ISADevice *isadev =3D ISA_DEVICE(dev); ISAIPMIKCSDevice *iik =3D ISA_IPMI_KCS(dev); - IPMIInterface *ii =3D IPMI_INTERFACE(dev); - IPMIInterfaceClass *iic =3D IPMI_INTERFACE_GET_CLASS(ii); + IPMIInterfaceHost *ii =3D IPMI_INTERFACE_HOST(dev); + IPMIInterfaceHostClass *iic =3D IPMI_INTERFACE_HOST_GET_CLASS(ii); =20 if (!iik->kcs.bmc) { error_setg(errp, "IPMI device requires a bmc attribute to be set"); @@ -82,7 +82,7 @@ static void ipmi_isa_realize(DeviceState *dev, Error **er= rp) =20 iik->uuid =3D ipmi_next_uuid(); =20 - iik->kcs.bmc->intf =3D ii; + IPMI_CORE(iik->kcs.bmc)->intf =3D IPMI_INTERFACE(ii); iik->kcs.opaque =3D iik; =20 iic->init(ii, 0, &err); @@ -152,6 +152,7 @@ static void isa_ipmi_kcs_class_init(ObjectClass *oc, vo= id *data) { DeviceClass *dc =3D DEVICE_CLASS(oc); IPMIInterfaceClass *iic =3D IPMI_INTERFACE_CLASS(oc); + IPMIInterfaceHostClass *iihc =3D IPMI_INTERFACE_HOST_CLASS(oc); AcpiDevAmlIfClass *adevc =3D ACPI_DEV_AML_IF_CLASS(oc); =20 dc->realize =3D ipmi_isa_realize; @@ -159,7 +160,7 @@ static void isa_ipmi_kcs_class_init(ObjectClass *oc, vo= id *data) =20 iic->get_backend_data =3D isa_ipmi_kcs_get_backend_data; ipmi_kcs_class_init(iic); - iic->get_fwinfo =3D isa_ipmi_kcs_get_fwinfo; + iihc->get_fwinfo =3D isa_ipmi_kcs_get_fwinfo; adevc->build_dev_aml =3D build_ipmi_dev_aml; } =20 @@ -170,7 +171,7 @@ static const TypeInfo isa_ipmi_kcs_info =3D { .instance_init =3D isa_ipmi_kcs_init, .class_init =3D isa_ipmi_kcs_class_init, .interfaces =3D (InterfaceInfo[]) { - { TYPE_IPMI_INTERFACE }, + { TYPE_IPMI_INTERFACE_HOST }, { TYPE_ACPI_DEV_AML_IF }, { } } diff --git a/hw/ipmi/pci_ipmi_bt.c b/hw/ipmi/pci_ipmi_bt.c index 633931b825..883bbda8f1 100644 --- a/hw/ipmi/pci_ipmi_bt.c +++ b/hw/ipmi/pci_ipmi_bt.c @@ -56,8 +56,8 @@ static void pci_ipmi_bt_realize(PCIDevice *pd, Error **er= rp) { Error *err =3D NULL; PCIIPMIBTDevice *pik =3D PCI_IPMI_BT(pd); - IPMIInterface *ii =3D IPMI_INTERFACE(pd); - IPMIInterfaceClass *iic =3D IPMI_INTERFACE_GET_CLASS(ii); + IPMIInterfaceHost *ii =3D IPMI_INTERFACE_HOST(pd); + IPMIInterfaceHostClass *iic =3D IPMI_INTERFACE_HOST_GET_CLASS(ii); =20 if (!pik->bt.bmc) { error_setg(errp, "IPMI device requires a bmc attribute to be set"); @@ -66,7 +66,7 @@ static void pci_ipmi_bt_realize(PCIDevice *pd, Error **er= rp) =20 pik->uuid =3D ipmi_next_uuid(); =20 - pik->bt.bmc->intf =3D ii; + IPMI_CORE(pik->bt.bmc)->intf =3D IPMI_INTERFACE(ii); pik->bt.opaque =3D pik; =20 pci_config_set_prog_interface(pd->config, 0x02); /* BT */ @@ -134,7 +134,7 @@ static const TypeInfo pci_ipmi_bt_info =3D { .instance_init =3D pci_ipmi_bt_instance_init, .class_init =3D pci_ipmi_bt_class_init, .interfaces =3D (InterfaceInfo[]) { - { TYPE_IPMI_INTERFACE }, + { TYPE_IPMI_INTERFACE_HOST }, { INTERFACE_CONVENTIONAL_PCI_DEVICE }, { } } diff --git a/hw/ipmi/pci_ipmi_kcs.c b/hw/ipmi/pci_ipmi_kcs.c index 1a581413c2..40f8da95af 100644 --- a/hw/ipmi/pci_ipmi_kcs.c +++ b/hw/ipmi/pci_ipmi_kcs.c @@ -56,8 +56,8 @@ static void pci_ipmi_kcs_realize(PCIDevice *pd, Error **e= rrp) { Error *err =3D NULL; PCIIPMIKCSDevice *pik =3D PCI_IPMI_KCS(pd); - IPMIInterface *ii =3D IPMI_INTERFACE(pd); - IPMIInterfaceClass *iic =3D IPMI_INTERFACE_GET_CLASS(ii); + IPMIInterfaceHost *ii =3D IPMI_INTERFACE_HOST(pd); + IPMIInterfaceHostClass *iic =3D IPMI_INTERFACE_HOST_GET_CLASS(ii); =20 if (!pik->kcs.bmc) { error_setg(errp, "IPMI device requires a bmc attribute to be set"); @@ -66,7 +66,7 @@ static void pci_ipmi_kcs_realize(PCIDevice *pd, Error **e= rrp) =20 pik->uuid =3D ipmi_next_uuid(); =20 - pik->kcs.bmc->intf =3D ii; + IPMI_CORE(pik->kcs.bmc)->intf =3D IPMI_INTERFACE(ii); pik->kcs.opaque =3D pik; =20 pci_config_set_prog_interface(pd->config, 0x01); /* KCS */ @@ -134,7 +134,7 @@ static const TypeInfo pci_ipmi_kcs_info =3D { .instance_init =3D pci_ipmi_kcs_instance_init, .class_init =3D pci_ipmi_kcs_class_init, .interfaces =3D (InterfaceInfo[]) { - { TYPE_IPMI_INTERFACE }, + { TYPE_IPMI_INTERFACE_HOST }, { INTERFACE_CONVENTIONAL_PCI_DEVICE }, { } } diff --git a/hw/ipmi/smbus_ipmi.c b/hw/ipmi/smbus_ipmi.c index d0991ab7f9..f61b260f58 100644 --- a/hw/ipmi/smbus_ipmi.c +++ b/hw/ipmi/smbus_ipmi.c @@ -49,7 +49,7 @@ OBJECT_DECLARE_SIMPLE_TYPE(SMBusIPMIDevice, SMBUS_IPMI) struct SMBusIPMIDevice { SMBusDevice parent; =20 - IPMIBmc *bmc; + IPMIBmcHost *bmc; =20 uint8_t outmsg[MAX_SSIF_IPMI_MSG_SIZE]; uint32_t outlen; @@ -71,7 +71,7 @@ struct SMBusIPMIDevice { uint32_t uuid; }; =20 -static void smbus_ipmi_handle_event(IPMIInterface *ii) +static void smbus_ipmi_handle_event(IPMIInterfaceHost *ii) { /* No interrupts, so nothing to do here. */ } @@ -100,7 +100,7 @@ static void smbus_ipmi_set_atn(IPMIInterface *ii, int v= al, int irq) /* This is where PEC would go. */ } =20 -static void smbus_ipmi_set_irq_enable(IPMIInterface *ii, int val) +static void smbus_ipmi_set_irq_enable(IPMIInterfaceHost *ii, int val) { } =20 @@ -108,7 +108,7 @@ static void smbus_ipmi_send_msg(SMBusIPMIDevice *sid) { uint8_t *msg =3D sid->inmsg; uint32_t len =3D sid->inlen; - IPMIBmcClass *bk =3D IPMI_BMC_GET_CLASS(sid->bmc); + IPMICoreClass *ck =3D IPMI_CORE_GET_CLASS(sid->bmc); =20 sid->outlen =3D 0; sid->outpos =3D 0; @@ -136,8 +136,8 @@ static void smbus_ipmi_send_msg(SMBusIPMIDevice *sid) return; } =20 - bk->handle_command(sid->bmc, sid->inmsg, sid->inlen, sizeof(sid->inmsg= ), - sid->waiting_rsp); + ck->handle_command(IPMI_CORE(sid->bmc), sid->inmsg, sid->inlen, + sizeof(sid->inmsg), sid->waiting_rsp); } =20 static uint8_t ipmi_receive_byte(SMBusDevice *dev) @@ -326,7 +326,7 @@ static void smbus_ipmi_realize(DeviceState *dev, Error = **errp) =20 sid->uuid =3D ipmi_next_uuid(); =20 - sid->bmc->intf =3D ii; + IPMI_CORE(sid->bmc)->intf =3D ii; } =20 static void smbus_ipmi_init(Object *obj) @@ -336,7 +336,8 @@ static void smbus_ipmi_init(Object *obj) ipmi_bmc_find_and_link(obj, (Object **) &sid->bmc); } =20 -static void smbus_ipmi_get_fwinfo(struct IPMIInterface *ii, IPMIFwInfo *in= fo) +static void smbus_ipmi_get_fwinfo(struct IPMIInterfaceHost *ii, + IPMIFwInfo *info) { SMBusIPMIDevice *sid =3D SMBUS_IPMI(ii); =20 @@ -354,7 +355,8 @@ static void smbus_ipmi_get_fwinfo(struct IPMIInterface = *ii, IPMIFwInfo *info) static void smbus_ipmi_class_init(ObjectClass *oc, void *data) { DeviceClass *dc =3D DEVICE_CLASS(oc); - IPMIInterfaceClass *iic =3D IPMI_INTERFACE_CLASS(oc); + IPMIInterfaceHostClass *iic =3D IPMI_INTERFACE_HOST_CLASS(oc); + IPMIInterfaceClass *ic =3D IPMI_INTERFACE_CLASS(oc); SMBusDeviceClass *sc =3D SMBUS_DEVICE_CLASS(oc); AcpiDevAmlIfClass *adevc =3D ACPI_DEV_AML_IF_CLASS(oc); =20 @@ -362,8 +364,8 @@ static void smbus_ipmi_class_init(ObjectClass *oc, void= *data) sc->write_data =3D ipmi_write_data; dc->vmsd =3D &vmstate_smbus_ipmi; dc->realize =3D smbus_ipmi_realize; - iic->set_atn =3D smbus_ipmi_set_atn; - iic->handle_rsp =3D smbus_ipmi_handle_rsp; + ic->set_atn =3D smbus_ipmi_set_atn; + ic->handle_msg =3D smbus_ipmi_handle_rsp; iic->handle_if_event =3D smbus_ipmi_handle_event; iic->set_irq_enable =3D smbus_ipmi_set_irq_enable; iic->get_fwinfo =3D smbus_ipmi_get_fwinfo; @@ -377,7 +379,7 @@ static const TypeInfo smbus_ipmi_info =3D { .instance_init =3D smbus_ipmi_init, .class_init =3D smbus_ipmi_class_init, .interfaces =3D (InterfaceInfo[]) { - { TYPE_IPMI_INTERFACE }, + { TYPE_IPMI_INTERFACE_HOST }, { TYPE_ACPI_DEV_AML_IF }, { } } diff --git a/hw/ppc/pnv.c b/hw/ppc/pnv.c index 11cb48af2f..a39cbdaa38 100644 --- a/hw/ppc/pnv.c +++ b/hw/ppc/pnv.c @@ -595,7 +595,7 @@ static void pnv_powerdown_notify(Notifier *n, void *opa= que) static void pnv_reset(MachineState *machine, ShutdownCause reason) { PnvMachineState *pnv =3D PNV_MACHINE(machine); - IPMIBmc *bmc; + IPMIBmcHost *bmc; void *fdt; =20 qemu_devices_reset(reason); @@ -746,7 +746,7 @@ static bool pnv_match_cpu(const char *default_type, con= st char *cpu_type) return ppc_default->pvr_match(ppc_default, ppc->pvr, false); } =20 -static void pnv_ipmi_bt_init(ISABus *bus, IPMIBmc *bmc, uint32_t irq) +static void pnv_ipmi_bt_init(ISABus *bus, IPMIBmcHost *bmc, uint32_t irq) { ISADevice *dev =3D isa_new("isa-ipmi-bt"); =20 diff --git a/hw/ppc/pnv_bmc.c b/hw/ppc/pnv_bmc.c index 99f1e8d7f9..6e8a6f545b 100644 --- a/hw/ppc/pnv_bmc.c +++ b/hw/ppc/pnv_bmc.c @@ -50,12 +50,12 @@ typedef struct OemSel { #define SOFT_OFF 0x00 #define SOFT_REBOOT 0x01 =20 -static bool pnv_bmc_is_simulator(IPMIBmc *bmc) +static bool pnv_bmc_is_simulator(IPMIBmcHost *bmc) { return object_dynamic_cast(OBJECT(bmc), TYPE_IPMI_BMC_SIMULATOR); } =20 -static void pnv_gen_oem_sel(IPMIBmc *bmc, uint8_t reboot) +static void pnv_gen_oem_sel(IPMIBmcHost *bmc, uint8_t reboot) { /* IPMI SEL Event are 16 bytes long */ OemSel sel =3D { @@ -71,12 +71,12 @@ static void pnv_gen_oem_sel(IPMIBmc *bmc, uint8_t reboo= t) ipmi_bmc_gen_event(bmc, (uint8_t *) &sel, 0 /* do not log the event */= ); } =20 -void pnv_bmc_powerdown(IPMIBmc *bmc) +void pnv_bmc_powerdown(IPMIBmcHost *bmc) { pnv_gen_oem_sel(bmc, SOFT_OFF); } =20 -void pnv_dt_bmc_sensors(IPMIBmc *bmc, void *fdt) +void pnv_dt_bmc_sensors(IPMIBmcHost *bmc, void *fdt) { int offset; int i; @@ -249,7 +249,7 @@ static const IPMINetfn hiomap_netfn =3D { }; =20 =20 -void pnv_bmc_set_pnor(IPMIBmc *bmc, PnvPnor *pnor) +void pnv_bmc_set_pnor(IPMIBmcHost *bmc, PnvPnor *pnor) { if (!pnv_bmc_is_simulator(bmc)) { return; @@ -267,15 +267,15 @@ void pnv_bmc_set_pnor(IPMIBmc *bmc, PnvPnor *pnor) * Instantiate the machine BMC. PowerNV uses the QEMU internal * simulator but it could also be external. */ -IPMIBmc *pnv_bmc_create(PnvPnor *pnor) +IPMIBmcHost *pnv_bmc_create(PnvPnor *pnor) { Object *obj; =20 obj =3D object_new(TYPE_IPMI_BMC_SIMULATOR); qdev_realize(DEVICE(obj), NULL, &error_fatal); - pnv_bmc_set_pnor(IPMI_BMC(obj), pnor); + pnv_bmc_set_pnor(IPMI_BMC_HOST(obj), pnor); =20 - return IPMI_BMC(obj); + return IPMI_BMC_HOST(obj); } =20 typedef struct ForeachArgs { @@ -296,9 +296,9 @@ static int bmc_find(Object *child, void *opaque) return 0; } =20 -IPMIBmc *pnv_bmc_find(Error **errp) +IPMIBmcHost *pnv_bmc_find(Error **errp) { - ForeachArgs args =3D { TYPE_IPMI_BMC, NULL }; + ForeachArgs args =3D { TYPE_IPMI_BMC_HOST, NULL }; int ret; =20 ret =3D object_child_foreach_recursive(object_get_root(), bmc_find, &a= rgs); @@ -308,5 +308,5 @@ IPMIBmc *pnv_bmc_find(Error **errp) return NULL; } =20 - return args.obj ? IPMI_BMC(args.obj) : NULL; + return args.obj ? IPMI_BMC_HOST(args.obj) : NULL; } diff --git a/hw/smbios/smbios_type_38.c b/hw/smbios/smbios_type_38.c index 168b886647..81a1cf09ea 100644 --- a/hw/smbios/smbios_type_38.c +++ b/hw/smbios/smbios_type_38.c @@ -83,16 +83,17 @@ static void smbios_add_ipmi_devices(BusState *bus) =20 QTAILQ_FOREACH(kid, &bus->children, sibling) { DeviceState *dev =3D kid->child; - Object *obj =3D object_dynamic_cast(OBJECT(dev), TYPE_IPMI_INTERFA= CE); + Object *obj =3D object_dynamic_cast(OBJECT(dev), + TYPE_IPMI_INTERFACE_HOST); BusState *childbus; =20 if (obj) { - IPMIInterface *ii; - IPMIInterfaceClass *iic; + IPMIInterfaceHost *ii; + IPMIInterfaceHostClass *iic; IPMIFwInfo info; =20 - ii =3D IPMI_INTERFACE(obj); - iic =3D IPMI_INTERFACE_GET_CLASS(obj); + ii =3D IPMI_INTERFACE_HOST(obj); + iic =3D IPMI_INTERFACE_HOST_GET_CLASS(obj); memset(&info, 0, sizeof(info)); if (!iic->get_fwinfo) { continue; diff --git a/include/hw/ipmi/ipmi.h b/include/hw/ipmi/ipmi.h index 77a7213ed9..5ead2467f5 100644 --- a/include/hw/ipmi/ipmi.h +++ b/include/hw/ipmi/ipmi.h @@ -109,99 +109,156 @@ uint32_t ipmi_next_uuid(void); * and the BMC. */ #define TYPE_IPMI_INTERFACE "ipmi-interface" -#define IPMI_INTERFACE(obj) \ - INTERFACE_CHECK(IPMIInterface, (obj), TYPE_IPMI_INTERFACE) -typedef struct IPMIInterfaceClass IPMIInterfaceClass; -DECLARE_CLASS_CHECKERS(IPMIInterfaceClass, IPMI_INTERFACE, - TYPE_IPMI_INTERFACE) +OBJECT_DECLARE_TYPE(IPMIInterface, IPMIInterfaceClass, IPMI_INTERFACE) =20 +typedef struct IPMIInterfaceClass IPMIInterfaceClass; typedef struct IPMIInterface IPMIInterface; =20 struct IPMIInterfaceClass { InterfaceClass parent; =20 + /* + * The interfaces use this to perform certain ops + */ + void (*set_atn)(struct IPMIInterface *s, int val, int irq); + + /* + * Set by the owner to hold the backend data for the interface. + */ + void *(*get_backend_data)(struct IPMIInterface *s); + + /* + * Handle a message between the host and the BMC. + */ + void (*handle_msg)(struct IPMIInterface *s, uint8_t msg_id, + unsigned char *msg, unsigned int msg_len); +}; + +/* + * An IPMI Interface representing host side communication to a + * remote BMC, either simulated or an IPMI BMC client. + */ +#define TYPE_IPMI_INTERFACE_HOST "ipmi-interface-host" +OBJECT_DECLARE_TYPE(IPMIInterfaceHost, IPMIInterfaceHostClass, \ + IPMI_INTERFACE_HOST) + +typedef struct IPMIInterfaceHostClass IPMIInterfaceHostClass; +typedef struct IPMIInterfaceHost IPMIInterfaceHost; + +struct IPMIInterfaceHostClass { + IPMIInterfaceClass parent; + /* * min_size is the requested I/O size and must be a power of 2. * This is so PCI (or other busses) can request a bigger range. * Use 0 for the default. */ - void (*init)(struct IPMIInterface *s, unsigned int min_size, Error **e= rrp); + void (*init)(struct IPMIInterfaceHost *s, unsigned int min_size, + Error **errp); =20 /* * Perform various operations on the hardware. If checkonly is * true, it will return if the operation can be performed, but it * will not do the operation. */ - int (*do_hw_op)(struct IPMIInterface *s, enum ipmi_op op, int checkonl= y); + int (*do_hw_op)(struct IPMIInterfaceHost *s, enum ipmi_op op, + int checkonly); =20 /* * Enable/disable irqs on the interface when the BMC requests this. */ - void (*set_irq_enable)(struct IPMIInterface *s, int val); + void (*set_irq_enable)(struct IPMIInterfaceHost *s, int val); =20 /* * Handle an event that occurred on the interface, generally the. * target writing to a register. */ - void (*handle_if_event)(struct IPMIInterface *s); - - /* - * The interfaces use this to perform certain ops - */ - void (*set_atn)(struct IPMIInterface *s, int val, int irq); + void (*handle_if_event)(struct IPMIInterfaceHost *s); =20 /* * Got an IPMI warm/cold reset. */ - void (*reset)(struct IPMIInterface *s, bool is_cold); + void (*reset)(struct IPMIInterfaceHost *s, bool is_cold); =20 /* - * Handle a response from the bmc. + * Return the firmware info for a device. */ - void (*handle_rsp)(struct IPMIInterface *s, uint8_t msg_id, - unsigned char *rsp, unsigned int rsp_len); + void (*get_fwinfo)(struct IPMIInterfaceHost *s, IPMIFwInfo *info); +}; =20 - /* - * Set by the owner to hold the backend data for the interface. - */ - void *(*get_backend_data)(struct IPMIInterface *s); +/* + * An IPMI Interface representing BMC side communication to a + * remote host running `ipmi-bmc-extern`. + */ +#define TYPE_IPMI_INTERFACE_CLIENT "ipmi-interface-client" +OBJECT_DECLARE_TYPE(IPMIInterfaceClient, IPMIInterfaceClientClass, + IPMI_INTERFACE_CLIENT) =20 - /* - * Return the firmware info for a device. - */ - void (*get_fwinfo)(struct IPMIInterface *s, IPMIFwInfo *info); +typedef struct IPMIInterfaceClientClass IPMIInterfaceClientClass; +typedef struct IPMIInterfaceClient IPMIInterfaceClient; + +struct IPMIInterfaceClientClass { + IPMIInterfaceClass parent; }; =20 /* - * Define a BMC simulator (or perhaps a connection to a real BMC) + * Define an IPMI core (Either BMC or Host simulator.) */ -#define TYPE_IPMI_BMC "ipmi-bmc" -OBJECT_DECLARE_TYPE(IPMIBmc, IPMIBmcClass, - IPMI_BMC) +#define TYPE_IPMI_CORE "ipmi-core" +OBJECT_DECLARE_TYPE(IPMICore, IPMICoreClass, IPMI_CORE) =20 -struct IPMIBmc { +struct IPMICore { DeviceState parent; =20 - uint8_t slave_addr; - IPMIInterface *intf; }; =20 -struct IPMIBmcClass { +struct IPMICoreClass { DeviceClass parent; =20 - /* Called when the system resets to report to the bmc. */ - void (*handle_reset)(struct IPMIBmc *s); + /* + * Handle a hardware command. + */ + void (*handle_hw_op)(struct IPMICore *s, uint8_t hw_op, uint8_t operan= d); =20 /* * Handle a command to the bmc. */ - void (*handle_command)(struct IPMIBmc *s, + void (*handle_command)(struct IPMICore *s, uint8_t *cmd, unsigned int cmd_len, unsigned int max_cmd_len, uint8_t msg_id); }; =20 +/* + * Define a BMC simulator (or perhaps a connection to a real BMC) + */ +#define TYPE_IPMI_BMC_HOST "ipmi-bmc-host" +OBJECT_DECLARE_TYPE(IPMIBmcHost, IPMIBmcHostClass, IPMI_BMC_HOST) + +struct IPMIBmcHost { + IPMICore parent; + + uint8_t slave_addr; +}; + +struct IPMIBmcHostClass { + IPMICoreClass parent; + + /* Called when the system resets to report to the bmc. */ + void (*handle_reset)(struct IPMIBmcHost *s); + +}; + +/* + * Define a BMC side client that responds to an `ipmi-bmc-extern`. + */ +#define TYPE_IPMI_BMC_CLIENT "ipmi-bmc-client" +OBJECT_DECLARE_SIMPLE_TYPE(IPMIBmcClient, IPMI_BMC_CLIENT) +struct IPMIBmcClient { + IPMICore parent; +}; + /* * Add a link property to obj that points to a BMC. */ @@ -259,9 +316,9 @@ struct ipmi_sdr_compact { =20 typedef uint8_t ipmi_sdr_compact_buffer[sizeof(struct ipmi_sdr_compact)]; =20 -int ipmi_bmc_sdr_find(IPMIBmc *b, uint16_t recid, +int ipmi_bmc_sdr_find(IPMIBmcHost *b, uint16_t recid, const struct ipmi_sdr_compact **sdr, uint16_t *nextr= ec); -void ipmi_bmc_gen_event(IPMIBmc *b, uint8_t *evt, bool log); +void ipmi_bmc_gen_event(IPMIBmcHost *b, uint8_t *evt, bool log); =20 #define TYPE_IPMI_BMC_SIMULATOR "ipmi-bmc-sim" OBJECT_DECLARE_SIMPLE_TYPE(IPMIBmcSim, IPMI_BMC_SIMULATOR) diff --git a/include/hw/ipmi/ipmi_bt.h b/include/hw/ipmi/ipmi_bt.h index 8a4316ea7c..237dbb4599 100644 --- a/include/hw/ipmi/ipmi_bt.h +++ b/include/hw/ipmi/ipmi_bt.h @@ -28,7 +28,7 @@ #include "hw/ipmi/ipmi.h" =20 typedef struct IPMIBT { - IPMIBmc *bmc; + IPMIBmcHost *bmc; =20 bool do_wake; =20 diff --git a/include/hw/ipmi/ipmi_kcs.h b/include/hw/ipmi/ipmi_kcs.h index 6e6ef4c539..1f491b7243 100644 --- a/include/hw/ipmi/ipmi_kcs.h +++ b/include/hw/ipmi/ipmi_kcs.h @@ -28,7 +28,7 @@ #include "hw/ipmi/ipmi.h" =20 typedef struct IPMIKCS { - IPMIBmc *bmc; + IPMIBmcHost *bmc; =20 bool do_wake; =20 diff --git a/include/hw/ppc/pnv.h b/include/hw/ppc/pnv.h index 409f3bf763..b712a7e8d5 100644 --- a/include/hw/ppc/pnv.h +++ b/include/hw/ppc/pnv.h @@ -91,7 +91,7 @@ struct PnvMachineState { ISABus *isa_bus; uint32_t cpld_irqstate; =20 - IPMIBmc *bmc; + IPMIBmcHost *bmc; Notifier powerdown_notifier; =20 PnvPnor *pnor; @@ -108,11 +108,11 @@ PnvChip *pnv_chip_add_phb(PnvChip *chip, PnvPHB *phb); /* * BMC helpers */ -void pnv_dt_bmc_sensors(IPMIBmc *bmc, void *fdt); -void pnv_bmc_powerdown(IPMIBmc *bmc); -IPMIBmc *pnv_bmc_create(PnvPnor *pnor); -IPMIBmc *pnv_bmc_find(Error **errp); -void pnv_bmc_set_pnor(IPMIBmc *bmc, PnvPnor *pnor); +void pnv_dt_bmc_sensors(IPMIBmcHost *bmc, void *fdt); +void pnv_bmc_powerdown(IPMIBmcHost *bmc); +IPMIBmcHost *pnv_bmc_create(PnvPnor *pnor); +IPMIBmcHost *pnv_bmc_find(Error **errp); +void pnv_bmc_set_pnor(IPMIBmcHost *bmc, PnvPnor *pnor); =20 /* * POWER8 MMIO base addresses --=20 2.40.0.348.gf938b09366-goog