svn commit: r299380 - head/sys/arm/allwinner

Emmanuel Vadot manu at FreeBSD.org
Tue May 10 18:00:39 UTC 2016


Author: manu
Date: Tue May 10 18:00:37 2016
New Revision: 299380
URL: https://svnweb.freebsd.org/changeset/base/299380

Log:
  Merge a20_mp_start_ap and a31_mp_start_ap into one function.
  This function works with all smp non-multicluster allwinner SoC (A20, A31, A31S and H3).
  
  Approved by:	cognet (mentor)
  Differential Revision:	https://reviews.freebsd.org/D6269

Modified:
  head/sys/arm/allwinner/allwinner_machdep.c
  head/sys/arm/allwinner/aw_mp.c
  head/sys/arm/allwinner/aw_mp.h

Modified: head/sys/arm/allwinner/allwinner_machdep.c
==============================================================================
--- head/sys/arm/allwinner/allwinner_machdep.c	Tue May 10 17:51:17 2016	(r299379)
+++ head/sys/arm/allwinner/allwinner_machdep.c	Tue May 10 18:00:37 2016	(r299380)
@@ -167,7 +167,7 @@ static platform_method_t a20_methods[] =
 	PLATFORMMETHOD(platform_devmap_init,    allwinner_devmap_init),
 
 #ifdef SMP
-	PLATFORMMETHOD(platform_mp_start_ap,	a20_mp_start_ap),
+	PLATFORMMETHOD(platform_mp_start_ap,	aw_mp_start_ap),
 	PLATFORMMETHOD(platform_mp_setmaxid,	aw_mp_setmaxid),
 #endif
 	PLATFORMMETHOD_END,
@@ -182,7 +182,7 @@ static platform_method_t a31_methods[] =
 	PLATFORMMETHOD(platform_devmap_init,    allwinner_devmap_init),
 
 #ifdef SMP
-	PLATFORMMETHOD(platform_mp_start_ap,	a31_mp_start_ap),
+	PLATFORMMETHOD(platform_mp_start_ap,	aw_mp_start_ap),
 	PLATFORMMETHOD(platform_mp_setmaxid,	aw_mp_setmaxid),
 #endif
 	PLATFORMMETHOD_END,
@@ -197,7 +197,7 @@ static platform_method_t a31s_methods[] 
 	PLATFORMMETHOD(platform_devmap_init,    allwinner_devmap_init),
 
 #ifdef SMP
-	PLATFORMMETHOD(platform_mp_start_ap,	a31_mp_start_ap),
+	PLATFORMMETHOD(platform_mp_start_ap,	aw_mp_start_ap),
 	PLATFORMMETHOD(platform_mp_setmaxid,	aw_mp_setmaxid),
 #endif
 	PLATFORMMETHOD_END,

Modified: head/sys/arm/allwinner/aw_mp.c
==============================================================================
--- head/sys/arm/allwinner/aw_mp.c	Tue May 10 17:51:17 2016	(r299379)
+++ head/sys/arm/allwinner/aw_mp.c	Tue May 10 18:00:37 2016	(r299380)
@@ -107,12 +107,28 @@ aw_mp_setmaxid(platform_t plat)
 	mp_maxid = ncpu - 1;
 }
 
