Date: Sat, 15 May 2010 20:25:29 +0000 (UTC) From: Nathan Whitehorn <nwhitehorn@FreeBSD.org> To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r208118 - in projects/ppc64/sys: dev/ofw powerpc/aim powerpc/ofw Message-ID: <201005152025.o4FKPTeL081823@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: nwhitehorn Date: Sat May 15 20:25:29 2010 New Revision: 208118 URL: http://svn.freebsd.org/changeset/base/208118 Log: Quiesce Open Firmware before taking control of the exception vectors and MMU. On U4-based Apple systems, there is a firmware background process to manage fans while in OF. Booting the kernel without stopping it causes the SMU to crash, which implies no fan control and no RTC. Modified: projects/ppc64/sys/dev/ofw/ofw_if.m projects/ppc64/sys/dev/ofw/ofw_standard.c projects/ppc64/sys/dev/ofw/openfirm.c projects/ppc64/sys/dev/ofw/openfirm.h projects/ppc64/sys/powerpc/aim/machdep.c projects/ppc64/sys/powerpc/ofw/ofw_real.c Modified: projects/ppc64/sys/dev/ofw/ofw_if.m ============================================================================== --- projects/ppc64/sys/dev/ofw/ofw_if.m Sat May 15 19:46:16 2010 (r208117) +++ projects/ppc64/sys/dev/ofw/ofw_if.m Sat May 15 20:25:29 2010 (r208118) @@ -340,6 +340,13 @@ METHOD void release { # Commands for returning control to the firmware /** + * @brief Turn off firmware background activities + */ +METHOD void quiesce { + ofw_t _ofw; +}; + +/** * @brief Temporarily return control to firmware. */ METHOD void enter { Modified: projects/ppc64/sys/dev/ofw/ofw_standard.c ============================================================================== --- projects/ppc64/sys/dev/ofw/ofw_standard.c Sat May 15 19:46:16 2010 (r208117) +++ projects/ppc64/sys/dev/ofw/ofw_standard.c Sat May 15 20:25:29 2010 (r208118) @@ -105,6 +105,7 @@ static ssize_t ofw_std_write(ofw_t ofw, static int ofw_std_seek(ofw_t ofw, ihandle_t instance, uint64_t pos); static caddr_t ofw_std_claim(ofw_t ofw, void *virt, size_t size, u_int align); static void ofw_std_release(ofw_t ofw, void *virt, size_t size); +static void ofw_std_quiesce(ofw_t ofw); static void ofw_std_enter(ofw_t ofw); static void ofw_std_exit(ofw_t ofw); @@ -133,6 +134,7 @@ static ofw_method_t ofw_std_methods[] = OFWMETHOD(ofw_seek, ofw_std_seek), OFWMETHOD(ofw_claim, ofw_std_claim), OFWMETHOD(ofw_release, ofw_std_release), + OFWMETHOD(ofw_quiesce, ofw_std_quiesce), OFWMETHOD(ofw_enter, ofw_std_enter), OFWMETHOD(ofw_exit, ofw_std_exit), @@ -729,6 +731,23 @@ ofw_std_release(ofw_t ofw, void *virt, s * Control transfer functions */ +/* Turn off OF background tasks */ +static void +ofw_std_quiesce(ofw_t ofw) +{ + struct { + cell_t name; + cell_t nargs; + cell_t nreturns; + } args = { + (cell_t)"quiesce", + 0, + 0, + }; + + openfirmware(&args); +} + /* Suspend and drop back to the Open Firmware interface. */ static void ofw_std_enter(ofw_t ofw) Modified: projects/ppc64/sys/dev/ofw/openfirm.c ============================================================================== --- projects/ppc64/sys/dev/ofw/openfirm.c Sat May 15 19:46:16 2010 (r208117) +++ projects/ppc64/sys/dev/ofw/openfirm.c Sat May 15 20:25:29 2010 (r208118) @@ -409,6 +409,15 @@ OF_release(void *virt, size_t size) * Control transfer functions */ +/* Turn off OF background tasks */ +void +OF_quiesce() +{ + + OFW_QUIESCE(ofw_obj); +} + + /* Suspend and drop back to the Open Firmware interface. */ void OF_enter() Modified: projects/ppc64/sys/dev/ofw/openfirm.h ============================================================================== --- projects/ppc64/sys/dev/ofw/openfirm.h Sat May 15 19:46:16 2010 (r208117) +++ projects/ppc64/sys/dev/ofw/openfirm.h Sat May 15 20:25:29 2010 (r208118) @@ -134,6 +134,7 @@ void *OF_claim(void *virtrequest, size_ void OF_release(void *virt, size_t size); /* Control transfer functions */ +void OF_quiesce(void); void OF_enter(void); void OF_exit(void) __attribute__((noreturn)); Modified: projects/ppc64/sys/powerpc/aim/machdep.c ============================================================================== --- projects/ppc64/sys/powerpc/aim/machdep.c Sat May 15 19:46:16 2010 (r208117) +++ projects/ppc64/sys/powerpc/aim/machdep.c Sat May 15 20:25:29 2010 (r208118) @@ -213,10 +213,11 @@ cpu_startup(void *dummy) printf("Physical memory chunk(s):\n"); for (indx = 0; phys_avail[indx + 1] != 0; indx += 2) { - int size1 = phys_avail[indx + 1] - phys_avail[indx]; + vm_offset_t size1 = + phys_avail[indx + 1] - phys_avail[indx]; #ifdef __powerpc64__ - printf("0x%16lx - 0x%16lx, %d bytes (%ld pages)\n", + printf("0x%16lx - 0x%16lx, %ld bytes (%ld pages)\n", #else printf("0x%08x - 0x%08x, %d bytes (%ld pages)\n", #endif @@ -260,6 +261,8 @@ extern void *decrint, *decrsize; extern void *extint, *extsize; extern void *dblow, *dbsize; +void ofw_real_quiesce(void); + uintptr_t powerpc_init(vm_offset_t startkernel, vm_offset_t endkernel, vm_offset_t basekernel, void *mdp) @@ -327,10 +330,11 @@ powerpc_init(vm_offset_t startkernel, vm mutex_init(); /* - * Install the OF client interface + * Install the OF client interface and then take over the machine */ OF_bootstrap(); + OF_quiesce(); /* * Initialize the console before printing anything. Modified: projects/ppc64/sys/powerpc/ofw/ofw_real.c ============================================================================== --- projects/ppc64/sys/powerpc/ofw/ofw_real.c Sat May 15 19:46:16 2010 (r208117) +++ projects/ppc64/sys/powerpc/ofw/ofw_real.c Sat May 15 20:25:29 2010 (r208118) @@ -110,6 +110,7 @@ static ssize_t ofw_real_write(ofw_t, iha static int ofw_real_seek(ofw_t, ihandle_t instance, u_int64_t pos); static caddr_t ofw_real_claim(ofw_t, void *virt, size_t size, u_int align); static void ofw_real_release(ofw_t, void *virt, size_t size); +static void ofw_real_quiesce(ofw_t); static void ofw_real_enter(ofw_t); static void ofw_real_exit(ofw_t); @@ -138,6 +139,7 @@ static ofw_method_t ofw_real_methods[] = OFWMETHOD(ofw_seek, ofw_real_seek), OFWMETHOD(ofw_claim, ofw_real_claim), OFWMETHOD(ofw_release, ofw_real_release), + OFWMETHOD(ofw_quiesce, ofw_real_quiesce), OFWMETHOD(ofw_enter, ofw_real_enter), OFWMETHOD(ofw_exit, ofw_real_exit), @@ -1048,6 +1050,27 @@ ofw_real_release(ofw_t ofw, void *virt, * Control transfer functions */ +/* Turn off OF background tasks */ +static void +ofw_real_quiesce(ofw_t ofw) +{ + vm_offset_t argsptr; + struct { + cell_t name; + cell_t nargs; + cell_t nreturns; + } args; + + args.name = (cell_t)(uintptr_t)"quiesce"; + args.nargs = 0; + args.nreturns = 0; + + ofw_real_start(); + argsptr = ofw_real_map(&args, sizeof(args)); + openfirmware((void *)argsptr); + ofw_real_stop(); +} + /* Suspend and drop back to the Open Firmware interface. */ static void ofw_real_enter(ofw_t ofw)
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201005152025.o4FKPTeL081823>