Author: jhibbits
Date: Sat Dec 21 04:31:54 2013
New Revision: 259676
URL: http://svnweb.freebsd.org/changeset/base/259676

Log:
  Add suspend/resume state saving for OpenPIC on PowerMac.  It's likely this
  can be used on the others (cpcht and psim), but that has not been tested.

Modified:
  head/sys/powerpc/include/openpicreg.h
  head/sys/powerpc/include/openpicvar.h
  head/sys/powerpc/ofw/openpic_ofw.c
  head/sys/powerpc/powermac/cpcht.c
  head/sys/powerpc/powerpc/openpic.c
  head/sys/powerpc/psim/openpic_iobus.c

Modified: head/sys/powerpc/include/openpicreg.h
==============================================================================
--- head/sys/powerpc/include/openpicreg.h       Sat Dec 21 03:05:13 2013        
(r259675)
+++ head/sys/powerpc/include/openpicreg.h       Sat Dec 21 04:31:54 2013        
(r259676)
@@ -99,6 +99,7 @@
  */
 
 /* interrupt vector/priority reg */
+#define OPENPIC_SRC_VECTOR_COUNT       64
 #ifndef OPENPIC_SRC_VECTOR
 #define OPENPIC_SRC_VECTOR(irq)                (0x10000 + (irq) * 0x20)
 #endif

Modified: head/sys/powerpc/include/openpicvar.h
==============================================================================
--- head/sys/powerpc/include/openpicvar.h       Sat Dec 21 03:05:13 2013        
(r259675)
+++ head/sys/powerpc/include/openpicvar.h       Sat Dec 21 04:31:54 2013        
(r259676)
@@ -32,6 +32,14 @@
 
 #define OPENPIC_IRQMAX 256     /* h/w allows more */
 
