1 | /****************************************************************************** |
2 | * |
3 | * Name: aclinuxex.h - Extra OS specific defines, etc. for Linux |
4 | * |
5 | *****************************************************************************/ |
6 | |
7 | /* |
8 | * Copyright (C) 2000 - 2019, Intel Corp. |
9 | * All rights reserved. |
10 | * |
11 | * Redistribution and use in source and binary forms, with or without |
12 | * modification, are permitted provided that the following conditions |
13 | * are met: |
14 | * 1. Redistributions of source code must retain the above copyright |
15 | * notice, this list of conditions, and the following disclaimer, |
16 | * without modification. |
17 | * 2. Redistributions in binary form must reproduce at minimum a disclaimer |
18 | * substantially similar to the "NO WARRANTY" disclaimer below |
19 | * ("Disclaimer") and any redistribution must be conditioned upon |
20 | * including a substantially similar Disclaimer requirement for further |
21 | * binary redistribution. |
22 | * 3. Neither the names of the above-listed copyright holders nor the names |
23 | * of any contributors may be used to endorse or promote products derived |
24 | * from this software without specific prior written permission. |
25 | * |
26 | * Alternatively, this software may be distributed under the terms of the |
27 | * GNU General Public License ("GPL") version 2 as published by the Free |
28 | * Software Foundation. |
29 | * |
30 | * NO WARRANTY |
31 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
32 | * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
33 | * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR |
34 | * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
35 | * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
36 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
37 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
38 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, |
39 | * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING |
40 | * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
41 | * POSSIBILITY OF SUCH DAMAGES. |
42 | */ |
43 | |
44 | #ifndef __ACLINUXEX_H__ |
45 | #define __ACLINUXEX_H__ |
46 | |
47 | #ifdef __KERNEL__ |
48 | |
49 | #ifndef ACPI_USE_NATIVE_DIVIDE |
50 | |
51 | #ifndef ACPI_DIV_64_BY_32 |
52 | #define ACPI_DIV_64_BY_32(n_hi, n_lo, d32, q32, r32) \ |
53 | do { \ |
54 | UINT64 (__n) = ((UINT64) n_hi) << 32 | (n_lo); \ |
55 | (r32) = do_div ((__n), (d32)); \ |
56 | (q32) = (UINT32) (__n); \ |
57 | } while (0) |
58 | #endif |
59 | |
60 | #ifndef ACPI_SHIFT_RIGHT_64 |
61 | #define ACPI_SHIFT_RIGHT_64(n_hi, n_lo) \ |
62 | do { \ |
63 | (n_lo) >>= 1; \ |
64 | (n_lo) |= (((n_hi) & 1) << 31); \ |
65 | (n_hi) >>= 1; \ |
66 | } while (0) |
67 | #endif |
68 | |
69 | #endif |
70 | |
71 | /* |
72 | * Overrides for in-kernel ACPICA |
73 | */ |
74 | ACPI_STATUS ACPI_INIT_FUNCTION AcpiOsInitialize ( |
75 | void); |
76 | |
77 | ACPI_STATUS AcpiOsTerminate ( |
78 | void); |
79 | |
80 | /* |
81 | * The irqs_disabled() check is for resume from RAM. |
82 | * Interrupts are off during resume, just like they are for boot. |
83 | * However, boot has (system_state != SYSTEM_RUNNING) |
84 | * to quiet __might_sleep() in kmalloc() and resume does not. |
85 | */ |
86 | static inline void * |
87 | AcpiOsAllocate ( |
88 | ACPI_SIZE Size) |
89 | { |
90 | return kmalloc (Size, irqs_disabled () ? GFP_ATOMIC : GFP_KERNEL); |
91 | } |
92 | |
93 | static inline void * |
94 | AcpiOsAllocateZeroed ( |
95 | ACPI_SIZE Size) |
96 | { |
97 | return kzalloc (Size, irqs_disabled () ? GFP_ATOMIC : GFP_KERNEL); |
98 | } |
99 | |
100 | static inline void |
101 | AcpiOsFree ( |
102 | void *Memory) |
103 | { |
104 | kfree (Memory); |
105 | } |
106 | |
107 | static inline void * |
108 | AcpiOsAcquireObject ( |
109 | ACPI_CACHE_T *Cache) |
110 | { |
111 | return kmem_cache_zalloc (Cache, |
112 | irqs_disabled () ? GFP_ATOMIC : GFP_KERNEL); |
113 | } |
114 | |
115 | static inline ACPI_THREAD_ID |
116 | AcpiOsGetThreadId ( |
117 | void) |
118 | { |
119 | return (ACPI_THREAD_ID) (unsigned long) current; |
120 | } |
121 | |
122 | /* |
123 | * When lockdep is enabled, the spin_lock_init() macro stringifies it's |
124 | * argument and uses that as a name for the lock in debugging. |
125 | * By executing spin_lock_init() in a macro the key changes from "lock" for |
126 | * all locks to the name of the argument of acpi_os_create_lock(), which |
127 | * prevents lockdep from reporting false positives for ACPICA locks. |
128 | */ |
129 | #define AcpiOsCreateLock(__Handle) \ |
130 | ({ \ |
131 | spinlock_t *Lock = ACPI_ALLOCATE(sizeof(*Lock)); \ |
132 | if (Lock) { \ |
133 | *(__Handle) = Lock; \ |
134 | spin_lock_init(*(__Handle)); \ |
135 | } \ |
136 | Lock ? AE_OK : AE_NO_MEMORY; \ |
137 | }) |
138 | |
139 | static inline BOOLEAN |
140 | AcpiOsReadable ( |
141 | void *Pointer, |
142 | ACPI_SIZE Length) |
143 | { |
144 | return TRUE; |
145 | } |
146 | |
147 | static inline ACPI_STATUS |
148 | AcpiOsInitializeDebugger ( |
149 | void) |
150 | { |
151 | return AE_OK; |
152 | } |
153 | |
154 | static inline void |
155 | AcpiOsTerminateDebugger ( |
156 | void) |
157 | { |
158 | return; |
159 | } |
160 | |
161 | |
162 | /* |
163 | * OSL interfaces added by Linux |
164 | */ |
165 | |
166 | #endif /* __KERNEL__ */ |
167 | |
168 | #endif /* __ACLINUXEX_H__ */ |
169 | |