Subversion Repositories shark

Rev

Rev 312 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
1063 tullio 1
 
2
/*
3
 * This program is free software; you can redistribute it and/or modify
4
 * it under the terms of the GNU General Public License as published by
5
 * the Free Software Foundation; either version 2 of the License, or
6
 * (at your option) any later version.
7
 *
8
 * This program is distributed in the hope that it will be useful,
9
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11
 * GNU General Public License for more details.
12
 *
13
 * You should have received a copy of the GNU General Public License
14
 * along with this program; if not, write to the Free Software
15
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16
 *
17
 */
18
 
299 giacomo 19
#ifndef __APIC_H__
20
#define __APIC_H__
21
 
22
#define         APIC_DEFAULT_PHYS_BASE  0xfee00000
23
 
24
#define         APIC_ID         0x20
25
#define                 APIC_ID_MASK            (0x0F<<24)
26
#define                 GET_APIC_ID(x)          (((x)>>24)&0x0F)
27
#define         APIC_LVR        0x30
28
#define                 APIC_LVR_MASK           0xFF00FF
29
#define                 GET_APIC_VERSION(x)     ((x)&0xFF)
30
#define                 GET_APIC_MAXLVT(x)      (((x)>>16)&0xFF)
31
#define                 APIC_INTEGRATED(x)      ((x)&0xF0)
32
#define         APIC_TASKPRI    0x80
33
#define                 APIC_TPRI_MASK          0xFF
34
#define         APIC_ARBPRI     0x90
35
#define                 APIC_ARBPRI_MASK        0xFF
36
#define         APIC_PROCPRI    0xA0
37
#define         APIC_EOI        0xB0
38
#define                 APIC_EIO_ACK            0x0             /* Write this to the EOI register */
39
#define         APIC_RRR        0xC0
40
#define         APIC_LDR        0xD0
41
#define                 APIC_LDR_MASK           (0xFF<<24)
42
#define                 GET_APIC_LOGICAL_ID(x)  (((x)>>24)&0xFF)
43
#define                 SET_APIC_LOGICAL_ID(x)  (((x)<<24))
44
#define                 APIC_ALL_CPUS           0xFF
45
#define         APIC_DFR        0xE0
46
#define                 APIC_DFR_CLUSTER        0x0FFFFFFFul    /* Clustered */
47
#define                 APIC_DFR_FLAT           0xFFFFFFFFul    /* Flat mode */
48
#define         APIC_SPIV       0xF0
49
#define                 APIC_SPIV_FOCUS_DISABLED        (1<<9)
50
#define                 APIC_SPIV_APIC_ENABLED          (1<<8)
51
#define         APIC_ISR        0x100
52
#define         APIC_TMR        0x180
53
#define         APIC_IRR        0x200
54
#define         APIC_ESR        0x280
55
#define                 APIC_ESR_SEND_CS        0x00001
56
#define                 APIC_ESR_RECV_CS        0x00002
57
#define                 APIC_ESR_SEND_ACC       0x00004
58
#define                 APIC_ESR_RECV_ACC       0x00008
59
#define                 APIC_ESR_SENDILL        0x00020
60
#define                 APIC_ESR_RECVILL        0x00040
61
#define                 APIC_ESR_ILLREGA        0x00080
62
#define         APIC_ICR        0x300
63
#define                 APIC_DEST_SELF          0x40000
64
#define                 APIC_DEST_ALLINC        0x80000
65
#define                 APIC_DEST_ALLBUT        0xC0000
66
#define                 APIC_ICR_RR_MASK        0x30000
67
#define                 APIC_ICR_RR_INVALID     0x00000
68
#define                 APIC_ICR_RR_INPROG      0x10000
69
#define                 APIC_ICR_RR_VALID       0x20000
70
#define                 APIC_INT_LEVELTRIG      0x08000
71
#define                 APIC_INT_ASSERT         0x04000
72
#define                 APIC_ICR_BUSY           0x01000
73
#define                 APIC_DEST_PHYSICAL      0x00000
74
#define                 APIC_DEST_LOGICAL       0x00800
75
#define                 APIC_DM_FIXED           0x00000
76
#define                 APIC_DM_LOWEST          0x00100
77
#define                 APIC_DM_SMI             0x00200
78
#define                 APIC_DM_REMRD           0x00300
79
#define                 APIC_DM_NMI             0x00400
80
#define                 APIC_DM_INIT            0x00500
81
#define                 APIC_DM_STARTUP         0x00600
82
#define                 APIC_DM_EXTINT          0x00700
83
#define                 APIC_VECTOR_MASK        0x000FF
84
#define         APIC_ICR2       0x310
85
#define                 GET_APIC_DEST_FIELD(x)  (((x)>>24)&0xFF)
86
#define                 SET_APIC_DEST_FIELD(x)  ((x)<<24)
87
#define         APIC_LVTT       0x320
88
#define         APIC_LVTPC      0x340
89
#define         APIC_LVT0       0x350
90
#define                 APIC_LVT_TIMER_BASE_MASK        (0x3<<18)
91
#define                 GET_APIC_TIMER_BASE(x)          (((x)>>18)&0x3)
92
#define                 SET_APIC_TIMER_BASE(x)          (((x)<<18))
93
#define                 APIC_TIMER_BASE_CLKIN           0x0
94
#define                 APIC_TIMER_BASE_TMBASE          0x1
95
#define                 APIC_TIMER_BASE_DIV             0x2
96
#define                 APIC_LVT_TIMER_PERIODIC         (1<<17)
97
#define                 APIC_LVT_MASKED                 (1<<16)
98
#define                 APIC_LVT_LEVEL_TRIGGER          (1<<15)
99
#define                 APIC_LVT_REMOTE_IRR             (1<<14)
100
#define                 APIC_INPUT_POLARITY             (1<<13)
101
#define                 APIC_SEND_PENDING               (1<<12)
102
#define                 GET_APIC_DELIVERY_MODE(x)       (((x)>>8)&0x7)
103
#define                 SET_APIC_DELIVERY_MODE(x,y)     (((x)&~0x700)|((y)<<8))
104
#define                         APIC_MODE_FIXED         0x0
105
#define                         APIC_MODE_NMI           0x4
106
#define                         APIC_MODE_EXINT         0x7
107
#define         APIC_LVT1       0x360
108
#define         APIC_LVTERR     0x370
109
#define         APIC_TMICT      0x380
110
#define         APIC_TMCCT      0x390
111
#define         APIC_TDCR       0x3E0
112
#define                 APIC_TDR_DIV_TMBASE     (1<<2)
113
#define                 APIC_TDR_DIV_1          0xB
114
#define                 APIC_TDR_DIV_2          0x0
115
#define                 APIC_TDR_DIV_4          0x1
116
#define                 APIC_TDR_DIV_8          0x2
117
#define                 APIC_TDR_DIV_16         0x3
118
#define                 APIC_TDR_DIV_32         0x8
119
#define                 APIC_TDR_DIV_64         0x9
120
#define                 APIC_TDR_DIV_128        0xA
121
 