-static void
-aw_common_mp_start_ap(bus_space_handle_t cpucfg, bus_space_handle_t prcm)
+void
+aw_mp_start_ap(platform_t plat)
 {
-	int i, j;
+	bus_space_handle_t cpucfg;
+	bus_space_handle_t prcm;
+	int i, j, soc_family;
 	uint32_t val;
 
+	soc_family = allwinner_soc_family();
+	if (soc_family == ALLWINNERSOC_SUN7I) {
+		if (bus_space_map(fdtbus_bs_tag, A20_CPUCFG_BASE, CPUCFG_SIZE,
+		    0, &cpucfg) != 0)
+			panic("Couldn't map the CPUCFG\n");
+	} else {
+		if (bus_space_map(fdtbus_bs_tag, CPUCFG_BASE, CPUCFG_SIZE,
+		    0, &cpucfg) != 0)
+			panic("Couldn't map the CPUCFG\n");
+		if (bus_space_map(fdtbus_bs_tag, PRCM_BASE, PRCM_SIZE, 0,
+		    &prcm) != 0)
+			panic("Couldn't map the PRCM\n");
+	}
+
 	dcache_wbinv_poc_all();
 
 	bus_space_write_4(fdtbus_bs_tag, cpucfg, CPUCFG_P_REG0,
@@ -141,7 +157,7 @@ aw_common_mp_start_ap(bus_space_handle_t
 	/* Release power clamp */
 	for (i = 1; i < mp_ncpus; i++)
 		for (j = 0; j <= CPU_PWR_CLAMP_STEPS; j++) {
-			if (prcm) {
+			if (soc_family != ALLWINNERSOC_SUN7I) {
 				bus_space_write_4(fdtbus_bs_tag, prcm,
 				    CPU_PWR_CLAMP(i), 0xff >> j);
 			} else {
@@ -152,7 +168,7 @@ aw_common_mp_start_ap(bus_space_handle_t
 	DELAY(10000);
 
 	/* Clear power-off gating */
-	if (prcm) {
+	if (soc_family != ALLWINNERSOC_SUN7I) {
 		val = bus_space_read_4(fdtbus_bs_tag, prcm, CPU_PWROFF);
 		for (i = 0; i < mp_ncpus; i++)
 			val &= ~(1 << i);
@@ -179,39 +195,8 @@ aw_common_mp_start_ap(bus_space_handle_t
 
 	armv7_sev();
 	bus_space_unmap(fdtbus_bs_tag, cpucfg, CPUCFG_SIZE);
-}
-
-void
-a20_mp_start_ap(platform_t plat)
-{
-	bus_space_handle_t cpucfg;
-
-	if (bus_space_map(fdtbus_bs_tag, A20_CPUCFG_BASE, CPUCFG_SIZE,
-	    0, &cpucfg) != 0)
-		panic("Couldn't map the CPUCFG\n");
-
-	aw_common_mp_start_ap(cpucfg, 0);
-	armv7_sev();
-	bus_space_unmap(fdtbus_bs_tag, cpucfg, CPUCFG_SIZE);
-}
-
-void
-a31_mp_start_ap(platform_t plat)
-{
-	bus_space_handle_t cpucfg;
-	bus_space_handle_t prcm;
-
-	if (bus_space_map(fdtbus_bs_tag, CPUCFG_BASE, CPUCFG_SIZE,
-	    0, &cpucfg) != 0)
-		panic("Couldn't map the CPUCFG\n");
-	if (bus_space_map(fdtbus_bs_tag, PRCM_BASE, PRCM_SIZE, 0,
-	    &prcm) != 0)
-		panic("Couldn't map the PRCM\n");
-
-	aw_common_mp_start_ap(cpucfg, prcm);
-	armv7_sev();
-	bus_space_unmap(fdtbus_bs_tag, cpucfg, CPUCFG_SIZE);
-	bus_space_unmap(fdtbus_bs_tag, prcm, PRCM_SIZE);
+	if (soc_family != ALLWINNERSOC_SUN7I)
+		bus_space_unmap(fdtbus_bs_tag, prcm, PRCM_SIZE);
 }
 
 static void

Modified: head/sys/arm/allwinner/aw_mp.h
==============================================================================
--- head/sys/arm/allwinner/aw_mp.h	Tue May 10 17:51:17 2016	(r299379)
+++ head/sys/arm/allwinner/aw_mp.h	Tue May 10 18:00:37 2016	(r299380)
@@ -29,8 +29,7 @@
 #define	_AW_MP_H_
 
 void aw_mp_setmaxid(platform_t plat);
-void a20_mp_start_ap(platform_t plat);
-void a31_mp_start_ap(platform_t plat);
+void aw_mp_start_ap(platform_t plat);
 void a83t_mp_start_ap(platform_t plat);
 
 #endif /* _AW_MP_H_ */


More information about the svn-src-all mailing list