Date: Sat, 5 Nov 2011 17:29:28 +0000 (UTC) From: Nathan Whitehorn <nwhitehorn@FreeBSD.org> To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r227113 - in projects/pseries/powerpc: include powerpc pseries Message-ID: <201111051729.pA5HTSXA077631@svn.freebsd.org>
index | next in thread | raw e-mail
Author: nwhitehorn Date: Sat Nov 5 17:29:28 2011 New Revision: 227113 URL: http://svn.freebsd.org/changeset/base/227113 Log: Allow platform modules to set the CPU interrupt priority state, and implement this on pSeries. Modified: projects/pseries/powerpc/include/platform.h projects/pseries/powerpc/powerpc/mp_machdep.c projects/pseries/powerpc/powerpc/platform.c projects/pseries/powerpc/powerpc/platform_if.m projects/pseries/powerpc/pseries/platform_chrp.c Modified: projects/pseries/powerpc/include/platform.h ============================================================================== --- projects/pseries/powerpc/include/platform.h Sat Nov 5 16:47:47 2011 (r227112) +++ projects/pseries/powerpc/include/platform.h Sat Nov 5 17:29:28 2011 (r227113) @@ -52,6 +52,7 @@ int platform_smp_first_cpu(struct cpuref int platform_smp_next_cpu(struct cpuref *); int platform_smp_get_bsp(struct cpuref *); int platform_smp_start_cpu(struct pcpu *); +void platform_smp_ap_init(void); const char *installed_platform(void); void platform_probe_and_attach(void); Modified: projects/pseries/powerpc/powerpc/mp_machdep.c ============================================================================== --- projects/pseries/powerpc/powerpc/mp_machdep.c Sat Nov 5 16:47:47 2011 (r227112) +++ projects/pseries/powerpc/powerpc/mp_machdep.c Sat Nov 5 17:29:28 2011 (r227113) @@ -90,6 +90,9 @@ machdep_ap_bootstrap(void) #endif decr_ap_init(); + /* Give platform code a chance to do anything necessary */ + platform_smp_ap_init(); + /* Serialize console output and AP count increment */ mtx_lock_spin(&ap_boot_mtx); ap_awake++; Modified: projects/pseries/powerpc/powerpc/platform.c ============================================================================== --- projects/pseries/powerpc/powerpc/platform.c Sat Nov 5 16:47:47 2011 (r227112) +++ projects/pseries/powerpc/powerpc/platform.c Sat Nov 5 17:29:28 2011 (r227113) @@ -141,6 +141,12 @@ platform_smp_start_cpu(struct pcpu *cpu) return (PLATFORM_SMP_START_CPU(plat_obj, cpu)); } +void +platform_smp_ap_init() +{ + PLATFORM_SMP_AP_INIT(plat_obj); +} + #ifdef SMP struct cpu_group * cpu_topo(void) Modified: projects/pseries/powerpc/powerpc/platform_if.m ============================================================================== --- projects/pseries/powerpc/powerpc/platform_if.m Sat Nov 5 16:47:47 2011 (r227112) +++ projects/pseries/powerpc/powerpc/platform_if.m Sat Nov 5 17:29:28 2011 (r227113) @@ -80,6 +80,10 @@ CODE { { return (VM_MAX_ADDRESS); } + static void platform_null_smp_ap_init(platform_t plat) + { + return; + } }; /** @@ -185,6 +189,14 @@ METHOD int smp_start_cpu { }; /** + * @brief Start a CPU + * + */ +METHOD void smp_ap_init { + platform_t _plat; +} DEFAULT platform_null_smp_ap_init; + +/** * @brief Return SMP topology */ METHOD cpu_group_t smp_topo { Modified: projects/pseries/powerpc/pseries/platform_chrp.c ============================================================================== --- projects/pseries/powerpc/pseries/platform_chrp.c Sat Nov 5 16:47:47 2011 (r227112) +++ projects/pseries/powerpc/pseries/platform_chrp.c Sat Nov 5 17:29:28 2011 (r227113) @@ -68,6 +68,7 @@ static u_long chrp_timebase_freq(platfor static int chrp_smp_first_cpu(platform_t, struct cpuref *cpuref); static int chrp_smp_next_cpu(platform_t, struct cpuref *cpuref); static int chrp_smp_get_bsp(platform_t, struct cpuref *cpuref); +static void chrp_smp_ap_init(platform_t); #ifdef SMP static int chrp_smp_start_cpu(platform_t, struct pcpu *cpu); static struct cpu_group *chrp_smp_topo(platform_t plat); @@ -85,6 +86,7 @@ static platform_method_t chrp_methods[] PLATFORMMETHOD(platform_real_maxaddr, chrp_real_maxaddr), PLATFORMMETHOD(platform_timebase_freq, chrp_timebase_freq), + PLATFORMMETHOD(platform_smp_ap_init, chrp_smp_ap_init), PLATFORMMETHOD(platform_smp_first_cpu, chrp_smp_first_cpu), PLATFORMMETHOD(platform_smp_next_cpu, chrp_smp_next_cpu), PLATFORMMETHOD(platform_smp_get_bsp, chrp_smp_get_bsp), @@ -128,6 +130,9 @@ chrp_attach(platform_t plat) pmap_mmu_install("mmu_phyp", BUS_PROBE_SPECIFIC); cpu_idle_hook = phyp_cpu_idle; + + /* Set interrupt priority */ + phyp_hcall(H_CPPR, 0xff); } #endif @@ -368,4 +373,13 @@ phyp_cpu_idle(void) { phyp_hcall(H_CEDE); } + +static void +chrp_smp_ap_init(platform_t platform) +{ + if (!(mfmsr() & PSL_HV)) { + /* Set interrupt priority */ + phyp_hcall(H_CPPR, 0xff); + } +} #endifhelp
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201111051729.pA5HTSXA077631>
