• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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