Sorting source tree a bit
[tpg/acess2.git] / KernelLand / Modules / armv7 / GIC / gic.c
1 /*
2  * ARMv7 GIC Support
3  * - By John Hodge (thePowersGang)
4  * 
5  * gic.c
6  * - GIC Core
7  */
8 #define DEBUG   1
9
10 #include <acess.h>
11 #include <modules.h>
12 #include "gic.h"
13 #include <options.h>
14
15 #define N_IRQS  1024
16
17 // === IMPORTS ===
18 extern void     *gpIRQHandler;
19
20 // === TYPES ===
21 typedef void (*tIRQ_Handler)(int, void*);
22
23 // === PROTOTYPES ===
24  int    GIC_Install(char **Arguments);
25 void    GIC_IRQHandler(void);
26
27 // === GLOBALS ===
28 MODULE_DEFINE(0, 0x100, armv7_GIC, GIC_Install, NULL, NULL);
29 Uint32  *gpGIC_DistributorBase;
30 Uint32  *gpGIC_InterfaceBase;
31 tPAddr  gGIC_DistributorAddr;
32 tPAddr  gGIC_InterfaceAddr;
33 tIRQ_Handler    gaIRQ_Handlers[N_IRQS];
34 void    *gaIRQ_HandlerData[N_IRQS];
35
36 // === CODE ===
37 int GIC_Install(char **Arguments)
38 {
39         // Realview PB
40         gGIC_InterfaceAddr   = 0x1e000000;
41         gGIC_DistributorAddr = 0x1e001000;
42
43         // Initialise
44         gpGIC_InterfaceBase = (void*)MM_MapHWPages(gGIC_InterfaceAddr, 1);
45         LOG("gpGIC_InterfaceBase = %p", gpGIC_InterfaceBase);
46         gpGIC_DistributorBase = (void*)MM_MapHWPages(gGIC_DistributorAddr, 1);
47         LOG("gpGIC_DistributorBase = %p", gpGIC_DistributorBase);
48
49         gpGIC_InterfaceBase[GICC_PMR] = 0xFF;   
50         gpGIC_InterfaceBase[GICC_CTLR] = 1;     // Enable CPU
51         gpGIC_DistributorBase[GICD_CTLR] = 1;   // Enable Distributor
52
53         gpIRQHandler = GIC_IRQHandler;
54
55         __asm__ __volatile__ ("cpsie if");      // Enable IRQs and FIQs
56
57         return MODULE_ERR_OK;
58 }
59
60 void GIC_IRQHandler(void)
61 {
62         Uint32  num = gpGIC_InterfaceBase[GICC_IAR];
63 //      Log_Debug("GIC", "IRQ 0x%x", num);
64         gaIRQ_Handlers[num]( num, gaIRQ_HandlerData[num] );
65         gpGIC_InterfaceBase[GICC_EOIR] = num;
66 }
67
68 int IRQ_AddHandler(int IRQ, tIRQ_Handler Handler, void *Ptr)
69 {
70         if( IRQ < 0 || IRQ >= N_IRQS-32 ) {
71                 return 1;
72         }
73         
74         LOG("IRQ = %i", IRQ);
75         IRQ += 32;      // 32 internal IRQs
76         LOG("IRQ = %i (after adjust)", IRQ);
77         LOG("mask = 0x%x", 1 << (IRQ & (31-1)));
78         gpGIC_DistributorBase[GICD_ISENABLER0+IRQ/32] = 1 << (IRQ & (32-1));
79         ((Uint8*)&gpGIC_DistributorBase[GICD_ITARGETSR0])[IRQ] = 1;
80         
81 //      Log_Warning("GIC", "TODO: Implement IRQ_AddHandler");
82         
83         if( gaIRQ_Handlers[IRQ] )
84                 return 2;
85         
86         gaIRQ_Handlers[IRQ] = Handler;
87         gaIRQ_HandlerData[IRQ] = Ptr;
88         
89         return 0;
90 }
91

UCC git Repository :: git.ucc.asn.au