svn commit: r227113 - in projects/pseries/powerpc: include powerpc pseries

Nathan Whitehorn nwhitehorn at FreeBSD.org
Sat Nov 5 17:29:28 UTC 2011


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


More information about the svn-src-projects mailing list