1 |
1632 |
jcastillo |
#include <linux/config.h> /* CONFIG_ALPHA_SRM_SETUP */
|
2 |
|
|
#ifndef __ALPHA_LCA__H__
|
3 |
|
|
#define __ALPHA_LCA__H__
|
4 |
|
|
|
5 |
|
|
/*
|
6 |
|
|
* Low Cost Alpha (LCA) definitions (these apply to 21066 and 21068,
|
7 |
|
|
* for example).
|
8 |
|
|
*
|
9 |
|
|
* This file is based on:
|
10 |
|
|
*
|
11 |
|
|
* DECchip 21066 and DECchip 21068 Alpha AXP Microprocessors
|
12 |
|
|
* Hardware Reference Manual; Digital Equipment Corp.; May 1994;
|
13 |
|
|
* Maynard, MA; Order Number: EC-N2681-71.
|
14 |
|
|
*/
|
15 |
|
|
|
16 |
|
|
/*
|
17 |
|
|
* NOTE: The LCA uses a Host Address Extension (HAE) register to access
|
18 |
|
|
* PCI addresses that are beyond the first 27 bits of address
|
19 |
|
|
* space. Updating the HAE requires an external cycle (and
|
20 |
|
|
* a memory barrier), which tends to be slow. Instead of updating
|
21 |
|
|
* it on each sparse memory access, we keep the current HAE value
|
22 |
|
|
* cached in variable cache_hae. Only if the cached HAE differs
|
23 |
|
|
* from the desired HAE value do we actually updated HAE register.
|
24 |
|
|
* The HAE register is preserved by the interrupt handler entry/exit
|
25 |
|
|
* code, so this scheme works even in the presence of interrupts.
|
26 |
|
|
*
|
27 |
|
|
* Dense memory space doesn't require the HAE, but is restricted to
|
28 |
|
|
* aligned 32 and 64 bit accesses. Special Cycle and Interrupt
|
29 |
|
|
* Acknowledge cycles may also require the use of the HAE. The LCA
|
30 |
|
|
* limits I/O address space to the bottom 24 bits of address space,
|
31 |
|
|
* but this easily covers the 16 bit ISA I/O address space.
|
32 |
|
|
*/
|
33 |
|
|
|
34 |
|
|
/*
|
35 |
|
|
* NOTE 2! The memory operations do not set any memory barriers, as
|
36 |
|
|
* it's not needed for cases like a frame buffer that is essentially
|
37 |
|
|
* memory-like. You need to do them by hand if the operations depend
|
38 |
|
|
* on ordering.
|
39 |
|
|
*
|
40 |
|
|
* Similarly, the port I/O operations do a "mb" only after a write
|
41 |
|
|
* operation: if an mb is needed before (as in the case of doing
|
42 |
|
|
* memory mapped I/O first, and then a port I/O operation to the same
|
43 |
|
|
* device), it needs to be done by hand.
|
44 |
|
|
*
|
45 |
|
|
* After the above has bitten me 100 times, I'll give up and just do
|
46 |
|
|
* the mb all the time, but right now I'm hoping this will work out.
|
47 |
|
|
* Avoiding mb's may potentially be a noticeable speed improvement,
|
48 |
|
|
* but I can't honestly say I've tested it.
|
49 |
|
|
*
|
50 |
|
|
* Handling interrupts that need to do mb's to synchronize to
|
51 |
|
|
* non-interrupts is another fun race area. Don't do it (because if
|
52 |
|
|
* you do, I'll have to do *everything* with interrupts disabled,
|
53 |
|
|
* ugh).
|
54 |
|
|
*/
|
55 |
|
|
|
56 |
|
|
#include <asm/system.h>
|
57 |
|
|
|
58 |
|
|
#ifdef CONFIG_ALPHA_SRM_SETUP
|
59 |
|
|
/* if we are using the SRM PCI setup, we'll need to use variables instead */
|
60 |
|
|
#define LCA_DMA_WIN_BASE_DEFAULT (1024*1024*1024)
|
61 |
|
|
#define LCA_DMA_WIN_SIZE_DEFAULT (1024*1024*1024)
|
62 |
|
|
|
63 |
|
|
extern unsigned int LCA_DMA_WIN_BASE;
|
64 |
|
|
extern unsigned int LCA_DMA_WIN_SIZE;
|
65 |
|
|
|
66 |
|
|
#else /* SRM_SETUP */
|
67 |
|
|
#define LCA_DMA_WIN_BASE (1024*1024*1024)
|
68 |
|
|
#define LCA_DMA_WIN_SIZE (1024*1024*1024)
|
69 |
|
|
#endif /* SRM_SETUP */
|
70 |
|
|
|
71 |
|
|
/*
|
72 |
|
|
* Memory Controller registers:
|
73 |
|
|
*/
|
74 |
|
|
#define LCA_MEM_BCR0 (IDENT_ADDR + 0x120000000UL)
|
75 |
|
|
#define LCA_MEM_BCR1 (IDENT_ADDR + 0x120000008UL)
|
76 |
|
|
#define LCA_MEM_BCR2 (IDENT_ADDR + 0x120000010UL)
|
77 |
|
|
#define LCA_MEM_BCR3 (IDENT_ADDR + 0x120000018UL)
|
78 |
|
|
#define LCA_MEM_BMR0 (IDENT_ADDR + 0x120000020UL)
|
79 |
|
|
#define LCA_MEM_BMR1 (IDENT_ADDR + 0x120000028UL)
|
80 |
|
|
#define LCA_MEM_BMR2 (IDENT_ADDR + 0x120000030UL)
|
81 |
|
|
#define LCA_MEM_BMR3 (IDENT_ADDR + 0x120000038UL)
|
82 |
|
|
#define LCA_MEM_BTR0 (IDENT_ADDR + 0x120000040UL)
|
83 |
|
|
#define LCA_MEM_BTR1 (IDENT_ADDR + 0x120000048UL)
|
84 |
|
|
#define LCA_MEM_BTR2 (IDENT_ADDR + 0x120000050UL)
|
85 |
|
|
#define LCA_MEM_BTR3 (IDENT_ADDR + 0x120000058UL)
|
86 |
|
|
#define LCA_MEM_GTR (IDENT_ADDR + 0x120000060UL)
|
87 |
|
|
#define LCA_MEM_ESR (IDENT_ADDR + 0x120000068UL)
|
88 |
|
|
#define LCA_MEM_EAR (IDENT_ADDR + 0x120000070UL)
|
89 |
|
|
#define LCA_MEM_CAR (IDENT_ADDR + 0x120000078UL)
|
90 |
|
|
#define LCA_MEM_VGR (IDENT_ADDR + 0x120000080UL)
|
91 |
|
|
#define LCA_MEM_PLM (IDENT_ADDR + 0x120000088UL)
|
92 |
|
|
#define LCA_MEM_FOR (IDENT_ADDR + 0x120000090UL)
|
93 |
|
|
|
94 |
|
|
/*
|
95 |
|
|
* I/O Controller registers:
|
96 |
|
|
*/
|
97 |
|
|
#define LCA_IOC_HAE (IDENT_ADDR + 0x180000000UL)
|
98 |
|
|
#define LCA_IOC_CONF (IDENT_ADDR + 0x180000020UL)
|
99 |
|
|
#define LCA_IOC_STAT0 (IDENT_ADDR + 0x180000040UL)
|
100 |
|
|
#define LCA_IOC_STAT1 (IDENT_ADDR + 0x180000060UL)
|
101 |
|
|
#define LCA_IOC_TBIA (IDENT_ADDR + 0x180000080UL)
|
102 |
|
|
#define LCA_IOC_TB_ENA (IDENT_ADDR + 0x1800000a0UL)
|
103 |
|
|
#define LCA_IOC_SFT_RST (IDENT_ADDR + 0x1800000c0UL)
|
104 |
|
|
#define LCA_IOC_PAR_DIS (IDENT_ADDR + 0x1800000e0UL)
|
105 |
|
|
#define LCA_IOC_W_BASE0 (IDENT_ADDR + 0x180000100UL)
|
106 |
|
|
#define LCA_IOC_W_BASE1 (IDENT_ADDR + 0x180000120UL)
|
107 |
|
|
#define LCA_IOC_W_MASK0 (IDENT_ADDR + 0x180000140UL)
|
108 |
|
|
#define LCA_IOC_W_MASK1 (IDENT_ADDR + 0x180000160UL)
|
109 |
|
|
#define LCA_IOC_T_BASE0 (IDENT_ADDR + 0x180000180UL)
|
110 |
|
|
#define LCA_IOC_T_BASE1 (IDENT_ADDR + 0x1800001a0UL)
|
111 |
|
|
#define LCA_IOC_TB_TAG0 (IDENT_ADDR + 0x188000000UL)
|
112 |
|
|
#define LCA_IOC_TB_TAG1 (IDENT_ADDR + 0x188000020UL)
|
113 |
|
|
#define LCA_IOC_TB_TAG2 (IDENT_ADDR + 0x188000040UL)
|
114 |
|
|
#define LCA_IOC_TB_TAG3 (IDENT_ADDR + 0x188000060UL)
|
115 |
|
|
#define LCA_IOC_TB_TAG4 (IDENT_ADDR + 0x188000070UL)
|
116 |
|
|
#define LCA_IOC_TB_TAG5 (IDENT_ADDR + 0x1880000a0UL)
|
117 |
|
|
#define LCA_IOC_TB_TAG6 (IDENT_ADDR + 0x1880000c0UL)
|
118 |
|
|
#define LCA_IOC_TB_TAG7 (IDENT_ADDR + 0x1880000e0UL)
|
119 |
|
|
|
120 |
|
|
/*
|
121 |
|
|
* Memory spaces:
|
122 |
|
|
*/
|
123 |
|
|
#define LCA_IACK_SC (IDENT_ADDR + 0x1a0000000UL)
|
124 |
|
|
#define LCA_CONF (IDENT_ADDR + 0x1e0000000UL)
|
125 |
|
|
#define LCA_IO (IDENT_ADDR + 0x1c0000000UL)
|
126 |
|
|
#define LCA_SPARSE_MEM (IDENT_ADDR + 0x200000000UL)
|
127 |
|
|
#define LCA_DENSE_MEM (IDENT_ADDR + 0x300000000UL)
|
128 |
|
|
|
129 |
|
|
/*
|
130 |
|
|
* Bit definitions for I/O Controller status register 0:
|
131 |
|
|
*/
|
132 |
|
|
#define LCA_IOC_STAT0_CMD 0xf
|
133 |
|
|
#define LCA_IOC_STAT0_ERR (1<<4)
|
134 |
|
|
#define LCA_IOC_STAT0_LOST (1<<5)
|
135 |
|
|
#define LCA_IOC_STAT0_THIT (1<<6)
|
136 |
|
|
#define LCA_IOC_STAT0_TREF (1<<7)
|
137 |
|
|
#define LCA_IOC_STAT0_CODE_SHIFT 8
|
138 |
|
|
#define LCA_IOC_STAT0_CODE_MASK 0x7
|
139 |
|
|
#define LCA_IOC_STAT0_P_NBR_SHIFT 13
|
140 |
|
|
#define LCA_IOC_STAT0_P_NBR_MASK 0x7ffff
|
141 |
|
|
|
142 |
|
|
#define HAE_ADDRESS LCA_IOC_HAE
|
143 |
|
|
|
144 |
|
|
/* LCA PMR Power Management register defines */
|
145 |
|
|
#define LCA_PMR_ADDR (IDENT_ADDR + 0x120000098UL)
|
146 |
|
|
#define LCA_PMR_PDIV 0x7 /* Primary clock divisor */
|
147 |
|
|
#define LCA_PMR_ODIV 0x38 /* Override clock divisor */
|
148 |
|
|
#define LCA_PMR_INTO 0x40 /* Interrupt override */
|
149 |
|
|
#define LCA_PMR_DMAO 0x80 /* DMA override */
|
150 |
|
|
#define LCA_PMR_OCCEB 0xffff0000L /* Override cycle counter - even
|
151 |
|
|
bits */
|
152 |
|
|
#define LCA_PMR_OCCOB 0xffff000000000000L /* Override cycle counter - even
|
153 |
|
|
bits */
|
154 |
|
|
#define LCA_PMR_PRIMARY_MASK 0xfffffffffffffff8
|
155 |
|
|
/* LCA PMR Macros */
|
156 |
|
|
|
157 |
|
|
#define READ_PMR (*(volatile unsigned long *)LCA_PMR_ADDR)
|
158 |
|
|
#define WRITE_PMR(d) (*((volatile unsigned long *)LCA_PMR_ADDR) = (d))
|
159 |
|
|
|
160 |
|
|
#define GET_PRIMARY(r) ((r) & LCA_PMR_PDIV)
|
161 |
|
|
#define GET_OVERRIDE(r) (((r) >> 3) & LCA_PMR_PDIV)
|
162 |
|
|
#define SET_PRIMARY_CLOCK(r, c) ((r) = (((r) & LCA_PMR_PRIMARY_MASK) | (c)))
|
163 |
|
|
|
164 |
|
|
/* LCA PMR Divisor values */
|
165 |
|
|
#define DIV_1 0x0
|
166 |
|
|
#define DIV_1_5 0x1
|
167 |
|
|
#define DIV_2 0x2
|
168 |
|
|
#define DIV_4 0x3
|
169 |
|
|
#define DIV_8 0x4
|
170 |
|
|
#define DIV_16 0x5
|
171 |
|
|
#define DIV_MIN DIV_1
|
172 |
|
|
#define DIV_MAX DIV_16
|
173 |
|
|
|
174 |
|
|
|
175 |
|
|
#ifdef __KERNEL__
|
176 |
|
|
|
177 |
|
|
/*
|
178 |
|
|
* Translate physical memory address as seen on (PCI) bus into
|
179 |
|
|
* a kernel virtual address and vv.
|
180 |
|
|
*/
|
181 |
|
|
extern inline unsigned long virt_to_bus(void * address)
|
182 |
|
|
{
|
183 |
|
|
return virt_to_phys(address) + LCA_DMA_WIN_BASE;
|
184 |
|
|
}
|
185 |
|
|
|
186 |
|
|
extern inline void * bus_to_virt(unsigned long address)
|
187 |
|
|
{
|
188 |
|
|
/*
|
189 |
|
|
* This check is a sanity check but also ensures that bus
|
190 |
|
|
* address 0 maps to virtual address 0 which is useful to
|
191 |
|
|
* detect null "pointers" (the NCR driver is much simpler if
|
192 |
|
|
* NULL pointers are preserved).
|
193 |
|
|
*/
|
194 |
|
|
if (address < LCA_DMA_WIN_BASE)
|
195 |
|
|
return 0;
|
196 |
|
|
return phys_to_virt(address - LCA_DMA_WIN_BASE);
|
197 |
|
|
}
|
198 |
|
|
|
199 |
|
|
/*
|
200 |
|
|
* I/O functions:
|
201 |
|
|
*
|
202 |
|
|
* Unlike Jensen, the Noname machines have no concept of local
|
203 |
|
|
* I/O---everything goes over the PCI bus.
|
204 |
|
|
*
|
205 |
|
|
* There is plenty room for optimization here. In particular,
|
206 |
|
|
* the Alpha's insb/insw/extb/extw should be useful in moving
|
207 |
|
|
* data to/from the right byte-lanes.
|
208 |
|
|
*/
|
209 |
|
|
|
210 |
|
|
#define vuip volatile unsigned int *
|
211 |
|
|
|
212 |
|
|
extern inline unsigned int __inb(unsigned long addr)
|
213 |
|
|
{
|
214 |
|
|
long result = *(vuip) ((addr << 5) + LCA_IO + 0x00);
|
215 |
|
|
result >>= (addr & 3) * 8;
|
216 |
|
|
return 0xffUL & result;
|
217 |
|
|
}
|
218 |
|
|
|
219 |
|
|
extern inline void __outb(unsigned char b, unsigned long addr)
|
220 |
|
|
{
|
221 |
|
|
unsigned int w;
|
222 |
|
|
|
223 |
|
|
asm ("insbl %2,%1,%0" : "r="(w) : "ri"(addr & 0x3), "r"(b));
|
224 |
|
|
*(vuip) ((addr << 5) + LCA_IO + 0x00) = w;
|
225 |
|
|
mb();
|
226 |
|
|
}
|
227 |
|
|
|
228 |
|
|
extern inline unsigned int __inw(unsigned long addr)
|
229 |
|
|
{
|
230 |
|
|
long result = *(vuip) ((addr << 5) + LCA_IO + 0x08);
|
231 |
|
|
result >>= (addr & 3) * 8;
|
232 |
|
|
return 0xffffUL & result;
|
233 |
|
|
}
|
234 |
|
|
|
235 |
|
|
extern inline void __outw(unsigned short b, unsigned long addr)
|
236 |
|
|
{
|
237 |
|
|
unsigned int w;
|
238 |
|
|
|
239 |
|
|
asm ("inswl %2,%1,%0" : "r="(w) : "ri"(addr & 0x3), "r"(b));
|
240 |
|
|
*(vuip) ((addr << 5) + LCA_IO + 0x08) = w;
|
241 |
|
|
mb();
|
242 |
|
|
}
|
243 |
|
|
|
244 |
|
|
extern inline unsigned int __inl(unsigned long addr)
|
245 |
|
|
{
|
246 |
|
|
return *(vuip) ((addr << 5) + LCA_IO + 0x18);
|
247 |
|
|
}
|
248 |
|
|
|
249 |
|
|
extern inline void __outl(unsigned int b, unsigned long addr)
|
250 |
|
|
{
|
251 |
|
|
*(vuip) ((addr << 5) + LCA_IO + 0x18) = b;
|
252 |
|
|
mb();
|
253 |
|
|
}
|
254 |
|
|
|
255 |
|
|
|
256 |
|
|
/*
|
257 |
|
|
* Memory functions. 64-bit and 32-bit accesses are done through
|
258 |
|
|
* dense memory space, everything else through sparse space.
|
259 |
|
|
*/
|
260 |
|
|
extern inline unsigned long __readb(unsigned long addr)
|
261 |
|
|
{
|
262 |
|
|
unsigned long result, shift, msb;
|
263 |
|
|
|
264 |
|
|
shift = (addr & 0x3) * 8;
|
265 |
|
|
if (addr >= (1UL << 24)) {
|
266 |
|
|
msb = addr & 0xf8000000;
|
267 |
|
|
addr -= msb;
|
268 |
|
|
if (msb != hae.cache) {
|
269 |
|
|
set_hae(msb);
|
270 |
|
|
}
|
271 |
|
|
}
|
272 |
|
|
result = *(vuip) ((addr << 5) + LCA_SPARSE_MEM + 0x00);
|
273 |
|
|
result >>= shift;
|
274 |
|
|
return 0xffUL & result;
|
275 |
|
|
}
|
276 |
|
|
|
277 |
|
|
extern inline unsigned long __readw(unsigned long addr)
|
278 |
|
|
{
|
279 |
|
|
unsigned long result, shift, msb;
|
280 |
|
|
|
281 |
|
|
shift = (addr & 0x3) * 8;
|
282 |
|
|
if (addr >= (1UL << 24)) {
|
283 |
|
|
msb = addr & 0xf8000000;
|
284 |
|
|
addr -= msb;
|
285 |
|
|
if (msb != hae.cache) {
|
286 |
|
|
set_hae(msb);
|
287 |
|
|
}
|
288 |
|
|
}
|
289 |
|
|
result = *(vuip) ((addr << 5) + LCA_SPARSE_MEM + 0x08);
|
290 |
|
|
result >>= shift;
|
291 |
|
|
return 0xffffUL & result;
|
292 |
|
|
}
|
293 |
|
|
|
294 |
|
|
extern inline unsigned long __readl(unsigned long addr)
|
295 |
|
|
{
|
296 |
|
|
return *(vuip) (addr + LCA_DENSE_MEM);
|
297 |
|
|
}
|
298 |
|
|
|
299 |
|
|
extern inline void __writeb(unsigned char b, unsigned long addr)
|
300 |
|
|
{
|
301 |
|
|
unsigned long msb;
|
302 |
|
|
unsigned int w;
|
303 |
|
|
|
304 |
|
|
if (addr >= (1UL << 24)) {
|
305 |
|
|
msb = addr & 0xf8000000;
|
306 |
|
|
addr -= msb;
|
307 |
|
|
if (msb != hae.cache) {
|
308 |
|
|
set_hae(msb);
|
309 |
|
|
}
|
310 |
|
|
}
|
311 |
|
|
asm ("insbl %2,%1,%0" : "r="(w) : "ri"(addr & 0x3), "r"(b));
|
312 |
|
|
*(vuip) ((addr << 5) + LCA_SPARSE_MEM + 0x00) = w;
|
313 |
|
|
}
|
314 |
|
|
|
315 |
|
|
extern inline void __writew(unsigned short b, unsigned long addr)
|
316 |
|
|
{
|
317 |
|
|
unsigned long msb;
|
318 |
|
|
unsigned int w;
|
319 |
|
|
|
320 |
|
|
if (addr >= (1UL << 24)) {
|
321 |
|
|
msb = addr & 0xf8000000;
|
322 |
|
|
addr -= msb;
|
323 |
|
|
if (msb != hae.cache) {
|
324 |
|
|
set_hae(msb);
|
325 |
|
|
}
|
326 |
|
|
}
|
327 |
|
|
asm ("inswl %2,%1,%0" : "r="(w) : "ri"(addr & 0x3), "r"(b));
|
328 |
|
|
*(vuip) ((addr << 5) + LCA_SPARSE_MEM + 0x08) = w;
|
329 |
|
|
}
|
330 |
|
|
|
331 |
|
|
extern inline void __writel(unsigned int b, unsigned long addr)
|
332 |
|
|
{
|
333 |
|
|
*(vuip) (addr + LCA_DENSE_MEM) = b;
|
334 |
|
|
}
|
335 |
|
|
|
336 |
|
|
/*
|
337 |
|
|
* Most of the above have so much overhead that it probably doesn't
|
338 |
|
|
* make sense to have them inlined (better icache behavior).
|
339 |
|
|
*/
|
340 |
|
|
|
341 |
|
|
#define inb(port) \
|
342 |
|
|
(__builtin_constant_p((port))?__inb(port):_inb(port))
|
343 |
|
|
|
344 |
|
|
#define outb(x, port) \
|
345 |
|
|
(__builtin_constant_p((port))?__outb((x),(port)):_outb((x),(port)))
|
346 |
|
|
|
347 |
|
|
#define readl(a) __readl((unsigned long)(a))
|
348 |
|
|
#define writel(v,a) __writel((v),(unsigned long)(a))
|
349 |
|
|
|
350 |
|
|
#undef vuip
|
351 |
|
|
|
352 |
|
|
extern unsigned long lca_init (unsigned long mem_start, unsigned long mem_end);
|
353 |
|
|
|
354 |
|
|
#endif /* __KERNEL__ */
|
355 |
|
|
|
356 |
|
|
/*
|
357 |
|
|
* Data structure for handling LCA machine checks. Correctable errors
|
358 |
|
|
* result in a short logout frame, uncorrectable ones in a long one.
|
359 |
|
|
*/
|
360 |
|
|
struct el_lca_mcheck_short {
|
361 |
|
|
struct el_common h; /* common logout header */
|
362 |
|
|
unsigned long esr; /* error-status register */
|
363 |
|
|
unsigned long ear; /* error-address register */
|
364 |
|
|
unsigned long dc_stat; /* dcache status register */
|
365 |
|
|
unsigned long ioc_stat0; /* I/O controller status register 0 */
|
366 |
|
|
unsigned long ioc_stat1; /* I/O controller status register 1 */
|
367 |
|
|
};
|
368 |
|
|
|
369 |
|
|
struct el_lca_mcheck_long {
|
370 |
|
|
struct el_common h; /* common logout header */
|
371 |
|
|
unsigned long pt[31]; /* PAL temps */
|
372 |
|
|
unsigned long exc_addr; /* exception address */
|
373 |
|
|
unsigned long pad1[3];
|
374 |
|
|
unsigned long pal_base; /* PALcode base address */
|
375 |
|
|
unsigned long hier; /* hw interrupt enable */
|
376 |
|
|
unsigned long hirr; /* hw interrupt request */
|
377 |
|
|
unsigned long mm_csr; /* MMU control & status */
|
378 |
|
|
unsigned long dc_stat; /* data cache status */
|
379 |
|
|
unsigned long dc_addr; /* data cache addr register */
|
380 |
|
|
unsigned long abox_ctl; /* address box control register */
|
381 |
|
|
unsigned long esr; /* error status register */
|
382 |
|
|
unsigned long ear; /* error address register */
|
383 |
|
|
unsigned long car; /* cache control register */
|
384 |
|
|
unsigned long ioc_stat0; /* I/O controller status register 0 */
|
385 |
|
|
unsigned long ioc_stat1; /* I/O controller status register 1 */
|
386 |
|
|
unsigned long va; /* virtual address register */
|
387 |
|
|
};
|
388 |
|
|
|
389 |
|
|
union el_lca {
|
390 |
|
|
struct el_common * c;
|
391 |
|
|
struct el_lca_mcheck_long * l;
|
392 |
|
|
struct el_lca_mcheck_short * s;
|
393 |
|
|
};
|
394 |
|
|
|
395 |
|
|
#define RTC_PORT(x) (0x70 + (x))
|
396 |
|
|
#define RTC_ADDR(x) (0x80 | (x))
|
397 |
|
|
#define RTC_ALWAYS_BCD 0
|
398 |
|
|
|
399 |
|
|
#endif /* __ALPHA_LCA__H__ */
|