git: 8fb17896120d - main - intr/powerpc: create openpic_class kobj

From: Justin Hibbits <jhibbits_at_FreeBSD.org>
Date: Thu, 30 Oct 2025 01:04:16 UTC
The branch main has been updated by jhibbits:

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

commit 8fb17896120d8e7c499a13f4459f9894c20c6131
Author:     Elliott Mitchell <ehem+freebsd@m5p.com>
AuthorDate: 2025-01-02 19:03:40 +0000
Commit:     Justin Hibbits <jhibbits@FreeBSD.org>
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);