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);
+}

Reply via email to