blob: a6502aafcc8990656bd10cf51ba4aae892913792 [file] [log] [blame]
xjb04a4022021-11-25 15:01:52 +08001/* Copyright Statement:
2 *
3 * This software/firmware and related documentation ("MediaTek Software") are
4 * protected under relevant copyright laws. The information contained herein
5 * is confidential and proprietary to MediaTek Inc. and/or its licensors.
6 * Without the prior written permission of MediaTek inc. and/or its licensors,
7 * any reproduction, modification, use or disclosure of MediaTek Software,
8 * and information contained herein, in whole or in part, shall be strictly prohibited.
9 */
10/* MediaTek Inc. (C) 2015. All rights reserved.
11 *
12 * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
13 * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
14 * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON
15 * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
16 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
17 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
18 * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
19 * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
20 * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH
21 * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES
22 * THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES
23 * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK
24 * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
25 * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND
26 * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
27 * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
28 * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO
29 * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
30 */
31
32#ifndef __XGPT_H__
33#define __XGPT_H__
34
35#include <stdio.h>
36#include <stdint.h>
37#include <encoding.h>
38#include <irq.h>
39
40#define TIMER_IN_CLK (CLK_CTRL_BASE + 0x30)
41#define TMR_MCLK_CG (1 << 0)
42#define TMR_BCLK_CG (1 << 1)
43
44#define XGPT_BASE_REG (SCP_TIMER_CORE0_BASE + mrv_read_csr(CSR_MHARTID)*0x10000)
45#define GENERAL_CTRL (CORE0_GENERAL_CTRL + mrv_read_csr(CSR_MHARTID)*0x10000)
46
47#define SCP_TIMER_BASE g_timer_base
48
49#define TMR0 0x0
50#define TMR1 0x1
51#define TMR2 0x2
52#define TMR3 0x3
53#define TMR4 0x4
54#define TMR5 0x5
55#define NR_TMRS 0x6
56
57#define TIMER_CPU_TICK_EN (SCP_TIMER_BASE + 0x68)
58#define TIMER_CPU_TICK_RST_VAL (SCP_TIMER_BASE + 0x6c)
59#define TIMER_CPU_TICK_CUR_VAL (SCP_TIMER_BASE + 0x70)
60#define TIMER_CPU_TICK_IRQ_CTRL (SCP_TIMER_BASE + 0x74)
61#define TIMERCPU_TICK_IRQ_CLR (1 << 5)
62#define TIMER_CPU_TICK_IRQ_STATUS (1 << 4)
63#define TIMER_CPU_TICK_IRQ_EN (1 << 0)
64
65#define OSTIMER_CON (SCP_TIMER_BASE + 0x80)
66#define OSTIMER_INIT_L (SCP_TIMER_BASE + 0x84)
67#define OSTIMER_INIT_H (SCP_TIMER_BASE + 0x88)
68#define OSTIMER_CUR_L 0x60017008 /*(SCP_TIMER_BASE + 0x8C)*/
69#define OSTIMER_CUR_H 0x6001700C /*(SCP_TIMER_BASE + 0x90)*/
70#define OSTIMER_TVAL (SCP_TIMER_BASE + 0x94)
71#define OSTIMER_IRQ_ACK (SCP_TIMER_BASE + 0x98)
72#define OSTIMER_TICK_IRQ_CLR (1 << 5)
73#define OSTIMER_TICK_IRQ_STATUS (1 << 4)
74#define OSTIMER_TICK_IRQ_EN (1 << 0)
75
76#define OS_TIMER_LATCH_CTRL (SCP_TIMER_BASE + 0xA0)
77#define OS_TIMER_LATCH_VALUE_0 (SCP_TIMER_BASE + 0xA4)
78#define OS_TIMER_LATCH_VALUE_0_MSB (SCP_TIMER_BASE + 0xA8)
79#define OS_TIMER_LATCH_VALUE_1 (SCP_TIMER_BASE + 0xAC)
80#define OS_TIMER_LATCH_VALUE_1_MSB (SCP_TIMER_BASE + 0xB0)
81#define OS_TIMER_LATCH_VALUE_2 (SCP_TIMER_BASE + 0xB4)
82#define OS_TIMER_LATCH_VALUE_2_MSB (SCP_TIMER_BASE + 0xB8)
83
84/* AP side system counter frequence is 13MHz*/
85#ifdef CFG_FPGA
86#define AP_NS_PER_CNT (1000000000UL)/(6000000UL)
87#else
88#define AP_NS_PER_CNT (1000000000UL)/(13000000UL)
89#endif
90
91#define TIMER_EN (0x00)
92#define TIMER_CLK_SRC (0x00)
93#define TIMER_RST_VAL (0x04)
94#define TIMER_CUR_VAL_REG (0x08)
95#define TIMER_IRQ_CTRL_REG (0x0C)
96
97#define TIMER_CLK_SEL_REG (SCP_TIMER_BASE+0x40)
98
99//#define portNVIC_MTK_XGPT_REG (TIMER_BASE + 0x18)
100
101#define TIMER_ENABLE 1
102#define TIMER_DISABLE 0
103
104#define TIMER_IRQ_ENABLE 1
105#define TIMER_IRQ_DISABLE 0
106
107#define TIMER_IRQ_STA (0x1 << 4)
108#define TIMER_IRQ_CLEAR (0x1 << 5)
109
110/* TODO: Check this setting */
111#define TIMER_CLK_SRC_CLK_32K (0x00)
112#define TIMER_CLK_SRC_CLK_26M (0x01)
113#define TIMER_CLK_SRC_BCLK (0x02)
114#define TIMER_CLK_SRC_PCLK (0x03)
115
116#define TIMER_CLK_SRC_MASK 0x3
117#define TIMER_CLK_SRC_SHIFT 4
118
119#define DELAY_TIMER_1US_TICK ((unsigned int)1) //(32KHz)
120#ifdef CFG_FPGA
121#define DELAY_TIMER_1MS_TICK ((unsigned int)34) //(33.3KHz)
122#else
123#define DELAY_TIMER_1MS_TICK ((unsigned int)33) //(32KHz)
124#endif
125
126// 32KHz: 31us = 1 counter
127#define TIME_TO_TICK_US(us) ((us)*DELAY_TIMER_1US_TICK)
128// 32KHz: 1ms = 33 counter
129#define TIME_TO_TICK_MS(ms) ((ms)*DELAY_TIMER_1MS_TICK)
130
131#ifdef CFG_FPGA
132#define COUNT_TO_TICK(x) ((x)/20) //20KHz, 1 tick is 20 counters
133#else
134#define COUNT_TO_TICK(x) ((x)/32) //32KHz, 1 tick is 32 counters
135#endif
136
137#define US_LIMIT 31 /* udelay's parameter limit */
138#define MAX_RG_BIT 0xffffffff
139
140#define RT_TIMER TMR0
141#define RT_TIMER_RSTVAL MAX_RG_BIT
142#define TICK_TIMER TMR1
143#define TICK_TIMER_RSTVAL MAX_RG_BIT
144#define DELAY_TIMER TMR2
145#define DELAY_TIMER_RSTVAL MAX_RG_BIT
146#define DMGR_TIMER TMR3
147#define DMGR_TIMER_RSTVAL TIME_TO_TICK_MS(1)
148#define CHRE_TIMER TMR4
149#define CHRE_TIMER_RSTVAL MAX_RG_BIT
150#define UNUSE2_TIMER TMR5
151#define UNUSE2_TIMER_RSTVAL MAX_RG_BIT
152
153typedef unsigned long long mt_time_t;
154typedef void (*platform_timer_callback) (void *arg);
155
156struct timer_device {
157 unsigned int id;
158 unsigned int base_addr;
159 struct INTC_IRQ irq;
160};
161
162/*************************End*****************************************/
163#if defined(CFG_MED_MCU_DVT)
164struct timer_device *get_dev_by_id(unsigned int id);
165void timer_enable_set(struct timer_device *dev);
166void timer_enable_irq(struct timer_device *dev);
167void timer_disable_set(struct timer_device *dev);
168void timer_set_clk(struct timer_device *dev, unsigned int clksrc);
169void timer_set_rstval(struct timer_device *dev, unsigned int val);
170unsigned long timer_get_curval(struct timer_device *dev);
171#endif
172void mdelay(unsigned long msec);
173void udelay(unsigned long usec);
174void mt_platform_timer_init(void);
175int platform_set_periodic_timer(platform_timer_callback callback, void *arg,
176 mt_time_t interval);
177unsigned long long read_xgpt_stamp_ns(void);
178unsigned long long timer_get_global_timer_tick(void);
179unsigned long long get_boot_time_ns(void);
180struct timer_device *id_to_dev(unsigned int id);
181
182void platform_set_cpu_tick(int interval);
183void timer_cpu_tick_irq_ack(void);
184void platform_cpu_tick_disable(void);
185void platform_cpu_tick_enable(void);
186
187#define OSTIMER_LATCH_TIME_SUPPORT
188
189#ifdef OSTIMER_LATCH_TIME_SUPPORT
190int alloc_latch_time(void);
191void free_latch_time(int id);
192void enable_latch_time(int id, int irq);
193void disable_latch_time(int id);
194uint64_t get_latch_time_timestamp(int id);
195#else
196static inline int alloc_latch_time(void)
197{
198 return -1;
199}
200
201static inline void free_latch_time(int id)
202{
203}
204
205static inline void enable_latch_time(int id, int irq)
206{
207}
208
209static inline void disable_latch_time(int id)
210{
211}
212
213static inline uint64_t get_latch_time_timestamp(int id)
214{
215 return 0;
216}
217#endif
218
219unsigned int program_hwtimer(void (*callback)(void), uint64_t diffTime);
220
221#endif /* !__XGPT_H__ */