1 /* SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0 */ 2 /****************************************************************************** 3 * 4 * Name: acpiosxf.h - All interfaces to the OS Services Layer (OSL). These 5 * interfaces must be implemented by OSL to interface the 6 * ACPI components to the host operating system. 7 * 8 * Copyright (C) 2000 - 2019, Intel Corp. 9 * 10 *****************************************************************************/ 11 12 #ifndef __ACPIOSXF_H__ 13 #define __ACPIOSXF_H__ 14 15 #include <acpi/platform/acenv.h> 16 #include <acpi/actypes.h> 17 18 /* Types for acpi_os_execute */ 19 20 typedef enum { 21 OSL_GLOBAL_LOCK_HANDLER, 22 OSL_NOTIFY_HANDLER, 23 OSL_GPE_HANDLER, 24 OSL_DEBUGGER_MAIN_THREAD, 25 OSL_DEBUGGER_EXEC_THREAD, 26 OSL_EC_POLL_HANDLER, 27 OSL_EC_BURST_HANDLER 28 } acpi_execute_type; 29 30 #define ACPI_NO_UNIT_LIMIT ((u32) -1) 31 #define ACPI_MUTEX_SEM 1 32 33 /* Functions for acpi_os_signal */ 34 35 #define ACPI_SIGNAL_FATAL 0 36 #define ACPI_SIGNAL_BREAKPOINT 1 37 38 struct acpi_signal_fatal_info { 39 u32 type; 40 u32 code; 41 u32 argument; 42 }; 43 44 /* 45 * OSL Initialization and shutdown primitives 46 */ 47 #ifndef ACPI_USE_ALTERNATE_PROTOTYPE_acpi_os_initialize 48 acpi_status acpi_os_initialize(void); 49 #endif 50 51 #ifndef ACPI_USE_ALTERNATE_PROTOTYPE_acpi_os_terminate 52 acpi_status acpi_os_terminate(void); 53 #endif 54 55 /* 56 * ACPI Table interfaces 57 */ 58 #ifndef ACPI_USE_ALTERNATE_PROTOTYPE_acpi_os_get_root_pointer 59 acpi_physical_address acpi_os_get_root_pointer(void); 60 #endif 61 62 #ifndef ACPI_USE_ALTERNATE_PROTOTYPE_acpi_os_predefined_override 63 acpi_status 64 acpi_os_predefined_override(const struct acpi_predefined_names *init_val, 65 acpi_string *new_val); 66 #endif 67 68 #ifndef ACPI_USE_ALTERNATE_PROTOTYPE_acpi_os_table_override 69 acpi_status 70 acpi_os_table_override(struct acpi_table_header *existing_table, 71 struct acpi_table_header **new_table); 72 #endif 73 74 #ifndef ACPI_USE_ALTERNATE_PROTOTYPE_acpi_os_physical_table_override 75 acpi_status 76 acpi_os_physical_table_override(struct acpi_table_header *existing_table, 77 acpi_physical_address *new_address, 78 u32 *new_table_length); 79 #endif 80 81 /* 82 * Spinlock primitives 83 */ 84 #ifndef ACPI_USE_ALTERNATE_PROTOTYPE_acpi_os_create_lock 85 acpi_status acpi_os_create_lock(acpi_spinlock * out_handle); 86 #endif 87 88 #ifndef ACPI_USE_ALTERNATE_PROTOTYPE_acpi_os_delete_lock 89 void acpi_os_delete_lock(acpi_spinlock handle); 90 #endif 91 92 #ifndef ACPI_USE_ALTERNATE_PROTOTYPE_acpi_os_acquire_lock 93 acpi_cpu_flags acpi_os_acquire_lock(acpi_spinlock handle); 94 #endif 95 96 #ifndef ACPI_USE_ALTERNATE_PROTOTYPE_acpi_os_release_lock 97 void acpi_os_release_lock(acpi_spinlock handle, acpi_cpu_flags flags); 98 #endif 99 100 /* 101 * RAW spinlock primitives. If the OS does not provide them, fallback to 102 * spinlock primitives 103 */ 104 #ifndef ACPI_USE_ALTERNATE_PROTOTYPE_acpi_os_create_raw_lock 105 # define acpi_os_create_raw_lock(out_handle) acpi_os_create_lock(out_handle) 106 #endif 107 108 #ifndef ACPI_USE_ALTERNATE_PROTOTYPE_acpi_os_delete_raw_lock 109 # define acpi_os_delete_raw_lock(handle) acpi_os_delete_lock(handle) 110 #endif 111 112 #ifndef ACPI_USE_ALTERNATE_PROTOTYPE_acpi_os_acquire_raw_lock 113 # define acpi_os_acquire_raw_lock(handle) acpi_os_acquire_lock(handle) 114 #endif 115 116 #ifndef ACPI_USE_ALTERNATE_PROTOTYPE_acpi_os_release_raw_lock 117 # define acpi_os_release_raw_lock(handle, flags) \ 118 acpi_os_release_lock(handle, flags) 119 #endif 120 121 /* 122 * Semaphore primitives 123 */ 124 #ifndef ACPI_USE_ALTERNATE_PROTOTYPE_acpi_os_create_semaphore 125 acpi_status 126 acpi_os_create_semaphore(u32 max_units, 127 u32 initial_units, acpi_semaphore * out_handle); 128 #endif 129 130 #ifndef ACPI_USE_ALTERNATE_PROTOTYPE_acpi_os_delete_semaphore 131 acpi_status acpi_os_delete_semaphore(acpi_semaphore handle); 132 #endif 133 134 #ifndef ACPI_USE_ALTERNATE_PROTOTYPE_acpi_os_wait_semaphore 135 acpi_status 136 acpi_os_wait_semaphore(acpi_semaphore handle, u32 units, u16 timeout); 137 #endif 138 139 #ifndef ACPI_USE_ALTERNATE_PROTOTYPE_acpi_os_signal_semaphore 140 acpi_status acpi_os_signal_semaphore(acpi_semaphore handle, u32 units); 141 #endif 142 143 /* 144 * Mutex primitives. May be configured to use semaphores instead via 145 * ACPI_MUTEX_TYPE (see platform/acenv.h) 146 */ 147 #if (ACPI_MUTEX_TYPE != ACPI_BINARY_SEMAPHORE) 148 149 #ifndef ACPI_USE_ALTERNATE_PROTOTYPE_acpi_os_create_mutex 150 acpi_status acpi_os_create_mutex(acpi_mutex * out_handle); 151 #endif 152 153 #ifndef ACPI_USE_ALTERNATE_PROTOTYPE_acpi_os_delete_mutex 154 void acpi_os_delete_mutex(acpi_mutex handle); 155 #endif 156 157 #ifndef ACPI_USE_ALTERNATE_PROTOTYPE_acpi_os_acquire_mutex 158 acpi_status acpi_os_acquire_mutex(acpi_mutex handle, u16 timeout); 159 #endif 160 161 #ifndef ACPI_USE_ALTERNATE_PROTOTYPE_acpi_os_release_mutex 162 void acpi_os_release_mutex(acpi_mutex handle); 163 #endif 164 165 #endif 166 167 /* 168 * Memory allocation and mapping 169 */ 170 #ifndef ACPI_USE_ALTERNATE_PROTOTYPE_acpi_os_allocate 171 void *acpi_os_allocate(acpi_size size); 172 #endif 173 174 #ifndef ACPI_USE_ALTERNATE_PROTOTYPE_acpi_os_allocate_zeroed 175 void *acpi_os_allocate_zeroed(acpi_size size); 176 #endif 177 178 #ifndef ACPI_USE_ALTERNATE_PROTOTYPE_acpi_os_free 179 void acpi_os_free(void *memory); 180 #endif 181 182 #ifndef ACPI_USE_ALTERNATE_PROTOTYPE_acpi_os_map_memory 183 void *acpi_os_map_memory(acpi_physical_address where, acpi_size length); 184 #endif 185 186 #ifndef ACPI_USE_ALTERNATE_PROTOTYPE_acpi_os_unmap_memory 187 void acpi_os_unmap_memory(void *logical_address, acpi_size size); 188 #endif 189 190 #ifndef ACPI_USE_ALTERNATE_PROTOTYPE_acpi_os_get_physical_address 191 acpi_status 192 acpi_os_get_physical_address(void *logical_address, 193 acpi_physical_address *physical_address); 194 #endif 195 196 /* 197 * Memory/Object Cache 198 */ 199 #ifndef ACPI_USE_ALTERNATE_PROTOTYPE_acpi_os_create_cache 200 acpi_status 201 acpi_os_create_cache(char *cache_name, 202 u16 object_size, 203 u16 max_depth, acpi_cache_t ** return_cache); 204 #endif 205 206 #ifndef ACPI_USE_ALTERNATE_PROTOTYPE_acpi_os_delete_cache 207 acpi_status acpi_os_delete_cache(acpi_cache_t * cache); 208 #endif 209 210 #ifndef ACPI_USE_ALTERNATE_PROTOTYPE_acpi_os_purge_cache 211 acpi_status acpi_os_purge_cache(acpi_cache_t * cache); 212 #endif 213 214 #ifndef ACPI_USE_ALTERNATE_PROTOTYPE_acpi_os_acquire_object 215 void *acpi_os_acquire_object(acpi_cache_t * cache); 216 #endif 217 218 #ifndef ACPI_USE_ALTERNATE_PROTOTYPE_acpi_os_release_object 219 acpi_status acpi_os_release_object(acpi_cache_t * cache, void *object); 220 #endif 221 222 /* 223 * Interrupt handlers 224 */ 225 #ifndef ACPI_USE_ALTERNATE_PROTOTYPE_acpi_os_install_interrupt_handler 226 acpi_status 227 acpi_os_install_interrupt_handler(u32 interrupt_number, 228 acpi_osd_handler service_routine, 229 void *context); 230 #endif 231 232 #ifndef ACPI_USE_ALTERNATE_PROTOTYPE_acpi_os_remove_interrupt_handler 233 acpi_status 234 acpi_os_remove_interrupt_handler(u32 interrupt_number, 235 acpi_osd_handler service_routine); 236 #endif 237 238 /* 239 * Threads and Scheduling 240 */ 241 #ifndef ACPI_USE_ALTERNATE_PROTOTYPE_acpi_os_get_thread_id 242 acpi_thread_id acpi_os_get_thread_id(void); 243 #endif 244 245 #ifndef ACPI_USE_ALTERNATE_PROTOTYPE_acpi_os_execute 246 acpi_status 247 acpi_os_execute(acpi_execute_type type, 248 acpi_osd_exec_callback function, void *context); 249 #endif 250 251 #ifndef ACPI_USE_ALTERNATE_PROTOTYPE_acpi_os_wait_events_complete 252 void acpi_os_wait_events_complete(void); 253 #endif 254 255 #ifndef ACPI_USE_ALTERNATE_PROTOTYPE_acpi_os_sleep 256 void acpi_os_sleep(u64 milliseconds); 257 #endif 258 259 #ifndef ACPI_USE_ALTERNATE_PROTOTYPE_acpi_os_stall 260 void acpi_os_stall(u32 microseconds); 261 #endif 262 263 /* 264 * Platform and hardware-independent I/O interfaces 265 */ 266 #ifndef ACPI_USE_ALTERNATE_PROTOTYPE_acpi_os_read_port 267 acpi_status acpi_os_read_port(acpi_io_address address, u32 *value, u32 width); 268 #endif 269 270 #ifndef ACPI_USE_ALTERNATE_PROTOTYPE_acpi_os_write_port 271 acpi_status acpi_os_write_port(acpi_io_address address, u32 value, u32 width); 272 #endif 273 274 /* 275 * Platform and hardware-independent physical memory interfaces 276 */ 277 int acpi_os_read_iomem(void __iomem *virt_addr, u64 *value, u32 width); 278 279 #ifndef ACPI_USE_ALTERNATE_PROTOTYPE_acpi_os_read_memory 280 acpi_status 281 acpi_os_read_memory(acpi_physical_address address, u64 *value, u32 width); 282 #endif 283 284 #ifndef ACPI_USE_ALTERNATE_PROTOTYPE_acpi_os_write_memory 285 acpi_status 286 acpi_os_write_memory(acpi_physical_address address, u64 value, u32 width); 287 #endif 288 289 /* 290 * Platform and hardware-independent PCI configuration space access 291 * Note: Can't use "Register" as a parameter, changed to "Reg" -- 292 * certain compilers complain. 293 */ 294 #ifndef ACPI_USE_ALTERNATE_PROTOTYPE_acpi_os_read_pci_configuration 295 acpi_status 296 acpi_os_read_pci_configuration(struct acpi_pci_id *pci_id, 297 u32 reg, u64 *value, u32 width); 298 #endif 299 300 #ifndef ACPI_USE_ALTERNATE_PROTOTYPE_acpi_os_write_pci_configuration 301 acpi_status 302 acpi_os_write_pci_configuration(struct acpi_pci_id *pci_id, 303 u32 reg, u64 value, u32 width); 304 #endif 305 306 /* 307 * Miscellaneous 308 */ 309 #ifndef ACPI_USE_ALTERNATE_PROTOTYPE_acpi_os_readable 310 u8 acpi_os_readable(void *pointer, acpi_size length); 311 #endif 312 313 #ifndef ACPI_USE_ALTERNATE_PROTOTYPE_acpi_os_writable 314 u8 acpi_os_writable(void *pointer, acpi_size length); 315 #endif 316 317 #ifndef ACPI_USE_ALTERNATE_PROTOTYPE_acpi_os_get_timer 318 u64 acpi_os_get_timer(void); 319 #endif 320 321 #ifndef ACPI_USE_ALTERNATE_PROTOTYPE_acpi_os_signal 322 acpi_status acpi_os_signal(u32 function, void *info); 323 #endif 324 325 #ifndef ACPI_USE_ALTERNATE_PROTOTYPE_acpi_os_enter_sleep 326 acpi_status acpi_os_enter_sleep(u8 sleep_state, u32 rega_value, u32 regb_value); 327 #endif 328 329 /* 330 * Debug print routines 331 */ 332 #ifndef ACPI_USE_ALTERNATE_PROTOTYPE_acpi_os_printf 333 ACPI_PRINTF_LIKE(1) 334 void ACPI_INTERNAL_VAR_XFACE acpi_os_printf(const char *format, ...); 335 #endif 336 337 #ifndef ACPI_USE_ALTERNATE_PROTOTYPE_acpi_os_vprintf 338 void acpi_os_vprintf(const char *format, va_list args); 339 #endif 340 341 #ifndef ACPI_USE_ALTERNATE_PROTOTYPE_acpi_os_redirect_output 342 void acpi_os_redirect_output(void *destination); 343 #endif 344 345 /* 346 * Debug IO 347 */ 348 #ifndef ACPI_USE_ALTERNATE_PROTOTYPE_acpi_os_get_line 349 acpi_status acpi_os_get_line(char *buffer, u32 buffer_length, u32 *bytes_read); 350 #endif 351 352 #ifndef ACPI_USE_ALTERNATE_PROTOTYPE_acpi_os_initialize_debugger 353 acpi_status acpi_os_initialize_debugger(void); 354 #endif 355 356 #ifndef ACPI_USE_ALTERNATE_PROTOTYPE_acpi_os_terminate_debugger 357 void acpi_os_terminate_debugger(void); 358 #endif 359 360 #ifndef ACPI_USE_ALTERNATE_PROTOTYPE_acpi_os_wait_command_ready 361 acpi_status acpi_os_wait_command_ready(void); 362 #endif 363 364 #ifndef ACPI_USE_ALTERNATE_PROTOTYPE_acpi_os_notify_command_complete 365 acpi_status acpi_os_notify_command_complete(void); 366 #endif 367 368 #ifndef ACPI_USE_ALTERNATE_PROTOTYPE_acpi_os_trace_point 369 void 370 acpi_os_trace_point(acpi_trace_event_type type, 371 u8 begin, u8 *aml, char *pathname); 372 #endif 373 374 /* 375 * Obtain ACPI table(s) 376 */ 377 #ifndef ACPI_USE_ALTERNATE_PROTOTYPE_acpi_os_get_table_by_name 378 acpi_status 379 acpi_os_get_table_by_name(char *signature, 380 u32 instance, 381 struct acpi_table_header **table, 382 acpi_physical_address *address); 383 #endif 384 385 #ifndef ACPI_USE_ALTERNATE_PROTOTYPE_acpi_os_get_table_by_index 386 acpi_status 387 acpi_os_get_table_by_index(u32 index, 388 struct acpi_table_header **table, 389 u32 *instance, acpi_physical_address *address); 390 #endif 391 392 #ifndef ACPI_USE_ALTERNATE_PROTOTYPE_acpi_os_get_table_by_address 393 acpi_status 394 acpi_os_get_table_by_address(acpi_physical_address address, 395 struct acpi_table_header **table); 396 #endif 397 398 /* 399 * Directory manipulation 400 */ 401 #ifndef ACPI_USE_ALTERNATE_PROTOTYPE_acpi_os_open_directory 402 void *acpi_os_open_directory(char *pathname, 403 char *wildcard_spec, char requested_file_type); 404 #endif 405 406 /* requeste_file_type values */ 407 408 #define REQUEST_FILE_ONLY 0 409 #define REQUEST_DIR_ONLY 1 410 411 #ifndef ACPI_USE_ALTERNATE_PROTOTYPE_acpi_os_get_next_filename 412 char *acpi_os_get_next_filename(void *dir_handle); 413 #endif 414 415 #ifndef ACPI_USE_ALTERNATE_PROTOTYPE_acpi_os_close_directory 416 void acpi_os_close_directory(void *dir_handle); 417 #endif 418 419 #endif /* __ACPIOSXF_H__ */ 420