From owner-svn-src-all@FreeBSD.ORG Sat Apr 27 06:54:50 2013 Return-Path: Delivered-To: svn-src-all@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by hub.freebsd.org (Postfix) with ESMTP id EA867FD6; Sat, 27 Apr 2013 06:54:50 +0000 (UTC) (envelope-from rpaulo@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) by mx1.freebsd.org (Postfix) with ESMTP id DCC241095; Sat, 27 Apr 2013 06:54:50 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.6/8.14.6) with ESMTP id r3R6sow2057592; Sat, 27 Apr 2013 06:54:50 GMT (envelope-from rpaulo@svn.freebsd.org) Received: (from rpaulo@localhost) by svn.freebsd.org (8.14.6/8.14.5/Submit) id r3R6sov4057590; Sat, 27 Apr 2013 06:54:50 GMT (envelope-from rpaulo@svn.freebsd.org) Message-Id: <201304270654.r3R6sov4057590@svn.freebsd.org> From: Rui Paulo Date: Sat, 27 Apr 2013 06:54:50 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r249973 - head/sys/powerpc/wii X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 27 Apr 2013 06:54:51 -0000 Author: rpaulo Date: Sat Apr 27 06:54:49 2013 New Revision: 249973 URL: http://svnweb.freebsd.org/changeset/base/249973 Log: Add reset support to the Wii. Modified: head/sys/powerpc/wii/platform_wii.c head/sys/powerpc/wii/wii_bus.c Modified: head/sys/powerpc/wii/platform_wii.c ============================================================================== --- head/sys/powerpc/wii/platform_wii.c Sat Apr 27 06:09:13 2013 (r249972) +++ head/sys/powerpc/wii/platform_wii.c Sat Apr 27 06:54:49 2013 (r249973) @@ -58,9 +58,11 @@ static int wii_probe(platform_t); static int wii_attach(platform_t); static void wii_mem_regions(platform_t, struct mem_region **, int *, struct mem_region **, int *); -static unsigned long wii_timebase_freq(platform_t, struct cpuref *cpuref); +static unsigned long wii_timebase_freq(platform_t, struct cpuref *); static void wii_reset(platform_t); -static void wii_cpu_idle(sbintime_t sbt); +static void wii_cpu_idle(sbintime_t); + +extern void wiibus_reset_system(void); static platform_method_t wii_methods[] = { PLATFORMMETHOD(platform_probe, wii_probe), @@ -150,8 +152,10 @@ wii_timebase_freq(platform_t plat, struc } static void -wii_reset(platform_t plat) +wii_reset(platform_t plat __unused) { + + wiibus_reset_system(); } static void Modified: head/sys/powerpc/wii/wii_bus.c ============================================================================== --- head/sys/powerpc/wii/wii_bus.c Sat Apr 27 06:09:13 2013 (r249972) +++ head/sys/powerpc/wii/wii_bus.c Sat Apr 27 06:54:49 2013 (r249973) @@ -44,6 +44,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include @@ -51,6 +52,21 @@ __FBSDID("$FreeBSD$"); #include #include +#define WIIBUS_CSR_ADDR 0x0d800100 +#define WIIBUS_CSR_LEN 0x300 +#define WIIBUS_CSR_RESET 0x94 + +struct wiibus_softc { + device_t sc_dev; + struct rman sc_rman; + bus_space_tag_t sc_tag; + bus_space_handle_t sc_handle; +}; + +static struct wiibus_softc *wiibus_sc = NULL; + +static uint32_t wiibus_csr_read(struct wiibus_softc *, uint16_t); +static void wiibus_csr_write(struct wiibus_softc *, uint16_t, uint32_t); static void wiibus_identify(driver_t *, device_t); static int wiibus_probe(device_t); static int wiibus_attach(device_t); @@ -61,6 +77,7 @@ static struct resource * unsigned int); static int wiibus_activate_resource(device_t, device_t, int, int, struct resource *); + void wiibus_reset_system(void); static device_method_t wiibus_methods[] = { /* Device interface */ @@ -79,11 +96,6 @@ static device_method_t wiibus_methods[] DEVMETHOD_END }; -struct wiibus_softc { - device_t sc_dev; - struct rman sc_rman; -}; - static MALLOC_DEFINE(M_WIIBUS, "wiibus", "Nintendo Wii system bus"); struct wiibus_devinfo { @@ -101,6 +113,21 @@ static devclass_t wiibus_devclass; DRIVER_MODULE(wiibus, nexus, wiibus_driver, wiibus_devclass, 0, 0); +static uint32_t +wiibus_csr_read(struct wiibus_softc *sc, uint16_t reg) +{ + + return (bus_space_read_4(sc->sc_tag, sc->sc_handle, reg)); +} + +static void +wiibus_csr_write(struct wiibus_softc *sc, uint16_t reg, + uint32_t val) +{ + + bus_space_write_4(sc->sc_tag, sc->sc_handle, reg, val); +} + static void wiibus_identify(driver_t *driver, device_t parent) { @@ -153,6 +180,8 @@ wiibus_attach(device_t self) sc->sc_rman.rm_type = RMAN_ARRAY; sc->sc_rman.rm_descr = "Wii Bus Memory Mapped I/O"; rman_init(&sc->sc_rman); + KASSERT(wiibus_sc == NULL, ("wiibus_sc already initialised")); + wiibus_sc = sc; /* Nintendo PIC */ dinfo = malloc(sizeof(*dinfo), M_WIIBUS, M_WAITOK | M_ZERO); @@ -193,6 +222,11 @@ wiibus_attach(device_t self) cdev = BUS_ADD_CHILD(self, 0, "wiigpio", 0); device_set_ivars(cdev, dinfo); + /* The control registers */ + sc->sc_tag = &bs_be_tag; + sc->sc_handle = (bus_space_handle_t)pmap_mapdev(WIIBUS_CSR_ADDR, + WIIBUS_CSR_LEN); + return (bus_generic_attach(self)); } @@ -295,3 +329,12 @@ wiibus_activate_resource(device_t bus, d return (rman_activate_resource(res)); } +void +wiibus_reset_system(void) +{ + uint32_t r; + + r = wiibus_csr_read(wiibus_sc, WIIBUS_CSR_RESET); + r &= ~1; + wiibus_csr_write(wiibus_sc, WIIBUS_CSR_RESET, r); +}