From nobody Tue Feb 10 21:41:02 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 (208.118.235.17 [208.118.235.17]) by mx.zohomail.com with SMTPS id 1512682789566501.0162050837521; Thu, 7 Dec 2017 13:39:49 -0800 (PST) Received: from localhost ([::1]:34450 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eN3tO-0006Y0-Pl for importer@patchew.org; Thu, 07 Dec 2017 16:39:42 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:46759) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eN3ot-0001vx-Fd for qemu-devel@nongnu.org; Thu, 07 Dec 2017 16:35:04 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1eN3or-00054h-8x for qemu-devel@nongnu.org; Thu, 07 Dec 2017 16:35:03 -0500 Received: from mail-pg0-x242.google.com ([2607:f8b0:400e:c05::242]:42392) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1eN3or-00053r-0A for qemu-devel@nongnu.org; Thu, 07 Dec 2017 16:35:01 -0500 Received: by mail-pg0-x242.google.com with SMTP id e14so5366255pgr.9 for ; Thu, 07 Dec 2017 13:35:00 -0800 (PST) Received: from serve.minyard.net ([47.184.168.85]) by smtp.gmail.com with ESMTPSA id s184sm1772017pfb.9.2017.12.07.13.34.56 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 07 Dec 2017 13:34:57 -0800 (PST) Received: from t430.minyard.net (t430m.minyard.net [192.168.27.3]) by serve.minyard.net (Postfix) with ESMTPA id B33F4CF0; Thu, 7 Dec 2017 15:34:53 -0600 (CST) Received: by t430.minyard.net (Postfix, from userid 1000) id 3D42D30008F; Thu, 7 Dec 2017 15:34:52 -0600 (CST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references; bh=ba92l3LFx1+Ht8sl7OUzFvrBVOExWKkqYB6FsoZgV1c=; b=mzvmT0TVMUmmrKZI6cEmEngWR0+kiAixsXXrIBiLZMxajzAR7zlkTKdw182FIP6Etw MHKuTmYbJdx6zdlxDY/vVppDq2iOnbsAqEfA96JFBmH5hIWEGPqoxVqnSrgSXUmfwdyU PwgRYyRMY5prb86Hr6iJ1khqxuNoNulNjcAALowSKyPE71aS2uuzLlN+RYgS9zxSNUvY Y321pDYSikLsTMIUStyKHb7qwcWrtAxj2hQX/TENQgEGwfb5gSeulPIaHkfkf9wfvIgF P70+C/iuXJCS0lhDymLlJ2XGSDzuqBUwluDF4/x0lMYkdftJqFk9tfLI4V+cOGMXAIs4 sT/w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references; bh=ba92l3LFx1+Ht8sl7OUzFvrBVOExWKkqYB6FsoZgV1c=; b=b5mcyGa7IAQO7p43QHVOqZb6vfUa1v08+sq9Wh7QT8znQwWysOThVyegdOfslGqsV1 EXHLH/9qn2qZ1K6d5qHxKOf9R9qOBJky2feW8HimBa8D0SR6M2UmeZ8VSkZpvSK9sILR MIvJhlwwEWUqgmIIpMxkzgJcecH2WUHIYqeHbwp31auHYLzZAs6ovm0qk241LQAzvLJc eds+o3YM9V59V7CWQ3msgnQLsrwZo+KyFIl2q0Ej096ZvjBBNJzJh999dXIck7yghjmQ fm/dg3auSKkzcCZz4Rmz6RYfBunRjt4Re80QMrzknva1U262vmj8YxQ4NIwImlYt1wjd ekTw== X-Gm-Message-State: AJaThX5S2T8zdF+DcMlMjN/PjjhpGj1e6/JghMPOAQEZdsKEoQXPlXVA A398hyWYBWJtggaVvy06mqhIrBA= X-Google-Smtp-Source: AGs4zMYdVtwt92WXkf348Js8+AEa1QVPeAq/k7eivUbj9c0E+ZtJac4wIcXY9d3EBXG0lHexjtDOIQ== X-Received: by 10.101.90.8 with SMTP id y8mr26733417pgs.21.1512682499863; Thu, 07 Dec 2017 13:34:59 -0800 (PST) From: minyard@acm.org To: qemu-devel@nongnu.org Date: Thu, 7 Dec 2017 15:34:47 -0600 Message-Id: <1512682489-4474-6-git-send-email-minyard@acm.org> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1512682489-4474-1-git-send-email-minyard@acm.org> References: <1512682489-4474-1-git-send-email-minyard@acm.org> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:400e:c05::242 Subject: [Qemu-devel] [PATCH 5/7] ipmi: Allow a size value to be passed for I/O space 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: Corey Minyard 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" From: Corey Minyard PCI device I/O must be >=3D 8 bytes in length or they don't work. Allow the size to be passed in, the default size of 2 or 3 won't work. Signed-off-by: Corey Minyard --- hw/ipmi/ipmi_bt.c | 19 +++++++++++++++---- hw/ipmi/ipmi_kcs.c | 23 +++++++++++++++++++---- hw/ipmi/isa_ipmi_bt.c | 2 +- hw/ipmi/isa_ipmi_kcs.c | 2 +- include/hw/ipmi/ipmi.h | 7 ++++++- include/hw/ipmi/ipmi_bt.h | 1 + include/hw/ipmi/ipmi_kcs.h | 1 + 7 files changed, 44 insertions(+), 11 deletions(-) diff --git a/hw/ipmi/ipmi_bt.c b/hw/ipmi/ipmi_bt.c index e07e10a..130ef24 100644 --- a/hw/ipmi/ipmi_bt.c +++ b/hw/ipmi/ipmi_bt.c @@ -187,7 +187,7 @@ static uint64_t ipmi_bt_ioport_read(void *opaque, hwadd= r addr, unsigned size) IPMIBT *ib =3D iic->get_backend_data(ii); uint32_t ret =3D 0xff; =20 - switch (addr & 3) { + switch (addr & ib->size_mask) { case 0: ret =3D ib->control_reg; break; @@ -206,6 +206,9 @@ static uint64_t ipmi_bt_ioport_read(void *opaque, hwadd= r addr, unsigned size) case 2: ret =3D ib->mask_reg; break; + default: + ret =3D 0xff; + break; } return ret; } @@ -228,7 +231,7 @@ static void ipmi_bt_ioport_write(void *opaque, hwaddr a= ddr, uint64_t val, IPMIInterfaceClass *iic =3D IPMI_INTERFACE_GET_CLASS(ii); IPMIBT *ib =3D iic->get_backend_data(ii); =20 - switch (addr & 3) { + switch (addr & ib->size_mask) { case 0: if (IPMI_BT_GET_CLR_WR(val)) { ib->inlen =3D 0; @@ -283,6 +286,9 @@ static void ipmi_bt_ioport_write(void *opaque, hwaddr a= ddr, uint64_t val, ipmi_bt_lower_irq(ib); } break; + default: + /* Ignore. */ + break; } } =20 @@ -344,14 +350,19 @@ static void ipmi_bt_set_irq_enable(IPMIInterface *ii,= int val) ib->irqs_enabled =3D val; } =20 -static void ipmi_bt_init(IPMIInterface *ii, Error **errp) +static void ipmi_bt_init(IPMIInterface *ii, unsigned int min_size, Error *= *errp) { IPMIInterfaceClass *iic =3D IPMI_INTERFACE_GET_CLASS(ii); IPMIBT *ib =3D iic->get_backend_data(ii); =20 + if (min_size =3D=3D 0) { + min_size =3D 4; + } + ib->size_mask =3D min_size - 1; ib->io_length =3D 3; =20 - memory_region_init_io(&ib->io, NULL, &ipmi_bt_io_ops, ii, "ipmi-bt", 3= ); + memory_region_init_io(&ib->io, NULL, &ipmi_bt_io_ops, ii, "ipmi-bt", + min_size); } =20 const VMStateDescription vmstate_IPMIBT =3D { diff --git a/hw/ipmi/ipmi_kcs.c b/hw/ipmi/ipmi_kcs.c index cb22dee..ec6dc39 100644 --- a/hw/ipmi/ipmi_kcs.c +++ b/hw/ipmi/ipmi_kcs.c @@ -230,7 +230,7 @@ static uint64_t ipmi_kcs_ioport_read(void *opaque, hwad= dr addr, unsigned size) IPMIKCS *ik =3D iic->get_backend_data(ii); uint32_t ret; =20 - switch (addr & 1) { + switch (addr & ik->size_mask) { case 0: ret =3D ik->data_out_reg; IPMI_KCS_SET_OBF(ik->status_reg, 0); @@ -241,6 +241,7 @@ static uint64_t ipmi_kcs_ioport_read(void *opaque, hwad= dr addr, unsigned size) } } break; + case 1: ret =3D ik->status_reg; if (ik->atn_irq_set) { @@ -250,6 +251,9 @@ static uint64_t ipmi_kcs_ioport_read(void *opaque, hwad= dr addr, unsigned size) } } break; + + default: + ret =3D 0xff; } return ret; } @@ -265,7 +269,7 @@ static void ipmi_kcs_ioport_write(void *opaque, hwaddr = addr, uint64_t val, return; } =20 - switch (addr & 1) { + switch (addr & ik->size_mask) { case 0: ik->data_in_reg =3D val; break; @@ -273,6 +277,10 @@ static void ipmi_kcs_ioport_write(void *opaque, hwaddr= addr, uint64_t val, case 1: ik->cmd_reg =3D val; break; + + default: + /* Ignore. */ + break; } IPMI_KCS_SET_IBF(ik->status_reg, 1); ipmi_kcs_signal(ik, ii); @@ -319,13 +327,20 @@ static void ipmi_kcs_set_irq_enable(IPMIInterface *ii= , int val) ik->irqs_enabled =3D val; } =20 -static void ipmi_kcs_init(IPMIInterface *ii, Error **errp) +/* min_size must be a power of 2. */ +static void ipmi_kcs_init(IPMIInterface *ii, unsigned int min_size, + Error **errp) { IPMIInterfaceClass *iic =3D IPMI_INTERFACE_GET_CLASS(ii); IPMIKCS *ik =3D iic->get_backend_data(ii); =20 + if (min_size =3D=3D 0) { + min_size =3D 2; + } + ik->size_mask =3D min_size - 1; ik->io_length =3D 2; - memory_region_init_io(&ik->io, NULL, &ipmi_kcs_io_ops, ii, "ipmi-kcs",= 2); + memory_region_init_io(&ik->io, NULL, &ipmi_kcs_io_ops, ii, "ipmi-kcs", + min_size); } =20 const VMStateDescription vmstate_IPMIKCS =3D { diff --git a/hw/ipmi/isa_ipmi_bt.c b/hw/ipmi/isa_ipmi_bt.c index b711eca..a98e0ea 100644 --- a/hw/ipmi/isa_ipmi_bt.c +++ b/hw/ipmi/isa_ipmi_bt.c @@ -80,7 +80,7 @@ static void isa_ipmi_bt_realize(DeviceState *dev, Error *= *errp) iib->bt.bmc->intf =3D ii; iib->bt.opaque =3D iib; =20 - iic->init(ii, errp); + iic->init(ii, 0, errp); if (*errp) return; =20 diff --git a/hw/ipmi/isa_ipmi_kcs.c b/hw/ipmi/isa_ipmi_kcs.c index d1a5956..ab6f62e 100644 --- a/hw/ipmi/isa_ipmi_kcs.c +++ b/hw/ipmi/isa_ipmi_kcs.c @@ -79,7 +79,7 @@ static void ipmi_isa_realize(DeviceState *dev, Error **er= rp) iik->kcs.bmc->intf =3D ii; iik->kcs.opaque =3D iik; =20 - iic->init(ii, errp); + iic->init(ii, 0, errp); if (*errp) return; =20 diff --git a/include/hw/ipmi/ipmi.h b/include/hw/ipmi/ipmi.h index 0affe5a..0f62ea3 100644 --- a/include/hw/ipmi/ipmi.h +++ b/include/hw/ipmi/ipmi.h @@ -121,7 +121,12 @@ typedef struct IPMIInterface { typedef struct IPMIInterfaceClass { InterfaceClass parent; =20 - void (*init)(struct IPMIInterface *s, Error **errp); + /* + * 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); =20 /* * Perform various operations on the hardware. If checkonly is diff --git a/include/hw/ipmi/ipmi_bt.h b/include/hw/ipmi/ipmi_bt.h index 16066a7..d1e2abe 100644 --- a/include/hw/ipmi/ipmi_bt.h +++ b/include/hw/ipmi/ipmi_bt.h @@ -57,6 +57,7 @@ typedef struct IPMIBT { uint32_t io_base; unsigned long io_length; MemoryRegion io; + unsigned long size_mask; =20 void (*raise_irq)(struct IPMIBT *ib); void (*lower_irq)(struct IPMIBT *ib); diff --git a/include/hw/ipmi/ipmi_kcs.h b/include/hw/ipmi/ipmi_kcs.h index af596be..8c75e86 100644 --- a/include/hw/ipmi/ipmi_kcs.h +++ b/include/hw/ipmi/ipmi_kcs.h @@ -60,6 +60,7 @@ typedef struct IPMIKCS { uint32_t io_base; unsigned long io_length; MemoryRegion io; + unsigned long size_mask; =20 void (*raise_irq)(struct IPMIKCS *ik); void (*lower_irq)(struct IPMIKCS *ik); --=20 2.7.4