2 Copyright � 2013, The AROS Development Team. All rights reserved.
6 #include <aros/kernel.h>
7 #include <aros/libcall.h>
8 #include <hardware/intbits.h>
9 #include <proto/exec.h>
11 #include <kernel_base.h>
12 #include <kernel_cpu.h>
13 #include <kernel_debug.h>
14 #include <kernel_interrupts.h>
15 #include <kernel_intr.h>
16 #include <kernel_objects.h>
18 #include "kernel_intern.h"
21 extern uint32_t __arm_periiobase
;
22 #define ARM_PERIIOBASE (__arm_periiobase)
24 /* We use own implementation of bug(), so we don't need aros/debug.h */
28 void GPUSysTimerHandler(unsigned int timerno
, void *unused1
)
32 DIRQ(bug("[KRN] GPUSysTimerHandler(%d)\n", timerno
));
34 /* Aknowledge our timer interrupt */
35 cs
= *((volatile unsigned int *)(SYSTIMER_CS
));
36 cs
&= ~ (1 << timerno
);
37 *((volatile unsigned int *)(SYSTIMER_CS
)) = cs
;
39 /* Signal the Exec VBlankServer */
40 if (SysBase
&& (SysBase
->IDNestCnt
< 0)) {
41 core_Cause(INTB_VERTB
, 1L << INTB_VERTB
);
44 /* Refresh our timer interrupt */
45 stc
= *((volatile unsigned int *)(SYSTIMER_CLO
));
46 stc
+= VBLANK_INTERVAL
;
47 *((volatile unsigned int *)(SYSTIMER_CS
)) = cs
| (1 << timerno
);
48 *((volatile unsigned int *)(SYSTIMER_C0
+ (timerno
* 4))) = stc
;
50 DIRQ(bug("[KRN] GPUSysTimerHandler: Done..\n"));
53 void *KrnAddSysTimerHandler(struct KernelBase
*KernelBase
)
55 struct IntrNode
*GPUSysTimerHandle
;
58 D(bug("[KRN] KrnAddSysTimerHandler(%012p)\n", KernelBase
));
60 if ((GPUSysTimerHandle
= AllocMem(sizeof(struct IntrNode
), MEMF_PUBLIC
|MEMF_CLEAR
)) != NULL
)
62 D(bug("[KRN] KrnAddSysTimerHandler: IntrNode @ 0x%p:\n", GPUSysTimerHandle
));
63 D(bug("[KRN] KrnAddSysTimerHandler: Using GPUTimer %d for VBlank\n", VBLANK_TIMER
));
65 GPUSysTimerHandle
->in_Handler
= GPUSysTimerHandler
;
66 GPUSysTimerHandle
->in_HandlerData
= VBLANK_TIMER
;
67 GPUSysTimerHandle
->in_HandlerData2
= KernelBase
;
68 GPUSysTimerHandle
->in_type
= it_interrupt
;
69 GPUSysTimerHandle
->in_nr
= IRQ_TIMER0
+ VBLANK_TIMER
;
71 ADDHEAD(&KernelBase
->kb_Interrupts
[IRQ_TIMER0
+ VBLANK_TIMER
], &GPUSysTimerHandle
->in_Node
);
73 D(bug("[KRN] KrnAddSysTimerHandler: Enabling Hardware IRQ.. \n"));
75 stc
= *((volatile unsigned int *)(SYSTIMER_CLO
));
76 stc
+= VBLANK_INTERVAL
;
77 *((volatile unsigned int *)(SYSTIMER_CS
)) = (1 << VBLANK_TIMER
);
78 *((volatile unsigned int *)(SYSTIMER_C0
+ (VBLANK_TIMER
* 4))) = stc
;
80 ictl_enable_irq(IRQ_TIMER0
+ VBLANK_TIMER
, KernelBase
);
83 D(bug("[KRN] KrnAddSysTimerHandler: Done.. \n"));
85 return GPUSysTimerHandle
;