Add SMP support to the ARM PLATFORM code. This will allow us to have
different methods to start the secondary cores in a kernel built for multiple SoCs, e.g. with the Allwinner A20 and A31. Sponsored by: ABT systems Ltd Differential Revision: https://reviews.freebsd.org/D5466
This commit is contained in:
parent
0fc124ccdd
commit
a19c0b37e9
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=296158
@ -177,3 +177,18 @@ platform_late_init(void)
|
||||
PLATFORM_LATE_INIT(plat_obj);
|
||||
}
|
||||
|
||||
#if defined(SMP) && defined(PLATFORM_SMP)
|
||||
void
|
||||
platform_mp_setmaxid(void)
|
||||
{
|
||||
|
||||
PLATFORM_MP_SETMAXID(plat_obj);
|
||||
}
|
||||
|
||||
void
|
||||
platform_mp_start_ap(void)
|
||||
{
|
||||
|
||||
PLATFORM_MP_START_AP(plat_obj);
|
||||
}
|
||||
#endif
|
||||
|
@ -57,6 +57,12 @@ CODE {
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
static void platform_default_mp_setmaxid(platform_t plat)
|
||||
{
|
||||
mp_ncpus = 1;
|
||||
mp_maxid = 0;
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
@ -114,3 +120,16 @@ METHOD void late_init {
|
||||
platform_t _plat;
|
||||
};
|
||||
|
||||
/**
|
||||
* @brief Called by cpu_mp_setmaxid() to set mp_maxid and mp_ncpus.
|
||||
*/
|
||||
METHOD void mp_setmaxid {
|
||||
platform_t _plat;
|
||||
} DEFAULT platform_default_mp_setmaxid;
|
||||
|
||||
/**
|
||||
* @brief Called by cpu_mp_start to start the secondary processors.
|
||||
*/
|
||||
METHOD void mp_start_ap {
|
||||
platform_t _plat;
|
||||
};
|
||||
|
@ -26,6 +26,7 @@ include "../qemu/std.virt"
|
||||
options HZ=100
|
||||
options SCHED_ULE # 4BSD scheduler
|
||||
options PLATFORM
|
||||
options PLATFORM_SMP
|
||||
options SMP # Enable multiple cores
|
||||
|
||||
# Debugging for use in -current
|
||||
|
@ -41,6 +41,8 @@ __FBSDID("$FreeBSD$");
|
||||
#include <machine/platform.h>
|
||||
#include <machine/platformvar.h>
|
||||
|
||||
#include <arm/qemu/virt_mp.h>
|
||||
|
||||
#include "platform_if.h"
|
||||
|
||||
struct arm32_dma_range *
|
||||
@ -86,6 +88,11 @@ static platform_method_t virt_methods[] = {
|
||||
PLATFORMMETHOD(platform_devmap_init, virt_devmap_init),
|
||||
PLATFORMMETHOD(platform_lastaddr, virt_lastaddr),
|
||||
|
||||
#ifdef SMP
|
||||
PLATFORMMETHOD(platform_mp_start_ap, virt_mp_start_ap),
|
||||
PLATFORMMETHOD(platform_mp_setmaxid, virt_mp_setmaxid),
|
||||
#endif
|
||||
|
||||
PLATFORMMETHOD_END,
|
||||
};
|
||||
|
||||
|
@ -38,12 +38,15 @@ __FBSDID("$FreeBSD$");
|
||||
#include <vm/pmap.h>
|
||||
|
||||
#include <machine/intr.h>
|
||||
#include <machine/platformvar.h>
|
||||
#include <machine/smp.h>
|
||||
|
||||
#include <dev/ofw/openfirm.h>
|
||||
#include <dev/ofw/ofw_cpu.h>
|
||||
#include <dev/psci/psci.h>
|
||||
|
||||
#include <arm/qemu/virt_mp.h>
|
||||
|
||||
static int running_cpus;
|
||||
|
||||
static boolean_t
|
||||
@ -57,7 +60,7 @@ virt_maxid(u_int id, phandle_t node, u_int addr_cells, pcell_t *reg)
|
||||
}
|
||||
|
||||
void
|
||||
platform_mp_setmaxid(void)
|
||||
virt_mp_setmaxid(platform_t plat)
|
||||
{
|
||||
|
||||
mp_maxid = PCPU_GET(cpuid);
|
||||
@ -85,7 +88,7 @@ virt_start_ap(u_int id, phandle_t node, u_int addr_cells, pcell_t *reg)
|
||||
}
|
||||
|
||||
void
|
||||
platform_mp_start_ap(void)
|
||||
virt_mp_start_ap(platform_t plat)
|
||||
{
|
||||
|
||||
ofw_cpu_early_foreach(virt_start_ap, true);
|
||||
|
35
sys/arm/qemu/virt_mp.h
Normal file
35
sys/arm/qemu/virt_mp.h
Normal file
@ -0,0 +1,35 @@
|
||||
/*-
|
||||
* Copyright (c) 2016 Andrew Turner
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* $FreeBSD$
|
||||
*/
|
||||
|
||||
#ifndef _QEMU_VIRT_MP_H_
|
||||
#define _QEMU_VIRT_MP_H_
|
||||
|
||||
void virt_mp_start_ap(platform_t plat);
|
||||
void virt_mp_setmaxid(platform_t plat);
|
||||
|
||||
#endif /* _QEMU_VIRT_MP_H_ */
|
@ -34,6 +34,7 @@ LINUX_BOOT_ABI opt_global.h
|
||||
LOADERRAMADDR opt_global.h
|
||||
PHYSADDR opt_global.h
|
||||
PLATFORM opt_global.h
|
||||
PLATFORM_SMP opt_global.h
|
||||
SOCDEV_PA opt_global.h
|
||||
SOCDEV_VA opt_global.h
|
||||
PV_STATS opt_pmap.h
|
||||
|
Loading…
Reference in New Issue
Block a user