1 /*
2 * Copyright (c) 2009-2022 Huawei Technologies Co., Ltd. All rights reserved.
3 *
4 * UniProton is licensed under Mulan PSL v2.
5 * You can use this software according to the terms and conditions of the Mulan PSL v2.
6 * You may obtain a copy of Mulan PSL v2 at:
7 * http://license.coscl.org.cn/MulanPSL2
8 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
9 * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
10 * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
11 * See the Mulan PSL v2 for more details.
12 * Create: 2009-12-22
13 * Description: UniProton hi3093 demo
14 */
15 #include "prt_sys.h"
16 #include "prt_tick.h"
17 #include "prt_config.h"
18 #include "prt_task.h"
19 #include "prt_hwi.h"
20 #include "cpu_config.h"
21 #include "securec.h"
22
23 U64 g_timerFrequency;
24 #define PMU_TIMER_FREQUENCY g_timerFrequency
25
GetGenericTimerFreq(void)26 U64 GetGenericTimerFreq(void)
27 {
28 U64 freq;
29
30 OS_EMBED_ASM("MRS %0, CNTFRQ_EL0" : "=r"(freq) : : "memory", "cc");
31
32 return freq;
33 }
34
TimerIsr(uintptr_t para)35 void TimerIsr(uintptr_t para)
36 {
37 (void)para;
38 U32 cfgMask = 0x0;
39 U64 cycle = PMU_TIMER_FREQUENCY / OS_TICK_PER_SECOND;
40
41 OS_EMBED_ASM("MSR CNTP_CTL_EL0, %0" : : "r"(cfgMask) : "memory");
42 PRT_ISB();
43 OS_EMBED_ASM("MSR CNTP_TVAL_EL0, %0" : : "r"(cycle) : "memory", "cc");
44
45 cfgMask = 0x1;
46 OS_EMBED_ASM("MSR CNTP_CTL_EL0, %0" : : "r"(cfgMask) : "memory");
47
48 PRT_TickISR();
49 PRT_ISB();
50 }
51
CoreTimerInit(void)52 void CoreTimerInit(void)
53 {
54 U32 cfgMask = 0x0;
55 U64 cycle = PMU_TIMER_FREQUENCY / OS_TICK_PER_SECOND;
56
57 OS_EMBED_ASM("MSR CNTP_CTL_EL0, %0" : : "r"(cfgMask) : "memory");
58 PRT_ISB();
59 OS_EMBED_ASM("MSR CNTP_TVAL_EL0, %0" : : "r"(cycle) : "memory", "cc");
60
61 cfgMask = 0x1;
62 OS_EMBED_ASM("MSR CNTP_CTL_EL0, %0" : : "r"(cfgMask) : "memory");
63 }
64
CoreTimerStart(void)65 U32 CoreTimerStart(void)
66 {
67 g_timerFrequency = GetGenericTimerFreq();
68 CoreTimerInit();
69
70 return OS_OK;
71 }
72
TestClkStart(void)73 U32 TestClkStart(void)
74 {
75 U32 ret;
76
77 ret = PRT_HwiSetAttr(TEST_CLK_INT, 10, OS_HWI_MODE_ENGROSS);
78 if (ret != OS_OK) {
79 return ret;
80 }
81
82 ret = PRT_HwiCreate(TEST_CLK_INT, (HwiProcFunc)TimerIsr, 0);
83 if (ret != OS_OK) {
84 return ret;
85 }
86
87 #if (OS_GIC_VER == 3)
88 ret = PRT_HwiEnable(TEST_CLK_INT);
89 if (ret != OS_OK) {
90 return ret;
91 }
92 #elif (OS_GIC_VER == 2)
93 IsrRegister(TEST_CLK_INT, 0xaU, (0x1U << 0x3U));
94 #endif
95
96 ret = CoreTimerStart();
97 if (ret != OS_OK) {
98 return ret;
99 }
100
101 return OS_OK;
102 }
103