[PATCH 07/15] ipmi: Split out KCS-specific code from ISA KCS code
From: Corey Minyard Get ready for PCI and other KCS interfaces. No functional changes, just split the code into the generic KCS code and the ISA-specific code. Signed-off-by: Corey Minyard Reviewed-by: Philippe Mathieu-Daudé --- hw/ipmi/Makefile.objs | 2 +- hw/ipmi/ipmi_kcs.c | 408 hw/ipmi/isa_ipmi_kcs.c | 417 ++--- include/hw/ipmi/ipmi_kcs.h | 75 +++ 4 files changed, 505 insertions(+), 397 deletions(-) create mode 100644 hw/ipmi/ipmi_kcs.c create mode 100644 include/hw/ipmi/ipmi_kcs.h diff --git a/hw/ipmi/Makefile.objs b/hw/ipmi/Makefile.objs index 1b422bbee0..6835d2f64a 100644 --- a/hw/ipmi/Makefile.objs +++ b/hw/ipmi/Makefile.objs @@ -1,4 +1,4 @@ -common-obj-$(CONFIG_IPMI) += ipmi.o +common-obj-$(CONFIG_IPMI) += ipmi.o ipmi_kcs.o common-obj-$(CONFIG_IPMI_LOCAL) += ipmi_bmc_sim.o common-obj-$(CONFIG_IPMI_EXTERN) += ipmi_bmc_extern.o common-obj-$(CONFIG_ISA_IPMI_KCS) += isa_ipmi_kcs.o diff --git a/hw/ipmi/ipmi_kcs.c b/hw/ipmi/ipmi_kcs.c new file mode 100644 index 00..dab1af8bc8 --- /dev/null +++ b/hw/ipmi/ipmi_kcs.c @@ -0,0 +1,408 @@ +/* + * QEMU IPMI KCS emulation + * + * Copyright (c) 2015,2017 Corey Minyard, MontaVista Software, LLC + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +#include "qemu/osdep.h" +#include "migration/vmstate.h" +#include "qemu/log.h" +#include "qapi/error.h" +#include "hw/ipmi/ipmi_kcs.h" + +#define IPMI_KCS_OBF_BIT0 +#define IPMI_KCS_IBF_BIT1 +#define IPMI_KCS_SMS_ATN_BIT2 +#define IPMI_KCS_CD_BIT 3 + +#define IPMI_KCS_OBF_MASK (1 << IPMI_KCS_OBF_BIT) +#define IPMI_KCS_GET_OBF(d)(((d) >> IPMI_KCS_OBF_BIT) & 0x1) +#define IPMI_KCS_SET_OBF(d, v) (d) = (((d) & ~IPMI_KCS_OBF_MASK) | \ + (((v) & 1) << IPMI_KCS_OBF_BIT)) +#define IPMI_KCS_IBF_MASK (1 << IPMI_KCS_IBF_BIT) +#define IPMI_KCS_GET_IBF(d)(((d) >> IPMI_KCS_IBF_BIT) & 0x1) +#define IPMI_KCS_SET_IBF(d, v) (d) = (((d) & ~IPMI_KCS_IBF_MASK) | \ + (((v) & 1) << IPMI_KCS_IBF_BIT)) +#define IPMI_KCS_SMS_ATN_MASK (1 << IPMI_KCS_SMS_ATN_BIT) +#define IPMI_KCS_GET_SMS_ATN(d)(((d) >> IPMI_KCS_SMS_ATN_BIT) & 0x1) +#define IPMI_KCS_SET_SMS_ATN(d, v) (d) = (((d) & ~IPMI_KCS_SMS_ATN_MASK) | \ + (((v) & 1) << IPMI_KCS_SMS_ATN_BIT)) +#define IPMI_KCS_CD_MASK (1 << IPMI_KCS_CD_BIT) +#define IPMI_KCS_GET_CD(d) (((d) >> IPMI_KCS_CD_BIT) & 0x1) +#define IPMI_KCS_SET_CD(d, v) (d) = (((d) & ~IPMI_KCS_CD_MASK) | \ + (((v) & 1) << IPMI_KCS_CD_BIT)) + +#define IPMI_KCS_IDLE_STATE0 +#define IPMI_KCS_READ_STATE1 +#define IPMI_KCS_WRITE_STATE 2 +#define IPMI_KCS_ERROR_STATE 3 + +#define IPMI_KCS_GET_STATE(d)(((d) >> 6) & 0x3) +#define IPMI_KCS_SET_STATE(d, v) ((d) = ((d) & ~0xc0) | (((v) & 0x3) << 6)) + +#define IPMI_KCS_ABORT_STATUS_CMD 0x60 +#define IPMI_KCS_WRITE_START_CMD0x61 +#define IPMI_KCS_WRITE_END_CMD 0x62 +#define IPMI_KCS_READ_CMD 0x68 + +#define IPMI_KCS_STATUS_NO_ERR 0x00 +#define IPMI_KCS_STATUS_ABORTED_ERR 0x01 +#define IPMI_KCS_STATUS_BAD_CC_ERR 0x02 +#define IPMI_KCS_STATUS_LENGTH_ERR 0x06 + +static void ipmi_kcs_raise_irq(IPMIKCS *ik) +{ +if (ik->use_irq && ik->irqs_enabled && ik->raise_irq) { +ik->raise_irq(ik); +} +} + +static void ipmi_kcs_lower_irq(IPMIKCS *ik) +{ +if (ik->lower_irq) { +ik->lower_irq(ik); +} +} + +#define SET_OBF() \ +do { \ +IPMI_KCS_SET_OBF(ik->status_reg, 1); \ +if (!ik->obf_irq_set) { \ +ik->obf_irq_set = 1;
Re: [Qemu-devel] [PATCH 07/15] ipmi: Split out KCS-specific code from ISA KCS code
On 8/19/19 10:16 PM, miny...@acm.org wrote: > From: Corey Minyard > > Get ready for PCI and other KCS interfaces. > > No functional changes, just split the code into the generic KCS code > and the ISA-specific code. > > Signed-off-by: Corey Minyard Reviewed-by: Philippe Mathieu-Daudé > --- > hw/ipmi/Makefile.objs | 2 +- > hw/ipmi/ipmi_kcs.c | 408 > hw/ipmi/isa_ipmi_kcs.c | 417 ++--- > include/hw/ipmi/ipmi_kcs.h | 75 +++ > 4 files changed, 505 insertions(+), 397 deletions(-) > create mode 100644 hw/ipmi/ipmi_kcs.c > create mode 100644 include/hw/ipmi/ipmi_kcs.h > > diff --git a/hw/ipmi/Makefile.objs b/hw/ipmi/Makefile.objs > index 1b422bbee0..6835d2f64a 100644 > --- a/hw/ipmi/Makefile.objs > +++ b/hw/ipmi/Makefile.objs > @@ -1,4 +1,4 @@ > -common-obj-$(CONFIG_IPMI) += ipmi.o > +common-obj-$(CONFIG_IPMI) += ipmi.o ipmi_kcs.o > common-obj-$(CONFIG_IPMI_LOCAL) += ipmi_bmc_sim.o > common-obj-$(CONFIG_IPMI_EXTERN) += ipmi_bmc_extern.o > common-obj-$(CONFIG_ISA_IPMI_KCS) += isa_ipmi_kcs.o > diff --git a/hw/ipmi/ipmi_kcs.c b/hw/ipmi/ipmi_kcs.c > new file mode 100644 > index 00..dab1af8bc8 > --- /dev/null > +++ b/hw/ipmi/ipmi_kcs.c > @@ -0,0 +1,408 @@ > +/* > + * QEMU IPMI KCS emulation > + * > + * Copyright (c) 2015,2017 Corey Minyard, MontaVista Software, LLC > + * > + * Permission is hereby granted, free of charge, to any person obtaining a > copy > + * of this software and associated documentation files (the "Software"), to > deal > + * in the Software without restriction, including without limitation the > rights > + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell > + * copies of the Software, and to permit persons to whom the Software is > + * furnished to do so, subject to the following conditions: > + * > + * The above copyright notice and this permission notice shall be included in > + * all copies or substantial portions of the Software. > + * > + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR > + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, > + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL > + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER > + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING > FROM, > + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN > + * THE SOFTWARE. > + */ > +#include "qemu/osdep.h" > +#include "migration/vmstate.h" > +#include "qemu/log.h" > +#include "qapi/error.h" > +#include "hw/ipmi/ipmi_kcs.h" > + > +#define IPMI_KCS_OBF_BIT0 > +#define IPMI_KCS_IBF_BIT1 > +#define IPMI_KCS_SMS_ATN_BIT2 > +#define IPMI_KCS_CD_BIT 3 > + > +#define IPMI_KCS_OBF_MASK (1 << IPMI_KCS_OBF_BIT) > +#define IPMI_KCS_GET_OBF(d)(((d) >> IPMI_KCS_OBF_BIT) & 0x1) > +#define IPMI_KCS_SET_OBF(d, v) (d) = (((d) & ~IPMI_KCS_OBF_MASK) | \ > + (((v) & 1) << IPMI_KCS_OBF_BIT)) > +#define IPMI_KCS_IBF_MASK (1 << IPMI_KCS_IBF_BIT) > +#define IPMI_KCS_GET_IBF(d)(((d) >> IPMI_KCS_IBF_BIT) & 0x1) > +#define IPMI_KCS_SET_IBF(d, v) (d) = (((d) & ~IPMI_KCS_IBF_MASK) | \ > + (((v) & 1) << IPMI_KCS_IBF_BIT)) > +#define IPMI_KCS_SMS_ATN_MASK (1 << IPMI_KCS_SMS_ATN_BIT) > +#define IPMI_KCS_GET_SMS_ATN(d)(((d) >> IPMI_KCS_SMS_ATN_BIT) & 0x1) > +#define IPMI_KCS_SET_SMS_ATN(d, v) (d) = (((d) & ~IPMI_KCS_SMS_ATN_MASK) | \ > + (((v) & 1) << IPMI_KCS_SMS_ATN_BIT)) > +#define IPMI_KCS_CD_MASK (1 << IPMI_KCS_CD_BIT) > +#define IPMI_KCS_GET_CD(d) (((d) >> IPMI_KCS_CD_BIT) & 0x1) > +#define IPMI_KCS_SET_CD(d, v) (d) = (((d) & ~IPMI_KCS_CD_MASK) | \ > + (((v) & 1) << IPMI_KCS_CD_BIT)) > + > +#define IPMI_KCS_IDLE_STATE0 > +#define IPMI_KCS_READ_STATE1 > +#define IPMI_KCS_WRITE_STATE 2 > +#define IPMI_KCS_ERROR_STATE 3 > + > +#define IPMI_KCS_GET_STATE(d)(((d) >> 6) & 0x3) > +#define IPMI_KCS_SET_STATE(d, v) ((d) = ((d) & ~0xc0) | (((v) & 0x3) << 6)) > + > +#define IPMI_KCS_ABORT_STATUS_CMD 0x60 > +#define IPMI_KCS_WRITE_START_CMD0x61 > +#define IPMI_KCS_WRITE_END_CMD 0x62 > +#define IPMI_KCS_READ_CMD 0x68 > + > +#define IPMI_KCS_STATUS_NO_ERR 0x00 > +#define IPMI_KCS_STATUS_ABORTED_ERR 0x01 > +#define IPMI_KCS_STATUS_BAD_CC_ERR 0x02 > +#define IPMI_KCS_STATUS_LENGTH_ERR 0x06 > + > +static void ipmi_kcs_raise_irq(IPMIKCS *ik) > +{ > +if (ik->use_irq && ik->irqs_enabled && ik->raise_irq) { > +ik->raise_irq(ik); > +} > +} > + > +static void ipmi_kcs_lower_irq(IPMIKCS *ik) > +{ > +if (ik->lower_irq) { > +ik->lower_irq(ik); > +} > +} > + > +#define SET_
[Qemu-devel] [PATCH 07/15] ipmi: Split out KCS-specific code from ISA KCS code
From: Corey Minyard Get ready for PCI and other KCS interfaces. No functional changes, just split the code into the generic KCS code and the ISA-specific code. Signed-off-by: Corey Minyard --- hw/ipmi/Makefile.objs | 2 +- hw/ipmi/ipmi_kcs.c | 408 hw/ipmi/isa_ipmi_kcs.c | 417 ++--- include/hw/ipmi/ipmi_kcs.h | 75 +++ 4 files changed, 505 insertions(+), 397 deletions(-) create mode 100644 hw/ipmi/ipmi_kcs.c create mode 100644 include/hw/ipmi/ipmi_kcs.h diff --git a/hw/ipmi/Makefile.objs b/hw/ipmi/Makefile.objs index 1b422bbee0..6835d2f64a 100644 --- a/hw/ipmi/Makefile.objs +++ b/hw/ipmi/Makefile.objs @@ -1,4 +1,4 @@ -common-obj-$(CONFIG_IPMI) += ipmi.o +common-obj-$(CONFIG_IPMI) += ipmi.o ipmi_kcs.o common-obj-$(CONFIG_IPMI_LOCAL) += ipmi_bmc_sim.o common-obj-$(CONFIG_IPMI_EXTERN) += ipmi_bmc_extern.o common-obj-$(CONFIG_ISA_IPMI_KCS) += isa_ipmi_kcs.o diff --git a/hw/ipmi/ipmi_kcs.c b/hw/ipmi/ipmi_kcs.c new file mode 100644 index 00..dab1af8bc8 --- /dev/null +++ b/hw/ipmi/ipmi_kcs.c @@ -0,0 +1,408 @@ +/* + * QEMU IPMI KCS emulation + * + * Copyright (c) 2015,2017 Corey Minyard, MontaVista Software, LLC + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +#include "qemu/osdep.h" +#include "migration/vmstate.h" +#include "qemu/log.h" +#include "qapi/error.h" +#include "hw/ipmi/ipmi_kcs.h" + +#define IPMI_KCS_OBF_BIT0 +#define IPMI_KCS_IBF_BIT1 +#define IPMI_KCS_SMS_ATN_BIT2 +#define IPMI_KCS_CD_BIT 3 + +#define IPMI_KCS_OBF_MASK (1 << IPMI_KCS_OBF_BIT) +#define IPMI_KCS_GET_OBF(d)(((d) >> IPMI_KCS_OBF_BIT) & 0x1) +#define IPMI_KCS_SET_OBF(d, v) (d) = (((d) & ~IPMI_KCS_OBF_MASK) | \ + (((v) & 1) << IPMI_KCS_OBF_BIT)) +#define IPMI_KCS_IBF_MASK (1 << IPMI_KCS_IBF_BIT) +#define IPMI_KCS_GET_IBF(d)(((d) >> IPMI_KCS_IBF_BIT) & 0x1) +#define IPMI_KCS_SET_IBF(d, v) (d) = (((d) & ~IPMI_KCS_IBF_MASK) | \ + (((v) & 1) << IPMI_KCS_IBF_BIT)) +#define IPMI_KCS_SMS_ATN_MASK (1 << IPMI_KCS_SMS_ATN_BIT) +#define IPMI_KCS_GET_SMS_ATN(d)(((d) >> IPMI_KCS_SMS_ATN_BIT) & 0x1) +#define IPMI_KCS_SET_SMS_ATN(d, v) (d) = (((d) & ~IPMI_KCS_SMS_ATN_MASK) | \ + (((v) & 1) << IPMI_KCS_SMS_ATN_BIT)) +#define IPMI_KCS_CD_MASK (1 << IPMI_KCS_CD_BIT) +#define IPMI_KCS_GET_CD(d) (((d) >> IPMI_KCS_CD_BIT) & 0x1) +#define IPMI_KCS_SET_CD(d, v) (d) = (((d) & ~IPMI_KCS_CD_MASK) | \ + (((v) & 1) << IPMI_KCS_CD_BIT)) + +#define IPMI_KCS_IDLE_STATE0 +#define IPMI_KCS_READ_STATE1 +#define IPMI_KCS_WRITE_STATE 2 +#define IPMI_KCS_ERROR_STATE 3 + +#define IPMI_KCS_GET_STATE(d)(((d) >> 6) & 0x3) +#define IPMI_KCS_SET_STATE(d, v) ((d) = ((d) & ~0xc0) | (((v) & 0x3) << 6)) + +#define IPMI_KCS_ABORT_STATUS_CMD 0x60 +#define IPMI_KCS_WRITE_START_CMD0x61 +#define IPMI_KCS_WRITE_END_CMD 0x62 +#define IPMI_KCS_READ_CMD 0x68 + +#define IPMI_KCS_STATUS_NO_ERR 0x00 +#define IPMI_KCS_STATUS_ABORTED_ERR 0x01 +#define IPMI_KCS_STATUS_BAD_CC_ERR 0x02 +#define IPMI_KCS_STATUS_LENGTH_ERR 0x06 + +static void ipmi_kcs_raise_irq(IPMIKCS *ik) +{ +if (ik->use_irq && ik->irqs_enabled && ik->raise_irq) { +ik->raise_irq(ik); +} +} + +static void ipmi_kcs_lower_irq(IPMIKCS *ik) +{ +if (ik->lower_irq) { +ik->lower_irq(ik); +} +} + +#define SET_OBF() \ +do { \ +IPMI_KCS_SET_OBF(ik->status_reg, 1); \ +if (!ik->obf_irq_set) { \ +ik->obf_irq_set = 1;