]> git.sur5r.net Git - freertos/blob - FreeRTOS/Demo/RISC-V-Qemu-sifive_e-Eclipse-GCC/freedom-e-sdk/include/sifive/smp.h
Rename RISC-V-Qemu-sive_e_Freedom_Studio directory to RISC-V-Qemu-sifive_e-Eclipse...
[freertos] / FreeRTOS / Demo / RISC-V-Qemu-sifive_e-Eclipse-GCC / freedom-e-sdk / include / sifive / smp.h
1 #ifndef SIFIVE_SMP\r
2 #define SIFIVE_SMP\r
3 \r
4 // The maximum number of HARTs this code supports\r
5 #ifndef MAX_HARTS\r
6 #define MAX_HARTS 32\r
7 #endif\r
8 #define CLINT_END_HART_IPI CLINT_CTRL_ADDR + (MAX_HARTS*4)\r
9 \r
10 // The hart that non-SMP tests should run on\r
11 #ifndef NONSMP_HART\r
12 #define NONSMP_HART 0\r
13 #endif\r
14 \r
15 /* If your test cannot handle multiple-threads, use this: \r
16  *   smp_disable(reg1)\r
17  */\r
18 #define smp_disable(reg1, reg2)                  \\r
19   csrr reg1, mhartid                            ;\\r
20   li   reg2, NONSMP_HART                        ;\\r
21   beq  reg1, reg2, hart0_entry                  ;\\r
22 42:                                             ;\\r
23   wfi                                           ;\\r
24   j 42b                                         ;\\r
25 hart0_entry:\r
26 \r
27 /* If your test needs to temporarily block multiple-threads, do this:\r
28  *    smp_pause(reg1, reg2)\r
29  *    ... single-threaded work ...\r
30  *    smp_resume(reg1, reg2)\r
31  *    ... multi-threaded work ...\r
32  */\r
33 \r
34 #define smp_pause(reg1, reg2)    \\r
35   li reg2, 0x8                  ;\\r
36   csrw mie, reg2                ;\\r
37   csrr reg2, mhartid            ;\\r
38   bnez reg2, 42f\r
39 \r
40 #define smp_resume(reg1, reg2)   \\r
41   li reg1, CLINT_CTRL_ADDR      ;\\r
42 41:                             ;\\r
43   li reg2, 1                    ;\\r
44   sw reg2, 0(reg1)              ;\\r
45   addi reg1, reg1, 4            ;\\r
46   li reg2, CLINT_END_HART_IPI   ;\\r
47   blt reg1, reg2, 41b           ;\\r
48 42:                             ;\\r
49   wfi                           ;\\r
50   csrr reg2, mip                ;\\r
51   andi reg2, reg2, 0x8          ;\\r
52   beqz reg2, 42b                ;\\r
53   li reg1, CLINT_CTRL_ADDR      ;\\r
54   csrr reg2, mhartid            ;\\r
55   slli reg2, reg2, 2            ;\\r
56   add reg2, reg2, reg1          ;\\r
57   sw zero, 0(reg2)              ;\\r
58 41:                             ;\\r
59   lw reg2, 0(reg1)              ;\\r
60   bnez reg2, 41b                ;\\r
61   addi reg1, reg1, 4            ;\\r
62   li reg2, CLINT_END_HART_IPI   ;\\r
63   blt reg1, reg2, 41b\r
64 \r
65 #endif\r