+/* Names match the macros in openpicreg.h. */
+struct openpic_timer {
+       uint32_t        tcnt;
+       uint32_t        tbase;
+       uint32_t        tvec;
+       uint32_t        tdst;
+};
+
 struct openpic_softc {
        device_t        sc_dev;
        struct resource *sc_memr;
@@ -45,6 +53,14 @@ struct openpic_softc {
        u_int           sc_ncpu;
        u_int           sc_nirq;
        int             sc_psim;
+
+       /* Saved states. */
+       uint32_t                sc_saved_config;
+       uint32_t                sc_saved_ipis[4];
+       uint32_t                sc_saved_prios[4];
+       struct openpic_timer    sc_saved_timers[OPENPIC_TIMERS];
+       uint32_t                sc_saved_vectors[OPENPIC_SRC_VECTOR_COUNT];
+       
 };
 
 extern devclass_t openpic_devclass;
@@ -66,4 +82,7 @@ void  openpic_ipi(device_t, u_int);
 void   openpic_mask(device_t, u_int);
 void   openpic_unmask(device_t, u_int);
 
+int    openpic_suspend(device_t dev);
+int    openpic_resume(device_t dev);
+
 #endif /* _POWERPC_OPENPICVAR_H_ */

Modified: head/sys/powerpc/ofw/openpic_ofw.c
==============================================================================
--- head/sys/powerpc/ofw/openpic_ofw.c  Sat Dec 21 03:05:13 2013        
(r259675)
+++ head/sys/powerpc/ofw/openpic_ofw.c  Sat Dec 21 04:31:54 2013        
(r259676)
@@ -51,6 +51,7 @@ __FBSDID("$FreeBSD$");
 
 #include <sys/rman.h>
 
+#include <machine/openpicreg.h>
 #include <machine/openpicvar.h>
 
 #include "pic_if.h"
@@ -68,6 +69,8 @@ static device_method_t  openpic_ofw_meth
        /* 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),

Modified: head/sys/powerpc/powermac/cpcht.c
==============================================================================
--- head/sys/powerpc/powermac/cpcht.c   Sat Dec 21 03:05:13 2013        
(r259675)
+++ head/sys/powerpc/powermac/cpcht.c   Sat Dec 21 04:31:54 2013        
(r259676)
@@ -44,6 +44,7 @@ __FBSDID("$FreeBSD$");
 #include <machine/bus.h>
 #include <machine/intr_machdep.h>
 #include <machine/md_var.h>
+#include <machine/openpicreg.h>
 #include <machine/openpicvar.h>
 #include <machine/pio.h>
 #include <machine/resource.h>

Modified: head/sys/powerpc/powerpc/openpic.c
==============================================================================
--- head/sys/powerpc/powerpc/openpic.c  Sat Dec 21 03:05:13 2013        
(r259675)
+++ head/sys/powerpc/powerpc/openpic.c  Sat Dec 21 04:31:54 2013        
(r259676)
@@ -380,3 +380,64 @@ openpic_unmask(device_t dev, u_int irq)
                openpic_write(sc, OPENPIC_IPI_VECTOR(0), x);
        }
 }
+
+int
+openpic_suspend(device_t dev)
+{
+       struct openpic_softc *sc;
+       int i;
+
+       sc = device_get_softc(dev);
+
+       sc->sc_saved_config = bus_read_4(sc->sc_memr, OPENPIC_CONFIG);
+       for (i = 0; i < 4; i++) {
+               sc->sc_saved_ipis[i] = bus_read_4(sc->sc_memr, 
OPENPIC_IPI_VECTOR(i));
+       }
+
+       for (i = 0; i < 4; i++) {
+               sc->sc_saved_prios[i] = bus_read_4(sc->sc_memr, 
OPENPIC_PCPU_TPR(i));
+       }
+
+       for (i = 0; i < OPENPIC_TIMERS; i++) {
+               sc->sc_saved_timers[i].tcnt = bus_read_4(sc->sc_memr, 
OPENPIC_TCNT(i));
+               sc->sc_saved_timers[i].tbase = bus_read_4(sc->sc_memr, 
OPENPIC_TBASE(i));
+               sc->sc_saved_timers[i].tvec = bus_read_4(sc->sc_memr, 
OPENPIC_TVEC(i));
+               sc->sc_saved_timers[i].tdst = bus_read_4(sc->sc_memr, 
OPENPIC_TDST(i));
+       }
+
+       for (i = 0; i < OPENPIC_SRC_VECTOR_COUNT; i++)
+               sc->sc_saved_vectors[i] =
+                   bus_read_4(sc->sc_memr, OPENPIC_SRC_VECTOR(i)) & 
~OPENPIC_ACTIVITY;
+
+       return (0);
+}
+
+int
+openpic_resume(device_t dev)
+{
+       struct openpic_softc *sc;
+       int i;
+
+       sc = device_get_softc(dev);
+
+       sc->sc_saved_config = bus_read_4(sc->sc_memr, OPENPIC_CONFIG);
+       for (i = 0; i < 4; i++) {
+               bus_write_4(sc->sc_memr, OPENPIC_IPI_VECTOR(i), 
sc->sc_saved_ipis[i]);
+       }
+
+       for (i = 0; i < 4; i++) {
+               bus_write_4(sc->sc_memr, OPENPIC_PCPU_TPR(i), 
sc->sc_saved_prios[i]);
+       }
+
+       for (i = 0; i < OPENPIC_TIMERS; i++) {
+               bus_write_4(sc->sc_memr, OPENPIC_TCNT(i), 
sc->sc_saved_timers[i].tcnt);
+               bus_write_4(sc->sc_memr, OPENPIC_TBASE(i), 
sc->sc_saved_timers[i].tbase);
+               bus_write_4(sc->sc_memr, OPENPIC_TVEC(i), 
sc->sc_saved_timers[i].tvec);
+               bus_write_4(sc->sc_memr, OPENPIC_TDST(i), 
sc->sc_saved_timers[i].tdst);
+       }
+
+       for (i = 0; i < OPENPIC_SRC_VECTOR_COUNT; i++)
+               bus_write_4(sc->sc_memr, OPENPIC_SRC_VECTOR(i), 
sc->sc_saved_vectors[i]);
+
+       return (0);
+}

Modified: head/sys/powerpc/psim/openpic_iobus.c
==============================================================================
--- head/sys/powerpc/psim/openpic_iobus.c       Sat Dec 21 03:05:13 2013        
(r259675)
+++ head/sys/powerpc/psim/openpic_iobus.c       Sat Dec 21 04:31:54 2013        
(r259676)
@@ -53,6 +53,7 @@ __FBSDID("$FreeBSD$");
 
 #include <sys/rman.h>
 
+#include <machine/openpicreg.h>
 #include <machine/openpicvar.h>
 #include <powerpc/psim/iobusvar.h>
 
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to