The branch main has been updated by jhibbits:

URL: 
https://cgit.FreeBSD.org/src/commit/?id=8fb17896120d8e7c499a13f4459f9894c20c6131

commit 8fb17896120d8e7c499a13f4459f9894c20c6131
Author:     Elliott Mitchell <[email protected]>
AuthorDate: 2025-01-02 19:03:40 +0000
Commit:     Justin Hibbits <[email protected]>
CommitDate: 2025-10-30 01:02:15 +0000

    intr/powerpc: create openpic_class kobj
    
    Using kobj allows implementing most PIC functions merely by inheriting
    from the parent class.  As there are multiple OpenPIC implementations,
    this ensures all common hooks go through by default.
    
    Note, this adds the suspend/resume functions to other PICs.  This should
    be harmless as suspend/resume isn't working on the devices anyway.
    
    Reviewed by:    jhibbits
    MFC after:      2 weeks
---
 sys/powerpc/include/openpicvar.h |  9 +++------
 sys/powerpc/ofw/openpic_ofw.c    | 18 ++----------------
 sys/powerpc/powermac/cpcht.c     | 13 +++----------
 sys/powerpc/powerpc/openpic.c    | 33 +++++++++++++++++++++++++++------
 sys/powerpc/psim/openpic_iobus.c | 17 +++--------------
 5 files changed, 38 insertions(+), 52 deletions(-)

diff --git a/sys/powerpc/include/openpicvar.h b/sys/powerpc/include/openpicvar.h
index 3a170a8a35fe..12f01cb80406 100644
--- a/sys/powerpc/include/openpicvar.h
+++ b/sys/powerpc/include/openpicvar.h
@@ -28,6 +28,8 @@
 #ifndef        _POWERPC_OPENPICVAR_H_
 #define        _POWERPC_OPENPICVAR_H_
 
+#include <sys/kobj.h>
+
 #define OPENPIC_DEVSTR "OpenPIC Interrupt Controller"
 
 #define OPENPIC_IRQMAX 256     /* h/w allows more */
@@ -75,16 +77,11 @@ int openpic_common_attach(device_t, uint32_t);
 /*
  * PIC interface.
  */
-void   openpic_bind(device_t dev, u_int irq, cpuset_t cpumask, void **);
 void   openpic_config(device_t, u_int, enum intr_trigger, enum intr_polarity);
-void   openpic_dispatch(device_t, struct trapframe *);
 void   openpic_enable(device_t, u_int, u_int, void **);
 void   openpic_eoi(device_t, u_int, void *);
-void   openpic_ipi(device_t, u_int);
-void   openpic_mask(device_t, u_int, void *);
 void   openpic_unmask(device_t, u_int, void *);
 
-int    openpic_suspend(device_t dev);
-int    openpic_resume(device_t dev);
+DECLARE_CLASS(openpic_class);
 
 #endif /* _POWERPC_OPENPICVAR_H_ */
diff --git a/sys/powerpc/ofw/openpic_ofw.c b/sys/powerpc/ofw/openpic_ofw.c
index fdab55fb30f5..4083e9eba749 100644
--- a/sys/powerpc/ofw/openpic_ofw.c
+++ b/sys/powerpc/ofw/openpic_ofw.c
@@ -68,29 +68,15 @@ static device_method_t  openpic_ofw_methods[] = {
        /* Device interface */
        DEVMETHOD(device_probe,         openpic_ofw_probe),
        DEVMETHOD(device_attach,        openpic_ofw_attach),
-       DEVMETHOD(device_suspend,       openpic_suspend),
-       DEVMETHOD(device_resume,        openpic_resume),
 
        /* PIC interface */
-       DEVMETHOD(pic_bind,             openpic_bind),
-       DEVMETHOD(pic_config,           openpic_config),
-       DEVMETHOD(pic_dispatch,         openpic_dispatch),
-       DEVMETHOD(pic_enable,           openpic_enable),
-       DEVMETHOD(pic_eoi,              openpic_eoi),
-       DEVMETHOD(pic_ipi,              openpic_ipi),
-       DEVMETHOD(pic_mask,             openpic_mask),
-       DEVMETHOD(pic_unmask,           openpic_unmask),
-
        DEVMETHOD(pic_translate_code,   openpic_ofw_translate_code),
 
        DEVMETHOD_END
 };
 
-static driver_t openpic_ofw_driver = {
-       "openpic",
-       openpic_ofw_methods,
-       sizeof(struct openpic_softc),
-};
+DEFINE_CLASS_1(openpic, openpic_ofw_driver, openpic_ofw_methods,
+    sizeof(struct openpic_softc), openpic_class);
 
 EARLY_DRIVER_MODULE(openpic, ofwbus, openpic_ofw_driver, 0, 0,
     BUS_PASS_INTERRUPT);
