The diff below adds support for ipmi(4) on the od3000. But since this has tentacles in the generic IPMI code I'd appreciate a quick test on an i386/amd64 system with IPMI.
ok? Index: arch/arm64/conf/GENERIC =================================================================== RCS file: /cvs/src/sys/arch/arm64/conf/GENERIC,v retrieving revision 1.146 diff -u -p -r1.146 GENERIC --- arch/arm64/conf/GENERIC 20 Mar 2020 09:25:42 -0000 1.146 +++ arch/arm64/conf/GENERIC 27 Mar 2020 20:25:53 -0000 @@ -78,6 +78,7 @@ sdmmc* at sdhc? bwfm* at sdmmc? # Broadcom FullMAC xhci* at fdt? ccp* at fdt? # AMD Cryptographic Co-processor +ipmi* at fdt? # NS16550 compatible serial ports com* at fdt? Index: dev/ipmi.c =================================================================== RCS file: /cvs/src/sys/dev/ipmi.c,v retrieving revision 1.111 diff -u -p -r1.111 ipmi.c --- dev/ipmi.c 19 Mar 2020 16:17:51 -0000 1.111 +++ dev/ipmi.c 27 Mar 2020 20:25:53 -0000 @@ -240,15 +240,23 @@ ipmi_get_if(int iftype) u_int8_t bmc_read(struct ipmi_softc *sc, int offset) { - return (bus_space_read_1(sc->sc_iot, sc->sc_ioh, - offset * sc->sc_if_iospacing)); + if (sc->sc_if_iosize == 4) + return (bus_space_read_4(sc->sc_iot, sc->sc_ioh, + offset * sc->sc_if_iospacing)); + else + return (bus_space_read_1(sc->sc_iot, sc->sc_ioh, + offset * sc->sc_if_iospacing)); } void bmc_write(struct ipmi_softc *sc, int offset, u_int8_t val) { - bus_space_write_1(sc->sc_iot, sc->sc_ioh, - offset * sc->sc_if_iospacing, val); + if (sc->sc_if_iosize == 4) + bus_space_write_4(sc->sc_iot, sc->sc_ioh, + offset * sc->sc_if_iospacing, val); + else + bus_space_write_1(sc->sc_iot, sc->sc_ioh, + offset * sc->sc_if_iospacing, val); } int @@ -1452,6 +1460,7 @@ ipmi_map_regs(struct ipmi_softc *sc, str sc->sc_iot = ia->iaa_memt; sc->sc_if_rev = ia->iaa_if_rev; + sc->sc_if_iosize = ia->iaa_if_iosize; sc->sc_if_iospacing = ia->iaa_if_iospacing; if (bus_space_map(sc->sc_iot, ia->iaa_if_iobase, sc->sc_if->nregs * sc->sc_if_iospacing, @@ -1938,6 +1947,7 @@ ipmi_smbios_probe(struct smbios_ipmi *pi pipmi->smipmi_irq : -1; ia->iaa_if_irqlvl = (pipmi->smipmi_base_flags & SMIPMI_FLAG_IRQLVL) ? IST_LEVEL : IST_EDGE; + ia->iaa_if_iosize = 1; switch (SMIPMI_FLAG_IFSPACING(pipmi->smipmi_base_flags)) { case IPMI_IOSPACING_BYTE: Index: dev/ipmivar.h =================================================================== RCS file: /cvs/src/sys/dev/ipmivar.h,v retrieving revision 1.32 diff -u -p -r1.32 ipmivar.h --- dev/ipmivar.h 19 Dec 2019 09:01:50 -0000 1.32 +++ dev/ipmivar.h 27 Mar 2020 20:25:53 -0000 @@ -66,6 +66,7 @@ struct ipmi_attach_args { int iaa_if_rev; int iaa_if_iotype; bus_addr_t iaa_if_iobase; + int iaa_if_iosize; int iaa_if_iospacing; int iaa_if_irq; int iaa_if_irqlvl; @@ -103,6 +104,7 @@ struct ipmi_softc { struct device sc_dev; struct ipmi_if *sc_if; /* Interface layer */ + int sc_if_iosize; /* Size of I/O porrs */ int sc_if_iospacing; /* Spacing of I/O ports */ int sc_if_rev; /* IPMI Revision */ Index: dev/acpi/ipmi_acpi.c =================================================================== RCS file: /cvs/src/sys/dev/acpi/ipmi_acpi.c,v retrieving revision 1.3 diff -u -p -r1.3 ipmi_acpi.c --- dev/acpi/ipmi_acpi.c 6 Jan 2020 12:35:57 -0000 1.3 +++ dev/acpi/ipmi_acpi.c 27 Mar 2020 20:25:53 -0000 @@ -119,6 +119,7 @@ ipmi_acpi_attach(struct device *parent, ia.iaa_if_rev = (sc->sc_srv >> 4); ia.iaa_if_irq = -1; ia.iaa_if_irqlvl = 0; + ia.iaa_if_iosize = 1; ia.iaa_if_iospacing = sc->sc_iospacing; ia.iaa_if_iobase = sc->sc_iobase; ia.iaa_if_iotype = sc->sc_iotype; Index: dev/fdt/files.fdt =================================================================== RCS file: /cvs/src/sys/dev/fdt/files.fdt,v retrieving revision 1.114 diff -u -p -r1.114 files.fdt --- dev/fdt/files.fdt 20 Mar 2020 09:27:40 -0000 1.114 +++ dev/fdt/files.fdt 27 Mar 2020 20:25:53 -0000 @@ -425,6 +425,9 @@ file dev/fdt/ccp_fdt.c ccp_fdt attach com at fdt with com_fdt file dev/fdt/com_fdt.c com_fdt +attach ipmi at fdt with ipmi_fdt +file dev/fdt/ipmi_fdt.c ipmi_fdt + device ssdfb: wsemuldisplaydev, rasops1 attach ssdfb at spi with ssdfb_spi attach ssdfb at i2c with ssdfb_i2c Index: dev/fdt/ipmi_fdt.c =================================================================== RCS file: dev/fdt/ipmi_fdt.c diff -N dev/fdt/ipmi_fdt.c --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ dev/fdt/ipmi_fdt.c 27 Mar 2020 20:25:53 -0000 @@ -0,0 +1,69 @@ +/* $OpenBSD$ */ +/* + * Copyright (c) 2020 Mark Kettenis <kette...@openbsd.org> + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include <sys/param.h> +#include <sys/systm.h> +#include <sys/device.h> + +#include <machine/bus.h> +#include <machine/fdt.h> + +#include <dev/ofw/openfirm.h> +#include <dev/ofw/fdt.h> + +#include <dev/ipmivar.h> + +int ipmi_fdt_match(struct device *, void *, void *); +void ipmi_fdt_attach(struct device *, struct device *, void *); + +struct cfattach ipmi_fdt_ca = { + sizeof (struct ipmi_softc), ipmi_fdt_match, ipmi_fdt_attach +}; + +int +ipmi_fdt_match(struct device *parent, void *match, void *aux) +{ + struct fdt_attach_args *faa = aux; + + return OF_is_compatible(faa->fa_node, "ipmi-kcs"); +} + +void +ipmi_fdt_attach(struct device *parent, struct device *self, void *aux) +{ + struct ipmi_softc *sc = (struct ipmi_softc *)self; + struct fdt_attach_args *faa = aux; + struct ipmi_attach_args ia; + + if (faa->fa_nreg < 1) { + printf(": no registers\n"); + return; + } + + memset(&ia, 0, sizeof(ia)); + ia.iaa_memt = faa->fa_iot; + ia.iaa_if_type = IPMI_IF_KCS; + ia.iaa_if_rev = 0x20; + ia.iaa_if_irq = -1; + ia.iaa_if_irqlvl = 0; + ia.iaa_if_iosize = OF_getpropint(faa->fa_node, "reg-size", 1); + ia.iaa_if_iospacing = OF_getpropint(faa->fa_node, "reg-spacing", 1); + ia.iaa_if_iobase = faa->fa_reg[0].addr; + ia.iaa_if_iotype = 'm'; + + ipmi_attach_common(sc, &ia); +}