122
#define APIC_BASE APIC_DEFAULT_PHYS_BASE
123
 
124
#define APIC_BASE_MSR           0x1B
125
 
126
/*
127
 * Basic functions accessing APICs.
128
 */
129
 
130
static __inline__ void apic_write(unsigned long reg, unsigned long v)
131
{
132
        *((volatile unsigned long *)(APIC_BASE+reg)) = v;
133
}
134
 
135
static __inline__ unsigned long apic_read(unsigned long reg)
136
{
137
        return *((volatile unsigned long *)(APIC_BASE+reg));
138
}
139
 
140
static __inline__ void apic_wait_icr_idle(void)
141
{
142
        do { } while ( apic_read( APIC_ICR ) & APIC_ICR_BUSY );
143
}
144
 
145
#define apic_read_around(x)
146
#define apic_write_around(x,y) apic_write((x),(y))
147
 
303 giacomo 148
static __inline__ void set_APIC_timer(unsigned int clocks)
149
{
150
        extern unsigned int apic_set_limit;
151
 
152
        if (clocks < apic_set_limit) clocks = apic_set_limit;
153
 
154
        apic_write_around(APIC_TMICT, clocks);
155
}
156
 
299 giacomo 157
static __inline__ void ack_APIC_irq(void)
158
{
159
        /*
160
         * ack_APIC_irq() actually gets compiled as a single instruction:
161
         * - a single rmw on Pentium/82489DX
162
         * - a single write on P6+ cores (CONFIG_X86_GOOD_APIC)
163
         * ... yummie.
164
         */
165
 
166
        /* Docs say use 0 for future compatibility */
167
        apic_write_around(APIC_EOI, 0);
168
}
169
 
303 giacomo 170
extern void enable_APIC_timer(void);
171
extern void disable_APIC_timer (void);
299 giacomo 172
 
173
#endif