1/*
2 * Copyright 2019, Data61
3 * Commonwealth Scientific and Industrial Research Organisation (CSIRO)
4 * ABN 41 687 119 230.
5 *
6 * This software may be distributed and modified according to the terms of
7 * the BSD 2-Clause license. Note that NO WARRANTY is provided.
8 * See "LICENSE_BSD2.txt" for details.
9 *
10 * @TAG(DATA61_BSD)
11 */
12
13#pragma once
14
15#include <platsupport/timer.h>
16
17#define TIMER_BASE      0xc1100000
18#define TIMER_MAP_BASE  0xc1109000
19
20#define TIMER_REG_START   0x2650    // TIMER_MUX
21
22#define TIMER_E_INPUT_CLK 8
23#define TIMER_D_INPUT_CLK 6
24#define TIMER_C_INPUT_CLK 4
25#define TIMER_B_INPUT_CLK 2
26#define TIMER_A_INPUT_CLK 0
27
28#define TIMER_D_EN      BIT(19)
29#define TIMER_C_EN      BIT(18)
30#define TIMER_B_EN      BIT(17)
31#define TIMER_A_EN      BIT(16)
32#define TIMER_D_MODE    BIT(15)
33#define TIMER_C_MODE    BIT(14)
34#define TIMER_B_MODE    BIT(13)
35#define TIMER_A_MODE    BIT(12)
36
37#define TIMER_I_EN      BIT(19)
38#define TIMER_H_EN      BIT(18)
39#define TIMER_G_EN      BIT(17)
40#define TIMER_F_EN      BIT(16)
41#define TIMER_I_MODE    BIT(15)
42#define TIMER_H_MODE    BIT(14)
43#define TIMER_G_MODE    BIT(13)
44#define TIMER_F_MODE    BIT(12)
45
46#define TIMER_I_INPUT_CLK 6
47#define TIMER_H_INPUT_CLK 4
48#define TIMER_G_INPUT_CLK 2
49#define TIMER_F_INPUT_CLK 0
50
51#define TIMESTAMP_TIMEBASE_SYSTEM   0b000
52#define TIMESTAMP_TIMEBASE_1_US     0b001
53#define TIMESTAMP_TIMEBASE_10_US    0b010
54#define TIMESTAMP_TIMEBASE_100_US   0b011
55#define TIMESTAMP_TIMEBASE_1_MS     0b100
56
57#define TIMEOUT_TIMEBASE_1_US   0b00
58#define TIMEOUT_TIMEBASE_10_US  0b01
59#define TIMEOUT_TIMEBASE_100_US 0b10
60#define TIMEOUT_TIMEBASE_1_MS   0b11
61
62#define TIMER_A_IRQ 42
63#define TIMER_B_IRQ 43
64#define TIMER_C_IRQ 38
65#define TIMER_D_IRQ 61
66
67#define TIMER_F_IRQ 92
68#define TIMER_G_IRQ 93
69#define TIMER_H_IRQ 94
70#define TIMER_I_IRQ 95
71
72typedef struct {
73    uint32_t mux;
74    uint32_t timer_a;
75    uint32_t timer_b;
76    uint32_t timer_c;
77    uint32_t timer_d;
78    uint32_t unused[13];
79    uint32_t timer_e;
80    uint32_t timer_e_hi;
81    uint32_t mux1;
82    uint32_t timer_f;
83    uint32_t timer_g;
84    uint32_t timer_h;
85    uint32_t timer_i;
86} meson_timer_reg_t;
87
88typedef struct {
89    volatile meson_timer_reg_t *regs;
90    bool disable;
91} meson_timer_t;
92
93typedef struct {
94    void *vaddr;
95} meson_timer_config_t;
96
97int meson_init(meson_timer_t *timer, meson_timer_config_t config);
98uint64_t meson_get_time(meson_timer_t *timer);
99void meson_set_timeout(meson_timer_t *timer, uint16_t timeout, bool periodic);
100void meson_stop_timer(meson_timer_t *timer);
101