69 lines
1.6 KiB
C
69 lines
1.6 KiB
C
|
/*
|
||
|
* Copyright (c) 2020 Institute of Parallel And Distributed Systems (IPADS),
|
||
|
* Shanghai Jiao Tong University (SJTU) OS-Lab-2020 (i.e., ChCore) is licensed
|
||
|
* under the Mulan PSL v1. You can use this software according to the terms and
|
||
|
* conditions of the Mulan PSL v1. You may obtain a copy of Mulan PSL v1 at:
|
||
|
* http://license.coscl.org.cn/MulanPSL
|
||
|
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY
|
||
|
* KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
|
||
|
* NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. See the
|
||
|
* Mulan PSL v1 for more details.
|
||
|
*/
|
||
|
|
||
|
#include <common/smp.h>
|
||
|
#include <common/sync.h>
|
||
|
#include <tests/barrier.h>
|
||
|
#include <common/errno.h>
|
||
|
#include <common/kprint.h>
|
||
|
#include <common/macro.h>
|
||
|
#include <common/types.h>
|
||
|
|
||
|
volatile u64 cpu_barrier[PLAT_CPU_NUM];
|
||
|
|
||
|
#define PRIMARY_CPU_ID 0
|
||
|
|
||
|
void global_barrier_init(void)
|
||
|
{
|
||
|
int i;
|
||
|
for (i = 0; i < PLAT_CPU_NUM; i++) {
|
||
|
cpu_barrier[i] = 0;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void global_barrier(bool is_bsp)
|
||
|
{
|
||
|
if (is_bsp)
|
||
|
global_barrier_primary();
|
||
|
else
|
||
|
global_barrier_secondary();
|
||
|
}
|
||
|
|
||
|
void global_barrier_primary(void)
|
||
|
{
|
||
|
int i;
|
||
|
u32 cpu_id = smp_get_cpu_id();
|
||
|
u64 barrier_num;
|
||
|
|
||
|
BUG_ON(PRIMARY_CPU_ID != cpu_id);
|
||
|
|
||
|
barrier_num = cpu_barrier[cpu_id];
|
||
|
for (i = 0; i < PLAT_CPU_NUM; i++) {
|
||
|
if (i == cpu_id)
|
||
|
continue;
|
||
|
while (cpu_barrier[i] != barrier_num + 1) ;
|
||
|
}
|
||
|
cpu_barrier[cpu_id] = barrier_num + 1;
|
||
|
asm volatile ("dsb sy");
|
||
|
}
|
||
|
|
||
|
void global_barrier_secondary(void)
|
||
|
{
|
||
|
u32 cpu_id = smp_get_cpu_id();
|
||
|
u64 barrier_num;
|
||
|
|
||
|
barrier_num = cpu_barrier[cpu_id];
|
||
|
cpu_barrier[cpu_id]++;
|
||
|
while (cpu_barrier[PRIMARY_CPU_ID] != barrier_num + 1) ;
|
||
|
asm volatile ("dsb sy");
|
||
|
}
|