Date: Tue, 23 Aug 2016 22:04:25 +0000 (UTC) From: Nathan Whitehorn <nwhitehorn@FreeBSD.org> To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r304708 - in projects/powernv/powerpc: aim mpc85xx powermac powerpc Message-ID: <201608232204.u7NM4P39088451@repo.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: nwhitehorn Date: Tue Aug 23 22:04:25 2016 New Revision: 304708 URL: https://svnweb.freebsd.org/changeset/base/304708 Log: Setting the timebase on PowerNV is toxic to OPAL, as well as unnecessary, since firmware takes of this (better) for us. On CHRP and on any platform with a hypervisor, firmware also takes care of it for us and, on hypervisors, trying to set it will trigger a fault. Make it per-platform instead of expanding the list of conditions in the generic code. Modified: projects/powernv/powerpc/aim/aim_machdep.c projects/powernv/powerpc/aim/mp_cpudep.c projects/powernv/powerpc/mpc85xx/platform_mpc85xx.c projects/powernv/powerpc/powermac/platform_powermac.c projects/powernv/powerpc/powerpc/mp_machdep.c projects/powernv/powerpc/powerpc/platform.c projects/powernv/powerpc/powerpc/platform_if.m Modified: projects/powernv/powerpc/aim/aim_machdep.c ============================================================================== --- projects/powernv/powerpc/aim/aim_machdep.c Tue Aug 23 21:41:27 2016 (r304707) +++ projects/powernv/powerpc/aim/aim_machdep.c Tue Aug 23 22:04:25 2016 (r304708) @@ -595,7 +595,7 @@ cpu_sleep() while (1) mtmsr(msr); } - mttb(timebase); + platform_smp_timebase_sync(timebase, 0); PCPU_SET(curthread, curthread); PCPU_SET(curpcb, curthread->td_pcb); pmap_activate(curthread); Modified: projects/powernv/powerpc/aim/mp_cpudep.c ============================================================================== --- projects/powernv/powerpc/aim/mp_cpudep.c Tue Aug 23 21:41:27 2016 (r304707) +++ projects/powernv/powerpc/aim/mp_cpudep.c Tue Aug 23 22:04:25 2016 (r304708) @@ -281,13 +281,8 @@ cpudep_ap_setup() vers = mfpvr() >> 16; /* The following is needed for restoring from sleep. */ -#ifdef __powerpc64__ - /* Writing to the time base register is hypervisor-privileged */ - if (mfmsr() & PSL_HV) - mttb(0); -#else - mttb(0); -#endif + platform_smp_timebase_sync(0, 1); + switch(vers) { case IBM970: case IBM970FX: Modified: projects/powernv/powerpc/mpc85xx/platform_mpc85xx.c ============================================================================== --- projects/powernv/powerpc/mpc85xx/platform_mpc85xx.c Tue Aug 23 21:41:27 2016 (r304707) +++ projects/powernv/powerpc/mpc85xx/platform_mpc85xx.c Tue Aug 23 22:04:25 2016 (r304708) @@ -90,6 +90,7 @@ static int mpc85xx_smp_first_cpu(platfor static int mpc85xx_smp_next_cpu(platform_t, struct cpuref *cpuref); static int mpc85xx_smp_get_bsp(platform_t, struct cpuref *cpuref); static int mpc85xx_smp_start_cpu(platform_t, struct pcpu *cpu); +static void mpc85xx_smp_timebase_sync(platform_t, u_long tb, int ap); static void mpc85xx_idle(platform_t, int cpu); static int mpc85xx_idle_wakeup(platform_t plat, int cpu); @@ -105,6 +106,7 @@ static platform_method_t mpc85xx_methods PLATFORMMETHOD(platform_smp_next_cpu, mpc85xx_smp_next_cpu), PLATFORMMETHOD(platform_smp_get_bsp, mpc85xx_smp_get_bsp), PLATFORMMETHOD(platform_smp_start_cpu, mpc85xx_smp_start_cpu), + PLATFORMMETHOD(platform_smp_timebase_sync, mpc85xx_smp_timebase_sync), PLATFORMMETHOD(platform_reset, mpc85xx_reset), PLATFORMMETHOD(platform_idle, mpc85xx_idle), @@ -536,6 +538,13 @@ mpc85xx_reset(platform_t plat) } static void +mpc85xx_smp_timebase_sync(platform_t plat, u_long tb, int ap) +{ + + mttb(tb); +} + +static void mpc85xx_idle(platform_t plat, int cpu) { uint32_t reg; Modified: projects/powernv/powerpc/powermac/platform_powermac.c ============================================================================== --- projects/powernv/powerpc/powermac/platform_powermac.c Tue Aug 23 21:41:27 2016 (r304707) +++ projects/powernv/powerpc/powermac/platform_powermac.c Tue Aug 23 22:04:25 2016 (r304708) @@ -64,6 +64,7 @@ static int powermac_smp_first_cpu(platfo static int powermac_smp_next_cpu(platform_t, struct cpuref *cpuref); static int powermac_smp_get_bsp(platform_t, struct cpuref *cpuref); static int powermac_smp_start_cpu(platform_t, struct pcpu *cpu); +static void powermac_smp_timebase_sync(platform_t, u_long tb, int ap); static void powermac_reset(platform_t); static void powermac_sleep(platform_t); @@ -77,6 +78,7 @@ static platform_method_t powermac_method PLATFORMMETHOD(platform_smp_next_cpu, powermac_smp_next_cpu), PLATFORMMETHOD(platform_smp_get_bsp, powermac_smp_get_bsp), PLATFORMMETHOD(platform_smp_start_cpu, powermac_smp_start_cpu), + PLATFORMMETHOD(platform_smp_timebase_sync, powermac_smp_timebase_sync), PLATFORMMETHOD(platform_reset, powermac_reset), PLATFORMMETHOD(platform_sleep, powermac_sleep), @@ -390,6 +392,13 @@ powermac_smp_start_cpu(platform_t plat, } static void +powermac_smp_timebase_sync(platform_t plat, u_long tb, int ap) +{ + + mttb(tb); +} + +static void powermac_reset(platform_t platform) { OF_reboot(); Modified: projects/powernv/powerpc/powerpc/mp_machdep.c ============================================================================== --- projects/powernv/powerpc/powerpc/mp_machdep.c Tue Aug 23 21:41:27 2016 (r304707) +++ projects/powernv/powerpc/powerpc/mp_machdep.c Tue Aug 23 22:04:25 2016 (r304708) @@ -81,13 +81,7 @@ machdep_ap_bootstrap(void) ; /* Initialize DEC and TB, sync with the BSP values */ -#ifdef __powerpc64__ - /* Writing to the time base register is hypervisor-privileged */ - if (mfmsr() & PSL_HV) - mttb(ap_timebase); -#else - mttb(ap_timebase); -#endif + platform_smp_timebase_sync(ap_timebase, 1); decr_ap_init(); /* Give platform code a chance to do anything necessary */ @@ -248,13 +242,7 @@ cpu_mp_unleash(void *dummy) /* Let APs continue */ atomic_store_rel_int(&ap_letgo, 1); -#ifdef __powerpc64__ - /* Writing to the time base register is hypervisor-privileged */ - if (mfmsr() & PSL_HV) - mttb(ap_timebase); -#else - mttb(ap_timebase); -#endif + platform_smp_timebase_sync(ap_timebase, 0); while (ap_awake < smp_cpus) ; Modified: projects/powernv/powerpc/powerpc/platform.c ============================================================================== --- projects/powernv/powerpc/powerpc/platform.c Tue Aug 23 21:41:27 2016 (r304707) +++ projects/powernv/powerpc/powerpc/platform.c Tue Aug 23 22:04:25 2016 (r304708) @@ -266,6 +266,12 @@ platform_cpu_idle(int cpu) PLATFORM_IDLE(plat_obj, cpu); } +void platform_smp_timebase_sync(u_long tb, int ap) +{ + + PLATFORM_SMP_TIMEBASE_SYNC(plat_obj, tb, ap); +} + /* * Platform install routines. Highest priority wins, using the same * algorithm as bus attachment. Modified: projects/powernv/powerpc/powerpc/platform_if.m ============================================================================== --- projects/powernv/powerpc/powerpc/platform_if.m Tue Aug 23 21:41:27 2016 (r304707) +++ projects/powernv/powerpc/powerpc/platform_if.m Tue Aug 23 22:04:25 2016 (r304708) @@ -241,3 +241,14 @@ METHOD void sleep { platform_t _plat; }; +/** + * @brief Attempt to synchronize timebase of current CPU with others. + * Entered (approximately) simultaneously on all CPUs, including the BSP. + * Passed the timebase value on the BSP as of shortly before the call. + */ +METHOD void smp_timebase_sync { + platform_t _plat; + u_long _tb; + int _ap; +}; +
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201608232204.u7NM4P39088451>