From owner-svn-src-projects@FreeBSD.ORG Sat Nov 5 17:29:28 2011 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 8DFE61065674; Sat, 5 Nov 2011 17:29:28 +0000 (UTC) (envelope-from nwhitehorn@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 5D8258FC19; Sat, 5 Nov 2011 17:29:28 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id pA5HTSBs077637; Sat, 5 Nov 2011 17:29:28 GMT (envelope-from nwhitehorn@svn.freebsd.org) Received: (from nwhitehorn@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id pA5HTSXA077631; Sat, 5 Nov 2011 17:29:28 GMT (envelope-from nwhitehorn@svn.freebsd.org) Message-Id: <201111051729.pA5HTSXA077631@svn.freebsd.org> From: Nathan Whitehorn Date: Sat, 5 Nov 2011 17:29:28 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r227113 - in projects/pseries/powerpc: include powerpc pseries X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 05 Nov 2011 17:29:28 -0000 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); + } +} #endif