summaryrefslogtreecommitdiff
path: root/bsp/xuantie/xiaohui/c920/board/board.c
blob: 409508a2adf92bd88b602cb2ff7549434edc2392 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
/*
 * Copyright (c) 2006-2025, RT-Thread Development Team
 *
 * SPDX-License-Identifier: Apache-2.0
 *
 * Change Logs:
 * Date           Author       Notes
 * 2025-04-23     Wangshun     first version
 */

#include <board.h>
#include <rthw.h>
#include <rtthread.h>
#include <drv_usart.h>

extern unsigned long __heap_start;
extern unsigned long __heap_end;

/**
 * This function will initialize your board.
 */
void rt_hw_board_init()
{
    rt_hw_interrupt_init();

#ifdef RT_USING_HEAP
    rt_system_heap_init((void *)&__heap_start, (void *)&__heap_end);
#endif

#ifdef BSP_USING_UART
    rt_hw_usart_init();
#endif

#ifdef RT_USING_CONSOLE
    rt_console_set_device(RT_CONSOLE_DEVICE_NAME);
#endif

#ifdef RT_USING_COMPONENTS_INIT
    rt_components_board_init();
#endif
}

#ifdef RT_USING_SMP
#include <csi_core.h>

extern void Reset_Handler(void);

static struct c9xx_regs_struct {
    uint64_t pmpaddr0;
    uint64_t pmpaddr1;
    uint64_t pmpaddr2;
    uint64_t pmpaddr3;
    uint64_t pmpaddr4;
    uint64_t pmpaddr5;
    uint64_t pmpaddr6;
    uint64_t pmpaddr7;
    uint64_t pmpcfg0;
    uint64_t mcor;
    uint64_t mhcr;
    uint64_t mccr2;
    uint64_t mhint;
    uint64_t msmpr;
    uint64_t mie;
    uint64_t mxstatus;
    uint64_t mtvec;
    uint64_t plic_base_addr;
    uint64_t clint_base_addr;
} c9xx_regs;

#define C9xx_PLIC_CLINT_OFFSET     0x04000000  /* 64M */
#define C9xx_PLIC_DELEG_OFFSET     0x001ffffc
#define C9xx_PLIC_DELEG_ENABLE     0x1

#define XIAOHUI_SRESET_BASE                 0x18030000
#define XIAOHUI_SRESET_ADDR_OFFSET          0x10
#define PRIMARY_STARTUP_CORE_ID                0

static void c9xx_csr_copy(void)
{
    if (PRIMARY_STARTUP_CORE_ID == csi_get_cpu_id()) {
        /* Load from boot core */
        c9xx_regs.pmpaddr0 = rv_csr_read(CSR_PMPADDR0);
        c9xx_regs.pmpaddr1 = rv_csr_read(CSR_PMPADDR1);
        c9xx_regs.pmpaddr2 = rv_csr_read(CSR_PMPADDR2);
        c9xx_regs.pmpaddr3 = rv_csr_read(CSR_PMPADDR3);
        c9xx_regs.pmpaddr4 = rv_csr_read(CSR_PMPADDR4);
        c9xx_regs.pmpaddr5 = rv_csr_read(CSR_PMPADDR5);
        c9xx_regs.pmpaddr6 = rv_csr_read(CSR_PMPADDR6);
        c9xx_regs.pmpaddr7 = rv_csr_read(CSR_PMPADDR7);
        c9xx_regs.pmpcfg0  = rv_csr_read(CSR_PMPCFG0);
        c9xx_regs.mcor     = rv_csr_read(CSR_MCOR);
        c9xx_regs.msmpr    = rv_csr_read(CSR_MSMPR);
        c9xx_regs.mhcr     = rv_csr_read(CSR_MHCR);
        c9xx_regs.mccr2    = rv_csr_read(CSR_MCCR2);
        c9xx_regs.mhint    = rv_csr_read(CSR_MHINT);
        c9xx_regs.mtvec    = rv_csr_read(CSR_MTVEC);
        c9xx_regs.mie      = rv_csr_read(CSR_MIE);
        c9xx_regs.mxstatus = rv_csr_read(CSR_MXSTATUS);

        c9xx_regs.plic_base_addr = rv_csr_read(CSR_MAPBADDR);
        c9xx_regs.clint_base_addr = c9xx_regs.plic_base_addr + C9xx_PLIC_CLINT_OFFSET;
    } else {
        /* Store to other core */
        // rv_csr_write(CSR_PMPADDR0, c9xx_regs.pmpaddr0);
        // rv_csr_write(CSR_PMPADDR1, c9xx_regs.pmpaddr1);
        // rv_csr_write(CSR_PMPADDR2, c9xx_regs.pmpaddr2);
        // rv_csr_write(CSR_PMPADDR3, c9xx_regs.pmpaddr3);
        // rv_csr_write(CSR_PMPADDR4, c9xx_regs.pmpaddr4);
        // rv_csr_write(CSR_PMPADDR5, c9xx_regs.pmpaddr5);
        // rv_csr_write(CSR_PMPADDR6, c9xx_regs.pmpaddr6);
        // rv_csr_write(CSR_PMPADDR7, c9xx_regs.pmpaddr7);
        // rv_csr_write(CSR_PMPCFG0,  c9xx_regs.pmpcfg0);
        rv_csr_write(CSR_MCOR,     c9xx_regs.mcor);
        rv_csr_write(CSR_MSMPR,    c9xx_regs.msmpr);
        rv_csr_write(CSR_MHCR,     c9xx_regs.mhcr);
        rv_csr_write(CSR_MHINT,    c9xx_regs.mhint);
        // rv_csr_write(CSR_MTVEC,    c9xx_regs.mtvec);
        // rv_csr_write(CSR_MIE,      c9xx_regs.mie);
        rv_csr_write(CSR_MXSTATUS, c9xx_regs.mxstatus);
    }
}

void riscv_soc_start_cpu(int cpu_num)
{
    if (cpu_num < 1) {
        return;
    }

    c9xx_csr_copy();

    *(unsigned long *)((unsigned long)XIAOHUI_SRESET_BASE + XIAOHUI_SRESET_ADDR_OFFSET + ((cpu_num - 1) << 3)) = (unsigned long)Reset_Handler;
#if __riscv_xtheadsync
    __ASM("sync");
#endif

    /* Release secondary cpus, Determined by the xiaohui FPGA platform */
    *(uint32_t *)(XIAOHUI_SRESET_BASE) = 0x7f;
    // uint32_t mrmr = *(uint32_t *)(XIAOHUI_SRESET_BASE);
    // *(uint32_t *)(XIAOHUI_SRESET_BASE) = mrmr | (0x1 << (cpu_num - 1));
#if __riscv_xtheadsync
    __ASM("sync");
#endif
}
#endif /* RT_USING_SMP */