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 | /** @} |