diff --git a/sys/powerpc/powermac/cpcht.c b/sys/powerpc/powermac/cpcht.c
index 5b5c03cf83f6..448144c9749e 100644
--- a/sys/powerpc/powermac/cpcht.c
+++ b/sys/powerpc/powermac/cpcht.c
@@ -520,16 +520,12 @@ static device_method_t  openpic_cpcht_methods[] = {
        DEVMETHOD(device_attach,        openpic_cpcht_attach),
 
        /* PIC interface */
-       DEVMETHOD(pic_bind,             openpic_bind),
        DEVMETHOD(pic_config,           openpic_cpcht_config),
-       DEVMETHOD(pic_dispatch,         openpic_dispatch),
        DEVMETHOD(pic_enable,           openpic_cpcht_enable),
        DEVMETHOD(pic_eoi,              openpic_cpcht_eoi),
-       DEVMETHOD(pic_ipi,              openpic_ipi),
-       DEVMETHOD(pic_mask,             openpic_mask),
        DEVMETHOD(pic_unmask,           openpic_cpcht_unmask),
 
-       { 0, 0 },
+       DEVMETHOD_END
 };
 
 struct openpic_cpcht_softc {
@@ -538,11 +534,8 @@ struct openpic_cpcht_softc {
        struct mtx sc_ht_mtx;
 };
 
-static driver_t openpic_cpcht_driver = {
-       "htpic",
-       openpic_cpcht_methods,
-       sizeof(struct openpic_cpcht_softc),
-};
+DEFINE_CLASS_1(htpic, openpic_cpcht_driver, openpic_cpcht_methods,
+    sizeof(struct openpic_cpcht_softc), openpic_class);
 
 EARLY_DRIVER_MODULE(openpic, unin, openpic_cpcht_driver, 0, 0,
     BUS_PASS_INTERRUPT);
diff --git a/sys/powerpc/powerpc/openpic.c b/sys/powerpc/powerpc/openpic.c
index 0c717aaf6060..e2de52638d79 100644
--- a/sys/powerpc/powerpc/openpic.c
+++ b/sys/powerpc/powerpc/openpic.c
@@ -225,7 +225,7 @@ openpic_common_attach(device_t dev, uint32_t node)
  * PIC I/F methods
  */
 
-void
+static void
 openpic_bind(device_t dev, u_int irq, cpuset_t cpumask, void **priv __unused)
 {
        struct openpic_softc *sc;
@@ -291,7 +291,7 @@ openpic_intr(void *arg)
        return (FILTER_HANDLED);
 }
 
-void
+static void
 openpic_dispatch(device_t dev, struct trapframe *tf)
 {
        struct openpic_softc *sc;
@@ -343,7 +343,7 @@ openpic_eoi(device_t dev, u_int irq __unused, void *priv 
__unused)
        openpic_write(sc, OPENPIC_PCPU_EOI(cpuid), 0);
 }
 
-void
+static void
 openpic_ipi(device_t dev, u_int cpu)
 {
        struct openpic_softc *sc;
@@ -357,7 +357,7 @@ openpic_ipi(device_t dev, u_int cpu)
        sched_unpin();
 }
 
-void
+static void
 openpic_mask(device_t dev, u_int irq, void *priv __unused)
 {
        struct openpic_softc *sc;
@@ -393,7 +393,7 @@ openpic_unmask(device_t dev, u_int irq, void *priv __unused)
        }
 }
 
-int
+static int
 openpic_suspend(device_t dev)
 {
        struct openpic_softc *sc;
@@ -424,7 +424,7 @@ openpic_suspend(device_t dev)
        return (0);
 }
 
-int
+static int
 openpic_resume(device_t dev)
 {
        struct openpic_softc *sc;
@@ -453,3 +453,24 @@ openpic_resume(device_t dev)
 
        return (0);
 }
+
+static device_method_t openpic_methods[] = {
+       /* Device interface */
+       DEVMETHOD(device_suspend,       openpic_suspend),
+       DEVMETHOD(device_resume,        openpic_resume),
+
+       /* PIC interface */
+       DEVMETHOD(pic_bind,             openpic_bind),
+       DEVMETHOD(pic_config,           openpic_config),
+       DEVMETHOD(pic_dispatch,         openpic_dispatch),
+       DEVMETHOD(pic_enable,           openpic_enable),
+       DEVMETHOD(pic_eoi,              openpic_eoi),
+       DEVMETHOD(pic_ipi,              openpic_ipi),
+       DEVMETHOD(pic_mask,             openpic_mask),
+       DEVMETHOD(pic_unmask,           openpic_unmask),
+
+       DEVMETHOD_END
+};
+
+DEFINE_CLASS_0(openpic, openpic_class, openpic_methods,
+    sizeof(struct openpic_softc));
diff --git a/sys/powerpc/psim/openpic_iobus.c b/sys/powerpc/psim/openpic_iobus.c
index bf5bd8235a6c..21950e248b6d 100644
--- a/sys/powerpc/psim/openpic_iobus.c
+++ b/sys/powerpc/psim/openpic_iobus.c
@@ -69,22 +69,11 @@ static device_method_t  openpic_iobus_methods[] = {
        DEVMETHOD(device_probe,         openpic_iobus_probe),
        DEVMETHOD(device_attach,        openpic_iobus_attach),
 
-       /* PIC interface */
-       DEVMETHOD(pic_config,           openpic_config),
-       DEVMETHOD(pic_dispatch,         openpic_dispatch),
-       DEVMETHOD(pic_enable,           openpic_enable),
-       DEVMETHOD(pic_eoi,              openpic_eoi),
-       DEVMETHOD(pic_ipi,              openpic_ipi),
-       DEVMETHOD(pic_mask,             openpic_mask),
-       DEVMETHOD(pic_unmask,           openpic_unmask),
-       { 0, 0 }
+       DEVMETHOD_END
 };
 
-static driver_t openpic_iobus_driver = {
-       "openpic",
-       openpic_iobus_methods,
-       sizeof(struct openpic_softc)
-};
+DEFINE_CLASS_1(openpic, openpic_iobus_driver, openpic_iobus_methods,
+    sizeof(struct openpic_softc), openpic_class);
 
 DRIVER_MODULE(openpic, iobus, openpic_iobus_driver, 0, 0);
 

Reply via email to