Support dynamic ARM_PERIIOBASE as requred by rpi2
[AROS.git] / arch / arm-raspi / kernel / kernel_systimer.c
blobfe5694a3d2b9d4940650e04d8f9c3c122f7cfbd3
1 /*
2 Copyright � 2013, The AROS Development Team. All rights reserved.
3 $Id$
4 */
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"
20 #undef ARM_PERIIOBASE
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 */
25 #define DIRQ(x)
26 #define D(x)
28 void GPUSysTimerHandler(unsigned int timerno, void *unused1)
30 unsigned int stc, cs;
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;
56 unsigned int stc;
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;