Rev 1849 | Rev 1899 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 1849 | Rev 1881 | ||
---|---|---|---|
Line 34... | Line 34... | ||
34 | 34 | ||
35 | #include <arch/drivers/tick.h> |
35 | #include <arch/drivers/tick.h> |
36 | #include <arch/interrupt.h> |
36 | #include <arch/interrupt.h> |
37 | #include <arch/asm.h> |
37 | #include <arch/asm.h> |
38 | #include <arch/register.h> |
38 | #include <arch/register.h> |
39 | #include <debug.h> |
- | |
40 | #include <time/clock.h> |
- | |
41 | #include <typedefs.h> |
39 | #include <typedefs.h> |
- | 40 | #include <arch/cpu.h> |
|
- | 41 | #include <arch/boot/boot.h> |
|
- | 42 | #include <time/clock.h> |
|
- | 43 | #include <arch.h> |
|
- | 44 | #include <debug.h> |
|
- | 45 | ||
- | 46 | #define TICK_RESTART_TIME 50 /* Worst case estimate. */ |
|
42 | 47 | ||
43 | /** Initialize tick interrupt. */ |
48 | /** Initialize tick interrupt. */ |
44 | void tick_init(void) |
49 | void tick_init(void) |
45 | { |
50 | { |
46 | tick_compare_reg_t compare; |
51 | tick_compare_reg_t compare; |
47 | 52 | ||
48 | interrupt_register(14, "tick_int", tick_interrupt); |
53 | interrupt_register(14, "tick_int", tick_interrupt); |
49 | compare.int_dis = false; |
54 | compare.int_dis = false; |
50 | compare.tick_cmpr = TICK_DELTA; |
55 | compare.tick_cmpr = bootinfo.processor.clock_frequency/HZ; |
51 | tick_compare_write(compare.value); |
56 | tick_compare_write(compare.value); |
52 | tick_write(0); |
57 | tick_write(0); |
53 | } |
58 | } |
54 | 59 | ||
55 | /** Process tick interrupt. |
60 | /** Process tick interrupt. |
Line 58... | Line 63... | ||
58 | * @param istate Interrupted state. |
63 | * @param istate Interrupted state. |
59 | */ |
64 | */ |
60 | void tick_interrupt(int n, istate_t *istate) |
65 | void tick_interrupt(int n, istate_t *istate) |
61 | { |
66 | { |
62 | softint_reg_t softint, clear; |
67 | softint_reg_t softint, clear; |
- | 68 | uint64_t next, compare, start, stop; |
|
63 | 69 | ||
64 | softint.value = softint_read(); |
70 | softint.value = softint_read(); |
65 | 71 | ||
66 | /* |
72 | /* |
67 | * Make sure we are servicing interrupt_level_14 |
73 | * Make sure we are servicing interrupt_level_14 |
Line 81... | Line 87... | ||
81 | clear_softint_write(clear.value); |
87 | clear_softint_write(clear.value); |
82 | 88 | ||
83 | /* |
89 | /* |
84 | * Restart counter. |
90 | * Restart counter. |
85 | */ |
91 | */ |
- | 92 | compare = CPU->arch.clock_frequency/HZ; |
|
- | 93 | start = tick_read(); |
|
- | 94 | next = start - compare; |
|
- | 95 | while (next >= compare - TICK_RESTART_TIME) { |
|
- | 96 | next -= compare; |
|
- | 97 | CPU->missed_clock_ticks++; |
|
- | 98 | } |
|
86 | tick_write(0); |
99 | stop = tick_read(); |
- | 100 | tick_write(next + (stop - start)); |
|
87 | 101 | ||
88 | clock(); |
102 | clock(); |
89 | } |
103 | } |
90 | 104 | ||
91 | /** @} |
105 | /** @} |