Rev 422 | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
422 | giacomo | 1 | /* |
2 | * asm-i386/acpi.h |
||
3 | * |
||
4 | * Copyright (C) 2001 Paul Diefenbaugh <paul.s.diefenbaugh@intel.com> |
||
5 | * Copyright (C) 2001 Patrick Mochel <mochel@osdl.org> |
||
6 | * |
||
7 | * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||
8 | * |
||
9 | * This program is free software; you can redistribute it and/or modify |
||
10 | * it under the terms of the GNU General Public License as published by |
||
11 | * the Free Software Foundation; either version 2 of the License, or |
||
12 | * (at your option) any later version. |
||
13 | * |
||
14 | * This program is distributed in the hope that it will be useful, |
||
15 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
||
16 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||
17 | * GNU General Public License for more details. |
||
18 | * |
||
19 | * You should have received a copy of the GNU General Public License |
||
20 | * along with this program; if not, write to the Free Software |
||
21 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
||
22 | * |
||
23 | * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||
24 | */ |
||
25 | |||
26 | #ifndef _ASM_ACPI_H |
||
27 | #define _ASM_ACPI_H |
||
28 | |||
29 | #ifdef __KERNEL__ |
||
30 | |||
31 | #define COMPILER_DEPENDENT_INT64 long long |
||
32 | #define COMPILER_DEPENDENT_UINT64 unsigned long long |
||
33 | |||
34 | /* |
||
35 | * Calling conventions: |
||
36 | * |
||
37 | * ACPI_SYSTEM_XFACE - Interfaces to host OS (handlers, threads) |
||
38 | * ACPI_EXTERNAL_XFACE - External ACPI interfaces |
||
39 | * ACPI_INTERNAL_XFACE - Internal ACPI interfaces |
||
40 | * ACPI_INTERNAL_VAR_XFACE - Internal variable-parameter list interfaces |
||
41 | */ |
||
42 | #define ACPI_SYSTEM_XFACE |
||
43 | #define ACPI_EXTERNAL_XFACE |
||
44 | #define ACPI_INTERNAL_XFACE |
||
45 | #define ACPI_INTERNAL_VAR_XFACE |
||
46 | |||
47 | /* Asm macros */ |
||
48 | |||
49 | #define ACPI_ASM_MACROS |
||
50 | #define BREAKPOINT3 |
||
51 | #define ACPI_DISABLE_IRQS() local_irq_disable() |
||
52 | #define ACPI_ENABLE_IRQS() local_irq_enable() |
||
53 | #define ACPI_FLUSH_CPU_CACHE() wbinvd() |
||
54 | |||
55 | /* |
||
56 | * A brief explanation as GNU inline assembly is a bit hairy |
||
57 | * %0 is the output parameter in EAX ("=a") |
||
58 | * %1 and %2 are the input parameters in ECX ("c") |
||
59 | * and an immediate value ("i") respectively |
||
60 | * All actual register references are preceded with "%%" as in "%%edx" |
||
61 | * Immediate values in the assembly are preceded by "$" as in "$0x1" |
||
62 | * The final asm parameter are the operation altered non-output registers. |
||
63 | */ |
||
64 | #define ACPI_ACQUIRE_GLOBAL_LOCK(GLptr, Acq) \ |
||
65 | do { \ |
||
66 | int dummy; \ |
||
67 | asm("1: movl (%1),%%eax;" \ |
||
68 | "movl %%eax,%%edx;" \ |
||
69 | "andl %2,%%edx;" \ |
||
70 | "btsl $0x1,%%edx;" \ |
||
71 | "adcl $0x0,%%edx;" \ |
||
72 | "lock; cmpxchgl %%edx,(%1);" \ |
||
73 | "jnz 1b;" \ |
||
74 | "cmpb $0x3,%%dl;" \ |
||
75 | "sbbl %%eax,%%eax" \ |
||
76 | :"=a"(Acq),"=c"(dummy):"c"(GLptr),"i"(~1L):"dx"); \ |
||
77 | } while(0) |
||
78 | |||
79 | #define ACPI_RELEASE_GLOBAL_LOCK(GLptr, Acq) \ |
||
80 | do { \ |
||
81 | int dummy; \ |
||
82 | asm("1: movl (%1),%%eax;" \ |
||
83 | "movl %%eax,%%edx;" \ |
||
84 | "andl %2,%%edx;" \ |
||
85 | "lock; cmpxchgl %%edx,(%1);" \ |
||
86 | "jnz 1b;" \ |
||
87 | "andl $0x1,%%eax" \ |
||
88 | :"=a"(Acq),"=c"(dummy):"c"(GLptr),"i"(~3L):"dx"); \ |
||
89 | } while(0) |
||
90 | |||
91 | |||
92 | /* |
||
93 | * Math helper asm macros |
||
94 | */ |
||
95 | #define ACPI_DIV_64_BY_32(n_hi, n_lo, d32, q32, r32) \ |
||
96 | asm("divl %2;" \ |
||
97 | :"=a"(q32), "=d"(r32) \ |
||
98 | :"r"(d32), \ |
||
99 | "0"(n_lo), "1"(n_hi)) |
||
100 | |||
101 | |||
102 | #define ACPI_SHIFT_RIGHT_64(n_hi, n_lo) \ |
||
103 | asm("shrl $1,%2;" \ |
||
104 | "rcrl $1,%3;" \ |
||
105 | :"=r"(n_hi), "=r"(n_lo) \ |
||
106 | :"0"(n_hi), "1"(n_lo)) |
||
107 | |||
108 | |||
109 | #ifdef CONFIG_ACPI_BOOT |
||
110 | extern int acpi_lapic; |
||
111 | extern int acpi_ioapic; |
||
112 | |||
113 | |||
114 | /* Fixmap pages to reserve for ACPI boot-time tables (see fixmap.h) */ |
||
115 | #define FIX_ACPI_PAGES 4 |
||
116 | |||
117 | #ifdef CONFIG_X86_IO_APIC |
||
118 | extern int skip_ioapic_setup; |
||
119 | |||
120 | static inline void disable_ioapic_setup(void) |
||
121 | { |
||
122 | skip_ioapic_setup = 1; |
||
123 | } |
||
124 | |||
125 | static inline int ioapic_setup_disabled(void) |
||
126 | { |
||
127 | return skip_ioapic_setup; |
||
128 | } |
||
129 | |||
130 | #else |
||
131 | static inline void disable_ioapic_setup(void) |
||
132 | { } |
||
133 | |||
134 | #endif |
||
135 | |||
136 | #else /* CONFIG_ACPI_BOOT */ |
||
137 | # define acpi_lapic 0 |
||
138 | # define acpi_ioapic 0 |
||
139 | |||
140 | #endif |
||
141 | |||
142 | #ifdef CONFIG_ACPI_SLEEP |
||
143 | |||
144 | /* routines for saving/restoring kernel state */ |
||
145 | extern int acpi_save_state_mem(void); |
||
146 | extern int acpi_save_state_disk(void); |
||
147 | extern void acpi_restore_state_mem(void); |
||
148 | |||
149 | extern unsigned long acpi_wakeup_address; |
||
150 | |||
151 | /* early initialization routine */ |
||
152 | extern void acpi_reserve_bootmem(void); |
||
153 | |||
154 | #endif /*CONFIG_ACPI_SLEEP*/ |
||
155 | |||
156 | #endif /*__KERNEL__*/ |
||
157 | |||
158 | #endif /*_ASM_ACPI_H*/ |